move code for sharing between javascript and python

This commit is contained in:
Julian Dolby 2018-04-30 13:33:48 -04:00
parent 27a8fff714
commit 2a7a98ed32
25 changed files with 297 additions and 218 deletions

View File

@ -30,6 +30,8 @@ import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction;
import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.ir.translator.AstTranslator;
import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation;
import com.ibm.wala.cast.java.ssa.AstJavaInstructionFactory;
@ -657,6 +659,18 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl {
public AstLexicalWrite LexicalWrite(int iindex, String definer, String globalName, TypeReference type, int rhs) {
return new AstLexicalWrite(iindex, definer, globalName, type, rhs);
}
@Override
public AstPropertyRead PropertyRead(int iindex, int result, int objectRef, int memberRef) {
assert false;
return null;
}
@Override
public AstPropertyWrite PropertyWrite(int iindex, int objectRef, int memberRef, int value) {
assert false;
return null;
}
}
protected static final InstructionFactory insts = new InstructionFactory();

View File

@ -23,6 +23,7 @@ import org.junit.Test;
import com.ibm.wala.analysis.pointers.HeapGraph;
import com.ibm.wala.cast.ipa.callgraph.GlobalObjectKey;
import com.ibm.wala.cast.ir.ssa.AstGlobalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.GlobalVertex;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.ObjectVertex;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.PrototypeFieldVertex;
@ -251,18 +252,18 @@ public abstract class TestPointerAnalyses {
SymbolTable symtab = ir.getSymbolTable();
for(SSAInstruction inst : ir.getInstructions()) {
if (inst instanceof JavaScriptPropertyWrite) {
int property = ((JavaScriptPropertyWrite) inst).getMemberRef();
int property = ((AstPropertyWrite) inst).getMemberRef();
if (symtab.isConstant(property)) {
String p = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(property));
int obj = ((JavaScriptPropertyWrite) inst).getObjectRef();
int obj = ((AstPropertyWrite) inst).getObjectRef();
PointerKey objKey = fbPA.getHeapModel().getPointerKeyForLocal(node, obj);
OrdinalSet<ObjectVertex> objPtrs = fbPA.getPointsToSet(objKey);
for(ObjectVertex o : objPtrs) {
PointerKey propKey = fbPA.getHeapModel().getPointerKeyForInstanceField(o, new AstDynamicField(false, o.getConcreteType(), Atom.findOrCreateUnicodeAtom(p), JavaScriptTypes.Root));
Assert.assertTrue("object " + o + " should have field " + propKey, hg.hasEdge(o, propKey));
int val = ((JavaScriptPropertyWrite) inst).getValue();
int val = ((AstPropertyWrite) inst).getValue();
PointerKey valKey = fbPA.getHeapModel().getPointerKeyForLocal(node, val);
OrdinalSet<ObjectVertex> valPtrs = fbPA.getPointsToSet(valKey);
for(ObjectVertex v : valPtrs) {

View File

@ -18,8 +18,6 @@ import com.ibm.wala.cast.analysis.typeInference.AstTypeInference;
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyRead;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyWrite;
import com.ibm.wala.cast.js.ssa.JavaScriptTypeOfInstruction;
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
@ -45,11 +43,6 @@ public class JSTypeInference extends AstTypeInference {
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) {
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
}
@Override
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.String)));
@ -60,10 +53,6 @@ public class JSTypeInference extends AstTypeInference {
result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.Boolean)));
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) {
}
@Override
public void visitCheckRef(JavaScriptCheckReference instruction) {
}

View File

