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 31bfe248e..a92a057e9 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 @@ -32,6 +32,7 @@ import com.ibm.wala.cast.ir.ssa.AstLexicalRead; import com.ibm.wala.cast.ir.ssa.AstLexicalWrite; import com.ibm.wala.cast.ir.ssa.AstPropertyRead; import com.ibm.wala.cast.ir.ssa.AstPropertyWrite; +import com.ibm.wala.cast.ir.ssa.AstYieldInstruction; import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation; import com.ibm.wala.cast.java.ssa.AstJavaInstructionFactory; @@ -660,6 +661,11 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return new AstLexicalWrite(iindex, definer, globalName, type, rhs); } + @Override + public AstYieldInstruction YieldInstruction(int iindex, int[] rvals) { + return new AstYieldInstruction(iindex, rvals); + } + @Override public AstPropertyRead PropertyRead(int iindex, int result, int objectRef, int memberRef) { assert false; diff --git a/com.ibm.wala.cast.js.rhino/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.js.rhino/.settings/org.eclipse.jdt.core.prefs index 8655daba1..7b0f37f66 100644 --- a/com.ibm.wala.cast.js.rhino/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.js.rhino/.settings/org.eclipse.jdt.core.prefs @@ -10,6 +10,7 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul org.eclipse.jdt.core.compiler.annotation.nullable.secondary= org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.8 diff --git a/com.ibm.wala.cast.js.test.data/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.js.test.data/.settings/org.eclipse.jdt.core.prefs index 35068d95f..0c68a61dc 100644 --- a/com.ibm.wala.cast.js.test.data/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.js.test.data/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,7 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.8 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 2305e4576..11ab09a92 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 @@ -28,6 +28,7 @@ import com.ibm.wala.cast.ir.ssa.AstLexicalRead; import com.ibm.wala.cast.ir.ssa.AstLexicalWrite; import com.ibm.wala.cast.ir.ssa.AstPropertyRead; import com.ibm.wala.cast.ir.ssa.AstPropertyWrite; +import com.ibm.wala.cast.ir.ssa.AstYieldInstruction; import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction; import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction; import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation; @@ -308,6 +309,11 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { return new AstEchoInstruction(iindex, rvals); } + @Override + public AstYieldInstruction YieldInstruction(int iindex, int[] rvals) { + return new AstYieldInstruction(iindex, rvals); + } + @Override public AstGlobalRead GlobalRead(int iindex, int lhs, FieldReference global) { return new AstGlobalRead(iindex, lhs, global); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConsumeInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConsumeInstruction.java new file mode 100644 index 000000000..9e7e96fd5 --- /dev/null +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConsumeInstruction.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package com.ibm.wala.cast.ir.ssa; + +import java.util.Collection; +import java.util.Collections; + +import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.debug.Assertions; + +public abstract class AstConsumeInstruction extends SSAInstruction { + protected final int[] rvals; + + public AstConsumeInstruction(int iindex, int[] rvals) { + super(iindex); + this.rvals = rvals; + } + + @Override + public int getNumberOfDefs() { + return 0; + } + + @Override + public int getDef(int i) { + Assertions.UNREACHABLE(); + return -1; + } + + @Override + public int getNumberOfUses() { + return rvals.length; + } + + @Override + public int getUse(int i) { + return rvals[i]; + } + + @Override + public int hashCode() { + int v = 1; + for (int rval : rvals) { + v *= rval; + } + + return v; + } + + @Override + public boolean isFallThrough() { + return true; + } + + @Override + public Collection getExceptionTypes() { + return Collections.emptySet(); + } + +} diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstEchoInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstEchoInstruction.java index e36e136e3..cd59b8413 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstEchoInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstEchoInstruction.java @@ -10,21 +10,14 @@ *******************************************************************************/ package com.ibm.wala.cast.ir.ssa; -import java.util.Collection; -import java.util.Collections; - 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.util.debug.Assertions; -public class AstEchoInstruction extends SSAInstruction { - private final int[] rvals; +public class AstEchoInstruction extends AstConsumeInstruction { public AstEchoInstruction(int iindex, int[] rvals) { - super(iindex); - this.rvals = rvals; + super(iindex, rvals); } @Override @@ -32,36 +25,6 @@ public class AstEchoInstruction extends SSAInstruction { return ((AstInstructionFactory)insts).EchoInstruction(iindex, uses==null? rvals: uses); } - @Override - public int getNumberOfDefs() { - return 0; - } - - @Override - public int getDef(int i) { - Assertions.UNREACHABLE(); - return -1; - } - - @Override - public int getNumberOfUses() { - return rvals.length; - } - - @Override - public int getUse(int i) { - return rvals[i]; - } - - @Override - public int hashCode() { - int v = 1; - for (int rval : rvals) { - v *= rval; - } - - return v; - } @Override public String toString(SymbolTable symbolTable) { @@ -78,14 +41,5 @@ public class AstEchoInstruction extends SSAInstruction { ((AstInstructionVisitor)v).visitEcho(this); } - @Override - public boolean isFallThrough() { - return true; - } - - @Override - public Collection getExceptionTypes() { - return Collections.emptySet(); - } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionFactory.java index d68c8034f..99687678e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionFactory.java @@ -55,4 +55,6 @@ public interface AstInstructionFactory extends SSAInstructionFactory { AstPropertyWrite PropertyWrite(int iindex, int objectRef, int memberRef, int value); + AstYieldInstruction YieldInstruction(int iindex, int[] rvals); + } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionVisitor.java index 9a5b2297b..8b5884d02 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstInstructionVisitor.java @@ -33,6 +33,8 @@ public interface AstInstructionVisitor extends SSAInstruction.IVisitor { default void visitEcho(AstEchoInstruction inst){ } + default void visitYield(AstYieldInstruction inst){ } + default void visitPropertyRead(AstPropertyRead instruction){ } default void visitPropertyWrite(AstPropertyWrite instruction){ } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstYieldInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstYieldInstruction.java new file mode 100644 index 000000000..4d20621ee --- /dev/null +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstYieldInstruction.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +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 class AstYieldInstruction extends AstConsumeInstruction { + + public AstYieldInstruction(int iindex, int[] rvals) { + super(iindex, rvals); + } + + @Override + public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { + return ((AstInstructionFactory)insts).EchoInstruction(iindex, uses==null? rvals: uses); + } + + + @Override + public String toString(SymbolTable symbolTable) { + StringBuffer result = new StringBuffer("echo/print "); + for (int rval : rvals) { + result.append(getValueString(symbolTable, rval)).append(" "); + } + + return result.toString(); + } + + @Override + public void visit(IVisitor v) { + ((AstInstructionVisitor)v).visitYield(this); + } + +} diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java index 9604c7326..af89e4d8c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java @@ -30,6 +30,7 @@ import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access; import com.ibm.wala.cast.ir.ssa.AstLexicalRead; import com.ibm.wala.cast.ir.ssa.AstLexicalWrite; +import com.ibm.wala.cast.ir.ssa.AstYieldInstruction; import com.ibm.wala.cast.ir.ssa.CAstBinaryOp; import com.ibm.wala.cast.ir.ssa.CAstUnaryOp; import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction; @@ -4705,6 +4706,27 @@ public abstract class AstTranslator extends CAstVisitor visitor) { + return false; + } + + @Override + protected void leaveYield(CAstNode n, WalkContext c, CAstVisitor visitor) { + WalkContext wc = c; + + int rvals[] = new int[n.getChildCount()]; + Position rposs[] = new Position[n.getChildCount()]; + for (int i = 0; i < n.getChildCount(); i++) { + rvals[i] = c.getValue(n.getChild(i)); + rposs[i] = c.getSourceMap().getPosition(n.getChild(i)); + } + + int currentInstruction = wc.cfg().getCurrentInstruction(); + wc.cfg().addInstruction(new AstYieldInstruction(currentInstruction, rvals)); + wc.cfg().noteOperands(currentInstruction, rposs); + } + public CAstEntity getIncludedEntity(CAstNode n) { if (n.getChild(0).getKind() == CAstNode.NAMED_ENTITY_REF) { assert namedEntityResolver != null; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ConstantFoldingRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ConstantFoldingRewriter.java index 323d7fdd5..9d0190523 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ConstantFoldingRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ConstantFoldingRewriter.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.ibm.wala.cast.ir.translator; +import java.util.Collection; import java.util.Map; import com.ibm.wala.cast.tree.CAst; @@ -71,11 +72,17 @@ public abstract class ConstantFoldingRewriter extends CAstBasicRewriter labels = cfg.getTargetLabels(root); + if (labels != null) { + for(Object label: labels) { + if (label instanceof CAstNode) { + copyNodes((CAstNode)label, cfg, context, nodeMap); + } + } } } + CAstNode copy = Ast.makeNode(root.getKind(), children); result = copy; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java index db8299797..c18231de4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java @@ -871,6 +871,17 @@ public abstract class CAstVisitor { break; } + case CAstNode.RETURN_WITHOUT_BRANCH: { + if (visitor.visitYield(n, context, visitor)) { + break; + } + for(int i = 0; i < n.getChildCount(); i++) { + visitor.visit(n.getChild(i), context, visitor); + } + visitor.leaveYield(n, context, visitor); + break; + } + default: { if (!visitor.doVisit(n, context, visitor)) { System.err.println(("looking at unhandled " + n + "(" + NT + ")" + " of " + n.getClass())); @@ -1269,6 +1280,19 @@ public abstract class CAstVisitor { * @param c a visitor-specific context */ protected void leaveReturn(CAstNode n, C c, CAstVisitor visitor) { visitor.leaveNode(n, c, visitor); } + /** + * Visit a Return node. + * @param n the node to process + * @param c a visitor-specific context + * @return true if no further processing is needed + */ + protected boolean visitYield(CAstNode n, C c, CAstVisitor visitor) { return visitor.visitNode(n, c, visitor); } + /** + * Leave a Return node. + * @param n the node to process + * @param c a visitor-specific context + */ + protected void leaveYield(CAstNode n, C c, CAstVisitor visitor) { visitor.leaveNode(n, c, visitor); } /** * Visit an Ifgoto node. * @param n the node to process diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTestUtil.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTestUtil.java index df188f89f..1027aa073 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTestUtil.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTestUtil.java @@ -42,6 +42,8 @@ public class CallGraphTestUtil { public static String REGRESSION_EXCLUSIONS = "Java60RegressionExclusions.txt"; + public static String REGRESSION_EXCLUSIONS_FOR_GUI = "Java60RegressionExclusionsForGUI.txt"; + /** * should we check the heap footprint before and after CG construction? */ diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ClassBasedInstanceKeys.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ClassBasedInstanceKeys.java index cad5a75f5..a456ef29c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ClassBasedInstanceKeys.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ClassBasedInstanceKeys.java @@ -49,6 +49,11 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { throw new IllegalArgumentException("allocation is null"); } + if (String.valueOf(allocation).contains("java/lang/invoke/DirectMethodHandle$StaticAccessor")) { + System.err.println("got " + allocation + " in " + node); + } + + if (options.getClassTargetSelector() == null) { throw new IllegalStateException("options did not specify class target selector"); } @@ -130,6 +135,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { public InstanceKey getInstanceKeyForMetadataObject(Object obj, TypeReference objType) { IClass cls = cha.lookupClass(objType); assert cls != null : objType; + if (obj instanceof TypeReference) { IClass klass = cha.lookupClass((TypeReference)obj); if (klass == null) { @@ -141,7 +147,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { } else if (obj instanceof MethodReference) { IMethod m = cha.resolveMethod((MethodReference)obj); if (m == null) { - return new ConcreteTypeKey(cls); + return new ConcreteTypeKey(cls); } else { return new ConstantKey<>(m, cls); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConstantKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConstantKey.java index 012fab54a..0b966ace0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConstantKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConstantKey.java @@ -53,7 +53,7 @@ public final class ConstantKey implements InstanceKey { if (value == null) return "[ConstantKey:null]"; else - return "[ConstantKey:" + value + ":" + value.getClass() + "]"; + return "[ConstantKey:" + value + ":" + valueClass.getReference() + "]"; } /* diff --git a/com.ibm.wala.dalvik.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.dalvik.test/.settings/org.eclipse.jdt.core.prefs index d74d22c9c..3b7b70163 100644 --- a/com.ibm.wala.dalvik.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.dalvik.test/.settings/org.eclipse.jdt.core.prefs @@ -9,10 +9,12 @@ org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullable.secondary= org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=error org.eclipse.jdt.core.compiler.problem.comparingIdentical=error org.eclipse.jdt.core.compiler.problem.deadCode=error @@ -21,6 +23,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=error org.eclipse.jdt.core.compiler.problem.emptyStatement=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=error org.eclipse.jdt.core.compiler.problem.fallthroughCase=error org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled diff --git a/com.ibm.wala.shrike/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.shrike/.settings/org.eclipse.jdt.core.prefs index 076e0ec20..c3c8aae81 100644 --- a/com.ibm.wala.shrike/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.shrike/.settings/org.eclipse.jdt.core.prefs @@ -19,6 +19,7 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul org.eclipse.jdt.core.compiler.annotation.nullable.secondary= org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.8