move code for sharing between javascript and python
This commit is contained in:
parent
27a8fff714
commit
2a7a98ed32
|
@ -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.AstLexicalAccess.Access;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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;
|
||||||
import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation;
|
import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation;
|
||||||
import com.ibm.wala.cast.java.ssa.AstJavaInstructionFactory;
|
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) {
|
public AstLexicalWrite LexicalWrite(int iindex, String definer, String globalName, TypeReference type, int rhs) {
|
||||||
return new AstLexicalWrite(iindex, definer, globalName, type, 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();
|
protected static final InstructionFactory insts = new InstructionFactory();
|
||||||
|
|
|
@ -23,6 +23,7 @@ import org.junit.Test;
|
||||||
import com.ibm.wala.analysis.pointers.HeapGraph;
|
import com.ibm.wala.analysis.pointers.HeapGraph;
|
||||||
import com.ibm.wala.cast.ipa.callgraph.GlobalObjectKey;
|
import com.ibm.wala.cast.ipa.callgraph.GlobalObjectKey;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstGlobalWrite;
|
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.GlobalVertex;
|
||||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.ObjectVertex;
|
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.ObjectVertex;
|
||||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.PrototypeFieldVertex;
|
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.PrototypeFieldVertex;
|
||||||
|
@ -251,18 +252,18 @@ public abstract class TestPointerAnalyses {
|
||||||
SymbolTable symtab = ir.getSymbolTable();
|
SymbolTable symtab = ir.getSymbolTable();
|
||||||
for(SSAInstruction inst : ir.getInstructions()) {
|
for(SSAInstruction inst : ir.getInstructions()) {
|
||||||
if (inst instanceof JavaScriptPropertyWrite) {
|
if (inst instanceof JavaScriptPropertyWrite) {
|
||||||
int property = ((JavaScriptPropertyWrite) inst).getMemberRef();
|
int property = ((AstPropertyWrite) inst).getMemberRef();
|
||||||
if (symtab.isConstant(property)) {
|
if (symtab.isConstant(property)) {
|
||||||
String p = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(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);
|
PointerKey objKey = fbPA.getHeapModel().getPointerKeyForLocal(node, obj);
|
||||||
OrdinalSet<ObjectVertex> objPtrs = fbPA.getPointsToSet(objKey);
|
OrdinalSet<ObjectVertex> objPtrs = fbPA.getPointsToSet(objKey);
|
||||||
for(ObjectVertex o : objPtrs) {
|
for(ObjectVertex o : objPtrs) {
|
||||||
PointerKey propKey = fbPA.getHeapModel().getPointerKeyForInstanceField(o, new AstDynamicField(false, o.getConcreteType(), Atom.findOrCreateUnicodeAtom(p), JavaScriptTypes.Root));
|
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));
|
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);
|
PointerKey valKey = fbPA.getHeapModel().getPointerKeyForLocal(node, val);
|
||||||
OrdinalSet<ObjectVertex> valPtrs = fbPA.getPointsToSet(valKey);
|
OrdinalSet<ObjectVertex> valPtrs = fbPA.getPointsToSet(valKey);
|
||||||
for(ObjectVertex v : valPtrs) {
|
for(ObjectVertex v : valPtrs) {
|
||||||
|
|
|
@ -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.JavaScriptCheckReference;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
|
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.JavaScriptTypeOfInstruction;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
||||||
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
||||||
|
@ -45,11 +43,6 @@ public class JSTypeInference extends AstTypeInference {
|
||||||
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
|
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) {
|
|
||||||
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
||||||
result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.String)));
|
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)));
|
result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.Boolean)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitCheckRef(JavaScriptCheckReference instruction) {
|
public void visitCheckRef(JavaScriptCheckReference instruction) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import java.util.Set;
|
||||||
import com.ibm.wala.analysis.pointers.HeapGraph;
|
import com.ibm.wala.analysis.pointers.HeapGraph;
|
||||||
import com.ibm.wala.cast.ipa.callgraph.AstHeapModel;
|
import com.ibm.wala.cast.ipa.callgraph.AstHeapModel;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstGlobalWrite;
|
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.AbstractVertexVisitor;
|
||||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
|
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
|
||||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex;
|
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));
|
DefUse du = cache.getDefUse(getIR(cache, func));
|
||||||
for(SSAInstruction inst : Iterator2Iterable.make(du.getUses(rval))) {
|
for(SSAInstruction inst : Iterator2Iterable.make(du.getUses(rval))) {
|
||||||
if (inst instanceof JavaScriptPropertyWrite) {
|
if (inst instanceof JavaScriptPropertyWrite) {
|
||||||
int obj = ((JavaScriptPropertyWrite) inst).getObjectRef();
|
int obj = ((AstPropertyWrite) inst).getObjectRef();
|
||||||
VarVertex object = factory.makeVarVertex(func, obj);
|
VarVertex object = factory.makeVarVertex(func, obj);
|
||||||
for(ObjectVertex o : getPointsToSet(object)) {
|
for(ObjectVertex o : getPointsToSet(object)) {
|
||||||
PrototypeFieldVertex prototype = get(PrototypeField.prototype, o);
|
PrototypeFieldVertex prototype = get(PrototypeField.prototype, o);
|
||||||
|
@ -458,7 +459,7 @@ public class FlowGraph implements Iterable<Vertex> {
|
||||||
DefUse du = cache.getDefUse(getIR(cache, func));
|
DefUse du = cache.getDefUse(getIR(cache, func));
|
||||||
for(SSAInstruction inst : Iterator2Iterable.make(du.getUses(rval))) {
|
for(SSAInstruction inst : Iterator2Iterable.make(du.getUses(rval))) {
|
||||||
if (inst instanceof JavaScriptPropertyWrite) {
|
if (inst instanceof JavaScriptPropertyWrite) {
|
||||||
int obj = ((JavaScriptPropertyWrite) inst).getObjectRef();
|
int obj = ((AstPropertyWrite) inst).getObjectRef();
|
||||||
VarVertex object = factory.makeVarVertex(func, obj);
|
VarVertex object = factory.makeVarVertex(func, obj);
|
||||||
for(ObjectVertex o : getPointsToSet(object)) {
|
for(ObjectVertex o : getPointsToSet(object)) {
|
||||||
addEdge(ensureNode(o), ensureNode(propertyKey(property.getPropName(), o)));
|
addEdge(ensureNode(o), ensureNode(propertyKey(property.getPropName(), o)));
|
||||||
|
|
|
@ -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.AstLexicalAccess.Access;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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.JSMethodInstructionVisitor;
|
||||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
|
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CreationSiteVertex;
|
||||||
import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex;
|
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.JSCallGraphUtil;
|
||||||
import com.ibm.wala.cast.js.ipa.callgraph.JSSSAPropagationCallGraphBuilder;
|
import com.ibm.wala.cast.js.ipa.callgraph.JSSSAPropagationCallGraphBuilder;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
|
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.PrototypeLookup;
|
||||||
import com.ibm.wala.cast.js.ssa.SetPrototype;
|
import com.ibm.wala.cast.js.ssa.SetPrototype;
|
||||||
import com.ibm.wala.cast.js.types.JavaScriptMethods;
|
import com.ibm.wala.cast.js.types.JavaScriptMethods;
|
||||||
|
@ -255,7 +255,7 @@ public class FlowGraphBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite pw) {
|
public void visitPropertyWrite(AstPropertyWrite pw) {
|
||||||
int p = pw.getMemberRef();
|
int p = pw.getMemberRef();
|
||||||
if(symtab.isConstant(p)) {
|
if(symtab.isConstant(p)) {
|
||||||
String pn = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(p));
|
String pn = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(p));
|
||||||
|
@ -298,7 +298,7 @@ public class FlowGraphBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead pr) {
|
public void visitPropertyRead(AstPropertyRead pr) {
|
||||||
int p = pr.getMemberRef();
|
int p = pr.getMemberRef();
|
||||||
if(symtab.isConstant(p)) {
|
if(symtab.isConstant(p)) {
|
||||||
String pn = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(p));
|
String pn = JSCallGraphUtil.simulateToStringForPropertyNames(symtab.getConstantValue(p));
|
||||||
|
|
|
@ -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.JavaScriptCheckReference;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
|
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.JavaScriptTypeOfInstruction;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
||||||
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
||||||
|
@ -42,14 +40,6 @@ public class JSInducedCFG extends AstInducedCFG {
|
||||||
breakBasicBlock();
|
breakBasicBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
||||||
}
|
}
|
||||||
|
@ -88,14 +78,6 @@ public class JSInducedCFG extends AstInducedCFG {
|
||||||
public void visitJavaScriptInvoke(JavaScriptInvoke inst) {
|
public void visitJavaScriptInvoke(JavaScriptInvoke inst) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.JavaScriptCheckReference;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
|
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.JavaScriptTypeOfInstruction;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
||||||
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
||||||
|
@ -262,16 +260,6 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
|
||||||
bingo = true;
|
bingo = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
|
|
||||||
bingo = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
|
|
||||||
bingo = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
public void visitTypeOf(JavaScriptTypeOfInstruction inst) {
|
||||||
bingo = true;
|
bingo = true;
|
||||||
|
@ -338,16 +326,6 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
|
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
|
||||||
|
|
||||||
|
@ -543,36 +521,6 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph
|
||||||
handleBinaryOp(instruction, node, symbolTable, du);
|
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
|
@Override
|
||||||
public void visitJavaScriptInvoke(JavaScriptInvoke instruction) {
|
public void visitJavaScriptInvoke(JavaScriptInvoke instruction) {
|
||||||
if (instruction.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) {
|
if (instruction.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) {
|
||||||
|
|
|
@ -12,14 +12,13 @@
|
||||||
package com.ibm.wala.cast.js.ipa.modref;
|
package com.ibm.wala.cast.js.ipa.modref;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import com.ibm.wala.cast.ipa.callgraph.AstHeapModel;
|
import com.ibm.wala.cast.ipa.callgraph.AstHeapModel;
|
||||||
import com.ibm.wala.cast.ipa.modref.AstModRef;
|
import com.ibm.wala.cast.ipa.modref.AstModRef;
|
||||||
import com.ibm.wala.cast.js.ssa.JSInstructionVisitor;
|
import com.ibm.wala.cast.js.ssa.JSInstructionVisitor;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
|
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
|
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.JavaScriptTypeOfInstruction;
|
||||||
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
import com.ibm.wala.cast.js.ssa.JavaScriptWithRegion;
|
||||||
import com.ibm.wala.cast.js.ssa.PrototypeLookup;
|
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.PointerAnalysis;
|
||||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||||
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
||||||
import com.ibm.wala.util.collections.Iterator2Iterable;
|
|
||||||
|
|
||||||
public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
|
public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
|
||||||
|
|
||||||
|
@ -49,25 +47,6 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
|
||||||
// do nothing
|
// 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
|
@Override
|
||||||
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
|
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
|
||||||
// do nothing
|
// do nothing
|
||||||
|
@ -117,24 +96,6 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
|
||||||
// do nothing
|
// 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
|
@Override
|
||||||
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
|
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) {
|
||||||
|
|
|
@ -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.AstLexicalAccess.Access;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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.EachElementGetInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
||||||
import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation;
|
import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation;
|
||||||
|
@ -241,12 +243,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
return new JavaScriptPropertyRead(iindex, result, objectRef, memberRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
return new JavaScriptPropertyWrite(iindex, objectRef, memberRef, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
package com.ibm.wala.cast.js.ssa;
|
package com.ibm.wala.cast.js.ssa;
|
||||||
|
|
||||||
import com.ibm.wala.cast.ir.ssa.AstAbstractInstructionVisitor;
|
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
|
public class JSAbstractInstructionVisitor
|
||||||
extends AstAbstractInstructionVisitor
|
extends AstAbstractInstructionVisitor
|
||||||
|
@ -23,12 +25,12 @@ public class JSAbstractInstructionVisitor
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) {
|
public void visitPropertyRead(AstPropertyRead instruction) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) {
|
public void visitPropertyWrite(AstPropertyWrite instruction) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,6 @@ public interface JSInstructionFactory extends AstInstructionFactory {
|
||||||
|
|
||||||
JavaScriptInvoke Invoke(int iindex, int function, int[] params, int exception, CallSiteReference site);
|
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);
|
SSAPutInstruction PutInstruction(int iindex, int ref, int value, String field);
|
||||||
|
|
||||||
JavaScriptTypeOfInstruction TypeOfInstruction(int iindex, int lval, int object);
|
JavaScriptTypeOfInstruction TypeOfInstruction(int iindex, int lval, int object);
|
||||||
|
|
|
@ -18,10 +18,6 @@ public interface JSInstructionVisitor extends AstInstructionVisitor {
|
||||||
|
|
||||||
public void visitTypeOf(JavaScriptTypeOfInstruction instruction);
|
public void visitTypeOf(JavaScriptTypeOfInstruction instruction);
|
||||||
|
|
||||||
public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction);
|
|
||||||
|
|
||||||
public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction);
|
|
||||||
|
|
||||||
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction);
|
public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction);
|
||||||
|
|
||||||
public void visitWithRegion(JavaScriptWithRegion instruction);
|
public void visitWithRegion(JavaScriptWithRegion instruction);
|
||||||
|
|
|
@ -12,33 +12,14 @@ package com.ibm.wala.cast.js.ssa;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet;
|
import com.ibm.wala.cast.ir.ssa.AstPropertyRead;
|
||||||
import com.ibm.wala.ssa.SSAInstruction;
|
|
||||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
|
||||||
import com.ibm.wala.types.TypeReference;
|
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) {
|
public JavaScriptPropertyRead(int iindex, int result, int objectRef, int memberRef) {
|
||||||
super(iindex, result, objectRef, 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)
|
/* (non-Javadoc)
|
||||||
* @see com.ibm.domo.ssa.Instruction#getExceptionTypes()
|
* @see com.ibm.domo.ssa.Instruction#getExceptionTypes()
|
||||||
*/
|
*/
|
||||||
|
@ -46,14 +27,4 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet {
|
||||||
public Collection<TypeReference> getExceptionTypes() {
|
public Collection<TypeReference> getExceptionTypes() {
|
||||||
return Util.typeErrorExceptions();
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,47 +12,15 @@ package com.ibm.wala.cast.js.ssa;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import com.ibm.wala.cast.ir.ssa.AbstractReflectivePut;
|
import com.ibm.wala.cast.ir.ssa.AstPropertyWrite;
|
||||||
import com.ibm.wala.ssa.SSAInstruction;
|
|
||||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
|
||||||
import com.ibm.wala.ssa.SymbolTable;
|
|
||||||
import com.ibm.wala.types.TypeReference;
|
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) {
|
public JavaScriptPropertyWrite(int iindex, int objectRef, int memberRef, int value) {
|
||||||
super(iindex, objectRef, memberRef, 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)
|
* (non-Javadoc)
|
||||||
* @see com.ibm.domo.ssa.Instruction#getExceptionTypes()
|
* @see com.ibm.domo.ssa.Instruction#getExceptionTypes()
|
||||||
|
|
|
@ -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.AstIsDefinedInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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.EachElementGetInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
||||||
import com.ibm.wala.ssa.IR;
|
import com.ibm.wala.ssa.IR;
|
||||||
|
@ -30,6 +32,15 @@ public abstract class AstTypeInference extends TypeInference {
|
||||||
private final TypeAbstraction booleanType;
|
private final TypeAbstraction booleanType;
|
||||||
|
|
||||||
protected class AstTypeOperatorFactory extends TypeOperatorFactory implements AstInstructionVisitor {
|
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
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead inst) {
|
public void visitAstLexicalRead(AstLexicalRead inst) {
|
||||||
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
|
result = new DeclaredTypeOperator(new ConeType(cha.getRootClass()));
|
||||||
|
|
|
@ -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.AstLexicalAccess.Access;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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.EachElementGetInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
||||||
import com.ibm.wala.cast.ir.translator.AstTranslator;
|
import com.ibm.wala.cast.ir.translator.AstTranslator;
|
||||||
import com.ibm.wala.cast.loader.AstMethod;
|
import com.ibm.wala.cast.loader.AstMethod;
|
||||||
import com.ibm.wala.cast.loader.AstMethod.LexicalInformation;
|
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.IClass;
|
||||||
import com.ibm.wala.classLoader.IMethod;
|
import com.ibm.wala.classLoader.IMethod;
|
||||||
import com.ibm.wala.fixpoint.AbstractOperator;
|
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.ipa.modref.ArrayLengthKey;
|
||||||
import com.ibm.wala.ssa.DefUse;
|
import com.ibm.wala.ssa.DefUse;
|
||||||
import com.ibm.wala.ssa.IRView;
|
import com.ibm.wala.ssa.IRView;
|
||||||
|
import com.ibm.wala.ssa.SSAInstruction;
|
||||||
import com.ibm.wala.ssa.SSAPutInstruction;
|
import com.ibm.wala.ssa.SSAPutInstruction;
|
||||||
import com.ibm.wala.ssa.SymbolTable;
|
import com.ibm.wala.ssa.SymbolTable;
|
||||||
import com.ibm.wala.util.collections.HashSetFactory;
|
import com.ibm.wala.util.collections.HashSetFactory;
|
||||||
|
@ -196,6 +200,16 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa
|
||||||
super(analysis, lpk);
|
super(analysis, lpk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyRead(AstPropertyRead instruction) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyWrite(AstPropertyWrite instruction) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
||||||
|
|
||||||
|
@ -260,6 +274,16 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa
|
||||||
super(vn);
|
super(vn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyRead(AstPropertyRead instruction) {
|
||||||
|
bingo = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyWrite(AstPropertyWrite instruction) {
|
||||||
|
bingo = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
||||||
bingo = true;
|
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
|
@Override
|
||||||
|
|
|
@ -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.AstIsDefinedInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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.EachElementGetInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
||||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
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.callgraph.propagation.PointerKey;
|
||||||
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
|
||||||
import com.ibm.wala.ipa.modref.ModRef;
|
import com.ibm.wala.ipa.modref.ModRef;
|
||||||
|
import com.ibm.wala.util.collections.Iterator2Iterable;
|
||||||
|
|
||||||
public class AstModRef<T extends InstanceKey> extends ModRef<T> {
|
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);
|
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
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
||||||
|
|
||||||
|
@ -147,6 +169,25 @@ public class AstModRef<T extends InstanceKey> extends ModRef<T> {
|
||||||
public void visitEcho(AstEchoInstruction inst) {
|
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
|
@Override
|
||||||
|
|
|
@ -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.AstIsDefinedInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
import com.ibm.wala.cast.ir.ssa.AstLexicalRead;
|
||||||
import com.ibm.wala.cast.ir.ssa.AstLexicalWrite;
|
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.EachElementGetInstruction;
|
||||||
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction;
|
||||||
import com.ibm.wala.cfg.InducedCFG;
|
import com.ibm.wala.cfg.InducedCFG;
|
||||||
|
@ -37,6 +39,14 @@ public class AstInducedCFG extends InducedCFG {
|
||||||
super(r);
|
super(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyRead(AstPropertyRead inst) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyWrite(AstPropertyWrite inst) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead inst) {
|
public void visitAstLexicalRead(AstLexicalRead inst) {
|
||||||
}
|
}
|
||||||
|
@ -85,6 +95,14 @@ public class AstInducedCFG extends InducedCFG {
|
||||||
super(r);
|
super(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyRead(AstPropertyRead inst) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyWrite(AstPropertyWrite inst) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead inst) {
|
public void visitAstLexicalRead(AstLexicalRead inst) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,16 @@ public abstract class AstAbstractInstructionVisitor
|
||||||
implements AstInstructionVisitor
|
implements AstInstructionVisitor
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyRead(AstPropertyRead instruction) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitPropertyWrite(AstPropertyWrite instruction) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
public void visitAstLexicalRead(AstLexicalRead instruction) {
|
||||||
|
|
||||||
|
|
|
@ -51,4 +51,8 @@ public interface AstInstructionFactory extends SSAInstructionFactory {
|
||||||
|
|
||||||
EachElementHasNextInstruction EachElementHasNextInstruction(int iindex, int lValue, int objectRef, int previousProp);
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,5 +31,10 @@ public interface AstInstructionVisitor extends SSAInstruction.IVisitor {
|
||||||
public void visitIsDefined(AstIsDefinedInstruction inst);
|
public void visitIsDefined(AstIsDefinedInstruction inst);
|
||||||
|
|
||||||
public void visitEcho(AstEchoInstruction inst);
|
public void visitEcho(AstEchoInstruction inst);
|
||||||
|
|
||||||
|
public void visitPropertyRead(AstPropertyRead instruction);
|
||||||
|
|
||||||
|
public void visitPropertyWrite(AstPropertyWrite instruction);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
package com.ibm.wala.cast.ir.translator;
|
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.CAstNode;
|
||||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
|
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
|
||||||
import com.ibm.wala.cast.tree.CAstType;
|
import com.ibm.wala.cast.tree.CAstType;
|
||||||
|
@ -48,7 +47,7 @@ public abstract class AbstractCodeEntity extends AbstractEntity {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CAstControlFlowMap getControlFlow() {
|
public CAstControlFlowRecorder getControlFlow() {
|
||||||
return cfg;
|
return cfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1454,6 +1454,8 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
|
|
||||||
boolean isFinal();
|
boolean isFinal();
|
||||||
|
|
||||||
|
boolean isGlobal();
|
||||||
|
|
||||||
boolean isInternalName();
|
boolean isInternalName();
|
||||||
|
|
||||||
Object defaultInitValue();
|
Object defaultInitValue();
|
||||||
|
@ -1613,10 +1615,14 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
@Override
|
@Override
|
||||||
public void declare(CAstSymbol s, int vn) {
|
public void declare(CAstSymbol s, int vn) {
|
||||||
String nm = s.name();
|
String nm = s.name();
|
||||||
assert !contains(nm) : nm;
|
if (!contains(nm)) {
|
||||||
if (s.isCaseInsensitive())
|
if (s.isCaseInsensitive())
|
||||||
caseInsensitiveNames.put(nm.toLowerCase(), nm);
|
caseInsensitiveNames.put(nm.toLowerCase(), nm);
|
||||||
values.put(nm, makeSymbol(s, vn));
|
values.put(nm, makeSymbol(s, vn));
|
||||||
|
} else {
|
||||||
|
assert hasImplicitGlobals();
|
||||||
|
assert isGlobal(lookup(nm));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1762,7 +1768,13 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
public boolean isParameter() {
|
public boolean isParameter() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGlobal() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1922,6 +1934,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
public boolean isParameter() {
|
public boolean isParameter() {
|
||||||
return vn <= params.length;
|
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() {
|
public boolean isParameter() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGlobal() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -2157,6 +2179,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
public int valueNumber() {
|
public int valueNumber() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGlobal() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -2282,6 +2309,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
public int valueNumber() {
|
public int valueNumber() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGlobal() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -3775,10 +3807,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
WalkContext context = c;
|
WalkContext context = c;
|
||||||
if (!context.cfg().isDeadBlock(context.cfg().getCurrentBlock())) {
|
if (!context.cfg().isDeadBlock(context.cfg().getCurrentBlock())) {
|
||||||
context.cfg().addPreNode(n, context.getUnwindState());
|
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));
|
context.cfg().addInstruction(insts.GotoInstruction(context.cfg().currentInstruction, -1));
|
||||||
if (context.getControlFlow().getTarget(n, null) == null) {
|
if (controlFlowMap.getTarget(n, null) == null) {
|
||||||
assert context.getControlFlow().getTarget(n, null) != null : context.getControlFlow() + " does not map " + n + " ("
|
assert controlFlowMap.getTarget(n, null) != null : controlFlowMap + " does not map " + n + " ("
|
||||||
+ context.getSourceMap().getPosition(n) + ")";
|
+ context.getSourceMap().getPosition(n) + ")";
|
||||||
}
|
}
|
||||||
context.cfg().newBlock(false);
|
context.cfg().newBlock(false);
|
||||||
|
|
Loading…
Reference in New Issue