From a2f4f3b23847754726e0359f33a99ec87f96dec6 Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Sun, 16 Mar 2014 18:05:49 -0400 Subject: [PATCH] type in CAst var decls --- .../polyglot/PolyglotJava2CAstTranslator.java | 6 +- .../ast/SynchronizedBlockDuplicator.java | 4 +- .../java/loader/JavaSourceLoaderImpl.java | 8 +- .../translator/JavaCAst2IRTranslator.java | 37 +++- .../js/translator/RhinoToAstTranslator.java | 21 +- .../cast/js/html/WebPageLoaderFactory.java | 18 +- .../extraction/ClosureExtractor.java | 3 +- .../wala/cast/js/loader/JavaScriptLoader.java | 8 +- .../cast/js/translator/JSAstTranslator.java | 44 +++- .../js/translator/PropertyReadExpander.java | 10 +- .../wala/cast/ipa/callgraph/AstCallGraph.java | 2 +- .../cast/ir/ssa/AstInstructionFactory.java | 5 +- .../wala/cast/ir/ssa/AstLexicalAccess.java | 7 +- .../ibm/wala/cast/ir/ssa/AstLexicalRead.java | 7 +- .../ibm/wala/cast/ir/ssa/AstLexicalWrite.java | 7 +- .../cast/ir/translator/AstTranslator.java | 189 +++++++++++++----- .../com/ibm/wala/cast/tree/CAstSymbol.java | 1 + .../wala/cast/tree/impl/CAstSymbolImpl.java | 26 +-- .../cast/tree/impl/CAstSymbolImplBase.java | 33 ++- .../jdt/JDTJava2CAstTranslator.java | 47 +++-- .../jdt/JDTSourceModuleTranslator.java | 2 +- 21 files changed, 327 insertions(+), 158 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJava2CAstTranslator.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJava2CAstTranslator.java index de4fbcb4d..574d0964d 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJava2CAstTranslator.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJava2CAstTranslator.java @@ -869,7 +869,7 @@ public class PolyglotJava2CAstTranslator { handleThrowsFromCall(ctorInst, n, wc); return makeNode(wc, fFactory, n, CAstNode.LOCAL_SCOPE, makeNode(wc, fFactory, n, CAstNode.BLOCK_EXPR, makeNode(wc, fFactory, - n, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol(tmpName, true)), newNode), callNode, makeNode(wc, + n, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol(tmpName, getTypeDict().getCAstTypeFor(n.type()), true)), newNode), callNode, makeNode(wc, fFactory, n, CAstNode.VAR, fFactory.makeConstant(tmpName)))); } @@ -1280,7 +1280,7 @@ public class PolyglotJava2CAstTranslator { public CAstNode visit(Synchronized s, WalkContext wc) { CAstNode exprNode = walkNodes(s.expr(), wc); String exprName = fFactory.makeUnique(); - CAstNode declStmt = makeNode(wc, fFactory, s, CAstNode.DECL_STMT, fFactory.makeConstant(new CAstSymbolImpl(exprName, true)), + CAstNode declStmt = makeNode(wc, fFactory, s, CAstNode.DECL_STMT, fFactory.makeConstant(new CAstSymbolImpl(exprName, getTypeDict().getCAstTypeFor(s.expr().type()), true)), exprNode); CAstNode monitorEnterNode = makeNode(wc, fFactory, s, CAstNode.MONITOR_ENTER, makeNode(wc, fFactory, s, CAstNode.VAR, fFactory.makeConstant(exprName))); @@ -1362,7 +1362,7 @@ public class PolyglotJava2CAstTranslator { boolean isFinal = ld.flags().flags().isFinal(); - return makeNode(wc, fFactory, ld, CAstNode.DECL_STMT, fFactory.makeConstant(new CAstSymbolImpl(ld.name().id().toString(), isFinal, + return makeNode(wc, fFactory, ld, CAstNode.DECL_STMT, fFactory.makeConstant(new CAstSymbolImpl(ld.name().id().toString(), getTypeDict().getCAstTypeFor(type), isFinal, defaultValue)), initNode); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/examples/ast/SynchronizedBlockDuplicator.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/examples/ast/SynchronizedBlockDuplicator.java index c5d6bc663..9297123d6 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/examples/ast/SynchronizedBlockDuplicator.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/examples/ast/SynchronizedBlockDuplicator.java @@ -12,11 +12,13 @@ package com.ibm.wala.cast.java.examples.ast; import java.util.Map; +import com.ibm.wala.cast.java.types.JavaPrimitiveTypeMap; import com.ibm.wala.cast.tree.CAst; import com.ibm.wala.cast.tree.CAstControlFlowMap; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; import com.ibm.wala.cast.tree.CAstSourcePositionMap; +import com.ibm.wala.cast.tree.CAstType; import com.ibm.wala.cast.tree.impl.CAstOperator; import com.ibm.wala.cast.tree.rewrite.CAstRewriter; import com.ibm.wala.classLoader.CallSiteReference; @@ -219,7 +221,7 @@ public class SynchronizedBlockDuplicator extends // the conditional test CAstNode test = Ast.makeNode(CAstNode.CALL, Ast.makeNode(CAstNode.VOID), Ast.makeConstant(f), - Ast.makeNode(CAstNode.VAR, Ast.makeConstant(varName))); + Ast.makeNode(CAstNode.VAR, Ast.makeConstant(varName), Ast.makeConstant(JavaPrimitiveTypeMap.lookupType("boolean")))); // the new if conditional return Ast.makeNode(CAstNode.IF_STMT, test, copyNodes(n, cfg, new SyncContext(true, n, c), nodeMap), diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java index 94cdd0043..43dada668 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java @@ -622,8 +622,8 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } @Override - public AstLexicalRead LexicalRead(int lhs, String definer, String globalName) { - return new AstLexicalRead(lhs, definer, globalName); + public AstLexicalRead LexicalRead(int lhs, String definer, String globalName, TypeReference type) { + return new AstLexicalRead(lhs, definer, globalName, type); } @Override @@ -637,8 +637,8 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } @Override - public AstLexicalWrite LexicalWrite(String definer, String globalName, int rhs) { - return new AstLexicalWrite(definer, globalName, rhs); + public AstLexicalWrite LexicalWrite(String definer, String globalName, TypeReference type, int rhs) { + return new AstLexicalWrite(definer, globalName, type, rhs); } public SSAThrowInstruction NonExceptingThrowInstruction(int exception) { diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java index b6c8dddaa..1454a1370 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java @@ -14,6 +14,7 @@ package com.ibm.wala.cast.java.translator; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.Map; @@ -207,7 +208,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } @Override - protected void doGlobalWrite(WalkContext context, String name, int rval) { + protected void doGlobalWrite(WalkContext context, String name, TypeReference type, int rval) { Assertions.UNREACHABLE("doGlobalWrite() called for Java code???"); } @@ -408,6 +409,40 @@ processExceptions(n, context); } } + private CAstType getType(final String name) { + return new CAstType.Class() { + + @Override + public Collection getSupertypes() { + return Collections.emptySet(); + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean isInterface() { + return false; + } + + @Override + public Collection getQualifiers() { + return Collections.emptySet(); + } + }; + } + @Override + protected CAstType topType() { + return getType("java.lang.Object"); + } + + @Override + protected CAstType exceptionType() { + return getType("java.lang.Exception"); + } + } diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java index 9f387ebd4..76ebb3742 100755 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java @@ -499,8 +499,7 @@ public class RhinoToAstTranslator { @Override public CAstType getType() { - Assertions.UNREACHABLE("JuliansUnnamedCAstEntity$2.getType()"); - return null; + return JSAstTranslator.Any; } } @@ -818,7 +817,7 @@ public class RhinoToAstTranslator { CAstNode object = visit(node.getIteratedObject(), arg); String tempName = "for in loop temp"; CAstNode[] loopHeader = new CAstNode[]{ - Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(tempName))), + Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(tempName, JSAstTranslator.Any))), Ast.makeNode(CAstNode.ASSIGN, Ast.makeNode(CAstNode.VAR, Ast.makeConstant(tempName)), object) }; @@ -846,12 +845,12 @@ public class RhinoToAstTranslator { if (isLet) { initNode = Ast.makeNode(CAstNode.DECL_STMT, - Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString())), + Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString(), JSAstTranslator.Any)), Ast.makeNode(CAstNode.EACH_ELEMENT_GET, Ast.makeNode(CAstNode.VAR, Ast.makeConstant(tempName)))); } else { arg.addNameDecl( - Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString())), + Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString(), JSAstTranslator.Any)), readName(arg, null, "$$undefined"))); initNode = @@ -939,10 +938,10 @@ public class RhinoToAstTranslator { Ast.makeNode(CAstNode.LOCAL_SCOPE, Ast.makeNode(CAstNode.BLOCK_EXPR, Ast.makeNode(CAstNode.DECL_STMT, - Ast.makeConstant(new CAstSymbolImpl(operationReceiverName(thisBaseVarNum))), + Ast.makeConstant(new CAstSymbolImpl(operationReceiverName(thisBaseVarNum), JSAstTranslator.Any)), Ast.makeConstant(null)), Ast.makeNode(CAstNode.DECL_STMT, - Ast.makeConstant(new CAstSymbolImpl(operationElementName(thisBaseVarNum))), + Ast.makeConstant(new CAstSymbolImpl(operationElementName(thisBaseVarNum), JSAstTranslator.Any)), Ast.makeConstant(null)), fun, makeCall(operationElementVar(thisBaseVarNum), operationReceiverVar(thisBaseVarNum), args, context, "dispatch"))); @@ -1010,7 +1009,7 @@ public class RhinoToAstTranslator { CAstNode r = visit(node.getRight(), arg); return Ast.makeNode(CAstNode.LOCAL_SCOPE, Ast.makeNode(CAstNode.BLOCK_EXPR, - Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl("or temp")), l), + Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl("or temp", JSAstTranslator.Any)), l), Ast.makeNode(CAstNode.IF_EXPR, Ast.makeNode(CAstNode.VAR, Ast.makeConstant("or temp")), Ast.makeNode(CAstNode.VAR, Ast.makeConstant("or temp")), @@ -1020,7 +1019,7 @@ public class RhinoToAstTranslator { CAstNode r = visit(node.getRight(), arg); return Ast.makeNode(CAstNode.LOCAL_SCOPE, Ast.makeNode(CAstNode.BLOCK_EXPR, - Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl("and temp")), l), + Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl("and temp", JSAstTranslator.Any)), l), Ast.makeNode(CAstNode.IF_EXPR, Ast.makeNode(CAstNode.VAR, Ast.makeConstant("and temp")), r, @@ -1116,7 +1115,7 @@ public class RhinoToAstTranslator { for(VariableInitializer init : decl.getVariables()) { stmts[i++] = Ast.makeNode(CAstNode.DECL_STMT, - Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString())), + Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString(), JSAstTranslator.Any)), visit(init, arg)); } stmts[i++] = visit(node.getBody(), arg); @@ -1362,7 +1361,7 @@ public class RhinoToAstTranslator { arg.addNameDecl( noteSourcePosition( arg, - Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString())), + Ast.makeNode(CAstNode.DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(init.getTarget().getString(), JSAstTranslator.Any)), readName(arg, null, "$$undefined")), node)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java index 28eca17e4..dbcbc2985 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java @@ -16,6 +16,7 @@ import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.js.ssa.JSInstructionFactory; import com.ibm.wala.cast.js.translator.JSAstTranslator; import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; +import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.cast.tree.CAst; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; @@ -25,6 +26,7 @@ import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.types.TypeReference; public class WebPageLoaderFactory extends JavaScriptLoaderFactory { @@ -53,12 +55,12 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory { } @Override - protected int doGlobalRead(CAstNode n, WalkContext context, String name) { + protected int doGlobalRead(CAstNode n, WalkContext context, String name, TypeReference type) { int result = context.currentScope().allocateTempValue(); if (isNestedWithinScriptBody(context) && ! "$$undefined".equals(name) && ! "window".equals(name)) { // check if field is defined on 'window' - int windowVal = isScriptBody(context)? super.doLocalRead(context, "this"): super.doGlobalRead(n, context, "window"); + int windowVal = isScriptBody(context)? super.doLocalRead(context, "this", JavaScriptTypes.Root): super.doGlobalRead(n, context, "window", type); int isDefined = context.currentScope().allocateTempValue(); context.currentScope().getConstantValue(name); doIsFieldDefined(context, isDefined, windowVal, Ast.makeConstant(name)); @@ -79,7 +81,7 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory { // read global context.cfg().newBlock(false); PreBasicBlock falseB = context.cfg().getCurrentBlock(); - int sr = super.doGlobalRead(n, context, name); + int sr = super.doGlobalRead(n, context, name, type); context.cfg().addInstruction(((JSInstructionFactory) insts).AssignInstruction(result, sr)); // end @@ -91,19 +93,19 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory { return result; } else { - return super.doGlobalRead(n, context, name); + return super.doGlobalRead(n, context, name, type); } } @Override - protected void doLocalWrite(WalkContext context, String nm, int rval) { + protected void doLocalWrite(WalkContext context, String nm, TypeReference type, int rval) { if (isScriptBody(context)) { - int windowVal = super.doLocalRead(context, "this"); + int windowVal = super.doLocalRead(context, "this", type); context.currentScope().getConstantValue(nm); context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(windowVal, rval, nm)); } - super.doLocalWrite(context, nm, rval); + super.doLocalWrite(context, nm, type, rval); } @Override @@ -113,7 +115,7 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory { CAstEntity fn = (CAstEntity) n.getChild(0).getValue(); int fnValue = context.currentScope().lookup(fn.getName()).valueNumber(); assert fnValue > 0; - int windowVal = super.doLocalRead(context, "this"); + int windowVal = super.doLocalRead(context, "this", JavaScriptTypes.Function); context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(windowVal, fnValue, fn.getName())); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java index a9ecde373..029d5e93f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.ibm.wala.cast.js.translator.JSAstTranslator; import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.cast.tree.CAst; import com.ibm.wala.cast.tree.CAstControlFlowMap; @@ -508,7 +509,7 @@ public class ClosureExtractor extends CAstRewriterExt { } // prepend declaration "var ;" - CAstNode theLocalDecl = Ast.makeNode(DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(theLocal)), + CAstNode theLocalDecl = Ast.makeNode(DECL_STMT, Ast.makeConstant(new CAstSymbolImpl(theLocal, JSAstTranslator.Any)), addExnFlow(makeVarRef("$$undefined"), JavaScriptTypes.ReferenceError, entity, context)); if(fun_body_stmts.size() > 1) { CAstNode newBlock = Ast.makeNode(BLOCK_STMT, fun_body_stmts.toArray(new CAstNode[0])); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java index 4a5d8dd14..03adc842d 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java @@ -341,8 +341,8 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } @Override - public AstLexicalRead LexicalRead(int lhs, String definer, String globalName) { - return new AstLexicalRead(lhs, definer, globalName); + public AstLexicalRead LexicalRead(int lhs, String definer, String globalName, TypeReference type) { + return new AstLexicalRead(lhs, definer, globalName, type); } @Override @@ -356,8 +356,8 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } @Override - public AstLexicalWrite LexicalWrite(String definer, String globalName, int rhs) { - return new AstLexicalWrite(definer, globalName, rhs); + public AstLexicalWrite LexicalWrite(String definer, String globalName, TypeReference type, int rhs) { + return new AstLexicalWrite(definer, globalName, type, rhs); } @Override diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java index b4a34c51c..7eb7498d0 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java @@ -11,6 +11,8 @@ package com.ibm.wala.cast.js.translator; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.Set; @@ -80,8 +82,8 @@ public class JSAstTranslator extends AstTranslator { @Override protected TypeReference makeType(CAstType type) { - Assertions.UNREACHABLE("JavaScript does not use CAstType"); - return null; + assert "Any".equals(type.getName()); + return JavaScriptTypes.Root; } @@ -120,16 +122,16 @@ public class JSAstTranslator extends AstTranslator { } @Override - protected int doLexicallyScopedRead(CAstNode n, WalkContext context, String name) { - int readVn = super.doLexicallyScopedRead(n, context, name); + protected int doLexicallyScopedRead(CAstNode n, WalkContext context, String name, TypeReference type) { + int readVn = super.doLexicallyScopedRead(n, context, name, type); // should get an exception if name is undefined addDefinedCheck(n, context, readVn); return readVn; } @Override - protected int doGlobalRead(CAstNode n, WalkContext context, String name) { - int readVn = super.doGlobalRead(n, context, name); + protected int doGlobalRead(CAstNode n, WalkContext context, String name, TypeReference type) { + int readVn = super.doGlobalRead(n, context, name, type); // add a check if name is undefined, unless we're reading the value 'undefined' if (!("undefined".equals(name) || "$$undefined".equals(name))) { addDefinedCheck(n, context, readVn); @@ -224,7 +226,7 @@ public class JSAstTranslator extends AstTranslator { protected void doMaterializeFunction(CAstNode n, WalkContext context, int result, int exception, CAstEntity fn) { int nm = context.currentScope().getConstantValue("L" + composeEntityName(context, fn)); // "Function" is the name we use to model the constructor of function values - int tmp = super.doGlobalRead(n, context, "Function"); + int tmp = super.doGlobalRead(n, context, "Function", JavaScriptTypes.Function); context.cfg().addInstruction( ((JSInstructionFactory) insts).Invoke(tmp, result, new int[] { nm }, exception, new JSCallSiteReference( JavaScriptMethods.ctorReference, context.cfg().getCurrentInstruction()))); @@ -416,14 +418,13 @@ public class JSAstTranslator extends AstTranslator { int tempVal = context.currentScope().allocateTempValue(); doNewObject(context, null, tempVal, "Array", null); - CAstSymbol args = new CAstSymbolImpl("arguments"); + CAstSymbol args = new CAstSymbolImpl("arguments", Any); context.currentScope().declare(args, tempVal); //context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(1, tempVal, "arguments")); } @Override - protected boolean doVisit(CAstNode n, WalkContext cntxt, CAstVisitor visitor) { - WalkContext context = (WalkContext) cntxt; + protected boolean doVisit(CAstNode n, WalkContext context, CAstVisitor visitor) { switch (n.getKind()) { case CAstNode.TYPE_OF: { int result = context.currentScope().allocateTempValue(); @@ -453,4 +454,27 @@ public class JSAstTranslator extends AstTranslator { } } + public static final CAstType Any = new CAstType() { + + @Override + public String getName() { + return "Any"; + } + + @Override + public Collection getSupertypes() { + return Collections.EMPTY_SET; + } + }; + + @Override + protected CAstType topType() { + return Any; + } + + @Override + protected CAstType exceptionType() { + return Any; + } + } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/PropertyReadExpander.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/PropertyReadExpander.java index 62148d431..3a4358f0a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/PropertyReadExpander.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/PropertyReadExpander.java @@ -164,7 +164,7 @@ public class PropertyReadExpander extends CAstRewriter exposedNames = entity2ExposedNames.get(entity); if (exposedNames != null) { + int i = 0; for (String arg : entity.getArgumentNames()) { if (exposedNames.contains(arg)) { final Scope currentScope = context.currentScope(); Symbol symbol = currentScope.lookup(arg); assert symbol.getDefiningScope() == currentScope; int argVN = symbol.valueNumber(); - Access A = new Access(arg, context.getEntityName(entity), argVN); + CAstType type = (entity.getType() instanceof CAstType.Method)? + (CAstType)((CAstType.Method)entity.getType()).getArgumentTypes().get(i): + topType(); + Access A = new Access(arg, context.getEntityName(entity), makeType(type), argVN); context.cfg().addInstruction(new AstLexicalWrite(A)); } } @@ -272,11 +286,11 @@ public abstract class AstTranslator extends CAstVisitor exposed = entity2ExposedNames.get(entity); if (exposed != null && exposed.contains(name)) { - return doLexReadHelper(context, name); + return doLexReadHelper(context, name, type); } return context.currentScope().lookup(name).valueNumber(); } @@ -286,12 +300,12 @@ public abstract class AstTranslator extends CAstVisitor exposed = entity2ExposedNames.get(entity); if (exposed != null && exposed.contains(nm)) { // use a lexical write - doLexicallyScopedWrite(context, nm, rval); + doLexicallyScopedWrite(context, nm, type, rval); return; } int lval = context.currentScope().lookup(nm).valueNumber(); @@ -310,8 +324,8 @@ public abstract class AstTranslator extends CAstVisitor visitor) { // Define a new field in the enclosing type, if the language we're // processing allows such. - context.getGlobalScope().declare(new CAstSymbolImpl(n.getName())); + context.getGlobalScope().declare(new CAstSymbolImpl(n.getName(), n.getType())); } @Override @@ -3240,10 +3315,10 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = c; String nm = (String) n.getChild(0).getValue(); - context.currentScope().declare(new FinalCAstSymbol(nm)); + context.currentScope().declare(new FinalCAstSymbol(nm, exceptionType())); context.cfg().addInstruction( insts.GetCaughtExceptionInstruction(context.cfg().getCurrentBlock().getNumber(), context.currentScope().lookup(nm) .valueNumber())); @@ -3388,12 +3463,14 @@ public abstract class AstTranslator extends CAstVisitor visitor) { CAstSymbol s = (CAstSymbol) n.getChild(0).getValue(); String nm = s.name(); + CAstType t = s.type(); Scope scope = c.currentScope(); if (n.getChildCount() == 2) { CAstNode v = n.getChild(1); if (scope.contains(nm) && scope.lookup(nm).getDefiningScope() == scope) { assert !s.isFinal(); - doLocalWrite(c, nm, c.getValue(v)); + doLocalWrite(c, nm, makeType(t), c.getValue(v)); } else if (v.getKind() != CAstNode.CONSTANT && v.getKind() != CAstNode.VAR && v.getKind() != CAstNode.THIS) { scope.declare(s, c.getValue(v)); } else { scope.declare(s); - doLocalWrite(c, nm, c.getValue(v)); + doLocalWrite(c, nm, makeType(t), c.getValue(v)); } } else { c.currentScope().declare(s); @@ -3903,12 +3981,12 @@ public abstract class AstTranslator extends CAstVisitor ] // arg 0: this - argNodes[idx++] = makeNode(context, fFactory, nn, CAstNode.VAR, fFactory.makeConstant(tmpName)); + argNodes[idx++] = makeNode(context, fFactory, nn, CAstNode.VAR, fFactory.makeConstant(tmpName), fFactory.makeConstant(fTypeDict.getCAstTypeFor(newType))); // contains output from newNode (see part III) // arg 1: call site ref (WHY?) @@ -1419,7 +1422,7 @@ public class JDTJava2CAstTranslator { // 3) access this temporary variable. Since the value of the block is the last thing in the block, the resultant // value will be the variable return makeNode(context, fFactory, nn, CAstNode.LOCAL_SCOPE, makeNode(context, fFactory, nn, CAstNode.BLOCK_EXPR, makeNode( - context, fFactory, nn, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol(tmpName, true)), newNode), + context, fFactory, nn, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol(tmpName, fTypeDict.getCAstTypeFor(newType), true)), newNode), callNode, makeNode(context, fFactory, nn, CAstNode.VAR, fFactory.makeConstant(tmpName)))); } @@ -1698,13 +1701,13 @@ public class JDTJava2CAstTranslator { final String tmpName = "temp generic preop hack"; // illegal Java identifier CAstNode exprNode = visitNode(field.getExpression(), context); CAstNode tmpDeclNode = makeNode(context, fFactory, left, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol( - tmpName, true)), exprNode); + tmpName, fTypeDict.getCAstTypeFor(field.getExpression().resolveTypeBinding()), true)), exprNode); // need two object refndoes "temp.y" - CAstNode obref1 = createFieldAccess(makeNode(context, fFactory, left, CAstNode.VAR, fFactory.makeConstant(tmpName)), field + CAstNode obref1 = createFieldAccess(makeNode(context, fFactory, left, CAstNode.VAR, fFactory.makeConstant(tmpName), fFactory.makeConstant(fTypeDict.getCAstTypeFor(field.resolveFieldBinding().getType()))), field .getName().getIdentifier(), field.resolveFieldBinding(), left, new AssignmentContext(context)); - CAstNode obref2 = createFieldAccess(makeNode(context, fFactory, left, CAstNode.VAR, fFactory.makeConstant(tmpName)), field + CAstNode obref2 = createFieldAccess(makeNode(context, fFactory, left, CAstNode.VAR, fFactory.makeConstant(tmpName), fFactory.makeConstant(fTypeDict.getCAstTypeFor(field.resolveFieldBinding().getType()))), field .getName().getIdentifier(), field.resolveFieldBinding(), left, context); ITypeBinding realtype = JDT2CAstUtils.getErasedType(field.resolveFieldBinding().getType(), ast); ITypeBinding fromtype = JDT2CAstUtils @@ -1806,7 +1809,8 @@ public class JDTJava2CAstTranslator { } else { // local - return makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(n.getIdentifier())); + CAstType t = fTypeDict.getCAstTypeFor(((IVariableBinding)n.resolveBinding()).getType()); + return makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(n.getIdentifier()), fFactory.makeConstant(t)); } } @@ -2499,7 +2503,7 @@ public class JDTJava2CAstTranslator { context.cfg().map(o1, iterCallNode); // TODO: this might not work, lots of calls in this one statement. CAstNode iterAssignNode = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol( - tmpName, true)), iterCallNode); + tmpName, fTypeDict.getCAstTypeFor(ast.resolveWellKnownType("int")), true)), iterCallNode); // MATCHUP: wrap in a block iterAssignNode = makeNode(context, fFactory, n, CAstNode.BLOCK_STMT, iterAssignNode); @@ -2539,12 +2543,12 @@ public class JDTJava2CAstTranslator { Object defaultValue = JDT2CAstUtils.defaultValueForType(svd.resolveBinding().getType()); CAstNode nextAssignNode = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory.makeConstant(new CAstSymbolImpl(svd - .getName().getIdentifier(), (svd.getModifiers() & Modifier.FINAL) != 0, defaultValue)), castedNode); + .getName().getIdentifier(), fTypeDict.getCAstTypeFor(svd.resolveBinding().getType()), (svd.getModifiers() & Modifier.FINAL) != 0, defaultValue)), castedNode); /*----------- put it all together ----------*/ ASTNode breakTarget = makeBreakOrContinueTarget(n, "breakLabel" + n.getStartPosition()); ASTNode continueTarget = makeBreakOrContinueTarget(n, "continueLabel" + n.getStartPosition()); - String loopLabel = (String) context.getLabelMap().get(n); + String loopLabel = context.getLabelMap().get(n); WalkContext loopContext = new LoopContext(context, loopLabel, breakTarget, continueTarget); // LOCAL_SCOPE(BLOCK(iterassign,LOOP(cond,BLOCK(BLOCK(paramassign,bodyblock),continuetarget,BLOCK())),breaktarget)) @@ -2575,18 +2579,18 @@ public class JDTJava2CAstTranslator { final String tmpArrayName = "for temp array"; // illegal java identifier CAstNode exprNode = visitNode(n.getExpression(), context); CAstNode arrayDeclNode = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol( - tmpArrayName, true)), exprNode); + tmpArrayName, fTypeDict.getCAstTypeFor(n.getExpression().resolveTypeBinding()), true)), exprNode); /*------ indexDecl --------- int tmpindex = 0 ------*/ final String tmpIndexName = "for temp index"; CAstNode indexDeclNode = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory.makeConstant(new InternalCAstSymbol( - tmpIndexName, true)), fFactory.makeConstant(new Integer(0))); + tmpIndexName, fTypeDict.getCAstTypeFor(ast.resolveWellKnownType("int")), true)), fFactory.makeConstant(new Integer(0))); /*------ cond ------------- tmpindex < tmparray.length ------*/ CAstNode tmpArrayLengthNode = makeNode(context, fFactory, n, CAstNode.ARRAY_LENGTH, makeNode(context, fFactory, n, - CAstNode.VAR, fFactory.makeConstant(tmpArrayName))); + CAstNode.VAR, fFactory.makeConstant(tmpArrayName), fFactory.makeConstant(fTypeDict.getCAstTypeFor(n.getExpression().resolveTypeBinding())))); CAstNode condNode = makeNode(context, fFactory, n, CAstNode.BINARY_EXPR, CAstOperator.OP_LT, makeNode(context, fFactory, n, - CAstNode.VAR, fFactory.makeConstant(tmpIndexName)), tmpArrayLengthNode); + CAstNode.VAR, fFactory.makeConstant(tmpIndexName), fFactory.makeConstant(JavaPrimitiveType.INT)), tmpArrayLengthNode); /*------ tmpIndexInc -------- tmpindex++ ------*/ CAstNode tmpArrayIncNode = makeNode(context, fFactory, n, CAstNode.ASSIGN_POST_OP, makeNode(context, fFactory, n, CAstNode.VAR, @@ -2601,7 +2605,8 @@ public class JDTJava2CAstTranslator { SingleVariableDeclaration svd = n.getParameter(); Object defaultValue = JDT2CAstUtils.defaultValueForType(svd.resolveBinding().getType()); CAstNode nextAssignNode = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory.makeConstant(new CAstSymbolImpl(svd - .getName().getIdentifier(), (svd.getModifiers() & Modifier.FINAL) != 0, defaultValue)), tmpArrayAccessNode); + .getName().getIdentifier(), fTypeDict.getCAstTypeFor(n.getExpression() + .resolveTypeBinding().getComponentType()), (svd.getModifiers() & Modifier.FINAL) != 0, defaultValue)), tmpArrayAccessNode); // LOCAL_SCOPE(BLOCK(arrayDecl,LOCAL_SCOPE(BLOCK(BLOCK(indexDecl),LOOP(cond,BLOCK(LOCAL_SCOPE(BLOCK(nextAssign,bodyblock)),continuetarget,BLOCK(iter))),breaktarget)))) // more complicated than it has to be, but it matches up exactly with the Java expansion above. @@ -2772,7 +2777,7 @@ public class JDTJava2CAstTranslator { CAstNode exprNode = visitNode(n.getExpression(), context); String exprName = fFactory.makeUnique(); CAstNode declStmt = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory - .makeConstant(new CAstSymbolImpl(exprName, true)), exprNode); + .makeConstant(new CAstSymbolImpl(exprName, fTypeDict.getCAstTypeFor(n.getExpression().resolveTypeBinding()), true)), exprNode); CAstNode monitorEnterNode = makeNode(context, fFactory, n, CAstNode.MONITOR_ENTER, makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(exprName))); @@ -3407,7 +3412,7 @@ public class JDTJava2CAstTranslator { CAstNode typeLit = makeNode(context, fFactory, fakeMet, CAstNode.TYPE_LITERAL_EXPR, fFactory.makeConstant(fIdentityMapper .typeToTypeID(enumType))); - CAstNode stringSvar = makeNode(context, fFactory, fakeMet, CAstNode.VAR, fFactory.makeConstant("s")); + CAstNode stringSvar = makeNode(context, fFactory, fakeMet, CAstNode.VAR, fFactory.makeConstant("s"), fFactory.makeConstant(fTypeDict.getCAstTypeFor(ast.resolveWellKnownType("java.lang.String")))); ArrayList args = new ArrayList(); args.add(typeLit); args.add(stringSvar); @@ -3585,12 +3590,12 @@ public class JDTJava2CAstTranslator { CallSiteReference callSiteRef = CallSiteReference.make(0, fIdentityMapper.getMethodRef(superCtor), IInvokeInstruction.Dispatch.SPECIAL); children[1] = fFactory.makeConstant(callSiteRef); - children[2] = makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(fakeArguments[1])); - children[3] = makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(fakeArguments[2])); + children[2] = makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(fakeArguments[1]), fFactory.makeConstant(paramTypes.get(0))); + children[3] = makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(fakeArguments[2]), fFactory.makeConstant(paramTypes.get(1))); if (ctor.isDefaultConstructor()) for (int i = 0; i < ctor.getParameterTypes().length; i++) - children[i + 4] = makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(fakeArguments[i + 3])); + children[i + 4] = makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(fakeArguments[i + 3]), fFactory.makeConstant(paramTypes.get(i+2))); bodyNodes[0] = makeNode(context, fFactory, n, CAstNode.CALL, children); // QUESTION: no handleExceptions? diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceModuleTranslator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceModuleTranslator.java index 5c4f1322b..0ed76de52 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceModuleTranslator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceModuleTranslator.java @@ -149,7 +149,7 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { e.printStackTrace(); } - if (! System.getProperty("wala.jdt.quiet").equals("true")) { + if (! "true".equals(System.getProperty("wala.jdt.quiet"))) { IProblem[] problems = ast.getProblems(); int length = problems.length; if (length > 0) {