@ -18,6 +18,7 @@ import java.util.Set;
import com.ibm.wala.analysis.pointers.HeapGraph;
import com.ibm.wala.cast.ipa.callgraph.AstHeapModel;
import com.ibm.wala.cast.ir.ssa.AstGlobalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.AbstractVertexVisitor;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex;
@ -202,7 +203,7 @@ public class FlowGraph implements Iterable<Vertex> {
DefUse du = cache.getDefUse(getIR(cache, func));
for(SSAInstruction inst : Iterator2Iterable.make(du.getUses(rval))) {
if (inst instanceof JavaScriptPropertyWrite) {
int obj = ((JavaScriptPropertyWrite) inst).getObjectRef();
int obj = ((AstPropertyWrite) inst).getObjectRef();
VarVertex object = factory.makeVarVertex(func, obj);
for(ObjectVertex o : getPointsToSet(object)) {
PrototypeFieldVertex prototype = get(PrototypeField.prototype, o);
@ -458,7 +459,7 @@ public class FlowGraph implements Iterable<Vertex> {
DefUse du = cache.getDefUse(getIR(cache, func));
for(SSAInstruction inst : Iterator2Iterable.make(du.getUses(rval))) {
if (inst instanceof JavaScriptPropertyWrite) {
int obj = ((JavaScriptPropertyWrite) inst).getObjectRef();
int obj = ((AstPropertyWrite) inst).getObjectRef();
VarVertex object = factory.makeVarVertex(func, obj);
for(ObjectVertex o : getPointsToSet(object)) {
addEdge(ensureNode(o), ensureNode(propertyKey(property.getPropName(), o)));

View File

@ -15,6 +15,8 @@ import com.ibm.wala.cast.ir.ssa.AstGlobalWrite;
import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.js.callgraph.fieldbased.JSMethodInstructionVisitor;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex;
@ -24,8 +26,6 @@ import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VertexFactor
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil;
import com.ibm.wala.cast.js.ipa.callgraph.JSSSAPropagationCallGraphBuilder;
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyRead;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyWrite;
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
import com.ibm.wala.cast.js.ssa.SetPrototype;
import com.ibm.wala.cast.js.types.JavaScriptMethods;
@ -255,7 +255,7 @@ public class FlowGraphBuilder {
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite pw) {
public void visitPropertyWrite(AstPropertyWrite pw) {
int p = pw.getMemberRef();
if(symtab.isConstant(p)) {
String pn = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(p));
@ -298,7 +298,7 @@ public class FlowGraphBuilder {
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead pr) {
public void visitPropertyRead(AstPropertyRead pr) {
int p = pr.getMemberRef();
if(symtab.isConstant(p)) {
String pn = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(p));

View File

@ -15,8 +15,6 @@ import com.ibm.wala.cast.js.ssa.JSInstructionVisitor;
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyRead;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyWrite;
import com.ibm.wala.cast.js.ssa.JavaScriptTypeOfInstruction;
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
@ -42,14 +40,6 @@ public class JSInducedCFG extends AstInducedCFG {
breakBasicBlock();
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) {
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) {
}
@Override
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
}
@ -88,14 +78,6 @@ public class JSInducedCFG extends AstInducedCFG {
public void visitJavaScriptInvoke(JavaScriptInvoke inst) {
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) {
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) {
}
@Override
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
}

View File

@ -28,8 +28,6 @@ import com.ibm.wala.cast.js.ssa.JSInstructionVisitor;
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyRead;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyWrite;
import com.ibm.wala.cast.js.ssa.JavaScriptTypeOfInstruction;
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
@ -262,16 +260,6 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
bingo = true;
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
bingo = true;
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
bingo = true;
}
@Override
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
bingo = true;
@ -338,16 +326,6 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
}
@Override
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
@ -543,36 +521,6 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
handleBinaryOp(instruction, node, symbolTable, du);
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) {
Position instructionPosition = getInstructionPosition(instruction);
if (instructionPosition != null) {
System.err.println("processing read instruction " + instruction + ", position " + instructionPosition);
}
}
newFieldRead(node, instruction.getUse(0), instruction.getUse(1), instruction.getDef(0));
}
private Position getInstructionPosition(SSAInstruction instruction) {
IMethod method = node.getMethod();
if (method instanceof AstMethod) {
return ((AstMethod) method).getSourcePosition(instruction.iindex);
}
return null;
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) {
Position instructionPosition = getInstructionPosition(instruction);
if (instructionPosition != null) {
System.err.println("processing write instruction " + instruction + ", position " + instructionPosition);
}
}
newFieldWrite(node, instruction.getUse(0), instruction.getUse(1), instruction.getUse(2));
}
@Override
public void visitJavaScriptInvoke(JavaScriptInvoke instruction) {
if (instruction.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) {

View File

@ -12,14 +12,13 @@
package com.ibm.wala.cast.js.ipa.modref;
import java.util.Collection;
import com.ibm.wala.cast.ipa.callgraph.AstHeapModel;
import com.ibm.wala.cast.ipa.modref.AstModRef;
import com.ibm.wala.cast.js.ssa.JSInstructionVisitor;
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyRead;
import com.ibm.wala.cast.js.ssa.JavaScriptPropertyWrite;
import com.ibm.wala.cast.js.ssa.JavaScriptTypeOfInstruction;
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
@ -29,7 +28,6 @@ import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
import com.ibm.wala.util.collections.Iterator2Iterable;
public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
@ -49,25 +47,6 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
// do nothing
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef());
PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef());
for(InstanceKey o : pa.getPointsToSet(obj)) {
for(InstanceKey p : pa.getPointsToSet(prop)) {
for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldRead(o, p))) {
assert x != null : instruction;
result.add(x);
}
}
}
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
// do nothing
}
@Override
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
// do nothing
@ -117,24 +96,6 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
// do nothing
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
// do nothing
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef());
PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef());
for(T o : pa.getPointsToSet(obj)) {
for(T p : pa.getPointsToSet(prop)) {
for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldWrite(o, p))) {
assert x != null : instruction;
result.add(x);
}
}
}
}
@Override
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {

View File

@ -26,6 +26,8 @@ import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction;
import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction;
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation;
@ -241,12 +243,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader {
}
@Override
public JavaScriptPropertyRead PropertyRead(int iindex, int result, int objectRef, int memberRef) {
public AstPropertyRead PropertyRead(int iindex, int result, int objectRef, int memberRef) {
return new JavaScriptPropertyRead(iindex, result, objectRef, memberRef);
}
@Override
public JavaScriptPropertyWrite PropertyWrite(int iindex, int objectRef, int memberRef, int value) {
public AstPropertyWrite PropertyWrite(int iindex, int objectRef, int memberRef, int value) {
return new JavaScriptPropertyWrite(iindex, objectRef, memberRef, value);
}

View File

@ -11,6 +11,8 @@
package com.ibm.wala.cast.js.ssa;
import com.ibm.wala.cast.ir.ssa.AstAbstractInstructionVisitor;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
public class JSAbstractInstructionVisitor
extends AstAbstractInstructionVisitor
@ -23,12 +25,12 @@ public class JSAbstractInstructionVisitor
}
@Override
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
public void visitPropertyRead(AstPropertyRead instruction) {
}
@Override
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
public void visitPropertyWrite(AstPropertyWrite instruction) {
}

View File

@ -29,10 +29,6 @@ public interface JSInstructionFactory extends AstInstructionFactory {
JavaScriptInvoke Invoke(int iindex, int function, int[] params, int exception, CallSiteReference site);
JavaScriptPropertyRead PropertyRead(int iindex, int result, int objectRef, int memberRef);
JavaScriptPropertyWrite PropertyWrite(int iindex, int objectRef, int memberRef, int value);
SSAPutInstruction PutInstruction(int iindex, int ref, int value, String field);
JavaScriptTypeOfInstruction TypeOfInstruction(int iindex, int lval, int object);

View File

@ -17,11 +17,7 @@ public interface JSInstructionVisitor extends AstInstructionVisitor {
public void visitJavaScriptInvoke(JavaScriptInvoke instruction);
public void visitTypeOf(JavaScriptTypeOfInstruction instruction);
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction);
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction);
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction);
public void visitWithRegion(JavaScriptWithRegion instruction);

View File

@ -12,33 +12,14 @@ package com.ibm.wala.cast.js.ssa;
import java.util.Collection;
import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.types.TypeReference;
public class JavaScriptPropertyRead extends AbstractReflectiveGet {
public class JavaScriptPropertyRead extends AstPropertyRead {
public JavaScriptPropertyRead(int iindex, int result, int objectRef, int memberRef) {
super(iindex, result, objectRef, memberRef);
}
@Override
public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) {
return
((JSInstructionFactory)insts).PropertyRead(iindex,
defs==null? getDef(): defs[0],
uses==null? getObjectRef(): uses[0],
uses==null? getMemberRef(): uses[1]);
}
/* (non-Javadoc)
* @see com.ibm.domo.ssa.Instruction#isPEI()
*/
@Override
public boolean isPEI() {
return true;
}
/* (non-Javadoc)
* @see com.ibm.domo.ssa.Instruction#getExceptionTypes()
*/
@ -46,14 +27,4 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet {
public Collection<TypeReference> getExceptionTypes() {
return Util.typeErrorExceptions();
}
/**
/* (non-Javadoc)
* @see com.ibm.wala.ssa.SSAInstruction#visit(com.ibm.wala.ssa.SSAInstruction.IVisitor)
*/
@Override
public void visit(IVisitor v) {
assert v instanceof JSInstructionVisitor;
((JSInstructionVisitor)v).visitJavaScriptPropertyRead(this);
}
}

View File

@ -12,47 +12,15 @@ package com.ibm.wala.cast.js.ssa;
import java.util.Collection;
import com.ibm.wala.cast.ir.ssa.AbstractReflectivePut;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
import com.ibm.wala.ssa.SymbolTable;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.types.TypeReference;
public class JavaScriptPropertyWrite extends AbstractReflectivePut {
public class JavaScriptPropertyWrite extends AstPropertyWrite {
public JavaScriptPropertyWrite(int iindex, int objectRef, int memberRef, int value) {
super(iindex, objectRef, memberRef, value);
}
@Override
public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) {
return ((JSInstructionFactory)insts).PropertyWrite(iindex, uses == null ? getObjectRef() : uses[0], uses == null ? getMemberRef() : uses[1],
uses == null ? getValue() : uses[2]);
}
@Override
public String toString(SymbolTable symbolTable) {
return super.toString(symbolTable) + " = " + getValueString(symbolTable, getValue());
}
/**
* @see com.ibm.wala.ssa.SSAInstruction#visit(IVisitor)
*/
@Override
public void visit(IVisitor v) {
assert v instanceof JSInstructionVisitor;
((JSInstructionVisitor) v).visitJavaScriptPropertyWrite(this);
}
/*
* (non-Javadoc)
* @see com.ibm.domo.ssa.Instruction#isPEI()
*/
@Override
public boolean isPEI() {
return true;
}
/*
* (non-Javadoc)
* @see com.ibm.domo.ssa.Instruction#getExceptionTypes()

View File

@ -21,6 +21,8 @@ import com.ibm.wala.cast.ir.ssa.AstInstructionVisitor;
import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction;
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
import com.ibm.wala.ssa.IR;
@ -30,6 +32,15 @@ public abstract class AstTypeInference extends TypeInference {
private final TypeAbstraction booleanType;
protected class AstTypeOperatorFactory extends TypeOperatorFactory implements AstInstructionVisitor {
@Override
public void visitPropertyRead(AstPropertyRead inst) {
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
}
@Override
public void visitPropertyWrite(AstPropertyWrite inst) {
}
@Override
public void visitAstLexicalRead(AstLexicalRead inst) {
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));

View File

@ -28,11 +28,14 @@ import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction;
import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction;
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
import com.ibm.wala.cast.ir.translator.AstTranslator;
import com.ibm.wala.cast.loader.AstMethod;
import com.ibm.wala.cast.loader.AstMethod.LexicalInformation;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.fixpoint.AbstractOperator;
@ -64,6 +67,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.ipa.modref.ArrayLengthKey;
import com.ibm.wala.ssa.DefUse;
import com.ibm.wala.ssa.IRView;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAPutInstruction;
import com.ibm.wala.ssa.SymbolTable;
import com.ibm.wala.util.collections.HashSetFactory;
@ -196,6 +200,16 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa
super(analysis, lpk);
}
@Override
public void visitPropertyRead(AstPropertyRead instruction) {
}
@Override
public void visitPropertyWrite(AstPropertyWrite instruction) {
}
@Override
public void visitAstLexicalRead(AstLexicalRead instruction) {
@ -260,6 +274,16 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa
super(vn);
}
@Override
public void visitPropertyRead(AstPropertyRead instruction) {
bingo = true;
}
@Override
public void visitPropertyWrite(AstPropertyWrite instruction) {
bingo = true;
}
@Override
public void visitAstLexicalRead(AstLexicalRead instruction) {
bingo = true;
@ -367,6 +391,35 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa
// }
}
@Override
public void visitPropertyRead(AstPropertyRead instruction) {
if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) {
Position instructionPosition = getInstructionPosition(instruction);
if (instructionPosition != null) {
System.err.println("processing read instruction " + instruction + ", position " + instructionPosition);
}
}
newFieldRead(node, instruction.getUse(0), instruction.getUse(1), instruction.getDef(0));
}
private Position getInstructionPosition(SSAInstruction instruction) {
IMethod method = node.getMethod();
if (method instanceof AstMethod) {
return ((AstMethod) method).getSourcePosition(instruction.iindex);
}
return null;
}
@Override
public void visitPropertyWrite(AstPropertyWrite instruction) {
if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) {
Position instructionPosition = getInstructionPosition(instruction);
if (instructionPosition != null) {
System.err.println("processing write instruction " + instruction + ", position " + instructionPosition);
}
}
newFieldWrite(node, instruction.getUse(0), instruction.getUse(1), instruction.getUse(2));
}
@Override

View File

@ -21,6 +21,8 @@ import com.ibm.wala.cast.ir.ssa.AstInstructionVisitor;
import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction;
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
import com.ibm.wala.ipa.callgraph.CGNode;
@ -29,6 +31,7 @@ import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
import com.ibm.wala.ipa.modref.ModRef;
import com.ibm.wala.util.collections.Iterator2Iterable;
public class AstModRef<T extends InstanceKey> extends ModRef<T> {
@ -43,6 +46,25 @@ public class AstModRef<T extends InstanceKey> extends ModRef<T> {
super(n, result, pa, h);
}
@Override
public void visitPropertyRead(AstPropertyRead instruction) {
PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef());
PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef());
for(InstanceKey o : pa.getPointsToSet(obj)) {
for(InstanceKey p : pa.getPointsToSet(prop)) {
for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldRead(o, p))) {
assert x != null : instruction;
result.add(x);
}
}
}
}
@Override
public void visitPropertyWrite(AstPropertyWrite instruction) {
// do nothing
}
@Override
public void visitAstLexicalRead(AstLexicalRead instruction) {
@ -147,6 +169,25 @@ public class AstModRef<T extends InstanceKey> extends ModRef<T> {
public void visitEcho(AstEchoInstruction inst) {
}
@Override
public void visitPropertyRead(AstPropertyRead instruction) {
// do nothing
}
@Override
public void visitPropertyWrite(AstPropertyWrite instruction) {
PointerKey obj = h.getPointerKeyForLocal(n, instruction.getObjectRef());
PointerKey prop = h.getPointerKeyForLocal(n, instruction.getMemberRef());
for(T o : pa.getPointsToSet(obj)) {
for(T p : pa.getPointsToSet(prop)) {
for(PointerKey x : Iterator2Iterable.make(h.getPointerKeysForReflectedFieldWrite(o, p))) {
assert x != null : instruction;
result.add(x);
}
}
}
}
}
@Override

View File

@ -18,6 +18,8 @@ import com.ibm.wala.cast.ir.ssa.AstInstructionVisitor;
import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction;
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction;
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
import com.ibm.wala.cfg.InducedCFG;
@ -37,6 +39,14 @@ public class AstInducedCFG extends InducedCFG {
super(r);
}
@Override
public void visitPropertyRead(AstPropertyRead inst) {
}
@Override
public void visitPropertyWrite(AstPropertyWrite inst) {
}
@Override
public void visitAstLexicalRead(AstLexicalRead inst) {
}
@ -85,6 +95,14 @@ public class AstInducedCFG extends InducedCFG {
super(r);
}
@Override
public void visitPropertyRead(AstPropertyRead inst) {
}
@Override
public void visitPropertyWrite(AstPropertyWrite inst) {
}
@Override
public void visitAstLexicalRead(AstLexicalRead inst) {
}

View File

@ -17,6 +17,16 @@ public abstract class AstAbstractInstructionVisitor
implements AstInstructionVisitor
{
@Override
public void visitPropertyRead(AstPropertyRead instruction) {
}
@Override
public void visitPropertyWrite(AstPropertyWrite instruction) {
}
@Override
public void visitAstLexicalRead(AstLexicalRead instruction) {

View File

@ -51,4 +51,8 @@ public interface AstInstructionFactory extends SSAInstructionFactory {
EachElementHasNextInstruction EachElementHasNextInstruction(int iindex, int lValue, int objectRef, int previousProp);
AstPropertyRead PropertyRead(int iindex, int result, int objectRef, int memberRef);
AstPropertyWrite PropertyWrite(int iindex, int objectRef, int memberRef, int value);
}

View File

@ -31,5 +31,10 @@ public interface AstInstructionVisitor extends SSAInstruction.IVisitor {
public void visitIsDefined(AstIsDefinedInstruction inst);
public void visitEcho(AstEchoInstruction inst);
public void visitPropertyRead(AstPropertyRead instruction);
public void visitPropertyWrite(AstPropertyWrite instruction);
}

View File

@ -0,0 +1,36 @@
package com.ibm.wala.cast.ir.ssa;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
public abstract class AstPropertyRead extends AbstractReflectiveGet {
public AstPropertyRead(int iindex, int result, int objectRef, int memberRef) {
super(iindex, result, objectRef, memberRef);
}
@Override
public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) {
return
((AstInstructionFactory)insts).PropertyRead(iindex,
defs==null? getDef(): defs[0],
uses==null? getObjectRef(): uses[0],
uses==null? getMemberRef(): uses[1]);
}
@Override
public boolean isPEI() {
return true;
}
/**
/* (non-Javadoc)
* @see com.ibm.wala.ssa.SSAInstruction#visit(com.ibm.wala.ssa.SSAInstruction.IVisitor)
*/
@Override
public void visit(IVisitor v) {
assert v instanceof AstInstructionVisitor;
((AstInstructionVisitor)v).visitPropertyRead(this);
}
}

View File

@ -0,0 +1,38 @@
package com.ibm.wala.cast.ir.ssa;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
import com.ibm.wala.ssa.SymbolTable;
public abstract class AstPropertyWrite extends AbstractReflectivePut {
public AstPropertyWrite(int iindex, int objectRef, int memberRef, int value) {
super(iindex, objectRef, memberRef, value);
}
@Override
public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) {
return ((AstInstructionFactory)insts).PropertyWrite(iindex, uses == null ? getObjectRef() : uses[0], uses == null ? getMemberRef() : uses[1],
uses == null ? getValue() : uses[2]);
}
@Override
public String toString(SymbolTable symbolTable) {
return super.toString(symbolTable) + " = " + getValueString(symbolTable, getValue());
}
/**
* @see com.ibm.wala.ssa.SSAInstruction#visit(IVisitor)
*/
@Override
public void visit(IVisitor v) {
assert v instanceof AstInstructionVisitor;
((AstInstructionVisitor) v).visitPropertyWrite(this);
}
@Override
public boolean isPEI() {
return true;
}
}

View File

@ -14,7 +14,6 @@
*/
package com.ibm.wala.cast.ir.translator;
import com.ibm.wala.cast.tree.CAstControlFlowMap;
import com.ibm.wala.cast.tree.CAstNode;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
import com.ibm.wala.cast.tree.CAstType;
@ -48,7 +47,7 @@ public abstract class AbstractCodeEntity extends AbstractEntity {
}
@Override
public CAstControlFlowMap getControlFlow() {
public CAstControlFlowRecorder getControlFlow() {
return cfg;
}

View File

@ -1454,6 +1454,8 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
boolean isFinal();
boolean isGlobal();
boolean isInternalName();
Object defaultInitValue();
@ -1613,10 +1615,14 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
@Override
public void declare(CAstSymbol s, int vn) {
String nm = s.name();
assert !contains(nm) : nm;
if (s.isCaseInsensitive())
caseInsensitiveNames.put(nm.toLowerCase(), nm);
values.put(nm, makeSymbol(s, vn));
if (!contains(nm)) {
if (s.isCaseInsensitive())
caseInsensitiveNames.put(nm.toLowerCase(), nm);
values.put(nm, makeSymbol(s, vn));
} else {
assert hasImplicitGlobals();
assert isGlobal(lookup(nm));
}
}
@Override
@ -1762,7 +1768,13 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public boolean isParameter() {
return false;
}
};
@Override
public boolean isGlobal() {
return false;
}
};
}
};
}
@ -1922,6 +1934,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public boolean isParameter() {
return vn <= params.length;
}
@Override
public boolean isGlobal() {
return false;
}
};
}
};
@ -1990,6 +2007,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public boolean isParameter() {
return false;
}
@Override
public boolean isGlobal() {
return false;
}
};
}
};
@ -2157,6 +2179,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public int valueNumber() {
throw new UnsupportedOperationException();
}
@Override
public boolean isGlobal() {
return true;
}
});
}
};
@ -2282,6 +2309,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public int valueNumber() {
throw new UnsupportedOperationException();
}
@Override
public boolean isGlobal() {
return false;
}
});
}
};
@ -3775,10 +3807,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
WalkContext context = c;
if (!context.cfg().isDeadBlock(context.cfg().getCurrentBlock())) {
context.cfg().addPreNode(n, context.getUnwindState());
context.cfg().addPreEdge(n, context.getControlFlow().getTarget(n, null), false);
CAstControlFlowMap controlFlowMap = context.getControlFlow();
context.cfg().addPreEdge(n, controlFlowMap.getTarget(n, null), false);
context.cfg().addInstruction(insts.GotoInstruction(context.cfg().currentInstruction, -1));
if (context.getControlFlow().getTarget(n, null) == null) {
assert context.getControlFlow().getTarget(n, null) != null : context.getControlFlow() + " does not map " + n + " ("
if (controlFlowMap.getTarget(n, null) == null) {
assert controlFlowMap.getTarget(n, null) != null : controlFlowMap + " does not map " + n + " ("
+ context.getSourceMap().getPosition(n) + ")";
}
context.cfg().newBlock(false);