From 77b81b4181f3dd5801e31b978f33a8190381c9f4 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 30 Nov 2012 09:18:00 -0500 Subject: [PATCH 001/187] Handle duplicate field names between subclass and superclass. Patch from Christophe Foket on the mailing list. --- .../src/com/ibm/wala/classLoader/BytecodeClass.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index 548fc9b5b..0f943dc5a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -223,16 +223,21 @@ public abstract class BytecodeClass implements IClass { public IField getField(Atom name, TypeName type) { + boolean unresolved = false; try { // typically, there will be at most one field with the name IField field = getField(name); if (field != null && field.getFieldTypeReference().getName().equals(type)) { return field; } else { - return null; + unresolved = true; } } catch (IllegalStateException e) { assert e.getMessage().startsWith("multiple fields with"); + unresolved = true; + } + + if(unresolved){ // multiple fields. look through all of them and see if any have the appropriate type List fields = findDeclaredField(name); for (IField f : fields) { From 4a87d7b145ec249bb21cd59f4d04ceb98b763d65 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Oct 2012 17:31:28 -0700 Subject: [PATCH 002/187] compare FieldValueDispatch objects based on CGNode as well --- .../cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index afe58347e..3a319d711 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -521,6 +521,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph private JavaScriptInvoke getInstruction() { return instruction; } private InstanceKey getReceiver() { return receiverType; } private AbstractFieldPointerKey getProperty() { return fieldKey; } + private CGNode getNode() { return node; } @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable ptrs) { @@ -553,6 +554,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph @Override public boolean equals(Object o) { return o instanceof FieldValueDispatch && + ((FieldValueDispatch)o).getNode().equals(node) && ((FieldValueDispatch)o).getInstruction() == instruction && ((FieldValueDispatch)o).getProperty().equals(fieldKey) && ((FieldValueDispatch)o).getReceiver().equals(receiverType); From 5bcdb30014e98a8d10173c36033765865efd725f Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Oct 2012 10:19:52 -0700 Subject: [PATCH 003/187] add method to get a PointerKey for a global --- .../js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index 3a319d711..988e68dc8 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -171,6 +171,13 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph private final GlobalObjectKey globalObject = new GlobalObjectKey(cha.lookupClass(JavaScriptTypes.Object)); + public PointerKey getPointerKeyForGlobalVar(String varName) { + FieldReference fieldRef = FieldReference.findOrCreate(JavaScriptTypes.Root, Atom.findOrCreateUnicodeAtom(varName), + JavaScriptTypes.Root); + IField f = cha.resolveField(fieldRef); + assert f != null : "couldn't resolve " + varName; + return getPointerKeyForInstanceField(globalObject, f); + } protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new JSCallGraph(cha, options, getAnalysisCache()); } From 1bf2c64ba707868fa0f05241ffea1bd8289a581f Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 17 Dec 2012 16:52:31 -0800 Subject: [PATCH 004/187] add an array test that doesn't quite work --- .../examples-src/tests/array_index_conv.js | 4 +++- .../com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js index 898f50ce8..69ddbf3a0 100644 --- a/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js @@ -2,9 +2,11 @@ var a = []; a[0] = function reachable() { print("reachable"); }; a[1] = function also_reachable() { print("also reachable"); }; a[2] = function reachable_too() { print("reachable, too"); }; +a["3"] = function reachable3() { print("reachable3"); }; var o = { toString: function() { return 2; } }; a["0"](); a[1.0](); -a[o](); \ No newline at end of file +a[o](); +a[3](); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index b2df1de5c..0562b8256 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -19,6 +19,7 @@ import junit.framework.Assert; import org.junit.Test; +import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; @@ -582,7 +583,8 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { ROOT, new String[] { "tests/array_index_conv.js" } }, new Object[] { "tests/array_index_conv.js", new String[] { "suffix:reachable", "suffix:also_reachable", - "suffix:reachable_too" } } + "suffix:reachable_too", + "suffix:reachable3" } } }; @Test @@ -608,6 +610,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { verifyGraphAssertions(cg, assertionsForArrayIndexConv2); } + protected IVector>> computeIkIdToVns(PointerAnalysis pa) { // Created by reversing the points to mapping for local pointer keys. From dd98150ed812a5f9ad542bad7fb63892910ddbcf Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 17 Dec 2012 20:38:17 -0800 Subject: [PATCH 005/187] fix test to properly check reachability --- .../examples-src/tests/array_index_conv.js | 24 +++++++++++-------- .../js/test/TestSimpleCallGraphShape.java | 8 +++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js index 69ddbf3a0..365757587 100644 --- a/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js @@ -1,12 +1,16 @@ var a = []; -a[0] = function reachable() { print("reachable"); }; -a[1] = function also_reachable() { print("also reachable"); }; -a[2] = function reachable_too() { print("reachable, too"); }; -a["3"] = function reachable3() { print("reachable3"); }; - -var o = { toString: function() { return 2; } }; - +a[0] = function reachable1() { print("reachable"); }; a["0"](); -a[1.0](); -a[o](); -a[3](); \ No newline at end of file + +var b = []; +b[1] = function reachable2() { print("also reachable"); }; +b[1.0](); + +var c = []; +c[2] = function reachable3() { print("reachable, too"); }; +var o = { toString: function() { return 2; } }; +c[o](); + +var d = []; +d["3"] = function reachable4() { print("reachable4"); }; +d[3](); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 0562b8256..7c36d9e1d 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -581,10 +581,10 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { private static final Object[][] assertionsForArrayIndexConv = new Object[][] { new Object[] { ROOT, new String[] { "tests/array_index_conv.js" } }, - new Object[] { "tests/array_index_conv.js", new String[] { "suffix:reachable", - "suffix:also_reachable", - "suffix:reachable_too", - "suffix:reachable3" } } + new Object[] { "tests/array_index_conv.js", new String[] { "suffix:reachable1", + "suffix:reachable2", + "suffix:reachable3", + "suffix:reachable4" } } }; @Test From 6677587ff52dd3cc96b41d4a47feb0e79f928be1 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 18 Dec 2012 10:11:43 -0800 Subject: [PATCH 006/187] rewrite to make hardest test appear last --- .../examples-src/tests/array_index_conv.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js index 365757587..bccebaf87 100644 --- a/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/array_index_conv.js @@ -7,10 +7,10 @@ b[1] = function reachable2() { print("also reachable"); }; b[1.0](); var c = []; -c[2] = function reachable3() { print("reachable, too"); }; -var o = { toString: function() { return 2; } }; -c[o](); +c["2"] = function reachable3() { print("reachable, too"); }; +c[2](); var d = []; -d["3"] = function reachable4() { print("reachable4"); }; -d[3](); \ No newline at end of file +d[3] = function reachable4() { print("reachable4"); }; +var o = { toString: function() { return 3; } }; +d[o](); \ No newline at end of file From 6084f4ff61b08d9ba10ea3c99ddb2087931cad62 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 18 Dec 2012 10:11:59 -0800 Subject: [PATCH 007/187] Generate proper InstanceFieldKeys for property accesses with Numbers. Note that this change actually breaks a couple of our unit tests. But, it seems they were only passing by accident before anyway, and this change at least leads to a more consistent handling of dynamic property accesses with String vs. Number property names. --- .../cast/js/ipa/callgraph/JSCFABuilder.java | 25 ++++++++++ .../callgraph/DelegatingAstPointerKeys.java | 47 ++++++++++++++----- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java index 1bb36c229..b4c8d5151 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java @@ -19,11 +19,13 @@ import com.ibm.wala.classLoader.IField; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; +import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.collections.EmptyIterator; +import com.ibm.wala.util.strings.Atom; /** * Common utilities for CFA-style call graph builders. @@ -90,6 +92,29 @@ public abstract class JSCFABuilder extends JSSSAPropagationCallGraphBuilder { return super.getPointerKeysForReflectedFieldWrite(I, F); } } + + @Override + protected PointerKey getInstanceFieldPointerKeyForConstant(InstanceKey I, ConstantKey F) { + Object v = F.getValue(); + if (v instanceof Double) { + String strVal = simulateNumberToString((Double)v); + IField f = I.getConcreteType().getField(Atom.findOrCreateUnicodeAtom((String) strVal)); + return getPointerKeyForInstanceField(I, f); + + } else { + return super.getInstanceFieldPointerKeyForConstant(I, F); + } + } + + private String simulateNumberToString(Double v) { + // TODO this is very incomplete --MS + String result = v.toString(); + if (result.endsWith(".0")) { + result = result.substring(0, result.length() - 2); + } + return result; + } + }); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java index 7569f27a4..23c2abb60 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java @@ -14,11 +14,13 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IField; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey; +import com.ibm.wala.ipa.callgraph.propagation.InstanceFieldKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory; @@ -68,28 +70,49 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { List result = new LinkedList(); if (F instanceof ConstantKey) { - Object v = ((ConstantKey) F).getValue(); - if (v instanceof String) { - IField f = I.getConcreteType().getField(Atom.findOrCreateUnicodeAtom((String) v)); - result.add(getPointerKeyForInstanceField(I, f)); + PointerKey ifk = getInstanceFieldPointerKeyForConstant(I, (ConstantKey) F); + if (ifk != null) { + result.add(ifk); } } - result.add(ReflectedFieldPointerKey.mapped(new ConcreteTypeKey(F.getConcreteType()), I)); + result.add(ReflectedFieldPointerKey.mapped(new ConcreteTypeKey(getFieldNameType(F)), I)); return result.iterator(); } - public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { + /** + * get type for F appropriate for use in a field name. + * + * @param F + * @return + */ + protected IClass getFieldNameType(InstanceKey F) { + return F.getConcreteType(); + } + + /** + * if F is a supported constant representing a field, return the corresponding {@link InstanceFieldKey} for I. Otherwise, return null. + * @param F + * @return + */ + protected PointerKey getInstanceFieldPointerKeyForConstant(InstanceKey I, ConstantKey F) { + Object v = F.getValue(); // FIXME: current only constant string are handled + if (v instanceof String) { + IField f = I.getConcreteType().getField(Atom.findOrCreateUnicodeAtom((String) v)); + return getPointerKeyForInstanceField(I, f); + } + return null; + } + + public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { if (F instanceof ConstantKey) { - Object v = ((ConstantKey) F).getValue(); - if (v instanceof String) { - IField f = I.getConcreteType().getField(Atom.findOrCreateUnicodeAtom((String) v)); - return new NonNullSingletonIterator(getPointerKeyForInstanceField(I, f)); + PointerKey ifk = getInstanceFieldPointerKeyForConstant(I, (ConstantKey) F); + if (ifk != null) { + return new NonNullSingletonIterator(ifk); } } - - return new NonNullSingletonIterator(ReflectedFieldPointerKey.mapped(new ConcreteTypeKey(F.getConcreteType()), I)); + return new NonNullSingletonIterator(ReflectedFieldPointerKey.mapped(new ConcreteTypeKey(getFieldNameType(F)), I)); } } From 8ed998a2492cf21c93cb2429b809ea98d2ef2e5e Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 3 Jan 2013 15:57:38 -0800 Subject: [PATCH 008/187] extract some generally useful code from ModRef --- .../callgraph/CallGraphTransitiveClosure.java | 72 +++++++++++++++++++ .../src/com/ibm/wala/ipa/modref/ModRef.java | 58 +++++---------- 2 files changed, 91 insertions(+), 39 deletions(-) create mode 100644 com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/CallGraphTransitiveClosure.java diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/CallGraphTransitiveClosure.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/CallGraphTransitiveClosure.java new file mode 100644 index 000000000..bafe2cc79 --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/CallGraphTransitiveClosure.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2007 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.ipa.callgraph; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; + +import com.ibm.wala.dataflow.graph.BitVectorSolver; +import com.ibm.wala.fixpoint.BitVectorVariable; +import com.ibm.wala.ipa.modref.GenReach; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.CancelRuntimeException; +import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.functions.Function; +import com.ibm.wala.util.graph.impl.GraphInverter; +import com.ibm.wala.util.intset.OrdinalSet; + +/** + * Utility class for computing an analysis result for call graph nodes and their + * transitive callees, given the results for individual nodes. + * + */ +public class CallGraphTransitiveClosure { + + + /** + * Compute the transitive closure of an analysis result over all callees. + * + * @param cg the call graph + * @param nodeResults analysis result for each individual node + * @return a map from each node to the analysis result for the node and its transitive callees + */ + public static Map> transitiveClosure(CallGraph cg, Map> nodeResults) { + try { + // invert the call graph, to compute the bottom-up result + GenReach gr = new GenReach(GraphInverter.invert(cg), nodeResults); + BitVectorSolver solver = new BitVectorSolver(gr); + solver.solve(null); + Map> result = HashMapFactory.make(); + for (Iterator it = cg.iterator(); it.hasNext();) { + CGNode n = it.next(); + BitVectorVariable bv = solver.getOut(n); + result.put(n, new OrdinalSet(bv.getValue(), gr.getLatticeValues())); + } + return result; + } catch (CancelException e) { + throw new CancelRuntimeException(e); + } + } + + /** + * Collect analysis result for each {@link CGNode} in a {@link Map}. + */ + public static Map> collectNodeResults(CallGraph cg, Function> nodeResultComputer) { + Map> result = HashMapFactory.make(); + for (Iterator it = cg.iterator(); it.hasNext();) { + CGNode n = it.next(); + result.put(n, nodeResultComputer.apply(n)); + } + return result; + + } +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java index 180bd0760..f20c98037 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java @@ -17,10 +17,9 @@ import java.util.Set; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IField; -import com.ibm.wala.dataflow.graph.BitVectorSolver; -import com.ibm.wala.fixpoint.BitVectorVariable; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; @@ -33,11 +32,8 @@ import com.ibm.wala.ssa.SSAGetInstruction; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.ssa.SSANewInstruction; import com.ibm.wala.ssa.SSAPutInstruction; -import com.ibm.wala.util.CancelException; -import com.ibm.wala.util.CancelRuntimeException; -import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; -import com.ibm.wala.util.graph.impl.GraphInverter; +import com.ibm.wala.util.functions.Function; import com.ibm.wala.util.intset.OrdinalSet; /** @@ -66,7 +62,7 @@ public class ModRef { throw new IllegalArgumentException("cg is null"); } Map> scan = scanForMod(cg, pa, heapExclude); - return transitiveClosure(cg, scan); + return CallGraphTransitiveClosure.transitiveClosure(cg, scan); } /** @@ -80,7 +76,7 @@ public class ModRef { throw new IllegalArgumentException("cg is null"); } Map> scan = scanForRef(cg, pa, heapExclude); - return transitiveClosure(cg, scan); + return CallGraphTransitiveClosure.transitiveClosure(cg, scan); } /** @@ -99,36 +95,20 @@ public class ModRef { return computeRef(cg, pa, null); } - private Map> transitiveClosure(CallGraph cg, Map> scan) { - try { - GenReach gr = new GenReach(GraphInverter.invert(cg), scan); - BitVectorSolver solver = new BitVectorSolver(gr); - solver.solve(null); - Map> result = HashMapFactory.make(); - for (Iterator it = cg.iterator(); it.hasNext();) { - CGNode n = it.next(); - BitVectorVariable bv = solver.getOut(n); - result.put(n, new OrdinalSet(bv.getValue(), gr.getLatticeValues())); - } - return result; - } catch (CancelException e) { - throw new CancelRuntimeException(e); - } - } - /** * For each call graph node, what heap locations (as determined by a heap model) may it write, NOT including its * callees transitively * * @param heapExclude */ - private Map> scanForMod(CallGraph cg, PointerAnalysis pa, HeapExclusions heapExclude) { - Map> result = HashMapFactory.make(); - for (Iterator it = cg.iterator(); it.hasNext();) { - CGNode n = it.next(); - result.put(n, scanNodeForMod(n, pa, heapExclude)); - } - return result; + private Map> scanForMod(CallGraph cg, final PointerAnalysis pa, final HeapExclusions heapExclude) { + + return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>() { + + public Collection apply(CGNode n) { + return scanNodeForMod(n, pa, heapExclude); + } + }); } /** @@ -137,13 +117,13 @@ public class ModRef { * * @param heapExclude */ - private Map> scanForRef(CallGraph cg, PointerAnalysis pa, HeapExclusions heapExclude) { - Map> result = HashMapFactory.make(); - for (Iterator it = cg.iterator(); it.hasNext();) { - CGNode n = it.next(); - result.put(n, scanNodeForRef(n, pa, heapExclude)); - } - return result; + private Map> scanForRef(CallGraph cg, final PointerAnalysis pa, final HeapExclusions heapExclude) { + return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>() { + + public Collection apply(CGNode n) { + return scanNodeForRef(n, pa, heapExclude); + } + }); } /** From 26e7eb50ba58eb0d53809ec8dee66d50f08b3fe6 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 3 Jan 2013 15:58:07 -0800 Subject: [PATCH 009/187] Code to compute transitive lexical accesses of methods. The TransitiveLexicalAccesses class computes the lexical variables read by a CGNode and its transitive callees. Also, a basic test case. --- .../TestTransitiveLexicalAccessesRhino.java | 25 +++++ .../test/TestTransitiveLexicalAccesses.java | 52 +++++++++ com.ibm.wala.cast/META-INF/MANIFEST.MF | 1 + .../callgraph/ScopeMappingInstanceKeys.java | 2 +- .../lexical/TransitiveLexicalAccesses.java | 106 ++++++++++++++++++ 5 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java create mode 100644 com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java create mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java new file mode 100644 index 000000000..2a48726a7 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2008 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.js.test; + +import org.junit.Before; + +import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; + +public class TestTransitiveLexicalAccessesRhino extends TestTransitiveLexicalAccesses { + + @Before + public void setUp() { + com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); + } + + +} diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java new file mode 100644 index 000000000..17b9a1c26 --- /dev/null +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2008 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.js.test; + +import java.io.IOException; +import java.util.Map; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.ibm.wala.cast.ipa.lexical.TransitiveLexicalAccesses; +import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.intset.OrdinalSet; + +public abstract class TestTransitiveLexicalAccesses { + + @Test + public void testSimpleLexical() throws IOException, IllegalArgumentException, CancelException { + JSCFABuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "simple-lexical.js"); + CallGraph CG = b.makeCallGraph(b.getOptions()); + TransitiveLexicalAccesses lexAccesses = TransitiveLexicalAccesses.make(CG, b.getPointerAnalysis()); + Map>> result = lexAccesses.computeLexVarsRead(); + for (CGNode n : result.keySet()) { + if (n.toString().contains("Node: ")) { + // function "inner" reads exactly x and z + OrdinalSet> readVars = result.get(n); + Assert.assertEquals(2, readVars.size()); + Assert.assertEquals("[[Node: Context: Everywhere,x], [Node: Context: Everywhere,z]]", readVars.toString()); + } + if (n.toString().contains("Node: ")) { + // function "inner3" reads exactly innerName, inner3, and x and z via callees + OrdinalSet> readVars = result.get(n); + Assert.assertEquals(4, readVars.size()); + Assert.assertEquals("[[Node: Context: Everywhere,inner3], [Node: Context: Everywhere,innerName], [Node: Context: Everywhere,x], [Node: Context: Everywhere,z]]", readVars.toString()); + } + } + } + +} diff --git a/com.ibm.wala.cast/META-INF/MANIFEST.MF b/com.ibm.wala.cast/META-INF/MANIFEST.MF index 6872888ce..8456cb5c1 100644 --- a/com.ibm.wala.cast/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast/META-INF/MANIFEST.MF @@ -12,6 +12,7 @@ Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.analysis.typeInference, com.ibm.wala.cast.ipa.callgraph, com.ibm.wala.cast.ipa.cha, + com.ibm.wala.cast.ipa.lexical, com.ibm.wala.cast.ipa.modref, com.ibm.wala.cast.ir.cfg, com.ibm.wala.cast.ir.ssa, diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index 759321849..d35ab274e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -92,7 +92,7 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { * @param definer * @return */ - Iterator getFunargNodes(Pair name) { + public Iterator getFunargNodes(Pair name) { if (AstTranslator.NEW_LEXICAL) { Collection constructorCallers = getConstructorCallers(this, name); assert constructorCallers != null && !constructorCallers.isEmpty() : "no callers for constructor"; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java new file mode 100644 index 000000000..c064c9cda --- /dev/null +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * Copyright (c) 2008 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.ipa.lexical; + +import java.util.Collection; +import java.util.Map; + +import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey; +import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access; +import com.ibm.wala.cast.ir.ssa.AstLexicalRead; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.modref.ModRef; +import com.ibm.wala.ssa.IR; +import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.collections.Iterator2Iterable; +import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.functions.Function; +import com.ibm.wala.util.intset.OrdinalSet; + +/** + * Given a call graph / pointer analysis, determines the lexical variables + * accessed by each call graph node and its transitive callees. Essentially, a + * mod-ref analysis limited to lexical variables. + * + * TODO Share even more code with {@link ModRef}? + * + */ +public class TransitiveLexicalAccesses { + + public static TransitiveLexicalAccesses make(CallGraph cg, PointerAnalysis pa) { + return new TransitiveLexicalAccesses(cg, pa); + } + + + + private final CallGraph cg; + + private final PointerAnalysis pa; + + + + protected TransitiveLexicalAccesses(CallGraph cg, PointerAnalysis pa) { + this.cg = cg; + this.pa = pa; + } + + public Map>> computeLexVarsRead() { + Map>> scan = scanForLexReads(); + return CallGraphTransitiveClosure.transitiveClosure(cg, scan); + } + + private Map>> scanForLexReads() { + return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + + public Collection> apply(CGNode n) { + return scanNodeForLexReads(n); + } + }); + } + + protected Collection> scanNodeForLexReads(CGNode n) { + Collection> result = HashSetFactory.make(); + IR ir = n.getIR(); + if (ir != null) { + for (SSAInstruction instr: Iterator2Iterable.make(ir.iterateNormalInstructions())) { + if (instr instanceof AstLexicalRead) { + AstLexicalRead read = (AstLexicalRead) instr; + for (Access a : read.getAccesses()) { + Pair nameAndDefiner = a.getName(); + result.addAll(getNodeNamePairsForAccess(n, nameAndDefiner)); + } + } + } + } + return result; + } + + private Collection> getNodeNamePairsForAccess(CGNode n, Pair nameAndDefiner) { + Collection> result = HashSetFactory.make(); + // use scope-mapping instance keys in pointer analysis. may need a different + // scheme for CG construction not based on pointer analysis + OrdinalSet functionValues = pa.getPointsToSet(pa.getHeapModel().getPointerKeyForLocal(n, 1)); + for (InstanceKey ik : functionValues) { + if (ik instanceof ScopeMappingInstanceKey) { + ScopeMappingInstanceKey smik = (ScopeMappingInstanceKey) ik; + for (CGNode definerNode : Iterator2Iterable.make(smik.getFunargNodes(nameAndDefiner))) { + result.add(Pair.make(definerNode,nameAndDefiner.fst)); + } + } + } + return result; + } +} From 5aa3a1658718e29c9ce04df636f75c4edd01e43d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 3 Jan 2013 16:09:48 -0800 Subject: [PATCH 010/187] add support for lexical writes --- .../test/TestTransitiveLexicalAccesses.java | 14 +++++-- .../lexical/TransitiveLexicalAccesses.java | 38 +++++++++++++++---- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java index 17b9a1c26..ecb3ac147 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java @@ -32,17 +32,23 @@ public abstract class TestTransitiveLexicalAccesses { JSCFABuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "simple-lexical.js"); CallGraph CG = b.makeCallGraph(b.getOptions()); TransitiveLexicalAccesses lexAccesses = TransitiveLexicalAccesses.make(CG, b.getPointerAnalysis()); - Map>> result = lexAccesses.computeLexVarsRead(); - for (CGNode n : result.keySet()) { + Map>> readResult = lexAccesses.computeLexVarsRead(); + Map>> writeResult = lexAccesses.computeLexVarsWritten(); + for (CGNode n : readResult.keySet()) { if (n.toString().contains("Node: ")) { // function "inner" reads exactly x and z - OrdinalSet> readVars = result.get(n); + OrdinalSet> readVars = readResult.get(n); Assert.assertEquals(2, readVars.size()); Assert.assertEquals("[[Node: Context: Everywhere,x], [Node: Context: Everywhere,z]]", readVars.toString()); + // writes x and z as well + OrdinalSet> writtenVars = writeResult.get(n); + Assert.assertEquals(2, writtenVars.size()); + Assert.assertEquals("[[Node: Context: Everywhere,x], [Node: Context: Everywhere,z]]", writtenVars.toString()); + } if (n.toString().contains("Node: ")) { // function "inner3" reads exactly innerName, inner3, and x and z via callees - OrdinalSet> readVars = result.get(n); + OrdinalSet> readVars = readResult.get(n); Assert.assertEquals(4, readVars.size()); Assert.assertEquals("[[Node: Context: Everywhere,inner3], [Node: Context: Everywhere,innerName], [Node: Context: Everywhere,x], [Node: Context: Everywhere,z]]", readVars.toString()); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java index c064c9cda..6830f384c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java @@ -16,6 +16,7 @@ import java.util.Map; import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey; 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.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure; @@ -58,17 +59,23 @@ public class TransitiveLexicalAccesses { } public Map>> computeLexVarsRead() { - Map>> scan = scanForLexReads(); - return CallGraphTransitiveClosure.transitiveClosure(cg, scan); - } - - private Map>> scanForLexReads() { - return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { - + Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + public Collection> apply(CGNode n) { return scanNodeForLexReads(n); } }); + return CallGraphTransitiveClosure.transitiveClosure(cg, scan); + } + + public Map>> computeLexVarsWritten() { + Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + + public Collection> apply(CGNode n) { + return scanNodeForLexWrites(n); + } + }); + return CallGraphTransitiveClosure.transitiveClosure(cg, scan); } protected Collection> scanNodeForLexReads(CGNode n) { @@ -88,6 +95,23 @@ public class TransitiveLexicalAccesses { return result; } + protected Collection> scanNodeForLexWrites(CGNode n) { + Collection> result = HashSetFactory.make(); + IR ir = n.getIR(); + if (ir != null) { + for (SSAInstruction instr: Iterator2Iterable.make(ir.iterateNormalInstructions())) { + if (instr instanceof AstLexicalWrite) { + AstLexicalWrite write = (AstLexicalWrite) instr; + for (Access a : write.getAccesses()) { + Pair nameAndDefiner = a.getName(); + result.addAll(getNodeNamePairsForAccess(n, nameAndDefiner)); + } + } + } + } + return result; + } + private Collection> getNodeNamePairsForAccess(CGNode n, Pair nameAndDefiner) { Collection> result = HashSetFactory.make(); // use scope-mapping instance keys in pointer analysis. may need a different From bf6b6bd68512417d15ee946c3c626ac9f0332468 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 4 Jan 2013 09:35:04 -0800 Subject: [PATCH 011/187] renamed classes to make relationship to mod-ref analysis clearer --- ...Rhino.java => TestLexicalModRefRhino.java} | 2 +- ...alAccesses.java => TestLexicalModRef.java} | 10 +-- ...exicalAccesses.java => LexicalModRef.java} | 67 ++++++++++--------- 3 files changed, 41 insertions(+), 38 deletions(-) rename com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/{TestTransitiveLexicalAccessesRhino.java => TestLexicalModRefRhino.java} (90%) rename com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/{TestTransitiveLexicalAccesses.java => TestLexicalModRef.java} (91%) rename com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/{TransitiveLexicalAccesses.java => LexicalModRef.java} (71%) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRefRhino.java similarity index 90% rename from com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java rename to com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRefRhino.java index 2a48726a7..539a026e9 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccessesRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRefRhino.java @@ -14,7 +14,7 @@ import org.junit.Before; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; -public class TestTransitiveLexicalAccessesRhino extends TestTransitiveLexicalAccesses { +public class TestLexicalModRefRhino extends TestLexicalModRef { @Before public void setUp() { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java similarity index 91% rename from com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java rename to com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java index ecb3ac147..dd7903e2e 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestTransitiveLexicalAccesses.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java @@ -17,7 +17,7 @@ import junit.framework.Assert; import org.junit.Test; -import com.ibm.wala.cast.ipa.lexical.TransitiveLexicalAccesses; +import com.ibm.wala.cast.ipa.lexical.LexicalModRef; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; @@ -25,15 +25,15 @@ import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.intset.OrdinalSet; -public abstract class TestTransitiveLexicalAccesses { +public abstract class TestLexicalModRef { @Test public void testSimpleLexical() throws IOException, IllegalArgumentException, CancelException { JSCFABuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "simple-lexical.js"); CallGraph CG = b.makeCallGraph(b.getOptions()); - TransitiveLexicalAccesses lexAccesses = TransitiveLexicalAccesses.make(CG, b.getPointerAnalysis()); - Map>> readResult = lexAccesses.computeLexVarsRead(); - Map>> writeResult = lexAccesses.computeLexVarsWritten(); + LexicalModRef lexAccesses = LexicalModRef.make(CG, b.getPointerAnalysis()); + Map>> readResult = lexAccesses.computeLexicalRef(); + Map>> writeResult = lexAccesses.computeLexicalMod(); for (CGNode n : readResult.keySet()) { if (n.toString().contains("Node: ")) { // function "inner" reads exactly x and z diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java similarity index 71% rename from com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java rename to com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java index 6830f384c..dc02115a3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/TransitiveLexicalAccesses.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java @@ -22,7 +22,6 @@ import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; -import com.ibm.wala.ipa.modref.ModRef; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.util.collections.HashSetFactory; @@ -32,49 +31,53 @@ import com.ibm.wala.util.functions.Function; import com.ibm.wala.util.intset.OrdinalSet; /** - * Given a call graph / pointer analysis, determines the lexical variables - * accessed by each call graph node and its transitive callees. Essentially, a - * mod-ref analysis limited to lexical variables. - * - * TODO Share even more code with {@link ModRef}? + * Compute mod-ref information limited to accesses of lexical variables. * */ -public class TransitiveLexicalAccesses { +public class LexicalModRef { - public static TransitiveLexicalAccesses make(CallGraph cg, PointerAnalysis pa) { - return new TransitiveLexicalAccesses(cg, pa); + public static LexicalModRef make(CallGraph cg, PointerAnalysis pa) { + return new LexicalModRef(cg, pa); } - - private final CallGraph cg; - + private final PointerAnalysis pa; - - - - protected TransitiveLexicalAccesses(CallGraph cg, PointerAnalysis pa) { + + protected LexicalModRef(CallGraph cg, PointerAnalysis pa) { this.cg = cg; this.pa = pa; } - public Map>> computeLexVarsRead() { - Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { - - public Collection> apply(CGNode n) { - return scanNodeForLexReads(n); - } - }); + /** + * Compute the lexical variables possibly read by each {@link CGNode} and its + * transitive callees. A lexical variable is represented as a pair (C,N), + * where C is the defining {@link CGNode} and N is the {@link String} name. + */ + public Map>> computeLexicalRef() { + Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, + new Function>>() { + + public Collection> apply(CGNode n) { + return scanNodeForLexReads(n); + } + }); return CallGraphTransitiveClosure.transitiveClosure(cg, scan); } - public Map>> computeLexVarsWritten() { - Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + /** + * Compute the lexical variables possibly modified by each {@link CGNode} and + * its transitive callees. A lexical variable is represented as a pair (C,N), + * where C is the defining {@link CGNode} and N is the {@link String} name. + */ + public Map>> computeLexicalMod() { + Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, + new Function>>() { - public Collection> apply(CGNode n) { - return scanNodeForLexWrites(n); - } - }); + public Collection> apply(CGNode n) { + return scanNodeForLexWrites(n); + } + }); return CallGraphTransitiveClosure.transitiveClosure(cg, scan); } @@ -82,7 +85,7 @@ public class TransitiveLexicalAccesses { Collection> result = HashSetFactory.make(); IR ir = n.getIR(); if (ir != null) { - for (SSAInstruction instr: Iterator2Iterable.make(ir.iterateNormalInstructions())) { + for (SSAInstruction instr : Iterator2Iterable.make(ir.iterateNormalInstructions())) { if (instr instanceof AstLexicalRead) { AstLexicalRead read = (AstLexicalRead) instr; for (Access a : read.getAccesses()) { @@ -99,7 +102,7 @@ public class TransitiveLexicalAccesses { Collection> result = HashSetFactory.make(); IR ir = n.getIR(); if (ir != null) { - for (SSAInstruction instr: Iterator2Iterable.make(ir.iterateNormalInstructions())) { + for (SSAInstruction instr : Iterator2Iterable.make(ir.iterateNormalInstructions())) { if (instr instanceof AstLexicalWrite) { AstLexicalWrite write = (AstLexicalWrite) instr; for (Access a : write.getAccesses()) { @@ -121,7 +124,7 @@ public class TransitiveLexicalAccesses { if (ik instanceof ScopeMappingInstanceKey) { ScopeMappingInstanceKey smik = (ScopeMappingInstanceKey) ik; for (CGNode definerNode : Iterator2Iterable.make(smik.getFunargNodes(nameAndDefiner))) { - result.add(Pair.make(definerNode,nameAndDefiner.fst)); + result.add(Pair.make(definerNode, nameAndDefiner.fst)); } } } From 7cf0baeee3559f003df496339e59b6abd9646abf Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 4 Jan 2013 11:34:02 -0800 Subject: [PATCH 012/187] javadoc --- com.ibm.wala.util/src/com/ibm/wala/util/collections/Util.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Util.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Util.java index 44e84f413..9c0d3b557 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Util.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Util.java @@ -77,6 +77,9 @@ public class Util { return traceDump.toString(); } + /** + * Return those elements of c that are assignable to klass. + */ @SuppressWarnings("unchecked") public static Set filterByType(Iterable c, Class klass) { Set result = HashSetFactory.make(); From 730151956f599574fad8b22280a4c3c935c74c02 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 4 Jan 2013 12:00:26 -0800 Subject: [PATCH 013/187] organize imports --- .../extraction/CorrelatedPairExtractorFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index 98d44d66e..b52f97cd3 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -20,9 +20,8 @@ import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationSummary; import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; import com.ibm.wala.cast.tree.CAst; import com.ibm.wala.cast.tree.CAstEntity; -import com.ibm.wala.cast.tree.rewrite.CAstRewriter; -import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; +import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.cha.ClassHierarchyException; From 583ebd3ce4485bb1860524292678ae7d05aea2ad Mon Sep 17 00:00:00 2001 From: sjfink Date: Fri, 4 Jan 2013 13:30:44 -0800 Subject: [PATCH 014/187] publicize method makeClasspath(). deprecate quoteStringIfNeeded() --- .../src/com/ibm/wala/util/processes/JavaLauncher.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/processes/JavaLauncher.java b/com.ibm.wala.util/src/com/ibm/wala/util/processes/JavaLauncher.java index 4dc693e3f..716b60818 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/processes/JavaLauncher.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/processes/JavaLauncher.java @@ -230,7 +230,7 @@ public class JavaLauncher extends Launcher { if (libPath == null) { return null; } else { - return "-Djava.library.path=" + quoteStringIfNeeded(libPath); + return "-Djava.library.path=" + libPath.trim(); } } @@ -264,16 +264,16 @@ public class JavaLauncher extends Launcher { /** * Compute the classpath for the spawned process */ - private String makeClasspath() { + public String makeClasspath() { String cp = inheritClasspath ? System.getProperty("java.class.path") : ""; if (getXtraClassPath() == null || getXtraClassPath().isEmpty()) { - return quoteStringIfNeeded(cp); + return cp.trim(); } else { for (Iterator it = getXtraClassPath().iterator(); it.hasNext();) { cp += File.pathSeparatorChar; cp += (String) it.next(); } - return quoteStringIfNeeded(cp); + return cp.trim(); } } @@ -283,6 +283,7 @@ public class JavaLauncher extends Launcher { * are unsafe, so we have to escape the last backslash (if present and * unescaped), so it doesn't escape the closing quote. */ + @Deprecated public static String quoteStringIfNeeded(String s) { s = s.trim(); // s = s.replaceAll(" ", "\\\\ "); From 9aa474fdb1c5a7cf47553fb282460c4cd814c58a Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Mon, 7 Jan 2013 20:18:27 -0500 Subject: [PATCH 015/187] 1) added InstanceKey.getCreation sites and its implementations 2) fixes for issues with keys representing dynamic properties i) all properties are converted to strings, in an approximation of JS semantics 3) fix to handling of instance keys representing numbers in binary +; now it understands that adding constant keys of type Number requires adding a non-constant Number key to the lval --- .../js/translator/RhinoToAstTranslator.java | 2 +- .../js/test/TestSimpleCallGraphShape.java | 15 ++++++ .../ipa/callgraph/ForInContextSelector.java | 4 +- .../js/ipa/callgraph/GlobalObjectKey.java | 12 +++++ .../cast/js/ipa/callgraph/JSCFABuilder.java | 51 ++++++++++++------- .../JSSSAPropagationCallGraphBuilder.java | 10 ++-- .../cast/js/translator/JSAstTranslator.java | 7 ++- .../callgraph/DelegatingAstPointerKeys.java | 4 +- .../callgraph/ScopeMappingInstanceKeys.java | 13 +++++ .../callgraph/propagation/AllocationSite.java | 25 +++++++++ .../propagation/AllocationSiteInNode.java | 10 ++++ .../propagation/ConcreteTypeKey.java | 31 +++++++++++ .../callgraph/propagation/ConstantKey.java | 11 ++++ .../callgraph/propagation/InstanceKey.java | 8 +++ .../SmushedAllocationSiteInNode.java | 25 +++++++++ .../propagation/StringConstantCharArray.java | 11 ++++ 16 files changed, 213 insertions(+), 26 deletions(-) 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 f46bd1ca7..8722ee8b1 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 @@ -623,7 +623,7 @@ public class RhinoToAstTranslator { if (elt instanceof EmptyExpression) { index++; } else { - eltNodes.add(Ast.makeConstant(index++)); + eltNodes.add(Ast.makeConstant("" + (index++))); eltNodes.add(visit(elt, arg)); } } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 7c36d9e1d..138ce3d48 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -607,9 +607,24 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { PropagationCallGraphBuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "array_index_conv2.js"); b.setContextSelector(new ForInContextSelector(b.getContextSelector())); CallGraph cg = b.makeCallGraph(b.getOptions()); + //JSCallGraphUtil.AVOID_DUMP = false; + //JSCallGraphUtil.dumpCG(b.getPointerAnalysis(), cg); verifyGraphAssertions(cg, assertionsForArrayIndexConv2); } + private static final Object[][] assertionsForDateProperty = new Object[][] { + new Object[] { ROOT, new String[] { "tests/date-property.js" } }, + new Object[] { "tests/date-property.js", new String[] { "suffix:_fun" } } + }; + + @Test + public void testDateAsProperty() throws IllegalArgumentException, IOException, CancelException { + PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "date-property.js"); + CallGraph CG = B.makeCallGraph(B.getOptions()); + //JSCallGraphUtil.AVOID_DUMP = false; + //JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); + verifyGraphAssertions(CG, assertionsForDateProperty); + } protected IVector>> computeIkIdToVns(PointerAnalysis pa) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java index 31fa3d51f..eac171bee 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java @@ -338,16 +338,18 @@ public class ForInContextSelector implements ContextSelector { } } else if(receiver.length > index) { Frequency f = usesFirstArgAsPropertyName(callee); + /* if(f == Frequency.ALWAYS) { return new ForInContext(baseContext, simulateToString(caller.getClassHierarchy(), receiver[index])); } else if(f == Frequency.SOMETIMES) { + */ if(receiver[index] == null) { IClass undef = caller.getClassHierarchy().lookupClass(JavaScriptTypes.Undefined); return new ForInContext(baseContext, new ConcreteTypeKey(undef)); } else { return new ForInContext(baseContext, receiver[index]); } - } + //} } if (USE_CPA_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { return new SelectiveCPAContext(baseContext, receiver); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java index 316cac4ae..d4742301d 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java @@ -1,7 +1,14 @@ package com.ibm.wala.cast.js.ipa.callgraph; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.NewSiteReference; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.util.collections.EmptyIterator; +import com.ibm.wala.util.collections.Pair; /** * Represents the JavaScript global object. @@ -23,4 +30,9 @@ public class GlobalObjectKey implements InstanceKey { public String toString() { return "JS Global Object"; } + + @Override + public Iterator> getCreationSites(CallGraph CG) { + return EmptyIterator.instance(); + } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java index b4c8d5151..0224c774f 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.ipa.callgraph; import java.util.Iterator; import com.ibm.wala.cast.ipa.callgraph.AstCFAPointerKeys; +import com.ibm.wala.cast.ipa.callgraph.ReflectedFieldPointerKey; import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IField; @@ -69,12 +70,8 @@ public abstract class JSCFABuilder extends JSSSAPropagationCallGraphBuilder { @Override public Iterator getPointerKeysForReflectedFieldRead(InstanceKey I, InstanceKey F) { - IClassHierarchy cha = I.getConcreteType().getClassHierarchy(); - IClass function = cha.lookupClass(JavaScriptTypes.Function); if (isBogusKey(I)) { return EmptyIterator.instance(); - } else if (cha.isSubclassOf(F.getConcreteType(), function)) { - return super.getPointerKeysForReflectedFieldRead(I, new ConcreteTypeKey(function)); } else { return super.getPointerKeysForReflectedFieldRead(I, F); } @@ -82,12 +79,8 @@ public abstract class JSCFABuilder extends JSSSAPropagationCallGraphBuilder { @Override public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { - IClassHierarchy cha = I.getConcreteType().getClassHierarchy(); - IClass function = cha.lookupClass(JavaScriptTypes.Function); - if (isBogusKey(I)) { + if (isBogusKey(I)) { return EmptyIterator.instance(); - } else if (cha.isSubclassOf(F.getConcreteType(), function)) { - return super.getPointerKeysForReflectedFieldWrite(I, new ConcreteTypeKey(function)); } else { return super.getPointerKeysForReflectedFieldWrite(I, F); } @@ -96,23 +89,45 @@ public abstract class JSCFABuilder extends JSSSAPropagationCallGraphBuilder { @Override protected PointerKey getInstanceFieldPointerKeyForConstant(InstanceKey I, ConstantKey F) { Object v = F.getValue(); - if (v instanceof Double) { - String strVal = simulateNumberToString((Double)v); - IField f = I.getConcreteType().getField(Atom.findOrCreateUnicodeAtom((String) strVal)); + String strVal = simulateToStringForPropertyNames(v); + // if we know the string representation of the constant, use it... + if (strVal != null) { + IField f = I.getConcreteType().getField(Atom.findOrCreateUnicodeAtom(strVal)); return getPointerKeyForInstanceField(I, f); + // ...otherwise it is some unknown string } else { - return super.getInstanceFieldPointerKeyForConstant(I, F); + return ReflectedFieldPointerKey.mapped(new ConcreteTypeKey(getFieldNameType(F)), I); } } - private String simulateNumberToString(Double v) { + /** + * All values used as property names get implicitly converted to strings in JavaScript. + * @see com.ibm.wala.cast.ipa.callgraph.DelegatingAstPointerKeys#getFieldNameType(com.ibm.wala.ipa.callgraph.propagation.InstanceKey) + */ + protected IClass getFieldNameType(InstanceKey F) { + return F.getConcreteType().getClassHierarchy().lookupClass(JavaScriptTypes.String); + } + + private String simulateToStringForPropertyNames(Object v) { // TODO this is very incomplete --MS - String result = v.toString(); - if (result.endsWith(".0")) { - result = result.substring(0, result.length() - 2); + if (v instanceof String) { + return (String)v; + } else if (v instanceof Double) { + String result = v.toString(); + if (((double) Math.round((Double)v)) == ((Double)v).doubleValue()) { + result = Long.toString(Math.round((Double)v)); + } + return result; + } else if (v instanceof Boolean) { + if (((Boolean)v).booleanValue()) { + return "true"; + } else { + return "false"; + } + } else { + return null; } - return result; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index 988e68dc8..0b9aeee77 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -776,7 +776,11 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph if (l.isStringType(left.getConcreteType().getReference()) || l.isStringType(right.getConcreteType().getReference())) { return addKey(new ConcreteTypeKey(node.getClassHierarchy().lookupClass(l.getStringType()))); } else if (isNumberType(l, left.getConcreteType().getReference()) && isNumberType(l, right.getConcreteType().getReference())) { - return addKey(left) || addKey(right); + if (left instanceof ConstantKey && right instanceof ConstantKey) { + return addKey(new ConcreteTypeKey(node.getClassHierarchy().lookupClass(JavaScriptTypes.Number))); + } else { + return addKey(left) || addKey(right); + } } else { return false; } @@ -943,7 +947,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph // pass actual arguments to formals in the normal way for (int i = 0; i < Math.min(paramCount, argCount); i++) { - InstanceKey[] fn = new InstanceKey[] { getInstanceKeyForConstant(JavaScriptTypes.Number, i-num_pseudoargs) }; + InstanceKey[] fn = new InstanceKey[] { getInstanceKeyForConstant(JavaScriptTypes.String, ""+(i-num_pseudoargs)) }; PointerKey F = getTargetPointerKey(target, i); if (constParams != null && constParams[i] != null) { @@ -969,7 +973,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph if (paramCount < argCount) { if (av != -1) { for (int i = paramCount; i < argCount; i++) { - InstanceKey[] fn = new InstanceKey[] { getInstanceKeyForConstant(JavaScriptTypes.Number, i-num_pseudoargs) }; + InstanceKey[] fn = new InstanceKey[] { getInstanceKeyForConstant(JavaScriptTypes.String, ""+(i-num_pseudoargs)) }; if (constParams != null && constParams[i] != null && i >= num_pseudoargs) { targetVisitor.newFieldWrite(target, av, fn, constParams[i]); } else if(i >= num_pseudoargs) { 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 dc7ecf2ac..96f708ada 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 @@ -238,6 +238,10 @@ public class JSAstTranslator extends AstTranslator { String field = (String) elt.getValue(); if (isPrologueScript(context) && "__proto__".equals(field)) { context.cfg().addInstruction(((JSInstructionFactory) insts).SetPrototype(receiver, rval)); + return; + } + } + /* } else { context.currentScope().getConstantValue(field); SSAPutInstruction put = ((JSInstructionFactory) insts).PutInstruction(receiver, rval, field); @@ -249,8 +253,9 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addInstruction(put); } } else { + */ context.cfg().addInstruction(((JSInstructionFactory) insts).PropertyWrite(receiver, context.getValue(elt), rval)); - } + // } } private void doPrimitiveNew(WalkContext context, int resultVal, String typeName) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java index 23c2abb60..a31d5b7c1 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java @@ -66,7 +66,7 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { return base.getPointerKeyForArrayContents(I); } - public Iterator getPointerKeysForReflectedFieldRead(InstanceKey I, InstanceKey F) { + public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { List result = new LinkedList(); if (F instanceof ConstantKey) { @@ -106,7 +106,7 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { return null; } - public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { + public Iterator getPointerKeysForReflectedFieldRead(InstanceKey I, InstanceKey F) { if (F instanceof ConstantKey) { PointerKey ifk = getInstanceFieldPointerKeyForConstant(I, (ConstantKey) F); if (ifk != null) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index 759321849..e6d050ab0 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.classLoader.ProgramCounter; import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory; @@ -27,6 +28,8 @@ import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.collections.CompoundIterator; import com.ibm.wala.util.collections.EmptyIterator; +import com.ibm.wala.util.collections.Filter; +import com.ibm.wala.util.collections.FilterIterator; import com.ibm.wala.util.collections.NonNullSingletonIterator; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.intset.OrdinalSet; @@ -175,6 +178,16 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { public CGNode getCreator() { return creator; } + + public Iterator> getCreationSites(CallGraph CG) { + return new FilterIterator>( + base.getCreationSites(CG), + new Filter>() { + public boolean accepts(Pair o) { + return o.fst.equals(creator); + } + }); + } } public InstanceKey getInstanceKeyForAllocation(CGNode creatorNode, NewSiteReference allocationSite) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java index 967c1e561..d9e9a0f42 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java @@ -10,11 +10,19 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.propagation; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.Context; +import com.ibm.wala.util.collections.Filter; +import com.ibm.wala.util.collections.FilterIterator; +import com.ibm.wala.util.collections.MapIterator; +import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.functions.Function; /** * An {@link InstanceKey} which represents a {@link NewSiteReference} in some {@link IMethod}. Note that this differs from @@ -81,4 +89,21 @@ public class AllocationSite implements InstanceKey { return false; return true; } + + public Iterator> getCreationSites(CallGraph CG) { + return new MapIterator>( + new FilterIterator( + CG.getNodes(method.getReference()).iterator(), + new Filter() { + public boolean accepts(CGNode o) { + return o.getMethod().equals(method); + } + } + ), + new Function>() { + public Pair apply(CGNode object) { + return Pair.make(object, site); + } + }); + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java index 50ba623e0..d03bf247a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java @@ -10,9 +10,14 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.propagation; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.util.collections.NonNullSingletonIterator; +import com.ibm.wala.util.collections.Pair; /** * An {@link InstanceKey} which represents a {@link NewSiteReference} in some {@link CGNode}. @@ -42,4 +47,9 @@ public abstract class AllocationSiteInNode extends AbstractTypeInNode { public NewSiteReference getSite() { return site; } + + public Iterator> getCreationSites(CallGraph CG) { + return new NonNullSingletonIterator>(Pair.make(getNode(), getSite())); + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java index 8c41fad67..f55e77299 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java @@ -14,11 +14,20 @@ import java.util.Collection; import java.util.Iterator; import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.NewSiteReference; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.collections.ComposedIterator; +import com.ibm.wala.util.collections.Filter; +import com.ibm.wala.util.collections.FilterIterator; +import com.ibm.wala.util.collections.MapIterator; +import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.debug.Assertions; +import com.ibm.wala.util.functions.Function; /** * An instance key which represents a unique set for each concrete type @@ -92,4 +101,26 @@ public final class ConcreteTypeKey implements InstanceKey { } return result; } + + public Iterator> getCreationSites(CallGraph CG) { + return new ComposedIterator>(CG.iterator()) { + @Override + public Iterator> makeInner(final CGNode outer) { + return new MapIterator>( + new FilterIterator( + outer.iterateNewSites(), + new Filter() { + public boolean accepts(NewSiteReference o) { + return o.getDeclaredType().equals(type.getReference()); + } + } + ), + new Function>() { + public Pair apply(NewSiteReference object) { + return Pair.make(outer, object); + } + }); + } + }; + } } \ No newline at end of file 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 a43232220..53e46eca9 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 @@ -10,7 +10,14 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.propagation; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.NewSiteReference; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.util.collections.EmptyIterator; +import com.ibm.wala.util.collections.Pair; /** * An instance key which represents a unique, constant object @@ -58,4 +65,8 @@ public final class ConstantKey implements InstanceKey { public T getValue() { return value; } + + public Iterator> getCreationSites(CallGraph CG) { + return EmptyIterator.instance(); + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java index 082765f60..934ae667b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java @@ -10,8 +10,14 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.propagation; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.NewSiteReference; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.ContextItem; +import com.ibm.wala.util.collections.Pair; /** * An InstanceKey serves as the representative for an equivalence class of @@ -32,5 +38,7 @@ public interface InstanceKey extends ContextItem { */ IClass getConcreteType(); + Iterator> getCreationSites(CallGraph CG); + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java index 1627d95a4..83c6d5ec8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java @@ -10,8 +10,17 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.propagation; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.util.collections.Filter; +import com.ibm.wala.util.collections.FilterIterator; +import com.ibm.wala.util.collections.MapIterator; +import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.functions.Function; /** * An {@link InstanceKey} which represents the set of all allocation sites @@ -44,4 +53,20 @@ public class SmushedAllocationSiteInNode extends AbstractTypeInNode { public String toString() { return "SMUSHED " + getNode() + " : " + getConcreteType(); } + + public Iterator> getCreationSites(CallGraph CG) { + return new MapIterator>( + new FilterIterator( + getNode().iterateNewSites(), + new Filter() { + public boolean accepts(NewSiteReference o) { + return o.getDeclaredType().equals(getConcreteType().getReference()); + } + }), + new Function>() { + public Pair apply(NewSiteReference object) { + return Pair.make(getNode(), object); + } + }); + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java index 700da32de..c153b792d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java @@ -10,8 +10,15 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.propagation; +import java.util.Iterator; + import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.NewSiteReference; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.collections.EmptyIterator; +import com.ibm.wala.util.collections.Pair; /** * An {@link InstanceKey} which represents the constant char[] contents @@ -65,4 +72,8 @@ public class StringConstantCharArray implements InstanceKey { public String toString() { return "StringConstantCharArray:" + constant; } + + public Iterator> getCreationSites(CallGraph CG) { + return EmptyIterator.instance(); + } } From 309fb3368995ab9fff3e19cf70e6afe5c9d0695a Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Tue, 8 Jan 2013 20:38:32 -0500 Subject: [PATCH 016/187] added date-property.js --- .../examples-src/tests/date-property.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/date-property.js diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/date-property.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/date-property.js new file mode 100644 index 000000000..7c41f6661 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/date-property.js @@ -0,0 +1,13 @@ +var t = "this is a long string"; + +var bar = t.substring(0, 10); + +var d = new Date("October 13, 1975 11:13:00"); + +var document = { + fun: function _fun(x) { + return x; + } +}; + +document[d](bar); From 202d5d525f84a84cbb72ce7906ac9e70d1630ccc Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 9 Jan 2013 14:25:41 -0800 Subject: [PATCH 017/187] small Javadoc fix --- .../src/com/ibm/wala/util/config/AnalysisScopeReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java b/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java index 5b86cd05a..1de2a1cb4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java @@ -145,7 +145,7 @@ public class AnalysisScopeReader { /** - * @param classPath class path to analyze, delimited by File.pathSeparator + * @param classPath class path to analyze, delimited by {@link File#pathSeparator} * @param exclusionsFile file holding class hierarchy exclusions. may be null * @throws IOException * @throws IllegalStateException if there are problems reading wala properties From 6465edbaee1ef8c0416b84d3d2f0baed1fde5885 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 9 Jan 2013 14:30:56 -0800 Subject: [PATCH 018/187] test fix --- .../com/ibm/wala/cast/js/test/TestLexicalModRef.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java index dd7903e2e..71235ef30 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java @@ -50,7 +50,7 @@ public abstract class TestLexicalModRef { // function "inner3" reads exactly innerName, inner3, and x and z via callees OrdinalSet> readVars = readResult.get(n); Assert.assertEquals(4, readVars.size()); - Assert.assertEquals("[[Node: Context: Everywhere,inner3], [Node: Context: Everywhere,innerName], [Node: Context: Everywhere,x], [Node: Context: Everywhere,z]]", readVars.toString()); + Assert.assertEquals("[[Node: Context: Everywhere,x], [Node: Context: Everywhere,inner3], [Node: Context: Everywhere,innerName], [Node: Context: Everywhere,z]]", readVars.toString()); } } } From 6ed7b5a88e14c2ff3404547cc3350533cddbef58 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 10 Jan 2013 09:48:38 -0800 Subject: [PATCH 019/187] javadoc --- .../wala/ipa/callgraph/propagation/InstanceKey.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java index 934ae667b..772dd501c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceKey.java @@ -38,7 +38,14 @@ public interface InstanceKey extends ContextItem { */ IClass getConcreteType(); - Iterator> getCreationSites(CallGraph CG); - -} + /** + * Get the creation sites of this, i.e., the statements that may + * allocate objects represented by this. A creation site is a + * pair (n,s), where n is the containing {@link CGNode} in the given + * {@link CallGraph} CG and s is the allocating + * {@link NewSiteReference}. + * + */ + Iterator> getCreationSites(CallGraph CG); +} From ba228963bf6b72590679967d79cc729b6ab0c4f0 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 21 Jan 2013 15:27:13 -0800 Subject: [PATCH 020/187] better handling of missing bytecodes In some cases, class files will have non-abstract methods with no bytecodes (e.g., stubs for compilation purposes). While such a class file is invalid, we want to enable clients to handle such an error. With these changes, Shrike will throw an InvalidClassFileException for such cases, and WALA's IR construction code will throw a WalaRuntimeException. --- .../classes/CodeDeleted.class | Bin 0 -> 216 bytes .../wala/core/tests/cha/CodeDeletedTest.java | 57 ++++++++++++++++++ .../ibm/wala/classLoader/ShrikeBTMethod.java | 2 +- .../ibm/wala/classLoader/ShrikeIRFactory.java | 5 +- .../ibm/wala/util/WalaRuntimeException.java | 32 ++++++++++ 5 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 com.ibm.wala.core.testdata/classes/CodeDeleted.class create mode 100644 com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/CodeDeletedTest.java create mode 100644 com.ibm.wala.util/src/com/ibm/wala/util/WalaRuntimeException.java diff --git a/com.ibm.wala.core.testdata/classes/CodeDeleted.class b/com.ibm.wala.core.testdata/classes/CodeDeleted.class new file mode 100644 index 0000000000000000000000000000000000000000..56c4ceba52daf85b273fef4efc4a38e2d73e5f79 GIT binary patch literal 216 zcmYjLI}U>uznk02xjyqA@Ug$M9Z#(h+7F|#`} zo88a%^#(9U=)pwbqUWMda2Bdi^^#zYCuf4SDpN@acdC&4<`&E9B;uSE^HP>=XiM;p zWm6?`qqH&58*7=%TBfs1+(iHjHo^bXIi;N_7sWL?#F { try { shrikeInstructions = method.getInstructions(); } catch (InvalidClassFileException e) { - e.printStackTrace(); - Assertions.UNREACHABLE(); + throw new WalaRuntimeException("bad method bytecodes", e); } final ShrikeCFG shrikeCFG = (ShrikeCFG) makeCFG(method, C); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/WalaRuntimeException.java b/com.ibm.wala.util/src/com/ibm/wala/util/WalaRuntimeException.java new file mode 100644 index 000000000..639460f11 --- /dev/null +++ b/com.ibm.wala.util/src/com/ibm/wala/util/WalaRuntimeException.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2008 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.util; + +/** + * Runtime exception for some WALA failure. + * + */ +public class WalaRuntimeException extends RuntimeException { + + /** + * @param s a message describing the failure + */ + public WalaRuntimeException(String s, Throwable cause) { + super(s, cause); + } + /** + * @param string a message describing the failure + */ + public WalaRuntimeException(String string) { + super(string); + } + +} From 1d06b2f764832d5e1707b7949cbbe6e2c18d12e5 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 22 Jan 2013 15:42:04 -0800 Subject: [PATCH 021/187] organize imports --- .../com/ibm/wala/cast/js/translator/JSAstTranslator.java | 3 --- 1 file changed, 3 deletions(-) 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 96f708ada..df6402b9d 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 @@ -10,8 +10,6 @@ *****************************************************************************/ package com.ibm.wala.cast.js.translator; -import java.io.UTFDataFormatException; - import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.js.loader.JSCallSiteReference; import com.ibm.wala.cast.js.loader.JavaScriptLoader; @@ -29,7 +27,6 @@ import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.classLoader.NewSiteReference; -import com.ibm.wala.ssa.SSAPutInstruction; import com.ibm.wala.ssa.SymbolTable; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.MethodReference; From ec8a0f12941acdb4bbbb8918430238cc22ae663d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 25 Jan 2013 10:29:49 -0800 Subject: [PATCH 022/187] Properly return null as default constructor of an array. Patch from Christophe Foket on the mailing list. --- .../analysis/reflection/ClassNewInstanceContextInterpreter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java index e972c9d66..ddfce7790 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java @@ -145,7 +145,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp private IMethod getPublicDefaultCtor(IClass klass) { IMethod ctorMethod = klass.getMethod(defCtorSelector); - if (ctorMethod != null && ctorMethod.isPublic()) { + if (ctorMethod != null && ctorMethod.isPublic() && ctorMethod.getDeclaringClass() == klass) { return ctorMethod; } return null; From 72f85ba2a9fae1257c78ad55cdf0f01794d282c7 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 25 Jan 2013 10:41:11 -0800 Subject: [PATCH 023/187] add a simple driver for building a call graph via a scope file --- .../examples/drivers/ScopeFileCallGraph.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java new file mode 100644 index 000000000..224f2e0e7 --- /dev/null +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2008 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.examples.drivers; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Properties; + +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ipa.callgraph.AnalysisCache; +import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.callgraph.AnalysisScope; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.CallGraphBuilder; +import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException; +import com.ibm.wala.ipa.callgraph.CallGraphStats; +import com.ibm.wala.ipa.callgraph.Entrypoint; +import com.ibm.wala.ipa.callgraph.impl.DefaultEntrypoint; +import com.ibm.wala.ipa.callgraph.impl.Util; +import com.ibm.wala.ipa.cha.ClassHierarchy; +import com.ibm.wala.ipa.cha.ClassHierarchyException; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.types.ClassLoaderReference; +import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.config.AnalysisScopeReader; +import com.ibm.wala.util.io.CommandLine; +import com.ibm.wala.util.strings.StringStuff; +import com.ibm.wala.util.warnings.Warnings; + +/** + * Driver that constructs a call graph for an application specified via a scope file. + * Useful for getting some code to copy-paste. + */ +public class ScopeFileCallGraph { + + /** + * Usage: ScopeFileCallGraph -scopeFile file_path [-entryClass class_name | + * -mainClass class_name] + * + * If given -mainClass, uses main() method of class_name as entrypoint. If + * given -entryClass, uses all public methods of class_name. + * + * @throws IOException + * @throws ClassHierarchyException + * @throws CallGraphBuilderCancelException + * @throws IllegalArgumentException + */ + public static void main(String[] args) throws IOException, ClassHierarchyException, IllegalArgumentException, + CallGraphBuilderCancelException { + Properties p = CommandLine.parse(args); + String scopeFile = p.getProperty("scopeFile"); + String entryClass = p.getProperty("entryClass"); + String mainClass = p.getProperty("mainClass"); + if (mainClass != null && entryClass != null) { + throw new IllegalArgumentException("only specify one of mainClass or entryClass"); + } + // use exclusions to eliminate certain library packages + File exclusionsFile = null; + AnalysisScope scope = AnalysisScopeReader.readJavaScope(scopeFile, exclusionsFile, ScopeFileCallGraph.class.getClassLoader()); + IClassHierarchy cha = ClassHierarchy.make(scope); + System.out.println(cha.getNumberOfClasses() + " classes"); + System.out.println(Warnings.asString()); + Warnings.clear(); + AnalysisOptions options = new AnalysisOptions(); + Iterable entrypoints = entryClass != null ? makePublicEntrypoints(scope, cha, entryClass) : Util.makeMainEntrypoints(scope, cha, mainClass); + options.setEntrypoints(entrypoints); + // you can dial down reflection handling if you like + // options.setReflectionOptions(ReflectionOptions.NONE); + AnalysisCache cache = new AnalysisCache(); + // other builders can be constructed with different Util methods + CallGraphBuilder builder = Util.makeZeroOneContainerCFABuilder(options, cache, cha, scope); + System.out.println("building call graph..."); + CallGraph cg = builder.makeCallGraph(options, null); + System.out.println("done"); + System.out.println(CallGraphStats.getStats(cg)); + } + + private static Iterable makePublicEntrypoints(AnalysisScope scope, IClassHierarchy cha, String entryClass) { + Collection result = new ArrayList(); + IClass klass = cha.lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, + StringStuff.deployment2CanonicalTypeString(entryClass))); + for (IMethod m : klass.getDeclaredMethods()) { + if (m.isPublic()) { + result.add(new DefaultEntrypoint(m, cha)); + } + } + return result; + } +} From 182363bf88b94eee07db3b33e4bd9068932b881f Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 30 Jan 2013 17:29:41 -0800 Subject: [PATCH 024/187] fix bug involving paths with spaces --- .../src/com/ibm/wala/util/io/FileProviderTest.java | 9 +++++++++ .../src/com/ibm/wala/util/io/FileProvider.java | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java index 6e8e88772..79c048228 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java @@ -34,5 +34,14 @@ public class FileProviderTest { assertEquals(expected, actual); } + @Test + public void testURLWithSpace() throws MalformedURLException { + URL url = new URL("file:///With%20Space/File.jar"); + String expected = PlatformUtil.onWindows() ? "/C:/With Space/File.jar" : "/With Space/File.jar"; + // exercise: + String actual = (new FileProvider()).filePathFromURL(url); + // verify: + assertEquals(expected, actual); + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java index b3bfab949..45f307b30 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java @@ -14,9 +14,11 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.JarURLConnection; import java.net.URI; import java.net.URL; +import java.net.URLDecoder; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipException; @@ -24,6 +26,7 @@ import java.util.zip.ZipException; import com.ibm.wala.classLoader.JarFileModule; import com.ibm.wala.classLoader.Module; import com.ibm.wala.classLoader.NestedJarFileModule; +import com.ibm.wala.util.debug.Assertions; /** * This class provides files that are packaged with this plug-in @@ -182,8 +185,13 @@ public class FileProvider { // This solution works. See discussion at // http://stackoverflow.com/questions/4494063/how-to-avoid-java-net-urisyntaxexception-in-url-touri URI uri = new File(url.getPath()).toURI(); - String filePath = uri.getPath(); - return filePath; + try { + return URLDecoder.decode(uri.getPath(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + // this really shouldn't happen + Assertions.UNREACHABLE(); + return null; + } } } From 590347f171ef8e2d7aa385a5b287328c902a2477 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 30 Jan 2013 21:05:23 -0800 Subject: [PATCH 025/187] Properly fix path-with-spaces bug. The previous fix happened to work, but it did the URL decoding in the wrong place. --- com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java index 45f307b30..2aa3dd35b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java @@ -184,9 +184,10 @@ public class FileProvider { // http://www.faqs.org/rfcs/rfc2396.html Section 2.4.3 // This solution works. See discussion at // http://stackoverflow.com/questions/4494063/how-to-avoid-java-net-urisyntaxexception-in-url-touri - URI uri = new File(url.getPath()).toURI(); + // we assume url has been properly encoded, so we decode it try { - return URLDecoder.decode(uri.getPath(), "UTF-8"); + URI uri = new File(URLDecoder.decode(url.getPath(), "UTF-8")).toURI(); + return uri.getPath(); } catch (UnsupportedEncodingException e) { // this really shouldn't happen Assertions.UNREACHABLE(); From afccdd2189f5239cf676e41aa947c503c3b4c6bc Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Sat, 2 Feb 2013 21:27:45 -0500 Subject: [PATCH 026/187] Annotation support --- .../polyglot/PolyglotJava2CAstTranslator.java | 21 +++ .../src/javaonepointfive/Annotations.java | 1 + .../com/ibm/wala/cast/java/test/IRTests.java | 58 ++++++++ .../java/loader/JavaSourceLoaderImpl.java | 69 +++++++-- .../js/translator/RhinoToAstTranslator.java | 5 + .../extraction/ExtractedFunction.java | 6 + .../wala/cast/js/loader/JavaScriptLoader.java | 18 ++- .../cast/ir/translator/AbstractEntity.java | 6 + .../cast/loader/AstDynamicPropertyClass.java | 7 + .../com/ibm/wala/cast/loader/AstField.java | 11 +- .../com/ibm/wala/cast/loader/AstMethod.java | 12 +- .../ibm/wala/cast/tree/CAstAnnotation.java | 11 ++ .../com/ibm/wala/cast/tree/CAstEntity.java | 6 + .../wala/cast/tree/impl/DelegatingEntity.java | 5 + .../com/ibm/wala/classLoader/ArrayClass.java | 5 + .../src/com/ibm/wala/classLoader/IClass.java | 6 + .../src/com/ibm/wala/classLoader/IMember.java | 8 ++ .../ibm/wala/classLoader/ShrikeCTMethod.java | 11 ++ .../com/ibm/wala/classLoader/ShrikeClass.java | 12 ++ .../ibm/wala/classLoader/SyntheticClass.java | 9 ++ .../ibm/wala/classLoader/SyntheticMethod.java | 8 ++ .../ibm/wala/demandpa/util/ArrayContents.java | 8 ++ .../ipa/callgraph/impl/FakeRootClass.java | 5 + .../ipa/summaries/BypassSyntheticClass.java | 6 + .../jdt/JDTJava2CAstTranslator.java | 135 ++++++++++++++---- .../jdt/JDTSourceModuleTranslator.java | 6 +- 26 files changed, 410 insertions(+), 45 deletions(-) create mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java 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 a12e648a7..c72bd5e54 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 @@ -124,6 +124,7 @@ import com.ibm.wala.cast.java.loader.Util; import com.ibm.wala.cast.java.translator.JavaProcedureEntity; import com.ibm.wala.cast.java.types.JavaType; import com.ibm.wala.cast.tree.CAst; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstControlFlowMap; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; @@ -1399,6 +1400,11 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override + public Collection getAnnotations() { + return null; + } + public CAstControlFlowMap getControlFlow() { Assertions.UNREACHABLE("CompilationUnitEntity.getControlFlow()"); return null; @@ -1578,6 +1584,11 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override + public Collection getAnnotations() { + return null; + } + public Map> getAllScopedEntities() { return Collections.singletonMap(null, fEntities); } @@ -1805,6 +1816,11 @@ public class PolyglotJava2CAstTranslator { } }; } + + @Override + public Collection getAnnotations() { + return null; + } } protected final class FieldEntity implements CAstEntity { @@ -1856,6 +1872,11 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override + public Collection getAnnotations() { + return null; + } + public CAstControlFlowMap getControlFlow() { // No AST for a field decl; initializers folded into // constructor processing... diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java index cf93e4364..cedbde22e 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java @@ -6,6 +6,7 @@ package javaonepointfive; String date(); } +@TestAnnotation (doSomething="The class", count=-1, date="09-09-2001") public class Annotations { @TestAnnotation (doSomething="What to do", count=1, date="09-09-2005") diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java index 903edf3b5..636d822db 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java @@ -49,6 +49,7 @@ import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; @@ -250,6 +251,63 @@ public abstract class IRTests { } } + protected static class AnnotationAssertions implements IRAssertion { + + public static class ClassAnnotation { + private final String className; + private final String annotationTypeName; + + public ClassAnnotation(String className, String annotationTypeName) { + super(); + this.className = className; + this.annotationTypeName = annotationTypeName; + } + } + + public static class MethodAnnotation { + private final String methodSig; + private final String annotationTypeName; + + public MethodAnnotation(String methodSig, String annotationTypeName) { + super(); + this.methodSig = methodSig; + this.annotationTypeName = annotationTypeName; + } + } + + public final Set classAnnotations = HashSetFactory.make(); + public final Set methodAnnotations = HashSetFactory.make(); + + public void check(CallGraph cg) { + classes: for(ClassAnnotation ca : classAnnotations) { + IClass cls = cg.getClassHierarchy().lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, ca.className)); + IClass at = cg.getClassHierarchy().lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, ca.annotationTypeName)); + for(Annotation a : cls.getAnnotations()) { + if (a.getType().equals(at.getReference())) { + continue classes; + } + } + + Assert.assertFalse("cannot find " + at + " in " + cls, false); + } + + for(MethodAnnotation ma : methodAnnotations) { + IClass at = cg.getClassHierarchy().lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, ma.annotationTypeName)); + annot: for(CGNode n : cg) { + if (n.getMethod().getSignature().equals(ma.methodSig)) { + for(Annotation a : n.getMethod().getAnnotations()) { + if (a.getType().equals(at.getReference())) { + continue annot; + } + } + + Assert.assertFalse("cannot find " + at, false); + } + } + } + } + } + protected Collection singleTestSrc() { return Collections.singletonList(getTestSrcPath() + File.separator + singleJavaInputForTest()); } 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 7bb538dc6..cc449f972 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 @@ -42,6 +42,7 @@ import com.ibm.wala.cast.loader.AstClass; import com.ibm.wala.cast.loader.AstField; import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.DebuggingInformation; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstQualifier; import com.ibm.wala.cast.tree.CAstSourcePositionMap; @@ -61,6 +62,8 @@ import com.ibm.wala.classLoader.ModuleEntry; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.impl.SetOfClasses; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.shrikeCT.AnnotationsReader.ElementValue; +import com.ibm.wala.shrikeCT.AnnotationsReader.ConstantElementValue; import com.ibm.wala.shrikeCT.ClassConstants; import com.ibm.wala.ssa.SSAThrowInstruction; import com.ibm.wala.ssa.SymbolTable; @@ -71,7 +74,9 @@ import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.strings.Atom; @@ -92,11 +97,18 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { protected final Collection superTypeNames; + private final Collection annotations; + public JavaClass(String typeName, Collection superTypeNames, CAstSourcePositionMap.Position position, Collection qualifiers, - JavaSourceLoaderImpl loader, IClass enclosingClass) { + JavaSourceLoaderImpl loader, IClass enclosingClass, Collection annotations) { super(position, TypeName.string2TypeName(typeName), loader, (short) mapToInt(qualifiers), new HashMap(), new HashMap()); this.superTypeNames = superTypeNames; this.enclosingClass = enclosingClass; + this.annotations = annotations; + } + + public Collection getAnnotations() { + return annotations; } public IClassHierarchy getClassHierarchy() { @@ -157,7 +169,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } private void addField(CAstEntity fieldEntity) { - declaredFields.put(Util.fieldEntityToAtom(fieldEntity), new JavaField(fieldEntity, JavaSourceLoaderImpl.this, this)); + declaredFields.put(Util.fieldEntityToAtom(fieldEntity), new JavaField(fieldEntity, JavaSourceLoaderImpl.this, this, JavaSourceLoaderImpl.this.getAnnotations(fieldEntity))); } public IClass getEnclosingClass() { @@ -165,24 +177,53 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } public String toString() { - if (enclosingClass == null) { - return ""; - } else { - return ""; + StringBuffer sb = new StringBuffer(" getAnnotations(CAstEntity e) { + Collection annotations = e.getAnnotations(); + if (annotations == null || annotations.isEmpty()) { + return null; + } else { + Collection result = HashSetFactory.make(); + for(CAstAnnotation ca : annotations) { + TypeName walaTypeName = toWALATypeName(ca.getType()); + TypeReference ref = TypeReference.findOrCreate(getReference(), walaTypeName); + if (ca.getArguments() == null || ca.getArguments().isEmpty()) { + result.add(Annotation.make(ref)); + } else { + Map args = HashMapFactory.make(); + for(Map.Entry a : ca.getArguments().entrySet()) { + args.put(a.getKey(), new ConstantElementValue(a.getValue())); + } + result.add(Annotation.makeWithNamed(ref, args)); + } + } + return result; + } + } + /** * DOMO representation of a field on a Java type that resides in a source file * * @author rfuhrer */ private class JavaField extends AstField { - private JavaField(CAstEntity fieldEntity, IClassLoader loader, IClass declaringClass) { + private JavaField(CAstEntity fieldEntity, IClassLoader loader, IClass declaringClass, Collection annotations) { super(FieldReference.findOrCreate(declaringClass.getReference(), Atom.findOrCreateUnicodeAtom(fieldEntity.getName()), TypeReference.findOrCreate(loader.getReference(), TypeName.string2TypeName(fieldEntity.getType().getName()))), - fieldEntity.getQualifiers(), declaringClass, declaringClass.getClassHierarchy()); + fieldEntity.getQualifiers(), declaringClass, declaringClass.getClassHierarchy(), annotations); } } @@ -200,14 +241,14 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { public JavaEntityMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(owner, methodEntity.getQualifiers(), cfg, symtab, MethodReference.findOrCreate(owner.getReference(), Util - .methodEntityToSelector(methodEntity)), hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo); + .methodEntityToSelector(methodEntity)), hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo, JavaSourceLoaderImpl.this.getAnnotations(methodEntity)); this.parameterTypes = computeParameterTypes(methodEntity); this.exceptionTypes = computeExceptionTypes(methodEntity); } public JavaEntityMethod(CAstEntity methodEntity, IClass owner) { super(owner, methodEntity.getQualifiers(), MethodReference.findOrCreate(owner.getReference(), Util - .methodEntityToSelector(methodEntity))); + .methodEntityToSelector(methodEntity)), JavaSourceLoaderImpl.this.getAnnotations(methodEntity)); this.parameterTypes = computeParameterTypes(methodEntity); this.exceptionTypes = computeExceptionTypes(methodEntity); } @@ -449,14 +490,18 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { ((JavaClass) owner).addField(n); } + private TypeName toWALATypeName(CAstType type) { + return TypeName.string2TypeName(type.getName()); + } + public IClass defineType(CAstEntity type, String typeName, CAstEntity owner) { Collection superTypeNames = new ArrayList(); for (Iterator superTypes = type.getType().getSupertypes().iterator(); superTypes.hasNext();) { - superTypeNames.add(TypeName.string2TypeName(((CAstType) superTypes.next()).getName())); + superTypeNames.add(toWALATypeName(((CAstType) superTypes.next()))); } JavaClass javaClass = new JavaClass(typeName, superTypeNames, type.getPosition(), type.getQualifiers(), this, - (owner != null) ? (JavaClass) fTypeMap.get(owner) : (JavaClass) null); + (owner != null) ? (JavaClass) fTypeMap.get(owner) : (JavaClass) null, getAnnotations(type)); if (getParent().lookupClass(javaClass.getName()) != null) { return null; 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 8722ee8b1..b61fa350b 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 @@ -91,6 +91,7 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSSSAPropagationCallGraphBuilder; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.cast.tree.CAst; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstControlFlowMap; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; @@ -466,6 +467,10 @@ public class RhinoToAstTranslator { return null; } + public Collection getAnnotations() { + return null; + } + public Collection getQualifiers() { Assertions.UNREACHABLE("JuliansUnnamedCAstEntity$2.getQualifiers()"); return null; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ExtractedFunction.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ExtractedFunction.java index 4596f8b32..ce8e39cae 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ExtractedFunction.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ExtractedFunction.java @@ -17,6 +17,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstControlFlowMap; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; @@ -162,6 +163,11 @@ class ExtractedFunction implements CAstEntity { } @Override + public Collection getAnnotations() { + return null; + } + + @Override public String toString() { return ""; } 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 efd0d7378..e94fcda98 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 @@ -115,6 +115,7 @@ import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.strings.Atom; @@ -627,6 +628,11 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { public IClass getSuperclass() { return superClass; } + + @Override + public Collection getAnnotations() { + return Collections.emptySet(); + } } class JavaScriptRootClass extends AstDynamicPropertyClass { @@ -652,6 +658,11 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { public IClass getSuperclass() { return null; } + + @Override + public Collection getAnnotations() { + return Collections.emptySet(); + } } class JavaScriptCodeBody extends AstFunctionClass { @@ -676,6 +687,11 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { codeBody.translationContext = translationContext; return codeBody; } + + @Override + public Collection getAnnotations() { + return Collections.emptySet(); + } } private static final Set functionQualifiers; @@ -693,7 +709,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { JavaScriptMethodObject(IClass cls, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(cls, functionQualifiers, cfg, symtab, AstMethodReference.fnReference(cls.getReference()), hasCatchBlock, caughtTypes, - hasMonitorOp, lexicalInfo, debugInfo); + hasMonitorOp, lexicalInfo, debugInfo, null); // force creation of these constants by calling the getter methods symtab.getNullConstant(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java index 52bef503c..f0c9c99e9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.Map; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; @@ -29,6 +30,11 @@ public abstract class AbstractEntity implements CAstEntity { return null; } + + public Collection getAnnotations() { + return null; + } + public void setPosition(Position pos) { sourcePosition = pos; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java index 4fd5aeef2..91093f3cb 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java @@ -10,6 +10,8 @@ *****************************************************************************/ package com.ibm.wala.cast.loader; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -23,6 +25,7 @@ import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; public abstract class AstDynamicPropertyClass extends AstClass { @@ -89,6 +92,10 @@ public abstract class AstDynamicPropertyClass extends AstClass { public IClassHierarchy getClassHierarchy() { return AstDynamicPropertyClass.this.getClassHierarchy(); } + + public Collection getAnnotations() { + return Collections.emptySet(); + } }); return declaredFields.get(name); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java index 7055522af..65fd4a827 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java @@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IField; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; public class AstField implements IField { @@ -26,16 +27,24 @@ public class AstField implements IField { private final FieldReference ref; private final IClass declaringClass; private final IClassHierarchy cha; + private final Collection annotations; public AstField(FieldReference ref, Collection qualifiers, IClass declaringClass, - IClassHierarchy cha) + IClassHierarchy cha, + Collection annotations) { this.declaringClass = declaringClass; this.qualifiers = qualifiers; this.ref = ref; this.cha = cha; + this.annotations = annotations; + } + + + public Collection getAnnotations() { + return annotations; } public IClass getDeclaringClass() { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java index 8b6416a00..125b6562f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java @@ -26,6 +26,7 @@ import com.ibm.wala.types.Descriptor; import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.strings.Atom; @@ -113,10 +114,11 @@ public abstract class AstMethod implements IMethod { private final TypeReference[][] catchTypes; private final AstLexicalInformation lexicalInfo; private final DebuggingInformation debugInfo; + private final Collection annotations; protected AstMethod(IClass cls, Collection qualifiers, AbstractCFG cfg, SymbolTable symtab, MethodReference ref, boolean hasCatchBlock, TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, - DebuggingInformation debugInfo) { + DebuggingInformation debugInfo, Collection annotations) { this.cls = cls; this.cfg = cfg; this.ref = ref; @@ -127,12 +129,14 @@ public abstract class AstMethod implements IMethod { this.hasMonitorOp = hasMonitorOp; this.lexicalInfo = lexicalInfo; this.debugInfo = debugInfo; + this.annotations = annotations; } - protected AstMethod(IClass cls, Collection qualifiers, MethodReference ref) { + protected AstMethod(IClass cls, Collection qualifiers, MethodReference ref, Collection annotations) { this.cls = cls; this.qualifiers = qualifiers; this.ref = ref; + this.annotations = annotations; this.cfg = null; this.symtab = null; @@ -173,6 +177,10 @@ public abstract class AstMethod implements IMethod { return debugInfo; } + public Collection getAnnotations() { + return annotations; + } + /** * Parents of this method with respect to lexical scoping, that is, methods * containing state possibly referenced lexically in this method diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java new file mode 100644 index 000000000..eabe004d7 --- /dev/null +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java @@ -0,0 +1,11 @@ +package com.ibm.wala.cast.tree; + +import java.util.Map; + +public interface CAstAnnotation { + + CAstType getType(); + + Map getArguments(); + +} diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java index 5f2460155..541a13c64 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java @@ -177,4 +177,10 @@ public interface CAstEntity { * The CAst type of this entity. */ CAstType getType(); + + /** + * Returns the set of any annotations this entity may have + */ + Collection getAnnotations(); + } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java index 9bd65ec39..047b88a30 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.Map; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstControlFlowMap; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; @@ -89,4 +90,8 @@ public class DelegatingEntity implements CAstEntity { return base.getType(); } + public Collection getAnnotations() { + return base.getAnnotations(); + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java index 3135e8399..4742d91e8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java @@ -24,6 +24,7 @@ import com.ibm.wala.shrikeBT.Constants; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.debug.UnimplementedError; @@ -332,4 +333,8 @@ public class ArrayClass implements IClass, Constants { return null; } + public Collection getAnnotations() { + return Collections.emptySet(); + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IClass.java index 514e84bc1..c3b8acae5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IClass.java @@ -19,6 +19,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchyDweller; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; /** @@ -178,4 +179,9 @@ public interface IClass extends IClassHierarchyDweller { */ boolean isReferenceType(); + /** + * get annotations, if any + */ + Collection getAnnotations(); + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMember.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMember.java index 6fe0d690a..0f58c15f8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMember.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMember.java @@ -10,7 +10,10 @@ *******************************************************************************/ package com.ibm.wala.classLoader; +import java.util.Collection; + import com.ibm.wala.ipa.cha.IClassHierarchyDweller; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; /** @@ -38,4 +41,9 @@ public interface IMember extends IClassHierarchyDweller { */ boolean isStatic(); + /** + * Get the annotations on this member, if any + */ + Collection getAnnotations(); + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java index 4423e1254..18fc1b5cd 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java @@ -30,6 +30,7 @@ import com.ibm.wala.shrikeCT.SignatureReader; import com.ibm.wala.types.TypeReference; import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.types.generics.MethodTypeSignature; +import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; /** @@ -354,6 +355,16 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet return Annotation.getAnnotationsFromReader(r, getDeclaringClass().getClassLoader().getReference()); } + public Collection getAnnotations() { + Collection result = HashSetFactory.make(); + try { + result.addAll(getAnnotations(true)); + result.addAll(getAnnotations(false)); + } catch (InvalidClassFileException e) { + + } + return result; + } private static final IndirectionData NO_INDIRECTIONS = new IndirectionData() { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java index 1528778d7..3aee4ffc7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java @@ -30,6 +30,7 @@ import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.types.generics.ClassSignature; +import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.shrike.ShrikeClassReaderHandle; import com.ibm.wala.util.strings.Atom; @@ -226,6 +227,17 @@ public final class ShrikeClass extends JVMClass { return getAnnotations(false); } + public Collection getAnnotations() { + Collection result = HashSetFactory.make(); + try { + result.addAll(getAnnotations(true)); + result.addAll(getAnnotations(false)); + } catch (InvalidClassFileException e) { + + } + return result; + } + public Collection getAnnotations(boolean runtimeInvisible) throws InvalidClassFileException { AnnotationsReader r = getAnnotationsReader(runtimeInvisible); return Annotation.getAnnotationsFromReader(r, getClassLoader().getReference()); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java index b3d018818..d38d18ed4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java @@ -12,11 +12,14 @@ package com.ibm.wala.classLoader; import java.io.InputStream; +import java.util.Collection; +import java.util.Collections; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; /** @@ -129,4 +132,10 @@ public abstract class SyntheticClass implements IClass { public IField getField(Atom name, TypeName typeName) { return getField(name); } + + public Collection getAnnotations() { + return Collections.emptySet(); + } + + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java index d8dbce220..d3a3d25e4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java @@ -10,6 +10,9 @@ *******************************************************************************/ package com.ibm.wala.classLoader; +import java.util.Collection; +import java.util.Collections; + import com.ibm.wala.cfg.InducedCFG; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.impl.Everywhere; @@ -22,6 +25,7 @@ import com.ibm.wala.types.Descriptor; import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.bytecode.BytecodeStream; import com.ibm.wala.util.debug.UnimplementedError; import com.ibm.wala.util.strings.Atom; @@ -364,4 +368,8 @@ public class SyntheticMethod implements IMethod { return getDeclaringClass().getClassHierarchy(); } + public Collection getAnnotations() { + return Collections.emptySet(); + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java index 6c84d25e5..17e4c55bb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java @@ -37,11 +37,15 @@ */ package com.ibm.wala.demandpa.util; +import java.util.Collection; +import java.util.Collections; + import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IField; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.debug.UnimplementedError; import com.ibm.wala.util.strings.Atom; @@ -120,4 +124,8 @@ public class ArrayContents implements IField { public FieldReference getReference() { return null; } + + public Collection getAnnotations() { + return Collections.emptySet(); + } } \ No newline at end of file diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java index 2d14a530d..aa1e82e76 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java @@ -26,6 +26,7 @@ import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; @@ -104,6 +105,10 @@ public class FakeRootClass extends SyntheticClass { public boolean isPublic() { return false; } + + public Collection getAnnotations() { + return Collections.emptySet(); + } }); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java index faac7f7a5..2b6d121c8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java @@ -12,6 +12,7 @@ package com.ibm.wala.ipa.summaries; import java.io.InputStream; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import com.ibm.wala.classLoader.IClass; @@ -23,6 +24,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.debug.UnimplementedError; @@ -244,4 +246,8 @@ public class BypassSyntheticClass extends SyntheticClass { return null; } + public Collection getAnnotations() { + return Collections.emptySet(); + } + } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java index 0007c8058..21603eb39 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java @@ -47,11 +47,13 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; +import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; @@ -82,6 +84,9 @@ import org.eclipse.jdt.core.dom.ExpressionStatement; import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.ForStatement; +import org.eclipse.jdt.core.dom.IAnnotationBinding; +import org.eclipse.jdt.core.dom.IBinding; +import org.eclipse.jdt.core.dom.IMemberValuePairBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; @@ -131,6 +136,7 @@ import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl; import com.ibm.wala.cast.java.loader.Util; import com.ibm.wala.cast.java.translator.JavaProcedureEntity; import com.ibm.wala.cast.tree.CAst; +import com.ibm.wala.cast.tree.CAstAnnotation; import com.ibm.wala.cast.tree.CAstControlFlowMap; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstNode; @@ -152,6 +158,7 @@ import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.debug.Assertions; @@ -268,16 +275,26 @@ public class JDTJava2CAstTranslator { private final JdtPosition fSourcePosition; + private final Set annotations; + public ClassEntity(ITypeBinding jdtType, String name, Collection quals, Collection entities, - JdtPosition pos) { + JdtPosition pos, Set annotations) { fName = name; fQuals = quals; fEntities = entities; fJdtType = jdtType; fSourcePosition = pos; + this.annotations = annotations; } - public int getKind() { + @Override + public Collection getAnnotations() { + // TODO Auto-generated method stub + return null; + } + + + public int getKind() { return TYPE_ENTITY; } @@ -423,8 +440,10 @@ public class JDTJava2CAstTranslator { Collection quals = JDT2CAstUtils.mapModifiersToQualifiers(fieldDecl.getModifiers(), false, false); for (Object f : fieldDecl.fragments()) { VariableDeclarationFragment fieldFrag = (VariableDeclarationFragment) f; - memberEntities.add(new FieldEntity(fieldFrag.getName().getIdentifier(), fieldFrag.resolveBinding().getType(), quals, - makePosition(fieldFrag.getStartPosition(), fieldFrag.getStartPosition() + fieldFrag.getLength()))); + IVariableBinding fieldBinding = fieldFrag.resolveBinding(); + memberEntities.add(new FieldEntity(fieldFrag.getName().getIdentifier(), fieldBinding.getType(), quals, + makePosition(fieldFrag.getStartPosition(), fieldFrag.getStartPosition() + fieldFrag.getLength()), + handleAnnotations(fieldBinding))); } } else if (decl instanceof Initializer) { // Initializers are inserted into constructors when making constructors. @@ -481,11 +500,14 @@ public class JDTJava2CAstTranslator { for (int i = 0; i < staticInits.size(); i++) bodyNodes[i] = visitFieldInitNode(staticInits.get(i), newContext); CAstNode staticInitAst = makeNode(newContext, fFactory, n, CAstNode.BLOCK_STMT, bodyNodes); - memberEntities.add(new ProcedureEntity(staticInitAst, typeBinding, childEntities, newContext)); + memberEntities.add(new ProcedureEntity(staticInitAst, typeBinding, childEntities, newContext, null)); } Collection quals = JDT2CAstUtils.mapModifiersToQualifiers(modifiers, isInterface, isAnnotation); - return new ClassEntity(typeBinding, name, quals, memberEntities, makePosition(n)); + + Set annotations = handleAnnotations(typeBinding); + + return new ClassEntity(typeBinding, name, quals, memberEntities, makePosition(n), annotations); } private CAstEntity visit(AnonymousClassDeclaration n, WalkContext context) { @@ -577,7 +599,7 @@ public class JDTJava2CAstTranslator { // finally, make the procedure entity CAstNode ast = makeNode(context, fFactory, n, CAstNode.BLOCK_STMT, bodyNodes); - return new ProcedureEntity(ast, fakeCtor, newType, memberEntities, context, paramTypes, null); + return new ProcedureEntity(ast, fakeCtor, newType, memberEntities, context, paramTypes, null, null); } @@ -726,7 +748,7 @@ public class JDTJava2CAstTranslator { for (ITypeBinding paramType : overridden.getParameterTypes()) paramCAstTypes.add(fTypeDict.getCAstTypeFor(paramType)); return new ProcedureEntity(mdast, overriding, overridingBinding.getDeclaringClass(), memberEntities, context, paramCAstTypes, - overridden.getReturnType()); + overridden.getReturnType(), null); } /** @@ -754,10 +776,51 @@ public class JDTJava2CAstTranslator { // Polyglot comment: Presumably the MethodContext's parent is a ClassContext, // and he has the list of initializers. Hopefully the following // will glue that stuff in the right place in any constructor body. - - return new ProcedureEntity(mdast, n, classBinding, memberEntities, context); + + Set annotations = null; + if (n.resolveBinding() != null) { + annotations = handleAnnotations(n.resolveBinding()); + } + + return new ProcedureEntity(mdast, n, classBinding, memberEntities, context, annotations); } + private Set handleAnnotations(IBinding binding) { + IAnnotationBinding[] annotations = binding.getAnnotations(); + + if(annotations == null || annotations.length == 0) { + return null; + } + + Set castAnnotations = HashSetFactory.make(); + for(IAnnotationBinding annotation : annotations) { + ITypeBinding annotationTypeBinding = annotation.getAnnotationType(); + final CAstType annotationType = fTypeDict.getCAstTypeFor(annotationTypeBinding); + final Map args = HashMapFactory.make(); + for(IMemberValuePairBinding mvpb : annotation.getAllMemberValuePairs()) { + String name = mvpb.getName(); + Object value = mvpb.getValue(); + args.put(name, value); + } + castAnnotations.add(new CAstAnnotation() { + @Override + public CAstType getType() { + return annotationType; + } + @Override + public Map getArguments() { + return args; + } + @Override + public String toString() { + return annotationType.getName() + args; + } + }); + } + + return castAnnotations; +} + protected final class ProcedureEntity implements JavaProcedureEntity { // TAGALONG (make static, access ast) // From Code Body Entity @@ -795,6 +858,8 @@ public class JDTJava2CAstTranslator { private int fModifiers; + private final Set annotations; + // can be method, constructor, "fake" default constructor, or null decl = static initializer /** * For a static initializer, pass a null decl. @@ -802,22 +867,22 @@ public class JDTJava2CAstTranslator { // FIXME: get rid of decl and pass in everything instead of having to do two different things with parameters // regular case private ProcedureEntity(CAstNode mdast, MethodDeclaration decl, ITypeBinding type, Map entities, - MethodContext context) { - this(mdast, decl, type, entities, context, null, null, decl.getModifiers()); + MethodContext context, Set annotations) { + this(mdast, decl, type, entities, context, null, null, decl.getModifiers(), annotations); } // static init - private ProcedureEntity(CAstNode mdast, ITypeBinding type, Map entities, MethodContext context) { - this(mdast, null, type, entities, context, null, null, 0); + private ProcedureEntity(CAstNode mdast, ITypeBinding type, Map entities, MethodContext context, Set annotations) { + this(mdast, null, type, entities, context, null, null, 0, annotations); } private ProcedureEntity(CAstNode mdast, MethodDeclaration decl, ITypeBinding type, Map entities, - MethodContext context, ArrayList parameterTypes, ITypeBinding returnType) { - this(mdast, decl, type, entities, context, parameterTypes, returnType, decl.getModifiers()); + MethodContext context, ArrayList parameterTypes, ITypeBinding returnType, Set annotations) { + this(mdast, decl, type, entities, context, parameterTypes, returnType, decl.getModifiers(), annotations); } private ProcedureEntity(CAstNode mdast, MethodDeclaration decl, ITypeBinding type, Map entities, - MethodContext context, ArrayList parameterTypes, ITypeBinding returnType, int modifiers) { + MethodContext context, ArrayList parameterTypes, ITypeBinding returnType, int modifiers, Set annotations) { // TypeSystem system, CodeInstance pd, String[] argumentNames, // } // Map entities, MethodContext mc) { @@ -827,6 +892,7 @@ public class JDTJava2CAstTranslator { fType = type; fReturnType = returnType; fModifiers = modifiers; + this.annotations = annotations; // from CodeBodyEntity fEntities = new LinkedHashMap>(); @@ -866,7 +932,12 @@ public class JDTJava2CAstTranslator { } } - public String toString() { + @Override + public Collection getAnnotations() { + return annotations; + } + + public String toString() { return fDecl == null ? "" : fDecl.toString(); } @@ -1034,15 +1105,24 @@ public class JDTJava2CAstTranslator { private final JdtPosition position; - private FieldEntity(String name, ITypeBinding type, Collection quals, JdtPosition position) { + private final Set annotations; + + private FieldEntity(String name, ITypeBinding type, Collection quals, JdtPosition position, Set annotations) { super(); this.type = type; this.quals = quals; this.name = name; this.position = position; + this.annotations = annotations; } - public int getKind() { + + @Override + public Collection getAnnotations() { + return annotations; + } + + public int getKind() { return CAstEntity.FIELD_ENTITY; } @@ -2821,7 +2901,12 @@ public class JDTJava2CAstTranslator { fTopLevelDecls = topLevelDecls; } - public int getKind() { + @Override + public Collection getAnnotations() { + return null; + } + + public int getKind() { return FILE_ENTITY; } @@ -3171,7 +3256,7 @@ public class JDTJava2CAstTranslator { */ private CAstEntity visit(EnumConstantDeclaration decl, WalkContext context) { return new FieldEntity(decl.getName().getIdentifier(), decl.resolveVariable().getType(), enumQuals, makePosition(decl - .getStartPosition(), decl.getStartPosition() + decl.getLength())); + .getStartPosition(), decl.getStartPosition() + decl.getLength()), null); } /** @@ -3248,7 +3333,7 @@ public class JDTJava2CAstTranslator { ArrayList paramTypes = new ArrayList(1); paramTypes.add(fTypeDict.getCAstTypeFor(ast.resolveWellKnownType("java.lang.String"))); - return new ProcedureEntity(bodyNode, fakeMet, enumType, memberEntities, context, paramTypes, enumType, met.getModifiers()); + return new ProcedureEntity(bodyNode, fakeMet, enumType, memberEntities, context, paramTypes, enumType, met.getModifiers(), handleAnnotations(met)); } private CAstEntity createEnumValuesMethod(ITypeBinding enumType, ArrayList constants, WalkContext oldContext) { @@ -3281,7 +3366,7 @@ public class JDTJava2CAstTranslator { ArrayList paramTypes = new ArrayList(0); return new ProcedureEntity(bodyNode, fakeMet, enumType, memberEntities, context, paramTypes, enumType.createArrayType(1), met - .getModifiers()); + .getModifiers(), handleAnnotations(enumType)); } private void doEnumHiddenEntities(ITypeBinding typeBinding, ArrayList staticInits, List memberEntities, @@ -3431,7 +3516,7 @@ public class JDTJava2CAstTranslator { // finally, make the procedure entity CAstNode ast = makeNode(context, fFactory, n, CAstNode.BLOCK_STMT, bodyNodes); - return new ProcedureEntity(ast, fakeCtor, newType, memberEntities, context, paramTypes, null); + return new ProcedureEntity(ast, fakeCtor, newType, memberEntities, context, paramTypes, null, handleAnnotations(ctor)); } 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 39538b78d..275e1f82f 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 @@ -117,8 +117,6 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { // TODO: we might need one AST (-> "Object" class) for all files. // TODO: group by project and send 'em in - System.out.println(modules); - // sort files into projects Map> projectsFiles = new HashMap>(); for (ModuleEntry m : modules) { @@ -131,12 +129,12 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { projectsFiles.get(proj).put(JavaCore.createCompilationUnitFrom(entry.getIFile()), entry); } - final ASTParser parser = ASTParser.newParser(AST.JLS3); + final ASTParser parser = ASTParser.newParser(AST.JLS4); for (final Map.Entry> proj : projectsFiles.entrySet()) { parser.setProject(JavaCore.create(proj.getKey())); parser.setResolveBindings(true); - + Set units = proj.getValue().keySet(); parser.createASTs(units.toArray(new ICompilationUnit[units.size()]), new String[0], new ASTRequestor() { public void acceptAST(ICompilationUnit source, CompilationUnit ast) { From aa6487fafc4b6dbe79a09830e1d6ad32c65ec849 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Wed, 6 Feb 2013 18:21:01 -0600 Subject: [PATCH 027/187] missing VectorKill println method modeled after the VectorGen method --- .../com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java index f30d1ea2d..0a2788d86 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java @@ -45,5 +45,9 @@ public class VectorKillFlowFunction implements IReversibleFlowFunction { public static VectorKillFlowFunction make(IntSet kill) { return new VectorKillFlowFunction(kill); } - + + @Override + public String toString() { + return "VectorKill: " + kill; + } } From 189a251a93852362842274ac8a60f4fd51a60aab Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Fri, 8 Feb 2013 08:54:24 +0100 Subject: [PATCH 028/187] fix for for in contexts for NEVER case --- .../wala/cast/js/ipa/callgraph/ForInContextSelector.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java index eac171bee..c77cc225d 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java @@ -338,18 +338,14 @@ public class ForInContextSelector implements ContextSelector { } } else if(receiver.length > index) { Frequency f = usesFirstArgAsPropertyName(callee); - /* - if(f == Frequency.ALWAYS) { - return new ForInContext(baseContext, simulateToString(caller.getClassHierarchy(), receiver[index])); - } else if(f == Frequency.SOMETIMES) { - */ + if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) { if(receiver[index] == null) { IClass undef = caller.getClassHierarchy().lookupClass(JavaScriptTypes.Undefined); return new ForInContext(baseContext, new ConcreteTypeKey(undef)); } else { return new ForInContext(baseContext, receiver[index]); } - //} + } } if (USE_CPA_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { return new SelectiveCPAContext(baseContext, receiver); From 1cf9a0008be21d3a46ba245d973c8ac366886804 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 12 Feb 2013 17:15:04 -0800 Subject: [PATCH 029/187] improve javadoc --- .../com/ibm/wala/ssa/SSAPhiInstruction.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAPhiInstruction.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAPhiInstruction.java index 445bce250..b04fe926a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAPhiInstruction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAPhiInstruction.java @@ -10,18 +10,30 @@ *******************************************************************************/ package com.ibm.wala.ssa; +import java.util.Iterator; + import com.ibm.wala.analysis.stackMachine.AbstractIntStackMachine; +import com.ibm.wala.cfg.ControlFlowGraph; /** * A phi instruction in SSA form. * - * See any modern compiler textbook for the definition of phi and the nature of SSA. + * See any modern compiler textbook for the definition of phi and the nature of + * SSA. * - * Note: In SSA {@link IR}s, these instructions do not appear in the normal instruction array returned by IR.getInstructions(); - * instead these instructions live in {@link ISSABasicBlock}. + * Note: In SSA {@link IR}s, these instructions do not appear in the + * normal instruction array returned by IR.getInstructions(); instead these + * instructions live in {@link ISSABasicBlock}. * - * Note: if getUse(i) returns {@link AbstractIntStackMachine}.TOP (that is, -1), then that use represents an edge in the CFG which - * is infeasible in verifiable bytecode. + * getUse(i) corresponds to the value number from the + * ith predecessor of the corresponding {@link ISSABasicBlock} + * b in {@link ControlFlowGraph} g, where predecessor + * order is the order of nodes returned by the {@link Iterator} + * g.getPredNodes(b). + * + * Note: if getUse(i) returns {@link AbstractIntStackMachine}.TOP (that is, -1), + * then that use represents an edge in the CFG which is infeasible in verifiable + * bytecode. */ public class SSAPhiInstruction extends SSAInstruction { private final int result; From 7579f5644ae177b35364ea8bbe4e9819666ed05d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 13 Feb 2013 16:17:23 -0800 Subject: [PATCH 030/187] Change BitVectorRepository to use LinkedLists This removes a nasty source of non-determinism when using MutableSharedBitVectorIntSets. --- .../wala/util/intset/BitVectorRepository.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java index 33296733c..3bf80cebf 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java @@ -10,12 +10,12 @@ *******************************************************************************/ package com.ibm.wala.util.intset; +import java.lang.ref.WeakReference; import java.util.Iterator; +import java.util.LinkedList; import java.util.Map; -import java.util.WeakHashMap; import com.ibm.wala.util.collections.HashMapFactory; -import com.ibm.wala.util.collections.MapUtil; /** * A repository for shared bit vectors as described by Heintze @@ -35,7 +35,7 @@ public class BitVectorRepository { /** * A Mapping from Integer -> WeakHashMap */ - final private static Map> buckets = HashMapFactory.make(); + final private static Map>> buckets = HashMapFactory.make(); /** * @param value @@ -56,24 +56,35 @@ public class BitVectorRepository { } int size = value.size(); for (int i = size; i > size - SUBSET_DELTA; i--) { - WeakHashMap m = buckets.get(Integer.valueOf(i)); + LinkedList> m = buckets.get(Integer.valueOf(i)); if (m != null) { - for (Iterator it = m.keySet().iterator(); it.hasNext();) { - BitVectorIntSet bv = (BitVectorIntSet) it.next(); - if (bv.isSubset(value)) { - // FOUND ONE! - if (STATS) { - hits++; + Iterator> it = m.iterator(); + while (it.hasNext()) { + WeakReference wr = it.next(); + BitVectorIntSet bv = wr.get(); + if (bv != null) { + if (bv.isSubset(value)) { + // FOUND ONE! + if (STATS) { + hits++; + } + return bv; } - return bv; + } else { + // might as well clear out the weak ref + it.remove(); } } } } // didn't find one. create one. - WeakHashMap m = MapUtil.findOrCreateWeakHashMap(buckets, new Integer(size)); + LinkedList> m = buckets.get(size); + if (m == null) { + m = new LinkedList>(); + buckets.put(size, m); + } BitVectorIntSet bv = new BitVectorIntSet(value); - m.put(bv, null); + m.add(new WeakReference(bv)); return bv; } @@ -90,9 +101,9 @@ public class BitVectorRepository { */ private static int countEntries() { int result = 0; - for (Iterator> it = buckets.values().iterator(); it.hasNext();) { - WeakHashMap m = it.next(); - result += m.size(); + for (LinkedList> l : buckets.values()) { + // don't worry about cleared WeakReferences; count will be rough + result += l.size(); } return result; } From 91124084189950014dc4e48c41161a862627153c Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 14 Feb 2013 09:35:55 -0800 Subject: [PATCH 031/187] update comments --- .../src/com/ibm/wala/util/intset/BitVectorRepository.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java index 3bf80cebf..67f064042 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java @@ -32,9 +32,6 @@ public class BitVectorRepository { private final static int SUBSET_DELTA = 5; - /** - * A Mapping from Integer -> WeakHashMap - */ final private static Map>> buckets = HashMapFactory.make(); /** @@ -71,7 +68,7 @@ public class BitVectorRepository { return bv; } } else { - // might as well clear out the weak ref + // remove the weak reference to avoid leaks it.remove(); } } From 3b48685d1dab42b66fae114ba865c3dd486870f9 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Tue, 19 Feb 2013 15:30:06 -0600 Subject: [PATCH 032/187] use WeakReference so that CGNode.getIR() doesn't hit the cache too often --- .../ipa/callgraph/impl/ExplicitCallGraph.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java index 62d25d789..fba942658 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.ibm.wala.ipa.callgraph.impl; +import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -139,6 +140,9 @@ public class ExplicitCallGraph extends BasicCallGraph implements BytecodeConstan protected final SparseVector targets = new SparseVector(); private final MutableSharedBitVectorIntSet allTargets = new MutableSharedBitVectorIntSet(); + + private WeakReference ir = new WeakReference(null); + private WeakReference du = new WeakReference(null); /** * @param method @@ -293,11 +297,21 @@ public class ExplicitCallGraph extends BasicCallGraph implements BytecodeConstan } public IR getIR() { - return getCallGraph().getInterpreter(this).getIR(this); + IR ir = this.ir.get(); + if (ir == null) { + ir = getCallGraph().getInterpreter(this).getIR(this); + this.ir = new WeakReference(ir); + } + return ir; } public DefUse getDU() { - return getCallGraph().getInterpreter(this).getDU(this); + DefUse du = this.du.get(); + if (du == null) { + du = getCallGraph().getInterpreter(this).getDU(this); + this.du = new WeakReference(du); + } + return du; } public ExplicitCallGraph getCallGraph() { From 87b856928c3baaa5ae1b5e0a743c41af1e6fb46d Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Fri, 1 Mar 2013 10:07:20 -0500 Subject: [PATCH 033/187] fixes for handling parse errors in JS and HTML --- .../src/javaonepointfive/Annotations.java | 18 +++-- .../com/ibm/wala/cast/java/test/IRTests.java | 4 +- .../TestCorrelatedPairExtractionRhino.java | 9 ++- .../js/test/TestForInBodyExtractionRhino.java | 9 ++- .../test/TestSimpleCallGraphShapeRhino.java | 10 +++ .../TestSimplePageCallGraphShapeRhino.java | 10 +++ ...tSimplePageCallGraphShapeRhinoJericho.java | 9 +++ .../ibm/wala/cast/js/vis/JsViewerDriver.java | 5 +- .../launchers/TestForInLoopHackRhino.launch | 1 - .../js/translator/CAstRhinoTranslator.java | 3 +- .../js/translator/RhinoToAstTranslator.java | 37 ++++++++- .../cast/js/test/JSCallGraphBuilderUtil.java | 17 ++++- .../js/test/TestSimpleCallGraphShape.java | 3 +- .../ibm/wala/cast/js/test/TestWebUtil.java | 5 +- .../cast/js/html/DomLessSourceExtractor.java | 8 +- .../ibm/wala/cast/js/html/IHtmlParser.java | 5 +- .../wala/cast/js/html/JSSourceExtractor.java | 4 +- .../com/ibm/wala/cast/js/html/WebUtil.java | 18 +---- .../js/html/jericho/JerichoHtmlParser.java | 76 ++++++++++++++++++- .../ipa/callgraph/ForInContextSelector.java | 27 +------ .../js/ipa/callgraph/JSCallGraphUtil.java | 26 ++++--- .../correlations/CorrelationFinder.java | 8 +- .../cast/ir/translator/TranslatorToCAst.java | 15 +++- .../cast/loader/CAstAbstractModuleLoader.java | 16 ++-- 24 files changed, 252 insertions(+), 91 deletions(-) diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java index cedbde22e..7c319ac63 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java @@ -4,17 +4,25 @@ package javaonepointfive; String doSomething(); int count(); String date(); + int[] stuff(); } -@TestAnnotation (doSomething="The class", count=-1, date="09-09-2001") +@interface AnotherTestAnnotation { + String value(); +} + +@AnotherTestAnnotation("string") +@TestAnnotation (doSomething="The class", count=-1, date="09-09-2001", stuff={0,1}) public class Annotations { - @TestAnnotation (doSomething="What to do", count=1, date="09-09-2005") - public void mymethod() { - // do nothing + @TestAnnotation (doSomething="What to do", count=1, date="09-09-2005", stuff={}) + public int mymethod() { + @AnotherTestAnnotation("i") + int i = 0; + return i; } - @TestAnnotation (doSomething="What not to do", count=0, date="12-14-2010") + @TestAnnotation (doSomething="What not to do", count=0, date="12-14-2010", stuff={1,2,3,4,5}) public static void main(String[] args) { (new Annotations()).mymethod(); } diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java index 636d822db..180e669ea 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java @@ -291,9 +291,9 @@ public abstract class IRTests { Assert.assertFalse("cannot find " + at + " in " + cls, false); } - for(MethodAnnotation ma : methodAnnotations) { + annot: for(MethodAnnotation ma : methodAnnotations) { IClass at = cg.getClassHierarchy().lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, ma.annotationTypeName)); - annot: for(CGNode n : cg) { + for(CGNode n : cg) { if (n.getMethod().getSignature().equals(ma.methodSig)) { for(Annotation a : n.getMethod().getAnnotations()) { if (a.getType().equals(at.getReference())) { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index ba9575b6c..3f6d96c3a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.test; import java.io.IOException; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; @@ -27,7 +28,13 @@ public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtract protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); - CAstEntity entity = translator.translateToCAst(); + CAstEntity entity = null; + try { + entity = translator.translateToCAst(); + } catch (Error e) { + e.printStackTrace(); + assert false; + } return entity; } } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java index 22fcf1073..1726083d3 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.test; import java.io.IOException; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; @@ -21,7 +22,13 @@ import com.ibm.wala.classLoader.SourceModule; public class TestForInBodyExtractionRhino extends TestForInBodyExtraction { protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); - CAstEntity entity = translator.translateToCAst(); + CAstEntity entity = null; + try { + entity = translator.translateToCAst(); + } catch (Error e) { + e.printStackTrace(); + assert false; + } return entity; } } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java index d8a44ea6c..60b66d4b0 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java @@ -17,7 +17,9 @@ import org.junit.Test; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder; import com.ibm.wala.util.CancelException; public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { @@ -70,4 +72,12 @@ public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { public void testNonLoopBreakLabel() throws IllegalArgumentException, IOException, CancelException { JSCallGraphBuilderUtil.makeScriptCG("tests", "non_loop_break.js"); } + + @Test(expected = AssertionError.class) + public void testParseError() throws IllegalArgumentException, IOException, CancelException { + PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "portal-example-simple.html"); + B.makeCallGraph(B.getOptions()); + Util.checkForFrontEndErrors(B.getClassHierarchy()); + } + } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java index ff7b48592..b9a942972 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java @@ -20,7 +20,9 @@ import com.ibm.wala.cast.js.html.IHtmlParser; import com.ibm.wala.cast.js.html.IHtmlParserFactory; import com.ibm.wala.cast.js.html.JSSourceExtractor; import com.ibm.wala.cast.js.html.WebUtil; +import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; @@ -37,6 +39,14 @@ public abstract class TestSimplePageCallGraphShapeRhino extends TestSimplePageCa verifyGraphAssertions(CG, assertionsForPage3); } + @Test(expected = AssertionError.class) + public void testJSParseError() throws IOException, IllegalArgumentException, CancelException { + URL url = getClass().getClassLoader().getResource("pages/garbage2.html"); + JSCFABuilder B = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); + B.makeCallGraph(B.getOptions()); + Util.checkForFrontEndErrors(B.getClassHierarchy()); + } + public static void main(String[] args) { justThisTest(TestSimplePageCallGraphShapeRhino.class); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java index 8e1744298..5f1243db0 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java @@ -7,6 +7,8 @@ import org.junit.Test; import com.ibm.wala.cast.js.html.IHtmlParser; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; +import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; @@ -19,6 +21,13 @@ public class TestSimplePageCallGraphShapeRhinoJericho extends TestSimplePageCall verifyGraphAssertions(CG, null); } + @Test public void testParseError() throws IOException, IllegalArgumentException, CancelException { + URL url = getClass().getClassLoader().getResource("pages/garbage.html"); + JSCFABuilder B = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); + B.makeCallGraph(B.getOptions()); + Util.checkForFrontEndErrors(B.getClassHierarchy()); + } + public static void main(String[] args) { justThisTest(TestSimplePageCallGraphShapeRhinoJericho.class); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java index f6de71dad..ea451355e 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java @@ -5,6 +5,7 @@ import java.net.URL; import java.util.Set; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.DefaultSourceExtractor; import com.ibm.wala.cast.js.html.DomLessSourceExtractor; import com.ibm.wala.cast.js.html.IdentityUrlResolver; @@ -25,7 +26,7 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.util.CancelException; public class JsViewerDriver extends JSCallGraphBuilderUtil { - public static void main(String args[]) throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException { + public static void main(String args[]) throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, Error { if (args.length != 1){ System.out.println("Usage: "); @@ -51,7 +52,7 @@ public class JsViewerDriver extends JSCallGraphBuilderUtil { } private static SourceModule[] getSources(boolean domless, URL url) - throws IOException { + throws IOException, Error { JSSourceExtractor sourceExtractor; if (domless ){ sourceExtractor = new DomLessSourceExtractor(); diff --git a/com.ibm.wala.cast.js.rhino.test/launchers/TestForInLoopHackRhino.launch b/com.ibm.wala.cast.js.rhino.test/launchers/TestForInLoopHackRhino.launch index 79d51bc9d..70e3ecc8d 100644 --- a/com.ibm.wala.cast.js.rhino.test/launchers/TestForInLoopHackRhino.launch +++ b/com.ibm.wala.cast.js.rhino.test/launchers/TestForInLoopHackRhino.launch @@ -11,7 +11,6 @@ - diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java index 411731aea..7bdb5294f 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java @@ -15,6 +15,7 @@ import java.util.LinkedList; import java.util.List; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; @@ -40,7 +41,7 @@ public class CAstRhinoTranslator implements TranslatorToCAst { rewriters.add(factory); } - public CAstEntity translateToCAst() throws IOException { + public CAstEntity translateToCAst() throws IOException, Error { String N; if (M instanceof SourceFileModule) { N = ((SourceFileModule) M).getClassName(); 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 b61fa350b..e7026392a 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 @@ -10,6 +10,7 @@ *****************************************************************************/ package com.ibm.wala.cast.js.translator; +import java.io.IOException; import java.io.Reader; import java.net.URL; import java.util.ArrayList; @@ -20,6 +21,8 @@ import java.util.List; import java.util.Map; import org.mozilla.javascript.CompilerEnvirons; +import org.mozilla.javascript.ErrorReporter; +import org.mozilla.javascript.EvaluatorException; import org.mozilla.javascript.Node; import org.mozilla.javascript.Parser; import org.mozilla.javascript.Token; @@ -83,8 +86,8 @@ import org.mozilla.javascript.ast.XmlPropRef; import org.mozilla.javascript.ast.XmlRef; import org.mozilla.javascript.ast.XmlString; import org.mozilla.javascript.ast.Yield; -import org.mozilla.javascript.tools.ToolErrorReporter; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.DoLoopTranslator; import com.ibm.wala.cast.js.html.MappedSourceModule; import com.ibm.wala.cast.js.ipa.callgraph.JSSSAPropagationCallGraphBuilder; @@ -106,6 +109,7 @@ import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.debug.Assertions; +import com.ibm.wala.util.warnings.Warning; public class RhinoToAstTranslator { @@ -2253,9 +2257,32 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { /** * parse the JavaScript code using Rhino, and then translate the resulting AST * to CAst + * @throws com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error */ - public CAstEntity translateToCAst() throws java.io.IOException { - ToolErrorReporter reporter = new ToolErrorReporter(true); + public CAstEntity translateToCAst() throws Error, IOException, com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error { + class CAstErrorReporter implements ErrorReporter { + private Warning w = null; + + public void error(final String arg0, final String arg1, final int arg2, final String arg3, int arg4) { + w = new Warning(Warning.SEVERE) { + @Override + public String getMsg() { + return arg0 + ": " + arg1 + "@" + arg2 + ": " + arg3; + } + }; + } + + public EvaluatorException runtimeError(String arg0, String arg1, int arg2, String arg3, int arg4) { + error(arg0, arg1, arg2, arg3, arg4); + return null; + } + + public void warning(String arg0, String arg1, int arg2, String arg3, int arg4) { + // ignore warnings + } + }; + + CAstErrorReporter reporter = new CAstErrorReporter(); CompilerEnvirons compilerEnv = new CompilerEnvirons(); compilerEnv.setErrorReporter(reporter); compilerEnv.setReservedKeywordAsIdentifier(true); @@ -2269,6 +2296,10 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { AstRoot top = P.parse(sourceReader, scriptName, 1); + if (reporter.w != null) { + throw new TranslatorToCAst.Error(reporter.w); + } + final FunctionContext child = new ScriptContext(new RootContext(), top, top.getSourceName()); TranslatingVisitor tv = new TranslatingVisitor(); List body = new ArrayList(); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 088a614bd..2290dec26 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -19,6 +19,7 @@ import java.util.Set; import junit.framework.Assert; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.MappedSourceModule; import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; @@ -27,8 +28,10 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; +import com.ibm.wala.cast.loader.CAstAbstractLoader; import com.ibm.wala.classLoader.SourceFileModule; import com.ibm.wala.classLoader.SourceModule; +import com.ibm.wala.classLoader.SourceURLModule; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.CallGraph; @@ -129,8 +132,18 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static JSCFABuilder makeHTMLCGBuilder(URL url, CGBuilderType builderType) throws IOException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); - Set script = WebUtil.extractScriptFromHTML(url); - JSCFABuilder builder = makeCGBuilder(new WebPageLoaderFactory(translatorFactory, preprocessor), script.toArray(new SourceModule[script.size()]), builderType, AstIRFactory.makeDefaultFactory()); + SourceModule[] scripts; + IRFactory irFactory = AstIRFactory.makeDefaultFactory(); + JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); + try { + Set script = WebUtil.extractScriptFromHTML(url); + scripts = script.toArray(new SourceModule[script.size()]); + } catch (Error e) { + SourceModule dummy = new SourceURLModule(url); + scripts = new SourceModule[]{ dummy }; + ((CAstAbstractLoader)loaders.getTheLoader()).addMessage(dummy, e.warning); + } + JSCFABuilder builder = makeCGBuilder(loaders, scripts, builderType, irFactory); builder.setBaseURL(url); return builder; } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 138ce3d48..80e88b355 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -23,6 +23,7 @@ import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; @@ -625,7 +626,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { //JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); verifyGraphAssertions(CG, assertionsForDateProperty); } - + protected IVector>> computeIkIdToVns(PointerAnalysis pa) { // Created by reversing the points to mapping for local pointer keys. diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java index 43fe8516f..f57386a22 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java @@ -17,20 +17,21 @@ import junit.framework.Assert; import org.junit.Test; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.MappedSourceModule; import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.core.tests.util.WalaTestCase; public class TestWebUtil extends WalaTestCase { - @Test public void testAjaxslt() { + @Test public void testAjaxslt() throws Error { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); Assert.assertTrue(url != null); Set mod = WebUtil.extractScriptFromHTML( url ); Assert.assertTrue(mod != null); } - @Test public void testAjaxpath() { + @Test public void testAjaxpath() throws Error { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xpath.html"); Assert.assertTrue(url != null); Set mod = WebUtil.extractScriptFromHTML( url ); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index 66b73bce0..ef1445432 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.util.collections.Pair; @@ -225,7 +226,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } public Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) - throws IOException { + throws IOException, Error { InputStream inputStreamReader = WebUtil.getStream(entrypointUrl); IGeneratorCallback htmlCallback = createHtmlCallback(entrypointUrl, urlResolver); @@ -237,6 +238,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { // writing the final region into one SourceFileModule. File outputFile = createOutputFile(entrypointUrl, DELETE_UPON_EXIT, USE_TEMP_NAME); FileMapping fileMapping = finalRegion.writeToFile(new PrintStream(outputFile)); + if (fileMapping == null) { + fileMapping = new EmptyFileMapping(); + } MappedSourceModule singleFileModule = new MappedSourceFileModule(outputFile, outputFile.getName(), fileMapping); return Collections.singleton(singleFileModule); } @@ -262,7 +266,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException, Error { // DomLessSourceExtractor domLessScopeGenerator = new DomLessSourceExtractor(); JSSourceExtractor domLessScopeGenerator = new DefaultSourceExtractor(); JSSourceExtractor.DELETE_UPON_EXIT = false; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java index 8bf32cfd7..d1913aa0c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java @@ -13,6 +13,8 @@ package com.ibm.wala.cast.js.html; import java.io.InputStream; import java.net.URL; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; + /** * @author danielk * @author yinnonh @@ -25,7 +27,8 @@ public interface IHtmlParser { * @param reader * @param callback * @param fileName + * @throws Error */ - public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName); + public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) throws Error; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java index c93ef1730..b2cf8ab58 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java @@ -14,6 +14,8 @@ import java.io.IOException; import java.net.URL; import java.util.Set; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; + /** * Extracts scripts from a given URL of an HTML. Retrieves also attached js files. * Provides file and line mapping for each extracted SourceFileModule back to the original file and line number. @@ -27,6 +29,6 @@ public abstract class JSSourceExtractor { public static boolean USE_TEMP_NAME = false; - public abstract Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException; + public abstract Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java index 608e2c531..49e12db0a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java @@ -17,8 +17,8 @@ import java.net.URL; import java.net.URLConnection; import java.util.Set; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; -import com.ibm.wala.util.debug.Assertions; public class WebUtil { @@ -34,19 +34,7 @@ public class WebUtil { WebUtil.factory = factory; } - public static Set extractScriptFromHTML(String url) { - try { - if (! url.startsWith("file://")) { - url = "file://" + url; - } - return extractScriptFromHTML(new URL(url)); - } catch (MalformedURLException e) { - Assertions.UNREACHABLE( e.toString() ); - return null; - } - } - - public static Set extractScriptFromHTML(URL url) { + public static Set extractScriptFromHTML(URL url) throws Error { try { JSSourceExtractor extractor = new DefaultSourceExtractor(); return extractor.extractSources(url, factory.getParser(), new IdentityUrlResolver()); @@ -55,7 +43,7 @@ public class WebUtil { } } - public static void main(String[] args) throws MalformedURLException { + public static void main(String[] args) throws MalformedURLException, Error { System.err.println(extractScriptFromHTML(new URL(args[0]))); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java index 20b4c256a..75a5e1691 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java @@ -15,14 +15,19 @@ import java.io.InputStream; import java.net.URL; import java.util.Iterator; import java.util.List; +import java.util.Set; import net.htmlparser.jericho.Config; import net.htmlparser.jericho.Element; +import net.htmlparser.jericho.Logger; import net.htmlparser.jericho.LoggerProvider; import net.htmlparser.jericho.Source; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.js.html.IHtmlCallback; import com.ibm.wala.cast.js.html.IHtmlParser; +import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.warnings.Warning; /** @@ -30,20 +35,87 @@ import com.ibm.wala.cast.js.html.IHtmlParser; * Uses the Jericho parser to go over the HTML */ public class JerichoHtmlParser implements IHtmlParser{ + static Set warnings = HashSetFactory.make(); + static{ - Config.LoggerProvider = LoggerProvider.STDERR; + class CAstLoggerProvider implements LoggerProvider { + @Override + public Logger getLogger(String arg0) { + class CAstLogger implements Logger { + + @Override + public void debug(String arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void error(final String arg0) { + warnings.add(new Warning() { + @Override + public String getMsg() { + return arg0; + } + }); + } + + @Override + public void info(String arg0) { + // TODO Auto-generated method stub + + } + + @Override + public boolean isDebugEnabled() { + return true; + } + + @Override + public boolean isErrorEnabled() { + return true; + } + + @Override + public boolean isInfoEnabled() { + return true; + } + + @Override + public boolean isWarnEnabled() { + return true; + } + + @Override + public void warn(String arg0) { + // TODO Auto-generated method stub + + } + + } + + return new CAstLogger(); + } + + } + + Config.LoggerProvider = new CAstLoggerProvider(); } - public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) { + public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) throws TranslatorToCAst.Error { + warnings.clear(); Parser parser = new Parser(callback, fileName); Source src; try { src = new Source(reader); + src.setLogger(Config.LoggerProvider.getLogger(fileName)); List childElements = src.getChildElements(); for (Iterator nodeIterator = childElements.iterator(); nodeIterator.hasNext();) { Element e = nodeIterator.next(); parser.parse(e); } + if (! warnings.isEmpty()) { + throw new TranslatorToCAst.Error(warnings.iterator().next()); + } } catch (IOException e) { System.err.println("Error parsing file: " + e.getMessage()); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java index c77cc225d..5f2f16d29 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java @@ -29,11 +29,9 @@ import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; -import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; -import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.DefUse; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.IRFactory; @@ -304,29 +302,6 @@ public class ForInContextSelector implements ContextSelector { return f; } - // simulate effect of ToString conversion on key - private InstanceKey simulateToString(IClassHierarchy cha, InstanceKey key) { - IClass stringClass = cha.lookupClass(JavaScriptTypes.String); - IClass numberClass = cha.lookupClass(JavaScriptTypes.Number); - if(key instanceof ConstantKey) { - Object value = ((ConstantKey)key).getValue(); - if(value instanceof String) { - return key; - } else if(value instanceof Number) { - Double dval = ((Number)value).doubleValue(); - return new ConstantKey(dval, numberClass); - } else if(value instanceof Boolean) { - Boolean bval = (Boolean)value; - return new ConstantKey(bval.toString(), stringClass); - } else if(value == null) { - return new ConstantKey("null", stringClass); - } - } /*else if(key != null && key.getConcreteType() == numberClass) { - return key; - }*/ - return new ConcreteTypeKey(stringClass); - } - public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); String calleeFullName = callee.getDeclaringClass().getName().toString(); @@ -334,7 +309,7 @@ public class ForInContextSelector implements ContextSelector { if(USE_NAME_TO_SELECT_CONTEXT) { if(calleeShortName.contains(HACK_METHOD_STR) && receiver.length > index) { // we assume that the argument is only used as a property name, so we can do ToString - return new ForInContext(baseContext, simulateToString(caller.getClassHierarchy(), receiver[index])); + return new ForInContext(baseContext, receiver[index]); } } else if(receiver.length > index) { Frequency f = usesFirstArgAsPropertyName(callee); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index 4fdead4a0..a7ae2ebfe 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -20,6 +20,7 @@ import java.util.Set; import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.js.translator.JSAstTranslator; @@ -182,17 +183,22 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra } } }; - CAstEntity tree = toCAst.translateToCAst(); - if (DEBUG) { - CAstPrinter.printTo(tree, new PrintWriter(System.err)); + CAstEntity tree; + try { + tree = toCAst.translateToCAst(); + if (DEBUG) { + CAstPrinter.printTo(tree, new PrintWriter(System.err)); + } + toIR.translate(tree, M); + for (String name : names) { + IClass fcls = cl.lookupClass(name, cha); + cha.addClass(fcls); + } + return names; + } catch (Error e) { + return Collections.emptySet(); } - toIR.translate(tree, M); - for (String name : names) { - IClass fcls = cl.lookupClass(name, cha); - cha.addClass(fcls); - } - return names; - } catch (RuntimeException e) { + } catch (RuntimeException e) { return Collections.emptySet(); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 254de5034..e6e744e16 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -28,6 +28,7 @@ import com.ibm.wala.cast.ipa.callgraph.CAstAnalysisScope; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; import com.ibm.wala.cast.ir.ssa.AbstractReflectivePut; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.loader.JavaScriptLoader; @@ -245,7 +246,12 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); - Set script = WebUtil.extractScriptFromHTML(url); + Set script = null; + try { + script = WebUtil.extractScriptFromHTML(url); + } catch (Error e) { + assert false : e.warning; + } Map summaries = findCorrelatedAccesses(script); return summaries; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java index 1bc4ecf74..a29542d0e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java @@ -13,14 +13,25 @@ import com.ibm.wala.cast.tree.impl.CAstNodeTypeMapRecorder; import com.ibm.wala.cast.tree.impl.CAstSourcePositionRecorder; import com.ibm.wala.cast.tree.rewrite.CAstCloner; import com.ibm.wala.cast.tree.rewrite.CAstRewriter; -import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.cast.tree.rewrite.CAstRewriter.CopyKey; import com.ibm.wala.cast.tree.rewrite.CAstRewriter.RewriteContext; +import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; +import com.ibm.wala.util.warnings.Warning; public interface TranslatorToCAst { public , K extends CopyKey> void addRewriter(CAstRewriterFactory factory, boolean prepend); - public CAstEntity translateToCAst() throws IOException; + public class Error extends Exception { + public final Warning warning; + + public Error(Warning message) { + super(message.getMsg()); + warning = message; + } + + } + + public CAstEntity translateToCAst() throws Error, IOException; public interface WalkContext, T> { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java index 8b200975a..72bfe78e9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java @@ -139,21 +139,17 @@ public abstract class CAstAbstractModuleLoader extends CAstAbstractLoader { } else if (moduleEntry instanceof SourceModule) { TranslatorToCAst xlatorToCAst = getTranslatorToCAst(ast, (SourceModule) moduleEntry); - CAstEntity fileEntity = xlatorToCAst.translateToCAst(); - - if (fileEntity != null) { + CAstEntity fileEntity = null; + try { + fileEntity = xlatorToCAst.translateToCAst(); + if (DEBUG) { CAstPrinter.printTo(fileEntity, new PrintWriter(System.err)); } topLevelEntities.add(Pair.make(fileEntity, moduleEntry)); - } else { - addMessage(moduleEntry, new Warning(Warning.SEVERE) { - @Override - public String getMsg() { - return "parse error"; - } - }); + } catch (TranslatorToCAst.Error e) { + addMessage(moduleEntry, e.warning); } } } catch (final MalformedURLException e) { From 6bb51a6e5859d95372aee87153fb54a28fb0647d Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Fri, 1 Mar 2013 10:08:30 -0500 Subject: [PATCH 034/187] fixes for parse errors in JS and HTML --- .../examples-src/pages/garbage.html | 3 +++ .../examples-src/pages/garbage2.html | 5 +++++ .../wala/cast/js/html/EmptyFileMapping.java | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/pages/garbage2.html create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java diff --git a/com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html b/com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html new file mode 100644 index 000000000..6d2c18811 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html @@ -0,0 +1,3 @@ +#$ +>>> +this is so not a valid JS program! + + diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java new file mode 100644 index 000000000..fc743b69f --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java @@ -0,0 +1,19 @@ +package com.ibm.wala.cast.js.html; + +import java.io.PrintStream; + +import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; + +public class EmptyFileMapping implements FileMapping { + + @Override + public IncludedPosition getIncludedPosition(Position line) { + return null; + } + + @Override + public void dump(PrintStream ps) { + ps.println("empty mapping"); + } + +} From 7c3e13d09f32cadeab4aca1502f3a21db1ea504f Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Sun, 3 Mar 2013 19:43:45 -0500 Subject: [PATCH 035/187] remove extraneous printing --- .../com/ibm/wala/cast/js/loader/JavaScriptLoader.java | 10 ---------- 1 file changed, 10 deletions(-) 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 e94fcda98..88a6bde14 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 @@ -941,14 +941,4 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { protected boolean shouldTranslate(CAstEntity entity) { return true; } - - @Override - protected void finishTranslation() { - Iterator ms = getModulesWithParseErrors(); - while (ms.hasNext()) { - ModuleEntry m = ms.next(); - System.err.println(m); - System.err.println(getMessages(m)); - } - } } From c9e1b2e587002d6f37237afdccedcac261d9dd00 Mon Sep 17 00:00:00 2001 From: sjfink Date: Mon, 18 Mar 2013 08:40:25 -0700 Subject: [PATCH 036/187] fix a bug in BitVectorVariable.copyState() involving empty vectors --- .../src/com/ibm/wala/fixpoint/BitVectorVariable.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java index 59efcb9e9..4956e8377 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java @@ -42,6 +42,8 @@ public class BitVectorVariable extends AbstractVariable { } if (other.V != null) { V.copySet(other.V); + } else { + V = null; } } From eed055a69adb4019945cd88b35ce076bc8aec08b Mon Sep 17 00:00:00 2001 From: Nicholas Chen Date: Fri, 29 Mar 2013 17:14:44 -0500 Subject: [PATCH 037/187] Test case exemplifying Unexpected type: class com.ibm.wala.analysis.typeInference.JavaPrimitiveType This is a simple test case that illustrates the issue with type inference on a String + some primitive. The code is package javaonepointfive; public class TypeInferencePrimAndStringOp { public static void main(String[] args) { int a = 2; String result = "a" + a; } } --- .../wala/cast/java/test/JDTJava15IRTests.java | 11 +++- .../java/test/TypeInferenceAssertion.java | 54 ++++++++++++++++++ .../testdata/test_project.zip | Bin 354418 -> 339892 bytes 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java mode change 100644 => 100755 com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java b/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java index 3bd92de7c..4698a1a0e 100644 --- a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java +++ b/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java @@ -6,6 +6,9 @@ *****************************************************************************/ package com.ibm.wala.cast.java.test; +import java.io.File; +import java.util.Arrays; + import org.junit.Test; public class JDTJava15IRTests extends JDTJavaTest { @@ -13,7 +16,7 @@ public class JDTJava15IRTests extends JDTJavaTest { public JDTJava15IRTests() { super(JDTJavaIRTests.PROJECT); } - + @Test public void testAnonGeneNullarySimple() { runTest(singlePkgTestSrc("javaonepointfive"), rtJar, simplePkgTestEntryPoint("javaonepointfive"), emptyList, true); @@ -119,4 +122,10 @@ public class JDTJava15IRTests extends JDTJavaTest { runTest(singlePkgTestSrc("javaonepointfive"), rtJar, simplePkgTestEntryPoint("javaonepointfive"), emptyList, true); } + @Test + public void testTypeInferencePrimAndStringOp() { + String pkgName = "javaonepointfive"; + runTest(singlePkgTestSrc(pkgName), rtJar, simplePkgTestEntryPoint(pkgName), + Arrays.asList(new TypeInferenceAssertion(pkgName + File.separator + singleInputForTest())), false); + } } diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java b/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java new file mode 100644 index 000000000..4814bee49 --- /dev/null +++ b/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java @@ -0,0 +1,54 @@ +package com.ibm.wala.cast.java.test; + +import com.ibm.wala.cast.java.analysis.typeInference.AstJavaTypeInference; +import com.ibm.wala.cast.java.test.IRTests.IRAssertion; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.impl.Everywhere; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ssa.IR; +import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.types.MethodReference; +import com.ibm.wala.util.collections.Iterator2Iterable; + +final class TypeInferenceAssertion implements IRAssertion { + private String typeName; + + public TypeInferenceAssertion(String packageName) { + this.typeName = packageName; + } + + // For now just check things in the main method + public void check(CallGraph cg) { + IR ir = getIR(cg, typeName, "main", "[Ljava/lang/String;", "V"); + AstJavaTypeInference inference = new AstJavaTypeInference(ir, cg.getClassHierarchy(), true); + + for (SSAInstruction instr : Iterator2Iterable.make(ir.iterateAllInstructions())) { + // Check defs + for (int def = 0; def < instr.getNumberOfDefs(); def++) { + int ssaVariable = instr.getDef(def); + inference.getType(ssaVariable); + } + + // Check uses + for (int def = 0; def < instr.getNumberOfUses(); def++) { + int ssaVariable = instr.getUse(def); + inference.getType(ssaVariable); + } + } + + } + + private IR getIR(CallGraph cg, String fullyQualifiedTypeName, String methodName, String methodParameter, String methodReturnType) { + IClassHierarchy classHierarchy = cg.getClassHierarchy(); + MethodReference methodRef = JDTJava15IRTests + .descriptorToMethodRef( + String.format("Source#%s#%s#(%s)%s", fullyQualifiedTypeName, methodName, methodParameter, methodReturnType), + classHierarchy); + IMethod method = classHierarchy.resolveMethod(methodRef); + CGNode node = cg.getNode(method, Everywhere.EVERYWHERE); + return node.getIR(); + } + +} \ No newline at end of file diff --git a/com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip b/com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip old mode 100644 new mode 100755 index 3d831a2ce8d580658a29429328637789ec5d3e6d..aae8fe3837c655bc2850d86312e7118c23501ca2 GIT binary patch delta 209618 zcmZsC1yo$ivM7UVaCdiicX#*T!QBZkI0W~>39fYCkM)n#4#assRu1pnBRDQi^|#tRsZ9ua2O>=7nVP_9)UWjM=qSX?9q=q zZ_+oIf1)6e*f2b= z)I@&uUGVhC_1bU>vJx-4^qoLAkG89x(}-UkOUxnMXrHMCo{wyJ0I#BGyeL3T5ega$ z;@6*pQli-Jn?D~o;QuUEJ|0$XPG$~T&dv@Jp0*B_R&MUBf5*W89uvc8|GESK0TB)j z0|CJg0RcLA10&E9ItkqZ0Kz~*K#agaKp_6&Wo_$WYwhIhW)+^g6rat8CB61YEaVLh z6e|r4OD)YM*Ld)Q9iuAqbgÛr`f$FLaHQs{bna>59A`oQYFGnd}YwhxQ@bBkeM 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%0ARd4w!-dfVy9k0gWxtlv}t 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ⅆfa0ReBMk0W5mr8dnbRxCFJ5B68Zj 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 xn$p*6l0mJB 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%0A8*`c$IY^a32Dm) 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 delta 224771 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 BL2>{9 From dc4712fd757f0851eea2482efb3a982cbd068bf9 Mon Sep 17 00:00:00 2001 From: Nicholas Chen Date: Fri, 29 Mar 2013 14:18:11 -0500 Subject: [PATCH 038/187] Initialize stringClass field lazily MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This ensures that when we need to use stringClass, it can be constructed directly from the cha field. Previously, it was only initialized after the call to super(…) in the constructor. However, by then it is too late because super(…) calls initialize() and solve() which need the stringClass field. --- .../typeInference/AstJavaTypeInference.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java index 1d5107744..12114eb4b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java @@ -33,7 +33,7 @@ import com.ibm.wala.util.debug.Assertions; public class AstJavaTypeInference extends AstTypeInference { - protected final IClass stringClass; + protected IClass stringClass; protected class AstJavaTypeOperatorFactory extends AstTypeOperatorFactory implements AstJavaInstructionVisitor { public void visitBinaryOp(SSABinaryOpInstruction instruction) { @@ -96,7 +96,13 @@ public class AstJavaTypeInference extends AstTypeInference { public AstJavaTypeInference(IR ir, IClassHierarchy cha, boolean doPrimitives) { super(ir, cha, JavaPrimitiveType.BOOLEAN, doPrimitives); - this.stringClass = cha.lookupClass(TypeReference.JavaLangString); + } + + IClass getStringClass() { + if (stringClass == null) { + this.stringClass = cha.lookupClass(TypeReference.JavaLangString); + } + return stringClass; } protected void initialize() { @@ -125,12 +131,12 @@ public class AstJavaTypeInference extends AstTypeInference { TypeVariable r = (TypeVariable) rhs[i]; TypeAbstraction ta = r.getType(); if (ta instanceof PointType) { - if (ta.getType().equals(stringClass)) { + if (ta.getType().equals(getStringClass())) { meet = new PointType(ta.getType()); break; } } else if (ta instanceof ConeType) { - if (ta.getType().equals(stringClass)) { + if (ta.getType().equals(getStringClass())) { meet = new PointType(ta.getType()); break; } From 76408b6d1a787d77aa1ef8ceadd6846a1a689047 Mon Sep 17 00:00:00 2001 From: Nicholas Chen Date: Sat, 30 Mar 2013 09:52:28 -0500 Subject: [PATCH 039/187] Add the source file to com.ibm.wala.cast.java.test.data Previously, I only included the source file in the zip file but just realized the zip file is auto-generated from the com.ibm.wala.cast.java.test.data/src folder. --- .../testdata/test_project.zip | Bin 339892 -> 295859 bytes .../TypeInferencePrimAndStringOp.java | 9 +++++++++ 2 files changed, 9 insertions(+) mode change 100755 => 100644 com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip create mode 100644 com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java diff --git a/com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip b/com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip old mode 100755 new mode 100644 index aae8fe3837c655bc2850d86312e7118c23501ca2..927267c8c86725e69064b80c8d9cc5572065bfe7 GIT binary patch delta 202526 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 delta 245499 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 XcCB*=KHaxnN|)5?bDH#x_I=B6fO+T) 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 S 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 if@r|&bwBUs(4uTB46RkFt?I4nQ Date: Sat, 30 Mar 2013 08:41:45 -0700 Subject: [PATCH 040/187] don't commit test_project.zip --- .../testdata/test_project.zip | Bin 295859 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip diff --git a/com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip b/com.ibm.wala.cast.java.jdt.test/testdata/test_project.zip deleted file mode 100644 index 927267c8c86725e69064b80c8d9cc5572065bfe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295859 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 z 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 z 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

Nu?5IG}Blyo=H*1*dS?Z`oLy=-u=TSLBG3 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 From 2a9eced39105aa45a6c57ba1ae3ee8c93900b44a Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 30 Mar 2013 11:40:18 -0700 Subject: [PATCH 041/187] rename com.ibm.wala.cast.java.jdt.test to com.ibm.wala.ide.jdt.test It looks like this change was made partially before, but maybe not completed? Anyway, this gets our JDT test launchers to work again. --- .../.classpath | 0 .../.project | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../.settings/org.eclipse.jdt.ui.prefs | 0 .../META-INF/MANIFEST.MF | 0 .../build.properties | 0 .../data/Java60RegressionExclusions.txt | 0 .../launchers/JDTJava15IRTests.launch | 2 +- .../launchers/JDTJavaIRTests (Manu).launch | 0 .../launchers/JDTJavaIRTests.launch | 0 .../source/com/ibm/wala/cast/java/jdt/test/Activator.java | 0 .../source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java | 0 .../source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java | 0 .../source/com/ibm/wala/cast/java/test/JDTJavaTest.java | 0 .../com/ibm/wala/cast/java/test/TypeInferenceAssertion.java | 0 .../source/com/ibm/wala/demandpa/driver/DemandCastChecker.java | 0 16 files changed, 1 insertion(+), 1 deletion(-) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/.classpath (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/.project (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/.settings/org.eclipse.jdt.core.prefs (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/.settings/org.eclipse.jdt.ui.prefs (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/META-INF/MANIFEST.MF (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/build.properties (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/data/Java60RegressionExclusions.txt (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/launchers/JDTJava15IRTests.launch (99%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/launchers/JDTJavaIRTests (Manu).launch (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/launchers/JDTJavaIRTests.launch (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/source/com/ibm/wala/cast/java/jdt/test/Activator.java (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/source/com/ibm/wala/cast/java/test/JDTJavaTest.java (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java (100%) rename {com.ibm.wala.cast.java.jdt.test => com.ibm.wala.ide.jdt.test}/source/com/ibm/wala/demandpa/driver/DemandCastChecker.java (100%) diff --git a/com.ibm.wala.cast.java.jdt.test/.classpath b/com.ibm.wala.ide.jdt.test/.classpath similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/.classpath rename to com.ibm.wala.ide.jdt.test/.classpath diff --git a/com.ibm.wala.cast.java.jdt.test/.project b/com.ibm.wala.ide.jdt.test/.project similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/.project rename to com.ibm.wala.ide.jdt.test/.project diff --git a/com.ibm.wala.cast.java.jdt.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.core.prefs similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/.settings/org.eclipse.jdt.core.prefs rename to com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.core.prefs diff --git a/com.ibm.wala.cast.java.jdt.test/.settings/org.eclipse.jdt.ui.prefs b/com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.ui.prefs similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/.settings/org.eclipse.jdt.ui.prefs rename to com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.ui.prefs diff --git a/com.ibm.wala.cast.java.jdt.test/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/META-INF/MANIFEST.MF rename to com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF diff --git a/com.ibm.wala.cast.java.jdt.test/build.properties b/com.ibm.wala.ide.jdt.test/build.properties similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/build.properties rename to com.ibm.wala.ide.jdt.test/build.properties diff --git a/com.ibm.wala.cast.java.jdt.test/data/Java60RegressionExclusions.txt b/com.ibm.wala.ide.jdt.test/data/Java60RegressionExclusions.txt similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/data/Java60RegressionExclusions.txt rename to com.ibm.wala.ide.jdt.test/data/Java60RegressionExclusions.txt diff --git a/com.ibm.wala.cast.java.jdt.test/launchers/JDTJava15IRTests.launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch similarity index 99% rename from com.ibm.wala.cast.java.jdt.test/launchers/JDTJava15IRTests.launch rename to com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch index 3550f6efc..32641dcf8 100644 --- a/com.ibm.wala.cast.java.jdt.test/launchers/JDTJava15IRTests.launch +++ b/com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch @@ -25,7 +25,7 @@ - + diff --git a/com.ibm.wala.cast.java.jdt.test/launchers/JDTJavaIRTests (Manu).launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/launchers/JDTJavaIRTests (Manu).launch rename to com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch diff --git a/com.ibm.wala.cast.java.jdt.test/launchers/JDTJavaIRTests.launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/launchers/JDTJavaIRTests.launch rename to com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java rename to com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java rename to com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJava15IRTests.java diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java rename to com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaIRTests.java diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java rename to com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java rename to com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java diff --git a/com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/demandpa/driver/DemandCastChecker.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/demandpa/driver/DemandCastChecker.java similarity index 100% rename from com.ibm.wala.cast.java.jdt.test/source/com/ibm/wala/demandpa/driver/DemandCastChecker.java rename to com.ibm.wala.ide.jdt.test/source/com/ibm/wala/demandpa/driver/DemandCastChecker.java From f0d68d41bcbb470888665def777021007d0c45cc Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 30 Mar 2013 12:21:20 -0700 Subject: [PATCH 042/187] more informative assertion --- .../src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java index e3369a6cd..71e9cfc05 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java @@ -114,7 +114,7 @@ public class EclipseTestUtil { IPath path = new Path("testdata").append(filename); URL url = FileLocator.find(bundle, path, null); - assert url != null; + assert url != null : bundle.toString() + " path " + path.toString(); try { URL fileURL = FileLocator.toFileURL(url); File file = new File(fileURL.getPath()); From 1ae05fa36665bea651f99f9b0f6779ae2bed8a5d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 30 Mar 2013 12:25:01 -0700 Subject: [PATCH 043/187] patch up build.xml for project rename --- com.ibm.wala.cast.java.test.data/build.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.ibm.wala.cast.java.test.data/build.xml b/com.ibm.wala.cast.java.test.data/build.xml index 9c23f2ccd..13a0c0aa4 100644 --- a/com.ibm.wala.cast.java.test.data/build.xml +++ b/com.ibm.wala.cast.java.test.data/build.xml @@ -49,11 +49,11 @@ - + - @@ -65,7 +65,7 @@ - + From 797add310eb993769be5ccf6913c533e6d932cfa Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 30 Mar 2013 18:09:04 -0700 Subject: [PATCH 044/187] update ignroes --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e7fabfedc..7aa1eb0fc 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ com.ibm.wala.core.testdata/lib/ com.ibm.wala.core/dat/wala.properties com.ibm.wala.core.tests/dat/wala.examples.properties com.ibm.wala.cast.js.html.nu_validator/lib/ -com.ibm.wala.cast.java.test/testdata/ +com.ibm.wala.ide.jdt.test/testdata/ From 321e925660d81f411dc9016965c7e6ec6cb1e09b Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Wed, 3 Apr 2013 12:12:43 -0400 Subject: [PATCH 045/187] work on CHA --- com.ibm.wala.cast.java.test.data/build.xml | 6 +- .../TypeInferencePrimAndStringOp.java | 9 + .../typeInference/AstJavaTypeInference.java | 14 +- .../ipa/cha/CrossLanguageClassHierarchy.java | 2 +- .../tests/callGraph/CHACallGraphTest.java | 41 +++ com.ibm.wala.core/META-INF/MANIFEST.MF | 1 + .../wala/ipa/callgraph/cha/CHACallGraph.java | 345 ++++++++++++++++++ .../callgraph/cha/CHAContextInterpreter.java | 30 ++ ...ntextInsensitiveCHAContextInterpreter.java | 40 ++ .../ipa/callgraph/impl/BasicCallGraph.java | 11 +- .../ipa/callgraph/impl/ExplicitCallGraph.java | 3 +- .../rta/ContextInsensitiveRTAInterpreter.java | 20 +- .../rta/RTAContextInterpreter.java | 13 +- .../com/ibm/wala/ipa/cha/ClassHierarchy.java | 2 +- .../com/ibm/wala/ipa/cha/IClassHierarchy.java | 2 +- .../META-INF/MANIFEST.MF | 2 +- .../launchers/JSProjectScopeTest.launch | 2 +- .../wala/ide/tests/util/EclipseTestUtil.java | 2 +- .../util/collections/ComposedIterator.java | 2 +- 19 files changed, 497 insertions(+), 50 deletions(-) create mode 100644 com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java create mode 100644 com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java create mode 100644 com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java create mode 100644 com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHAContextInterpreter.java create mode 100644 com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java diff --git a/com.ibm.wala.cast.java.test.data/build.xml b/com.ibm.wala.cast.java.test.data/build.xml index 9c23f2ccd..13a0c0aa4 100644 --- a/com.ibm.wala.cast.java.test.data/build.xml +++ b/com.ibm.wala.cast.java.test.data/build.xml @@ -49,11 +49,11 @@ - + - @@ -65,7 +65,7 @@ - + diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java new file mode 100644 index 000000000..55a5b670e --- /dev/null +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java @@ -0,0 +1,9 @@ +package javaonepointfive; + +public class TypeInferencePrimAndStringOp { + public static void main(String[] args) { + int a = 2; + String result = "a" + a; + } +} + diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java index 1d5107744..12114eb4b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java @@ -33,7 +33,7 @@ import com.ibm.wala.util.debug.Assertions; public class AstJavaTypeInference extends AstTypeInference { - protected final IClass stringClass; + protected IClass stringClass; protected class AstJavaTypeOperatorFactory extends AstTypeOperatorFactory implements AstJavaInstructionVisitor { public void visitBinaryOp(SSABinaryOpInstruction instruction) { @@ -96,7 +96,13 @@ public class AstJavaTypeInference extends AstTypeInference { public AstJavaTypeInference(IR ir, IClassHierarchy cha, boolean doPrimitives) { super(ir, cha, JavaPrimitiveType.BOOLEAN, doPrimitives); - this.stringClass = cha.lookupClass(TypeReference.JavaLangString); + } + + IClass getStringClass() { + if (stringClass == null) { + this.stringClass = cha.lookupClass(TypeReference.JavaLangString); + } + return stringClass; } protected void initialize() { @@ -125,12 +131,12 @@ public class AstJavaTypeInference extends AstTypeInference { TypeVariable r = (TypeVariable) rhs[i]; TypeAbstraction ta = r.getType(); if (ta instanceof PointType) { - if (ta.getType().equals(stringClass)) { + if (ta.getType().equals(getStringClass())) { meet = new PointType(ta.getType()); break; } } else if (ta instanceof ConeType) { - if (ta.getType().equals(stringClass)) { + if (ta.getType().equals(getStringClass())) { meet = new PointType(ta.getType()); break; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java index 27737bdb3..4956956de 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java @@ -135,7 +135,7 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return getHierarchy(c).getNumber(c); } - public Collection getPossibleTargets(MethodReference ref) { + public Set getPossibleTargets(MethodReference ref) { return getHierarchy(ref).getPossibleTargets(ref); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java new file mode 100644 index 000000000..aad8d8361 --- /dev/null +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java @@ -0,0 +1,41 @@ +package com.ibm.wala.core.tests.callGraph; + +import java.io.IOException; + +import org.junit.Test; + +import com.ibm.wala.core.tests.util.TestConstants; +import com.ibm.wala.ipa.callgraph.AnalysisScope; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.Entrypoint; +import com.ibm.wala.ipa.callgraph.cha.CHACallGraph; +import com.ibm.wala.ipa.callgraph.impl.AllApplicationEntrypoints; +import com.ibm.wala.ipa.cha.ClassHierarchy; +import com.ibm.wala.ipa.cha.ClassHierarchyException; +import com.ibm.wala.util.CancelException; + +public class CHACallGraphTest { + @Test public void testJava_cup() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { + testCHA(TestConstants.JAVA_CUP, TestConstants.JAVA_CUP_MAIN); + } + + public static CallGraph testCHA(String scopeFile, String mainClass) throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { + AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(scopeFile, CallGraphTestUtil.REGRESSION_EXCLUSIONS); + ClassHierarchy cha = ClassHierarchy.make(scope); + Iterable entrypoints; + if (mainClass == null) { + entrypoints = new AllApplicationEntrypoints(scope, cha); + } else { + entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, mainClass); + } + + CHACallGraph CG = new CHACallGraph(cha); + CG.init(entrypoints); + + return CG; + } + + public static void main(String[] args) throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { + testCHA(args[0], args.length>1? args[1]: null); + } +} diff --git a/com.ibm.wala.core/META-INF/MANIFEST.MF b/com.ibm.wala.core/META-INF/MANIFEST.MF index c117271fc..c92918699 100644 --- a/com.ibm.wala.core/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core/META-INF/MANIFEST.MF @@ -28,6 +28,7 @@ Export-Package: ., com.ibm.wala.demandpa.util, com.ibm.wala.escape, com.ibm.wala.ipa.callgraph, + com.ibm.wala.ipa.callgraph.cha, com.ibm.wala.ipa.callgraph.impl, com.ibm.wala.ipa.callgraph.propagation, com.ibm.wala.ipa.callgraph.propagation.cfa, diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java new file mode 100644 index 000000000..e2c1ef269 --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java @@ -0,0 +1,345 @@ +/******************************************************************************* + * Copyright (c) 2007 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.ipa.callgraph.cha; + +import java.lang.ref.SoftReference; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import com.ibm.wala.classLoader.CallSiteReference; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.classLoader.NewSiteReference; +import com.ibm.wala.ipa.callgraph.AnalysisCache; +import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.Context; +import com.ibm.wala.ipa.callgraph.Entrypoint; +import com.ibm.wala.ipa.callgraph.impl.BasicCallGraph; +import com.ibm.wala.ipa.callgraph.impl.Everywhere; +import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod; +import com.ibm.wala.ipa.callgraph.impl.FakeWorldClinitMethod; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.shrikeBT.IInvokeInstruction; +import com.ibm.wala.ssa.DefUse; +import com.ibm.wala.ssa.IR; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.collections.ComposedIterator; +import com.ibm.wala.util.collections.EmptyIterator; +import com.ibm.wala.util.collections.Filter; +import com.ibm.wala.util.collections.FilterIterator; +import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.collections.Iterator2Collection; +import com.ibm.wala.util.collections.IteratorUtil; +import com.ibm.wala.util.collections.MapIterator; +import com.ibm.wala.util.collections.NonNullSingletonIterator; +import com.ibm.wala.util.functions.Function; +import com.ibm.wala.util.graph.NumberedEdgeManager; +import com.ibm.wala.util.intset.IntSet; +import com.ibm.wala.util.intset.IntSetUtil; +import com.ibm.wala.util.intset.MutableIntSet; + +public class CHACallGraph extends BasicCallGraph { + private final IClassHierarchy cha; + private final AnalysisOptions options; + private final AnalysisCache cache; + + private boolean isInitialized = false; + + private class CHANode extends NodeImpl { + + protected CHANode(IMethod method, Context C) { + super(method, C); + } + + public IR getIR() { + assert false; + return null; + } + + public DefUse getDU() { + assert false; + return null; + } + + public Iterator iterateNewSites() { + assert false; + return null; + } + + public Iterator iterateCallSites() { + return getInterpreter(this).iterateCallSites(this); + } + + @Override + public boolean equals(Object obj) { + return obj.getClass()==getClass() && getMethod().equals(((CHANode)obj).getMethod()); + } + + @Override + public int hashCode() { + return getMethod().hashCode(); + } + + @Override + public boolean addTarget(CallSiteReference reference, CGNode target) { + return false; + } + + } + + public CHACallGraph(IClassHierarchy cha) { + this.cha = cha; + this.options = new AnalysisOptions(); + this.cache = new AnalysisCache(); + setInterpreter(new ContextInsensitiveCHAContextInterpreter()); + } + + public void init(Iterable entrypoints) throws CancelException { + super.init(); + + CGNode root = getFakeRootNode(); + int programCounter = 0; + for(Entrypoint e : entrypoints) { + root.addTarget(e.makeSite(programCounter++), null); + } + closure(root, true); + isInitialized = true; + } + + public IClassHierarchy getClassHierarchy() { + return cha; + } + + private Iterator getPossibleTargets(CallSiteReference site) { + if (site.isDispatch()) { + return cha.getPossibleTargets(site.getDeclaredTarget()).iterator(); + } else { + IMethod m = cha.resolveMethod(site.getDeclaredTarget()); + if (m != null) { + return new NonNullSingletonIterator(m); + } else { + return EmptyIterator.instance(); + } + } + } + + public Set getPossibleTargets(CGNode node, CallSiteReference site) { + return Iterator2Collection.toSet( + new MapIterator( + new FilterIterator( + getPossibleTargets(site), + new Filter() { + public boolean accepts(IMethod o) { + return !o.isAbstract(); + } + } + ), + new Function() { + public CGNode apply(IMethod object) { + try { + return findOrCreateNode(object, Everywhere.EVERYWHERE); + } catch (CancelException e) { + assert false : e.toString(); + return null; + } + } + })); + } + + public int getNumberOfTargets(CGNode node, CallSiteReference site) { + return IteratorUtil.count(getPossibleTargets(site)); + } + + public Iterator getPossibleSites(final CGNode src, final CGNode target) { + return + new FilterIterator(getInterpreter(src).iterateCallSites(src), + new Filter() { + public boolean accepts(CallSiteReference o) { + return getPossibleTargets(src, o).contains(target); + } + }); + } + + private class CHARootNode extends CHANode { + private final Set calls = HashSetFactory.make(); + + protected CHARootNode(IMethod method, Context C) { + super(method, C); + } + + @Override + public Iterator iterateCallSites() { + return calls.iterator(); + } + + @Override + public boolean addTarget(CallSiteReference reference, CGNode target) { + return calls.add(reference); + } + } + + @Override + protected CGNode makeFakeRootNode() throws CancelException { + return new CHARootNode(new FakeRootMethod(cha, options, cache), Everywhere.EVERYWHERE); + } + + @Override + protected CGNode makeFakeWorldClinitNode() throws CancelException { + return new CHARootNode(new FakeWorldClinitMethod(cha, options, cache), Everywhere.EVERYWHERE); + } + + private void closure(CGNode n, boolean fromRoot) throws CancelException { + for(Iterator sites = n.iterateCallSites(); sites.hasNext(); ) { + Iterator methods = getPossibleTargets(sites.next()); + while (methods.hasNext()) { + IMethod target = methods.next(); + if (!target.isAbstract()) { + CGNode callee = getNode(target, Everywhere.EVERYWHERE); + if (callee == null) { + callee = findOrCreateNode(target, Everywhere.EVERYWHERE); + if (fromRoot) { + registerEntrypoint(callee); + } + } + } + } + } + } + + private int clinitPC = 0; + + @Override + public CGNode findOrCreateNode(IMethod method, Context C) throws CancelException { + assert C.equals(Everywhere.EVERYWHERE); + assert !method.isAbstract(); + + CGNode n = getNode(method, C); + if (n == null) { + assert !isInitialized; + n = makeNewNode(method, C); + + IMethod clinit = method.getDeclaringClass().getClassInitializer(); + if (clinit != null && getNode(clinit, Everywhere.EVERYWHERE) == null) { + CGNode cln = makeNewNode(clinit, Everywhere.EVERYWHERE); + CGNode clinits = getFakeWorldClinitNode(); + clinits.addTarget(CallSiteReference.make(clinitPC++, clinit.getReference(), IInvokeInstruction.Dispatch.STATIC), cln); + } + } + return n; + } + + private CGNode makeNewNode(IMethod method, Context C) throws CancelException { + CGNode n; + Key k = new Key(method, C); + n = new CHANode(method, C); + registerNode(k, n); + closure(n, false); + return n; + } + + @Override + protected NumberedEdgeManager getEdgeManager() { + return new NumberedEdgeManager() { + private final Map>> predecessors = HashMapFactory.make(); + + private Set getPreds(CGNode n) { + if (predecessors.containsKey(n) && predecessors.get(n).get() != null) { + return predecessors.get(n).get(); + } else { + Set preds = HashSetFactory.make(); + for(CGNode node : CHACallGraph.this) { + if (getPossibleSites(node, n).hasNext()) { + preds.add(node); + } + } + predecessors.put(n, new SoftReference>(preds)); + return preds; + } + } + + public Iterator getPredNodes(CGNode n) { + return getPreds(n).iterator(); + } + + public int getPredNodeCount(CGNode n) { + return getPreds(n).size(); + } + + public Iterator getSuccNodes(final CGNode n) { + return new FilterIterator(new ComposedIterator(n.iterateCallSites()) { + @Override + public Iterator makeInner(CallSiteReference outer) { + return getPossibleTargets(n, outer).iterator(); + } + }, + new Filter() { + private final MutableIntSet nodes = IntSetUtil.make(); + public boolean accepts(CGNode o) { + if (nodes.contains(o.getGraphNodeId())) { + return false; + } else { + nodes.add(o.getGraphNodeId()); + return true; + } + } + }); + } + + public int getSuccNodeCount(CGNode N) { + return IteratorUtil.count(getSuccNodes(N)); + } + + public void addEdge(CGNode src, CGNode dst) { + assert false; + } + + public void removeEdge(CGNode src, CGNode dst) throws UnsupportedOperationException { + assert false; + } + + public void removeAllIncidentEdges(CGNode node) throws UnsupportedOperationException { + assert false; + } + + public void removeIncomingEdges(CGNode node) throws UnsupportedOperationException { + assert false; + } + + public void removeOutgoingEdges(CGNode node) throws UnsupportedOperationException { + assert false; + } + + public boolean hasEdge(CGNode src, CGNode dst) { + return getPossibleSites(src, dst).hasNext(); + } + + public IntSet getSuccNodeNumbers(CGNode node) { + MutableIntSet result = IntSetUtil.make(); + for(Iterator ss = getSuccNodes(node); ss.hasNext(); ) { + result.add(ss.next().getGraphNodeId()); + } + return result; + } + + public IntSet getPredNodeNumbers(CGNode node) { + MutableIntSet result = IntSetUtil.make(); + for(Iterator ss = getPredNodes(node); ss.hasNext(); ) { + result.add(ss.next().getGraphNodeId()); + } + return result; + } + + }; + } + +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHAContextInterpreter.java new file mode 100644 index 000000000..c6ca08d66 --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHAContextInterpreter.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2007 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.ipa.callgraph.cha; + +import java.util.Iterator; + +import com.ibm.wala.classLoader.CallSiteReference; +import com.ibm.wala.ipa.callgraph.CGNode; + +public interface CHAContextInterpreter { + + /** + * Does this object understand the given method? The caller had better check this before inquiring on other properties. + */ + public boolean understands(CGNode node); + + /** + * @return an Iterator of the call statements that may execute in a given method for a given context + */ + public abstract Iterator iterateCallSites(CGNode node); + +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java new file mode 100644 index 000000000..fe2321fbd --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2007 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.ipa.callgraph.cha; + +import java.util.Iterator; + +import com.ibm.wala.classLoader.CallSiteReference; +import com.ibm.wala.classLoader.CodeScanner; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.shrikeCT.InvalidClassFileException; +import com.ibm.wala.util.debug.Assertions; + +public class ContextInsensitiveCHAContextInterpreter implements CHAContextInterpreter { + + public boolean understands(CGNode node) { + return true; + } + + public Iterator iterateCallSites(CGNode node) { + if (node == null) { + throw new IllegalArgumentException("node is null"); + } + try { + return CodeScanner.getCallSites(node.getMethod()).iterator(); + } catch (InvalidClassFileException e) { + e.printStackTrace(); + Assertions.UNREACHABLE(); + return null; + } + } + +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java index f2c1f6ad9..fadca3c22 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java @@ -23,7 +23,6 @@ import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.propagation.ReceiverInstanceContext; -import com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.shrikeBT.IInvokeInstruction; import com.ibm.wala.types.MethodReference; @@ -42,7 +41,7 @@ import com.ibm.wala.util.graph.traverse.DFS; /** * Basic data structure support for a call graph. */ -public abstract class BasicCallGraph extends AbstractNumberedGraph implements CallGraph { +public abstract class BasicCallGraph extends AbstractNumberedGraph implements CallGraph { private static final boolean DEBUG = false; @@ -61,7 +60,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph imple /** * An object that handles context interpreter functions */ - private SSAContextInterpreter interpreter; + private T interpreter; /** * Set of nodes that are entrypoints for this analysis @@ -81,7 +80,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph imple * * TODO: this is a bit redundant with the nodes Map. Restructure these data structures for space efficiency. */ - final private Map> mr2Nodes = HashMapFactory.make(); + protected final Map> mr2Nodes = HashMapFactory.make(); public BasicCallGraph() { super(); @@ -303,7 +302,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph imple * @param node a call graph node we want information about * @return an object that knows how to interpret information about the node */ - protected SSAContextInterpreter getInterpreter(CGNode node) { + protected T getInterpreter(CGNode node) { if (interpreter == null) { throw new IllegalStateException("must register an interpreter for this call graph"); } @@ -344,7 +343,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph imple return getNode(N.getMethod(), N.getContext()) != null; } - public void setInterpreter(SSAContextInterpreter interpreter) { + public void setInterpreter(T interpreter) { this.interpreter = interpreter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java index 62d25d789..275f61f6e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java @@ -23,6 +23,7 @@ import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.Context; +import com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.shrikeBT.BytecodeConstants; import com.ibm.wala.ssa.DefUse; @@ -50,7 +51,7 @@ import com.ibm.wala.util.intset.SparseIntSet; /** * A call graph which explicitly holds the target for each call site in each node. */ -public class ExplicitCallGraph extends BasicCallGraph implements BytecodeConstants { +public class ExplicitCallGraph extends BasicCallGraph implements BytecodeConstants { protected final IClassHierarchy cha; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java index 0abca5ba6..901c6743f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java @@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.cha.ContextInsensitiveCHAContextInterpreter; import com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter; import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.types.FieldReference; @@ -27,7 +28,7 @@ import com.ibm.wala.util.debug.Assertions; /** * Default implementation of MethodContextInterpreter for context-insensitive analysis */ -public abstract class ContextInsensitiveRTAInterpreter implements RTAContextInterpreter, SSAContextInterpreter { +public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiveCHAContextInterpreter implements RTAContextInterpreter, SSAContextInterpreter { private final AnalysisCache analysisCache; @@ -52,19 +53,6 @@ public abstract class ContextInsensitiveRTAInterpreter implements RTAContextInte } } - public Iterator iterateCallSites(CGNode node) { - if (node == null) { - throw new IllegalArgumentException("node is null"); - } - try { - return CodeScanner.getCallSites(node.getMethod()).iterator(); - } catch (InvalidClassFileException e) { - e.printStackTrace(); - Assertions.UNREACHABLE(); - return null; - } - } - public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -91,10 +79,6 @@ public abstract class ContextInsensitiveRTAInterpreter implements RTAContextInte } } - public boolean understands(CGNode node) { - return true; - } - public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/RTAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/RTAContextInterpreter.java index 20bfd318f..971d3c041 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/RTAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/RTAContextInterpreter.java @@ -12,31 +12,22 @@ package com.ibm.wala.ipa.callgraph.propagation.rta; import java.util.Iterator; -import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.cha.CHAContextInterpreter; import com.ibm.wala.types.FieldReference; /** * This object will analyze a method in a context and return information needed for RTA. */ -public interface RTAContextInterpreter { - /** - * Does this object understand the given method? The caller had better check this before inquiring on other properties. - */ - public boolean understands(CGNode node); +public interface RTAContextInterpreter extends CHAContextInterpreter { /** * @return an Iterator of the types that may be allocated by a given method in a given context. */ public abstract Iterator iterateNewSites(CGNode node); - /** - * @return an Iterator of the call statements that may execute in a given method for a given context - */ - public abstract Iterator iterateCallSites(CGNode node); - /** * @return iterator of FieldReference */ diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java index 703bce2da..231e6e773 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java @@ -389,7 +389,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the set of IMethods that this call can resolve to. * @throws IllegalArgumentException if ref is null */ - public Collection getPossibleTargets(MethodReference ref) { + public Set getPossibleTargets(MethodReference ref) { if (ref == null) { throw new IllegalArgumentException("ref is null"); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java index 3ac22de70..1730b76ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java @@ -52,7 +52,7 @@ public interface IClassHierarchy extends Iterable { * @return the set of IMethods that this call can resolve to. * @throws IllegalArgumentException if ref is null */ - public Collection getPossibleTargets(MethodReference ref); + public Set getPossibleTargets(MethodReference ref); /** * Find the possible targets of a call to a method reference where the receiver is of a certain type diff --git a/com.ibm.wala.ide.jsdt.tests/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jsdt.tests/META-INF/MANIFEST.MF index 6a398529e..a0b2ac609 100644 --- a/com.ibm.wala.ide.jsdt.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jsdt.tests/META-INF/MANIFEST.MF @@ -9,7 +9,7 @@ Require-Bundle: com.ibm.wala.core;bundle-version="1.1.3", com.ibm.wala.cast.js;bundle-version="1.0.0", com.ibm.wala.cast.js.rhino;bundle-version="1.0.0", com.ibm.wala.ide.jsdt;bundle-version="1.0.0", - org.eclipse.wst.jsdt.core;bundle-version="1.1.202", + org.eclipse.wst.jsdt.core, org.eclipse.equinox.common;bundle-version="3.6.100", com.ibm.wala.ide.tests;bundle-version="1.1.3", org.eclipse.core.runtime;bundle-version="3.8.0" diff --git a/com.ibm.wala.ide.jsdt.tests/launchers/JSProjectScopeTest.launch b/com.ibm.wala.ide.jsdt.tests/launchers/JSProjectScopeTest.launch index 7752ae2e4..ae1c3177c 100644 --- a/com.ibm.wala.ide.jsdt.tests/launchers/JSProjectScopeTest.launch +++ b/com.ibm.wala.ide.jsdt.tests/launchers/JSProjectScopeTest.launch @@ -26,7 +26,7 @@ - + diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java index e3369a6cd..71e9cfc05 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java @@ -114,7 +114,7 @@ public class EclipseTestUtil { IPath path = new Path("testdata").append(filename); URL url = FileLocator.find(bundle, path, null); - assert url != null; + assert url != null : bundle.toString() + " path " + path.toString(); try { URL fileURL = FileLocator.toFileURL(url); File file = new File(fileURL.getPath()); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java index 48ab315d2..56b46277c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java @@ -31,7 +31,7 @@ public abstract class ComposedIterator implements Iterator { break; } } - if (!inner.hasNext()) { + if (inner != null && !inner.hasNext()) { inner = null; } } From fa14d7a73dd1a62e57b21105e3cfa19c9b14908b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 8 Apr 2013 10:51:25 -0700 Subject: [PATCH 046/187] Require that gen'd vector contains 0. fixes #8 --- .../com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java index e3e03eba6..b3ecb23be 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java @@ -14,17 +14,20 @@ import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.SparseIntSet; /** - * A function which gens a vector of outgoing dataflow facts + * A function which gens a vector of outgoing dataflow facts. */ public class VectorGenFlowFunction implements IReversibleFlowFunction { private final IntSet gen; /** - * @param gen the intset of facts which are gen'ned by this flow function + * @param gen + * the intset of facts which are gen'ned by this flow function. gen + * must contain 0. */ private VectorGenFlowFunction(IntSet gen) { this.gen = gen; + assert gen.contains(0); } public IntSet getTargets(int i) { From 9549da995485476c2380da32a30277186b40f347 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 8 Apr 2013 13:50:26 -0700 Subject: [PATCH 047/187] read runtime-visible annotations for fields --- .../src/annotations/AnnotatedClass4.java | 21 +++++++++++ .../wala/core/tests/ir/AnnotationTest.java | 20 ++++++++++ .../com/ibm/wala/classLoader/ShrikeClass.java | 37 ++++++++++++++----- 3 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 com.ibm.wala.core.testdata/src/annotations/AnnotatedClass4.java diff --git a/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass4.java b/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass4.java new file mode 100644 index 000000000..e4f307862 --- /dev/null +++ b/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass4.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2008 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 annotations; + +/** + * class with annotated fields + */ +public class AnnotatedClass4 { + + @RuntimeInvisableAnnotation + @RuntimeVisableAnnotation + public static int foo; +} diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java index 3493fc8c2..aa9f1fb6f 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java @@ -10,6 +10,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IField; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.ShrikeCTMethod; import com.ibm.wala.classLoader.ShrikeClass; @@ -22,6 +23,7 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.types.ClassLoaderReference; +import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeReference; @@ -29,6 +31,7 @@ import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.config.AnalysisScopeReader; import com.ibm.wala.util.io.FileProvider; +import com.ibm.wala.util.strings.Atom; public class AnnotationTest extends WalaTestCase { @@ -142,4 +145,21 @@ public class AnnotationTest extends WalaTestCase { runtimeInvisibleAnnotations.toString()); } + + @Test + public void testClassAnnotations4() throws Exception { + + TypeReference typeRef = TypeReference.findOrCreate(ClassLoaderReference.Application, "Lannotations/AnnotatedClass4"); + FieldReference fieldRefUnderTest = FieldReference.findOrCreate(typeRef, Atom.findOrCreateUnicodeAtom("foo"), TypeReference.Int); + + IField fieldUnderTest = cha.resolveField(fieldRefUnderTest); + Assert.assertNotNull(fieldRefUnderTest.toString() + " not found", fieldUnderTest); + + Collection annots = fieldUnderTest.getAnnotations(); + Assert + .assertEquals( + "[Annotation type , Annotation type ]", + annots.toString()); + + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java index 3aee4ffc7..a5eac76ca 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java @@ -82,9 +82,10 @@ public final class ShrikeClass extends JVMClass { int accessFlags = cr.getFieldAccessFlags(i); Atom name = Atom.findOrCreateUnicodeAtom(cr.getFieldName(i)); ImmutableByteArray b = ImmutableByteArray.make(cr.getFieldType(i)); - Collection annotations = null; - annotations = getRuntimeInvisibleAnnotations(i); - annotations = annotations.isEmpty() ? null : annotations; + Collection annotations = HashSetFactory.make(); + annotations.addAll(getRuntimeInvisibleAnnotations(i)); + annotations.addAll(getRuntimeVisibleAnnotations(i)); + annotations = annotations.isEmpty() ? null : annotations; if ((accessFlags & ClassConstants.ACC_STATIC) == 0) { addFieldToList(instanceList, name, b, accessFlags, annotations); @@ -291,17 +292,24 @@ public final class ShrikeClass extends JVMClass { return result; } - private RuntimeInvisibleAnnotationsReader getRuntimeInvisibleAnnotationsReader(int fieldIndex) throws InvalidClassFileException { + private AnnotationsReader getFieldAnnotationsReader(boolean runtimeInvisible, int fieldIndex) throws InvalidClassFileException { ClassReader.AttrIterator iter = new AttrIterator(); reader.get().initFieldAttributeIterator(fieldIndex, iter); // search for the desired attribute - RuntimeInvisibleAnnotationsReader result = null; + AnnotationsReader result = null; try { for (; iter.isValid(); iter.advance()) { - if (iter.getName().toString().equals("RuntimeInvisibleAnnotations")) { - result = new RuntimeInvisibleAnnotationsReader(iter); - break; + if (runtimeInvisible) { + if (iter.getName().equals(RuntimeInvisibleAnnotationsReader.attrName)) { + result = new RuntimeInvisibleAnnotationsReader(iter); + break; + } + } else { + if (iter.getName().equals(RuntimeVisibleAnnotationsReader.attrName)) { + result = new RuntimeVisibleAnnotationsReader(iter); + break; + } } } } catch (InvalidClassFileException e) { @@ -314,7 +322,18 @@ public final class ShrikeClass extends JVMClass { * read the runtime-invisible annotations from the class file */ public Collection getRuntimeInvisibleAnnotations(int fieldIndex) throws InvalidClassFileException { - RuntimeInvisibleAnnotationsReader r = getRuntimeInvisibleAnnotationsReader(fieldIndex); + return getFieldAnnotations(fieldIndex, true); + } + + /** + * read the runtime-invisible annotations from the class file + */ + public Collection getRuntimeVisibleAnnotations(int fieldIndex) throws InvalidClassFileException { + return getFieldAnnotations(fieldIndex, false); + } + + protected Collection getFieldAnnotations(int fieldIndex, boolean runtimeInvisible) throws InvalidClassFileException { + AnnotationsReader r = getFieldAnnotationsReader(runtimeInvisible, fieldIndex); return Annotation.getAnnotationsFromReader(r, getClassLoader().getReference()); } From d137143ecf2bce5abe7dcdb5eeaead4bef936373 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Mon, 8 Apr 2013 17:08:32 -0500 Subject: [PATCH 048/187] warning on SSAInstruction equals() --- com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java index 302190344..9f58a5802 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java @@ -252,6 +252,12 @@ public abstract class SSAInstruction { /** * We assume these instructions are canonical and managed by a governing IR object. Be careful. * + * Depending on the caching policy (see {@link com.ibm.wala.ssa.SSACache}), the governing IR may be deleted + * to reclaim memory and recomputed as needed. When an IR is recomputed, it also creates fresh SSAInstruction + * objects that will not equal old ones. Thus, do not compare for identity SSAInstructions obtained from + * distinct calls that retrieve cached values (e.g. distinct CGNode.getIR() calls). + * See the github issue for details. + * * @see java.lang.Object#equals(java.lang.Object) */ @Override From a7195852b1b6461e3fd80a862f0c9ebccde78417 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 9 Apr 2013 10:01:19 -0700 Subject: [PATCH 049/187] don't cache synthetic method IR / DU in ExplicitNodes --- .../wala/ipa/callgraph/impl/ExplicitCallGraph.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java index 7a1fa7f9a..ed3f15382 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java @@ -32,12 +32,16 @@ import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.ISSABasicBlock; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.Predicate; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.collections.Filter; import com.ibm.wala.util.collections.FilterIterator; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.IntMapIterator; +import com.ibm.wala.util.collections.Iterator2Collection; +import com.ibm.wala.util.collections.Iterator2List; import com.ibm.wala.util.collections.SparseVector; +import com.ibm.wala.util.collections.Util; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.functions.IntFunction; import com.ibm.wala.util.graph.NumberedEdgeManager; @@ -298,6 +302,11 @@ public class ExplicitCallGraph extends BasicCallGraph imp } public IR getIR() { + if (getMethod().isSynthetic()) { + // disable local cache in this case, as context interpreters + // do weird things like mutate IRs + return getCallGraph().getInterpreter(this).getIR(this); + } IR ir = this.ir.get(); if (ir == null) { ir = getCallGraph().getInterpreter(this).getIR(this); @@ -307,6 +316,11 @@ public class ExplicitCallGraph extends BasicCallGraph imp } public DefUse getDU() { + if (getMethod().isSynthetic()) { + // disable local cache in this case, as context interpreters + // do weird things like mutate IRs + return getCallGraph().getInterpreter(this).getDU(this); + } DefUse du = this.du.get(); if (du == null) { du = getCallGraph().getInterpreter(this).getDU(this); From 368daf942719aa7f7461919c9863d1a664061722 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 9 Apr 2013 14:16:01 -0700 Subject: [PATCH 050/187] organize imports --- .../com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java index ed3f15382..93d388234 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java @@ -32,16 +32,12 @@ import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.ISSABasicBlock; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.util.CancelException; -import com.ibm.wala.util.Predicate; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.collections.Filter; import com.ibm.wala.util.collections.FilterIterator; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.IntMapIterator; -import com.ibm.wala.util.collections.Iterator2Collection; -import com.ibm.wala.util.collections.Iterator2List; import com.ibm.wala.util.collections.SparseVector; -import com.ibm.wala.util.collections.Util; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.functions.IntFunction; import com.ibm.wala.util.graph.NumberedEdgeManager; From 11c6619c7f1791d00e8ba2de464f81b61aa680f9 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 9 Apr 2013 15:47:22 -0700 Subject: [PATCH 051/187] Variety of changes to JS front end. - crash fixes - small enhancements to prologue and preamble - tighter handling of timeouts during CG construction --- .../java/loader/JavaSourceLoaderImpl.java | 6 +- .../TestCorrelatedPairExtractionRhino.java | 9 +- .../js/test/TestForInBodyExtractionRhino.java | 9 +- .../test/TestSimpleCallGraphShapeRhino.java | 25 +- .../TestSimplePageCallGraphShapeRhino.java | 13 +- ...tSimplePageCallGraphShapeRhinoJericho.java | 12 +- .../ibm/wala/cast/js/vis/JsViewerDriver.java | 6 +- .../js/translator/CAstRhinoTranslator.java | 2 +- .../js/translator/RhinoToAstTranslator.java | 37 +- .../examples-src/pages/garbage.html | 3 + .../examples-src/pages/garbage2.html | 5 + .../examples-src/tests/dead.js | 13 + .../examples-src/tests/many-strings.js | 50010 ++++++++++++++++ .../examples-src/tests/parse_error.js | 1 + .../cast/js/test/JSCallGraphBuilderUtil.java | 40 +- .../js/test/TestAjaxsltCallGraphShape.java | 5 +- .../cast/js/test/TestArgumentSensitivity.java | 3 +- .../wala/cast/js/test/TestForInLoopHack.java | 21 +- .../wala/cast/js/test/TestJQueryExamples.java | 3 +- .../wala/cast/js/test/TestLexicalModRef.java | 12 +- .../js/test/TestMediawikiCallGraphShape.java | 3 +- .../js/test/TestSimpleCallGraphShape.java | 133 +- .../js/test/TestSimplePageCallGraphShape.java | 35 +- .../ibm/wala/cast/js/test/TestWebUtil.java | 5 +- com.ibm.wala.cast.js/.project | 2 + com.ibm.wala.cast.js/dat/preamble.js | 172 +- com.ibm.wala.cast.js/dat/prologue.js | 20 + .../cast/js/html/CompositeFileMapping.java | 29 +- .../cast/js/html/DefaultSourceExtractor.java | 32 +- .../cast/js/html/DomLessSourceExtractor.java | 44 +- .../wala/cast/js/html/EmptyFileMapping.java | 19 + .../ibm/wala/cast/js/html/IHtmlParser.java | 5 +- .../wala/cast/js/html/JSSourceExtractor.java | 8 +- .../com/ibm/wala/cast/js/html/WebUtil.java | 18 +- .../js/html/jericho/JerichoHtmlParser.java | 76 +- .../ipa/callgraph/ForInContextSelector.java | 35 +- .../js/ipa/callgraph/JSCallGraphUtil.java | 26 +- .../JSSSAPropagationCallGraphBuilder.java | 18 + .../correlations/CorrelationFinder.java | 15 +- .../wala/cast/js/loader/JavaScriptLoader.java | 15 +- .../com/ibm/wala/cast/js/util/Util.java | 5 +- .../ibm/wala/cast/ir/ssa/SSAConversion.java | 8 +- .../cast/ir/translator/AstTranslator.java | 130 +- .../cast/ir/translator/TranslatorToCAst.java | 15 +- .../cast/loader/AstDynamicPropertyClass.java | 7 + .../com/ibm/wala/cast/loader/AstField.java | 11 +- .../com/ibm/wala/cast/loader/AstMethod.java | 12 +- .../cast/loader/CAstAbstractModuleLoader.java | 16 +- .../com/ibm/wala/cast/tree/CAstEntity.java | 1 + .../ibm/wala/cast/tree/visit/CAstVisitor.java | 23 +- .../ibm/wala/ipa/callgraph/ContextKey.java | 454 +- .../SSAPropagationCallGraphBuilder.java | 2 +- 52 files changed, 51333 insertions(+), 296 deletions(-) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/pages/garbage2.html create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/dead.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/many-strings.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/parse_error.js create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java 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 7bb538dc6..a8187e56c 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 @@ -182,7 +182,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { private JavaField(CAstEntity fieldEntity, IClassLoader loader, IClass declaringClass) { super(FieldReference.findOrCreate(declaringClass.getReference(), Atom.findOrCreateUnicodeAtom(fieldEntity.getName()), TypeReference.findOrCreate(loader.getReference(), TypeName.string2TypeName(fieldEntity.getType().getName()))), - fieldEntity.getQualifiers(), declaringClass, declaringClass.getClassHierarchy()); + fieldEntity.getQualifiers(), declaringClass, declaringClass.getClassHierarchy(), null); } } @@ -200,14 +200,14 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { public JavaEntityMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(owner, methodEntity.getQualifiers(), cfg, symtab, MethodReference.findOrCreate(owner.getReference(), Util - .methodEntityToSelector(methodEntity)), hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo); + .methodEntityToSelector(methodEntity)), hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo, null); this.parameterTypes = computeParameterTypes(methodEntity); this.exceptionTypes = computeExceptionTypes(methodEntity); } public JavaEntityMethod(CAstEntity methodEntity, IClass owner) { super(owner, methodEntity.getQualifiers(), MethodReference.findOrCreate(owner.getReference(), Util - .methodEntityToSelector(methodEntity))); + .methodEntityToSelector(methodEntity)), null); this.parameterTypes = computeParameterTypes(methodEntity); this.exceptionTypes = computeExceptionTypes(methodEntity); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index ba9575b6c..3f6d96c3a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.test; import java.io.IOException; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; @@ -27,7 +28,13 @@ public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtract protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); - CAstEntity entity = translator.translateToCAst(); + CAstEntity entity = null; + try { + entity = translator.translateToCAst(); + } catch (Error e) { + e.printStackTrace(); + assert false; + } return entity; } } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java index 22fcf1073..1726083d3 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.test; import java.io.IOException; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; @@ -21,7 +22,13 @@ import com.ibm.wala.classLoader.SourceModule; public class TestForInBodyExtractionRhino extends TestForInBodyExtraction { protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); - CAstEntity entity = translator.translateToCAst(); + CAstEntity entity = null; + try { + entity = translator.translateToCAst(); + } catch (Error e) { + e.printStackTrace(); + assert false; + } return entity; } } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java index d8a44ea6c..323fa5eb8 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java @@ -17,8 +17,11 @@ import org.junit.Test; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { @@ -32,7 +35,7 @@ public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { } @Test - public void test214631() throws IOException, IllegalArgumentException, CancelException { + public void test214631() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "214631.js"); b.makeCallGraph(b.getOptions()); PointerAnalysis PA = b.getPointerAnalysis(); @@ -41,33 +44,41 @@ public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { } @Test - public void testRewriterDoesNotChangeLablesBug() throws IOException, IllegalArgumentException, CancelException { + public void testRewriterDoesNotChangeLablesBug() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "rewrite_does_not_change_lables_bug.js"); // all we need is for it to finish building CG successfully. } @Test - public void testRepr() throws IllegalArgumentException, IOException, CancelException { + public void testRepr() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "repr.js"); } @Test - public void testTranslateToCAstCrash1() throws IllegalArgumentException, IOException, CancelException { + public void testTranslateToCAstCrash1() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "rhino_crash1.js"); } @Test - public void testTranslateToCAstCrash2() throws IllegalArgumentException, IOException, CancelException { + public void testTranslateToCAstCrash2() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "rhino_crash2.js"); } @Test - public void testTranslateToCAstCrash3() throws IllegalArgumentException, IOException, CancelException { + public void testTranslateToCAstCrash3() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "rhino_crash3.js"); } @Test - public void testNonLoopBreakLabel() throws IllegalArgumentException, IOException, CancelException { + public void testNonLoopBreakLabel() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "non_loop_break.js"); } + + @Test(expected = WalaException.class) + public void testParseError() throws IllegalArgumentException, IOException, CancelException, WalaException { + PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "portal-example-simple.html"); + B.makeCallGraph(B.getOptions()); + Util.checkForFrontEndErrors(B.getClassHierarchy()); + } + } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java index ff7b48592..1f2fe8455 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java @@ -20,9 +20,12 @@ import com.ibm.wala.cast.js.html.IHtmlParser; import com.ibm.wala.cast.js.html.IHtmlParserFactory; import com.ibm.wala.cast.js.html.JSSourceExtractor; import com.ibm.wala.cast.js.html.WebUtil; +import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public abstract class TestSimplePageCallGraphShapeRhino extends TestSimplePageCallGraphShape { @@ -31,12 +34,20 @@ public abstract class TestSimplePageCallGraphShapeRhino extends TestSimplePageCa new Object[] { "page3.html", new String[] { "page3.html/__WINDOW_MAIN__" } } }; - @Test public void testPage3() throws IOException, IllegalArgumentException, CancelException { + @Test public void testPage3() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/page3.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage3); } + @Test(expected = WalaException.class) + public void testJSParseError() throws IOException, IllegalArgumentException, CancelException, WalaException { + URL url = getClass().getClassLoader().getResource("pages/garbage2.html"); + JSCFABuilder B = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); + B.makeCallGraph(B.getOptions()); + Util.checkForFrontEndErrors(B.getClassHierarchy()); + } + public static void main(String[] args) { justThisTest(TestSimplePageCallGraphShapeRhino.class); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java index 8e1744298..635c06b52 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java @@ -7,18 +7,28 @@ import org.junit.Test; import com.ibm.wala.cast.js.html.IHtmlParser; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; +import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public class TestSimplePageCallGraphShapeRhinoJericho extends TestSimplePageCallGraphShapeRhino { - @Test public void testCrawl() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawl() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, null); } + @Test public void testParseError() throws IOException, IllegalArgumentException, CancelException, WalaException { + URL url = getClass().getClassLoader().getResource("pages/garbage.html"); + JSCFABuilder B = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); + B.makeCallGraph(B.getOptions()); + Util.checkForFrontEndErrors(B.getClassHierarchy()); + } + public static void main(String[] args) { justThisTest(TestSimplePageCallGraphShapeRhinoJericho.class); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java index f6de71dad..a2f489180 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java @@ -5,6 +5,7 @@ import java.net.URL; import java.util.Set; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.DefaultSourceExtractor; import com.ibm.wala.cast.js.html.DomLessSourceExtractor; import com.ibm.wala.cast.js.html.IdentityUrlResolver; @@ -23,9 +24,10 @@ import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public class JsViewerDriver extends JSCallGraphBuilderUtil { - public static void main(String args[]) throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException { + public static void main(String args[]) throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException, Error, WalaException { if (args.length != 1){ System.out.println("Usage: "); @@ -51,7 +53,7 @@ public class JsViewerDriver extends JSCallGraphBuilderUtil { } private static SourceModule[] getSources(boolean domless, URL url) - throws IOException { + throws IOException, Error { JSSourceExtractor sourceExtractor; if (domless ){ sourceExtractor = new DomLessSourceExtractor(); diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java index 411731aea..d4659b119 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java @@ -40,7 +40,7 @@ public class CAstRhinoTranslator implements TranslatorToCAst { rewriters.add(factory); } - public CAstEntity translateToCAst() throws IOException { + public CAstEntity translateToCAst() throws IOException, Error { String N; if (M instanceof SourceFileModule) { N = ((SourceFileModule) M).getClassName(); 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 8722ee8b1..b4bce4f9e 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 @@ -10,6 +10,7 @@ *****************************************************************************/ package com.ibm.wala.cast.js.translator; +import java.io.IOException; import java.io.Reader; import java.net.URL; import java.util.ArrayList; @@ -20,6 +21,8 @@ import java.util.List; import java.util.Map; import org.mozilla.javascript.CompilerEnvirons; +import org.mozilla.javascript.ErrorReporter; +import org.mozilla.javascript.EvaluatorException; import org.mozilla.javascript.Node; import org.mozilla.javascript.Parser; import org.mozilla.javascript.Token; @@ -83,8 +86,8 @@ import org.mozilla.javascript.ast.XmlPropRef; import org.mozilla.javascript.ast.XmlRef; import org.mozilla.javascript.ast.XmlString; import org.mozilla.javascript.ast.Yield; -import org.mozilla.javascript.tools.ToolErrorReporter; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.DoLoopTranslator; import com.ibm.wala.cast.js.html.MappedSourceModule; import com.ibm.wala.cast.js.ipa.callgraph.JSSSAPropagationCallGraphBuilder; @@ -105,6 +108,7 @@ import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.debug.Assertions; +import com.ibm.wala.util.warnings.Warning; public class RhinoToAstTranslator { @@ -2248,9 +2252,32 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { /** * parse the JavaScript code using Rhino, and then translate the resulting AST * to CAst + * @throws com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error */ - public CAstEntity translateToCAst() throws java.io.IOException { - ToolErrorReporter reporter = new ToolErrorReporter(true); + public CAstEntity translateToCAst() throws Error, IOException, com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error { + class CAstErrorReporter implements ErrorReporter { + private Warning w = null; + + public void error(final String arg0, final String arg1, final int arg2, final String arg3, int arg4) { + w = new Warning(Warning.SEVERE) { + @Override + public String getMsg() { + return arg0 + ": " + arg1 + "@" + arg2 + ": " + arg3; + } + }; + } + + public EvaluatorException runtimeError(String arg0, String arg1, int arg2, String arg3, int arg4) { + error(arg0, arg1, arg2, arg3, arg4); + return null; + } + + public void warning(String arg0, String arg1, int arg2, String arg3, int arg4) { + // ignore warnings + } + }; + + CAstErrorReporter reporter = new CAstErrorReporter(); CompilerEnvirons compilerEnv = new CompilerEnvirons(); compilerEnv.setErrorReporter(reporter); compilerEnv.setReservedKeywordAsIdentifier(true); @@ -2264,6 +2291,10 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { AstRoot top = P.parse(sourceReader, scriptName, 1); + if (reporter.w != null) { + throw new TranslatorToCAst.Error(reporter.w); + } + final FunctionContext child = new ScriptContext(new RootContext(), top, top.getSourceName()); TranslatingVisitor tv = new TranslatingVisitor(); List body = new ArrayList(); diff --git a/com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html b/com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html new file mode 100644 index 000000000..6d2c18811 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/pages/garbage.html @@ -0,0 +1,3 @@ +#$ +>>> +this is so not a valid JS program! + + diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/dead.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/dead.js new file mode 100644 index 000000000..2d4476c29 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/dead.js @@ -0,0 +1,13 @@ +function twoReturns(x) { + if (x != 0) { + return 1; + } else { + return 2; + } + if (x > 7) { + x++; + } + return -1; +} + +twoReturns(7); diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/many-strings.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/many-strings.js new file mode 100644 index 000000000..9a1ae3458 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/many-strings.js @@ -0,0 +1,50010 @@ +function fold(arr, f) { + for(var i = 0; i < arr.length; i++) { + for(var j = 0; j < arr.length; j++) { + f(arr[i], arr[j]); + } + } +} + +var strs = ["A", +"a", +"aa", +"aal", +"aalii", +"aam", +"Aani", +"aardvark", +"aardwolf", +"Aaron", +"Aaronic", +"Aaronical", +"Aaronite", +"Aaronitic", +"Aaru", +"Ab", +"aba", +"Ababdeh", +"Ababua", +"abac", +"abaca", +"abacate", +"abacay", +"abacinate", +"abacination", +"abaciscus", +"abacist", +"aback", +"abactinal", +"abactinally", +"abaction", +"abactor", +"abaculus", +"abacus", +"Abadite", +"abaff", +"abaft", +"abaisance", +"abaiser", +"abaissed", +"abalienate", +"abalienation", +"abalone", +"Abama", +"abampere", +"abandon", +"abandonable", +"abandoned", +"abandonedly", +"abandonee", +"abandoner", +"abandonment", +"Abanic", +"Abantes", +"abaptiston", +"Abarambo", +"Abaris", +"abarthrosis", +"abarticular", +"abarticulation", +"abas", +"abase", +"abased", +"abasedly", +"abasedness", +"abasement", +"abaser", +"Abasgi", +"abash", +"abashed", +"abashedly", +"abashedness", +"abashless", +"abashlessly", +"abashment", +"abasia", +"abasic", +"abask", +"Abassin", +"abastardize", +"abatable", +"abate", +"abatement", +"abater", +"abatis", +"abatised", +"abaton", +"abator", +"abattoir", +"Abatua", +"abature", +"abave", +"abaxial", +"abaxile", +"abaze", +"abb", +"Abba", +"abbacomes", +"abbacy", +"Abbadide", +"abbas", +"abbasi", +"abbassi", +"Abbasside", +"abbatial", +"abbatical", +"abbess", +"abbey", +"abbeystede", +"Abbie", +"abbot", +"abbotcy", +"abbotnullius", +"abbotship", +"abbreviate", +"abbreviately", +"abbreviation", +"abbreviator", +"abbreviatory", +"abbreviature", +"Abby", +"abcoulomb", +"abdal", +"abdat", +"Abderian", +"Abderite", +"abdest", +"abdicable", +"abdicant", +"abdicate", +"abdication", +"abdicative", +"abdicator", +"Abdiel", +"abditive", +"abditory", +"abdomen", +"abdominal", +"Abdominales", +"abdominalian", +"abdominally", +"abdominoanterior", +"abdominocardiac", +"abdominocentesis", +"abdominocystic", +"abdominogenital", +"abdominohysterectomy", +"abdominohysterotomy", +"abdominoposterior", +"abdominoscope", +"abdominoscopy", +"abdominothoracic", +"abdominous", +"abdominovaginal", +"abdominovesical", +"abduce", +"abducens", +"abducent", +"abduct", +"abduction", +"abductor", +"Abe", +"abeam", +"abear", +"abearance", +"abecedarian", +"abecedarium", +"abecedary", +"abed", +"abeigh", +"Abel", +"abele", +"Abelia", +"Abelian", +"Abelicea", +"Abelite", +"abelite", +"Abelmoschus", +"abelmosk", +"Abelonian", +"abeltree", +"Abencerrages", +"abenteric", +"abepithymia", +"Aberdeen", +"aberdevine", +"Aberdonian", +"Aberia", +"aberrance", +"aberrancy", +"aberrant", +"aberrate", +"aberration", +"aberrational", +"aberrator", +"aberrometer", +"aberroscope", +"aberuncator", +"abet", +"abetment", +"abettal", +"abettor", +"abevacuation", +"abey", +"abeyance", +"abeyancy", +"abeyant", +"abfarad", +"abhenry", +"abhiseka", +"abhominable", +"abhor", +"abhorrence", +"abhorrency", +"abhorrent", +"abhorrently", +"abhorrer", +"abhorrible", +"abhorring", +"Abhorson", +"abidal", +"abidance", +"abide", +"abider", +"abidi", +"abiding", +"abidingly", +"abidingness", +"Abie", +"Abies", +"abietate", +"abietene", +"abietic", +"abietin", +"Abietineae", +"abietineous", +"abietinic", +"Abiezer", +"Abigail", +"abigail", +"abigailship", +"abigeat", +"abigeus", +"abilao", +"ability", +"abilla", +"abilo", +"abintestate", +"abiogenesis", +"abiogenesist", +"abiogenetic", +"abiogenetical", +"abiogenetically", +"abiogenist", +"abiogenous", +"abiogeny", +"abiological", +"abiologically", +"abiology", +"abiosis", +"abiotic", +"abiotrophic", +"abiotrophy", +"Abipon", +"abir", +"abirritant", +"abirritate", +"abirritation", +"abirritative", +"abiston", +"Abitibi", +"abiuret", +"abject", +"abjectedness", +"abjection", +"abjective", +"abjectly", +"abjectness", +"abjoint", +"abjudge", +"abjudicate", +"abjudication", +"abjunction", +"abjunctive", +"abjuration", +"abjuratory", +"abjure", +"abjurement", +"abjurer", +"abkar", +"abkari", +"Abkhas", +"Abkhasian", +"ablach", +"ablactate", +"ablactation", +"ablare", +"ablastemic", +"ablastous", +"ablate", +"ablation", +"ablatitious", +"ablatival", +"ablative", +"ablator", +"ablaut", +"ablaze", +"able", +"ableeze", +"ablegate", +"ableness", +"ablepharia", +"ablepharon", +"ablepharous", +"Ablepharus", +"ablepsia", +"ableptical", +"ableptically", +"abler", +"ablest", +"ablewhackets", +"ablins", +"abloom", +"ablow", +"ablude", +"abluent", +"ablush", +"ablution", +"ablutionary", +"abluvion", +"ably", +"abmho", +"Abnaki", +"abnegate", +"abnegation", +"abnegative", +"abnegator", +"Abner", +"abnerval", +"abnet", +"abneural", +"abnormal", +"abnormalism", +"abnormalist", +"abnormality", +"abnormalize", +"abnormally", +"abnormalness", +"abnormity", +"abnormous", +"abnumerable", +"Abo", +"aboard", +"Abobra", +"abode", +"abodement", +"abody", +"abohm", +"aboil", +"abolish", +"abolisher", +"abolishment", +"abolition", +"abolitionary", +"abolitionism", +"abolitionist", +"abolitionize", +"abolla", +"aboma", +"abomasum", +"abomasus", +"abominable", +"abominableness", +"abominably", +"abominate", +"abomination", +"abominator", +"abomine", +"Abongo", +"aboon", +"aborad", +"aboral", +"aborally", +"abord", +"aboriginal", +"aboriginality", +"aboriginally", +"aboriginary", +"aborigine", +"abort", +"aborted", +"aborticide", +"abortient", +"abortifacient", +"abortin", +"abortion", +"abortional", +"abortionist", +"abortive", +"abortively", +"abortiveness", +"abortus", +"abouchement", +"abound", +"abounder", +"abounding", +"aboundingly", +"about", +"abouts", +"above", +"aboveboard", +"abovedeck", +"aboveground", +"aboveproof", +"abovestairs", +"abox", +"abracadabra", +"abrachia", +"abradant", +"abrade", +"abrader", +"Abraham", +"Abrahamic", +"Abrahamidae", +"Abrahamite", +"Abrahamitic", +"abraid", +"Abram", +"Abramis", +"abranchial", +"abranchialism", +"abranchian", +"Abranchiata", +"abranchiate", +"abranchious", +"abrasax", +"abrase", +"abrash", +"abrasiometer", +"abrasion", +"abrasive", +"abrastol", +"abraum", +"abraxas", +"abreact", +"abreaction", +"abreast", +"abrenounce", +"abret", +"abrico", +"abridge", +"abridgeable", +"abridged", +"abridgedly", +"abridger", +"abridgment", +"abrim", +"abrin", +"abristle", +"abroach", +"abroad", +"Abrocoma", +"abrocome", +"abrogable", +"abrogate", +"abrogation", +"abrogative", +"abrogator", +"Abroma", +"Abronia", +"abrook", +"abrotanum", +"abrotine", +"abrupt", +"abruptedly", +"abruption", +"abruptly", +"abruptness", +"Abrus", +"Absalom", +"absampere", +"Absaroka", +"absarokite", +"abscess", +"abscessed", +"abscession", +"abscessroot", +"abscind", +"abscise", +"abscision", +"absciss", +"abscissa", +"abscissae", +"abscisse", +"abscission", +"absconce", +"abscond", +"absconded", +"abscondedly", +"abscondence", +"absconder", +"absconsa", +"abscoulomb", +"absence", +"absent", +"absentation", +"absentee", +"absenteeism", +"absenteeship", +"absenter", +"absently", +"absentment", +"absentmindedly", +"absentness", +"absfarad", +"abshenry", +"Absi", +"absinthe", +"absinthial", +"absinthian", +"absinthiate", +"absinthic", +"absinthin", +"absinthine", +"absinthism", +"absinthismic", +"absinthium", +"absinthol", +"absit", +"absmho", +"absohm", +"absolute", +"absolutely", +"absoluteness", +"absolution", +"absolutism", +"absolutist", +"absolutistic", +"absolutistically", +"absolutive", +"absolutization", +"absolutize", +"absolutory", +"absolvable", +"absolvatory", +"absolve", +"absolvent", +"absolver", +"absolvitor", +"absolvitory", +"absonant", +"absonous", +"absorb", +"absorbability", +"absorbable", +"absorbed", +"absorbedly", +"absorbedness", +"absorbefacient", +"absorbency", +"absorbent", +"absorber", +"absorbing", +"absorbingly", +"absorbition", +"absorpt", +"absorptance", +"absorptiometer", +"absorptiometric", +"absorption", +"absorptive", +"absorptively", +"absorptiveness", +"absorptivity", +"absquatulate", +"abstain", +"abstainer", +"abstainment", +"abstemious", +"abstemiously", +"abstemiousness", +"abstention", +"abstentionist", +"abstentious", +"absterge", +"abstergent", +"abstersion", +"abstersive", +"abstersiveness", +"abstinence", +"abstinency", +"abstinent", +"abstinential", +"abstinently", +"abstract", +"abstracted", +"abstractedly", +"abstractedness", +"abstracter", +"abstraction", +"abstractional", +"abstractionism", +"abstractionist", +"abstractitious", +"abstractive", +"abstractively", +"abstractiveness", +"abstractly", +"abstractness", +"abstractor", +"abstrahent", +"abstricted", +"abstriction", +"abstruse", +"abstrusely", +"abstruseness", +"abstrusion", +"abstrusity", +"absume", +"absumption", +"absurd", +"absurdity", +"absurdly", +"absurdness", +"absvolt", +"Absyrtus", +"abterminal", +"abthain", +"abthainrie", +"abthainry", +"abthanage", +"Abu", +"abu", +"abucco", +"abulia", +"abulic", +"abulomania", +"abuna", +"abundance", +"abundancy", +"abundant", +"Abundantia", +"abundantly", +"abura", +"aburabozu", +"aburban", +"aburst", +"aburton", +"abusable", +"abuse", +"abusedly", +"abusee", +"abuseful", +"abusefully", +"abusefulness", +"abuser", +"abusion", +"abusious", +"abusive", +"abusively", +"abusiveness", +"abut", +"Abuta", +"Abutilon", +"abutment", +"abuttal", +"abutter", +"abutting", +"abuzz", +"abvolt", +"abwab", +"aby", +"abysm", +"abysmal", +"abysmally", +"abyss", +"abyssal", +"Abyssinian", +"abyssobenthonic", +"abyssolith", +"abyssopelagic", +"acacatechin", +"acacatechol", +"acacetin", +"Acacia", +"Acacian", +"acaciin", +"acacin", +"academe", +"academial", +"academian", +"Academic", +"academic", +"academical", +"academically", +"academicals", +"academician", +"academicism", +"academism", +"academist", +"academite", +"academization", +"academize", +"Academus", +"academy", +"Acadia", +"acadialite", +"Acadian", +"Acadie", +"Acaena", +"acajou", +"acaleph", +"Acalepha", +"Acalephae", +"acalephan", +"acalephoid", +"acalycal", +"acalycine", +"acalycinous", +"acalyculate", +"Acalypha", +"Acalypterae", +"Acalyptrata", +"Acalyptratae", +"acalyptrate", +"Acamar", +"acampsia", +"acana", +"acanaceous", +"acanonical", +"acanth", +"acantha", +"Acanthaceae", +"acanthaceous", +"acanthad", +"Acantharia", +"Acanthia", +"acanthial", +"acanthin", +"acanthine", +"acanthion", +"acanthite", +"acanthocarpous", +"Acanthocephala", +"acanthocephalan", +"Acanthocephali", +"acanthocephalous", +"Acanthocereus", +"acanthocladous", +"Acanthodea", +"acanthodean", +"Acanthodei", +"Acanthodes", +"acanthodian", +"Acanthodidae", +"Acanthodii", +"Acanthodini", +"acanthoid", +"Acantholimon", +"acanthological", +"acanthology", +"acantholysis", +"acanthoma", +"Acanthomeridae", +"acanthon", +"Acanthopanax", +"Acanthophis", +"acanthophorous", +"acanthopod", +"acanthopodous", +"acanthopomatous", +"acanthopore", +"acanthopteran", +"Acanthopteri", +"acanthopterous", +"acanthopterygian", +"Acanthopterygii", +"acanthosis", +"acanthous", +"Acanthuridae", +"Acanthurus", +"acanthus", +"acapnia", +"acapnial", +"acapsular", +"acapu", +"acapulco", +"acara", +"Acarapis", +"acardia", +"acardiac", +"acari", +"acarian", +"acariasis", +"acaricidal", +"acaricide", +"acarid", +"Acarida", +"Acaridea", +"acaridean", +"acaridomatium", +"acariform", +"Acarina", +"acarine", +"acarinosis", +"acarocecidium", +"acarodermatitis", +"acaroid", +"acarol", +"acarologist", +"acarology", +"acarophilous", +"acarophobia", +"acarotoxic", +"acarpelous", +"acarpous", +"Acarus", +"Acastus", +"acatalectic", +"acatalepsia", +"acatalepsy", +"acataleptic", +"acatallactic", +"acatamathesia", +"acataphasia", +"acataposis", +"acatastasia", +"acatastatic", +"acate", +"acategorical", +"acatery", +"acatharsia", +"acatharsy", +"acatholic", +"acaudal", +"acaudate", +"acaulescent", +"acauline", +"acaulose", +"acaulous", +"acca", +"accede", +"accedence", +"acceder", +"accelerable", +"accelerando", +"accelerant", +"accelerate", +"accelerated", +"acceleratedly", +"acceleration", +"accelerative", +"accelerator", +"acceleratory", +"accelerograph", +"accelerometer", +"accend", +"accendibility", +"accendible", +"accension", +"accensor", +"accent", +"accentless", +"accentor", +"accentuable", +"accentual", +"accentuality", +"accentually", +"accentuate", +"accentuation", +"accentuator", +"accentus", +"accept", +"acceptability", +"acceptable", +"acceptableness", +"acceptably", +"acceptance", +"acceptancy", +"acceptant", +"acceptation", +"accepted", +"acceptedly", +"accepter", +"acceptilate", +"acceptilation", +"acception", +"acceptive", +"acceptor", +"acceptress", +"accerse", +"accersition", +"accersitor", +"access", +"accessarily", +"accessariness", +"accessary", +"accessaryship", +"accessibility", +"accessible", +"accessibly", +"accession", +"accessional", +"accessioner", +"accessive", +"accessively", +"accessless", +"accessorial", +"accessorily", +"accessoriness", +"accessorius", +"accessory", +"accidence", +"accidency", +"accident", +"accidental", +"accidentalism", +"accidentalist", +"accidentality", +"accidentally", +"accidentalness", +"accidented", +"accidential", +"accidentiality", +"accidently", +"accidia", +"accidie", +"accinge", +"accipient", +"Accipiter", +"accipitral", +"accipitrary", +"Accipitres", +"accipitrine", +"accismus", +"accite", +"acclaim", +"acclaimable", +"acclaimer", +"acclamation", +"acclamator", +"acclamatory", +"acclimatable", +"acclimatation", +"acclimate", +"acclimatement", +"acclimation", +"acclimatizable", +"acclimatization", +"acclimatize", +"acclimatizer", +"acclimature", +"acclinal", +"acclinate", +"acclivitous", +"acclivity", +"acclivous", +"accloy", +"accoast", +"accoil", +"accolade", +"accoladed", +"accolated", +"accolent", +"accolle", +"accombination", +"accommodable", +"accommodableness", +"accommodate", +"accommodately", +"accommodateness", +"accommodating", +"accommodatingly", +"accommodation", +"accommodational", +"accommodative", +"accommodativeness", +"accommodator", +"accompanier", +"accompaniment", +"accompanimental", +"accompanist", +"accompany", +"accompanyist", +"accompletive", +"accomplice", +"accompliceship", +"accomplicity", +"accomplish", +"accomplishable", +"accomplished", +"accomplisher", +"accomplishment", +"accomplisht", +"accompt", +"accord", +"accordable", +"accordance", +"accordancy", +"accordant", +"accordantly", +"accorder", +"according", +"accordingly", +"accordion", +"accordionist", +"accorporate", +"accorporation", +"accost", +"accostable", +"accosted", +"accouche", +"accouchement", +"accoucheur", +"accoucheuse", +"account", +"accountability", +"accountable", +"accountableness", +"accountably", +"accountancy", +"accountant", +"accountantship", +"accounting", +"accountment", +"accouple", +"accouplement", +"accouter", +"accouterment", +"accoy", +"accredit", +"accreditate", +"accreditation", +"accredited", +"accreditment", +"accrementitial", +"accrementition", +"accresce", +"accrescence", +"accrescent", +"accretal", +"accrete", +"accretion", +"accretionary", +"accretive", +"accroach", +"accroides", +"accrual", +"accrue", +"accruement", +"accruer", +"accubation", +"accubitum", +"accubitus", +"accultural", +"acculturate", +"acculturation", +"acculturize", +"accumbency", +"accumbent", +"accumber", +"accumulable", +"accumulate", +"accumulation", +"accumulativ", +"accumulative", +"accumulatively", +"accumulativeness", +"accumulator", +"accuracy", +"accurate", +"accurately", +"accurateness", +"accurse", +"accursed", +"accursedly", +"accursedness", +"accusable", +"accusably", +"accusal", +"accusant", +"accusation", +"accusatival", +"accusative", +"accusatively", +"accusatorial", +"accusatorially", +"accusatory", +"accusatrix", +"accuse", +"accused", +"accuser", +"accusingly", +"accusive", +"accustom", +"accustomed", +"accustomedly", +"accustomedness", +"ace", +"aceacenaphthene", +"aceanthrene", +"aceanthrenequinone", +"acecaffine", +"aceconitic", +"acedia", +"acediamine", +"acediast", +"acedy", +"Aceldama", +"Acemetae", +"Acemetic", +"acenaphthene", +"acenaphthenyl", +"acenaphthylene", +"acentric", +"acentrous", +"aceologic", +"aceology", +"acephal", +"Acephala", +"acephalan", +"Acephali", +"acephalia", +"Acephalina", +"acephaline", +"acephalism", +"acephalist", +"Acephalite", +"acephalocyst", +"acephalous", +"acephalus", +"Acer", +"Aceraceae", +"aceraceous", +"Acerae", +"Acerata", +"acerate", +"Acerates", +"acerathere", +"Aceratherium", +"aceratosis", +"acerb", +"Acerbas", +"acerbate", +"acerbic", +"acerbity", +"acerdol", +"acerin", +"acerose", +"acerous", +"acerra", +"acertannin", +"acervate", +"acervately", +"acervation", +"acervative", +"acervose", +"acervuline", +"acervulus", +"acescence", +"acescency", +"acescent", +"aceship", +"acesodyne", +"Acestes", +"acetabular", +"Acetabularia", +"acetabuliferous", +"acetabuliform", +"acetabulous", +"acetabulum", +"acetacetic", +"acetal", +"acetaldehydase", +"acetaldehyde", +"acetaldehydrase", +"acetalization", +"acetalize", +"acetamide", +"acetamidin", +"acetamidine", +"acetamido", +"acetaminol", +"acetanilid", +"acetanilide", +"acetanion", +"acetaniside", +"acetanisidide", +"acetannin", +"acetarious", +"acetarsone", +"acetate", +"acetated", +"acetation", +"acetbromamide", +"acetenyl", +"acethydrazide", +"acetic", +"acetification", +"acetifier", +"acetify", +"acetimeter", +"acetimetry", +"acetin", +"acetize", +"acetmethylanilide", +"acetnaphthalide", +"acetoacetanilide", +"acetoacetate", +"acetoacetic", +"acetoamidophenol", +"acetoarsenite", +"Acetobacter", +"acetobenzoic", +"acetobromanilide", +"acetochloral", +"acetocinnamene", +"acetoin", +"acetol", +"acetolysis", +"acetolytic", +"acetometer", +"acetometrical", +"acetometrically", +"acetometry", +"acetomorphine", +"acetonaphthone", +"acetonate", +"acetonation", +"acetone", +"acetonemia", +"acetonemic", +"acetonic", +"acetonitrile", +"acetonization", +"acetonize", +"acetonuria", +"acetonurometer", +"acetonyl", +"acetonylacetone", +"acetonylidene", +"acetophenetide", +"acetophenin", +"acetophenine", +"acetophenone", +"acetopiperone", +"acetopyrin", +"acetosalicylic", +"acetose", +"acetosity", +"acetosoluble", +"acetothienone", +"acetotoluide", +"acetotoluidine", +"acetous", +"acetoveratrone", +"acetoxime", +"acetoxyl", +"acetoxyphthalide", +"acetphenetid", +"acetphenetidin", +"acetract", +"acettoluide", +"acetum", +"aceturic", +"acetyl", +"acetylacetonates", +"acetylacetone", +"acetylamine", +"acetylate", +"acetylation", +"acetylator", +"acetylbenzene", +"acetylbenzoate", +"acetylbenzoic", +"acetylbiuret", +"acetylcarbazole", +"acetylcellulose", +"acetylcholine", +"acetylcyanide", +"acetylenation", +"acetylene", +"acetylenediurein", +"acetylenic", +"acetylenyl", +"acetylfluoride", +"acetylglycine", +"acetylhydrazine", +"acetylic", +"acetylide", +"acetyliodide", +"acetylizable", +"acetylization", +"acetylize", +"acetylizer", +"acetylmethylcarbinol", +"acetylperoxide", +"acetylphenol", +"acetylphenylhydrazine", +"acetylrosaniline", +"acetylsalicylate", +"acetylsalol", +"acetyltannin", +"acetylthymol", +"acetyltropeine", +"acetylurea", +"ach", +"Achaean", +"Achaemenian", +"Achaemenid", +"Achaemenidae", +"Achaemenidian", +"Achaenodon", +"Achaeta", +"achaetous", +"achage", +"Achagua", +"Achakzai", +"achalasia", +"Achamoth", +"Achango", +"achar", +"Achariaceae", +"Achariaceous", +"achate", +"Achates", +"Achatina", +"Achatinella", +"Achatinidae", +"ache", +"acheilia", +"acheilous", +"acheiria", +"acheirous", +"acheirus", +"Achen", +"achene", +"achenial", +"achenium", +"achenocarp", +"achenodium", +"acher", +"Achernar", +"Acheronian", +"Acherontic", +"Acherontical", +"achete", +"Achetidae", +"Acheulean", +"acheweed", +"achievable", +"achieve", +"achievement", +"achiever", +"achigan", +"achilary", +"achill", +"Achillea", +"Achillean", +"Achilleid", +"achilleine", +"Achillize", +"achillobursitis", +"achillodynia", +"achime", +"Achimenes", +"Achinese", +"aching", +"achingly", +"achira", +"Achitophel", +"achlamydate", +"Achlamydeae", +"achlamydeous", +"achlorhydria", +"achlorophyllous", +"achloropsia", +"Achmetha", +"acholia", +"acholic", +"Acholoe", +"acholous", +"acholuria", +"acholuric", +"Achomawi", +"achondrite", +"achondritic", +"achondroplasia", +"achondroplastic", +"achor", +"achordal", +"Achordata", +"achordate", +"Achorion", +"Achras", +"achree", +"achroacyte", +"Achroanthes", +"achrodextrin", +"achrodextrinase", +"achroglobin", +"achroiocythaemia", +"achroiocythemia", +"achroite", +"achroma", +"achromacyte", +"achromasia", +"achromat", +"achromate", +"Achromatiaceae", +"achromatic", +"achromatically", +"achromaticity", +"achromatin", +"achromatinic", +"achromatism", +"Achromatium", +"achromatizable", +"achromatization", +"achromatize", +"achromatocyte", +"achromatolysis", +"achromatope", +"achromatophile", +"achromatopia", +"achromatopsia", +"achromatopsy", +"achromatosis", +"achromatous", +"achromaturia", +"achromia", +"achromic", +"Achromobacter", +"Achromobacterieae", +"achromoderma", +"achromophilous", +"achromotrichia", +"achromous", +"achronical", +"achroodextrin", +"achroodextrinase", +"achroous", +"achropsia", +"achtehalber", +"achtel", +"achtelthaler", +"Achuas", +"achy", +"achylia", +"achylous", +"achymia", +"achymous", +"Achyranthes", +"Achyrodes", +"acichloride", +"acicula", +"acicular", +"acicularly", +"aciculate", +"aciculated", +"aciculum", +"acid", +"Acidanthera", +"Acidaspis", +"acidemia", +"acider", +"acidic", +"acidiferous", +"acidifiable", +"acidifiant", +"acidific", +"acidification", +"acidifier", +"acidify", +"acidimeter", +"acidimetric", +"acidimetrical", +"acidimetrically", +"acidimetry", +"acidite", +"acidity", +"acidize", +"acidly", +"acidness", +"acidoid", +"acidology", +"acidometer", +"acidometry", +"acidophile", +"acidophilic", +"acidophilous", +"acidoproteolytic", +"acidosis", +"acidosteophyte", +"acidotic", +"acidproof", +"acidulate", +"acidulent", +"acidulous", +"aciduric", +"acidyl", +"acier", +"acierage", +"Acieral", +"acierate", +"acieration", +"aciform", +"aciliate", +"aciliated", +"Acilius", +"acinaceous", +"acinaces", +"acinacifolious", +"acinaciform", +"acinar", +"acinarious", +"acinary", +"Acineta", +"Acinetae", +"acinetan", +"Acinetaria", +"acinetarian", +"acinetic", +"acinetiform", +"Acinetina", +"acinetinan", +"acinic", +"aciniform", +"acinose", +"acinotubular", +"acinous", +"acinus", +"Acipenser", +"Acipenseres", +"acipenserid", +"Acipenseridae", +"acipenserine", +"acipenseroid", +"Acipenseroidei", +"Acis", +"aciurgy", +"acker", +"ackey", +"ackman", +"acknow", +"acknowledge", +"acknowledgeable", +"acknowledged", +"acknowledgedly", +"acknowledger", +"aclastic", +"acle", +"acleidian", +"acleistous", +"Aclemon", +"aclidian", +"aclinal", +"aclinic", +"acloud", +"aclys", +"Acmaea", +"Acmaeidae", +"acmatic", +"acme", +"acmesthesia", +"acmic", +"Acmispon", +"acmite", +"acne", +"acneform", +"acneiform", +"acnemia", +"Acnida", +"acnodal", +"acnode", +"Acocanthera", +"acocantherin", +"acock", +"acockbill", +"acocotl", +"Acoela", +"Acoelomata", +"acoelomate", +"acoelomatous", +"Acoelomi", +"acoelomous", +"acoelous", +"Acoemetae", +"Acoemeti", +"Acoemetic", +"acoin", +"acoine", +"Acolapissa", +"acold", +"Acolhua", +"Acolhuan", +"acologic", +"acology", +"acolous", +"acoluthic", +"acolyte", +"acolythate", +"Acoma", +"acoma", +"acomia", +"acomous", +"aconative", +"acondylose", +"acondylous", +"acone", +"aconic", +"aconin", +"aconine", +"aconital", +"aconite", +"aconitia", +"aconitic", +"aconitin", +"aconitine", +"Aconitum", +"Acontias", +"acontium", +"Acontius", +"aconuresis", +"acopic", +"acopon", +"acopyrin", +"acopyrine", +"acor", +"acorea", +"acoria", +"acorn", +"acorned", +"Acorus", +"acosmic", +"acosmism", +"acosmist", +"acosmistic", +"acotyledon", +"acotyledonous", +"acouasm", +"acouchi", +"acouchy", +"acoumeter", +"acoumetry", +"acouometer", +"acouophonia", +"acoupa", +"acousmata", +"acousmatic", +"acoustic", +"acoustical", +"acoustically", +"acoustician", +"acousticolateral", +"Acousticon", +"acoustics", +"acquaint", +"acquaintance", +"acquaintanceship", +"acquaintancy", +"acquaintant", +"acquainted", +"acquaintedness", +"acquest", +"acquiesce", +"acquiescement", +"acquiescence", +"acquiescency", +"acquiescent", +"acquiescently", +"acquiescer", +"acquiescingly", +"acquirability", +"acquirable", +"acquire", +"acquired", +"acquirement", +"acquirenda", +"acquirer", +"acquisible", +"acquisite", +"acquisited", +"acquisition", +"acquisitive", +"acquisitively", +"acquisitiveness", +"acquisitor", +"acquisitum", +"acquist", +"acquit", +"acquitment", +"acquittal", +"acquittance", +"acquitter", +"Acrab", +"acracy", +"acraein", +"Acraeinae", +"acraldehyde", +"Acrania", +"acranial", +"acraniate", +"acrasia", +"Acrasiaceae", +"Acrasiales", +"Acrasida", +"Acrasieae", +"Acraspeda", +"acraspedote", +"acratia", +"acraturesis", +"acrawl", +"acraze", +"acre", +"acreable", +"acreage", +"acreak", +"acream", +"acred", +"Acredula", +"acreman", +"acrestaff", +"acrid", +"acridan", +"acridian", +"acridic", +"Acrididae", +"Acridiidae", +"acridine", +"acridinic", +"acridinium", +"acridity", +"Acridium", +"acridly", +"acridness", +"acridone", +"acridonium", +"acridophagus", +"acridyl", +"acriflavin", +"acriflavine", +"acrimonious", +"acrimoniously", +"acrimoniousness", +"acrimony", +"acrindoline", +"acrinyl", +"acrisia", +"Acrisius", +"Acrita", +"acritan", +"acrite", +"acritical", +"acritol", +"Acroa", +"acroaesthesia", +"acroama", +"acroamatic", +"acroamatics", +"acroanesthesia", +"acroarthritis", +"acroasphyxia", +"acroataxia", +"acroatic", +"acrobacy", +"acrobat", +"Acrobates", +"acrobatholithic", +"acrobatic", +"acrobatical", +"acrobatically", +"acrobatics", +"acrobatism", +"acroblast", +"acrobryous", +"acrobystitis", +"Acrocarpi", +"acrocarpous", +"acrocephalia", +"acrocephalic", +"acrocephalous", +"acrocephaly", +"Acrocera", +"Acroceratidae", +"Acroceraunian", +"Acroceridae", +"Acrochordidae", +"Acrochordinae", +"acrochordon", +"Acroclinium", +"Acrocomia", +"acroconidium", +"acrocontracture", +"acrocoracoid", +"acrocyanosis", +"acrocyst", +"acrodactylum", +"acrodermatitis", +"acrodont", +"acrodontism", +"acrodrome", +"acrodromous", +"Acrodus", +"acrodynia", +"acroesthesia", +"acrogamous", +"acrogamy", +"acrogen", +"acrogenic", +"acrogenous", +"acrogenously", +"acrography", +"Acrogynae", +"acrogynae", +"acrogynous", +"acrolein", +"acrolith", +"acrolithan", +"acrolithic", +"acrologic", +"acrologically", +"acrologism", +"acrologue", +"acrology", +"acromania", +"acromastitis", +"acromegalia", +"acromegalic", +"acromegaly", +"acromelalgia", +"acrometer", +"acromial", +"acromicria", +"acromioclavicular", +"acromiocoracoid", +"acromiodeltoid", +"acromiohumeral", +"acromiohyoid", +"acromion", +"acromioscapular", +"acromiosternal", +"acromiothoracic", +"acromonogrammatic", +"acromphalus", +"Acromyodi", +"acromyodian", +"acromyodic", +"acromyodous", +"acromyotonia", +"acromyotonus", +"acron", +"acronarcotic", +"acroneurosis", +"acronical", +"acronically", +"acronyc", +"acronych", +"Acronycta", +"acronyctous", +"acronym", +"acronymic", +"acronymize", +"acronymous", +"acronyx", +"acrook", +"acroparalysis", +"acroparesthesia", +"acropathology", +"acropathy", +"acropetal", +"acropetally", +"acrophobia", +"acrophonetic", +"acrophonic", +"acrophony", +"acropodium", +"acropoleis", +"acropolis", +"acropolitan", +"Acropora", +"acrorhagus", +"acrorrheuma", +"acrosarc", +"acrosarcum", +"acroscleriasis", +"acroscleroderma", +"acroscopic", +"acrose", +"acrosome", +"acrosphacelus", +"acrospire", +"acrospore", +"acrosporous", +"across", +"acrostic", +"acrostical", +"acrostically", +"acrostichal", +"Acrosticheae", +"acrostichic", +"acrostichoid", +"Acrostichum", +"acrosticism", +"acrostolion", +"acrostolium", +"acrotarsial", +"acrotarsium", +"acroteleutic", +"acroterial", +"acroteric", +"acroterium", +"Acrothoracica", +"acrotic", +"acrotism", +"acrotomous", +"Acrotreta", +"Acrotretidae", +"acrotrophic", +"acrotrophoneurosis", +"Acrux", +"Acrydium", +"acryl", +"acrylaldehyde", +"acrylate", +"acrylic", +"acrylonitrile", +"acrylyl", +"act", +"acta", +"actability", +"actable", +"Actaea", +"Actaeaceae", +"Actaeon", +"Actaeonidae", +"Actiad", +"Actian", +"actification", +"actifier", +"actify", +"actin", +"actinal", +"actinally", +"actinautographic", +"actinautography", +"actine", +"actinenchyma", +"acting", +"Actinia", +"actinian", +"Actiniaria", +"actiniarian", +"actinic", +"actinically", +"Actinidia", +"Actinidiaceae", +"actiniferous", +"actiniform", +"actinine", +"actiniochrome", +"actiniohematin", +"Actiniomorpha", +"actinism", +"Actinistia", +"actinium", +"actinobacillosis", +"Actinobacillus", +"actinoblast", +"actinobranch", +"actinobranchia", +"actinocarp", +"actinocarpic", +"actinocarpous", +"actinochemistry", +"actinocrinid", +"Actinocrinidae", +"actinocrinite", +"Actinocrinus", +"actinocutitis", +"actinodermatitis", +"actinodielectric", +"actinodrome", +"actinodromous", +"actinoelectric", +"actinoelectrically", +"actinoelectricity", +"actinogonidiate", +"actinogram", +"actinograph", +"actinography", +"actinoid", +"Actinoida", +"Actinoidea", +"actinolite", +"actinolitic", +"actinologous", +"actinologue", +"actinology", +"actinomere", +"actinomeric", +"actinometer", +"actinometric", +"actinometrical", +"actinometry", +"actinomorphic", +"actinomorphous", +"actinomorphy", +"Actinomyces", +"Actinomycetaceae", +"Actinomycetales", +"actinomycete", +"actinomycetous", +"actinomycin", +"actinomycoma", +"actinomycosis", +"actinomycotic", +"Actinomyxidia", +"Actinomyxidiida", +"actinon", +"Actinonema", +"actinoneuritis", +"actinophone", +"actinophonic", +"actinophore", +"actinophorous", +"actinophryan", +"Actinophrys", +"Actinopoda", +"actinopraxis", +"actinopteran", +"Actinopteri", +"actinopterous", +"actinopterygian", +"Actinopterygii", +"actinopterygious", +"actinoscopy", +"actinosoma", +"actinosome", +"Actinosphaerium", +"actinost", +"actinostereoscopy", +"actinostomal", +"actinostome", +"actinotherapeutic", +"actinotherapeutics", +"actinotherapy", +"actinotoxemia", +"actinotrichium", +"actinotrocha", +"actinouranium", +"Actinozoa", +"actinozoal", +"actinozoan", +"actinozoon", +"actinula", +"action", +"actionable", +"actionably", +"actional", +"actionary", +"actioner", +"actionize", +"actionless", +"Actipylea", +"Actium", +"activable", +"activate", +"activation", +"activator", +"active", +"actively", +"activeness", +"activin", +"activism", +"activist", +"activital", +"activity", +"activize", +"actless", +"actomyosin", +"acton", +"actor", +"actorship", +"actress", +"Acts", +"actu", +"actual", +"actualism", +"actualist", +"actualistic", +"actuality", +"actualization", +"actualize", +"actually", +"actualness", +"actuarial", +"actuarially", +"actuarian", +"actuary", +"actuaryship", +"actuation", +"actuator", +"acture", +"acturience", +"actutate", +"acuaesthesia", +"Acuan", +"acuate", +"acuation", +"Acubens", +"acuclosure", +"acuductor", +"acuesthesia", +"acuity", +"aculea", +"Aculeata", +"aculeate", +"aculeated", +"aculeiform", +"aculeolate", +"aculeolus", +"aculeus", +"acumen", +"acuminate", +"acumination", +"acuminose", +"acuminous", +"acuminulate", +"acupress", +"acupressure", +"acupunctuate", +"acupunctuation", +"acupuncturation", +"acupuncturator", +"acupuncture", +"acurative", +"acushla", +"acutangular", +"acutate", +"acute", +"acutely", +"acutenaculum", +"acuteness", +"acutiator", +"acutifoliate", +"Acutilinguae", +"acutilingual", +"acutilobate", +"acutiplantar", +"acutish", +"acutograve", +"acutonodose", +"acutorsion", +"acyanoblepsia", +"acyanopsia", +"acyclic", +"acyesis", +"acyetic", +"acyl", +"acylamido", +"acylamidobenzene", +"acylamino", +"acylate", +"acylation", +"acylogen", +"acyloin", +"acyloxy", +"acyloxymethane", +"acyrological", +"acyrology", +"acystia", +"ad", +"Ada", +"adactyl", +"adactylia", +"adactylism", +"adactylous", +"Adad", +"adad", +"adage", +"adagial", +"adagietto", +"adagio", +"Adai", +"Adaize", +"Adam", +"adamant", +"adamantean", +"adamantine", +"adamantinoma", +"adamantoblast", +"adamantoblastoma", +"adamantoid", +"adamantoma", +"adamas", +"Adamastor", +"adambulacral", +"adamellite", +"Adamhood", +"Adamic", +"Adamical", +"Adamically", +"adamine", +"Adamite", +"adamite", +"Adamitic", +"Adamitical", +"Adamitism", +"Adamsia", +"adamsite", +"adance", +"adangle", +"Adansonia", +"Adapa", +"adapid", +"Adapis", +"adapt", +"adaptability", +"adaptable", +"adaptation", +"adaptational", +"adaptationally", +"adaptative", +"adaptedness", +"adapter", +"adaption", +"adaptional", +"adaptionism", +"adaptitude", +"adaptive", +"adaptively", +"adaptiveness", +"adaptometer", +"adaptor", +"adaptorial", +"Adar", +"adarme", +"adat", +"adati", +"adatom", +"adaunt", +"adaw", +"adawe", +"adawlut", +"adawn", +"adaxial", +"aday", +"adays", +"adazzle", +"adcraft", +"add", +"Adda", +"adda", +"addability", +"addable", +"addax", +"addebted", +"added", +"addedly", +"addend", +"addenda", +"addendum", +"adder", +"adderbolt", +"adderfish", +"adderspit", +"adderwort", +"addibility", +"addible", +"addicent", +"addict", +"addicted", +"addictedness", +"addiction", +"Addie", +"addiment", +"Addisonian", +"Addisoniana", +"additament", +"additamentary", +"addition", +"additional", +"additionally", +"additionary", +"additionist", +"addititious", +"additive", +"additively", +"additivity", +"additory", +"addle", +"addlebrain", +"addlebrained", +"addlehead", +"addleheaded", +"addleheadedly", +"addleheadedness", +"addlement", +"addleness", +"addlepate", +"addlepated", +"addlepatedness", +"addleplot", +"addlings", +"addlins", +"addorsed", +"address", +"addressee", +"addresser", +"addressful", +"Addressograph", +"addressor", +"addrest", +"Addu", +"adduce", +"adducent", +"adducer", +"adducible", +"adduct", +"adduction", +"adductive", +"adductor", +"Addy", +"Ade", +"ade", +"adead", +"adeem", +"adeep", +"Adela", +"Adelaide", +"Adelarthra", +"Adelarthrosomata", +"adelarthrosomatous", +"Adelbert", +"Adelea", +"Adeleidae", +"Adelges", +"Adelia", +"Adelina", +"Adeline", +"adeling", +"adelite", +"Adeliza", +"adelocerous", +"Adelochorda", +"adelocodonic", +"adelomorphic", +"adelomorphous", +"adelopod", +"Adelops", +"Adelphi", +"Adelphian", +"adelphogamy", +"Adelphoi", +"adelpholite", +"adelphophagy", +"ademonist", +"adempted", +"ademption", +"adenalgia", +"adenalgy", +"Adenanthera", +"adenase", +"adenasthenia", +"adendric", +"adendritic", +"adenectomy", +"adenectopia", +"adenectopic", +"adenemphractic", +"adenemphraxis", +"adenia", +"adeniform", +"adenine", +"adenitis", +"adenization", +"adenoacanthoma", +"adenoblast", +"adenocancroid", +"adenocarcinoma", +"adenocarcinomatous", +"adenocele", +"adenocellulitis", +"adenochondroma", +"adenochondrosarcoma", +"adenochrome", +"adenocyst", +"adenocystoma", +"adenocystomatous", +"adenodermia", +"adenodiastasis", +"adenodynia", +"adenofibroma", +"adenofibrosis", +"adenogenesis", +"adenogenous", +"adenographer", +"adenographic", +"adenographical", +"adenography", +"adenohypersthenia", +"adenoid", +"adenoidal", +"adenoidism", +"adenoliomyofibroma", +"adenolipoma", +"adenolipomatosis", +"adenologaditis", +"adenological", +"adenology", +"adenolymphocele", +"adenolymphoma", +"adenoma", +"adenomalacia", +"adenomatome", +"adenomatous", +"adenomeningeal", +"adenometritis", +"adenomycosis", +"adenomyofibroma", +"adenomyoma", +"adenomyxoma", +"adenomyxosarcoma", +"adenoncus", +"adenoneural", +"adenoneure", +"adenopathy", +"adenopharyngeal", +"adenopharyngitis", +"adenophlegmon", +"Adenophora", +"adenophore", +"adenophorous", +"adenophthalmia", +"adenophyllous", +"adenophyma", +"adenopodous", +"adenosarcoma", +"adenosclerosis", +"adenose", +"adenosine", +"adenosis", +"adenostemonous", +"Adenostoma", +"adenotome", +"adenotomic", +"adenotomy", +"adenotyphoid", +"adenotyphus", +"adenyl", +"adenylic", +"Adeodatus", +"Adeona", +"Adephaga", +"adephagan", +"adephagia", +"adephagous", +"adept", +"adeptness", +"adeptship", +"adequacy", +"adequate", +"adequately", +"adequateness", +"adequation", +"adequative", +"adermia", +"adermin", +"Adessenarian", +"adet", +"adevism", +"adfected", +"adfix", +"adfluxion", +"adglutinate", +"Adhafera", +"adhaka", +"adhamant", +"Adhara", +"adharma", +"adhere", +"adherence", +"adherency", +"adherent", +"adherently", +"adherer", +"adherescence", +"adherescent", +"adhesion", +"adhesional", +"adhesive", +"adhesively", +"adhesivemeter", +"adhesiveness", +"adhibit", +"adhibition", +"adiabatic", +"adiabatically", +"adiabolist", +"adiactinic", +"adiadochokinesis", +"adiagnostic", +"adiantiform", +"Adiantum", +"adiaphon", +"adiaphonon", +"adiaphoral", +"adiaphoresis", +"adiaphoretic", +"adiaphorism", +"adiaphorist", +"adiaphoristic", +"adiaphorite", +"adiaphoron", +"adiaphorous", +"adiate", +"adiathermal", +"adiathermancy", +"adiathermanous", +"adiathermic", +"adiathetic", +"adiation", +"Adib", +"Adicea", +"adicity", +"Adiel", +"adieu", +"adieux", +"Adigei", +"Adighe", +"Adigranth", +"adigranth", +"Adin", +"Adinida", +"adinidan", +"adinole", +"adion", +"adipate", +"adipescent", +"adipic", +"adipinic", +"adipocele", +"adipocellulose", +"adipocere", +"adipoceriform", +"adipocerous", +"adipocyte", +"adipofibroma", +"adipogenic", +"adipogenous", +"adipoid", +"adipolysis", +"adipolytic", +"adipoma", +"adipomatous", +"adipometer", +"adipopexia", +"adipopexis", +"adipose", +"adiposeness", +"adiposis", +"adiposity", +"adiposogenital", +"adiposuria", +"adipous", +"adipsia", +"adipsic", +"adipsous", +"adipsy", +"adipyl", +"Adirondack", +"adit", +"adital", +"aditus", +"adjacency", +"adjacent", +"adjacently", +"adjag", +"adject", +"adjection", +"adjectional", +"adjectival", +"adjectivally", +"adjective", +"adjectively", +"adjectivism", +"adjectivitis", +"adjiger", +"adjoin", +"adjoined", +"adjoinedly", +"adjoining", +"adjoint", +"adjourn", +"adjournal", +"adjournment", +"adjudge", +"adjudgeable", +"adjudger", +"adjudgment", +"adjudicate", +"adjudication", +"adjudicative", +"adjudicator", +"adjudicature", +"adjunct", +"adjunction", +"adjunctive", +"adjunctively", +"adjunctly", +"adjuration", +"adjuratory", +"adjure", +"adjurer", +"adjust", +"adjustable", +"adjustably", +"adjustage", +"adjustation", +"adjuster", +"adjustive", +"adjustment", +"adjutage", +"adjutancy", +"adjutant", +"adjutantship", +"adjutorious", +"adjutory", +"adjutrice", +"adjuvant", +"adlay", +"adless", +"adlet", +"Adlumia", +"adlumidine", +"adlumine", +"adman", +"admarginate", +"admaxillary", +"admeasure", +"admeasurement", +"admeasurer", +"admedial", +"admedian", +"admensuration", +"admi", +"adminicle", +"adminicula", +"adminicular", +"adminiculary", +"adminiculate", +"adminiculation", +"adminiculum", +"administer", +"administerd", +"administerial", +"administrable", +"administrant", +"administrate", +"administration", +"administrational", +"administrative", +"administratively", +"administrator", +"administratorship", +"administratress", +"administratrices", +"administratrix", +"admirability", +"admirable", +"admirableness", +"admirably", +"admiral", +"admiralship", +"admiralty", +"admiration", +"admirative", +"admirator", +"admire", +"admired", +"admiredly", +"admirer", +"admiring", +"admiringly", +"admissibility", +"admissible", +"admissibleness", +"admissibly", +"admission", +"admissive", +"admissory", +"admit", +"admittable", +"admittance", +"admitted", +"admittedly", +"admittee", +"admitter", +"admittible", +"admix", +"admixtion", +"admixture", +"admonish", +"admonisher", +"admonishingly", +"admonishment", +"admonition", +"admonitioner", +"admonitionist", +"admonitive", +"admonitively", +"admonitor", +"admonitorial", +"admonitorily", +"admonitory", +"admonitrix", +"admortization", +"adnascence", +"adnascent", +"adnate", +"adnation", +"adnephrine", +"adnerval", +"adneural", +"adnex", +"adnexal", +"adnexed", +"adnexitis", +"adnexopexy", +"adnominal", +"adnominally", +"adnomination", +"adnoun", +"ado", +"adobe", +"adolesce", +"adolescence", +"adolescency", +"adolescent", +"adolescently", +"Adolph", +"Adolphus", +"Adonai", +"Adonean", +"Adonia", +"Adoniad", +"Adonian", +"Adonic", +"adonidin", +"adonin", +"Adoniram", +"Adonis", +"adonite", +"adonitol", +"adonize", +"adoperate", +"adoperation", +"adopt", +"adoptability", +"adoptable", +"adoptant", +"adoptative", +"adopted", +"adoptedly", +"adoptee", +"adopter", +"adoptian", +"adoptianism", +"adoptianist", +"adoption", +"adoptional", +"adoptionism", +"adoptionist", +"adoptious", +"adoptive", +"adoptively", +"adorability", +"adorable", +"adorableness", +"adorably", +"adoral", +"adorally", +"adorant", +"Adorantes", +"adoration", +"adoratory", +"adore", +"adorer", +"Adoretus", +"adoringly", +"adorn", +"adorner", +"adorningly", +"adornment", +"adosculation", +"adossed", +"adoulie", +"adown", +"Adoxa", +"Adoxaceae", +"adoxaceous", +"adoxography", +"adoxy", +"adoze", +"adpao", +"adpress", +"adpromission", +"adradial", +"adradially", +"adradius", +"Adramelech", +"Adrammelech", +"adread", +"adream", +"adreamed", +"adreamt", +"adrectal", +"adrenal", +"adrenalectomize", +"adrenalectomy", +"Adrenalin", +"adrenaline", +"adrenalize", +"adrenalone", +"adrenergic", +"adrenin", +"adrenine", +"adrenochrome", +"adrenocortical", +"adrenocorticotropic", +"adrenolysis", +"adrenolytic", +"adrenotropic", +"Adrian", +"Adriana", +"Adriatic", +"Adrienne", +"adrift", +"adrip", +"adroit", +"adroitly", +"adroitness", +"adroop", +"adrop", +"adrostral", +"adrowse", +"adrue", +"adry", +"adsbud", +"adscendent", +"adscititious", +"adscititiously", +"adscript", +"adscripted", +"adscription", +"adscriptitious", +"adscriptitius", +"adscriptive", +"adsessor", +"adsheart", +"adsignification", +"adsignify", +"adsmith", +"adsmithing", +"adsorb", +"adsorbable", +"adsorbate", +"adsorbent", +"adsorption", +"adsorptive", +"adstipulate", +"adstipulation", +"adstipulator", +"adterminal", +"adtevac", +"adular", +"adularescence", +"adularia", +"adulate", +"adulation", +"adulator", +"adulatory", +"adulatress", +"Adullam", +"Adullamite", +"adult", +"adulter", +"adulterant", +"adulterate", +"adulterately", +"adulterateness", +"adulteration", +"adulterator", +"adulterer", +"adulteress", +"adulterine", +"adulterize", +"adulterous", +"adulterously", +"adultery", +"adulthood", +"adulticidal", +"adulticide", +"adultness", +"adultoid", +"adumbral", +"adumbrant", +"adumbrate", +"adumbration", +"adumbrative", +"adumbratively", +"adunc", +"aduncate", +"aduncated", +"aduncity", +"aduncous", +"adusk", +"adust", +"adustion", +"adustiosis", +"Advaita", +"advance", +"advanceable", +"advanced", +"advancedness", +"advancement", +"advancer", +"advancing", +"advancingly", +"advancive", +"advantage", +"advantageous", +"advantageously", +"advantageousness", +"advection", +"advectitious", +"advective", +"advehent", +"advene", +"advenience", +"advenient", +"Advent", +"advential", +"Adventism", +"Adventist", +"adventitia", +"adventitious", +"adventitiously", +"adventitiousness", +"adventive", +"adventual", +"adventure", +"adventureful", +"adventurement", +"adventurer", +"adventureship", +"adventuresome", +"adventuresomely", +"adventuresomeness", +"adventuress", +"adventurish", +"adventurous", +"adventurously", +"adventurousness", +"adverb", +"adverbial", +"adverbiality", +"adverbialize", +"adverbially", +"adverbiation", +"adversant", +"adversaria", +"adversarious", +"adversary", +"adversative", +"adversatively", +"adverse", +"adversely", +"adverseness", +"adversifoliate", +"adversifolious", +"adversity", +"advert", +"advertence", +"advertency", +"advertent", +"advertently", +"advertisable", +"advertise", +"advertisee", +"advertisement", +"advertiser", +"advertising", +"advice", +"adviceful", +"advisability", +"advisable", +"advisableness", +"advisably", +"advisal", +"advisatory", +"advise", +"advised", +"advisedly", +"advisedness", +"advisee", +"advisement", +"adviser", +"advisership", +"advisive", +"advisiveness", +"advisor", +"advisorily", +"advisory", +"advocacy", +"advocate", +"advocateship", +"advocatess", +"advocation", +"advocator", +"advocatory", +"advocatress", +"advocatrice", +"advocatrix", +"advolution", +"advowee", +"advowson", +"ady", +"adynamia", +"adynamic", +"adynamy", +"adyta", +"adyton", +"adytum", +"adz", +"adze", +"adzer", +"adzooks", +"ae", +"Aeacides", +"Aeacus", +"Aeaean", +"Aechmophorus", +"aecial", +"Aecidiaceae", +"aecidial", +"aecidioform", +"Aecidiomycetes", +"aecidiospore", +"aecidiostage", +"aecidium", +"aeciospore", +"aeciostage", +"aecioteliospore", +"aeciotelium", +"aecium", +"aedeagus", +"Aedes", +"aedicula", +"aedile", +"aedileship", +"aedilian", +"aedilic", +"aedilitian", +"aedility", +"aedoeagus", +"aefald", +"aefaldness", +"aefaldy", +"aefauld", +"aegagropila", +"aegagropile", +"aegagrus", +"Aegean", +"aegerian", +"aegeriid", +"Aegeriidae", +"Aegialitis", +"aegicrania", +"Aegina", +"Aeginetan", +"Aeginetic", +"Aegipan", +"aegirine", +"aegirinolite", +"aegirite", +"aegis", +"Aegisthus", +"Aegithalos", +"Aegithognathae", +"aegithognathism", +"aegithognathous", +"Aegle", +"Aegopodium", +"aegrotant", +"aegyptilla", +"aegyrite", +"aeluroid", +"Aeluroidea", +"aelurophobe", +"aelurophobia", +"aeluropodous", +"aenach", +"aenean", +"aeneolithic", +"aeneous", +"aenigmatite", +"aeolharmonica", +"Aeolia", +"Aeolian", +"Aeolic", +"Aeolicism", +"aeolid", +"Aeolidae", +"Aeolididae", +"aeolina", +"aeoline", +"aeolipile", +"Aeolis", +"Aeolism", +"Aeolist", +"aeolistic", +"aeolodicon", +"aeolodion", +"aeolomelodicon", +"aeolopantalon", +"aeolotropic", +"aeolotropism", +"aeolotropy", +"aeolsklavier", +"aeon", +"aeonial", +"aeonian", +"aeonist", +"Aepyceros", +"Aepyornis", +"Aepyornithidae", +"Aepyornithiformes", +"Aequi", +"Aequian", +"Aequiculi", +"Aequipalpia", +"aequoreal", +"aer", +"aerage", +"aerarian", +"aerarium", +"aerate", +"aeration", +"aerator", +"aerenchyma", +"aerenterectasia", +"aerial", +"aerialist", +"aeriality", +"aerially", +"aerialness", +"aeric", +"aerical", +"Aerides", +"aerie", +"aeried", +"aerifaction", +"aeriferous", +"aerification", +"aeriform", +"aerify", +"aero", +"Aerobacter", +"aerobate", +"aerobatic", +"aerobatics", +"aerobe", +"aerobian", +"aerobic", +"aerobically", +"aerobiologic", +"aerobiological", +"aerobiologically", +"aerobiologist", +"aerobiology", +"aerobion", +"aerobiont", +"aerobioscope", +"aerobiosis", +"aerobiotic", +"aerobiotically", +"aerobious", +"aerobium", +"aeroboat", +"Aerobranchia", +"aerobranchiate", +"aerobus", +"aerocamera", +"aerocartograph", +"Aerocharidae", +"aerocolpos", +"aerocraft", +"aerocurve", +"aerocyst", +"aerodermectasia", +"aerodone", +"aerodonetic", +"aerodonetics", +"aerodrome", +"aerodromics", +"aerodynamic", +"aerodynamical", +"aerodynamicist", +"aerodynamics", +"aerodyne", +"aeroembolism", +"aeroenterectasia", +"aerofoil", +"aerogel", +"aerogen", +"aerogenes", +"aerogenesis", +"aerogenic", +"aerogenically", +"aerogenous", +"aerogeologist", +"aerogeology", +"aerognosy", +"aerogram", +"aerograph", +"aerographer", +"aerographic", +"aerographical", +"aerographics", +"aerography", +"aerogun", +"aerohydrodynamic", +"aerohydropathy", +"aerohydroplane", +"aerohydrotherapy", +"aerohydrous", +"aeroides", +"aerolite", +"aerolith", +"aerolithology", +"aerolitic", +"aerolitics", +"aerologic", +"aerological", +"aerologist", +"aerology", +"aeromaechanic", +"aeromancer", +"aeromancy", +"aeromantic", +"aeromarine", +"aeromechanical", +"aeromechanics", +"aerometeorograph", +"aerometer", +"aerometric", +"aerometry", +"aeromotor", +"aeronat", +"aeronaut", +"aeronautic", +"aeronautical", +"aeronautically", +"aeronautics", +"aeronautism", +"aeronef", +"aeroneurosis", +"aeropathy", +"Aerope", +"aeroperitoneum", +"aeroperitonia", +"aerophagia", +"aerophagist", +"aerophagy", +"aerophane", +"aerophilatelic", +"aerophilatelist", +"aerophilately", +"aerophile", +"aerophilic", +"aerophilous", +"aerophobia", +"aerophobic", +"aerophone", +"aerophor", +"aerophore", +"aerophotography", +"aerophysical", +"aerophysics", +"aerophyte", +"aeroplane", +"aeroplaner", +"aeroplanist", +"aeropleustic", +"aeroporotomy", +"aeroscepsis", +"aeroscepsy", +"aeroscope", +"aeroscopic", +"aeroscopically", +"aeroscopy", +"aerose", +"aerosiderite", +"aerosiderolite", +"Aerosol", +"aerosol", +"aerosphere", +"aerosporin", +"aerostat", +"aerostatic", +"aerostatical", +"aerostatics", +"aerostation", +"aerosteam", +"aerotactic", +"aerotaxis", +"aerotechnical", +"aerotherapeutics", +"aerotherapy", +"aerotonometer", +"aerotonometric", +"aerotonometry", +"aerotropic", +"aerotropism", +"aeroyacht", +"aeruginous", +"aerugo", +"aery", +"aes", +"Aeschylean", +"Aeschynanthus", +"Aeschynomene", +"aeschynomenous", +"Aesculaceae", +"aesculaceous", +"Aesculapian", +"Aesculapius", +"Aesculus", +"Aesopian", +"Aesopic", +"aesthete", +"aesthetic", +"aesthetical", +"aesthetically", +"aesthetician", +"aestheticism", +"aestheticist", +"aestheticize", +"aesthetics", +"aesthiology", +"aesthophysiology", +"Aestii", +"aethalioid", +"aethalium", +"aetheogam", +"aetheogamic", +"aetheogamous", +"aethered", +"Aethionema", +"aethogen", +"aethrioscope", +"Aethusa", +"Aetian", +"aetiogenic", +"aetiotropic", +"aetiotropically", +"Aetobatidae", +"Aetobatus", +"Aetolian", +"Aetomorphae", +"aetosaur", +"aetosaurian", +"Aetosaurus", +"aevia", +"aface", +"afaint", +"Afar", +"afar", +"afara", +"afear", +"afeard", +"afeared", +"afebrile", +"Afenil", +"afernan", +"afetal", +"affa", +"affability", +"affable", +"affableness", +"affably", +"affabrous", +"affair", +"affaite", +"affect", +"affectable", +"affectate", +"affectation", +"affectationist", +"affected", +"affectedly", +"affectedness", +"affecter", +"affectibility", +"affectible", +"affecting", +"affectingly", +"affection", +"affectional", +"affectionally", +"affectionate", +"affectionately", +"affectionateness", +"affectioned", +"affectious", +"affective", +"affectively", +"affectivity", +"affeer", +"affeerer", +"affeerment", +"affeir", +"affenpinscher", +"affenspalte", +"afferent", +"affettuoso", +"affiance", +"affiancer", +"affiant", +"affidation", +"affidavit", +"affidavy", +"affiliable", +"affiliate", +"affiliation", +"affinal", +"affination", +"affine", +"affined", +"affinely", +"affinitative", +"affinitatively", +"affinite", +"affinition", +"affinitive", +"affinity", +"affirm", +"affirmable", +"affirmably", +"affirmance", +"affirmant", +"affirmation", +"affirmative", +"affirmatively", +"affirmatory", +"affirmer", +"affirmingly", +"affix", +"affixal", +"affixation", +"affixer", +"affixion", +"affixture", +"afflation", +"afflatus", +"afflict", +"afflicted", +"afflictedness", +"afflicter", +"afflicting", +"afflictingly", +"affliction", +"afflictionless", +"afflictive", +"afflictively", +"affluence", +"affluent", +"affluently", +"affluentness", +"afflux", +"affluxion", +"afforce", +"afforcement", +"afford", +"affordable", +"afforest", +"afforestable", +"afforestation", +"afforestment", +"afformative", +"affranchise", +"affranchisement", +"affray", +"affrayer", +"affreight", +"affreighter", +"affreightment", +"affricate", +"affricated", +"affrication", +"affricative", +"affright", +"affrighted", +"affrightedly", +"affrighter", +"affrightful", +"affrightfully", +"affrightingly", +"affrightment", +"affront", +"affronte", +"affronted", +"affrontedly", +"affrontedness", +"affronter", +"affronting", +"affrontingly", +"affrontingness", +"affrontive", +"affrontiveness", +"affrontment", +"affuse", +"affusion", +"affy", +"Afghan", +"afghani", +"afield", +"Afifi", +"afikomen", +"afire", +"aflagellar", +"aflame", +"aflare", +"aflat", +"aflaunt", +"aflicker", +"aflight", +"afloat", +"aflow", +"aflower", +"afluking", +"aflush", +"aflutter", +"afoam", +"afoot", +"afore", +"aforehand", +"aforenamed", +"aforesaid", +"aforethought", +"aforetime", +"aforetimes", +"afortiori", +"afoul", +"afraid", +"afraidness", +"Aframerican", +"Afrasia", +"Afrasian", +"afreet", +"afresh", +"afret", +"Afric", +"African", +"Africana", +"Africanism", +"Africanist", +"Africanization", +"Africanize", +"Africanoid", +"Africanthropus", +"Afridi", +"Afrikaans", +"Afrikander", +"Afrikanderdom", +"Afrikanderism", +"Afrikaner", +"Afrogaea", +"Afrogaean", +"afront", +"afrown", +"Afshah", +"Afshar", +"aft", +"aftaba", +"after", +"afteract", +"afterage", +"afterattack", +"afterband", +"afterbeat", +"afterbirth", +"afterblow", +"afterbody", +"afterbrain", +"afterbreach", +"afterbreast", +"afterburner", +"afterburning", +"aftercare", +"aftercareer", +"aftercast", +"aftercataract", +"aftercause", +"afterchance", +"afterchrome", +"afterchurch", +"afterclap", +"afterclause", +"aftercome", +"aftercomer", +"aftercoming", +"aftercooler", +"aftercost", +"aftercourse", +"aftercrop", +"aftercure", +"afterdamp", +"afterdate", +"afterdays", +"afterdeck", +"afterdinner", +"afterdrain", +"afterdrops", +"aftereffect", +"afterend", +"aftereye", +"afterfall", +"afterfame", +"afterfeed", +"afterfermentation", +"afterform", +"afterfriend", +"afterfruits", +"afterfuture", +"aftergame", +"aftergas", +"afterglide", +"afterglow", +"aftergo", +"aftergood", +"aftergrass", +"aftergrave", +"aftergrief", +"aftergrind", +"aftergrowth", +"afterguard", +"afterguns", +"afterhand", +"afterharm", +"afterhatch", +"afterhelp", +"afterhend", +"afterhold", +"afterhope", +"afterhours", +"afterimage", +"afterimpression", +"afterings", +"afterking", +"afterknowledge", +"afterlife", +"afterlifetime", +"afterlight", +"afterloss", +"afterlove", +"aftermark", +"aftermarriage", +"aftermass", +"aftermast", +"aftermath", +"aftermatter", +"aftermeal", +"aftermilk", +"aftermost", +"afternight", +"afternoon", +"afternoons", +"afternose", +"afternote", +"afteroar", +"afterpain", +"afterpart", +"afterpast", +"afterpeak", +"afterpiece", +"afterplanting", +"afterplay", +"afterpressure", +"afterproof", +"afterrake", +"afterreckoning", +"afterrider", +"afterripening", +"afterroll", +"afterschool", +"aftersend", +"aftersensation", +"aftershaft", +"aftershafted", +"aftershine", +"aftership", +"aftershock", +"aftersong", +"aftersound", +"afterspeech", +"afterspring", +"afterstain", +"afterstate", +"afterstorm", +"afterstrain", +"afterstretch", +"afterstudy", +"afterswarm", +"afterswarming", +"afterswell", +"aftertan", +"aftertask", +"aftertaste", +"afterthinker", +"afterthought", +"afterthoughted", +"afterthrift", +"aftertime", +"aftertimes", +"aftertouch", +"aftertreatment", +"aftertrial", +"afterturn", +"aftervision", +"afterwale", +"afterwar", +"afterward", +"afterwards", +"afterwash", +"afterwhile", +"afterwisdom", +"afterwise", +"afterwit", +"afterwitted", +"afterwork", +"afterworking", +"afterworld", +"afterwrath", +"afterwrist", +"aftmost", +"Aftonian", +"aftosa", +"aftward", +"aftwards", +"afunction", +"afunctional", +"afwillite", +"Afzelia", +"aga", +"agabanee", +"agacante", +"agacella", +"Agaces", +"Agade", +"Agag", +"again", +"against", +"againstand", +"agal", +"agalactia", +"agalactic", +"agalactous", +"agalawood", +"agalaxia", +"agalaxy", +"Agalena", +"Agalenidae", +"Agalinis", +"agalite", +"agalloch", +"agallochum", +"agallop", +"agalma", +"agalmatolite", +"agalwood", +"Agama", +"agama", +"Agamae", +"Agamemnon", +"agamete", +"agami", +"agamian", +"agamic", +"agamically", +"agamid", +"Agamidae", +"agamobium", +"agamogenesis", +"agamogenetic", +"agamogenetically", +"agamogony", +"agamoid", +"agamont", +"agamospore", +"agamous", +"agamy", +"aganglionic", +"Aganice", +"Aganippe", +"Agao", +"Agaonidae", +"Agapanthus", +"agape", +"Agapemone", +"Agapemonian", +"Agapemonist", +"Agapemonite", +"agapetae", +"agapeti", +"agapetid", +"Agapetidae", +"Agapornis", +"agar", +"agaric", +"agaricaceae", +"agaricaceous", +"Agaricales", +"agaricic", +"agariciform", +"agaricin", +"agaricine", +"agaricoid", +"Agaricus", +"Agaristidae", +"agarita", +"Agarum", +"agarwal", +"agasp", +"Agastache", +"Agastreae", +"agastric", +"agastroneuria", +"agate", +"agateware", +"Agatha", +"Agathaea", +"Agathaumas", +"agathin", +"Agathis", +"agathism", +"agathist", +"agathodaemon", +"agathodaemonic", +"agathokakological", +"agathology", +"Agathosma", +"agatiferous", +"agatiform", +"agatine", +"agatize", +"agatoid", +"agaty", +"Agau", +"Agave", +"agavose", +"Agawam", +"Agaz", +"agaze", +"agazed", +"Agdistis", +"age", +"aged", +"agedly", +"agedness", +"agee", +"Agelacrinites", +"Agelacrinitidae", +"Agelaius", +"Agelaus", +"ageless", +"agelessness", +"agelong", +"agen", +"Agena", +"agency", +"agenda", +"agendum", +"agenesia", +"agenesic", +"agenesis", +"agennetic", +"agent", +"agentess", +"agential", +"agentival", +"agentive", +"agentry", +"agentship", +"ageometrical", +"ager", +"Ageratum", +"ageusia", +"ageusic", +"ageustia", +"agger", +"aggerate", +"aggeration", +"aggerose", +"Aggie", +"agglomerant", +"agglomerate", +"agglomerated", +"agglomeratic", +"agglomeration", +"agglomerative", +"agglomerator", +"agglutinability", +"agglutinable", +"agglutinant", +"agglutinate", +"agglutination", +"agglutinationist", +"agglutinative", +"agglutinator", +"agglutinin", +"agglutinize", +"agglutinogen", +"agglutinogenic", +"agglutinoid", +"agglutinoscope", +"agglutogenic", +"aggradation", +"aggradational", +"aggrade", +"aggrandizable", +"aggrandize", +"aggrandizement", +"aggrandizer", +"aggrate", +"aggravate", +"aggravating", +"aggravatingly", +"aggravation", +"aggravative", +"aggravator", +"aggregable", +"aggregant", +"Aggregata", +"Aggregatae", +"aggregate", +"aggregately", +"aggregateness", +"aggregation", +"aggregative", +"aggregator", +"aggregatory", +"aggress", +"aggressin", +"aggression", +"aggressionist", +"aggressive", +"aggressively", +"aggressiveness", +"aggressor", +"aggrievance", +"aggrieve", +"aggrieved", +"aggrievedly", +"aggrievedness", +"aggrievement", +"aggroup", +"aggroupment", +"aggry", +"aggur", +"agha", +"Aghan", +"aghanee", +"aghast", +"aghastness", +"Aghlabite", +"Aghorapanthi", +"Aghori", +"Agialid", +"Agib", +"Agiel", +"agilawood", +"agile", +"agilely", +"agileness", +"agility", +"agillawood", +"aging", +"agio", +"agiotage", +"agist", +"agistator", +"agistment", +"agistor", +"agitable", +"agitant", +"agitate", +"agitatedly", +"agitation", +"agitational", +"agitationist", +"agitative", +"agitator", +"agitatorial", +"agitatrix", +"agitprop", +"Agkistrodon", +"agla", +"Aglaia", +"aglance", +"Aglaonema", +"Aglaos", +"aglaozonia", +"aglare", +"Aglaspis", +"Aglauros", +"agleaf", +"agleam", +"aglet", +"aglethead", +"agley", +"aglimmer", +"aglint", +"Aglipayan", +"Aglipayano", +"aglitter", +"aglobulia", +"Aglossa", +"aglossal", +"aglossate", +"aglossia", +"aglow", +"aglucon", +"aglutition", +"aglycosuric", +"Aglypha", +"aglyphodont", +"Aglyphodonta", +"Aglyphodontia", +"aglyphous", +"agmatine", +"agmatology", +"agminate", +"agminated", +"agnail", +"agname", +"agnamed", +"agnate", +"Agnatha", +"agnathia", +"agnathic", +"Agnathostomata", +"agnathostomatous", +"agnathous", +"agnatic", +"agnatically", +"agnation", +"agnel", +"Agnes", +"agnification", +"agnize", +"Agnoetae", +"Agnoete", +"Agnoetism", +"agnoiology", +"Agnoite", +"agnomen", +"agnomical", +"agnominal", +"agnomination", +"agnosia", +"agnosis", +"agnostic", +"agnostically", +"agnosticism", +"Agnostus", +"agnosy", +"Agnotozoic", +"agnus", +"ago", +"agog", +"agoge", +"agogic", +"agogics", +"agoho", +"agoing", +"agomensin", +"agomphiasis", +"agomphious", +"agomphosis", +"agon", +"agonal", +"agone", +"agoniada", +"agoniadin", +"agoniatite", +"Agoniatites", +"agonic", +"agonied", +"agonist", +"Agonista", +"agonistarch", +"agonistic", +"agonistically", +"agonistics", +"agonium", +"agonize", +"agonizedly", +"agonizer", +"agonizingly", +"Agonostomus", +"agonothete", +"agonothetic", +"agony", +"agora", +"agoranome", +"agoraphobia", +"agouara", +"agouta", +"agouti", +"agpaite", +"agpaitic", +"Agra", +"agraffee", +"agrah", +"agral", +"agrammatical", +"agrammatism", +"Agrania", +"agranulocyte", +"agranulocytosis", +"agranuloplastic", +"Agrapha", +"agraphia", +"agraphic", +"agrarian", +"agrarianism", +"agrarianize", +"agrarianly", +"Agrauleum", +"agre", +"agree", +"agreeability", +"agreeable", +"agreeableness", +"agreeably", +"agreed", +"agreeing", +"agreeingly", +"agreement", +"agreer", +"agregation", +"agrege", +"agrestal", +"agrestial", +"agrestian", +"agrestic", +"agria", +"agricere", +"agricole", +"agricolist", +"agricolite", +"agricolous", +"agricultor", +"agricultural", +"agriculturalist", +"agriculturally", +"agriculture", +"agriculturer", +"agriculturist", +"Agrilus", +"Agrimonia", +"agrimony", +"agrimotor", +"agrin", +"Agriochoeridae", +"Agriochoerus", +"agriological", +"agriologist", +"agriology", +"Agrionia", +"agrionid", +"Agrionidae", +"Agriotes", +"Agriotypidae", +"Agriotypus", +"agrise", +"agrito", +"agroan", +"agrobiologic", +"agrobiological", +"agrobiologically", +"agrobiologist", +"agrobiology", +"agrogeological", +"agrogeologically", +"agrogeology", +"agrologic", +"agrological", +"agrologically", +"agrology", +"agrom", +"Agromyza", +"agromyzid", +"Agromyzidae", +"agronome", +"agronomial", +"agronomic", +"agronomical", +"agronomics", +"agronomist", +"agronomy", +"agroof", +"agrope", +"Agropyron", +"Agrostemma", +"agrosteral", +"Agrostis", +"agrostographer", +"agrostographic", +"agrostographical", +"agrostography", +"agrostologic", +"agrostological", +"agrostologist", +"agrostology", +"agrotechny", +"Agrotis", +"aground", +"agrufe", +"agruif", +"agrypnia", +"agrypnotic", +"agsam", +"agua", +"aguacate", +"Aguacateca", +"aguavina", +"Agudist", +"ague", +"aguelike", +"agueproof", +"agueweed", +"aguey", +"aguilarite", +"aguilawood", +"aguinaldo", +"aguirage", +"aguish", +"aguishly", +"aguishness", +"agunah", +"agush", +"agust", +"agy", +"Agyieus", +"agynarious", +"agynary", +"agynous", +"agyrate", +"agyria", +"Ah", +"ah", +"aha", +"ahaaina", +"ahankara", +"Ahantchuyuk", +"ahartalav", +"ahaunch", +"ahead", +"aheap", +"ahem", +"Ahepatokla", +"Ahet", +"ahey", +"ahimsa", +"ahind", +"ahint", +"Ahir", +"ahluwalia", +"ahmadi", +"Ahmadiya", +"Ahnfeltia", +"aho", +"Ahom", +"ahong", +"ahorse", +"ahorseback", +"Ahousaht", +"ahoy", +"Ahrendahronon", +"Ahriman", +"Ahrimanian", +"ahsan", +"Aht", +"ahu", +"ahuatle", +"ahuehuete", +"ahull", +"ahum", +"ahungered", +"ahungry", +"ahunt", +"ahura", +"ahush", +"ahwal", +"ahypnia", +"ai", +"Aias", +"Aiawong", +"aichmophobia", +"aid", +"aidable", +"aidance", +"aidant", +"aide", +"Aidenn", +"aider", +"Aides", +"aidful", +"aidless", +"aiel", +"aigialosaur", +"Aigialosauridae", +"Aigialosaurus", +"aiglet", +"aigremore", +"aigrette", +"aiguille", +"aiguillesque", +"aiguillette", +"aiguilletted", +"aikinite", +"ail", +"ailantery", +"ailanthic", +"Ailanthus", +"ailantine", +"ailanto", +"aile", +"Aileen", +"aileron", +"ailette", +"Ailie", +"ailing", +"aillt", +"ailment", +"ailsyte", +"Ailuridae", +"ailuro", +"ailuroid", +"Ailuroidea", +"Ailuropoda", +"Ailuropus", +"Ailurus", +"ailweed", +"aim", +"Aimak", +"aimara", +"Aimee", +"aimer", +"aimful", +"aimfully", +"aiming", +"aimless", +"aimlessly", +"aimlessness", +"Aimore", +"aimworthiness", +"ainaleh", +"ainhum", +"ainoi", +"ainsell", +"aint", +"Ainu", +"aion", +"aionial", +"air", +"Aira", +"airable", +"airampo", +"airan", +"airbound", +"airbrained", +"airbrush", +"aircraft", +"aircraftman", +"aircraftsman", +"aircraftswoman", +"aircraftwoman", +"aircrew", +"aircrewman", +"airdock", +"airdrome", +"airdrop", +"aire", +"Airedale", +"airedale", +"airer", +"airfield", +"airfoil", +"airframe", +"airfreight", +"airfreighter", +"airgraphics", +"airhead", +"airiferous", +"airified", +"airily", +"airiness", +"airing", +"airish", +"airless", +"airlift", +"airlike", +"airliner", +"airmail", +"airman", +"airmanship", +"airmark", +"airmarker", +"airmonger", +"airohydrogen", +"airometer", +"airpark", +"airphobia", +"airplane", +"airplanist", +"airport", +"airproof", +"airscape", +"airscrew", +"airship", +"airsick", +"airsickness", +"airstrip", +"airt", +"airtight", +"airtightly", +"airtightness", +"airward", +"airwards", +"airway", +"airwayman", +"airwoman", +"airworthiness", +"airworthy", +"airy", +"aischrolatreia", +"aiseweed", +"aisle", +"aisled", +"aisleless", +"aisling", +"Aissaoua", +"Aissor", +"aisteoir", +"Aistopoda", +"Aistopodes", +"ait", +"aitch", +"aitchbone", +"aitchless", +"aitchpiece", +"aitesis", +"aithochroi", +"aition", +"aitiotropic", +"Aitkenite", +"Aitutakian", +"aiwan", +"Aix", +"aizle", +"Aizoaceae", +"aizoaceous", +"Aizoon", +"Ajaja", +"ajaja", +"ajangle", +"ajar", +"ajari", +"Ajatasatru", +"ajava", +"ajhar", +"ajivika", +"ajog", +"ajoint", +"ajowan", +"Ajuga", +"ajutment", +"ak", +"Aka", +"aka", +"Akal", +"akala", +"Akali", +"akalimba", +"akamatsu", +"Akamnik", +"Akan", +"Akanekunik", +"Akania", +"Akaniaceae", +"akaroa", +"akasa", +"Akawai", +"akazga", +"akazgine", +"akcheh", +"ake", +"akeake", +"akebi", +"Akebia", +"akee", +"akeki", +"akeley", +"akenobeite", +"akepiro", +"akerite", +"akey", +"Akha", +"Akhissar", +"Akhlame", +"Akhmimic", +"akhoond", +"akhrot", +"akhyana", +"akia", +"Akim", +"akimbo", +"akin", +"akindle", +"akinesia", +"akinesic", +"akinesis", +"akinete", +"akinetic", +"Akiskemikinik", +"Akiyenik", +"Akka", +"Akkad", +"Akkadian", +"Akkadist", +"akmudar", +"akmuddar", +"aknee", +"ako", +"akoasm", +"akoasma", +"akoluthia", +"akonge", +"Akontae", +"Akoulalion", +"akov", +"akpek", +"Akra", +"akra", +"Akrabattine", +"akroasis", +"akrochordite", +"akroterion", +"Aktistetae", +"Aktistete", +"Aktivismus", +"Aktivist", +"aku", +"akuammine", +"akule", +"akund", +"Akwapim", +"Al", +"al", +"ala", +"Alabama", +"Alabaman", +"Alabamian", +"alabamide", +"alabamine", +"alabandite", +"alabarch", +"alabaster", +"alabastos", +"alabastrian", +"alabastrine", +"alabastrites", +"alabastron", +"alabastrum", +"alacha", +"alack", +"alackaday", +"alacreatine", +"alacreatinine", +"alacrify", +"alacritous", +"alacrity", +"Alactaga", +"alada", +"Aladdin", +"Aladdinize", +"Aladfar", +"Aladinist", +"alaihi", +"alaite", +"Alaki", +"Alala", +"alala", +"alalite", +"alalonga", +"alalunga", +"alalus", +"Alamanni", +"Alamannian", +"Alamannic", +"alameda", +"alamo", +"alamodality", +"alamonti", +"alamosite", +"alamoth", +"Alan", +"alan", +"aland", +"Alangiaceae", +"alangin", +"alangine", +"Alangium", +"alani", +"alanine", +"alannah", +"Alans", +"alantic", +"alantin", +"alantol", +"alantolactone", +"alantolic", +"alanyl", +"alar", +"Alarbus", +"alares", +"Alaria", +"Alaric", +"alarm", +"alarmable", +"alarmed", +"alarmedly", +"alarming", +"alarmingly", +"alarmism", +"alarmist", +"Alarodian", +"alarum", +"alary", +"alas", +"Alascan", +"Alaska", +"alaskaite", +"Alaskan", +"alaskite", +"Alaster", +"alastrim", +"alate", +"alated", +"alatern", +"alaternus", +"alation", +"Alauda", +"Alaudidae", +"alaudine", +"Alaunian", +"Alawi", +"Alb", +"alb", +"alba", +"albacore", +"albahaca", +"Albainn", +"Alban", +"alban", +"Albanenses", +"Albanensian", +"Albania", +"Albanian", +"albanite", +"Albany", +"albarco", +"albardine", +"albarello", +"albarium", +"albaspidin", +"albata", +"Albatros", +"albatross", +"albe", +"albedo", +"albedograph", +"albee", +"albeit", +"Alberene", +"Albert", +"Alberta", +"albertin", +"Albertina", +"Albertine", +"Albertinian", +"Albertist", +"albertite", +"albertustaler", +"albertype", +"albescence", +"albescent", +"albespine", +"albetad", +"Albi", +"Albian", +"albicans", +"albicant", +"albication", +"albiculi", +"albification", +"albificative", +"albiflorous", +"albify", +"Albigenses", +"Albigensian", +"Albigensianism", +"Albin", +"albinal", +"albiness", +"albinic", +"albinism", +"albinistic", +"albino", +"albinoism", +"albinotic", +"albinuria", +"Albion", +"Albireo", +"albite", +"albitic", +"albitite", +"albitization", +"albitophyre", +"Albizzia", +"albocarbon", +"albocinereous", +"Albococcus", +"albocracy", +"Alboin", +"albolite", +"albolith", +"albopannin", +"albopruinose", +"alboranite", +"Albrecht", +"Albright", +"albronze", +"Albruna", +"Albuca", +"Albuginaceae", +"albuginea", +"albugineous", +"albuginitis", +"albugo", +"album", +"albumean", +"albumen", +"albumenization", +"albumenize", +"albumenizer", +"albumimeter", +"albumin", +"albuminate", +"albuminaturia", +"albuminiferous", +"albuminiform", +"albuminimeter", +"albuminimetry", +"albuminiparous", +"albuminization", +"albuminize", +"albuminocholia", +"albuminofibrin", +"albuminogenous", +"albuminoid", +"albuminoidal", +"albuminolysis", +"albuminometer", +"albuminometry", +"albuminone", +"albuminorrhea", +"albuminoscope", +"albuminose", +"albuminosis", +"albuminous", +"albuminousness", +"albuminuria", +"albuminuric", +"albumoid", +"albumoscope", +"albumose", +"albumosuria", +"alburn", +"alburnous", +"alburnum", +"albus", +"albutannin", +"Albyn", +"Alca", +"Alcaaba", +"Alcae", +"Alcaic", +"alcaide", +"alcalde", +"alcaldeship", +"alcaldia", +"Alcaligenes", +"alcalizate", +"Alcalzar", +"alcamine", +"alcanna", +"Alcantara", +"Alcantarines", +"alcarraza", +"alcatras", +"alcazar", +"Alcedines", +"Alcedinidae", +"Alcedininae", +"Alcedo", +"alcelaphine", +"Alcelaphus", +"Alces", +"alchemic", +"alchemical", +"alchemically", +"Alchemilla", +"alchemist", +"alchemistic", +"alchemistical", +"alchemistry", +"alchemize", +"alchemy", +"alchera", +"alcheringa", +"alchimy", +"alchitran", +"alchochoden", +"Alchornea", +"alchymy", +"Alcibiadean", +"Alcicornium", +"Alcidae", +"alcidine", +"alcine", +"Alcippe", +"alclad", +"alco", +"alcoate", +"alcogel", +"alcogene", +"alcohate", +"alcohol", +"alcoholate", +"alcoholature", +"alcoholdom", +"alcoholemia", +"alcoholic", +"alcoholically", +"alcoholicity", +"alcoholimeter", +"alcoholism", +"alcoholist", +"alcoholizable", +"alcoholization", +"alcoholize", +"alcoholmeter", +"alcoholmetric", +"alcoholomania", +"alcoholometer", +"alcoholometric", +"alcoholometrical", +"alcoholometry", +"alcoholophilia", +"alcoholuria", +"alcoholysis", +"alcoholytic", +"Alcor", +"Alcoran", +"Alcoranic", +"Alcoranist", +"alcornoco", +"alcornoque", +"alcosol", +"Alcotate", +"alcove", +"alcovinometer", +"Alcuinian", +"alcyon", +"Alcyonacea", +"alcyonacean", +"Alcyonaria", +"alcyonarian", +"Alcyone", +"Alcyones", +"Alcyoniaceae", +"alcyonic", +"alcyoniform", +"Alcyonium", +"alcyonoid", +"aldamine", +"aldane", +"aldazin", +"aldazine", +"aldeament", +"Aldebaran", +"aldebaranium", +"aldehol", +"aldehydase", +"aldehyde", +"aldehydic", +"aldehydine", +"aldehydrol", +"alder", +"Alderamin", +"alderman", +"aldermanate", +"aldermancy", +"aldermaness", +"aldermanic", +"aldermanical", +"aldermanity", +"aldermanlike", +"aldermanly", +"aldermanry", +"aldermanship", +"aldern", +"Alderney", +"alderwoman", +"Aldhafara", +"Aldhafera", +"aldim", +"aldime", +"aldimine", +"Aldine", +"aldine", +"aldoheptose", +"aldohexose", +"aldoketene", +"aldol", +"aldolization", +"aldolize", +"aldononose", +"aldopentose", +"aldose", +"aldoside", +"aldoxime", +"Aldrovanda", +"Aldus", +"ale", +"Alea", +"aleak", +"aleatory", +"alebench", +"aleberry", +"Alebion", +"alec", +"alecithal", +"alecize", +"Aleck", +"aleconner", +"alecost", +"Alectoria", +"alectoria", +"Alectorides", +"alectoridine", +"alectorioid", +"Alectoris", +"alectoromachy", +"alectoromancy", +"Alectoromorphae", +"alectoromorphous", +"Alectoropodes", +"alectoropodous", +"Alectrion", +"Alectrionidae", +"alectryomachy", +"alectryomancy", +"Alectryon", +"alecup", +"alee", +"alef", +"alefnull", +"aleft", +"alefzero", +"alegar", +"alehoof", +"alehouse", +"alem", +"alemana", +"Alemanni", +"Alemannian", +"Alemannic", +"Alemannish", +"alembic", +"alembicate", +"alembroth", +"Alemite", +"alemite", +"alemmal", +"alemonger", +"alen", +"Alencon", +"Aleochara", +"aleph", +"alephs", +"alephzero", +"alepidote", +"alepole", +"alepot", +"Aleppine", +"Aleppo", +"alerce", +"alerse", +"alert", +"alertly", +"alertness", +"alesan", +"alestake", +"aletap", +"aletaster", +"Alethea", +"alethiology", +"alethopteis", +"alethopteroid", +"alethoscope", +"aletocyte", +"Aletris", +"alette", +"aleukemic", +"Aleurites", +"aleuritic", +"Aleurobius", +"Aleurodes", +"Aleurodidae", +"aleuromancy", +"aleurometer", +"aleuronat", +"aleurone", +"aleuronic", +"aleuroscope", +"Aleut", +"Aleutian", +"Aleutic", +"aleutite", +"alevin", +"alewife", +"Alexander", +"alexanders", +"Alexandra", +"Alexandreid", +"Alexandrian", +"Alexandrianism", +"Alexandrina", +"Alexandrine", +"alexandrite", +"Alexas", +"Alexia", +"alexia", +"Alexian", +"alexic", +"alexin", +"alexinic", +"alexipharmacon", +"alexipharmacum", +"alexipharmic", +"alexipharmical", +"alexipyretic", +"Alexis", +"alexiteric", +"alexiterical", +"Alexius", +"aleyard", +"Aleyrodes", +"aleyrodid", +"Aleyrodidae", +"Alf", +"alf", +"alfa", +"alfaje", +"alfalfa", +"alfaqui", +"alfaquin", +"alfenide", +"alfet", +"alfilaria", +"alfileria", +"alfilerilla", +"alfilerillo", +"alfiona", +"Alfirk", +"alfonsin", +"alfonso", +"alforja", +"Alfred", +"Alfreda", +"alfresco", +"alfridaric", +"alfridary", +"Alfur", +"Alfurese", +"Alfuro", +"alga", +"algae", +"algaecide", +"algaeological", +"algaeologist", +"algaeology", +"algaesthesia", +"algaesthesis", +"algal", +"algalia", +"Algaroth", +"algarroba", +"algarrobilla", +"algarrobin", +"Algarsife", +"Algarsyf", +"algate", +"Algebar", +"algebra", +"algebraic", +"algebraical", +"algebraically", +"algebraist", +"algebraization", +"algebraize", +"Algedi", +"algedo", +"algedonic", +"algedonics", +"algefacient", +"Algenib", +"Algerian", +"Algerine", +"algerine", +"Algernon", +"algesia", +"algesic", +"algesis", +"algesthesis", +"algetic", +"Algic", +"algic", +"algid", +"algidity", +"algidness", +"Algieba", +"algific", +"algin", +"alginate", +"algine", +"alginic", +"alginuresis", +"algiomuscular", +"algist", +"algivorous", +"algocyan", +"algodoncillo", +"algodonite", +"algoesthesiometer", +"algogenic", +"algoid", +"Algol", +"algolagnia", +"algolagnic", +"algolagnist", +"algolagny", +"algological", +"algologist", +"algology", +"Algoman", +"algometer", +"algometric", +"algometrical", +"algometrically", +"algometry", +"Algomian", +"Algomic", +"Algonkian", +"Algonquian", +"Algonquin", +"algophilia", +"algophilist", +"algophobia", +"algor", +"Algorab", +"Algores", +"algorism", +"algorismic", +"algorist", +"algoristic", +"algorithm", +"algorithmic", +"algosis", +"algous", +"algovite", +"algraphic", +"algraphy", +"alguazil", +"algum", +"Algy", +"Alhagi", +"Alhambra", +"Alhambraic", +"Alhambresque", +"Alhena", +"alhenna", +"alias", +"Alibamu", +"alibangbang", +"alibi", +"alibility", +"alible", +"Alicant", +"Alice", +"alichel", +"Alichino", +"Alicia", +"Alick", +"alicoche", +"alictisal", +"alicyclic", +"Alida", +"alidade", +"Alids", +"alien", +"alienability", +"alienable", +"alienage", +"alienate", +"alienation", +"alienator", +"aliency", +"alienee", +"aliener", +"alienicola", +"alienigenate", +"alienism", +"alienist", +"alienize", +"alienor", +"alienship", +"aliethmoid", +"aliethmoidal", +"alif", +"aliferous", +"aliform", +"aligerous", +"alight", +"align", +"aligner", +"alignment", +"aligreek", +"aliipoe", +"alike", +"alikeness", +"alikewise", +"Alikuluf", +"Alikulufan", +"alilonghi", +"alima", +"aliment", +"alimental", +"alimentally", +"alimentariness", +"alimentary", +"alimentation", +"alimentative", +"alimentatively", +"alimentativeness", +"alimenter", +"alimentic", +"alimentive", +"alimentiveness", +"alimentotherapy", +"alimentum", +"alimonied", +"alimony", +"alin", +"alinasal", +"Aline", +"alineation", +"alintatao", +"aliofar", +"Alioth", +"alipata", +"aliped", +"aliphatic", +"alipterion", +"aliptes", +"aliptic", +"aliquant", +"aliquot", +"aliseptal", +"alish", +"alisier", +"Alisma", +"Alismaceae", +"alismaceous", +"alismad", +"alismal", +"Alismales", +"Alismataceae", +"alismoid", +"aliso", +"Alison", +"alison", +"alisonite", +"alisp", +"alisphenoid", +"alisphenoidal", +"alist", +"Alister", +"alit", +"alite", +"alitrunk", +"aliturgic", +"aliturgical", +"aliunde", +"alive", +"aliveness", +"alivincular", +"Alix", +"aliyah", +"alizarate", +"alizari", +"alizarin", +"aljoba", +"alk", +"alkahest", +"alkahestic", +"alkahestica", +"alkahestical", +"Alkaid", +"alkalamide", +"alkalemia", +"alkalescence", +"alkalescency", +"alkalescent", +"alkali", +"alkalic", +"alkaliferous", +"alkalifiable", +"alkalify", +"alkaligen", +"alkaligenous", +"alkalimeter", +"alkalimetric", +"alkalimetrical", +"alkalimetrically", +"alkalimetry", +"alkaline", +"alkalinity", +"alkalinization", +"alkalinize", +"alkalinuria", +"alkalizable", +"alkalizate", +"alkalization", +"alkalize", +"alkalizer", +"alkaloid", +"alkaloidal", +"alkalometry", +"alkalosis", +"alkalous", +"Alkalurops", +"alkamin", +"alkamine", +"alkane", +"alkanet", +"Alkanna", +"alkannin", +"Alkaphrah", +"alkapton", +"alkaptonuria", +"alkaptonuric", +"alkargen", +"alkarsin", +"alkekengi", +"alkene", +"alkenna", +"alkenyl", +"alkermes", +"Alkes", +"alkide", +"alkine", +"alkool", +"Alkoran", +"Alkoranic", +"alkoxide", +"alkoxy", +"alkoxyl", +"alky", +"alkyd", +"alkyl", +"alkylamine", +"alkylate", +"alkylation", +"alkylene", +"alkylic", +"alkylidene", +"alkylize", +"alkylogen", +"alkyloxy", +"alkyne", +"allabuta", +"allactite", +"allaeanthus", +"allagite", +"allagophyllous", +"allagostemonous", +"Allah", +"allalinite", +"Allamanda", +"allamotti", +"allan", +"allanite", +"allanitic", +"allantiasis", +"allantochorion", +"allantoic", +"allantoid", +"allantoidal", +"Allantoidea", +"allantoidean", +"allantoidian", +"allantoin", +"allantoinase", +"allantoinuria", +"allantois", +"allantoxaidin", +"allanturic", +"Allasch", +"allassotonic", +"allative", +"allatrate", +"allay", +"allayer", +"allayment", +"allbone", +"Alle", +"allecret", +"allectory", +"allegate", +"allegation", +"allegator", +"allege", +"allegeable", +"allegedly", +"allegement", +"alleger", +"Alleghenian", +"Allegheny", +"allegiance", +"allegiancy", +"allegiant", +"allegoric", +"allegorical", +"allegorically", +"allegoricalness", +"allegorism", +"allegorist", +"allegorister", +"allegoristic", +"allegorization", +"allegorize", +"allegorizer", +"allegory", +"allegretto", +"allegro", +"allele", +"allelic", +"allelism", +"allelocatalytic", +"allelomorph", +"allelomorphic", +"allelomorphism", +"allelotropic", +"allelotropism", +"allelotropy", +"alleluia", +"alleluiatic", +"allemand", +"allemande", +"allemontite", +"allenarly", +"allene", +"Allentiac", +"Allentiacan", +"aller", +"allergen", +"allergenic", +"allergia", +"allergic", +"allergin", +"allergist", +"allergy", +"allerion", +"allesthesia", +"alleviate", +"alleviatingly", +"alleviation", +"alleviative", +"alleviator", +"alleviatory", +"alley", +"alleyed", +"alleyite", +"alleyway", +"allgood", +"Allhallow", +"Allhallowtide", +"allheal", +"alliable", +"alliably", +"Alliaceae", +"alliaceous", +"alliance", +"alliancer", +"Alliaria", +"allicampane", +"allice", +"allicholly", +"alliciency", +"allicient", +"Allie", +"allied", +"Allies", +"allies", +"alligate", +"alligator", +"alligatored", +"allineate", +"allineation", +"Allionia", +"Allioniaceae", +"allision", +"alliteral", +"alliterate", +"alliteration", +"alliterational", +"alliterationist", +"alliterative", +"alliteratively", +"alliterativeness", +"alliterator", +"Allium", +"allivalite", +"allmouth", +"allness", +"Allobroges", +"allocable", +"allocaffeine", +"allocatable", +"allocate", +"allocatee", +"allocation", +"allocator", +"allochetia", +"allochetite", +"allochezia", +"allochiral", +"allochirally", +"allochiria", +"allochlorophyll", +"allochroic", +"allochroite", +"allochromatic", +"allochroous", +"allochthonous", +"allocinnamic", +"alloclase", +"alloclasite", +"allocochick", +"allocrotonic", +"allocryptic", +"allocute", +"allocution", +"allocutive", +"allocyanine", +"allodelphite", +"allodesmism", +"alloeosis", +"alloeostropha", +"alloeotic", +"alloerotic", +"alloerotism", +"allogamous", +"allogamy", +"allogene", +"allogeneity", +"allogeneous", +"allogenic", +"allogenically", +"allograph", +"alloiogenesis", +"alloisomer", +"alloisomeric", +"alloisomerism", +"allokinesis", +"allokinetic", +"allokurtic", +"allomerism", +"allomerous", +"allometric", +"allometry", +"allomorph", +"allomorphic", +"allomorphism", +"allomorphite", +"allomucic", +"allonomous", +"allonym", +"allonymous", +"allopalladium", +"allopath", +"allopathetic", +"allopathetically", +"allopathic", +"allopathically", +"allopathist", +"allopathy", +"allopatric", +"allopatrically", +"allopatry", +"allopelagic", +"allophanamide", +"allophanates", +"allophane", +"allophanic", +"allophone", +"allophyle", +"allophylian", +"allophylic", +"Allophylus", +"allophytoid", +"alloplasm", +"alloplasmatic", +"alloplasmic", +"alloplast", +"alloplastic", +"alloplasty", +"alloploidy", +"allopolyploid", +"allopsychic", +"alloquial", +"alloquialism", +"alloquy", +"allorhythmia", +"allorrhyhmia", +"allorrhythmic", +"allosaur", +"Allosaurus", +"allose", +"allosematic", +"allosome", +"allosyndesis", +"allosyndetic", +"allot", +"allotee", +"allotelluric", +"allotheism", +"Allotheria", +"allothigene", +"allothigenetic", +"allothigenetically", +"allothigenic", +"allothigenous", +"allothimorph", +"allothimorphic", +"allothogenic", +"allothogenous", +"allotment", +"allotriodontia", +"Allotriognathi", +"allotriomorphic", +"allotriophagia", +"allotriophagy", +"allotriuria", +"allotrope", +"allotrophic", +"allotropic", +"allotropical", +"allotropically", +"allotropicity", +"allotropism", +"allotropize", +"allotropous", +"allotropy", +"allotrylic", +"allottable", +"allottee", +"allotter", +"allotype", +"allotypical", +"allover", +"allow", +"allowable", +"allowableness", +"allowably", +"allowance", +"allowedly", +"allower", +"alloxan", +"alloxanate", +"alloxanic", +"alloxantin", +"alloxuraemia", +"alloxuremia", +"alloxuric", +"alloxyproteic", +"alloy", +"alloyage", +"allozooid", +"allseed", +"allspice", +"allthing", +"allthorn", +"alltud", +"allude", +"allure", +"allurement", +"allurer", +"alluring", +"alluringly", +"alluringness", +"allusion", +"allusive", +"allusively", +"allusiveness", +"alluvia", +"alluvial", +"alluviate", +"alluviation", +"alluvion", +"alluvious", +"alluvium", +"allwhere", +"allwhither", +"allwork", +"Allworthy", +"Ally", +"ally", +"allyl", +"allylamine", +"allylate", +"allylation", +"allylene", +"allylic", +"allylthiourea", +"Alma", +"alma", +"Almach", +"almaciga", +"almacigo", +"almadia", +"almadie", +"almagest", +"almagra", +"Almain", +"Alman", +"almanac", +"almandine", +"almandite", +"alme", +"almeidina", +"almemar", +"Almerian", +"almeriite", +"Almida", +"almightily", +"almightiness", +"almighty", +"almique", +"Almira", +"almirah", +"almochoden", +"Almohad", +"Almohade", +"Almohades", +"almoign", +"Almon", +"almon", +"almond", +"almondy", +"almoner", +"almonership", +"almonry", +"Almoravid", +"Almoravide", +"Almoravides", +"almost", +"almous", +"alms", +"almsdeed", +"almsfolk", +"almsful", +"almsgiver", +"almsgiving", +"almshouse", +"almsman", +"almswoman", +"almucantar", +"almuce", +"almud", +"almude", +"almug", +"Almuredin", +"almuten", +"aln", +"alnage", +"alnager", +"alnagership", +"Alnaschar", +"Alnascharism", +"alnein", +"alnico", +"Alnilam", +"alniresinol", +"Alnitak", +"Alnitham", +"alniviridol", +"alnoite", +"alnuin", +"Alnus", +"alo", +"Aloadae", +"Alocasia", +"alochia", +"alod", +"alodial", +"alodialism", +"alodialist", +"alodiality", +"alodially", +"alodian", +"alodiary", +"alodification", +"alodium", +"alody", +"aloe", +"aloed", +"aloelike", +"aloemodin", +"aloeroot", +"aloesol", +"aloeswood", +"aloetic", +"aloetical", +"aloewood", +"aloft", +"alogia", +"Alogian", +"alogical", +"alogically", +"alogism", +"alogy", +"aloid", +"aloin", +"Alois", +"aloisiite", +"aloma", +"alomancy", +"alone", +"aloneness", +"along", +"alongshore", +"alongshoreman", +"alongside", +"alongst", +"Alonso", +"Alonsoa", +"Alonzo", +"aloof", +"aloofly", +"aloofness", +"aloose", +"alop", +"alopecia", +"Alopecias", +"alopecist", +"alopecoid", +"Alopecurus", +"alopeke", +"Alopias", +"Alopiidae", +"Alosa", +"alose", +"Alouatta", +"alouatte", +"aloud", +"alow", +"alowe", +"Aloxite", +"Aloysia", +"Aloysius", +"alp", +"alpaca", +"alpasotes", +"Alpax", +"alpeen", +"Alpen", +"alpenglow", +"alpenhorn", +"alpenstock", +"alpenstocker", +"alpestral", +"alpestrian", +"alpestrine", +"alpha", +"alphabet", +"alphabetarian", +"alphabetic", +"alphabetical", +"alphabetically", +"alphabetics", +"alphabetiform", +"alphabetism", +"alphabetist", +"alphabetization", +"alphabetize", +"alphabetizer", +"Alphard", +"alphatoluic", +"Alphean", +"Alphecca", +"alphenic", +"Alpheratz", +"alphitomancy", +"alphitomorphous", +"alphol", +"Alphonist", +"Alphonse", +"Alphonsine", +"Alphonsism", +"Alphonso", +"alphorn", +"alphos", +"alphosis", +"alphyl", +"Alpian", +"Alpid", +"alpieu", +"alpigene", +"Alpine", +"alpine", +"alpinely", +"alpinery", +"alpinesque", +"Alpinia", +"Alpiniaceae", +"Alpinism", +"Alpinist", +"alpist", +"Alpujarra", +"alqueire", +"alquier", +"alquifou", +"alraun", +"alreadiness", +"already", +"alright", +"alrighty", +"alroot", +"alruna", +"Alsatia", +"Alsatian", +"alsbachite", +"Alshain", +"Alsinaceae", +"alsinaceous", +"Alsine", +"also", +"alsoon", +"Alsophila", +"Alstonia", +"alstonidine", +"alstonine", +"alstonite", +"Alstroemeria", +"alsweill", +"alt", +"Altaian", +"Altaic", +"Altaid", +"Altair", +"altaite", +"Altamira", +"altar", +"altarage", +"altared", +"altarist", +"altarlet", +"altarpiece", +"altarwise", +"altazimuth", +"alter", +"alterability", +"alterable", +"alterableness", +"alterably", +"alterant", +"alterate", +"alteration", +"alterative", +"altercate", +"altercation", +"altercative", +"alteregoism", +"alteregoistic", +"alterer", +"alterity", +"altern", +"alternacy", +"alternance", +"alternant", +"Alternanthera", +"Alternaria", +"alternariose", +"alternate", +"alternately", +"alternateness", +"alternating", +"alternatingly", +"alternation", +"alternationist", +"alternative", +"alternatively", +"alternativeness", +"alternativity", +"alternator", +"alterne", +"alternifoliate", +"alternipetalous", +"alternipinnate", +"alternisepalous", +"alternize", +"alterocentric", +"Althaea", +"althaein", +"Althea", +"althea", +"althein", +"altheine", +"althionic", +"altho", +"althorn", +"although", +"Altica", +"Alticamelus", +"altigraph", +"altilik", +"altiloquence", +"altiloquent", +"altimeter", +"altimetrical", +"altimetrically", +"altimetry", +"altin", +"altincar", +"Altingiaceae", +"altingiaceous", +"altininck", +"altiplano", +"altiscope", +"altisonant", +"altisonous", +"altissimo", +"altitude", +"altitudinal", +"altitudinarian", +"alto", +"altogether", +"altogetherness", +"altometer", +"altoun", +"altrices", +"altricial", +"altropathy", +"altrose", +"altruism", +"altruist", +"altruistic", +"altruistically", +"altschin", +"altun", +"Aluco", +"Aluconidae", +"Aluconinae", +"aludel", +"Aludra", +"alula", +"alular", +"alulet", +"Alulim", +"alum", +"alumbloom", +"Alumel", +"alumic", +"alumiferous", +"alumina", +"aluminaphone", +"aluminate", +"alumine", +"aluminic", +"aluminide", +"aluminiferous", +"aluminiform", +"aluminish", +"aluminite", +"aluminium", +"aluminize", +"aluminoferric", +"aluminographic", +"aluminography", +"aluminose", +"aluminosilicate", +"aluminosis", +"aluminosity", +"aluminothermic", +"aluminothermics", +"aluminothermy", +"aluminotype", +"aluminous", +"aluminum", +"aluminyl", +"alumish", +"alumite", +"alumium", +"alumna", +"alumnae", +"alumnal", +"alumni", +"alumniate", +"Alumnol", +"alumnus", +"alumohydrocalcite", +"alumroot", +"Alundum", +"aluniferous", +"alunite", +"alunogen", +"alupag", +"Alur", +"alure", +"alurgite", +"alushtite", +"aluta", +"alutaceous", +"Alvah", +"Alvan", +"alvar", +"alvearium", +"alveary", +"alveloz", +"alveola", +"alveolar", +"alveolariform", +"alveolary", +"alveolate", +"alveolated", +"alveolation", +"alveole", +"alveolectomy", +"alveoli", +"alveoliform", +"alveolite", +"Alveolites", +"alveolitis", +"alveoloclasia", +"alveolocondylean", +"alveolodental", +"alveololabial", +"alveololingual", +"alveolonasal", +"alveolosubnasal", +"alveolotomy", +"alveolus", +"alveus", +"alviducous", +"Alvin", +"Alvina", +"alvine", +"Alvissmal", +"alvite", +"alvus", +"alway", +"always", +"aly", +"Alya", +"alycompaine", +"alymphia", +"alymphopotent", +"alypin", +"alysson", +"Alyssum", +"alytarch", +"Alytes", +"am", +"ama", +"amaas", +"Amabel", +"amability", +"amacratic", +"amacrinal", +"amacrine", +"amadavat", +"amadelphous", +"Amadi", +"Amadis", +"amadou", +"Amaethon", +"Amafingo", +"amaga", +"amah", +"Amahuaca", +"amain", +"amaister", +"amakebe", +"Amakosa", +"amala", +"amalaita", +"amalaka", +"Amalfian", +"Amalfitan", +"amalgam", +"amalgamable", +"amalgamate", +"amalgamation", +"amalgamationist", +"amalgamative", +"amalgamatize", +"amalgamator", +"amalgamist", +"amalgamization", +"amalgamize", +"Amalings", +"Amalrician", +"amaltas", +"amamau", +"Amampondo", +"Amanda", +"amandin", +"Amandus", +"amang", +"amani", +"amania", +"Amanist", +"Amanita", +"amanitin", +"amanitine", +"Amanitopsis", +"amanori", +"amanous", +"amantillo", +"amanuenses", +"amanuensis", +"amapa", +"Amapondo", +"amar", +"Amara", +"Amarantaceae", +"amarantaceous", +"amaranth", +"Amaranthaceae", +"amaranthaceous", +"amaranthine", +"amaranthoid", +"Amaranthus", +"amarantite", +"Amarantus", +"amarelle", +"amarevole", +"amargoso", +"amarillo", +"amarin", +"amarine", +"amaritude", +"amarity", +"amaroid", +"amaroidal", +"amarthritis", +"amaryllid", +"Amaryllidaceae", +"amaryllidaceous", +"amaryllideous", +"Amaryllis", +"amasesis", +"amass", +"amassable", +"amasser", +"amassment", +"Amasta", +"amasthenic", +"amastia", +"amasty", +"Amatembu", +"amaterialistic", +"amateur", +"amateurish", +"amateurishly", +"amateurishness", +"amateurism", +"amateurship", +"Amati", +"amative", +"amatively", +"amativeness", +"amatol", +"amatorial", +"amatorially", +"amatorian", +"amatorious", +"amatory", +"amatrice", +"amatungula", +"amaurosis", +"amaurotic", +"amaze", +"amazed", +"amazedly", +"amazedness", +"amazeful", +"amazement", +"amazia", +"Amazilia", +"amazing", +"amazingly", +"Amazon", +"Amazona", +"Amazonian", +"Amazonism", +"amazonite", +"Amazulu", +"amba", +"ambage", +"ambagiosity", +"ambagious", +"ambagiously", +"ambagiousness", +"ambagitory", +"ambalam", +"amban", +"ambar", +"ambaree", +"ambarella", +"ambary", +"ambash", +"ambassade", +"Ambassadeur", +"ambassador", +"ambassadorial", +"ambassadorially", +"ambassadorship", +"ambassadress", +"ambassage", +"ambassy", +"ambatch", +"ambatoarinite", +"ambay", +"ambeer", +"amber", +"amberfish", +"ambergris", +"amberiferous", +"amberite", +"amberoid", +"amberous", +"ambery", +"ambicolorate", +"ambicoloration", +"ambidexter", +"ambidexterity", +"ambidextral", +"ambidextrous", +"ambidextrously", +"ambidextrousness", +"ambience", +"ambiency", +"ambiens", +"ambient", +"ambier", +"ambigenous", +"ambiguity", +"ambiguous", +"ambiguously", +"ambiguousness", +"ambilateral", +"ambilateralaterally", +"ambilaterality", +"ambilevous", +"ambilian", +"ambilogy", +"ambiopia", +"ambiparous", +"ambisinister", +"ambisinistrous", +"ambisporangiate", +"ambisyllabic", +"ambit", +"ambital", +"ambitendency", +"ambition", +"ambitionist", +"ambitionless", +"ambitionlessly", +"ambitious", +"ambitiously", +"ambitiousness", +"ambitty", +"ambitus", +"ambivalence", +"ambivalency", +"ambivalent", +"ambivert", +"amble", +"ambler", +"ambling", +"amblingly", +"amblotic", +"amblyacousia", +"amblyaphia", +"Amblycephalidae", +"Amblycephalus", +"amblychromatic", +"Amblydactyla", +"amblygeusia", +"amblygon", +"amblygonal", +"amblygonite", +"amblyocarpous", +"Amblyomma", +"amblyope", +"amblyopia", +"amblyopic", +"Amblyopsidae", +"Amblyopsis", +"amblyoscope", +"amblypod", +"Amblypoda", +"amblypodous", +"Amblyrhynchus", +"amblystegite", +"Amblystoma", +"ambo", +"amboceptoid", +"amboceptor", +"Ambocoelia", +"Amboina", +"Amboinese", +"ambomalleal", +"ambon", +"ambonite", +"Ambonnay", +"ambos", +"ambosexous", +"ambosexual", +"ambrain", +"ambrein", +"ambrette", +"Ambrica", +"ambrite", +"ambroid", +"ambrology", +"Ambrose", +"ambrose", +"ambrosia", +"ambrosiac", +"Ambrosiaceae", +"ambrosiaceous", +"ambrosial", +"ambrosially", +"Ambrosian", +"ambrosian", +"ambrosiate", +"ambrosin", +"ambrosine", +"Ambrosio", +"ambrosterol", +"ambrotype", +"ambry", +"ambsace", +"ambulacral", +"ambulacriform", +"ambulacrum", +"ambulance", +"ambulancer", +"ambulant", +"ambulate", +"ambulatio", +"ambulation", +"ambulative", +"ambulator", +"Ambulatoria", +"ambulatorial", +"ambulatorium", +"ambulatory", +"ambuling", +"ambulomancy", +"amburbial", +"ambury", +"ambuscade", +"ambuscader", +"ambush", +"ambusher", +"ambushment", +"Ambystoma", +"Ambystomidae", +"amchoor", +"ame", +"amebiform", +"ameed", +"ameen", +"Ameiuridae", +"Ameiurus", +"Ameiva", +"Amelanchier", +"amelcorn", +"Amelia", +"amelia", +"amelification", +"ameliorable", +"ameliorableness", +"ameliorant", +"ameliorate", +"amelioration", +"ameliorativ", +"ameliorative", +"ameliorator", +"amellus", +"ameloblast", +"ameloblastic", +"amelu", +"amelus", +"Amen", +"amen", +"amenability", +"amenable", +"amenableness", +"amenably", +"amend", +"amendable", +"amendableness", +"amendatory", +"amende", +"amender", +"amendment", +"amends", +"amene", +"amenia", +"Amenism", +"Amenite", +"amenity", +"amenorrhea", +"amenorrheal", +"amenorrheic", +"amenorrhoea", +"ament", +"amentaceous", +"amental", +"amentia", +"Amentiferae", +"amentiferous", +"amentiform", +"amentulum", +"amentum", +"amerce", +"amerceable", +"amercement", +"amercer", +"amerciament", +"America", +"American", +"Americana", +"Americanese", +"Americanism", +"Americanist", +"Americanistic", +"Americanitis", +"Americanization", +"Americanize", +"Americanizer", +"Americanly", +"Americanoid", +"Americaward", +"Americawards", +"americium", +"Americomania", +"Americophobe", +"Amerimnon", +"Amerind", +"Amerindian", +"Amerindic", +"amerism", +"ameristic", +"amesite", +"Ametabola", +"ametabole", +"ametabolia", +"ametabolian", +"ametabolic", +"ametabolism", +"ametabolous", +"ametaboly", +"ametallous", +"amethodical", +"amethodically", +"amethyst", +"amethystine", +"ametoecious", +"ametria", +"ametrometer", +"ametrope", +"ametropia", +"ametropic", +"ametrous", +"Amex", +"amgarn", +"amhar", +"amherstite", +"amhran", +"ami", +"Amia", +"amiability", +"amiable", +"amiableness", +"amiably", +"amianth", +"amianthiform", +"amianthine", +"Amianthium", +"amianthoid", +"amianthoidal", +"amianthus", +"amic", +"amicability", +"amicable", +"amicableness", +"amicably", +"amical", +"amice", +"amiced", +"amicicide", +"amicrobic", +"amicron", +"amicronucleate", +"amid", +"amidase", +"amidate", +"amidation", +"amide", +"amidic", +"amidid", +"amidide", +"amidin", +"amidine", +"Amidism", +"Amidist", +"amido", +"amidoacetal", +"amidoacetic", +"amidoacetophenone", +"amidoaldehyde", +"amidoazo", +"amidoazobenzene", +"amidoazobenzol", +"amidocaffeine", +"amidocapric", +"amidofluorid", +"amidofluoride", +"amidogen", +"amidoguaiacol", +"amidohexose", +"amidoketone", +"amidol", +"amidomyelin", +"amidon", +"amidophenol", +"amidophosphoric", +"amidoplast", +"amidoplastid", +"amidopyrine", +"amidosuccinamic", +"amidosulphonal", +"amidothiazole", +"amidoxime", +"amidoxy", +"amidoxyl", +"amidrazone", +"amidship", +"amidships", +"amidst", +"amidstream", +"amidulin", +"Amiidae", +"amil", +"Amiles", +"Amiloun", +"amimia", +"amimide", +"amin", +"aminate", +"amination", +"amine", +"amini", +"aminic", +"aminity", +"aminization", +"aminize", +"amino", +"aminoacetal", +"aminoacetanilide", +"aminoacetic", +"aminoacetone", +"aminoacetophenetidine", +"aminoacetophenone", +"aminoacidemia", +"aminoaciduria", +"aminoanthraquinone", +"aminoazobenzene", +"aminobarbituric", +"aminobenzaldehyde", +"aminobenzamide", +"aminobenzene", +"aminobenzoic", +"aminocaproic", +"aminodiphenyl", +"aminoethionic", +"aminoformic", +"aminogen", +"aminoglutaric", +"aminoguanidine", +"aminoid", +"aminoketone", +"aminolipin", +"aminolysis", +"aminolytic", +"aminomalonic", +"aminomyelin", +"aminophenol", +"aminoplast", +"aminoplastic", +"aminopropionic", +"aminopurine", +"aminopyrine", +"aminoquinoline", +"aminosis", +"aminosuccinamic", +"aminosulphonic", +"aminothiophen", +"aminovaleric", +"aminoxylol", +"Aminta", +"Amintor", +"Amioidei", +"amir", +"Amiranha", +"amiray", +"amirship", +"Amish", +"Amishgo", +"amiss", +"amissibility", +"amissible", +"amissness", +"Amita", +"Amitabha", +"amitosis", +"amitotic", +"amitotically", +"amity", +"amixia", +"Amizilis", +"amla", +"amli", +"amlikar", +"amlong", +"Amma", +"amma", +"amman", +"Ammanite", +"ammelide", +"ammelin", +"ammeline", +"ammer", +"ammeter", +"Ammi", +"Ammiaceae", +"ammiaceous", +"ammine", +"amminochloride", +"amminolysis", +"amminolytic", +"ammiolite", +"ammo", +"Ammobium", +"ammochaeta", +"ammochryse", +"ammocoete", +"ammocoetes", +"ammocoetid", +"Ammocoetidae", +"ammocoetiform", +"ammocoetoid", +"Ammodytes", +"Ammodytidae", +"ammodytoid", +"ammonal", +"ammonate", +"ammonation", +"Ammonea", +"ammonia", +"ammoniacal", +"ammoniacum", +"ammoniate", +"ammoniation", +"ammonic", +"ammonical", +"ammoniemia", +"ammonification", +"ammonifier", +"ammonify", +"ammoniojarosite", +"ammonion", +"ammonionitrate", +"Ammonite", +"ammonite", +"Ammonites", +"Ammonitess", +"ammonitic", +"ammoniticone", +"ammonitiferous", +"Ammonitish", +"ammonitoid", +"Ammonitoidea", +"ammonium", +"ammoniuria", +"ammonization", +"ammono", +"ammonobasic", +"ammonocarbonic", +"ammonocarbonous", +"ammonoid", +"Ammonoidea", +"ammonoidean", +"ammonolysis", +"ammonolytic", +"ammonolyze", +"Ammophila", +"ammophilous", +"ammoresinol", +"ammotherapy", +"ammu", +"ammunition", +"amnemonic", +"amnesia", +"amnesic", +"amnestic", +"amnesty", +"amniac", +"amniatic", +"amnic", +"Amnigenia", +"amnioallantoic", +"amniochorial", +"amnioclepsis", +"amniomancy", +"amnion", +"Amnionata", +"amnionate", +"amnionic", +"amniorrhea", +"Amniota", +"amniote", +"amniotitis", +"amniotome", +"amober", +"amobyr", +"amoeba", +"amoebae", +"Amoebaea", +"amoebaean", +"amoebaeum", +"amoebalike", +"amoeban", +"amoebian", +"amoebiasis", +"amoebic", +"amoebicide", +"amoebid", +"Amoebida", +"Amoebidae", +"amoebiform", +"Amoebobacter", +"Amoebobacterieae", +"amoebocyte", +"Amoebogeniae", +"amoeboid", +"amoeboidism", +"amoebous", +"amoebula", +"amok", +"amoke", +"amole", +"amolilla", +"amomal", +"Amomales", +"Amomis", +"amomum", +"among", +"amongst", +"amontillado", +"amor", +"amorado", +"amoraic", +"amoraim", +"amoral", +"amoralism", +"amoralist", +"amorality", +"amoralize", +"Amores", +"amoret", +"amoretto", +"Amoreuxia", +"amorism", +"amorist", +"amoristic", +"Amorite", +"Amoritic", +"Amoritish", +"amorosity", +"amoroso", +"amorous", +"amorously", +"amorousness", +"Amorpha", +"amorphia", +"amorphic", +"amorphinism", +"amorphism", +"Amorphophallus", +"amorphophyte", +"amorphotae", +"amorphous", +"amorphously", +"amorphousness", +"amorphus", +"amorphy", +"amort", +"amortisseur", +"amortizable", +"amortization", +"amortize", +"amortizement", +"Amorua", +"Amos", +"Amoskeag", +"amotion", +"amotus", +"amount", +"amour", +"amourette", +"amovability", +"amovable", +"amove", +"Amoy", +"Amoyan", +"Amoyese", +"ampalaya", +"ampalea", +"ampangabeite", +"ampasimenite", +"Ampelidaceae", +"ampelidaceous", +"Ampelidae", +"ampelideous", +"Ampelis", +"ampelite", +"ampelitic", +"ampelographist", +"ampelography", +"ampelopsidin", +"ampelopsin", +"Ampelopsis", +"Ampelosicyos", +"ampelotherapy", +"amper", +"amperage", +"ampere", +"amperemeter", +"Amperian", +"amperometer", +"ampersand", +"ampery", +"amphanthium", +"ampheclexis", +"ampherotokous", +"ampherotoky", +"amphetamine", +"amphiarthrodial", +"amphiarthrosis", +"amphiaster", +"amphibalus", +"Amphibia", +"amphibial", +"amphibian", +"amphibichnite", +"amphibiety", +"amphibiological", +"amphibiology", +"amphibion", +"amphibiotic", +"Amphibiotica", +"amphibious", +"amphibiously", +"amphibiousness", +"amphibium", +"amphiblastic", +"amphiblastula", +"amphiblestritis", +"Amphibola", +"amphibole", +"amphibolia", +"amphibolic", +"amphiboliferous", +"amphiboline", +"amphibolite", +"amphibolitic", +"amphibological", +"amphibologically", +"amphibologism", +"amphibology", +"amphibolous", +"amphiboly", +"amphibrach", +"amphibrachic", +"amphibryous", +"Amphicarpa", +"Amphicarpaea", +"amphicarpic", +"amphicarpium", +"amphicarpogenous", +"amphicarpous", +"amphicentric", +"amphichroic", +"amphichrom", +"amphichromatic", +"amphichrome", +"amphicoelian", +"amphicoelous", +"Amphicondyla", +"amphicondylous", +"amphicrania", +"amphicreatinine", +"amphicribral", +"amphictyon", +"amphictyonian", +"amphictyonic", +"amphictyony", +"Amphicyon", +"Amphicyonidae", +"amphicyrtic", +"amphicyrtous", +"amphicytula", +"amphid", +"amphide", +"amphidesmous", +"amphidetic", +"amphidiarthrosis", +"amphidiploid", +"amphidiploidy", +"amphidisc", +"Amphidiscophora", +"amphidiscophoran", +"amphierotic", +"amphierotism", +"Amphigaea", +"amphigam", +"Amphigamae", +"amphigamous", +"amphigastrium", +"amphigastrula", +"amphigean", +"amphigen", +"amphigene", +"amphigenesis", +"amphigenetic", +"amphigenous", +"amphigenously", +"amphigonic", +"amphigonium", +"amphigonous", +"amphigony", +"amphigoric", +"amphigory", +"amphigouri", +"amphikaryon", +"amphilogism", +"amphilogy", +"amphimacer", +"amphimictic", +"amphimictical", +"amphimictically", +"amphimixis", +"amphimorula", +"Amphinesian", +"Amphineura", +"amphineurous", +"amphinucleus", +"Amphion", +"Amphionic", +"Amphioxi", +"Amphioxidae", +"Amphioxides", +"Amphioxididae", +"amphioxus", +"amphipeptone", +"amphiphloic", +"amphiplatyan", +"Amphipleura", +"amphiploid", +"amphiploidy", +"amphipneust", +"Amphipneusta", +"amphipneustic", +"Amphipnous", +"amphipod", +"Amphipoda", +"amphipodal", +"amphipodan", +"amphipodiform", +"amphipodous", +"amphiprostylar", +"amphiprostyle", +"amphiprotic", +"amphipyrenin", +"Amphirhina", +"amphirhinal", +"amphirhine", +"amphisarca", +"amphisbaena", +"amphisbaenian", +"amphisbaenic", +"Amphisbaenidae", +"amphisbaenoid", +"amphisbaenous", +"amphiscians", +"amphiscii", +"Amphisile", +"Amphisilidae", +"amphispermous", +"amphisporangiate", +"amphispore", +"Amphistoma", +"amphistomatic", +"amphistome", +"amphistomoid", +"amphistomous", +"Amphistomum", +"amphistylar", +"amphistylic", +"amphistyly", +"amphitene", +"amphitheater", +"amphitheatered", +"amphitheatral", +"amphitheatric", +"amphitheatrical", +"amphitheatrically", +"amphithecial", +"amphithecium", +"amphithect", +"amphithyron", +"amphitokal", +"amphitokous", +"amphitoky", +"amphitriaene", +"amphitrichous", +"Amphitrite", +"amphitropal", +"amphitropous", +"Amphitruo", +"Amphitryon", +"Amphiuma", +"Amphiumidae", +"amphivasal", +"amphivorous", +"Amphizoidae", +"amphodarch", +"amphodelite", +"amphodiplopia", +"amphogenous", +"ampholyte", +"amphopeptone", +"amphophil", +"amphophile", +"amphophilic", +"amphophilous", +"amphora", +"amphoral", +"amphore", +"amphorette", +"amphoric", +"amphoricity", +"amphoriloquy", +"amphorophony", +"amphorous", +"amphoteric", +"Amphrysian", +"ample", +"amplectant", +"ampleness", +"amplexation", +"amplexicaudate", +"amplexicaul", +"amplexicauline", +"amplexifoliate", +"amplexus", +"ampliate", +"ampliation", +"ampliative", +"amplicative", +"amplidyne", +"amplification", +"amplificative", +"amplificator", +"amplificatory", +"amplifier", +"amplify", +"amplitude", +"amply", +"ampollosity", +"ampongue", +"ampoule", +"ampul", +"ampulla", +"ampullaceous", +"ampullar", +"Ampullaria", +"Ampullariidae", +"ampullary", +"ampullate", +"ampullated", +"ampulliform", +"ampullitis", +"ampullula", +"amputate", +"amputation", +"amputational", +"amputative", +"amputator", +"amputee", +"ampyx", +"amra", +"amreeta", +"amrita", +"Amritsar", +"amsath", +"amsel", +"Amsonia", +"Amsterdamer", +"amt", +"amtman", +"Amuchco", +"amuck", +"Amueixa", +"amuguis", +"amula", +"amulet", +"amuletic", +"amulla", +"amunam", +"amurca", +"amurcosity", +"amurcous", +"Amurru", +"amusable", +"amuse", +"amused", +"amusedly", +"amusee", +"amusement", +"amuser", +"amusette", +"Amusgo", +"amusia", +"amusing", +"amusingly", +"amusingness", +"amusive", +"amusively", +"amusiveness", +"amutter", +"amuyon", +"amuyong", +"amuze", +"amvis", +"Amy", +"amy", +"Amyclaean", +"Amyclas", +"amyelencephalia", +"amyelencephalic", +"amyelencephalous", +"amyelia", +"amyelic", +"amyelinic", +"amyelonic", +"amyelous", +"amygdal", +"amygdala", +"Amygdalaceae", +"amygdalaceous", +"amygdalase", +"amygdalate", +"amygdalectomy", +"amygdalic", +"amygdaliferous", +"amygdaliform", +"amygdalin", +"amygdaline", +"amygdalinic", +"amygdalitis", +"amygdaloid", +"amygdaloidal", +"amygdalolith", +"amygdaloncus", +"amygdalopathy", +"amygdalothripsis", +"amygdalotome", +"amygdalotomy", +"Amygdalus", +"amygdonitrile", +"amygdophenin", +"amygdule", +"amyl", +"amylaceous", +"amylamine", +"amylan", +"amylase", +"amylate", +"amylemia", +"amylene", +"amylenol", +"amylic", +"amylidene", +"amyliferous", +"amylin", +"amylo", +"amylocellulose", +"amyloclastic", +"amylocoagulase", +"amylodextrin", +"amylodyspepsia", +"amylogen", +"amylogenesis", +"amylogenic", +"amylohydrolysis", +"amylohydrolytic", +"amyloid", +"amyloidal", +"amyloidosis", +"amyloleucite", +"amylolysis", +"amylolytic", +"amylom", +"amylometer", +"amylon", +"amylopectin", +"amylophagia", +"amylophosphate", +"amylophosphoric", +"amyloplast", +"amyloplastic", +"amyloplastid", +"amylopsin", +"amylose", +"amylosis", +"amylosynthesis", +"amylum", +"amyluria", +"Amynodon", +"amynodont", +"amyosthenia", +"amyosthenic", +"amyotaxia", +"amyotonia", +"amyotrophia", +"amyotrophic", +"amyotrophy", +"amyous", +"Amyraldism", +"Amyraldist", +"Amyridaceae", +"amyrin", +"Amyris", +"amyrol", +"amyroot", +"Amytal", +"amyxorrhea", +"amyxorrhoea", +"an", +"Ana", +"ana", +"Anabaena", +"Anabantidae", +"Anabaptism", +"Anabaptist", +"Anabaptistic", +"Anabaptistical", +"Anabaptistically", +"Anabaptistry", +"anabaptize", +"Anabas", +"anabasine", +"anabasis", +"anabasse", +"anabata", +"anabathmos", +"anabatic", +"anaberoga", +"anabibazon", +"anabiosis", +"anabiotic", +"Anablepidae", +"Anableps", +"anabo", +"anabohitsite", +"anabolic", +"anabolin", +"anabolism", +"anabolite", +"anabolize", +"anabong", +"anabranch", +"anabrosis", +"anabrotic", +"anacahuita", +"anacahuite", +"anacalypsis", +"anacampsis", +"anacamptic", +"anacamptically", +"anacamptics", +"anacamptometer", +"anacanth", +"anacanthine", +"Anacanthini", +"anacanthous", +"anacara", +"anacard", +"Anacardiaceae", +"anacardiaceous", +"anacardic", +"Anacardium", +"anacatadidymus", +"anacatharsis", +"anacathartic", +"anacephalaeosis", +"anacephalize", +"Anaces", +"Anacharis", +"anachorism", +"anachromasis", +"anachronic", +"anachronical", +"anachronically", +"anachronism", +"anachronismatical", +"anachronist", +"anachronistic", +"anachronistical", +"anachronistically", +"anachronize", +"anachronous", +"anachronously", +"anachueta", +"anacid", +"anacidity", +"anaclasis", +"anaclastic", +"anaclastics", +"Anaclete", +"anacleticum", +"anaclinal", +"anaclisis", +"anaclitic", +"anacoenosis", +"anacoluthia", +"anacoluthic", +"anacoluthically", +"anacoluthon", +"anaconda", +"Anacreon", +"Anacreontic", +"Anacreontically", +"anacrisis", +"Anacrogynae", +"anacrogynae", +"anacrogynous", +"anacromyodian", +"anacrotic", +"anacrotism", +"anacrusis", +"anacrustic", +"anacrustically", +"anaculture", +"anacusia", +"anacusic", +"anacusis", +"Anacyclus", +"anadem", +"anadenia", +"anadicrotic", +"anadicrotism", +"anadidymus", +"anadiplosis", +"anadipsia", +"anadipsic", +"anadrom", +"anadromous", +"Anadyomene", +"anaematosis", +"anaemia", +"anaemic", +"anaeretic", +"anaerobation", +"anaerobe", +"anaerobia", +"anaerobian", +"anaerobic", +"anaerobically", +"anaerobies", +"anaerobion", +"anaerobiont", +"anaerobiosis", +"anaerobiotic", +"anaerobiotically", +"anaerobious", +"anaerobism", +"anaerobium", +"anaerophyte", +"anaeroplastic", +"anaeroplasty", +"anaesthesia", +"anaesthesiant", +"anaesthetically", +"anaesthetizer", +"anaetiological", +"anagalactic", +"Anagallis", +"anagap", +"anagenesis", +"anagenetic", +"anagep", +"anagignoskomena", +"anaglyph", +"anaglyphic", +"anaglyphical", +"anaglyphics", +"anaglyphoscope", +"anaglyphy", +"anaglyptic", +"anaglyptical", +"anaglyptics", +"anaglyptograph", +"anaglyptographic", +"anaglyptography", +"anaglypton", +"anagnorisis", +"anagnost", +"anagoge", +"anagogic", +"anagogical", +"anagogically", +"anagogics", +"anagogy", +"anagram", +"anagrammatic", +"anagrammatical", +"anagrammatically", +"anagrammatism", +"anagrammatist", +"anagrammatize", +"anagrams", +"anagraph", +"anagua", +"anagyrin", +"anagyrine", +"Anagyris", +"anahau", +"Anahita", +"Anaitis", +"Anakes", +"anakinesis", +"anakinetic", +"anakinetomer", +"anakinetomeric", +"anakoluthia", +"anakrousis", +"anaktoron", +"anal", +"analabos", +"analav", +"analcime", +"analcimite", +"analcite", +"analcitite", +"analecta", +"analectic", +"analects", +"analemma", +"analemmatic", +"analepsis", +"analepsy", +"analeptic", +"analeptical", +"analgen", +"analgesia", +"analgesic", +"Analgesidae", +"analgesis", +"analgesist", +"analgetic", +"analgia", +"analgic", +"analgize", +"analkalinity", +"anallagmatic", +"anallantoic", +"Anallantoidea", +"anallantoidean", +"anallergic", +"anally", +"analogic", +"analogical", +"analogically", +"analogicalness", +"analogion", +"analogism", +"analogist", +"analogistic", +"analogize", +"analogon", +"analogous", +"analogously", +"analogousness", +"analogue", +"analogy", +"analphabet", +"analphabete", +"analphabetic", +"analphabetical", +"analphabetism", +"analysability", +"analysable", +"analysand", +"analysation", +"analyse", +"analyser", +"analyses", +"analysis", +"analyst", +"analytic", +"analytical", +"analytically", +"analytics", +"analyzability", +"analyzable", +"analyzation", +"analyze", +"analyzer", +"Anam", +"anam", +"anama", +"anamesite", +"anametadromous", +"Anamirta", +"anamirtin", +"Anamite", +"anamite", +"anammonid", +"anammonide", +"anamnesis", +"anamnestic", +"anamnestically", +"Anamnia", +"Anamniata", +"Anamnionata", +"anamnionic", +"Anamniota", +"anamniote", +"anamniotic", +"anamorphic", +"anamorphism", +"anamorphoscope", +"anamorphose", +"anamorphosis", +"anamorphote", +"anamorphous", +"anan", +"anana", +"ananaplas", +"ananaples", +"ananas", +"ananda", +"anandrarious", +"anandria", +"anandrous", +"ananepionic", +"anangioid", +"anangular", +"Ananias", +"Ananism", +"Ananite", +"anankastic", +"Anansi", +"Ananta", +"anantherate", +"anantherous", +"ananthous", +"ananym", +"anapaest", +"anapaestic", +"anapaestical", +"anapaestically", +"anapaganize", +"anapaite", +"anapanapa", +"anapeiratic", +"anaphalantiasis", +"Anaphalis", +"anaphase", +"Anaphe", +"anaphia", +"anaphora", +"anaphoral", +"anaphoria", +"anaphoric", +"anaphorical", +"anaphrodisia", +"anaphrodisiac", +"anaphroditic", +"anaphroditous", +"anaphylactic", +"anaphylactin", +"anaphylactogen", +"anaphylactogenic", +"anaphylactoid", +"anaphylatoxin", +"anaphylaxis", +"anaphyte", +"anaplasia", +"anaplasis", +"anaplasm", +"Anaplasma", +"anaplasmosis", +"anaplastic", +"anaplasty", +"anaplerosis", +"anaplerotic", +"anapnea", +"anapneic", +"anapnoeic", +"anapnograph", +"anapnoic", +"anapnometer", +"anapodeictic", +"anapophysial", +"anapophysis", +"anapsid", +"Anapsida", +"anapsidan", +"Anapterygota", +"anapterygote", +"anapterygotism", +"anapterygotous", +"Anaptomorphidae", +"Anaptomorphus", +"anaptotic", +"anaptychus", +"anaptyctic", +"anaptyctical", +"anaptyxis", +"anaqua", +"anarcestean", +"Anarcestes", +"anarch", +"anarchal", +"anarchial", +"anarchic", +"anarchical", +"anarchically", +"anarchism", +"anarchist", +"anarchistic", +"anarchize", +"anarchoindividualist", +"anarchosocialist", +"anarchosyndicalism", +"anarchosyndicalist", +"anarchy", +"anarcotin", +"anareta", +"anaretic", +"anaretical", +"anargyros", +"anarthria", +"anarthric", +"anarthropod", +"Anarthropoda", +"anarthropodous", +"anarthrosis", +"anarthrous", +"anarthrously", +"anarthrousness", +"anartismos", +"anarya", +"Anaryan", +"Anas", +"Anasa", +"anasarca", +"anasarcous", +"Anasazi", +"anaschistic", +"anaseismic", +"Anasitch", +"anaspadias", +"anaspalin", +"Anaspida", +"Anaspidacea", +"Anaspides", +"anastalsis", +"anastaltic", +"Anastasia", +"Anastasian", +"anastasimon", +"anastasimos", +"anastasis", +"Anastasius", +"anastate", +"anastatic", +"Anastatica", +"Anastatus", +"anastigmat", +"anastigmatic", +"anastomose", +"anastomosis", +"anastomotic", +"Anastomus", +"anastrophe", +"Anastrophia", +"Anat", +"anatase", +"anatexis", +"anathema", +"anathematic", +"anathematical", +"anathematically", +"anathematism", +"anathematization", +"anathematize", +"anathematizer", +"anatheme", +"anathemize", +"Anatherum", +"Anatidae", +"anatifa", +"Anatifae", +"anatifer", +"anatiferous", +"Anatinacea", +"Anatinae", +"anatine", +"anatocism", +"Anatolian", +"Anatolic", +"anatomic", +"anatomical", +"anatomically", +"anatomicobiological", +"anatomicochirurgical", +"anatomicomedical", +"anatomicopathologic", +"anatomicopathological", +"anatomicophysiologic", +"anatomicophysiological", +"anatomicosurgical", +"anatomism", +"anatomist", +"anatomization", +"anatomize", +"anatomizer", +"anatomopathologic", +"anatomopathological", +"anatomy", +"anatopism", +"anatox", +"anatoxin", +"anatreptic", +"anatripsis", +"anatripsology", +"anatriptic", +"anatron", +"anatropal", +"anatropia", +"anatropous", +"Anatum", +"anaudia", +"anaunter", +"anaunters", +"Anax", +"Anaxagorean", +"Anaxagorize", +"anaxial", +"Anaximandrian", +"anaxon", +"anaxone", +"Anaxonia", +"anay", +"anazoturia", +"anba", +"anbury", +"Ancerata", +"ancestor", +"ancestorial", +"ancestorially", +"ancestral", +"ancestrally", +"ancestress", +"ancestrial", +"ancestrian", +"ancestry", +"Ancha", +"Anchat", +"Anchietea", +"anchietin", +"anchietine", +"anchieutectic", +"anchimonomineral", +"Anchisaurus", +"Anchises", +"Anchistea", +"Anchistopoda", +"anchithere", +"anchitherioid", +"anchor", +"anchorable", +"anchorage", +"anchorate", +"anchored", +"anchorer", +"anchoress", +"anchoret", +"anchoretic", +"anchoretical", +"anchoretish", +"anchoretism", +"anchorhold", +"anchorite", +"anchoritess", +"anchoritic", +"anchoritical", +"anchoritish", +"anchoritism", +"anchorless", +"anchorlike", +"anchorwise", +"anchovy", +"Anchtherium", +"Anchusa", +"anchusin", +"anchusine", +"anchylose", +"anchylosis", +"ancience", +"anciency", +"ancient", +"ancientism", +"anciently", +"ancientness", +"ancientry", +"ancienty", +"ancile", +"ancilla", +"ancillary", +"ancipital", +"ancipitous", +"Ancistrocladaceae", +"ancistrocladaceous", +"Ancistrocladus", +"ancistroid", +"ancon", +"Ancona", +"anconad", +"anconagra", +"anconal", +"ancone", +"anconeal", +"anconeous", +"anconeus", +"anconitis", +"anconoid", +"ancony", +"ancora", +"ancoral", +"Ancyloceras", +"Ancylocladus", +"Ancylodactyla", +"ancylopod", +"Ancylopoda", +"Ancylostoma", +"ancylostome", +"ancylostomiasis", +"Ancylostomum", +"Ancylus", +"Ancyrean", +"Ancyrene", +"and", +"anda", +"andabatarian", +"Andalusian", +"andalusite", +"Andaman", +"Andamanese", +"andante", +"andantino", +"Andaqui", +"Andaquian", +"Andarko", +"Andaste", +"Ande", +"Andean", +"Andesic", +"andesine", +"andesinite", +"andesite", +"andesitic", +"Andevo", +"Andhra", +"Andi", +"Andian", +"Andine", +"Andira", +"andirin", +"andirine", +"andiroba", +"andiron", +"Andoke", +"andorite", +"Andorobo", +"Andorran", +"andouillet", +"andradite", +"andranatomy", +"andrarchy", +"Andre", +"Andreaea", +"Andreaeaceae", +"Andreaeales", +"Andrena", +"andrenid", +"Andrenidae", +"Andrew", +"andrewsite", +"Andria", +"Andriana", +"Andrias", +"andric", +"androcentric", +"androcephalous", +"androcephalum", +"androclinium", +"Androclus", +"androconium", +"androcracy", +"androcratic", +"androcyte", +"androdioecious", +"androdioecism", +"androdynamous", +"androecial", +"androecium", +"androgametangium", +"androgametophore", +"androgen", +"androgenesis", +"androgenetic", +"androgenic", +"androgenous", +"androginous", +"androgone", +"androgonia", +"androgonial", +"androgonidium", +"androgonium", +"Andrographis", +"andrographolide", +"androgynal", +"androgynary", +"androgyne", +"androgyneity", +"androgynia", +"androgynism", +"androgynous", +"androgynus", +"androgyny", +"android", +"androidal", +"androkinin", +"androl", +"androlepsia", +"androlepsy", +"Andromache", +"andromania", +"Andromaque", +"Andromeda", +"Andromede", +"andromedotoxin", +"andromonoecious", +"andromonoecism", +"andromorphous", +"andron", +"Andronicus", +"andronitis", +"andropetalar", +"andropetalous", +"androphagous", +"androphobia", +"androphonomania", +"androphore", +"androphorous", +"androphorum", +"androphyll", +"Andropogon", +"Androsace", +"Androscoggin", +"androseme", +"androsin", +"androsphinx", +"androsporangium", +"androspore", +"androsterone", +"androtauric", +"androtomy", +"Andy", +"anear", +"aneath", +"anecdota", +"anecdotage", +"anecdotal", +"anecdotalism", +"anecdote", +"anecdotic", +"anecdotical", +"anecdotically", +"anecdotist", +"anele", +"anelectric", +"anelectrode", +"anelectrotonic", +"anelectrotonus", +"anelytrous", +"anematosis", +"Anemia", +"anemia", +"anemic", +"anemobiagraph", +"anemochord", +"anemoclastic", +"anemogram", +"anemograph", +"anemographic", +"anemographically", +"anemography", +"anemological", +"anemology", +"anemometer", +"anemometric", +"anemometrical", +"anemometrically", +"anemometrograph", +"anemometrographic", +"anemometrographically", +"anemometry", +"anemonal", +"anemone", +"Anemonella", +"anemonin", +"anemonol", +"anemony", +"anemopathy", +"anemophile", +"anemophilous", +"anemophily", +"Anemopsis", +"anemoscope", +"anemosis", +"anemotaxis", +"anemotropic", +"anemotropism", +"anencephalia", +"anencephalic", +"anencephalotrophia", +"anencephalous", +"anencephalus", +"anencephaly", +"anend", +"anenergia", +"anenst", +"anent", +"anenterous", +"anepia", +"anepigraphic", +"anepigraphous", +"anepiploic", +"anepithymia", +"anerethisia", +"aneretic", +"anergia", +"anergic", +"anergy", +"anerly", +"aneroid", +"aneroidograph", +"anerotic", +"anerythroplasia", +"anerythroplastic", +"anes", +"anesis", +"anesthesia", +"anesthesiant", +"anesthesimeter", +"anesthesiologist", +"anesthesiology", +"anesthesis", +"anesthetic", +"anesthetically", +"anesthetist", +"anesthetization", +"anesthetize", +"anesthetizer", +"anesthyl", +"anethole", +"Anethum", +"anetiological", +"aneuploid", +"aneuploidy", +"aneuria", +"aneuric", +"aneurilemmic", +"aneurin", +"aneurism", +"aneurismally", +"aneurysm", +"aneurysmal", +"aneurysmally", +"aneurysmatic", +"anew", +"Anezeh", +"anfractuose", +"anfractuosity", +"anfractuous", +"anfractuousness", +"anfracture", +"Angami", +"Angara", +"angaralite", +"angaria", +"angary", +"Angdistis", +"angekok", +"angel", +"Angela", +"angelate", +"angeldom", +"Angeleno", +"angelet", +"angeleyes", +"angelfish", +"angelhood", +"angelic", +"Angelica", +"angelica", +"Angelical", +"angelical", +"angelically", +"angelicalness", +"Angelican", +"angelicic", +"angelicize", +"angelico", +"angelin", +"Angelina", +"angeline", +"angelique", +"angelize", +"angellike", +"Angelo", +"angelocracy", +"angelographer", +"angelolater", +"angelolatry", +"angelologic", +"angelological", +"angelology", +"angelomachy", +"Angelonia", +"angelophany", +"angelot", +"angelship", +"Angelus", +"anger", +"angerly", +"Angerona", +"Angeronalia", +"Angers", +"Angetenar", +"Angevin", +"angeyok", +"angiasthenia", +"angico", +"Angie", +"angiectasis", +"angiectopia", +"angiemphraxis", +"angiitis", +"angild", +"angili", +"angina", +"anginal", +"anginiform", +"anginoid", +"anginose", +"anginous", +"angioasthenia", +"angioataxia", +"angioblast", +"angioblastic", +"angiocarditis", +"angiocarp", +"angiocarpian", +"angiocarpic", +"angiocarpous", +"angiocavernous", +"angiocholecystitis", +"angiocholitis", +"angiochondroma", +"angioclast", +"angiocyst", +"angiodermatitis", +"angiodiascopy", +"angioelephantiasis", +"angiofibroma", +"angiogenesis", +"angiogenic", +"angiogeny", +"angioglioma", +"angiograph", +"angiography", +"angiohyalinosis", +"angiohydrotomy", +"angiohypertonia", +"angiohypotonia", +"angioid", +"angiokeratoma", +"angiokinesis", +"angiokinetic", +"angioleucitis", +"angiolipoma", +"angiolith", +"angiology", +"angiolymphitis", +"angiolymphoma", +"angioma", +"angiomalacia", +"angiomatosis", +"angiomatous", +"angiomegaly", +"angiometer", +"angiomyocardiac", +"angiomyoma", +"angiomyosarcoma", +"angioneoplasm", +"angioneurosis", +"angioneurotic", +"angionoma", +"angionosis", +"angioparalysis", +"angioparalytic", +"angioparesis", +"angiopathy", +"angiophorous", +"angioplany", +"angioplasty", +"angioplerosis", +"angiopoietic", +"angiopressure", +"angiorrhagia", +"angiorrhaphy", +"angiorrhea", +"angiorrhexis", +"angiosarcoma", +"angiosclerosis", +"angiosclerotic", +"angioscope", +"angiosis", +"angiospasm", +"angiospastic", +"angiosperm", +"Angiospermae", +"angiospermal", +"angiospermatous", +"angiospermic", +"angiospermous", +"angiosporous", +"angiostegnosis", +"angiostenosis", +"angiosteosis", +"angiostomize", +"angiostomy", +"angiostrophy", +"angiosymphysis", +"angiotasis", +"angiotelectasia", +"angiothlipsis", +"angiotome", +"angiotomy", +"angiotonic", +"angiotonin", +"angiotribe", +"angiotripsy", +"angiotrophic", +"Angka", +"anglaise", +"angle", +"angleberry", +"angled", +"anglehook", +"anglepod", +"angler", +"Angles", +"anglesite", +"anglesmith", +"angletouch", +"angletwitch", +"anglewing", +"anglewise", +"angleworm", +"Anglian", +"Anglic", +"Anglican", +"Anglicanism", +"Anglicanize", +"Anglicanly", +"Anglicanum", +"Anglicism", +"Anglicist", +"Anglicization", +"anglicization", +"Anglicize", +"anglicize", +"Anglification", +"Anglify", +"anglimaniac", +"angling", +"Anglish", +"Anglist", +"Anglistics", +"Anglogaea", +"Anglogaean", +"angloid", +"Angloman", +"Anglomane", +"Anglomania", +"Anglomaniac", +"Anglophile", +"Anglophobe", +"Anglophobia", +"Anglophobiac", +"Anglophobic", +"Anglophobist", +"ango", +"Angola", +"angolar", +"Angolese", +"angor", +"Angora", +"angostura", +"Angouleme", +"Angoumian", +"Angraecum", +"angrily", +"angriness", +"angrite", +"angry", +"angst", +"angster", +"Angstrom", +"angstrom", +"anguid", +"Anguidae", +"anguiform", +"Anguilla", +"Anguillaria", +"Anguillidae", +"anguilliform", +"anguilloid", +"Anguillula", +"Anguillulidae", +"Anguimorpha", +"anguine", +"anguineal", +"anguineous", +"Anguinidae", +"anguiped", +"Anguis", +"anguis", +"anguish", +"anguished", +"anguishful", +"anguishous", +"anguishously", +"angula", +"angular", +"angulare", +"angularity", +"angularization", +"angularize", +"angularly", +"angularness", +"angulate", +"angulated", +"angulately", +"angulateness", +"angulation", +"angulatogibbous", +"angulatosinuous", +"anguliferous", +"angulinerved", +"Anguloa", +"angulodentate", +"angulometer", +"angulosity", +"angulosplenial", +"angulous", +"anguria", +"Angus", +"angusticlave", +"angustifoliate", +"angustifolious", +"angustirostrate", +"angustisellate", +"angustiseptal", +"angustiseptate", +"angwantibo", +"anhalamine", +"anhaline", +"anhalonine", +"Anhalonium", +"anhalouidine", +"anhang", +"Anhanga", +"anharmonic", +"anhedonia", +"anhedral", +"anhedron", +"anhelation", +"anhelous", +"anhematosis", +"anhemolytic", +"anhidrosis", +"anhidrotic", +"anhima", +"Anhimae", +"Anhimidae", +"anhinga", +"anhistic", +"anhistous", +"anhungered", +"anhungry", +"anhydrate", +"anhydration", +"anhydremia", +"anhydremic", +"anhydric", +"anhydride", +"anhydridization", +"anhydridize", +"anhydrite", +"anhydrization", +"anhydrize", +"anhydroglocose", +"anhydromyelia", +"anhydrous", +"anhydroxime", +"anhysteretic", +"ani", +"Aniba", +"Anice", +"aniconic", +"aniconism", +"anicular", +"anicut", +"anidian", +"anidiomatic", +"anidiomatical", +"anidrosis", +"Aniellidae", +"aniente", +"anigh", +"anight", +"anights", +"anil", +"anilao", +"anilau", +"anile", +"anileness", +"anilic", +"anilid", +"anilide", +"anilidic", +"anilidoxime", +"aniline", +"anilinism", +"anilinophile", +"anilinophilous", +"anility", +"anilla", +"anilopyrin", +"anilopyrine", +"anima", +"animability", +"animable", +"animableness", +"animadversion", +"animadversional", +"animadversive", +"animadversiveness", +"animadvert", +"animadverter", +"animal", +"animalcula", +"animalculae", +"animalcular", +"animalcule", +"animalculine", +"animalculism", +"animalculist", +"animalculous", +"animalculum", +"animalhood", +"Animalia", +"animalian", +"animalic", +"animalier", +"animalish", +"animalism", +"animalist", +"animalistic", +"animality", +"Animalivora", +"animalivore", +"animalivorous", +"animalization", +"animalize", +"animally", +"animastic", +"animastical", +"animate", +"animated", +"animatedly", +"animately", +"animateness", +"animater", +"animating", +"animatingly", +"animation", +"animatism", +"animatistic", +"animative", +"animatograph", +"animator", +"anime", +"animi", +"Animikean", +"animikite", +"animism", +"animist", +"animistic", +"animize", +"animosity", +"animotheism", +"animous", +"animus", +"anion", +"anionic", +"aniridia", +"anis", +"anisal", +"anisalcohol", +"anisaldehyde", +"anisaldoxime", +"anisamide", +"anisandrous", +"anisanilide", +"anisate", +"anischuria", +"anise", +"aniseed", +"aniseikonia", +"aniseikonic", +"aniselike", +"aniseroot", +"anisette", +"anisic", +"anisidin", +"anisidine", +"anisil", +"anisilic", +"anisobranchiate", +"anisocarpic", +"anisocarpous", +"anisocercal", +"anisochromatic", +"anisochromia", +"anisocoria", +"anisocotyledonous", +"anisocotyly", +"anisocratic", +"anisocycle", +"anisocytosis", +"anisodactyl", +"Anisodactyla", +"Anisodactyli", +"anisodactylic", +"anisodactylous", +"anisodont", +"anisogamete", +"anisogamous", +"anisogamy", +"anisogenous", +"anisogeny", +"anisognathism", +"anisognathous", +"anisogynous", +"anisoin", +"anisole", +"anisoleucocytosis", +"Anisomeles", +"anisomelia", +"anisomelus", +"anisomeric", +"anisomerous", +"anisometric", +"anisometrope", +"anisometropia", +"anisometropic", +"anisomyarian", +"Anisomyodi", +"anisomyodian", +"anisomyodous", +"anisopetalous", +"anisophyllous", +"anisophylly", +"anisopia", +"anisopleural", +"anisopleurous", +"anisopod", +"Anisopoda", +"anisopodal", +"anisopodous", +"anisopogonous", +"Anisoptera", +"anisopterous", +"anisosepalous", +"anisospore", +"anisostaminous", +"anisostemonous", +"anisosthenic", +"anisostichous", +"Anisostichus", +"anisostomous", +"anisotonic", +"anisotropal", +"anisotrope", +"anisotropic", +"anisotropical", +"anisotropically", +"anisotropism", +"anisotropous", +"anisotropy", +"anisoyl", +"anisum", +"anisuria", +"anisyl", +"anisylidene", +"Anita", +"anither", +"anitrogenous", +"anjan", +"Anjou", +"ankaramite", +"ankaratrite", +"ankee", +"anker", +"ankerite", +"ankh", +"ankle", +"anklebone", +"anklejack", +"anklet", +"anklong", +"Ankoli", +"Ankou", +"ankus", +"ankusha", +"ankylenteron", +"ankyloblepharon", +"ankylocheilia", +"ankylodactylia", +"ankylodontia", +"ankyloglossia", +"ankylomele", +"ankylomerism", +"ankylophobia", +"ankylopodia", +"ankylopoietic", +"ankyloproctia", +"ankylorrhinia", +"Ankylosaurus", +"ankylose", +"ankylosis", +"ankylostoma", +"ankylotia", +"ankylotic", +"ankylotome", +"ankylotomy", +"ankylurethria", +"ankyroid", +"anlace", +"anlaut", +"Ann", +"ann", +"Anna", +"anna", +"Annabel", +"annabergite", +"annal", +"annale", +"annaline", +"annalism", +"annalist", +"annalistic", +"annalize", +"annals", +"Annam", +"Annamese", +"Annamite", +"Annamitic", +"Annapurna", +"annat", +"annates", +"annatto", +"anneal", +"annealer", +"annectent", +"annection", +"annelid", +"Annelida", +"annelidan", +"Annelides", +"annelidian", +"annelidous", +"annelism", +"Annellata", +"anneloid", +"annerodite", +"Anneslia", +"annet", +"Annette", +"annex", +"annexa", +"annexable", +"annexal", +"annexation", +"annexational", +"annexationist", +"annexer", +"annexion", +"annexionist", +"annexitis", +"annexive", +"annexment", +"annexure", +"annidalin", +"Annie", +"Anniellidae", +"annihilability", +"annihilable", +"annihilate", +"annihilation", +"annihilationism", +"annihilationist", +"annihilative", +"annihilator", +"annihilatory", +"Annist", +"annite", +"anniversarily", +"anniversariness", +"anniversary", +"anniverse", +"annodated", +"Annona", +"annona", +"Annonaceae", +"annonaceous", +"annotate", +"annotater", +"annotation", +"annotative", +"annotator", +"annotatory", +"annotine", +"annotinous", +"announce", +"announceable", +"announcement", +"announcer", +"annoy", +"annoyance", +"annoyancer", +"annoyer", +"annoyful", +"annoying", +"annoyingly", +"annoyingness", +"annoyment", +"annual", +"annualist", +"annualize", +"annually", +"annuary", +"annueler", +"annuent", +"annuitant", +"annuity", +"annul", +"annular", +"Annularia", +"annularity", +"annularly", +"annulary", +"Annulata", +"annulate", +"annulated", +"annulation", +"annulet", +"annulettee", +"annulism", +"annullable", +"annullate", +"annullation", +"annuller", +"annulment", +"annuloid", +"Annuloida", +"Annulosa", +"annulosan", +"annulose", +"annulus", +"annunciable", +"annunciate", +"annunciation", +"annunciative", +"annunciator", +"annunciatory", +"anoa", +"Anobiidae", +"anocarpous", +"anociassociation", +"anococcygeal", +"anodal", +"anode", +"anodendron", +"anodic", +"anodically", +"anodize", +"Anodon", +"Anodonta", +"anodontia", +"anodos", +"anodyne", +"anodynia", +"anodynic", +"anodynous", +"anoegenetic", +"anoesia", +"anoesis", +"anoestrous", +"anoestrum", +"anoestrus", +"anoetic", +"anogenic", +"anogenital", +"Anogra", +"anoil", +"anoine", +"anoint", +"anointer", +"anointment", +"anole", +"anoli", +"anolian", +"Anolis", +"Anolympiad", +"anolyte", +"Anomala", +"anomaliflorous", +"anomaliped", +"anomalism", +"anomalist", +"anomalistic", +"anomalistical", +"anomalistically", +"anomalocephalus", +"anomaloflorous", +"Anomalogonatae", +"anomalogonatous", +"Anomalon", +"anomalonomy", +"Anomalopteryx", +"anomaloscope", +"anomalotrophy", +"anomalous", +"anomalously", +"anomalousness", +"anomalure", +"Anomaluridae", +"Anomalurus", +"anomaly", +"Anomatheca", +"Anomia", +"Anomiacea", +"Anomiidae", +"anomite", +"anomocarpous", +"anomodont", +"Anomodontia", +"Anomoean", +"Anomoeanism", +"anomophyllous", +"anomorhomboid", +"anomorhomboidal", +"anomphalous", +"Anomura", +"anomural", +"anomuran", +"anomurous", +"anomy", +"anon", +"anonang", +"anoncillo", +"anonol", +"anonychia", +"anonym", +"anonyma", +"anonymity", +"anonymous", +"anonymously", +"anonymousness", +"anonymuncule", +"anoopsia", +"anoperineal", +"anophele", +"Anopheles", +"Anophelinae", +"anopheline", +"anophoria", +"anophthalmia", +"anophthalmos", +"Anophthalmus", +"anophyte", +"anopia", +"anopisthographic", +"Anopla", +"Anoplanthus", +"anoplocephalic", +"anoplonemertean", +"Anoplonemertini", +"anoplothere", +"Anoplotheriidae", +"anoplotherioid", +"Anoplotherium", +"anoplotheroid", +"Anoplura", +"anopluriform", +"anopsia", +"anopubic", +"anorak", +"anorchia", +"anorchism", +"anorchous", +"anorchus", +"anorectal", +"anorectic", +"anorectous", +"anorexia", +"anorexy", +"anorgana", +"anorganic", +"anorganism", +"anorganology", +"anormal", +"anormality", +"anorogenic", +"anorth", +"anorthic", +"anorthite", +"anorthitic", +"anorthitite", +"anorthoclase", +"anorthographic", +"anorthographical", +"anorthographically", +"anorthography", +"anorthophyre", +"anorthopia", +"anorthoscope", +"anorthose", +"anorthosite", +"anoscope", +"anoscopy", +"Anosia", +"anosmatic", +"anosmia", +"anosmic", +"anosphrasia", +"anosphresia", +"anospinal", +"anostosis", +"Anostraca", +"anoterite", +"another", +"anotherkins", +"anotia", +"anotropia", +"anotta", +"anotto", +"anotus", +"anounou", +"Anous", +"anovesical", +"anoxemia", +"anoxemic", +"anoxia", +"anoxic", +"anoxidative", +"anoxybiosis", +"anoxybiotic", +"anoxyscope", +"ansa", +"ansar", +"ansarian", +"Ansarie", +"ansate", +"ansation", +"Anseis", +"Ansel", +"Anselm", +"Anselmian", +"Anser", +"anserated", +"Anseres", +"Anseriformes", +"Anserinae", +"anserine", +"anserous", +"anspessade", +"ansu", +"ansulate", +"answer", +"answerability", +"answerable", +"answerableness", +"answerably", +"answerer", +"answeringly", +"answerless", +"answerlessly", +"ant", +"Anta", +"anta", +"antacid", +"antacrid", +"antadiform", +"Antaean", +"Antaeus", +"antagonism", +"antagonist", +"antagonistic", +"antagonistical", +"antagonistically", +"antagonization", +"antagonize", +"antagonizer", +"antagony", +"Antaimerina", +"Antaios", +"Antaiva", +"antal", +"antalgesic", +"antalgol", +"antalkali", +"antalkaline", +"antambulacral", +"antanacathartic", +"antanaclasis", +"Antanandro", +"antanemic", +"antapex", +"antaphrodisiac", +"antaphroditic", +"antapocha", +"antapodosis", +"antapology", +"antapoplectic", +"Antar", +"Antara", +"antarchism", +"antarchist", +"antarchistic", +"antarchistical", +"antarchy", +"Antarctalia", +"Antarctalian", +"antarctic", +"Antarctica", +"antarctica", +"antarctical", +"antarctically", +"Antarctogaea", +"Antarctogaean", +"Antares", +"antarthritic", +"antasphyctic", +"antasthenic", +"antasthmatic", +"antatrophic", +"antdom", +"ante", +"anteact", +"anteal", +"anteambulate", +"anteambulation", +"anteater", +"antebaptismal", +"antebath", +"antebrachial", +"antebrachium", +"antebridal", +"antecabinet", +"antecaecal", +"antecardium", +"antecavern", +"antecedaneous", +"antecedaneously", +"antecede", +"antecedence", +"antecedency", +"antecedent", +"antecedental", +"antecedently", +"antecessor", +"antechamber", +"antechapel", +"Antechinomys", +"antechoir", +"antechurch", +"anteclassical", +"antecloset", +"antecolic", +"antecommunion", +"anteconsonantal", +"antecornu", +"antecourt", +"antecoxal", +"antecubital", +"antecurvature", +"antedate", +"antedawn", +"antediluvial", +"antediluvially", +"antediluvian", +"Antedon", +"antedonin", +"antedorsal", +"antefebrile", +"antefix", +"antefixal", +"anteflected", +"anteflexed", +"anteflexion", +"antefurca", +"antefurcal", +"antefuture", +"antegarden", +"antegrade", +"antehall", +"antehistoric", +"antehuman", +"antehypophysis", +"anteinitial", +"antejentacular", +"antejudiciary", +"antejuramentum", +"antelabium", +"antelegal", +"antelocation", +"antelope", +"antelopian", +"antelucan", +"antelude", +"anteluminary", +"antemarginal", +"antemarital", +"antemedial", +"antemeridian", +"antemetallic", +"antemetic", +"antemillennial", +"antemingent", +"antemortal", +"antemundane", +"antemural", +"antenarial", +"antenatal", +"antenatalitial", +"antenati", +"antenave", +"antenna", +"antennae", +"antennal", +"Antennaria", +"antennariid", +"Antennariidae", +"Antennarius", +"antennary", +"Antennata", +"antennate", +"antenniferous", +"antenniform", +"antennula", +"antennular", +"antennulary", +"antennule", +"antenodal", +"antenoon", +"Antenor", +"antenumber", +"anteoccupation", +"anteocular", +"anteopercle", +"anteoperculum", +"anteorbital", +"antepagmenta", +"antepagments", +"antepalatal", +"antepaschal", +"antepast", +"antepatriarchal", +"antepectoral", +"antepectus", +"antependium", +"antepenult", +"antepenultima", +"antepenultimate", +"antephialtic", +"antepileptic", +"antepirrhema", +"anteporch", +"anteportico", +"anteposition", +"anteposthumous", +"anteprandial", +"antepredicament", +"antepredicamental", +"antepreterit", +"antepretonic", +"anteprohibition", +"anteprostate", +"anteprostatic", +"antepyretic", +"antequalm", +"antereformation", +"antereformational", +"anteresurrection", +"anterethic", +"anterevolutional", +"anterevolutionary", +"anteriad", +"anterior", +"anteriority", +"anteriorly", +"anteriorness", +"anteroclusion", +"anterodorsal", +"anteroexternal", +"anterofixation", +"anteroflexion", +"anterofrontal", +"anterograde", +"anteroinferior", +"anterointerior", +"anterointernal", +"anterolateral", +"anterolaterally", +"anteromedial", +"anteromedian", +"anteroom", +"anteroparietal", +"anteroposterior", +"anteroposteriorly", +"anteropygal", +"anterospinal", +"anterosuperior", +"anteroventral", +"anteroventrally", +"antes", +"antescript", +"antesignanus", +"antespring", +"antestature", +"antesternal", +"antesternum", +"antesunrise", +"antesuperior", +"antetemple", +"antetype", +"Anteva", +"antevenient", +"anteversion", +"antevert", +"antevocalic", +"antewar", +"anthecological", +"anthecologist", +"anthecology", +"Antheia", +"anthela", +"anthelion", +"anthelmintic", +"anthem", +"anthema", +"anthemene", +"anthemia", +"Anthemideae", +"anthemion", +"Anthemis", +"anthemwise", +"anthemy", +"anther", +"Antheraea", +"antheral", +"Anthericum", +"antherid", +"antheridial", +"antheridiophore", +"antheridium", +"antheriferous", +"antheriform", +"antherless", +"antherogenous", +"antheroid", +"antherozoid", +"antherozoidal", +"antherozooid", +"antherozooidal", +"anthesis", +"Anthesteria", +"Anthesteriac", +"anthesterin", +"Anthesterion", +"anthesterol", +"antheximeter", +"Anthicidae", +"Anthidium", +"anthill", +"Anthinae", +"anthine", +"anthobiology", +"anthocarp", +"anthocarpous", +"anthocephalous", +"Anthoceros", +"Anthocerotaceae", +"Anthocerotales", +"anthocerote", +"anthochlor", +"anthochlorine", +"anthoclinium", +"anthocyan", +"anthocyanidin", +"anthocyanin", +"anthodium", +"anthoecological", +"anthoecologist", +"anthoecology", +"anthogenesis", +"anthogenetic", +"anthogenous", +"anthography", +"anthoid", +"anthokyan", +"antholite", +"anthological", +"anthologically", +"anthologion", +"anthologist", +"anthologize", +"anthology", +"antholysis", +"Antholyza", +"anthomania", +"anthomaniac", +"Anthomedusae", +"anthomedusan", +"Anthomyia", +"anthomyiid", +"Anthomyiidae", +"Anthonin", +"Anthonomus", +"Anthony", +"anthood", +"anthophagous", +"Anthophila", +"anthophile", +"anthophilian", +"anthophilous", +"anthophobia", +"Anthophora", +"anthophore", +"Anthophoridae", +"anthophorous", +"anthophyllite", +"anthophyllitic", +"Anthophyta", +"anthophyte", +"anthorine", +"anthosiderite", +"Anthospermum", +"anthotaxis", +"anthotaxy", +"anthotropic", +"anthotropism", +"anthoxanthin", +"Anthoxanthum", +"Anthozoa", +"anthozoan", +"anthozoic", +"anthozooid", +"anthozoon", +"anthracemia", +"anthracene", +"anthraceniferous", +"anthrachrysone", +"anthracia", +"anthracic", +"anthraciferous", +"anthracin", +"anthracite", +"anthracitic", +"anthracitiferous", +"anthracitious", +"anthracitism", +"anthracitization", +"anthracnose", +"anthracnosis", +"anthracocide", +"anthracoid", +"anthracolithic", +"anthracomancy", +"Anthracomarti", +"anthracomartian", +"Anthracomartus", +"anthracometer", +"anthracometric", +"anthraconecrosis", +"anthraconite", +"Anthracosaurus", +"anthracosis", +"anthracothere", +"Anthracotheriidae", +"Anthracotherium", +"anthracotic", +"anthracyl", +"anthradiol", +"anthradiquinone", +"anthraflavic", +"anthragallol", +"anthrahydroquinone", +"anthramine", +"anthranil", +"anthranilate", +"anthranilic", +"anthranol", +"anthranone", +"anthranoyl", +"anthranyl", +"anthraphenone", +"anthrapurpurin", +"anthrapyridine", +"anthraquinol", +"anthraquinone", +"anthraquinonyl", +"anthrarufin", +"anthratetrol", +"anthrathiophene", +"anthratriol", +"anthrax", +"anthraxolite", +"anthraxylon", +"Anthrenus", +"anthribid", +"Anthribidae", +"Anthriscus", +"anthrohopobiological", +"anthroic", +"anthrol", +"anthrone", +"anthropic", +"anthropical", +"Anthropidae", +"anthropobiologist", +"anthropobiology", +"anthropocentric", +"anthropocentrism", +"anthropoclimatologist", +"anthropoclimatology", +"anthropocosmic", +"anthropodeoxycholic", +"Anthropodus", +"anthropogenesis", +"anthropogenetic", +"anthropogenic", +"anthropogenist", +"anthropogenous", +"anthropogeny", +"anthropogeographer", +"anthropogeographical", +"anthropogeography", +"anthropoglot", +"anthropogony", +"anthropography", +"anthropoid", +"anthropoidal", +"Anthropoidea", +"anthropoidean", +"anthropolater", +"anthropolatric", +"anthropolatry", +"anthropolite", +"anthropolithic", +"anthropolitic", +"anthropological", +"anthropologically", +"anthropologist", +"anthropology", +"anthropomancy", +"anthropomantic", +"anthropomantist", +"anthropometer", +"anthropometric", +"anthropometrical", +"anthropometrically", +"anthropometrist", +"anthropometry", +"anthropomorph", +"Anthropomorpha", +"anthropomorphic", +"anthropomorphical", +"anthropomorphically", +"Anthropomorphidae", +"anthropomorphism", +"anthropomorphist", +"anthropomorphite", +"anthropomorphitic", +"anthropomorphitical", +"anthropomorphitism", +"anthropomorphization", +"anthropomorphize", +"anthropomorphological", +"anthropomorphologically", +"anthropomorphology", +"anthropomorphosis", +"anthropomorphotheist", +"anthropomorphous", +"anthropomorphously", +"anthroponomical", +"anthroponomics", +"anthroponomist", +"anthroponomy", +"anthropopathia", +"anthropopathic", +"anthropopathically", +"anthropopathism", +"anthropopathite", +"anthropopathy", +"anthropophagi", +"anthropophagic", +"anthropophagical", +"anthropophaginian", +"anthropophagism", +"anthropophagist", +"anthropophagistic", +"anthropophagite", +"anthropophagize", +"anthropophagous", +"anthropophagously", +"anthropophagy", +"anthropophilous", +"anthropophobia", +"anthropophuism", +"anthropophuistic", +"anthropophysiography", +"anthropophysite", +"Anthropopithecus", +"anthropopsychic", +"anthropopsychism", +"Anthropos", +"anthroposcopy", +"anthroposociologist", +"anthroposociology", +"anthroposomatology", +"anthroposophical", +"anthroposophist", +"anthroposophy", +"anthropoteleoclogy", +"anthropoteleological", +"anthropotheism", +"anthropotomical", +"anthropotomist", +"anthropotomy", +"anthropotoxin", +"Anthropozoic", +"anthropurgic", +"anthroropolith", +"anthroxan", +"anthroxanic", +"anthryl", +"anthrylene", +"Anthurium", +"Anthus", +"Anthyllis", +"anthypophora", +"anthypophoretic", +"Anti", +"anti", +"antiabolitionist", +"antiabrasion", +"antiabrin", +"antiabsolutist", +"antiacid", +"antiadiaphorist", +"antiaditis", +"antiadministration", +"antiae", +"antiaesthetic", +"antiager", +"antiagglutinating", +"antiagglutinin", +"antiaggression", +"antiaggressionist", +"antiaggressive", +"antiaircraft", +"antialbumid", +"antialbumin", +"antialbumose", +"antialcoholic", +"antialcoholism", +"antialcoholist", +"antialdoxime", +"antialexin", +"antialien", +"antiamboceptor", +"antiamusement", +"antiamylase", +"antianaphylactogen", +"antianaphylaxis", +"antianarchic", +"antianarchist", +"antiangular", +"antiannexation", +"antiannexationist", +"antianopheline", +"antianthrax", +"antianthropocentric", +"antianthropomorphism", +"antiantibody", +"antiantidote", +"antiantienzyme", +"antiantitoxin", +"antiaphrodisiac", +"antiaphthic", +"antiapoplectic", +"antiapostle", +"antiaquatic", +"antiar", +"Antiarcha", +"Antiarchi", +"antiarin", +"Antiaris", +"antiaristocrat", +"antiarthritic", +"antiascetic", +"antiasthmatic", +"antiastronomical", +"antiatheism", +"antiatheist", +"antiatonement", +"antiattrition", +"antiautolysin", +"antibacchic", +"antibacchius", +"antibacterial", +"antibacteriolytic", +"antiballooner", +"antibalm", +"antibank", +"antibasilican", +"antibenzaldoxime", +"antiberiberin", +"antibibliolatry", +"antibigotry", +"antibilious", +"antibiont", +"antibiosis", +"antibiotic", +"antibishop", +"antiblastic", +"antiblennorrhagic", +"antiblock", +"antiblue", +"antibody", +"antiboxing", +"antibreakage", +"antibridal", +"antibromic", +"antibubonic", +"Antiburgher", +"antic", +"anticachectic", +"antical", +"anticalcimine", +"anticalculous", +"anticalligraphic", +"anticancer", +"anticapital", +"anticapitalism", +"anticapitalist", +"anticardiac", +"anticardium", +"anticarious", +"anticarnivorous", +"anticaste", +"anticatalase", +"anticatalyst", +"anticatalytic", +"anticatalyzer", +"anticatarrhal", +"anticathexis", +"anticathode", +"anticaustic", +"anticensorship", +"anticentralization", +"anticephalalgic", +"anticeremonial", +"anticeremonialism", +"anticeremonialist", +"anticheater", +"antichlor", +"antichlorine", +"antichloristic", +"antichlorotic", +"anticholagogue", +"anticholinergic", +"antichoromanic", +"antichorus", +"antichresis", +"antichretic", +"antichrist", +"antichristian", +"antichristianity", +"antichristianly", +"antichrome", +"antichronical", +"antichronically", +"antichthon", +"antichurch", +"antichurchian", +"antichymosin", +"anticipant", +"anticipatable", +"anticipate", +"anticipation", +"anticipative", +"anticipatively", +"anticipator", +"anticipatorily", +"anticipatory", +"anticivic", +"anticivism", +"anticize", +"anticker", +"anticlactic", +"anticlassical", +"anticlassicist", +"Anticlea", +"anticlergy", +"anticlerical", +"anticlericalism", +"anticlimactic", +"anticlimax", +"anticlinal", +"anticline", +"anticlinorium", +"anticlockwise", +"anticlogging", +"anticly", +"anticnemion", +"anticness", +"anticoagulant", +"anticoagulating", +"anticoagulative", +"anticoagulin", +"anticogitative", +"anticolic", +"anticombination", +"anticomet", +"anticomment", +"anticommercial", +"anticommunist", +"anticomplement", +"anticomplementary", +"anticomplex", +"anticonceptionist", +"anticonductor", +"anticonfederationist", +"anticonformist", +"anticonscience", +"anticonscription", +"anticonscriptive", +"anticonstitutional", +"anticonstitutionalist", +"anticonstitutionally", +"anticontagion", +"anticontagionist", +"anticontagious", +"anticonventional", +"anticonventionalism", +"anticonvulsive", +"anticor", +"anticorn", +"anticorrosion", +"anticorrosive", +"anticorset", +"anticosine", +"anticosmetic", +"anticouncil", +"anticourt", +"anticourtier", +"anticous", +"anticovenanter", +"anticovenanting", +"anticreation", +"anticreative", +"anticreator", +"anticreep", +"anticreeper", +"anticreeping", +"anticrepuscular", +"anticrepuscule", +"anticrisis", +"anticritic", +"anticritique", +"anticrochet", +"anticrotalic", +"anticryptic", +"anticum", +"anticyclic", +"anticyclone", +"anticyclonic", +"anticyclonically", +"anticynic", +"anticytolysin", +"anticytotoxin", +"antidactyl", +"antidancing", +"antidecalogue", +"antideflation", +"antidemocrat", +"antidemocratic", +"antidemocratical", +"antidemoniac", +"antidetonant", +"antidetonating", +"antidiabetic", +"antidiastase", +"Antidicomarian", +"Antidicomarianite", +"antidictionary", +"antidiffuser", +"antidinic", +"antidiphtheria", +"antidiphtheric", +"antidiphtherin", +"antidiphtheritic", +"antidisciplinarian", +"antidivine", +"antidivorce", +"antidogmatic", +"antidomestic", +"antidominican", +"Antidorcas", +"antidoron", +"antidotal", +"antidotally", +"antidotary", +"antidote", +"antidotical", +"antidotically", +"antidotism", +"antidraft", +"antidrag", +"antidromal", +"antidromic", +"antidromically", +"antidromous", +"antidromy", +"antidrug", +"antiduke", +"antidumping", +"antidynamic", +"antidynastic", +"antidyscratic", +"antidysenteric", +"antidysuric", +"antiecclesiastic", +"antiecclesiastical", +"antiedemic", +"antieducation", +"antieducational", +"antiegotism", +"antiejaculation", +"antiemetic", +"antiemperor", +"antiempirical", +"antiendotoxin", +"antiendowment", +"antienergistic", +"antienthusiastic", +"antienzyme", +"antienzymic", +"antiepicenter", +"antiepileptic", +"antiepiscopal", +"antiepiscopist", +"antiepithelial", +"antierosion", +"antierysipelas", +"Antietam", +"antiethnic", +"antieugenic", +"antievangelical", +"antievolution", +"antievolutionist", +"antiexpansionist", +"antiexporting", +"antiextreme", +"antieyestrain", +"antiface", +"antifaction", +"antifame", +"antifanatic", +"antifat", +"antifatigue", +"antifebrile", +"antifederal", +"antifederalism", +"antifederalist", +"antifelon", +"antifelony", +"antifeminism", +"antifeminist", +"antiferment", +"antifermentative", +"antifertilizer", +"antifeudal", +"antifeudalism", +"antifibrinolysin", +"antifibrinolysis", +"antifideism", +"antifire", +"antiflash", +"antiflattering", +"antiflatulent", +"antiflux", +"antifoam", +"antifoaming", +"antifogmatic", +"antiforeign", +"antiforeignism", +"antiformin", +"antifouler", +"antifouling", +"antifowl", +"antifreeze", +"antifreezing", +"antifriction", +"antifrictional", +"antifrost", +"antifundamentalist", +"antifungin", +"antigalactagogue", +"antigalactic", +"antigambling", +"antiganting", +"antigen", +"antigenic", +"antigenicity", +"antighostism", +"antigigmanic", +"antiglare", +"antiglyoxalase", +"antigod", +"Antigone", +"antigonococcic", +"Antigonon", +"antigonorrheic", +"Antigonus", +"antigorite", +"antigovernment", +"antigraft", +"antigrammatical", +"antigraph", +"antigravitate", +"antigravitational", +"antigropelos", +"antigrowth", +"Antiguan", +"antiguggler", +"antigyrous", +"antihalation", +"antiharmonist", +"antihectic", +"antihelix", +"antihelminthic", +"antihemagglutinin", +"antihemisphere", +"antihemoglobin", +"antihemolysin", +"antihemolytic", +"antihemorrhagic", +"antihemorrheidal", +"antihero", +"antiheroic", +"antiheroism", +"antiheterolysin", +"antihidrotic", +"antihierarchical", +"antihierarchist", +"antihistamine", +"antihistaminic", +"antiholiday", +"antihormone", +"antihuff", +"antihum", +"antihuman", +"antihumbuggist", +"antihunting", +"antihydrophobic", +"antihydropic", +"antihydropin", +"antihygienic", +"antihylist", +"antihypnotic", +"antihypochondriac", +"antihypophora", +"antihysteric", +"Antikamnia", +"antikathode", +"antikenotoxin", +"antiketogen", +"antiketogenesis", +"antiketogenic", +"antikinase", +"antiking", +"antiknock", +"antilabor", +"antilaborist", +"antilacrosse", +"antilacrosser", +"antilactase", +"antilapsarian", +"antileague", +"antilegalist", +"antilegomena", +"antilemic", +"antilens", +"antilepsis", +"antileptic", +"antilethargic", +"antileveling", +"Antilia", +"antiliberal", +"antilibration", +"antilift", +"antilipase", +"antilipoid", +"antiliquor", +"antilithic", +"antiliturgical", +"antiliturgist", +"Antillean", +"antilobium", +"Antilocapra", +"Antilocapridae", +"Antilochus", +"antiloemic", +"antilogarithm", +"antilogic", +"antilogical", +"antilogism", +"antilogous", +"antilogy", +"antiloimic", +"Antilope", +"Antilopinae", +"antilottery", +"antiluetin", +"antilynching", +"antilysin", +"antilysis", +"antilyssic", +"antilytic", +"antimacassar", +"antimachine", +"antimachinery", +"antimagistratical", +"antimalaria", +"antimalarial", +"antimallein", +"antimaniac", +"antimaniacal", +"Antimarian", +"antimark", +"antimartyr", +"antimask", +"antimasker", +"Antimason", +"Antimasonic", +"Antimasonry", +"antimasque", +"antimasquer", +"antimasquerade", +"antimaterialist", +"antimaterialistic", +"antimatrimonial", +"antimatrimonialist", +"antimedical", +"antimedieval", +"antimelancholic", +"antimellin", +"antimeningococcic", +"antimension", +"antimensium", +"antimephitic", +"antimere", +"antimerger", +"antimeric", +"Antimerina", +"antimerism", +"antimeristem", +"antimetabole", +"antimetathesis", +"antimetathetic", +"antimeter", +"antimethod", +"antimetrical", +"antimetropia", +"antimetropic", +"antimiasmatic", +"antimicrobic", +"antimilitarism", +"antimilitarist", +"antimilitary", +"antiministerial", +"antiministerialist", +"antiminsion", +"antimiscegenation", +"antimission", +"antimissionary", +"antimissioner", +"antimixing", +"antimnemonic", +"antimodel", +"antimodern", +"antimonarchial", +"antimonarchic", +"antimonarchical", +"antimonarchically", +"antimonarchicalness", +"antimonarchist", +"antimonate", +"antimonial", +"antimoniate", +"antimoniated", +"antimonic", +"antimonid", +"antimonide", +"antimoniferous", +"antimonious", +"antimonite", +"antimonium", +"antimoniuret", +"antimoniureted", +"antimoniuretted", +"antimonopolist", +"antimonopoly", +"antimonsoon", +"antimony", +"antimonyl", +"antimoral", +"antimoralism", +"antimoralist", +"antimosquito", +"antimusical", +"antimycotic", +"antimythic", +"antimythical", +"antinarcotic", +"antinarrative", +"antinational", +"antinationalist", +"antinationalistic", +"antinatural", +"antinegro", +"antinegroism", +"antineologian", +"antinephritic", +"antinepotic", +"antineuralgic", +"antineuritic", +"antineurotoxin", +"antineutral", +"antinial", +"antinicotine", +"antinion", +"antinode", +"antinoise", +"antinome", +"antinomian", +"antinomianism", +"antinomic", +"antinomical", +"antinomist", +"antinomy", +"antinormal", +"antinosarian", +"Antinous", +"Antiochene", +"Antiochian", +"Antiochianism", +"antiodont", +"antiodontalgic", +"Antiope", +"antiopelmous", +"antiophthalmic", +"antiopium", +"antiopiumist", +"antiopiumite", +"antioptimist", +"antioptionist", +"antiorgastic", +"antiorthodox", +"antioxidant", +"antioxidase", +"antioxidizer", +"antioxidizing", +"antioxygen", +"antioxygenation", +"antioxygenator", +"antioxygenic", +"antipacifist", +"antipapacy", +"antipapal", +"antipapalist", +"antipapism", +"antipapist", +"antipapistical", +"antiparabema", +"antiparagraphe", +"antiparagraphic", +"antiparallel", +"antiparallelogram", +"antiparalytic", +"antiparalytical", +"antiparasitic", +"antiparastatitis", +"antiparliament", +"antiparliamental", +"antiparliamentarist", +"antiparliamentary", +"antipart", +"Antipasch", +"Antipascha", +"antipass", +"antipastic", +"Antipatharia", +"antipatharian", +"antipathetic", +"antipathetical", +"antipathetically", +"antipatheticalness", +"antipathic", +"Antipathida", +"antipathist", +"antipathize", +"antipathogen", +"antipathy", +"antipatriarch", +"antipatriarchal", +"antipatriot", +"antipatriotic", +"antipatriotism", +"antipedal", +"Antipedobaptism", +"Antipedobaptist", +"antipeduncular", +"antipellagric", +"antipepsin", +"antipeptone", +"antiperiodic", +"antiperistalsis", +"antiperistaltic", +"antiperistasis", +"antiperistatic", +"antiperistatical", +"antiperistatically", +"antipersonnel", +"antiperthite", +"antipestilential", +"antipetalous", +"antipewism", +"antiphagocytic", +"antipharisaic", +"antipharmic", +"antiphase", +"antiphilosophic", +"antiphilosophical", +"antiphlogistian", +"antiphlogistic", +"antiphon", +"antiphonal", +"antiphonally", +"antiphonary", +"antiphoner", +"antiphonetic", +"antiphonic", +"antiphonical", +"antiphonically", +"antiphonon", +"antiphony", +"antiphrasis", +"antiphrastic", +"antiphrastical", +"antiphrastically", +"antiphthisic", +"antiphthisical", +"antiphylloxeric", +"antiphysic", +"antiphysical", +"antiphysician", +"antiplague", +"antiplanet", +"antiplastic", +"antiplatelet", +"antipleion", +"antiplenist", +"antiplethoric", +"antipleuritic", +"antiplurality", +"antipneumococcic", +"antipodagric", +"antipodagron", +"antipodal", +"antipode", +"antipodean", +"antipodes", +"antipodic", +"antipodism", +"antipodist", +"antipoetic", +"antipoints", +"antipolar", +"antipole", +"antipolemist", +"antipolitical", +"antipollution", +"antipolo", +"antipolygamy", +"antipolyneuritic", +"antipool", +"antipooling", +"antipope", +"antipopery", +"antipopular", +"antipopulationist", +"antiportable", +"antiposition", +"antipoverty", +"antipragmatic", +"antipragmatist", +"antiprecipitin", +"antipredeterminant", +"antiprelate", +"antiprelatic", +"antiprelatist", +"antipreparedness", +"antiprestidigitation", +"antipriest", +"antipriestcraft", +"antiprime", +"antiprimer", +"antipriming", +"antiprinciple", +"antiprism", +"antiproductionist", +"antiprofiteering", +"antiprohibition", +"antiprohibitionist", +"antiprojectivity", +"antiprophet", +"antiprostate", +"antiprostatic", +"antiprotease", +"antiproteolysis", +"antiprotozoal", +"antiprudential", +"antipruritic", +"antipsalmist", +"antipsoric", +"antiptosis", +"antipudic", +"antipuritan", +"antiputrefaction", +"antiputrefactive", +"antiputrescent", +"antiputrid", +"antipyic", +"antipyonin", +"antipyresis", +"antipyretic", +"Antipyrine", +"antipyrotic", +"antipyryl", +"antiqua", +"antiquarian", +"antiquarianism", +"antiquarianize", +"antiquarianly", +"antiquarism", +"antiquartan", +"antiquary", +"antiquate", +"antiquated", +"antiquatedness", +"antiquation", +"antique", +"antiquely", +"antiqueness", +"antiquer", +"antiquing", +"antiquist", +"antiquitarian", +"antiquity", +"antirabic", +"antirabies", +"antiracemate", +"antiracer", +"antirachitic", +"antirachitically", +"antiracing", +"antiradiating", +"antiradiation", +"antiradical", +"antirailwayist", +"antirational", +"antirationalism", +"antirationalist", +"antirationalistic", +"antirattler", +"antireactive", +"antirealism", +"antirealistic", +"antirebating", +"antirecruiting", +"antired", +"antireducer", +"antireform", +"antireformer", +"antireforming", +"antireformist", +"antireligion", +"antireligious", +"antiremonstrant", +"antirennet", +"antirennin", +"antirent", +"antirenter", +"antirentism", +"antirepublican", +"antireservationist", +"antirestoration", +"antireticular", +"antirevisionist", +"antirevolutionary", +"antirevolutionist", +"antirheumatic", +"antiricin", +"antirickets", +"antiritual", +"antiritualistic", +"antirobin", +"antiromance", +"antiromantic", +"antiromanticism", +"antiroyal", +"antiroyalist", +"Antirrhinum", +"antirumor", +"antirun", +"antirust", +"antisacerdotal", +"antisacerdotalist", +"antisaloon", +"antisalooner", +"antisavage", +"antiscabious", +"antiscale", +"antischolastic", +"antischool", +"antiscians", +"antiscientific", +"antiscion", +"antiscolic", +"antiscorbutic", +"antiscorbutical", +"antiscrofulous", +"antiseismic", +"antiselene", +"antisensitizer", +"antisensuous", +"antisensuousness", +"antisepalous", +"antisepsin", +"antisepsis", +"antiseptic", +"antiseptical", +"antiseptically", +"antisepticism", +"antisepticist", +"antisepticize", +"antiseption", +"antiseptize", +"antiserum", +"antishipping", +"Antisi", +"antisialagogue", +"antisialic", +"antisiccative", +"antisideric", +"antisilverite", +"antisimoniacal", +"antisine", +"antisiphon", +"antisiphonal", +"antiskeptical", +"antiskid", +"antiskidding", +"antislavery", +"antislaveryism", +"antislickens", +"antislip", +"antismoking", +"antisnapper", +"antisocial", +"antisocialist", +"antisocialistic", +"antisocialistically", +"antisociality", +"antisolar", +"antisophist", +"antisoporific", +"antispace", +"antispadix", +"antispasis", +"antispasmodic", +"antispast", +"antispastic", +"antispectroscopic", +"antispermotoxin", +"antispiritual", +"antispirochetic", +"antisplasher", +"antisplenetic", +"antisplitting", +"antispreader", +"antispreading", +"antisquama", +"antisquatting", +"antistadholder", +"antistadholderian", +"antistalling", +"antistaphylococcic", +"antistate", +"antistatism", +"antistatist", +"antisteapsin", +"antisterility", +"antistes", +"antistimulant", +"antistock", +"antistreptococcal", +"antistreptococcic", +"antistreptococcin", +"antistreptococcus", +"antistrike", +"antistrophal", +"antistrophe", +"antistrophic", +"antistrophically", +"antistrophize", +"antistrophon", +"antistrumatic", +"antistrumous", +"antisubmarine", +"antisubstance", +"antisudoral", +"antisudorific", +"antisuffrage", +"antisuffragist", +"antisun", +"antisupernaturalism", +"antisupernaturalist", +"antisurplician", +"antisymmetrical", +"antisyndicalism", +"antisyndicalist", +"antisynod", +"antisyphilitic", +"antitabetic", +"antitabloid", +"antitangent", +"antitank", +"antitarnish", +"antitartaric", +"antitax", +"antiteetotalism", +"antitegula", +"antitemperance", +"antitetanic", +"antitetanolysin", +"antithalian", +"antitheft", +"antitheism", +"antitheist", +"antitheistic", +"antitheistical", +"antitheistically", +"antithenar", +"antitheologian", +"antitheological", +"antithermic", +"antithermin", +"antitheses", +"antithesis", +"antithesism", +"antithesize", +"antithet", +"antithetic", +"antithetical", +"antithetically", +"antithetics", +"antithrombic", +"antithrombin", +"antitintinnabularian", +"antitobacco", +"antitobacconal", +"antitobacconist", +"antitonic", +"antitorpedo", +"antitoxic", +"antitoxin", +"antitrade", +"antitrades", +"antitraditional", +"antitragal", +"antitragic", +"antitragicus", +"antitragus", +"antitrismus", +"antitrochanter", +"antitropal", +"antitrope", +"antitropic", +"antitropical", +"antitropous", +"antitropy", +"antitrust", +"antitrypsin", +"antitryptic", +"antituberculin", +"antituberculosis", +"antituberculotic", +"antituberculous", +"antiturnpikeism", +"antitwilight", +"antitypal", +"antitype", +"antityphoid", +"antitypic", +"antitypical", +"antitypically", +"antitypy", +"antityrosinase", +"antiunion", +"antiunionist", +"antiuratic", +"antiurease", +"antiusurious", +"antiutilitarian", +"antivaccination", +"antivaccinationist", +"antivaccinator", +"antivaccinist", +"antivariolous", +"antivenefic", +"antivenereal", +"antivenin", +"antivenom", +"antivenomous", +"antivermicular", +"antivibrating", +"antivibrator", +"antivibratory", +"antivice", +"antiviral", +"antivirus", +"antivitalist", +"antivitalistic", +"antivitamin", +"antivivisection", +"antivivisectionist", +"antivolition", +"antiwar", +"antiwarlike", +"antiwaste", +"antiwedge", +"antiweed", +"antiwit", +"antixerophthalmic", +"antizealot", +"antizymic", +"antizymotic", +"antler", +"antlered", +"antlerite", +"antlerless", +"antlia", +"antliate", +"Antlid", +"antling", +"antluetic", +"antodontalgic", +"antoeci", +"antoecian", +"antoecians", +"Antoinette", +"Anton", +"Antonia", +"Antonina", +"antoninianus", +"Antonio", +"antonomasia", +"antonomastic", +"antonomastical", +"antonomastically", +"antonomasy", +"antonym", +"antonymous", +"antonymy", +"antorbital", +"antproof", +"antra", +"antral", +"antralgia", +"antre", +"antrectomy", +"antrin", +"antritis", +"antrocele", +"antronasal", +"antrophore", +"antrophose", +"antrorse", +"antrorsely", +"antroscope", +"antroscopy", +"Antrostomus", +"antrotome", +"antrotomy", +"antrotympanic", +"antrotympanitis", +"antrum", +"antrustion", +"antrustionship", +"antship", +"Antu", +"antu", +"Antum", +"Antwerp", +"antwise", +"anubing", +"Anubis", +"anucleate", +"anukabiet", +"Anukit", +"anuloma", +"Anura", +"anuran", +"anuresis", +"anuretic", +"anuria", +"anuric", +"anurous", +"anury", +"anus", +"anusim", +"anusvara", +"anutraminosa", +"anvasser", +"anvil", +"anvilsmith", +"anxietude", +"anxiety", +"anxious", +"anxiously", +"anxiousness", +"any", +"anybody", +"Anychia", +"anyhow", +"anyone", +"anyplace", +"Anystidae", +"anything", +"anythingarian", +"anythingarianism", +"anyway", +"anyways", +"anywhen", +"anywhere", +"anywhereness", +"anywheres", +"anywhy", +"anywise", +"anywither", +"Anzac", +"Anzanian", +"Ao", +"aogiri", +"Aoife", +"aonach", +"Aonian", +"aorist", +"aoristic", +"aoristically", +"aorta", +"aortal", +"aortarctia", +"aortectasia", +"aortectasis", +"aortic", +"aorticorenal", +"aortism", +"aortitis", +"aortoclasia", +"aortoclasis", +"aortolith", +"aortomalacia", +"aortomalaxis", +"aortopathy", +"aortoptosia", +"aortoptosis", +"aortorrhaphy", +"aortosclerosis", +"aortostenosis", +"aortotomy", +"aosmic", +"Aotea", +"Aotearoa", +"Aotes", +"Aotus", +"aoudad", +"Aouellimiden", +"Aoul", +"apa", +"apabhramsa", +"apace", +"Apache", +"apache", +"Apachette", +"apachism", +"apachite", +"apadana", +"apagoge", +"apagogic", +"apagogical", +"apagogically", +"apaid", +"Apalachee", +"apalit", +"Apama", +"apandry", +"Apanteles", +"Apantesis", +"apanthropia", +"apanthropy", +"apar", +"Aparai", +"aparaphysate", +"aparejo", +"Apargia", +"aparithmesis", +"apart", +"apartheid", +"aparthrosis", +"apartment", +"apartmental", +"apartness", +"apasote", +"apastron", +"apatan", +"Apatela", +"apatetic", +"apathetic", +"apathetical", +"apathetically", +"apathic", +"apathism", +"apathist", +"apathistical", +"apathogenic", +"Apathus", +"apathy", +"apatite", +"Apatornis", +"Apatosaurus", +"Apaturia", +"Apayao", +"ape", +"apeak", +"apectomy", +"apedom", +"apehood", +"apeiron", +"apelet", +"apelike", +"apeling", +"apellous", +"Apemantus", +"Apennine", +"apenteric", +"apepsia", +"apepsinia", +"apepsy", +"apeptic", +"aper", +"aperch", +"aperea", +"aperient", +"aperiodic", +"aperiodically", +"aperiodicity", +"aperispermic", +"aperistalsis", +"aperitive", +"apert", +"apertly", +"apertness", +"apertometer", +"apertural", +"aperture", +"apertured", +"Aperu", +"apery", +"apesthesia", +"apesthetic", +"apesthetize", +"Apetalae", +"apetaloid", +"apetalose", +"apetalous", +"apetalousness", +"apetaly", +"apex", +"apexed", +"aphaeresis", +"aphaeretic", +"aphagia", +"aphakia", +"aphakial", +"aphakic", +"Aphanapteryx", +"Aphanes", +"aphanesite", +"Aphaniptera", +"aphanipterous", +"aphanite", +"aphanitic", +"aphanitism", +"Aphanomyces", +"aphanophyre", +"aphanozygous", +"Apharsathacites", +"aphasia", +"aphasiac", +"aphasic", +"Aphelandra", +"Aphelenchus", +"aphelian", +"Aphelinus", +"aphelion", +"apheliotropic", +"apheliotropically", +"apheliotropism", +"Aphelops", +"aphemia", +"aphemic", +"aphengescope", +"aphengoscope", +"aphenoscope", +"apheresis", +"apheretic", +"aphesis", +"apheta", +"aphetic", +"aphetically", +"aphetism", +"aphetize", +"aphicidal", +"aphicide", +"aphid", +"aphides", +"aphidian", +"aphidicide", +"aphidicolous", +"aphidid", +"Aphididae", +"Aphidiinae", +"aphidious", +"Aphidius", +"aphidivorous", +"aphidolysin", +"aphidophagous", +"aphidozer", +"aphilanthropy", +"Aphis", +"aphlaston", +"aphlebia", +"aphlogistic", +"aphnology", +"aphodal", +"aphodian", +"Aphodius", +"aphodus", +"aphonia", +"aphonic", +"aphonous", +"aphony", +"aphoria", +"aphorism", +"aphorismatic", +"aphorismer", +"aphorismic", +"aphorismical", +"aphorismos", +"aphorist", +"aphoristic", +"aphoristically", +"aphorize", +"aphorizer", +"Aphoruridae", +"aphotic", +"aphototactic", +"aphototaxis", +"aphototropic", +"aphototropism", +"Aphra", +"aphrasia", +"aphrite", +"aphrizite", +"aphrodisia", +"aphrodisiac", +"aphrodisiacal", +"aphrodisian", +"Aphrodision", +"Aphrodistic", +"Aphrodite", +"Aphroditeum", +"aphroditic", +"Aphroditidae", +"aphroditous", +"aphrolite", +"aphronia", +"aphrosiderite", +"aphtha", +"Aphthartodocetae", +"Aphthartodocetic", +"Aphthartodocetism", +"aphthic", +"aphthitalite", +"aphthoid", +"aphthong", +"aphthongal", +"aphthongia", +"aphthous", +"aphydrotropic", +"aphydrotropism", +"aphyllose", +"aphyllous", +"aphylly", +"aphyric", +"Apiaca", +"Apiaceae", +"apiaceous", +"Apiales", +"apian", +"apiarian", +"apiarist", +"apiary", +"apiator", +"apicad", +"apical", +"apically", +"apices", +"Apician", +"apicifixed", +"apicilar", +"apicillary", +"apicitis", +"apickaback", +"apicoectomy", +"apicolysis", +"apicula", +"apicular", +"apiculate", +"apiculated", +"apiculation", +"apicultural", +"apiculture", +"apiculturist", +"apiculus", +"Apidae", +"apiece", +"apieces", +"apigenin", +"apii", +"apiin", +"apikoros", +"apilary", +"Apina", +"Apinae", +"Apinage", +"apinch", +"aping", +"apinoid", +"apio", +"Apioceridae", +"apioid", +"apioidal", +"apiole", +"apiolin", +"apiologist", +"apiology", +"apionol", +"Apios", +"apiose", +"Apiosoma", +"apiphobia", +"Apis", +"apish", +"apishamore", +"apishly", +"apishness", +"apism", +"apitong", +"apitpat", +"Apium", +"apivorous", +"apjohnite", +"aplacental", +"Aplacentalia", +"Aplacentaria", +"Aplacophora", +"aplacophoran", +"aplacophorous", +"aplanat", +"aplanatic", +"aplanatically", +"aplanatism", +"Aplanobacter", +"aplanogamete", +"aplanospore", +"aplasia", +"aplastic", +"Aplectrum", +"aplenty", +"aplite", +"aplitic", +"aplobasalt", +"aplodiorite", +"Aplodontia", +"Aplodontiidae", +"aplomb", +"aplome", +"Aplopappus", +"aploperistomatous", +"aplostemonous", +"aplotaxene", +"aplotomy", +"Apluda", +"aplustre", +"Aplysia", +"apnea", +"apneal", +"apneic", +"apneumatic", +"apneumatosis", +"Apneumona", +"apneumonous", +"apneustic", +"apoaconitine", +"apoatropine", +"apobiotic", +"apoblast", +"apocaffeine", +"apocalypse", +"apocalypst", +"apocalypt", +"apocalyptic", +"apocalyptical", +"apocalyptically", +"apocalypticism", +"apocalyptism", +"apocalyptist", +"apocamphoric", +"apocarp", +"apocarpous", +"apocarpy", +"apocatastasis", +"apocatastatic", +"apocatharsis", +"apocenter", +"apocentric", +"apocentricity", +"apocha", +"apocholic", +"apochromat", +"apochromatic", +"apochromatism", +"apocinchonine", +"apocodeine", +"apocopate", +"apocopated", +"apocopation", +"apocope", +"apocopic", +"apocrenic", +"apocrisiary", +"Apocrita", +"apocrustic", +"apocryph", +"Apocrypha", +"apocryphal", +"apocryphalist", +"apocryphally", +"apocryphalness", +"apocryphate", +"apocryphon", +"Apocynaceae", +"apocynaceous", +"apocyneous", +"Apocynum", +"apod", +"Apoda", +"apodal", +"apodan", +"apodeipnon", +"apodeixis", +"apodema", +"apodemal", +"apodematal", +"apodeme", +"Apodes", +"Apodia", +"apodia", +"apodictic", +"apodictical", +"apodictically", +"apodictive", +"Apodidae", +"apodixis", +"apodosis", +"apodous", +"apodyterium", +"apoembryony", +"apofenchene", +"apogaeic", +"apogalacteum", +"apogamic", +"apogamically", +"apogamous", +"apogamously", +"apogamy", +"apogeal", +"apogean", +"apogee", +"apogeic", +"apogenous", +"apogeny", +"apogeotropic", +"apogeotropically", +"apogeotropism", +"Apogon", +"Apogonidae", +"apograph", +"apographal", +"apoharmine", +"apohyal", +"Apoidea", +"apoise", +"apojove", +"apokrea", +"apokreos", +"apolar", +"apolarity", +"apolaustic", +"apolegamic", +"Apolista", +"Apolistan", +"Apollinarian", +"Apollinarianism", +"Apolline", +"Apollo", +"Apollonia", +"Apollonian", +"Apollonic", +"apollonicon", +"Apollonistic", +"Apolloship", +"Apollyon", +"apologal", +"apologete", +"apologetic", +"apologetical", +"apologetically", +"apologetics", +"apologia", +"apologist", +"apologize", +"apologizer", +"apologue", +"apology", +"apolousis", +"Apolysin", +"apolysis", +"apolytikion", +"apomecometer", +"apomecometry", +"apometabolic", +"apometabolism", +"apometabolous", +"apometaboly", +"apomictic", +"apomictical", +"apomixis", +"apomorphia", +"apomorphine", +"aponeurology", +"aponeurorrhaphy", +"aponeurosis", +"aponeurositis", +"aponeurotic", +"aponeurotome", +"aponeurotomy", +"aponia", +"aponic", +"Aponogeton", +"Aponogetonaceae", +"aponogetonaceous", +"apoop", +"apopenptic", +"apopetalous", +"apophantic", +"apophasis", +"apophatic", +"Apophis", +"apophlegmatic", +"apophonia", +"apophony", +"apophorometer", +"apophthegm", +"apophthegmatist", +"apophyge", +"apophylactic", +"apophylaxis", +"apophyllite", +"apophyllous", +"apophysary", +"apophysate", +"apophyseal", +"apophysis", +"apophysitis", +"apoplasmodial", +"apoplastogamous", +"apoplectic", +"apoplectical", +"apoplectically", +"apoplectiform", +"apoplectoid", +"apoplex", +"apoplexy", +"apopyle", +"apoquinamine", +"apoquinine", +"aporetic", +"aporetical", +"aporhyolite", +"aporia", +"Aporobranchia", +"aporobranchian", +"Aporobranchiata", +"Aporocactus", +"Aporosa", +"aporose", +"aporphin", +"aporphine", +"Aporrhaidae", +"Aporrhais", +"aporrhaoid", +"aporrhegma", +"aport", +"aportoise", +"aposafranine", +"aposaturn", +"aposaturnium", +"aposematic", +"aposematically", +"aposepalous", +"aposia", +"aposiopesis", +"aposiopetic", +"apositia", +"apositic", +"aposoro", +"aposporogony", +"aposporous", +"apospory", +"apostasis", +"apostasy", +"apostate", +"apostatic", +"apostatical", +"apostatically", +"apostatism", +"apostatize", +"apostaxis", +"apostemate", +"apostematic", +"apostemation", +"apostematous", +"aposteme", +"aposteriori", +"aposthia", +"apostil", +"apostle", +"apostlehood", +"apostleship", +"apostolate", +"apostoless", +"apostoli", +"Apostolian", +"Apostolic", +"apostolic", +"apostolical", +"apostolically", +"apostolicalness", +"Apostolici", +"apostolicism", +"apostolicity", +"apostolize", +"Apostolos", +"apostrophal", +"apostrophation", +"apostrophe", +"apostrophic", +"apostrophied", +"apostrophize", +"apostrophus", +"Apotactic", +"Apotactici", +"apotelesm", +"apotelesmatic", +"apotelesmatical", +"apothecal", +"apothecary", +"apothecaryship", +"apothece", +"apothecial", +"apothecium", +"apothegm", +"apothegmatic", +"apothegmatical", +"apothegmatically", +"apothegmatist", +"apothegmatize", +"apothem", +"apotheose", +"apotheoses", +"apotheosis", +"apotheosize", +"apothesine", +"apothesis", +"apotome", +"apotracheal", +"apotropaic", +"apotropaion", +"apotropaism", +"apotropous", +"apoturmeric", +"apotype", +"apotypic", +"apout", +"apoxesis", +"Apoxyomenos", +"apozem", +"apozema", +"apozemical", +"apozymase", +"Appalachia", +"Appalachian", +"appall", +"appalling", +"appallingly", +"appallment", +"appalment", +"appanage", +"appanagist", +"apparatus", +"apparel", +"apparelment", +"apparence", +"apparency", +"apparent", +"apparently", +"apparentness", +"apparition", +"apparitional", +"apparitor", +"appassionata", +"appassionato", +"appay", +"appeal", +"appealability", +"appealable", +"appealer", +"appealing", +"appealingly", +"appealingness", +"appear", +"appearance", +"appearanced", +"appearer", +"appeasable", +"appeasableness", +"appeasably", +"appease", +"appeasement", +"appeaser", +"appeasing", +"appeasingly", +"appeasive", +"appellability", +"appellable", +"appellancy", +"appellant", +"appellate", +"appellation", +"appellational", +"appellative", +"appellatived", +"appellatively", +"appellativeness", +"appellatory", +"appellee", +"appellor", +"append", +"appendage", +"appendaged", +"appendalgia", +"appendance", +"appendancy", +"appendant", +"appendectomy", +"appendical", +"appendicalgia", +"appendice", +"appendicectasis", +"appendicectomy", +"appendices", +"appendicial", +"appendicious", +"appendicitis", +"appendicle", +"appendicocaecostomy", +"appendicostomy", +"appendicular", +"Appendicularia", +"appendicularian", +"Appendiculariidae", +"Appendiculata", +"appendiculate", +"appendiculated", +"appenditious", +"appendix", +"appendorontgenography", +"appendotome", +"appentice", +"apperceive", +"apperception", +"apperceptionism", +"apperceptionist", +"apperceptionistic", +"apperceptive", +"apperceptively", +"appercipient", +"appersonation", +"appertain", +"appertainment", +"appertinent", +"appet", +"appete", +"appetence", +"appetency", +"appetent", +"appetently", +"appetibility", +"appetible", +"appetibleness", +"appetite", +"appetition", +"appetitional", +"appetitious", +"appetitive", +"appetize", +"appetizement", +"appetizer", +"appetizingly", +"appinite", +"Appius", +"applanate", +"applanation", +"applaud", +"applaudable", +"applaudably", +"applauder", +"applaudingly", +"applause", +"applausive", +"applausively", +"apple", +"appleberry", +"appleblossom", +"applecart", +"appledrane", +"applegrower", +"applejack", +"applejohn", +"applemonger", +"applenut", +"appleringy", +"appleroot", +"applesauce", +"applewife", +"applewoman", +"appliable", +"appliableness", +"appliably", +"appliance", +"appliant", +"applicability", +"applicable", +"applicableness", +"applicably", +"applicancy", +"applicant", +"applicate", +"application", +"applicative", +"applicatively", +"applicator", +"applicatorily", +"applicatory", +"applied", +"appliedly", +"applier", +"applique", +"applosion", +"applosive", +"applot", +"applotment", +"apply", +"applyingly", +"applyment", +"appoggiatura", +"appoint", +"appointable", +"appointe", +"appointee", +"appointer", +"appointive", +"appointment", +"appointor", +"Appomatox", +"Appomattoc", +"apport", +"apportion", +"apportionable", +"apportioner", +"apportionment", +"apposability", +"apposable", +"appose", +"apposer", +"apposiopestic", +"apposite", +"appositely", +"appositeness", +"apposition", +"appositional", +"appositionally", +"appositive", +"appositively", +"appraisable", +"appraisal", +"appraise", +"appraisement", +"appraiser", +"appraising", +"appraisingly", +"appraisive", +"appreciable", +"appreciably", +"appreciant", +"appreciate", +"appreciatingly", +"appreciation", +"appreciational", +"appreciativ", +"appreciative", +"appreciatively", +"appreciativeness", +"appreciator", +"appreciatorily", +"appreciatory", +"appredicate", +"apprehend", +"apprehender", +"apprehendingly", +"apprehensibility", +"apprehensible", +"apprehensibly", +"apprehension", +"apprehensive", +"apprehensively", +"apprehensiveness", +"apprend", +"apprense", +"apprentice", +"apprenticehood", +"apprenticement", +"apprenticeship", +"appressed", +"appressor", +"appressorial", +"appressorium", +"appreteur", +"apprise", +"apprize", +"apprizement", +"apprizer", +"approach", +"approachability", +"approachabl", +"approachable", +"approachableness", +"approacher", +"approaching", +"approachless", +"approachment", +"approbate", +"approbation", +"approbative", +"approbativeness", +"approbator", +"approbatory", +"approof", +"appropinquate", +"appropinquation", +"appropinquity", +"appropre", +"appropriable", +"appropriate", +"appropriately", +"appropriateness", +"appropriation", +"appropriative", +"appropriativeness", +"appropriator", +"approvable", +"approvableness", +"approval", +"approvance", +"approve", +"approvedly", +"approvedness", +"approvement", +"approver", +"approvingly", +"approximal", +"approximate", +"approximately", +"approximation", +"approximative", +"approximatively", +"approximativeness", +"approximator", +"appulse", +"appulsion", +"appulsive", +"appulsively", +"appurtenance", +"appurtenant", +"apractic", +"apraxia", +"apraxic", +"apricate", +"aprication", +"aprickle", +"apricot", +"April", +"Aprilesque", +"Apriline", +"Aprilis", +"apriori", +"apriorism", +"apriorist", +"aprioristic", +"apriority", +"Aprocta", +"aproctia", +"aproctous", +"apron", +"aproneer", +"apronful", +"apronless", +"apronlike", +"apropos", +"aprosexia", +"aprosopia", +"aprosopous", +"aproterodont", +"apse", +"apselaphesia", +"apselaphesis", +"apsidal", +"apsidally", +"apsides", +"apsidiole", +"apsis", +"apsychia", +"apsychical", +"apt", +"Aptal", +"Aptenodytes", +"Aptera", +"apteral", +"apteran", +"apterial", +"apterium", +"apteroid", +"apterous", +"Apteryges", +"apterygial", +"Apterygidae", +"Apterygiformes", +"Apterygogenea", +"Apterygota", +"apterygote", +"apterygotous", +"Apteryx", +"Aptian", +"Aptiana", +"aptitude", +"aptitudinal", +"aptitudinally", +"aptly", +"aptness", +"aptote", +"aptotic", +"aptyalia", +"aptyalism", +"aptychus", +"Apulian", +"apulmonic", +"apulse", +"apurpose", +"Apus", +"apyonin", +"apyrene", +"apyretic", +"apyrexia", +"apyrexial", +"apyrexy", +"apyrotype", +"apyrous", +"aqua", +"aquabelle", +"aquabib", +"aquacade", +"aquacultural", +"aquaculture", +"aquaemanale", +"aquafortist", +"aquage", +"aquagreen", +"aquamarine", +"aquameter", +"aquaplane", +"aquapuncture", +"aquarelle", +"aquarellist", +"aquaria", +"aquarial", +"Aquarian", +"aquarian", +"Aquarid", +"Aquarii", +"aquariist", +"aquarium", +"Aquarius", +"aquarter", +"aquascutum", +"aquatic", +"aquatical", +"aquatically", +"aquatile", +"aquatint", +"aquatinta", +"aquatinter", +"aquation", +"aquativeness", +"aquatone", +"aquavalent", +"aquavit", +"aqueduct", +"aqueoglacial", +"aqueoigneous", +"aqueomercurial", +"aqueous", +"aqueously", +"aqueousness", +"aquicolous", +"aquicultural", +"aquiculture", +"aquiculturist", +"aquifer", +"aquiferous", +"Aquifoliaceae", +"aquifoliaceous", +"aquiform", +"Aquila", +"Aquilaria", +"aquilawood", +"aquilege", +"Aquilegia", +"Aquilian", +"Aquilid", +"aquiline", +"aquilino", +"aquincubital", +"aquincubitalism", +"Aquinist", +"aquintocubital", +"aquintocubitalism", +"aquiparous", +"Aquitanian", +"aquiver", +"aquo", +"aquocapsulitis", +"aquocarbonic", +"aquocellolitis", +"aquopentamminecobaltic", +"aquose", +"aquosity", +"aquotization", +"aquotize", +"ar", +"ara", +"Arab", +"araba", +"araban", +"arabana", +"Arabella", +"arabesque", +"arabesquely", +"arabesquerie", +"Arabian", +"Arabianize", +"Arabic", +"Arabicism", +"Arabicize", +"Arabidopsis", +"arability", +"arabin", +"arabinic", +"arabinose", +"arabinosic", +"Arabis", +"Arabism", +"Arabist", +"arabit", +"arabitol", +"arabiyeh", +"Arabize", +"arable", +"Arabophil", +"Araby", +"araca", +"Aracana", +"aracanga", +"aracari", +"Araceae", +"araceous", +"arachic", +"arachidonic", +"arachin", +"Arachis", +"arachnactis", +"Arachne", +"arachnean", +"arachnid", +"Arachnida", +"arachnidan", +"arachnidial", +"arachnidism", +"arachnidium", +"arachnism", +"Arachnites", +"arachnitis", +"arachnoid", +"arachnoidal", +"Arachnoidea", +"arachnoidea", +"arachnoidean", +"arachnoiditis", +"arachnological", +"arachnologist", +"arachnology", +"Arachnomorphae", +"arachnophagous", +"arachnopia", +"arad", +"Aradidae", +"arado", +"araeostyle", +"araeosystyle", +"Aragallus", +"Aragonese", +"Aragonian", +"aragonite", +"araguato", +"arain", +"Arains", +"Arakanese", +"arakawaite", +"arake", +"Arales", +"Aralia", +"Araliaceae", +"araliaceous", +"araliad", +"Araliaephyllum", +"aralie", +"Araliophyllum", +"aralkyl", +"aralkylated", +"Aramaean", +"Aramaic", +"Aramaicize", +"Aramaism", +"aramayoite", +"Aramidae", +"aramina", +"Araminta", +"Aramis", +"Aramitess", +"Aramu", +"Aramus", +"Aranea", +"Araneae", +"araneid", +"Araneida", +"araneidan", +"araneiform", +"Araneiformes", +"Araneiformia", +"aranein", +"Araneina", +"Araneoidea", +"araneologist", +"araneology", +"araneous", +"aranga", +"arango", +"Aranyaka", +"aranzada", +"arapahite", +"Arapaho", +"arapaima", +"araphorostic", +"arapunga", +"Araquaju", +"arar", +"Arara", +"arara", +"araracanga", +"ararao", +"ararauna", +"arariba", +"araroba", +"arati", +"aration", +"aratory", +"Araua", +"Arauan", +"Araucan", +"Araucanian", +"Araucano", +"Araucaria", +"Araucariaceae", +"araucarian", +"Araucarioxylon", +"Araujia", +"Arauna", +"Arawa", +"Arawak", +"Arawakan", +"Arawakian", +"arba", +"Arbacia", +"arbacin", +"arbalest", +"arbalester", +"arbalestre", +"arbalestrier", +"arbalist", +"arbalister", +"arbalo", +"Arbela", +"arbiter", +"arbitrable", +"arbitrager", +"arbitragist", +"arbitral", +"arbitrament", +"arbitrarily", +"arbitrariness", +"arbitrary", +"arbitrate", +"arbitration", +"arbitrational", +"arbitrationist", +"arbitrative", +"arbitrator", +"arbitratorship", +"arbitratrix", +"arbitrement", +"arbitrer", +"arbitress", +"arboloco", +"arbor", +"arboraceous", +"arboral", +"arborary", +"arborator", +"arboreal", +"arboreally", +"arborean", +"arbored", +"arboreous", +"arborescence", +"arborescent", +"arborescently", +"arboresque", +"arboret", +"arboreta", +"arboretum", +"arborical", +"arboricole", +"arboricoline", +"arboricolous", +"arboricultural", +"arboriculture", +"arboriculturist", +"arboriform", +"arborist", +"arborization", +"arborize", +"arboroid", +"arborolatry", +"arborous", +"arborvitae", +"arborway", +"arbuscle", +"arbuscula", +"arbuscular", +"arbuscule", +"arbusterol", +"arbustum", +"arbutase", +"arbute", +"arbutean", +"arbutin", +"arbutinase", +"arbutus", +"arc", +"arca", +"Arcacea", +"arcade", +"Arcadia", +"Arcadian", +"arcadian", +"Arcadianism", +"Arcadianly", +"Arcadic", +"Arcady", +"arcana", +"arcanal", +"arcane", +"arcanite", +"arcanum", +"arcate", +"arcature", +"Arcella", +"Arceuthobium", +"arch", +"archabomination", +"archae", +"archaecraniate", +"Archaeoceti", +"Archaeocyathidae", +"Archaeocyathus", +"archaeogeology", +"archaeographic", +"archaeographical", +"archaeography", +"archaeolatry", +"archaeolith", +"archaeolithic", +"archaeologer", +"archaeologian", +"archaeologic", +"archaeological", +"archaeologically", +"archaeologist", +"archaeology", +"Archaeopithecus", +"Archaeopteris", +"Archaeopterygiformes", +"Archaeopteryx", +"Archaeornis", +"Archaeornithes", +"archaeostoma", +"Archaeostomata", +"archaeostomatous", +"archagitator", +"archaic", +"archaical", +"archaically", +"archaicism", +"archaism", +"archaist", +"archaistic", +"archaize", +"archaizer", +"archangel", +"archangelic", +"Archangelica", +"archangelical", +"archangelship", +"archantagonist", +"archantiquary", +"archapostate", +"archapostle", +"archarchitect", +"archarios", +"archartist", +"archband", +"archbeacon", +"archbeadle", +"archbishop", +"archbishopess", +"archbishopric", +"archbishopry", +"archbotcher", +"archboutefeu", +"archbuffoon", +"archbuilder", +"archchampion", +"archchaplain", +"archcharlatan", +"archcheater", +"archchemic", +"archchief", +"archchronicler", +"archcity", +"archconfraternity", +"archconsoler", +"archconspirator", +"archcorrupter", +"archcorsair", +"archcount", +"archcozener", +"archcriminal", +"archcritic", +"archcrown", +"archcupbearer", +"archdapifer", +"archdapifership", +"archdeacon", +"archdeaconate", +"archdeaconess", +"archdeaconry", +"archdeaconship", +"archdean", +"archdeanery", +"archdeceiver", +"archdefender", +"archdemon", +"archdepredator", +"archdespot", +"archdetective", +"archdevil", +"archdiocesan", +"archdiocese", +"archdiplomatist", +"archdissembler", +"archdisturber", +"archdivine", +"archdogmatist", +"archdolt", +"archdruid", +"archducal", +"archduchess", +"archduchy", +"archduke", +"archdukedom", +"arche", +"archeal", +"Archean", +"archearl", +"archebiosis", +"archecclesiastic", +"archecentric", +"arched", +"archegone", +"archegonial", +"Archegoniata", +"Archegoniatae", +"archegoniate", +"archegoniophore", +"archegonium", +"archegony", +"Archegosaurus", +"archeion", +"Archelaus", +"Archelenis", +"archelogy", +"Archelon", +"archemperor", +"Archencephala", +"archencephalic", +"archenemy", +"archengineer", +"archenteric", +"archenteron", +"archeocyte", +"Archeozoic", +"Archer", +"archer", +"archeress", +"archerfish", +"archership", +"archery", +"arches", +"archespore", +"archesporial", +"archesporium", +"archetypal", +"archetypally", +"archetype", +"archetypic", +"archetypical", +"archetypically", +"archetypist", +"archeunuch", +"archeus", +"archexorcist", +"archfelon", +"archfiend", +"archfire", +"archflamen", +"archflatterer", +"archfoe", +"archfool", +"archform", +"archfounder", +"archfriend", +"archgenethliac", +"archgod", +"archgomeral", +"archgovernor", +"archgunner", +"archhead", +"archheart", +"archheresy", +"archheretic", +"archhost", +"archhouse", +"archhumbug", +"archhypocrisy", +"archhypocrite", +"Archiannelida", +"archiater", +"Archibald", +"archibenthal", +"archibenthic", +"archibenthos", +"archiblast", +"archiblastic", +"archiblastoma", +"archiblastula", +"Archibuteo", +"archicantor", +"archicarp", +"archicerebrum", +"Archichlamydeae", +"archichlamydeous", +"archicleistogamous", +"archicleistogamy", +"archicoele", +"archicontinent", +"archicyte", +"archicytula", +"Archidamus", +"Archidiaceae", +"archidiaconal", +"archidiaconate", +"archididascalian", +"archididascalos", +"Archidiskodon", +"Archidium", +"archidome", +"Archie", +"archiepiscopacy", +"archiepiscopal", +"archiepiscopally", +"archiepiscopate", +"archiereus", +"archigaster", +"archigastrula", +"archigenesis", +"archigonic", +"archigonocyte", +"archigony", +"archiheretical", +"archikaryon", +"archil", +"archilithic", +"Archilochian", +"archilowe", +"archimage", +"Archimago", +"archimagus", +"archimandrite", +"Archimedean", +"Archimedes", +"archimime", +"archimorphic", +"archimorula", +"archimperial", +"archimperialism", +"archimperialist", +"archimperialistic", +"archimpressionist", +"Archimycetes", +"archineuron", +"archinfamy", +"archinformer", +"arching", +"archipallial", +"archipallium", +"archipelagian", +"archipelagic", +"archipelago", +"archipin", +"archiplasm", +"archiplasmic", +"Archiplata", +"archiprelatical", +"archipresbyter", +"archipterygial", +"archipterygium", +"archisperm", +"Archispermae", +"archisphere", +"archispore", +"archistome", +"archisupreme", +"archisymbolical", +"architect", +"architective", +"architectonic", +"Architectonica", +"architectonically", +"architectonics", +"architectress", +"architectural", +"architecturalist", +"architecturally", +"architecture", +"architecturesque", +"Architeuthis", +"architis", +"architraval", +"architrave", +"architraved", +"architypographer", +"archival", +"archive", +"archivist", +"archivolt", +"archizoic", +"archjockey", +"archking", +"archknave", +"archleader", +"archlecher", +"archleveler", +"archlexicographer", +"archliar", +"archlute", +"archly", +"archmachine", +"archmagician", +"archmagirist", +"archmarshal", +"archmediocrity", +"archmessenger", +"archmilitarist", +"archmime", +"archminister", +"archmock", +"archmocker", +"archmockery", +"archmonarch", +"archmonarchist", +"archmonarchy", +"archmugwump", +"archmurderer", +"archmystagogue", +"archness", +"archocele", +"archocystosyrinx", +"archology", +"archon", +"archonship", +"archont", +"archontate", +"Archontia", +"archontic", +"archoplasm", +"archoplasmic", +"archoptoma", +"archoptosis", +"archorrhagia", +"archorrhea", +"archostegnosis", +"archostenosis", +"archosyrinx", +"archoverseer", +"archpall", +"archpapist", +"archpastor", +"archpatriarch", +"archpatron", +"archphilosopher", +"archphylarch", +"archpiece", +"archpilferer", +"archpillar", +"archpirate", +"archplagiarist", +"archplagiary", +"archplayer", +"archplotter", +"archplunderer", +"archplutocrat", +"archpoet", +"archpolitician", +"archpontiff", +"archpractice", +"archprelate", +"archprelatic", +"archprelatical", +"archpresbyter", +"archpresbyterate", +"archpresbytery", +"archpretender", +"archpriest", +"archpriesthood", +"archpriestship", +"archprimate", +"archprince", +"archprophet", +"archprotopope", +"archprototype", +"archpublican", +"archpuritan", +"archradical", +"archrascal", +"archreactionary", +"archrebel", +"archregent", +"archrepresentative", +"archrobber", +"archrogue", +"archruler", +"archsacrificator", +"archsacrificer", +"archsaint", +"archsatrap", +"archscoundrel", +"archseducer", +"archsee", +"archsewer", +"archshepherd", +"archsin", +"archsnob", +"archspirit", +"archspy", +"archsteward", +"archswindler", +"archsynagogue", +"archtempter", +"archthief", +"archtraitor", +"archtreasurer", +"archtreasurership", +"archturncoat", +"archtyrant", +"archurger", +"archvagabond", +"archvampire", +"archvestryman", +"archvillain", +"archvillainy", +"archvisitor", +"archwag", +"archway", +"archwench", +"archwise", +"archworker", +"archworkmaster", +"Archy", +"archy", +"Arcidae", +"Arcifera", +"arciferous", +"arcifinious", +"arciform", +"arcing", +"Arcite", +"arcked", +"arcking", +"arcocentrous", +"arcocentrum", +"arcograph", +"Arcos", +"Arctalia", +"Arctalian", +"Arctamerican", +"arctation", +"Arctia", +"arctian", +"arctic", +"arctically", +"arctician", +"arcticize", +"arcticward", +"arcticwards", +"arctiid", +"Arctiidae", +"Arctisca", +"Arctium", +"Arctocephalus", +"Arctogaea", +"Arctogaeal", +"Arctogaean", +"arctoid", +"Arctoidea", +"arctoidean", +"Arctomys", +"Arctos", +"Arctosis", +"Arctostaphylos", +"Arcturia", +"Arcturus", +"arcual", +"arcuale", +"arcuate", +"arcuated", +"arcuately", +"arcuation", +"arcubalist", +"arcubalister", +"arcula", +"arculite", +"ardassine", +"Ardea", +"Ardeae", +"ardeb", +"Ardeidae", +"Ardelia", +"ardella", +"ardency", +"ardennite", +"ardent", +"ardently", +"ardentness", +"Ardhamagadhi", +"Ardhanari", +"ardish", +"Ardisia", +"Ardisiaceae", +"ardoise", +"ardor", +"ardri", +"ardu", +"arduinite", +"arduous", +"arduously", +"arduousness", +"ardurous", +"are", +"area", +"areach", +"aread", +"areal", +"areality", +"Arean", +"arear", +"areasoner", +"areaway", +"Areca", +"Arecaceae", +"arecaceous", +"arecaidin", +"arecaidine", +"arecain", +"arecaine", +"Arecales", +"arecolidin", +"arecolidine", +"arecolin", +"arecoline", +"Arecuna", +"ared", +"areek", +"areel", +"arefact", +"arefaction", +"aregenerative", +"aregeneratory", +"areito", +"arena", +"arenaceous", +"arenae", +"Arenaria", +"arenariae", +"arenarious", +"arenation", +"arend", +"arendalite", +"areng", +"Arenga", +"Arenicola", +"arenicole", +"arenicolite", +"arenicolous", +"Arenig", +"arenilitic", +"arenoid", +"arenose", +"arenosity", +"arent", +"areocentric", +"areographer", +"areographic", +"areographical", +"areographically", +"areography", +"areola", +"areolar", +"areolate", +"areolated", +"areolation", +"areole", +"areolet", +"areologic", +"areological", +"areologically", +"areologist", +"areology", +"areometer", +"areometric", +"areometrical", +"areometry", +"Areopagist", +"Areopagite", +"Areopagitic", +"Areopagitica", +"Areopagus", +"areotectonics", +"areroscope", +"aretaics", +"arete", +"Arethusa", +"Arethuse", +"Aretinian", +"arfvedsonite", +"argal", +"argala", +"argali", +"argans", +"Argante", +"Argas", +"argasid", +"Argasidae", +"Argean", +"argeers", +"argel", +"Argemone", +"argemony", +"argenol", +"argent", +"argental", +"argentamid", +"argentamide", +"argentamin", +"argentamine", +"argentate", +"argentation", +"argenteous", +"argenter", +"argenteum", +"argentic", +"argenticyanide", +"argentide", +"argentiferous", +"Argentina", +"Argentine", +"argentine", +"Argentinean", +"Argentinian", +"Argentinidae", +"argentinitrate", +"Argentinize", +"Argentino", +"argention", +"argentite", +"argentojarosite", +"argentol", +"argentometric", +"argentometrically", +"argentometry", +"argenton", +"argentoproteinum", +"argentose", +"argentous", +"argentum", +"Argestes", +"arghan", +"arghel", +"arghool", +"Argid", +"argil", +"argillaceous", +"argilliferous", +"argillite", +"argillitic", +"argilloarenaceous", +"argillocalcareous", +"argillocalcite", +"argilloferruginous", +"argilloid", +"argillomagnesian", +"argillous", +"arginine", +"argininephosphoric", +"Argiope", +"Argiopidae", +"Argiopoidea", +"Argive", +"Argo", +"argo", +"Argoan", +"argol", +"argolet", +"Argolian", +"Argolic", +"Argolid", +"argon", +"Argonaut", +"Argonauta", +"Argonautic", +"Argonne", +"argosy", +"argot", +"argotic", +"Argovian", +"arguable", +"argue", +"arguer", +"argufier", +"argufy", +"Argulus", +"argument", +"argumental", +"argumentation", +"argumentatious", +"argumentative", +"argumentatively", +"argumentativeness", +"argumentator", +"argumentatory", +"Argus", +"argusfish", +"Argusianus", +"Arguslike", +"argute", +"argutely", +"arguteness", +"Argyle", +"Argyll", +"Argynnis", +"argyranthemous", +"argyranthous", +"Argyraspides", +"argyria", +"argyric", +"argyrite", +"argyrocephalous", +"argyrodite", +"Argyrol", +"Argyroneta", +"Argyropelecus", +"argyrose", +"argyrosis", +"Argyrosomus", +"argyrythrose", +"arhar", +"arhat", +"arhatship", +"Arhauaco", +"arhythmic", +"aria", +"Ariadne", +"Arian", +"Ariana", +"Arianism", +"Arianistic", +"Arianistical", +"Arianize", +"Arianizer", +"Arianrhod", +"aribine", +"Arician", +"aricine", +"arid", +"Arided", +"aridge", +"aridian", +"aridity", +"aridly", +"aridness", +"ariegite", +"Ariel", +"ariel", +"arienzo", +"Aries", +"arietation", +"Arietid", +"arietinous", +"arietta", +"aright", +"arightly", +"arigue", +"Ariidae", +"Arikara", +"aril", +"ariled", +"arillary", +"arillate", +"arillated", +"arilliform", +"arillode", +"arillodium", +"arilloid", +"arillus", +"Arimasp", +"Arimaspian", +"Arimathaean", +"Ariocarpus", +"Arioi", +"Arioian", +"Arion", +"ariose", +"arioso", +"ariot", +"aripple", +"Arisaema", +"arisard", +"arise", +"arisen", +"arist", +"arista", +"Aristarch", +"Aristarchian", +"aristarchy", +"aristate", +"Aristeas", +"Aristida", +"Aristides", +"Aristippus", +"aristocracy", +"aristocrat", +"aristocratic", +"aristocratical", +"aristocratically", +"aristocraticalness", +"aristocraticism", +"aristocraticness", +"aristocratism", +"aristodemocracy", +"aristodemocratical", +"aristogenesis", +"aristogenetic", +"aristogenic", +"aristogenics", +"Aristol", +"Aristolochia", +"Aristolochiaceae", +"aristolochiaceous", +"Aristolochiales", +"aristolochin", +"aristolochine", +"aristological", +"aristologist", +"aristology", +"aristomonarchy", +"Aristophanic", +"aristorepublicanism", +"Aristotelian", +"Aristotelianism", +"Aristotelic", +"Aristotelism", +"aristotype", +"aristulate", +"arite", +"arithmetic", +"arithmetical", +"arithmetically", +"arithmetician", +"arithmetization", +"arithmetize", +"arithmic", +"arithmocracy", +"arithmocratic", +"arithmogram", +"arithmograph", +"arithmography", +"arithmomania", +"arithmometer", +"Arius", +"Arivaipa", +"Arizona", +"Arizonan", +"Arizonian", +"arizonite", +"arjun", +"ark", +"Arkab", +"Arkansan", +"Arkansas", +"Arkansawyer", +"arkansite", +"Arkite", +"arkite", +"arkose", +"arkosic", +"arksutite", +"Arleng", +"arles", +"Arline", +"arm", +"armada", +"armadilla", +"Armadillididae", +"Armadillidium", +"armadillo", +"Armado", +"Armageddon", +"Armageddonist", +"armagnac", +"armament", +"armamentarium", +"armamentary", +"armangite", +"armariolum", +"armarium", +"Armata", +"Armatoles", +"Armatoli", +"armature", +"armbone", +"armchair", +"armchaired", +"armed", +"armeniaceous", +"Armenian", +"Armenic", +"Armenize", +"Armenoid", +"armer", +"Armeria", +"Armeriaceae", +"armet", +"armful", +"armgaunt", +"armhole", +"armhoop", +"Armida", +"armied", +"armiferous", +"armiger", +"armigeral", +"armigerous", +"armil", +"armilla", +"Armillaria", +"armillary", +"armillate", +"armillated", +"arming", +"Arminian", +"Arminianism", +"Arminianize", +"Arminianizer", +"armipotence", +"armipotent", +"armisonant", +"armisonous", +"armistice", +"armless", +"armlet", +"armload", +"armoire", +"armonica", +"armor", +"Armoracia", +"armored", +"armorer", +"armorial", +"Armoric", +"Armorican", +"Armorician", +"armoried", +"armorist", +"armorproof", +"armorwise", +"armory", +"Armouchiquois", +"armozeen", +"armpiece", +"armpit", +"armplate", +"armrack", +"armrest", +"arms", +"armscye", +"armure", +"army", +"arn", +"arna", +"Arnaut", +"arnberry", +"Arneb", +"Arnebia", +"arnee", +"arni", +"arnica", +"Arnold", +"Arnoldist", +"Arnoseris", +"arnotta", +"arnotto", +"Arnusian", +"arnut", +"Aro", +"aroar", +"aroast", +"arock", +"aroeira", +"aroid", +"aroideous", +"Aroides", +"aroint", +"arolium", +"arolla", +"aroma", +"aromacity", +"aromadendrin", +"aromatic", +"aromatically", +"aromaticness", +"aromatite", +"aromatites", +"aromatization", +"aromatize", +"aromatizer", +"aromatophor", +"aromatophore", +"Aronia", +"aroon", +"Aroras", +"Arosaguntacook", +"arose", +"around", +"arousal", +"arouse", +"arousement", +"arouser", +"arow", +"aroxyl", +"arpeggiando", +"arpeggiated", +"arpeggiation", +"arpeggio", +"arpeggioed", +"arpen", +"arpent", +"arquerite", +"arquifoux", +"arracach", +"arracacha", +"Arracacia", +"arrack", +"arrah", +"arraign", +"arraigner", +"arraignment", +"arrame", +"arrange", +"arrangeable", +"arrangement", +"arranger", +"arrant", +"arrantly", +"Arras", +"arras", +"arrased", +"arrasene", +"arrastra", +"arrastre", +"arratel", +"arrau", +"array", +"arrayal", +"arrayer", +"arrayment", +"arrear", +"arrearage", +"arrect", +"arrector", +"arrendation", +"arrenotokous", +"arrenotoky", +"arrent", +"arrentable", +"arrentation", +"arreptitious", +"arrest", +"arrestable", +"arrestation", +"arrestee", +"arrester", +"arresting", +"arrestingly", +"arrestive", +"arrestment", +"arrestor", +"Arretine", +"arrhenal", +"Arrhenatherum", +"arrhenoid", +"arrhenotokous", +"arrhenotoky", +"arrhinia", +"arrhizal", +"arrhizous", +"arrhythmia", +"arrhythmic", +"arrhythmical", +"arrhythmically", +"arrhythmous", +"arrhythmy", +"arriage", +"arriba", +"arride", +"arridge", +"arrie", +"arriere", +"Arriet", +"arrimby", +"arris", +"arrish", +"arrisways", +"arriswise", +"arrival", +"arrive", +"arriver", +"arroba", +"arrogance", +"arrogancy", +"arrogant", +"arrogantly", +"arrogantness", +"arrogate", +"arrogatingly", +"arrogation", +"arrogative", +"arrogator", +"arrojadite", +"arrope", +"arrosive", +"arrow", +"arrowbush", +"arrowed", +"arrowhead", +"arrowheaded", +"arrowleaf", +"arrowless", +"arrowlet", +"arrowlike", +"arrowplate", +"arrowroot", +"arrowsmith", +"arrowstone", +"arrowweed", +"arrowwood", +"arrowworm", +"arrowy", +"arroyo", +"Arruague", +"Arry", +"Arryish", +"Arsacid", +"Arsacidan", +"arsanilic", +"arse", +"arsedine", +"arsenal", +"arsenate", +"arsenation", +"arseneted", +"arsenetted", +"arsenfast", +"arsenferratose", +"arsenhemol", +"arseniasis", +"arseniate", +"arsenic", +"arsenical", +"arsenicalism", +"arsenicate", +"arsenicism", +"arsenicize", +"arsenicophagy", +"arsenide", +"arseniferous", +"arsenillo", +"arseniopleite", +"arseniosiderite", +"arsenious", +"arsenism", +"arsenite", +"arsenium", +"arseniuret", +"arseniureted", +"arsenization", +"arseno", +"arsenobenzene", +"arsenobenzol", +"arsenobismite", +"arsenoferratin", +"arsenofuran", +"arsenohemol", +"arsenolite", +"arsenophagy", +"arsenophen", +"arsenophenol", +"arsenophenylglycin", +"arsenopyrite", +"arsenostyracol", +"arsenotherapy", +"arsenotungstates", +"arsenotungstic", +"arsenous", +"arsenoxide", +"arsenyl", +"arses", +"arsesmart", +"arsheen", +"arshin", +"arshine", +"arsine", +"arsinic", +"arsino", +"Arsinoitherium", +"arsis", +"arsle", +"arsmetrik", +"arsmetrike", +"arsnicker", +"arsoite", +"arson", +"arsonate", +"arsonation", +"arsonic", +"arsonist", +"arsonite", +"arsonium", +"arsono", +"arsonvalization", +"arsphenamine", +"arsyl", +"arsylene", +"Art", +"art", +"artaba", +"artabe", +"artal", +"Artamidae", +"Artamus", +"artar", +"artarine", +"artcraft", +"artefact", +"artel", +"Artemas", +"Artemia", +"Artemis", +"Artemisia", +"artemisic", +"artemisin", +"Artemision", +"Artemisium", +"arteriagra", +"arterial", +"arterialization", +"arterialize", +"arterially", +"arteriarctia", +"arteriasis", +"arteriectasia", +"arteriectasis", +"arteriectopia", +"arterin", +"arterioarctia", +"arteriocapillary", +"arteriococcygeal", +"arteriodialysis", +"arteriodiastasis", +"arteriofibrosis", +"arteriogenesis", +"arteriogram", +"arteriograph", +"arteriography", +"arteriole", +"arteriolith", +"arteriology", +"arteriolosclerosis", +"arteriomalacia", +"arteriometer", +"arteriomotor", +"arterionecrosis", +"arteriopalmus", +"arteriopathy", +"arteriophlebotomy", +"arterioplania", +"arterioplasty", +"arteriopressor", +"arteriorenal", +"arteriorrhagia", +"arteriorrhaphy", +"arteriorrhexis", +"arteriosclerosis", +"arteriosclerotic", +"arteriospasm", +"arteriostenosis", +"arteriostosis", +"arteriostrepsis", +"arteriosympathectomy", +"arteriotome", +"arteriotomy", +"arteriotrepsis", +"arterious", +"arteriovenous", +"arterioversion", +"arterioverter", +"arteritis", +"artery", +"Artesian", +"artesian", +"artful", +"artfully", +"artfulness", +"Artgum", +"artha", +"arthel", +"arthemis", +"arthragra", +"arthral", +"arthralgia", +"arthralgic", +"arthrectomy", +"arthredema", +"arthrempyesis", +"arthresthesia", +"arthritic", +"arthritical", +"arthriticine", +"arthritis", +"arthritism", +"arthrobacterium", +"arthrobranch", +"arthrobranchia", +"arthrocace", +"arthrocarcinoma", +"arthrocele", +"arthrochondritis", +"arthroclasia", +"arthrocleisis", +"arthroclisis", +"arthroderm", +"arthrodesis", +"arthrodia", +"arthrodial", +"arthrodic", +"Arthrodira", +"arthrodiran", +"arthrodire", +"arthrodirous", +"Arthrodonteae", +"arthrodynia", +"arthrodynic", +"arthroempyema", +"arthroempyesis", +"arthroendoscopy", +"Arthrogastra", +"arthrogastran", +"arthrogenous", +"arthrography", +"arthrogryposis", +"arthrolite", +"arthrolith", +"arthrolithiasis", +"arthrology", +"arthromeningitis", +"arthromere", +"arthromeric", +"arthrometer", +"arthrometry", +"arthroncus", +"arthroneuralgia", +"arthropathic", +"arthropathology", +"arthropathy", +"arthrophlogosis", +"arthrophyma", +"arthroplastic", +"arthroplasty", +"arthropleura", +"arthropleure", +"arthropod", +"Arthropoda", +"arthropodal", +"arthropodan", +"arthropodous", +"Arthropomata", +"arthropomatous", +"arthropterous", +"arthropyosis", +"arthrorheumatism", +"arthrorrhagia", +"arthrosclerosis", +"arthrosia", +"arthrosis", +"arthrospore", +"arthrosporic", +"arthrosporous", +"arthrosteitis", +"arthrosterigma", +"arthrostome", +"arthrostomy", +"Arthrostraca", +"arthrosynovitis", +"arthrosyrinx", +"arthrotome", +"arthrotomy", +"arthrotrauma", +"arthrotropic", +"arthrotyphoid", +"arthrous", +"arthroxerosis", +"Arthrozoa", +"arthrozoan", +"arthrozoic", +"Arthur", +"Arthurian", +"Arthuriana", +"artiad", +"artichoke", +"article", +"articled", +"articulability", +"articulable", +"articulacy", +"articulant", +"articular", +"articulare", +"articularly", +"articulary", +"Articulata", +"articulate", +"articulated", +"articulately", +"articulateness", +"articulation", +"articulationist", +"articulative", +"articulator", +"articulatory", +"articulite", +"articulus", +"Artie", +"artifact", +"artifactitious", +"artifice", +"artificer", +"artificership", +"artificial", +"artificialism", +"artificiality", +"artificialize", +"artificially", +"artificialness", +"artiller", +"artillerist", +"artillery", +"artilleryman", +"artilleryship", +"artiness", +"artinite", +"Artinskian", +"artiodactyl", +"Artiodactyla", +"artiodactylous", +"artiphyllous", +"artisan", +"artisanship", +"artist", +"artistdom", +"artiste", +"artistic", +"artistical", +"artistically", +"artistry", +"artless", +"artlessly", +"artlessness", +"artlet", +"artlike", +"Artocarpaceae", +"artocarpad", +"artocarpeous", +"artocarpous", +"Artocarpus", +"artolater", +"artophagous", +"artophorion", +"artotype", +"artotypy", +"Artotyrite", +"artware", +"arty", +"aru", +"Aruac", +"arui", +"aruke", +"Arulo", +"Arum", +"arumin", +"Aruncus", +"arundiferous", +"arundinaceous", +"Arundinaria", +"arundineous", +"Arundo", +"Arunta", +"arupa", +"arusa", +"arusha", +"arustle", +"arval", +"arvel", +"Arverni", +"Arvicola", +"arvicole", +"Arvicolinae", +"arvicoline", +"arvicolous", +"arviculture", +"arx", +"ary", +"Arya", +"Aryan", +"Aryanism", +"Aryanization", +"Aryanize", +"aryballoid", +"aryballus", +"aryepiglottic", +"aryl", +"arylamine", +"arylamino", +"arylate", +"arytenoid", +"arytenoidal", +"arzan", +"Arzava", +"Arzawa", +"arzrunite", +"arzun", +"As", +"as", +"Asa", +"asaddle", +"asafetida", +"Asahel", +"asak", +"asale", +"asana", +"Asaph", +"asaphia", +"Asaphic", +"asaphid", +"Asaphidae", +"Asaphus", +"asaprol", +"asarabacca", +"Asaraceae", +"Asarh", +"asarite", +"asaron", +"asarone", +"asarotum", +"Asarum", +"asbest", +"asbestic", +"asbestiform", +"asbestine", +"asbestinize", +"asbestoid", +"asbestoidal", +"asbestos", +"asbestosis", +"asbestous", +"asbestus", +"asbolin", +"asbolite", +"Ascabart", +"Ascalabota", +"ascan", +"Ascanian", +"Ascanius", +"ascare", +"ascariasis", +"ascaricidal", +"ascaricide", +"ascarid", +"Ascaridae", +"ascarides", +"Ascaridia", +"ascaridiasis", +"ascaridole", +"Ascaris", +"ascaron", +"Ascella", +"ascellus", +"ascend", +"ascendable", +"ascendance", +"ascendancy", +"ascendant", +"ascendence", +"ascendency", +"ascendent", +"ascender", +"ascendible", +"ascending", +"ascendingly", +"ascension", +"ascensional", +"ascensionist", +"Ascensiontide", +"ascensive", +"ascent", +"ascertain", +"ascertainable", +"ascertainableness", +"ascertainably", +"ascertainer", +"ascertainment", +"ascescency", +"ascescent", +"ascetic", +"ascetical", +"ascetically", +"asceticism", +"Ascetta", +"aschaffite", +"ascham", +"aschistic", +"asci", +"ascian", +"Ascidia", +"Ascidiacea", +"Ascidiae", +"ascidian", +"ascidiate", +"ascidicolous", +"ascidiferous", +"ascidiform", +"ascidioid", +"Ascidioida", +"Ascidioidea", +"Ascidiozoa", +"ascidiozooid", +"ascidium", +"asciferous", +"ascigerous", +"ascii", +"ascites", +"ascitic", +"ascitical", +"ascititious", +"asclent", +"Asclepiad", +"asclepiad", +"Asclepiadaceae", +"asclepiadaceous", +"Asclepiadae", +"Asclepiadean", +"asclepiadeous", +"Asclepiadic", +"Asclepian", +"Asclepias", +"asclepidin", +"asclepidoid", +"Asclepieion", +"asclepin", +"Asclepius", +"ascocarp", +"ascocarpous", +"Ascochyta", +"ascogenous", +"ascogone", +"ascogonial", +"ascogonidium", +"ascogonium", +"ascolichen", +"Ascolichenes", +"ascoma", +"ascomycetal", +"ascomycete", +"Ascomycetes", +"ascomycetous", +"ascon", +"Ascones", +"ascophore", +"ascophorous", +"Ascophyllum", +"ascorbic", +"ascospore", +"ascosporic", +"ascosporous", +"Ascot", +"ascot", +"Ascothoracica", +"ascribable", +"ascribe", +"ascript", +"ascription", +"ascriptitii", +"ascriptitious", +"ascriptitius", +"ascry", +"ascula", +"Ascupart", +"ascus", +"ascyphous", +"Ascyrum", +"asdic", +"ase", +"asearch", +"asecretory", +"aseethe", +"aseismatic", +"aseismic", +"aseismicity", +"aseity", +"aselgeia", +"asellate", +"Aselli", +"Asellidae", +"Aselline", +"Asellus", +"asem", +"asemasia", +"asemia", +"asepsis", +"aseptate", +"aseptic", +"aseptically", +"asepticism", +"asepticize", +"aseptify", +"aseptol", +"aseptolin", +"asexual", +"asexuality", +"asexualization", +"asexualize", +"asexually", +"asfetida", +"ash", +"Asha", +"ashake", +"ashame", +"ashamed", +"ashamedly", +"ashamedness", +"ashamnu", +"Ashangos", +"Ashantee", +"Ashanti", +"Asharasi", +"ashberry", +"ashcake", +"ashen", +"Asher", +"asherah", +"Asherites", +"ashery", +"ashes", +"ashet", +"ashily", +"ashimmer", +"ashine", +"ashiness", +"ashipboard", +"Ashir", +"ashiver", +"Ashkenazic", +"Ashkenazim", +"ashkoko", +"ashlar", +"ashlared", +"ashlaring", +"ashless", +"ashling", +"Ashluslay", +"ashman", +"Ashmolean", +"Ashochimi", +"ashore", +"ashpan", +"ashpit", +"ashplant", +"ashraf", +"ashrafi", +"ashthroat", +"Ashur", +"ashur", +"ashweed", +"ashwort", +"ashy", +"asialia", +"Asian", +"Asianic", +"Asianism", +"Asiarch", +"Asiarchate", +"Asiatic", +"Asiatical", +"Asiatically", +"Asiatican", +"Asiaticism", +"Asiaticization", +"Asiaticize", +"Asiatize", +"aside", +"asidehand", +"asideness", +"asiderite", +"asideu", +"asiento", +"asilid", +"Asilidae", +"Asilus", +"asimen", +"Asimina", +"asimmer", +"asinego", +"asinine", +"asininely", +"asininity", +"asiphonate", +"asiphonogama", +"asitia", +"ask", +"askable", +"askance", +"askant", +"askar", +"askari", +"asker", +"askew", +"askingly", +"askip", +"asklent", +"Asklepios", +"askos", +"Askr", +"aslant", +"aslantwise", +"aslaver", +"asleep", +"aslop", +"aslope", +"aslumber", +"asmack", +"asmalte", +"asmear", +"asmile", +"asmoke", +"asmolder", +"asniffle", +"asnort", +"asoak", +"asocial", +"asok", +"asoka", +"asomatophyte", +"asomatous", +"asonant", +"asonia", +"asop", +"asor", +"asouth", +"asp", +"aspace", +"aspalathus", +"Aspalax", +"asparagic", +"asparagine", +"asparaginic", +"asparaginous", +"asparagus", +"asparagyl", +"asparkle", +"aspartate", +"aspartic", +"aspartyl", +"Aspasia", +"Aspatia", +"aspect", +"aspectable", +"aspectant", +"aspection", +"aspectual", +"aspen", +"asper", +"asperate", +"asperation", +"aspergation", +"asperge", +"asperger", +"Asperges", +"aspergil", +"aspergill", +"Aspergillaceae", +"Aspergillales", +"aspergilliform", +"aspergillin", +"aspergillosis", +"aspergillum", +"aspergillus", +"Asperifoliae", +"asperifoliate", +"asperifolious", +"asperite", +"asperity", +"aspermatic", +"aspermatism", +"aspermatous", +"aspermia", +"aspermic", +"aspermous", +"asperous", +"asperously", +"asperse", +"aspersed", +"asperser", +"aspersion", +"aspersive", +"aspersively", +"aspersor", +"aspersorium", +"aspersory", +"Asperugo", +"Asperula", +"asperuloside", +"asperulous", +"asphalt", +"asphaltene", +"asphalter", +"asphaltic", +"asphaltite", +"asphaltum", +"aspheterism", +"aspheterize", +"asphodel", +"Asphodelaceae", +"Asphodeline", +"Asphodelus", +"asphyctic", +"asphyctous", +"asphyxia", +"asphyxial", +"asphyxiant", +"asphyxiate", +"asphyxiation", +"asphyxiative", +"asphyxiator", +"asphyxied", +"asphyxy", +"aspic", +"aspiculate", +"aspiculous", +"aspidate", +"aspidiaria", +"aspidinol", +"Aspidiotus", +"Aspidiske", +"Aspidistra", +"aspidium", +"Aspidobranchia", +"Aspidobranchiata", +"aspidobranchiate", +"Aspidocephali", +"Aspidochirota", +"Aspidoganoidei", +"aspidomancy", +"Aspidosperma", +"aspidospermine", +"aspirant", +"aspirata", +"aspirate", +"aspiration", +"aspirator", +"aspiratory", +"aspire", +"aspirer", +"aspirin", +"aspiring", +"aspiringly", +"aspiringness", +"aspish", +"asplanchnic", +"Asplenieae", +"asplenioid", +"Asplenium", +"asporogenic", +"asporogenous", +"asporous", +"asport", +"asportation", +"asporulate", +"aspout", +"asprawl", +"aspread", +"Aspredinidae", +"Aspredo", +"aspring", +"asprout", +"asquare", +"asquat", +"asqueal", +"asquint", +"asquirm", +"ass", +"assacu", +"assagai", +"assai", +"assail", +"assailable", +"assailableness", +"assailant", +"assailer", +"assailment", +"Assam", +"Assamese", +"Assamites", +"assapan", +"assapanic", +"assarion", +"assart", +"assary", +"assassin", +"assassinate", +"assassination", +"assassinative", +"assassinator", +"assassinatress", +"assassinist", +"assate", +"assation", +"assault", +"assaultable", +"assaulter", +"assaut", +"assay", +"assayable", +"assayer", +"assaying", +"assbaa", +"asse", +"assecuration", +"assecurator", +"assedation", +"assegai", +"asself", +"assemblable", +"assemblage", +"assemble", +"assembler", +"assembly", +"assemblyman", +"assent", +"assentaneous", +"assentation", +"assentatious", +"assentator", +"assentatorily", +"assentatory", +"assented", +"assenter", +"assentient", +"assenting", +"assentingly", +"assentive", +"assentiveness", +"assentor", +"assert", +"assertable", +"assertative", +"asserter", +"assertible", +"assertion", +"assertional", +"assertive", +"assertively", +"assertiveness", +"assertor", +"assertorial", +"assertorially", +"assertoric", +"assertorical", +"assertorically", +"assertorily", +"assertory", +"assertress", +"assertrix", +"assertum", +"assess", +"assessable", +"assessably", +"assessed", +"assessee", +"assession", +"assessionary", +"assessment", +"assessor", +"assessorial", +"assessorship", +"assessory", +"asset", +"assets", +"assever", +"asseverate", +"asseveratingly", +"asseveration", +"asseverative", +"asseveratively", +"asseveratory", +"asshead", +"assi", +"assibilate", +"assibilation", +"Assidean", +"assident", +"assidual", +"assidually", +"assiduity", +"assiduous", +"assiduously", +"assiduousness", +"assientist", +"assiento", +"assify", +"assign", +"assignability", +"assignable", +"assignably", +"assignat", +"assignation", +"assigned", +"assignee", +"assigneeship", +"assigner", +"assignment", +"assignor", +"assilag", +"assimilability", +"assimilable", +"assimilate", +"assimilation", +"assimilationist", +"assimilative", +"assimilativeness", +"assimilator", +"assimilatory", +"Assiniboin", +"assis", +"Assisan", +"assise", +"assish", +"assishly", +"assishness", +"assist", +"assistance", +"assistant", +"assistanted", +"assistantship", +"assistency", +"assister", +"assistful", +"assistive", +"assistless", +"assistor", +"assize", +"assizement", +"assizer", +"assizes", +"asslike", +"assman", +"Assmannshauser", +"assmanship", +"associability", +"associable", +"associableness", +"associate", +"associated", +"associatedness", +"associateship", +"association", +"associational", +"associationalism", +"associationalist", +"associationism", +"associationist", +"associationistic", +"associative", +"associatively", +"associativeness", +"associator", +"associatory", +"assoil", +"assoilment", +"assoilzie", +"assonance", +"assonanced", +"assonant", +"assonantal", +"assonantic", +"assonate", +"Assonia", +"assort", +"assortative", +"assorted", +"assortedness", +"assorter", +"assortive", +"assortment", +"assuade", +"assuage", +"assuagement", +"assuager", +"assuasive", +"assubjugate", +"assuetude", +"assumable", +"assumably", +"assume", +"assumed", +"assumedly", +"assumer", +"assuming", +"assumingly", +"assumingness", +"assumpsit", +"assumption", +"Assumptionist", +"assumptious", +"assumptiousness", +"assumptive", +"assumptively", +"assurable", +"assurance", +"assurant", +"assure", +"assured", +"assuredly", +"assuredness", +"assurer", +"assurge", +"assurgency", +"assurgent", +"assuring", +"assuringly", +"assyntite", +"Assyrian", +"Assyrianize", +"Assyriological", +"Assyriologist", +"Assyriologue", +"Assyriology", +"Assyroid", +"assythment", +"ast", +"asta", +"Astacidae", +"Astacus", +"Astakiwi", +"astalk", +"astarboard", +"astare", +"astart", +"Astarte", +"Astartian", +"Astartidae", +"astasia", +"astatic", +"astatically", +"astaticism", +"astatine", +"astatize", +"astatizer", +"astay", +"asteam", +"asteatosis", +"asteep", +"asteer", +"asteism", +"astelic", +"astely", +"aster", +"Asteraceae", +"asteraceous", +"Asterales", +"Asterella", +"astereognosis", +"asteria", +"asterial", +"Asterias", +"asteriated", +"Asteriidae", +"asterikos", +"asterin", +"Asterina", +"Asterinidae", +"asterioid", +"Asterion", +"asterion", +"Asterionella", +"asterisk", +"asterism", +"asterismal", +"astern", +"asternal", +"Asternata", +"asternia", +"Asterochiton", +"asteroid", +"asteroidal", +"Asteroidea", +"asteroidean", +"Asterolepidae", +"Asterolepis", +"Asterope", +"asterophyllite", +"Asterophyllites", +"Asterospondyli", +"asterospondylic", +"asterospondylous", +"Asteroxylaceae", +"Asteroxylon", +"Asterozoa", +"asterwort", +"asthenia", +"asthenic", +"asthenical", +"asthenobiosis", +"asthenobiotic", +"asthenolith", +"asthenology", +"asthenopia", +"asthenopic", +"asthenosphere", +"astheny", +"asthma", +"asthmatic", +"asthmatical", +"asthmatically", +"asthmatoid", +"asthmogenic", +"asthore", +"asthorin", +"Astian", +"astichous", +"astigmatic", +"astigmatical", +"astigmatically", +"astigmatism", +"astigmatizer", +"astigmatometer", +"astigmatoscope", +"astigmatoscopy", +"astigmia", +"astigmism", +"astigmometer", +"astigmometry", +"Astilbe", +"astilbe", +"astint", +"astipulate", +"astir", +"astite", +"astomatal", +"astomatous", +"astomia", +"astomous", +"astonied", +"astonish", +"astonishedly", +"astonisher", +"astonishing", +"astonishingly", +"astonishingness", +"astonishment", +"astony", +"astoop", +"astor", +"astound", +"astoundable", +"astounding", +"astoundingly", +"astoundment", +"Astrachan", +"astraddle", +"Astraea", +"Astraean", +"astraean", +"astraeid", +"Astraeidae", +"astraeiform", +"astragal", +"astragalar", +"astragalectomy", +"astragali", +"astragalocalcaneal", +"astragalocentral", +"astragalomancy", +"astragalonavicular", +"astragaloscaphoid", +"astragalotibial", +"Astragalus", +"astragalus", +"astrain", +"astrakanite", +"astrakhan", +"astral", +"astrally", +"astrand", +"Astrantia", +"astraphobia", +"astrapophobia", +"astray", +"astream", +"astrer", +"astrict", +"astriction", +"astrictive", +"astrictively", +"astrictiveness", +"Astrid", +"astride", +"astrier", +"astriferous", +"astrild", +"astringe", +"astringency", +"astringent", +"astringently", +"astringer", +"astroalchemist", +"astroblast", +"Astrocaryum", +"astrochemist", +"astrochemistry", +"astrochronological", +"astrocyte", +"astrocytoma", +"astrocytomata", +"astrodiagnosis", +"astrodome", +"astrofel", +"astrogeny", +"astroglia", +"astrognosy", +"astrogonic", +"astrogony", +"astrograph", +"astrographic", +"astrography", +"astroid", +"astroite", +"astrolabe", +"astrolabical", +"astrolater", +"astrolatry", +"astrolithology", +"astrologaster", +"astrologer", +"astrologian", +"astrologic", +"astrological", +"astrologically", +"astrologistic", +"astrologize", +"astrologous", +"astrology", +"astromancer", +"astromancy", +"astromantic", +"astrometeorological", +"astrometeorologist", +"astrometeorology", +"astrometer", +"astrometrical", +"astrometry", +"astronaut", +"astronautics", +"astronomer", +"astronomic", +"astronomical", +"astronomically", +"astronomics", +"astronomize", +"astronomy", +"Astropecten", +"Astropectinidae", +"astrophil", +"astrophobia", +"astrophotographic", +"astrophotography", +"astrophotometer", +"astrophotometrical", +"astrophotometry", +"astrophyllite", +"astrophysical", +"astrophysicist", +"astrophysics", +"Astrophyton", +"astroscope", +"Astroscopus", +"astroscopy", +"astrospectral", +"astrospectroscopic", +"astrosphere", +"astrotheology", +"astrut", +"astucious", +"astuciously", +"astucity", +"Astur", +"Asturian", +"astute", +"astutely", +"astuteness", +"astylar", +"Astylospongia", +"Astylosternus", +"asudden", +"asunder", +"Asuri", +"aswail", +"aswarm", +"asway", +"asweat", +"aswell", +"aswim", +"aswing", +"aswirl", +"aswoon", +"aswooned", +"asyla", +"asyllabia", +"asyllabic", +"asyllabical", +"asylum", +"asymbiotic", +"asymbolia", +"asymbolic", +"asymbolical", +"asymmetric", +"asymmetrical", +"asymmetrically", +"Asymmetron", +"asymmetry", +"asymptomatic", +"asymptote", +"asymptotic", +"asymptotical", +"asymptotically", +"asynapsis", +"asynaptic", +"asynartete", +"asynartetic", +"asynchronism", +"asynchronous", +"asyndesis", +"asyndetic", +"asyndetically", +"asyndeton", +"asynergia", +"asynergy", +"asyngamic", +"asyngamy", +"asyntactic", +"asyntrophy", +"asystole", +"asystolic", +"asystolism", +"asyzygetic", +"at", +"Ata", +"atabal", +"atabeg", +"atabek", +"Atabrine", +"Atacaman", +"Atacamenan", +"Atacamenian", +"Atacameno", +"atacamite", +"atactic", +"atactiform", +"Ataentsic", +"atafter", +"Ataigal", +"Ataiyal", +"Atalan", +"ataman", +"atamasco", +"Atamosco", +"atangle", +"atap", +"ataraxia", +"ataraxy", +"atatschite", +"ataunt", +"atavi", +"atavic", +"atavism", +"atavist", +"atavistic", +"atavistically", +"atavus", +"ataxaphasia", +"ataxia", +"ataxiagram", +"ataxiagraph", +"ataxiameter", +"ataxiaphasia", +"ataxic", +"ataxinomic", +"ataxite", +"ataxonomic", +"ataxophemia", +"ataxy", +"atazir", +"atbash", +"atchison", +"ate", +"Ateba", +"atebrin", +"atechnic", +"atechnical", +"atechny", +"ateeter", +"atef", +"atelectasis", +"atelectatic", +"ateleological", +"Ateles", +"atelestite", +"atelets", +"atelier", +"ateliosis", +"Atellan", +"atelo", +"atelocardia", +"atelocephalous", +"ateloglossia", +"atelognathia", +"atelomitic", +"atelomyelia", +"atelopodia", +"ateloprosopia", +"atelorachidia", +"atelostomia", +"atemporal", +"Aten", +"Atenism", +"Atenist", +"Aterian", +"ates", +"Atestine", +"ateuchi", +"ateuchus", +"Atfalati", +"Athabasca", +"Athabascan", +"athalamous", +"athalline", +"Athamantid", +"athanasia", +"Athanasian", +"Athanasianism", +"Athanasianist", +"athanasy", +"athanor", +"Athapascan", +"athar", +"Atharvan", +"Athecae", +"Athecata", +"athecate", +"atheism", +"atheist", +"atheistic", +"atheistical", +"atheistically", +"atheisticalness", +"atheize", +"atheizer", +"athelia", +"atheling", +"athematic", +"Athena", +"Athenaea", +"athenaeum", +"athenee", +"Athenian", +"Athenianly", +"athenor", +"Athens", +"atheological", +"atheologically", +"atheology", +"atheous", +"Athericera", +"athericeran", +"athericerous", +"atherine", +"Atherinidae", +"Atheriogaea", +"Atheriogaean", +"Atheris", +"athermancy", +"athermanous", +"athermic", +"athermous", +"atheroma", +"atheromasia", +"atheromata", +"atheromatosis", +"atheromatous", +"atherosclerosis", +"Atherosperma", +"Atherurus", +"athetesis", +"athetize", +"athetoid", +"athetosic", +"athetosis", +"athing", +"athirst", +"athlete", +"athletehood", +"athletic", +"athletical", +"athletically", +"athleticism", +"athletics", +"athletism", +"athletocracy", +"athlothete", +"athlothetes", +"athodyd", +"athort", +"athrepsia", +"athreptic", +"athrill", +"athrive", +"athrob", +"athrocyte", +"athrocytosis", +"athrogenic", +"athrong", +"athrough", +"athwart", +"athwarthawse", +"athwartship", +"athwartships", +"athwartwise", +"athymia", +"athymic", +"athymy", +"athyreosis", +"athyria", +"athyrid", +"Athyridae", +"Athyris", +"Athyrium", +"athyroid", +"athyroidism", +"athyrosis", +"Ati", +"Atik", +"Atikokania", +"atilt", +"atimon", +"atinga", +"atingle", +"atinkle", +"atip", +"atis", +"Atka", +"Atlanta", +"atlantad", +"atlantal", +"Atlantean", +"atlantes", +"Atlantic", +"atlantic", +"Atlantica", +"Atlantid", +"Atlantides", +"atlantite", +"atlantoaxial", +"atlantodidymus", +"atlantomastoid", +"atlantoodontoid", +"Atlantosaurus", +"Atlas", +"atlas", +"Atlaslike", +"atlatl", +"atle", +"atlee", +"atloaxoid", +"atloid", +"atloidean", +"atloidoaxoid", +"atma", +"atman", +"atmiatrics", +"atmiatry", +"atmid", +"atmidalbumin", +"atmidometer", +"atmidometry", +"atmo", +"atmocausis", +"atmocautery", +"atmoclastic", +"atmogenic", +"atmograph", +"atmologic", +"atmological", +"atmologist", +"atmology", +"atmolysis", +"atmolyzation", +"atmolyze", +"atmolyzer", +"atmometer", +"atmometric", +"atmometry", +"atmos", +"atmosphere", +"atmosphereful", +"atmosphereless", +"atmospheric", +"atmospherical", +"atmospherically", +"atmospherics", +"atmospherology", +"atmostea", +"atmosteal", +"atmosteon", +"Atnah", +"atocha", +"atocia", +"atokal", +"atoke", +"atokous", +"atoll", +"atom", +"atomatic", +"atomechanics", +"atomerg", +"atomic", +"atomical", +"atomically", +"atomician", +"atomicism", +"atomicity", +"atomics", +"atomiferous", +"atomism", +"atomist", +"atomistic", +"atomistical", +"atomistically", +"atomistics", +"atomity", +"atomization", +"atomize", +"atomizer", +"atomology", +"atomy", +"atonable", +"atonal", +"atonalism", +"atonalistic", +"atonality", +"atonally", +"atone", +"atonement", +"atoneness", +"atoner", +"atonia", +"atonic", +"atonicity", +"atoningly", +"atony", +"atop", +"Atophan", +"atophan", +"atopic", +"atopite", +"atopy", +"Atorai", +"Atossa", +"atour", +"atoxic", +"Atoxyl", +"atoxyl", +"atrabilarian", +"atrabilarious", +"atrabiliar", +"atrabiliarious", +"atrabiliary", +"atrabilious", +"atrabiliousness", +"atracheate", +"Atractaspis", +"Atragene", +"atragene", +"atrail", +"atrament", +"atramental", +"atramentary", +"atramentous", +"atraumatic", +"Atrebates", +"Atremata", +"atrematous", +"atremble", +"atrepsy", +"atreptic", +"atresia", +"atresic", +"atresy", +"atretic", +"atria", +"atrial", +"atrichia", +"atrichosis", +"atrichous", +"atrickle", +"Atridean", +"atrienses", +"atriensis", +"atriocoelomic", +"atrioporal", +"atriopore", +"atrioventricular", +"atrip", +"Atriplex", +"atrium", +"atrocha", +"atrochal", +"atrochous", +"atrocious", +"atrociously", +"atrociousness", +"atrocity", +"atrolactic", +"Atropa", +"atropaceous", +"atropal", +"atropamine", +"atrophia", +"atrophiated", +"atrophic", +"atrophied", +"atrophoderma", +"atrophy", +"atropia", +"atropic", +"Atropidae", +"atropine", +"atropinism", +"atropinization", +"atropinize", +"atropism", +"atropous", +"atrorubent", +"atrosanguineous", +"atroscine", +"atrous", +"atry", +"Atrypa", +"Atta", +"atta", +"Attacapan", +"attacco", +"attach", +"attachable", +"attachableness", +"attache", +"attached", +"attachedly", +"attacher", +"attacheship", +"attachment", +"attack", +"attackable", +"attacker", +"attacolite", +"Attacus", +"attacus", +"attagen", +"attaghan", +"attain", +"attainability", +"attainable", +"attainableness", +"attainder", +"attainer", +"attainment", +"attaint", +"attaintment", +"attainture", +"Attalea", +"attaleh", +"Attalid", +"attar", +"attargul", +"attask", +"attemper", +"attemperament", +"attemperance", +"attemperate", +"attemperately", +"attemperation", +"attemperator", +"attempt", +"attemptability", +"attemptable", +"attempter", +"attemptless", +"attend", +"attendance", +"attendancy", +"attendant", +"attendantly", +"attender", +"attendingly", +"attendment", +"attendress", +"attensity", +"attent", +"attention", +"attentional", +"attentive", +"attentively", +"attentiveness", +"attently", +"attenuable", +"attenuant", +"attenuate", +"attenuation", +"attenuative", +"attenuator", +"atter", +"attercop", +"attercrop", +"atterminal", +"attermine", +"atterminement", +"attern", +"attery", +"attest", +"attestable", +"attestant", +"attestation", +"attestative", +"attestator", +"attester", +"attestive", +"Attic", +"attic", +"Attical", +"Atticism", +"atticism", +"Atticist", +"Atticize", +"atticize", +"atticomastoid", +"attid", +"Attidae", +"attinge", +"attingence", +"attingency", +"attingent", +"attire", +"attired", +"attirement", +"attirer", +"attitude", +"attitudinal", +"attitudinarian", +"attitudinarianism", +"attitudinize", +"attitudinizer", +"Attiwendaronk", +"attorn", +"attorney", +"attorneydom", +"attorneyism", +"attorneyship", +"attornment", +"attract", +"attractability", +"attractable", +"attractableness", +"attractant", +"attracter", +"attractile", +"attractingly", +"attraction", +"attractionally", +"attractive", +"attractively", +"attractiveness", +"attractivity", +"attractor", +"attrahent", +"attrap", +"attributable", +"attributal", +"attribute", +"attributer", +"attribution", +"attributive", +"attributively", +"attributiveness", +"attrist", +"attrite", +"attrited", +"attriteness", +"attrition", +"attritive", +"attritus", +"attune", +"attunely", +"attunement", +"Atuami", +"atule", +"atumble", +"atune", +"atwain", +"atweel", +"atween", +"atwin", +"atwirl", +"atwist", +"atwitch", +"atwitter", +"atwixt", +"atwo", +"atypic", +"atypical", +"atypically", +"atypy", +"auantic", +"aube", +"aubepine", +"Aubrey", +"Aubrietia", +"aubrietia", +"aubrite", +"auburn", +"aubusson", +"Auca", +"auca", +"Aucan", +"Aucaner", +"Aucanian", +"Auchenia", +"auchenia", +"auchenium", +"auchlet", +"auction", +"auctionary", +"auctioneer", +"auctorial", +"Aucuba", +"aucuba", +"aucupate", +"audacious", +"audaciously", +"audaciousness", +"audacity", +"Audaean", +"Audian", +"Audibertia", +"audibility", +"audible", +"audibleness", +"audibly", +"audience", +"audiencier", +"audient", +"audile", +"audio", +"audiogenic", +"audiogram", +"audiologist", +"audiology", +"audiometer", +"audiometric", +"audiometry", +"Audion", +"audion", +"audiophile", +"audiphone", +"audit", +"audition", +"auditive", +"auditor", +"auditoria", +"auditorial", +"auditorially", +"auditorily", +"auditorium", +"auditorship", +"auditory", +"auditress", +"auditual", +"audivise", +"audiviser", +"audivision", +"Audrey", +"Audubonistic", +"Aueto", +"auganite", +"auge", +"Augean", +"augelite", +"augen", +"augend", +"auger", +"augerer", +"augh", +"aught", +"aughtlins", +"augite", +"augitic", +"augitite", +"augitophyre", +"augment", +"augmentable", +"augmentation", +"augmentationer", +"augmentative", +"augmentatively", +"augmented", +"augmentedly", +"augmenter", +"augmentive", +"augur", +"augural", +"augurate", +"augurial", +"augurous", +"augurship", +"augury", +"August", +"august", +"Augusta", +"augustal", +"Augustan", +"Augusti", +"Augustin", +"Augustinian", +"Augustinianism", +"Augustinism", +"augustly", +"augustness", +"Augustus", +"auh", +"auhuhu", +"Auk", +"auk", +"auklet", +"aula", +"aulacocarpous", +"Aulacodus", +"Aulacomniaceae", +"Aulacomnium", +"aulae", +"aularian", +"auld", +"auldfarrantlike", +"auletai", +"aulete", +"auletes", +"auletic", +"auletrides", +"auletris", +"aulic", +"aulicism", +"auloi", +"aulophyte", +"aulos", +"Aulostoma", +"Aulostomatidae", +"Aulostomi", +"aulostomid", +"Aulostomidae", +"Aulostomus", +"aulu", +"aum", +"aumaga", +"aumail", +"aumbry", +"aumery", +"aumil", +"aumildar", +"aumous", +"aumrie", +"auncel", +"aune", +"Aunjetitz", +"aunt", +"aunthood", +"auntie", +"auntish", +"auntlike", +"auntly", +"auntsary", +"auntship", +"aupaka", +"aura", +"aurae", +"aural", +"aurally", +"auramine", +"Aurantiaceae", +"aurantiaceous", +"Aurantium", +"aurantium", +"aurar", +"aurate", +"aurated", +"aureate", +"aureately", +"aureateness", +"aureation", +"aureity", +"Aurelia", +"aurelia", +"aurelian", +"Aurelius", +"Aureocasidium", +"aureola", +"aureole", +"aureolin", +"aureoline", +"aureomycin", +"aureous", +"aureously", +"auresca", +"aureus", +"auribromide", +"auric", +"aurichalcite", +"aurichalcum", +"aurichloride", +"aurichlorohydric", +"auricle", +"auricled", +"auricomous", +"Auricula", +"auricula", +"auriculae", +"auricular", +"auriculare", +"auriculares", +"Auricularia", +"auricularia", +"Auriculariaceae", +"auriculariae", +"Auriculariales", +"auricularian", +"auricularis", +"auricularly", +"auriculate", +"auriculated", +"auriculately", +"Auriculidae", +"auriculocranial", +"auriculoparietal", +"auriculotemporal", +"auriculoventricular", +"auriculovertical", +"auricyanhydric", +"auricyanic", +"auricyanide", +"auride", +"auriferous", +"aurific", +"aurification", +"auriform", +"aurify", +"Auriga", +"aurigal", +"aurigation", +"aurigerous", +"Aurigid", +"Aurignacian", +"aurilave", +"aurin", +"aurinasal", +"auriphone", +"auriphrygia", +"auriphrygiate", +"auripuncture", +"aurir", +"auriscalp", +"auriscalpia", +"auriscalpium", +"auriscope", +"auriscopy", +"aurist", +"aurite", +"aurivorous", +"auroauric", +"aurobromide", +"aurochloride", +"aurochs", +"aurocyanide", +"aurodiamine", +"auronal", +"aurophobia", +"aurophore", +"aurora", +"aurorae", +"auroral", +"aurorally", +"aurore", +"aurorean", +"Aurorian", +"aurorium", +"aurotellurite", +"aurothiosulphate", +"aurothiosulphuric", +"aurous", +"aurrescu", +"aurulent", +"aurum", +"aurure", +"auryl", +"Aus", +"auscult", +"auscultascope", +"auscultate", +"auscultation", +"auscultative", +"auscultator", +"auscultatory", +"Auscultoscope", +"auscultoscope", +"Aushar", +"auslaut", +"auslaute", +"Ausones", +"Ausonian", +"auspex", +"auspicate", +"auspice", +"auspices", +"auspicial", +"auspicious", +"auspiciously", +"auspiciousness", +"auspicy", +"Aussie", +"Austafrican", +"austenite", +"austenitic", +"Auster", +"austere", +"austerely", +"austereness", +"austerity", +"Austerlitz", +"Austin", +"Austral", +"austral", +"Australasian", +"australene", +"Australian", +"Australianism", +"Australianize", +"Australic", +"Australioid", +"australite", +"Australoid", +"Australopithecinae", +"australopithecine", +"Australopithecus", +"Australorp", +"Austrasian", +"Austrian", +"Austrianize", +"Austric", +"austrium", +"Austroasiatic", +"Austrogaea", +"Austrogaean", +"austromancy", +"Austronesian", +"Austrophil", +"Austrophile", +"Austrophilism", +"Austroriparian", +"ausu", +"ausubo", +"autacoid", +"autacoidal", +"autallotriomorphic", +"autantitypy", +"autarch", +"autarchic", +"autarchical", +"Autarchoglossa", +"autarchy", +"autarkic", +"autarkical", +"autarkist", +"autarky", +"aute", +"autechoscope", +"autecious", +"auteciously", +"auteciousness", +"autecism", +"autecologic", +"autecological", +"autecologically", +"autecologist", +"autecology", +"autecy", +"autem", +"authentic", +"authentical", +"authentically", +"authenticalness", +"authenticate", +"authentication", +"authenticator", +"authenticity", +"authenticly", +"authenticness", +"authigene", +"authigenetic", +"authigenic", +"authigenous", +"author", +"authorcraft", +"authoress", +"authorhood", +"authorial", +"authorially", +"authorish", +"authorism", +"authoritarian", +"authoritarianism", +"authoritative", +"authoritatively", +"authoritativeness", +"authority", +"authorizable", +"authorization", +"authorize", +"authorized", +"authorizer", +"authorless", +"authorling", +"authorly", +"authorship", +"authotype", +"autism", +"autist", +"autistic", +"auto", +"autoabstract", +"autoactivation", +"autoactive", +"autoaddress", +"autoagglutinating", +"autoagglutination", +"autoagglutinin", +"autoalarm", +"autoalkylation", +"autoallogamous", +"autoallogamy", +"autoanalysis", +"autoanalytic", +"autoantibody", +"autoanticomplement", +"autoantitoxin", +"autoasphyxiation", +"autoaspiration", +"autoassimilation", +"autobahn", +"autobasidia", +"Autobasidiomycetes", +"autobasidiomycetous", +"autobasidium", +"Autobasisii", +"autobiographal", +"autobiographer", +"autobiographic", +"autobiographical", +"autobiographically", +"autobiographist", +"autobiography", +"autobiology", +"autoblast", +"autoboat", +"autoboating", +"autobolide", +"autobus", +"autocab", +"autocade", +"autocall", +"autocamp", +"autocamper", +"autocamping", +"autocar", +"autocarist", +"autocarpian", +"autocarpic", +"autocarpous", +"autocatalepsy", +"autocatalysis", +"autocatalytic", +"autocatalytically", +"autocatalyze", +"autocatheterism", +"autocephalia", +"autocephality", +"autocephalous", +"autocephaly", +"autoceptive", +"autochemical", +"autocholecystectomy", +"autochrome", +"autochromy", +"autochronograph", +"autochthon", +"autochthonal", +"autochthonic", +"autochthonism", +"autochthonous", +"autochthonously", +"autochthonousness", +"autochthony", +"autocide", +"autocinesis", +"autoclasis", +"autoclastic", +"autoclave", +"autocoenobium", +"autocoherer", +"autocoid", +"autocollimation", +"autocollimator", +"autocolony", +"autocombustible", +"autocombustion", +"autocomplexes", +"autocondensation", +"autoconduction", +"autoconvection", +"autoconverter", +"autocopist", +"autocoprophagous", +"autocorrosion", +"autocracy", +"autocrat", +"autocratic", +"autocratical", +"autocratically", +"autocrator", +"autocratoric", +"autocratorical", +"autocratrix", +"autocratship", +"autocremation", +"autocriticism", +"autocystoplasty", +"autocytolysis", +"autocytolytic", +"autodecomposition", +"autodepolymerization", +"autodermic", +"autodestruction", +"autodetector", +"autodiagnosis", +"autodiagnostic", +"autodiagrammatic", +"autodidact", +"autodidactic", +"autodifferentiation", +"autodiffusion", +"autodigestion", +"autodigestive", +"autodrainage", +"autodrome", +"autodynamic", +"autodyne", +"autoecholalia", +"autoecic", +"autoecious", +"autoeciously", +"autoeciousness", +"autoecism", +"autoecous", +"autoecy", +"autoeducation", +"autoeducative", +"autoelectrolysis", +"autoelectrolytic", +"autoelectronic", +"autoelevation", +"autoepigraph", +"autoepilation", +"autoerotic", +"autoerotically", +"autoeroticism", +"autoerotism", +"autoexcitation", +"autofecundation", +"autofermentation", +"autoformation", +"autofrettage", +"autogamic", +"autogamous", +"autogamy", +"autogauge", +"autogeneal", +"autogenesis", +"autogenetic", +"autogenetically", +"autogenic", +"autogenous", +"autogenously", +"autogeny", +"Autogiro", +"autogiro", +"autognosis", +"autognostic", +"autograft", +"autografting", +"autogram", +"autograph", +"autographal", +"autographer", +"autographic", +"autographical", +"autographically", +"autographism", +"autographist", +"autographometer", +"autography", +"autogravure", +"Autoharp", +"autoharp", +"autoheader", +"autohemic", +"autohemolysin", +"autohemolysis", +"autohemolytic", +"autohemorrhage", +"autohemotherapy", +"autoheterodyne", +"autoheterosis", +"autohexaploid", +"autohybridization", +"autohypnosis", +"autohypnotic", +"autohypnotism", +"autohypnotization", +"autoicous", +"autoignition", +"autoimmunity", +"autoimmunization", +"autoinduction", +"autoinductive", +"autoinfection", +"autoinfusion", +"autoinhibited", +"autoinoculable", +"autoinoculation", +"autointellectual", +"autointoxicant", +"autointoxication", +"autoirrigation", +"autoist", +"autojigger", +"autojuggernaut", +"autokinesis", +"autokinetic", +"autokrator", +"autolaryngoscope", +"autolaryngoscopic", +"autolaryngoscopy", +"autolater", +"autolatry", +"autolavage", +"autolesion", +"autolimnetic", +"autolith", +"autoloading", +"autological", +"autologist", +"autologous", +"autology", +"autoluminescence", +"autoluminescent", +"autolysate", +"autolysin", +"autolysis", +"autolytic", +"Autolytus", +"autolyzate", +"autolyze", +"automa", +"automacy", +"automanual", +"automat", +"automata", +"automatic", +"automatical", +"automatically", +"automaticity", +"automatin", +"automatism", +"automatist", +"automatization", +"automatize", +"automatograph", +"automaton", +"automatonlike", +"automatous", +"automechanical", +"automelon", +"autometamorphosis", +"autometric", +"autometry", +"automobile", +"automobilism", +"automobilist", +"automobilistic", +"automobility", +"automolite", +"automonstration", +"automorph", +"automorphic", +"automorphically", +"automorphism", +"automotive", +"automotor", +"automower", +"automysophobia", +"autonegation", +"autonephrectomy", +"autonephrotoxin", +"autoneurotoxin", +"autonitridation", +"autonoetic", +"autonomasy", +"autonomic", +"autonomical", +"autonomically", +"autonomist", +"autonomize", +"autonomous", +"autonomously", +"autonomy", +"autonym", +"autoparasitism", +"autopathic", +"autopathography", +"autopathy", +"autopelagic", +"autopepsia", +"autophagi", +"autophagia", +"autophagous", +"autophagy", +"autophobia", +"autophoby", +"autophon", +"autophone", +"autophonoscope", +"autophonous", +"autophony", +"autophotoelectric", +"autophotograph", +"autophotometry", +"autophthalmoscope", +"autophyllogeny", +"autophyte", +"autophytic", +"autophytically", +"autophytograph", +"autophytography", +"autopilot", +"autoplagiarism", +"autoplasmotherapy", +"autoplast", +"autoplastic", +"autoplasty", +"autopneumatic", +"autopoint", +"autopoisonous", +"autopolar", +"autopolo", +"autopoloist", +"autopolyploid", +"autopore", +"autoportrait", +"autoportraiture", +"autopositive", +"autopotent", +"autoprogressive", +"autoproteolysis", +"autoprothesis", +"autopsic", +"autopsical", +"autopsy", +"autopsychic", +"autopsychoanalysis", +"autopsychology", +"autopsychorhythmia", +"autopsychosis", +"autoptic", +"autoptical", +"autoptically", +"autopticity", +"autopyotherapy", +"autoracemization", +"autoradiograph", +"autoradiographic", +"autoradiography", +"autoreduction", +"autoregenerator", +"autoregulation", +"autoreinfusion", +"autoretardation", +"autorhythmic", +"autorhythmus", +"autoriser", +"autorotation", +"autorrhaphy", +"Autosauri", +"Autosauria", +"autoschediasm", +"autoschediastic", +"autoschediastical", +"autoschediastically", +"autoschediaze", +"autoscience", +"autoscope", +"autoscopic", +"autoscopy", +"autosender", +"autosensitization", +"autosensitized", +"autosepticemia", +"autoserotherapy", +"autoserum", +"autosexing", +"autosight", +"autosign", +"autosite", +"autositic", +"autoskeleton", +"autosled", +"autoslip", +"autosomal", +"autosomatognosis", +"autosomatognostic", +"autosome", +"autosoteric", +"autosoterism", +"autospore", +"autosporic", +"autospray", +"autostability", +"autostage", +"autostandardization", +"autostarter", +"autostethoscope", +"autostylic", +"autostylism", +"autostyly", +"autosuggestibility", +"autosuggestible", +"autosuggestion", +"autosuggestionist", +"autosuggestive", +"autosuppression", +"autosymbiontic", +"autosymbolic", +"autosymbolical", +"autosymbolically", +"autosymnoia", +"Autosyn", +"autosyndesis", +"autotelegraph", +"autotelic", +"autotetraploid", +"autotetraploidy", +"autothaumaturgist", +"autotheater", +"autotheism", +"autotheist", +"autotherapeutic", +"autotherapy", +"autothermy", +"autotomic", +"autotomize", +"autotomous", +"autotomy", +"autotoxaemia", +"autotoxic", +"autotoxication", +"autotoxicity", +"autotoxicosis", +"autotoxin", +"autotoxis", +"autotractor", +"autotransformer", +"autotransfusion", +"autotransplant", +"autotransplantation", +"autotrepanation", +"autotriploid", +"autotriploidy", +"autotroph", +"autotrophic", +"autotrophy", +"autotropic", +"autotropically", +"autotropism", +"autotruck", +"autotuberculin", +"autoturning", +"autotype", +"autotyphization", +"autotypic", +"autotypography", +"autotypy", +"autourine", +"autovaccination", +"autovaccine", +"autovalet", +"autovalve", +"autovivisection", +"autoxeny", +"autoxidation", +"autoxidator", +"autoxidizability", +"autoxidizable", +"autoxidize", +"autoxidizer", +"autozooid", +"autrefois", +"autumn", +"autumnal", +"autumnally", +"autumnian", +"autumnity", +"Autunian", +"autunite", +"auxamylase", +"auxanogram", +"auxanology", +"auxanometer", +"auxesis", +"auxetic", +"auxetical", +"auxetically", +"auxiliar", +"auxiliarly", +"auxiliary", +"auxiliate", +"auxiliation", +"auxiliator", +"auxiliatory", +"auxilium", +"auximone", +"auxin", +"auxinic", +"auxinically", +"auxoaction", +"auxoamylase", +"auxoblast", +"auxobody", +"auxocardia", +"auxochrome", +"auxochromic", +"auxochromism", +"auxochromous", +"auxocyte", +"auxoflore", +"auxofluor", +"auxograph", +"auxographic", +"auxohormone", +"auxology", +"auxometer", +"auxospore", +"auxosubstance", +"auxotonic", +"auxotox", +"ava", +"avadana", +"avadavat", +"avadhuta", +"avahi", +"avail", +"availability", +"available", +"availableness", +"availably", +"availingly", +"availment", +"aval", +"avalanche", +"avalent", +"avalvular", +"Avanguardisti", +"avania", +"avanious", +"Avanti", +"avanturine", +"Avar", +"Avaradrano", +"avaremotemo", +"Avarian", +"avarice", +"avaricious", +"avariciously", +"avariciousness", +"Avarish", +"Avars", +"avascular", +"avast", +"avaunt", +"Ave", +"ave", +"avellan", +"avellane", +"avellaneous", +"avellano", +"avelonge", +"aveloz", +"Avena", +"avenaceous", +"avenage", +"avenalin", +"avener", +"avenge", +"avengeful", +"avengement", +"avenger", +"avengeress", +"avenging", +"avengingly", +"avenin", +"avenolith", +"avenous", +"avens", +"aventail", +"Aventine", +"aventurine", +"avenue", +"aver", +"avera", +"average", +"averagely", +"averager", +"averah", +"averil", +"averin", +"averment", +"Avernal", +"Avernus", +"averrable", +"averral", +"Averrhoa", +"Averroism", +"Averroist", +"Averroistic", +"averruncate", +"averruncation", +"averruncator", +"aversant", +"aversation", +"averse", +"aversely", +"averseness", +"aversion", +"aversive", +"avert", +"avertable", +"averted", +"avertedly", +"averter", +"avertible", +"Avertin", +"Aves", +"Avesta", +"Avestan", +"avian", +"avianization", +"avianize", +"aviarist", +"aviary", +"aviate", +"aviatic", +"aviation", +"aviator", +"aviatorial", +"aviatoriality", +"aviatory", +"aviatress", +"aviatrices", +"aviatrix", +"Avicennia", +"Avicenniaceae", +"Avicennism", +"avichi", +"avicide", +"avick", +"avicolous", +"Avicula", +"avicular", +"Avicularia", +"avicularia", +"avicularian", +"Aviculariidae", +"Avicularimorphae", +"avicularium", +"Aviculidae", +"aviculture", +"aviculturist", +"avid", +"avidious", +"avidiously", +"avidity", +"avidly", +"avidous", +"avidya", +"avifauna", +"avifaunal", +"avigate", +"avigation", +"avigator", +"Avignonese", +"avijja", +"Avikom", +"avine", +"aviolite", +"avirulence", +"avirulent", +"Avis", +"aviso", +"avital", +"avitaminosis", +"avitaminotic", +"avitic", +"avives", +"avizandum", +"avo", +"avocado", +"avocate", +"avocation", +"avocative", +"avocatory", +"avocet", +"avodire", +"avogadrite", +"avoid", +"avoidable", +"avoidably", +"avoidance", +"avoider", +"avoidless", +"avoidment", +"avoirdupois", +"avolate", +"avolation", +"avolitional", +"avondbloem", +"avouch", +"avouchable", +"avoucher", +"avouchment", +"avourneen", +"avow", +"avowable", +"avowableness", +"avowably", +"avowal", +"avowance", +"avowant", +"avowed", +"avowedly", +"avowedness", +"avower", +"avowry", +"avoyer", +"avoyership", +"Avshar", +"avulse", +"avulsion", +"avuncular", +"avunculate", +"aw", +"awa", +"Awabakal", +"awabi", +"Awadhi", +"awaft", +"awag", +"await", +"awaiter", +"Awaitlala", +"awakable", +"awake", +"awaken", +"awakenable", +"awakener", +"awakening", +"awakeningly", +"awakenment", +"awald", +"awalim", +"awalt", +"Awan", +"awane", +"awanting", +"awapuhi", +"award", +"awardable", +"awarder", +"awardment", +"aware", +"awaredom", +"awareness", +"awaruite", +"awash", +"awaste", +"awat", +"awatch", +"awater", +"awave", +"away", +"awayness", +"awber", +"awd", +"awe", +"awearied", +"aweary", +"aweather", +"aweband", +"awedness", +"awee", +"aweek", +"aweel", +"aweigh", +"Awellimiden", +"awesome", +"awesomely", +"awesomeness", +"awest", +"aweto", +"awfu", +"awful", +"awfully", +"awfulness", +"awheel", +"awheft", +"awhet", +"awhile", +"awhir", +"awhirl", +"awide", +"awiggle", +"awikiwiki", +"awin", +"awing", +"awink", +"awiwi", +"awkward", +"awkwardish", +"awkwardly", +"awkwardness", +"awl", +"awless", +"awlessness", +"awlwort", +"awmous", +"awn", +"awned", +"awner", +"awning", +"awninged", +"awnless", +"awnlike", +"awny", +"awoke", +"Awol", +"awork", +"awreck", +"awrist", +"awrong", +"awry", +"Awshar", +"ax", +"axal", +"axbreaker", +"axe", +"axed", +"axenic", +"axes", +"axfetch", +"axhammer", +"axhammered", +"axhead", +"axial", +"axiality", +"axially", +"axiate", +"axiation", +"Axifera", +"axiform", +"axifugal", +"axil", +"axile", +"axilemma", +"axilemmata", +"axilla", +"axillae", +"axillant", +"axillar", +"axillary", +"axine", +"axinite", +"axinomancy", +"axiolite", +"axiolitic", +"axiological", +"axiologically", +"axiologist", +"axiology", +"axiom", +"axiomatic", +"axiomatical", +"axiomatically", +"axiomatization", +"axiomatize", +"axion", +"axiopisty", +"Axis", +"axis", +"axised", +"axisymmetric", +"axisymmetrical", +"axite", +"axle", +"axled", +"axlesmith", +"axletree", +"axmaker", +"axmaking", +"axman", +"axmanship", +"axmaster", +"Axminster", +"axodendrite", +"axofugal", +"axogamy", +"axoid", +"axoidean", +"axolemma", +"axolotl", +"axolysis", +"axometer", +"axometric", +"axometry", +"axon", +"axonal", +"axoneure", +"axoneuron", +"Axonia", +"Axonolipa", +"axonolipous", +"axonometric", +"axonometry", +"Axonophora", +"axonophorous", +"Axonopus", +"axonost", +"axopetal", +"axophyte", +"axoplasm", +"axopodia", +"axopodium", +"axospermous", +"axostyle", +"axseed", +"axstone", +"axtree", +"Axumite", +"axunge", +"axweed", +"axwise", +"axwort", +"Ay", +"ay", +"ayacahuite", +"ayah", +"Ayahuca", +"Aydendron", +"aye", +"ayegreen", +"ayelp", +"ayenbite", +"ayin", +"Aylesbury", +"ayless", +"aylet", +"ayllu", +"Aymara", +"Aymaran", +"Aymoro", +"ayond", +"ayont", +"ayous", +"Ayrshire", +"Aythya", +"ayu", +"Ayubite", +"Ayyubid", +"azadrachta", +"azafrin", +"Azalea", +"azalea", +"Azande", +"azarole", +"azedarach", +"azelaic", +"azelate", +"Azelfafage", +"azeotrope", +"azeotropic", +"azeotropism", +"azeotropy", +"Azerbaijanese", +"Azerbaijani", +"Azerbaijanian", +"Azha", +"azide", +"aziethane", +"Azilian", +"azilut", +"Azimech", +"azimene", +"azimethylene", +"azimide", +"azimine", +"azimino", +"aziminobenzene", +"azimuth", +"azimuthal", +"azimuthally", +"azine", +"aziola", +"azlactone", +"azo", +"azobacter", +"azobenzene", +"azobenzil", +"azobenzoic", +"azobenzol", +"azoblack", +"azoch", +"azocochineal", +"azocoralline", +"azocorinth", +"azocyanide", +"azocyclic", +"azodicarboxylic", +"azodiphenyl", +"azodisulphonic", +"azoeosin", +"azoerythrin", +"azofication", +"azofier", +"azoflavine", +"azoformamide", +"azoformic", +"azofy", +"azogallein", +"azogreen", +"azogrenadine", +"azohumic", +"azoic", +"azoimide", +"azoisobutyronitrile", +"azole", +"azolitmin", +"Azolla", +"azomethine", +"azon", +"azonal", +"azonaphthalene", +"azonic", +"azonium", +"azoospermia", +"azoparaffin", +"azophen", +"azophenetole", +"azophenine", +"azophenol", +"azophenyl", +"azophenylene", +"azophosphin", +"azophosphore", +"azoprotein", +"Azorian", +"azorite", +"azorubine", +"azosulphine", +"azosulphonic", +"azotate", +"azote", +"azoted", +"azotemia", +"azotenesis", +"azotetrazole", +"azoth", +"azothionium", +"azotic", +"azotine", +"azotite", +"azotize", +"Azotobacter", +"Azotobacterieae", +"azotoluene", +"azotometer", +"azotorrhoea", +"azotous", +"azoturia", +"azovernine", +"azox", +"azoxazole", +"azoxime", +"azoxine", +"azoxonium", +"azoxy", +"azoxyanisole", +"azoxybenzene", +"azoxybenzoic", +"azoxynaphthalene", +"azoxyphenetole", +"azoxytoluidine", +"Aztec", +"Azteca", +"azteca", +"Aztecan", +"azthionium", +"azulene", +"azulite", +"azulmic", +"azumbre", +"azure", +"azurean", +"azured", +"azureous", +"azurine", +"azurite", +"azurmalachite", +"azurous", +"azury", +"Azygobranchia", +"Azygobranchiata", +"azygobranchiate", +"azygomatous", +"azygos", +"azygosperm", +"azygospore", +"azygous", +"azyme", +"azymite", +"azymous", +"B", +"b", +"ba", +"baa", +"baahling", +"Baal", +"baal", +"Baalath", +"Baalish", +"Baalism", +"Baalist", +"Baalite", +"Baalitical", +"Baalize", +"Baalshem", +"baar", +"Bab", +"baba", +"babacoote", +"babai", +"babasco", +"babassu", +"babaylan", +"Babbie", +"Babbitt", +"babbitt", +"babbitter", +"Babbittess", +"Babbittian", +"Babbittism", +"Babbittry", +"babblative", +"babble", +"babblement", +"babbler", +"babblesome", +"babbling", +"babblingly", +"babblish", +"babblishly", +"babbly", +"babby", +"Babcock", +"babe", +"babehood", +"Babel", +"Babeldom", +"babelet", +"Babelic", +"babelike", +"Babelish", +"Babelism", +"Babelize", +"babery", +"babeship", +"Babesia", +"babesiasis", +"Babhan", +"Babi", +"Babiana", +"babiche", +"babied", +"Babiism", +"babillard", +"Babine", +"babingtonite", +"babirusa", +"babish", +"babished", +"babishly", +"babishness", +"Babism", +"Babist", +"Babite", +"bablah", +"babloh", +"baboen", +"Babongo", +"baboo", +"baboodom", +"babooism", +"baboon", +"baboonery", +"baboonish", +"baboonroot", +"baboot", +"babouche", +"Babouvism", +"Babouvist", +"babroot", +"Babs", +"babu", +"Babua", +"babudom", +"babuina", +"babuism", +"babul", +"Babuma", +"Babungera", +"babushka", +"baby", +"babydom", +"babyfied", +"babyhood", +"babyhouse", +"babyish", +"babyishly", +"babyishness", +"babyism", +"babylike", +"Babylon", +"Babylonian", +"Babylonic", +"Babylonish", +"Babylonism", +"Babylonite", +"Babylonize", +"babyolatry", +"babyship", +"bac", +"bacaba", +"bacach", +"bacalao", +"bacao", +"bacbakiri", +"bacca", +"baccaceous", +"baccae", +"baccalaurean", +"baccalaureate", +"baccara", +"baccarat", +"baccate", +"baccated", +"Bacchae", +"bacchanal", +"Bacchanalia", +"bacchanalian", +"bacchanalianism", +"bacchanalianly", +"bacchanalism", +"bacchanalization", +"bacchanalize", +"bacchant", +"bacchante", +"bacchantes", +"bacchantic", +"bacchar", +"baccharis", +"baccharoid", +"baccheion", +"bacchiac", +"bacchian", +"Bacchic", +"bacchic", +"Bacchical", +"Bacchides", +"bacchii", +"bacchius", +"Bacchus", +"Bacchuslike", +"bacciferous", +"bacciform", +"baccivorous", +"bach", +"Bacharach", +"bache", +"bachel", +"bachelor", +"bachelordom", +"bachelorhood", +"bachelorism", +"bachelorize", +"bachelorlike", +"bachelorly", +"bachelorship", +"bachelorwise", +"bachelry", +"Bachichi", +"Bacillaceae", +"bacillar", +"Bacillariaceae", +"bacillariaceous", +"Bacillariales", +"Bacillarieae", +"Bacillariophyta", +"bacillary", +"bacillemia", +"bacilli", +"bacillian", +"bacillicidal", +"bacillicide", +"bacillicidic", +"bacilliculture", +"bacilliform", +"bacilligenic", +"bacilliparous", +"bacillite", +"bacillogenic", +"bacillogenous", +"bacillophobia", +"bacillosis", +"bacilluria", +"bacillus", +"Bacis", +"bacitracin", +"back", +"backache", +"backaching", +"backachy", +"backage", +"backband", +"backbearing", +"backbencher", +"backbite", +"backbiter", +"backbitingly", +"backblow", +"backboard", +"backbone", +"backboned", +"backboneless", +"backbonelessness", +"backbrand", +"backbreaker", +"backbreaking", +"backcap", +"backcast", +"backchain", +"backchat", +"backcourt", +"backcross", +"backdoor", +"backdown", +"backdrop", +"backed", +"backen", +"backer", +"backet", +"backfall", +"backfatter", +"backfield", +"backfill", +"backfiller", +"backfilling", +"backfire", +"backfiring", +"backflap", +"backflash", +"backflow", +"backfold", +"backframe", +"backfriend", +"backfurrow", +"backgame", +"backgammon", +"background", +"backhand", +"backhanded", +"backhandedly", +"backhandedness", +"backhander", +"backhatch", +"backheel", +"backhooker", +"backhouse", +"backie", +"backiebird", +"backing", +"backjaw", +"backjoint", +"backlands", +"backlash", +"backlashing", +"backless", +"backlet", +"backlings", +"backlog", +"backlotter", +"backmost", +"backpedal", +"backpiece", +"backplate", +"backrope", +"backrun", +"backsaw", +"backscraper", +"backset", +"backsetting", +"backsettler", +"backshift", +"backside", +"backsight", +"backslap", +"backslapper", +"backslapping", +"backslide", +"backslider", +"backslidingness", +"backspace", +"backspacer", +"backspang", +"backspier", +"backspierer", +"backspin", +"backspread", +"backspringing", +"backstaff", +"backstage", +"backstamp", +"backstay", +"backster", +"backstick", +"backstitch", +"backstone", +"backstop", +"backstrap", +"backstretch", +"backstring", +"backstrip", +"backstroke", +"backstromite", +"backswept", +"backswing", +"backsword", +"backswording", +"backswordman", +"backswordsman", +"backtack", +"backtender", +"backtenter", +"backtrack", +"backtracker", +"backtrick", +"backup", +"backveld", +"backvelder", +"backwall", +"backward", +"backwardation", +"backwardly", +"backwardness", +"backwards", +"backwash", +"backwasher", +"backwashing", +"backwater", +"backwatered", +"backway", +"backwood", +"backwoods", +"backwoodsiness", +"backwoodsman", +"backwoodsy", +"backword", +"backworm", +"backwort", +"backyarder", +"baclin", +"bacon", +"baconer", +"Baconian", +"Baconianism", +"Baconic", +"Baconism", +"Baconist", +"baconize", +"baconweed", +"bacony", +"Bacopa", +"bacteremia", +"bacteria", +"Bacteriaceae", +"bacteriaceous", +"bacterial", +"bacterially", +"bacterian", +"bacteric", +"bactericholia", +"bactericidal", +"bactericide", +"bactericidin", +"bacterid", +"bacteriemia", +"bacteriform", +"bacterin", +"bacterioagglutinin", +"bacterioblast", +"bacteriocyte", +"bacteriodiagnosis", +"bacteriofluorescin", +"bacteriogenic", +"bacteriogenous", +"bacteriohemolysin", +"bacterioid", +"bacterioidal", +"bacteriologic", +"bacteriological", +"bacteriologically", +"bacteriologist", +"bacteriology", +"bacteriolysin", +"bacteriolysis", +"bacteriolytic", +"bacteriolyze", +"bacteriopathology", +"bacteriophage", +"bacteriophagia", +"bacteriophagic", +"bacteriophagous", +"bacteriophagy", +"bacteriophobia", +"bacterioprecipitin", +"bacterioprotein", +"bacteriopsonic", +"bacteriopsonin", +"bacteriopurpurin", +"bacterioscopic", +"bacterioscopical", +"bacterioscopically", +"bacterioscopist", +"bacterioscopy", +"bacteriosis", +"bacteriosolvent", +"bacteriostasis", +"bacteriostat", +"bacteriostatic", +"bacteriotherapeutic", +"bacteriotherapy", +"bacteriotoxic", +"bacteriotoxin", +"bacteriotropic", +"bacteriotropin", +"bacteriotrypsin", +"bacterious", +"bacteritic", +"bacterium", +"bacteriuria", +"bacterization", +"bacterize", +"bacteroid", +"bacteroidal", +"Bacteroideae", +"Bacteroides", +"Bactrian", +"Bactris", +"Bactrites", +"bactriticone", +"bactritoid", +"bacula", +"bacule", +"baculi", +"baculiferous", +"baculiform", +"baculine", +"baculite", +"Baculites", +"baculitic", +"baculiticone", +"baculoid", +"baculum", +"baculus", +"bacury", +"bad", +"Badaga", +"badan", +"Badarian", +"badarrah", +"Badawi", +"baddeleyite", +"badderlocks", +"baddish", +"baddishly", +"baddishness", +"baddock", +"bade", +"badenite", +"badge", +"badgeless", +"badgeman", +"badger", +"badgerbrush", +"badgerer", +"badgeringly", +"badgerlike", +"badgerly", +"badgerweed", +"badiaga", +"badian", +"badigeon", +"badinage", +"badious", +"badland", +"badlands", +"badly", +"badminton", +"badness", +"Badon", +"Baduhenna", +"bae", +"Baedeker", +"Baedekerian", +"Baeria", +"baetuli", +"baetulus", +"baetyl", +"baetylic", +"baetylus", +"baetzner", +"bafaro", +"baff", +"baffeta", +"baffle", +"bafflement", +"baffler", +"baffling", +"bafflingly", +"bafflingness", +"baffy", +"baft", +"bafta", +"Bafyot", +"bag", +"baga", +"Baganda", +"bagani", +"bagasse", +"bagataway", +"bagatelle", +"bagatine", +"bagattini", +"bagattino", +"Bagaudae", +"Bagdad", +"Bagdi", +"bagel", +"bagful", +"baggage", +"baggageman", +"baggagemaster", +"baggager", +"baggala", +"bagganet", +"Baggara", +"bagged", +"bagger", +"baggie", +"baggily", +"bagginess", +"bagging", +"baggit", +"baggy", +"Bagheli", +"baghouse", +"Baginda", +"Bagirmi", +"bagleaves", +"baglike", +"bagmaker", +"bagmaking", +"bagman", +"bagnio", +"bagnut", +"bago", +"Bagobo", +"bagonet", +"bagpipe", +"bagpiper", +"bagpipes", +"bagplant", +"bagrationite", +"bagre", +"bagreef", +"bagroom", +"baguette", +"bagwig", +"bagwigged", +"bagworm", +"bagwyn", +"bah", +"Bahai", +"Bahaism", +"Bahaist", +"Baham", +"Bahama", +"Bahamian", +"bahan", +"bahar", +"Bahaullah", +"bahawder", +"bahay", +"bahera", +"bahiaite", +"Bahima", +"bahisti", +"Bahmani", +"Bahmanid", +"bahnung", +"baho", +"bahoe", +"bahoo", +"baht", +"Bahuma", +"bahur", +"bahut", +"Bahutu", +"bahuvrihi", +"Baianism", +"baidarka", +"Baidya", +"Baiera", +"baiginet", +"baignet", +"baikalite", +"baikerinite", +"baikerite", +"baikie", +"bail", +"bailable", +"bailage", +"bailee", +"bailer", +"bailey", +"bailie", +"bailiery", +"bailieship", +"bailiff", +"bailiffry", +"bailiffship", +"bailiwick", +"bailliage", +"baillone", +"Baillonella", +"bailment", +"bailor", +"bailpiece", +"bailsman", +"bailwood", +"bain", +"bainie", +"Baining", +"baioc", +"baiocchi", +"baiocco", +"bairagi", +"Bairam", +"bairn", +"bairnie", +"bairnish", +"bairnishness", +"bairnliness", +"bairnly", +"bairnteam", +"bairntime", +"bairnwort", +"Bais", +"Baisakh", +"baister", +"bait", +"baiter", +"baith", +"baittle", +"baitylos", +"baize", +"bajada", +"bajan", +"Bajardo", +"bajarigar", +"Bajau", +"Bajocian", +"bajra", +"bajree", +"bajri", +"bajury", +"baka", +"Bakairi", +"bakal", +"Bakalai", +"Bakalei", +"Bakatan", +"bake", +"bakeboard", +"baked", +"bakehouse", +"Bakelite", +"bakelite", +"bakelize", +"baken", +"bakeoven", +"bakepan", +"baker", +"bakerdom", +"bakeress", +"bakerite", +"bakerless", +"bakerly", +"bakership", +"bakery", +"bakeshop", +"bakestone", +"Bakhtiari", +"bakie", +"baking", +"bakingly", +"bakli", +"Bakongo", +"Bakshaish", +"baksheesh", +"baktun", +"Baku", +"baku", +"Bakuba", +"bakula", +"Bakunda", +"Bakuninism", +"Bakuninist", +"bakupari", +"Bakutu", +"Bakwiri", +"Bal", +"bal", +"Bala", +"Balaam", +"Balaamite", +"Balaamitical", +"balachong", +"balaclava", +"baladine", +"Balaena", +"Balaenicipites", +"balaenid", +"Balaenidae", +"balaenoid", +"Balaenoidea", +"balaenoidean", +"Balaenoptera", +"Balaenopteridae", +"balafo", +"balagan", +"balaghat", +"balai", +"Balaic", +"Balak", +"Balaklava", +"balalaika", +"Balan", +"balance", +"balanceable", +"balanced", +"balancedness", +"balancelle", +"balanceman", +"balancement", +"balancer", +"balancewise", +"balancing", +"balander", +"balandra", +"balandrana", +"balaneutics", +"balangay", +"balanic", +"balanid", +"Balanidae", +"balaniferous", +"balanism", +"balanite", +"Balanites", +"balanitis", +"balanoblennorrhea", +"balanocele", +"Balanoglossida", +"Balanoglossus", +"balanoid", +"Balanophora", +"Balanophoraceae", +"balanophoraceous", +"balanophore", +"balanophorin", +"balanoplasty", +"balanoposthitis", +"balanopreputial", +"Balanops", +"Balanopsidaceae", +"Balanopsidales", +"balanorrhagia", +"Balanta", +"Balante", +"balantidial", +"balantidiasis", +"balantidic", +"balantidiosis", +"Balantidium", +"Balanus", +"Balao", +"balao", +"Balarama", +"balas", +"balata", +"balatong", +"balatron", +"balatronic", +"balausta", +"balaustine", +"balaustre", +"Balawa", +"Balawu", +"balboa", +"balbriggan", +"balbutiate", +"balbutient", +"balbuties", +"balconet", +"balconied", +"balcony", +"bald", +"baldachin", +"baldachined", +"baldachini", +"baldachino", +"baldberry", +"baldcrown", +"balden", +"balder", +"balderdash", +"baldhead", +"baldicoot", +"Baldie", +"baldish", +"baldling", +"baldly", +"baldmoney", +"baldness", +"baldpate", +"baldrib", +"baldric", +"baldricked", +"baldricwise", +"balductum", +"Baldwin", +"baldy", +"bale", +"Balearian", +"Balearic", +"Balearica", +"baleen", +"balefire", +"baleful", +"balefully", +"balefulness", +"balei", +"baleise", +"baleless", +"baler", +"balete", +"Bali", +"bali", +"balibago", +"Balija", +"Balilla", +"baline", +"Balinese", +"balinger", +"balinghasay", +"balisaur", +"balistarius", +"Balistes", +"balistid", +"Balistidae", +"balistraria", +"balita", +"balk", +"Balkan", +"Balkanic", +"Balkanization", +"Balkanize", +"Balkar", +"balker", +"balkingly", +"Balkis", +"balky", +"ball", +"ballad", +"ballade", +"balladeer", +"ballader", +"balladeroyal", +"balladic", +"balladical", +"balladier", +"balladism", +"balladist", +"balladize", +"balladlike", +"balladling", +"balladmonger", +"balladmongering", +"balladry", +"balladwise", +"ballahoo", +"ballam", +"ballan", +"ballant", +"ballast", +"ballastage", +"ballaster", +"ballasting", +"ballata", +"ballate", +"ballatoon", +"balldom", +"balled", +"baller", +"ballerina", +"ballet", +"balletic", +"balletomane", +"Ballhausplatz", +"balli", +"ballist", +"ballista", +"ballistae", +"ballistic", +"ballistically", +"ballistician", +"ballistics", +"Ballistite", +"ballistocardiograph", +"ballium", +"ballmine", +"ballogan", +"ballonet", +"balloon", +"balloonation", +"ballooner", +"balloonery", +"balloonet", +"balloonfish", +"balloonflower", +"balloonful", +"ballooning", +"balloonish", +"balloonist", +"balloonlike", +"ballot", +"Ballota", +"ballotade", +"ballotage", +"balloter", +"balloting", +"ballotist", +"ballottement", +"ballow", +"Ballplatz", +"ballplayer", +"ballproof", +"ballroom", +"ballstock", +"ballup", +"ballweed", +"bally", +"ballyhack", +"ballyhoo", +"ballyhooer", +"ballywack", +"ballywrack", +"balm", +"balmacaan", +"Balmarcodes", +"Balmawhapple", +"balmily", +"balminess", +"balmlike", +"balmony", +"Balmoral", +"balmy", +"balneal", +"balneary", +"balneation", +"balneatory", +"balneographer", +"balneography", +"balneologic", +"balneological", +"balneologist", +"balneology", +"balneophysiology", +"balneotechnics", +"balneotherapeutics", +"balneotherapia", +"balneotherapy", +"Balnibarbi", +"Baloch", +"Baloghia", +"Balolo", +"balonea", +"baloney", +"baloo", +"Balopticon", +"Balor", +"Baloskion", +"Baloskionaceae", +"balow", +"balsa", +"balsam", +"balsamation", +"Balsamea", +"Balsameaceae", +"balsameaceous", +"balsamer", +"balsamic", +"balsamical", +"balsamically", +"balsamiferous", +"balsamina", +"Balsaminaceae", +"balsaminaceous", +"balsamine", +"balsamitic", +"balsamiticness", +"balsamize", +"balsamo", +"Balsamodendron", +"Balsamorrhiza", +"balsamous", +"balsamroot", +"balsamum", +"balsamweed", +"balsamy", +"Balt", +"baltei", +"balter", +"balteus", +"Balthasar", +"Balti", +"Baltic", +"Baltimore", +"Baltimorean", +"baltimorite", +"Baltis", +"balu", +"Baluba", +"Baluch", +"Baluchi", +"Baluchistan", +"baluchithere", +"baluchitheria", +"Baluchitherium", +"baluchitherium", +"Baluga", +"Balunda", +"balushai", +"baluster", +"balustered", +"balustrade", +"balustraded", +"balustrading", +"balut", +"balwarra", +"balza", +"Balzacian", +"balzarine", +"bam", +"Bamalip", +"Bamangwato", +"bamban", +"Bambara", +"bambini", +"bambino", +"bambocciade", +"bamboo", +"bamboozle", +"bamboozlement", +"bamboozler", +"Bambos", +"bamboula", +"Bambuba", +"Bambusa", +"Bambuseae", +"Bambute", +"bamoth", +"Ban", +"ban", +"Bana", +"banaba", +"banago", +"banak", +"banakite", +"banal", +"banality", +"banally", +"banana", +"Bananaland", +"Bananalander", +"Banande", +"bananist", +"bananivorous", +"banat", +"Banate", +"banatite", +"banausic", +"Banba", +"Banbury", +"banc", +"banca", +"bancal", +"banchi", +"banco", +"bancus", +"band", +"Banda", +"banda", +"bandage", +"bandager", +"bandagist", +"bandaite", +"bandaka", +"bandala", +"bandalore", +"bandanna", +"bandannaed", +"bandar", +"bandarlog", +"bandbox", +"bandboxical", +"bandboxy", +"bandcase", +"bandcutter", +"bande", +"bandeau", +"banded", +"bandelet", +"bander", +"Banderma", +"banderole", +"bandersnatch", +"bandfish", +"bandhava", +"bandhook", +"Bandhor", +"bandhu", +"bandi", +"bandicoot", +"bandicoy", +"bandie", +"bandikai", +"bandiness", +"banding", +"bandit", +"banditism", +"banditry", +"banditti", +"bandle", +"bandless", +"bandlessly", +"bandlessness", +"bandlet", +"bandman", +"bandmaster", +"bando", +"bandog", +"bandoleer", +"bandoleered", +"bandoline", +"bandonion", +"Bandor", +"bandore", +"bandrol", +"bandsman", +"bandstand", +"bandster", +"bandstring", +"Bandusia", +"Bandusian", +"bandwork", +"bandy", +"bandyball", +"bandyman", +"bane", +"baneberry", +"baneful", +"banefully", +"banefulness", +"banewort", +"Banff", +"bang", +"banga", +"Bangala", +"bangalay", +"bangalow", +"Bangash", +"bangboard", +"bange", +"banger", +"banghy", +"Bangia", +"Bangiaceae", +"bangiaceous", +"Bangiales", +"banging", +"bangkok", +"bangle", +"bangled", +"bangling", +"bangster", +"bangtail", +"Bangwaketsi", +"bani", +"banian", +"banig", +"banilad", +"banish", +"banisher", +"banishment", +"banister", +"Baniva", +"baniwa", +"baniya", +"banjo", +"banjoist", +"banjore", +"banjorine", +"banjuke", +"bank", +"bankable", +"Bankalachi", +"bankbook", +"banked", +"banker", +"bankera", +"bankerdom", +"bankeress", +"banket", +"bankfull", +"banking", +"bankman", +"bankrider", +"bankrupt", +"bankruptcy", +"bankruptism", +"bankruptlike", +"bankruptly", +"bankruptship", +"bankrupture", +"bankshall", +"Banksia", +"Banksian", +"bankside", +"banksman", +"bankweed", +"banky", +"banner", +"bannered", +"bannerer", +"banneret", +"bannerfish", +"bannerless", +"bannerlike", +"bannerman", +"bannerol", +"bannerwise", +"bannet", +"banning", +"bannister", +"Bannock", +"bannock", +"Bannockburn", +"banns", +"bannut", +"banovina", +"banquet", +"banqueteer", +"banqueteering", +"banqueter", +"banquette", +"bansalague", +"banshee", +"banstickle", +"bant", +"Bantam", +"bantam", +"bantamize", +"bantamweight", +"bantay", +"bantayan", +"banteng", +"banter", +"banterer", +"banteringly", +"bantery", +"Bantingism", +"bantingize", +"bantling", +"Bantoid", +"Bantu", +"banty", +"banuyo", +"banxring", +"banya", +"Banyai", +"banyan", +"Banyoro", +"Banyuls", +"banzai", +"baobab", +"bap", +"Baphia", +"Baphomet", +"Baphometic", +"Baptanodon", +"Baptisia", +"baptisin", +"baptism", +"baptismal", +"baptismally", +"Baptist", +"baptistery", +"baptistic", +"baptizable", +"baptize", +"baptizee", +"baptizement", +"baptizer", +"Baptornis", +"bar", +"bara", +"barabara", +"barabora", +"Barabra", +"Baraca", +"barad", +"baragnosis", +"baragouin", +"baragouinish", +"Baraithas", +"barajillo", +"Baralipton", +"Baramika", +"barandos", +"barangay", +"barasingha", +"barathea", +"barathra", +"barathrum", +"barauna", +"barb", +"Barbacoa", +"Barbacoan", +"barbacou", +"Barbadian", +"Barbados", +"barbal", +"barbaloin", +"Barbara", +"barbaralalia", +"Barbarea", +"barbaresque", +"Barbarian", +"barbarian", +"barbarianism", +"barbarianize", +"barbaric", +"barbarical", +"barbarically", +"barbarious", +"barbariousness", +"barbarism", +"barbarity", +"barbarization", +"barbarize", +"barbarous", +"barbarously", +"barbarousness", +"Barbary", +"barbary", +"barbas", +"barbasco", +"barbastel", +"barbate", +"barbated", +"barbatimao", +"barbe", +"barbecue", +"barbed", +"barbeiro", +"barbel", +"barbellate", +"barbellula", +"barbellulate", +"barber", +"barberess", +"barberfish", +"barberish", +"barberry", +"barbershop", +"barbet", +"barbette", +"Barbeyaceae", +"barbican", +"barbicel", +"barbigerous", +"barbion", +"barbital", +"barbitalism", +"barbiton", +"barbitone", +"barbitos", +"barbiturate", +"barbituric", +"barbless", +"barblet", +"barbone", +"barbotine", +"barbudo", +"Barbula", +"barbulate", +"barbule", +"barbulyie", +"barbwire", +"Barcan", +"barcarole", +"barcella", +"barcelona", +"Barcoo", +"bard", +"bardane", +"bardash", +"bardcraft", +"bardel", +"Bardesanism", +"Bardesanist", +"Bardesanite", +"bardess", +"bardic", +"bardie", +"bardiglio", +"bardily", +"bardiness", +"barding", +"bardish", +"bardism", +"bardlet", +"bardlike", +"bardling", +"bardo", +"Bardolater", +"Bardolatry", +"Bardolph", +"Bardolphian", +"bardship", +"Bardulph", +"bardy", +"Bare", +"bare", +"bareback", +"barebacked", +"bareboat", +"barebone", +"bareboned", +"bareca", +"barefaced", +"barefacedly", +"barefacedness", +"barefit", +"barefoot", +"barefooted", +"barehanded", +"barehead", +"bareheaded", +"bareheadedness", +"barelegged", +"barely", +"barenecked", +"bareness", +"barer", +"baresark", +"baresma", +"baretta", +"barff", +"barfish", +"barfly", +"barful", +"bargain", +"bargainee", +"bargainer", +"bargainor", +"bargainwise", +"bargander", +"barge", +"bargeboard", +"bargee", +"bargeer", +"bargeese", +"bargehouse", +"bargelike", +"bargeload", +"bargeman", +"bargemaster", +"barger", +"bargh", +"bargham", +"barghest", +"bargoose", +"Bari", +"bari", +"baria", +"baric", +"barid", +"barie", +"barile", +"barilla", +"baring", +"baris", +"barish", +"barit", +"barite", +"baritone", +"barium", +"bark", +"barkbound", +"barkcutter", +"barkeeper", +"barken", +"barkentine", +"barker", +"barkery", +"barkevikite", +"barkevikitic", +"barkey", +"barkhan", +"barking", +"barkingly", +"Barkinji", +"barkle", +"barkless", +"barklyite", +"barkometer", +"barkpeel", +"barkpeeler", +"barkpeeling", +"barksome", +"barky", +"barlafumble", +"barlafummil", +"barless", +"barley", +"barleybird", +"barleybreak", +"barleycorn", +"barleyhood", +"barleymow", +"barleysick", +"barling", +"barlock", +"barlow", +"barm", +"barmaid", +"barman", +"barmaster", +"barmbrack", +"barmcloth", +"Barmecidal", +"Barmecide", +"barmkin", +"barmote", +"barmskin", +"barmy", +"barmybrained", +"barn", +"Barnabas", +"Barnabite", +"Barnaby", +"barnacle", +"Barnard", +"barnard", +"barnbrack", +"Barnburner", +"Barney", +"barney", +"barnful", +"barnhardtite", +"barnman", +"barnstorm", +"barnstormer", +"barnstorming", +"Barnumism", +"Barnumize", +"barny", +"barnyard", +"Baroco", +"barocyclonometer", +"barodynamic", +"barodynamics", +"barognosis", +"barogram", +"barograph", +"barographic", +"baroi", +"barolo", +"barology", +"Barolong", +"barometer", +"barometric", +"barometrical", +"barometrically", +"barometrograph", +"barometrography", +"barometry", +"barometz", +"baromotor", +"baron", +"baronage", +"baroness", +"baronet", +"baronetage", +"baronetcy", +"baronethood", +"baronetical", +"baronetship", +"barong", +"Baronga", +"baronial", +"baronize", +"baronry", +"baronship", +"barony", +"Baroque", +"baroque", +"baroscope", +"baroscopic", +"baroscopical", +"Barosma", +"barosmin", +"barotactic", +"barotaxis", +"barotaxy", +"barothermograph", +"barothermohygrograph", +"baroto", +"Barotse", +"barouche", +"barouchet", +"Barouni", +"baroxyton", +"barpost", +"barquantine", +"barra", +"barrabkie", +"barrable", +"barrabora", +"barracan", +"barrack", +"barracker", +"barraclade", +"barracoon", +"barracouta", +"barracuda", +"barrad", +"barragan", +"barrage", +"barragon", +"barramunda", +"barramundi", +"barranca", +"barrandite", +"barras", +"barrator", +"barratrous", +"barratrously", +"barratry", +"barred", +"barrel", +"barrelage", +"barreled", +"barreler", +"barrelet", +"barrelful", +"barrelhead", +"barrelmaker", +"barrelmaking", +"barrelwise", +"barren", +"barrenly", +"barrenness", +"barrenwort", +"barrer", +"barret", +"barrette", +"barretter", +"barricade", +"barricader", +"barricado", +"barrico", +"barrier", +"barriguda", +"barrigudo", +"barrikin", +"barriness", +"barring", +"Barrington", +"Barringtonia", +"barrio", +"barrister", +"barristerial", +"barristership", +"barristress", +"barroom", +"barrow", +"barrowful", +"Barrowist", +"barrowman", +"barrulee", +"barrulet", +"barrulety", +"barruly", +"barry", +"Barsac", +"barse", +"barsom", +"Bart", +"bartender", +"bartending", +"barter", +"barterer", +"barth", +"barthite", +"bartholinitis", +"Bartholomean", +"Bartholomew", +"Bartholomewtide", +"Bartholomite", +"bartizan", +"bartizaned", +"Bartlemy", +"Bartlett", +"barton", +"Bartonella", +"Bartonia", +"Bartram", +"Bartramia", +"Bartramiaceae", +"Bartramian", +"Bartsia", +"baru", +"Baruch", +"Barundi", +"baruria", +"barvel", +"barwal", +"barway", +"barways", +"barwise", +"barwood", +"barycenter", +"barycentric", +"barye", +"baryecoia", +"baryglossia", +"barylalia", +"barylite", +"baryphonia", +"baryphonic", +"baryphony", +"barysilite", +"barysphere", +"baryta", +"barytes", +"barythymia", +"barytic", +"barytine", +"barytocalcite", +"barytocelestine", +"barytocelestite", +"baryton", +"barytone", +"barytophyllite", +"barytostrontianite", +"barytosulphate", +"bas", +"basal", +"basale", +"basalia", +"basally", +"basalt", +"basaltes", +"basaltic", +"basaltiform", +"basaltine", +"basaltoid", +"basanite", +"basaree", +"Bascology", +"bascule", +"base", +"baseball", +"baseballdom", +"baseballer", +"baseboard", +"baseborn", +"basebred", +"based", +"basehearted", +"baseheartedness", +"baselard", +"baseless", +"baselessly", +"baselessness", +"baselike", +"baseliner", +"Basella", +"Basellaceae", +"basellaceous", +"basely", +"baseman", +"basement", +"basementward", +"baseness", +"basenji", +"bases", +"bash", +"bashaw", +"bashawdom", +"bashawism", +"bashawship", +"bashful", +"bashfully", +"bashfulness", +"Bashilange", +"Bashkir", +"bashlyk", +"Bashmuric", +"basial", +"basialveolar", +"basiarachnitis", +"basiarachnoiditis", +"basiate", +"basiation", +"Basibracteolate", +"basibranchial", +"basibranchiate", +"basibregmatic", +"basic", +"basically", +"basichromatic", +"basichromatin", +"basichromatinic", +"basichromiole", +"basicity", +"basicranial", +"basicytoparaplastin", +"basidia", +"basidial", +"basidigital", +"basidigitale", +"basidiogenetic", +"basidiolichen", +"Basidiolichenes", +"basidiomycete", +"Basidiomycetes", +"basidiomycetous", +"basidiophore", +"basidiospore", +"basidiosporous", +"basidium", +"basidorsal", +"basifacial", +"basification", +"basifier", +"basifixed", +"basifugal", +"basify", +"basigamous", +"basigamy", +"basigenic", +"basigenous", +"basiglandular", +"basigynium", +"basihyal", +"basihyoid", +"Basil", +"basil", +"basilar", +"Basilarchia", +"basilary", +"basilateral", +"basilemma", +"basileus", +"Basilian", +"basilic", +"Basilica", +"basilica", +"Basilicae", +"basilical", +"basilican", +"basilicate", +"basilicon", +"Basilics", +"Basilidian", +"Basilidianism", +"basilinna", +"basiliscan", +"basiliscine", +"Basiliscus", +"basilisk", +"basilissa", +"Basilosauridae", +"Basilosaurus", +"basilweed", +"basilysis", +"basilyst", +"basimesostasis", +"basin", +"basinasal", +"basinasial", +"basined", +"basinerved", +"basinet", +"basinlike", +"basioccipital", +"basion", +"basiophitic", +"basiophthalmite", +"basiophthalmous", +"basiotribe", +"basiotripsy", +"basiparachromatin", +"basiparaplastin", +"basipetal", +"basiphobia", +"basipodite", +"basipoditic", +"basipterygial", +"basipterygium", +"basipterygoid", +"basiradial", +"basirhinal", +"basirostral", +"basis", +"basiscopic", +"basisphenoid", +"basisphenoidal", +"basitemporal", +"basiventral", +"basivertebral", +"bask", +"basker", +"Baskerville", +"basket", +"basketball", +"basketballer", +"basketful", +"basketing", +"basketmaker", +"basketmaking", +"basketry", +"basketware", +"basketwoman", +"basketwood", +"basketwork", +"basketworm", +"Baskish", +"Baskonize", +"Basoche", +"Basoga", +"basoid", +"Basoko", +"Basommatophora", +"basommatophorous", +"bason", +"Basongo", +"basophile", +"basophilia", +"basophilic", +"basophilous", +"basophobia", +"basos", +"basote", +"Basque", +"basque", +"basqued", +"basquine", +"bass", +"Bassa", +"Bassalia", +"Bassalian", +"bassan", +"bassanello", +"bassanite", +"bassara", +"bassarid", +"Bassaris", +"Bassariscus", +"bassarisk", +"basset", +"bassetite", +"bassetta", +"Bassia", +"bassie", +"bassine", +"bassinet", +"bassist", +"bassness", +"basso", +"bassoon", +"bassoonist", +"bassorin", +"bassus", +"basswood", +"Bast", +"bast", +"basta", +"Bastaard", +"Bastard", +"bastard", +"bastardism", +"bastardization", +"bastardize", +"bastardliness", +"bastardly", +"bastardy", +"baste", +"basten", +"baster", +"bastide", +"bastille", +"bastinade", +"bastinado", +"basting", +"bastion", +"bastionary", +"bastioned", +"bastionet", +"bastite", +"bastnasite", +"basto", +"baston", +"basurale", +"Basuto", +"Bat", +"bat", +"bataan", +"batad", +"Batak", +"batakan", +"bataleur", +"Batan", +"batara", +"batata", +"Batatas", +"batatilla", +"Batavi", +"Batavian", +"batch", +"batcher", +"bate", +"batea", +"bateau", +"bateaux", +"bated", +"Batekes", +"batel", +"bateman", +"batement", +"bater", +"Batetela", +"batfish", +"batfowl", +"batfowler", +"batfowling", +"Bath", +"bath", +"Bathala", +"bathe", +"batheable", +"bather", +"bathetic", +"bathflower", +"bathhouse", +"bathic", +"bathing", +"bathless", +"bathman", +"bathmic", +"bathmism", +"bathmotropic", +"bathmotropism", +"bathochromatic", +"bathochromatism", +"bathochrome", +"bathochromic", +"bathochromy", +"bathoflore", +"bathofloric", +"batholite", +"batholith", +"batholithic", +"batholitic", +"bathometer", +"Bathonian", +"bathophobia", +"bathorse", +"bathos", +"bathrobe", +"bathroom", +"bathroomed", +"bathroot", +"bathtub", +"bathukolpian", +"bathukolpic", +"bathvillite", +"bathwort", +"bathyal", +"bathyanesthesia", +"bathybian", +"bathybic", +"bathybius", +"bathycentesis", +"bathychrome", +"bathycolpian", +"bathycolpic", +"bathycurrent", +"bathyesthesia", +"bathygraphic", +"bathyhyperesthesia", +"bathyhypesthesia", +"bathylimnetic", +"bathylite", +"bathylith", +"bathylithic", +"bathylitic", +"bathymeter", +"bathymetric", +"bathymetrical", +"bathymetrically", +"bathymetry", +"bathyorographical", +"bathypelagic", +"bathyplankton", +"bathyseism", +"bathysmal", +"bathysophic", +"bathysophical", +"bathysphere", +"bathythermograph", +"Batidaceae", +"batidaceous", +"batik", +"batiker", +"batikulin", +"batikuling", +"bating", +"batino", +"Batis", +"batiste", +"batitinan", +"batlan", +"batlike", +"batling", +"batlon", +"batman", +"Batocrinidae", +"Batocrinus", +"Batodendron", +"batoid", +"Batoidei", +"Batoka", +"baton", +"Batonga", +"batonistic", +"batonne", +"batophobia", +"Batrachia", +"batrachian", +"batrachiate", +"Batrachidae", +"Batrachium", +"batrachoid", +"Batrachoididae", +"batrachophagous", +"Batrachophidia", +"batrachophobia", +"batrachoplasty", +"Batrachospermum", +"bats", +"batsman", +"batsmanship", +"batster", +"batswing", +"batt", +"Batta", +"batta", +"battailous", +"Battak", +"Battakhin", +"battalia", +"battalion", +"battarism", +"battarismus", +"battel", +"batteler", +"batten", +"battener", +"battening", +"batter", +"batterable", +"battercake", +"batterdock", +"battered", +"batterer", +"batterfang", +"batteried", +"batterman", +"battery", +"batteryman", +"battik", +"batting", +"battish", +"battle", +"battled", +"battledore", +"battlefield", +"battleful", +"battleground", +"battlement", +"battlemented", +"battleplane", +"battler", +"battleship", +"battlesome", +"battlestead", +"battlewagon", +"battleward", +"battlewise", +"battological", +"battologist", +"battologize", +"battology", +"battue", +"batty", +"batukite", +"batule", +"Batussi", +"Batwa", +"batwing", +"batyphone", +"batz", +"batzen", +"bauble", +"baublery", +"baubling", +"Baubo", +"bauch", +"bauchle", +"bauckie", +"bauckiebird", +"baud", +"baudekin", +"baudrons", +"Bauera", +"Bauhinia", +"baul", +"bauleah", +"Baume", +"baumhauerite", +"baun", +"bauno", +"Baure", +"bauson", +"bausond", +"bauta", +"bauxite", +"bauxitite", +"Bavarian", +"bavaroy", +"bavary", +"bavenite", +"baviaantje", +"Bavian", +"bavian", +"baviere", +"bavin", +"Bavius", +"bavoso", +"baw", +"bawarchi", +"bawbee", +"bawcock", +"bawd", +"bawdily", +"bawdiness", +"bawdry", +"bawdship", +"bawdyhouse", +"bawl", +"bawler", +"bawley", +"bawn", +"Bawra", +"bawtie", +"baxter", +"Baxterian", +"Baxterianism", +"baxtone", +"bay", +"Baya", +"baya", +"bayadere", +"bayal", +"bayamo", +"Bayard", +"bayard", +"bayardly", +"bayberry", +"baybolt", +"baybush", +"baycuru", +"bayed", +"bayeta", +"baygall", +"bayhead", +"bayish", +"bayldonite", +"baylet", +"baylike", +"bayman", +"bayness", +"Bayogoula", +"bayok", +"bayonet", +"bayoneted", +"bayoneteer", +"bayou", +"baywood", +"bazaar", +"baze", +"Bazigar", +"bazoo", +"bazooka", +"bazzite", +"bdellid", +"Bdellidae", +"bdellium", +"bdelloid", +"Bdelloida", +"Bdellostoma", +"Bdellostomatidae", +"Bdellostomidae", +"bdellotomy", +"Bdelloura", +"Bdellouridae", +"be", +"beach", +"beachcomb", +"beachcomber", +"beachcombing", +"beached", +"beachhead", +"beachlamar", +"beachless", +"beachman", +"beachmaster", +"beachward", +"beachy", +"beacon", +"beaconage", +"beaconless", +"beaconwise", +"bead", +"beaded", +"beader", +"beadflush", +"beadhouse", +"beadily", +"beadiness", +"beading", +"beadle", +"beadledom", +"beadlehood", +"beadleism", +"beadlery", +"beadleship", +"beadlet", +"beadlike", +"beadman", +"beadroll", +"beadrow", +"beadsman", +"beadswoman", +"beadwork", +"beady", +"Beagle", +"beagle", +"beagling", +"beak", +"beaked", +"beaker", +"beakerful", +"beakerman", +"beakermen", +"beakful", +"beakhead", +"beakiron", +"beaklike", +"beaky", +"beal", +"beala", +"bealing", +"beallach", +"bealtared", +"Bealtine", +"Bealtuinn", +"beam", +"beamage", +"beambird", +"beamed", +"beamer", +"beamfilling", +"beamful", +"beamhouse", +"beamily", +"beaminess", +"beaming", +"beamingly", +"beamish", +"beamless", +"beamlet", +"beamlike", +"beamman", +"beamsman", +"beamster", +"beamwork", +"beamy", +"bean", +"beanbag", +"beanbags", +"beancod", +"beanery", +"beanfeast", +"beanfeaster", +"beanfield", +"beanie", +"beano", +"beansetter", +"beanshooter", +"beanstalk", +"beant", +"beanweed", +"beany", +"beaproned", +"bear", +"bearable", +"bearableness", +"bearably", +"bearance", +"bearbaiter", +"bearbaiting", +"bearbane", +"bearberry", +"bearbind", +"bearbine", +"bearcoot", +"beard", +"bearded", +"bearder", +"beardie", +"bearding", +"beardless", +"beardlessness", +"beardom", +"beardtongue", +"beardy", +"bearer", +"bearess", +"bearfoot", +"bearherd", +"bearhide", +"bearhound", +"bearing", +"bearish", +"bearishly", +"bearishness", +"bearlet", +"bearlike", +"bearm", +"bearship", +"bearskin", +"beartongue", +"bearward", +"bearwood", +"bearwort", +"beast", +"beastbane", +"beastdom", +"beasthood", +"beastie", +"beastily", +"beastish", +"beastishness", +"beastlike", +"beastlily", +"beastliness", +"beastling", +"beastlings", +"beastly", +"beastman", +"beastship", +"beat", +"Beata", +"beata", +"beatable", +"beatae", +"beatee", +"beaten", +"beater", +"beaterman", +"beath", +"beatific", +"beatifical", +"beatifically", +"beatificate", +"beatification", +"beatify", +"beatinest", +"beating", +"beatitude", +"Beatrice", +"Beatrix", +"beatster", +"beatus", +"beau", +"Beauclerc", +"beaufin", +"Beaufort", +"beauish", +"beauism", +"Beaujolais", +"Beaumontia", +"Beaune", +"beaupere", +"beauseant", +"beauship", +"beauteous", +"beauteously", +"beauteousness", +"beauti", +"beautician", +"beautied", +"beautification", +"beautifier", +"beautiful", +"beautifully", +"beautifulness", +"beautify", +"beautihood", +"beauty", +"beautydom", +"beautyship", +"beaux", +"beaver", +"Beaverboard", +"beaverboard", +"beavered", +"beaverette", +"beaverish", +"beaverism", +"beaverite", +"beaverize", +"Beaverkill", +"beaverkin", +"beaverlike", +"beaverpelt", +"beaverroot", +"beaverteen", +"beaverwood", +"beavery", +"beback", +"bebait", +"beballed", +"bebang", +"bebannered", +"bebar", +"bebaron", +"bebaste", +"bebat", +"bebathe", +"bebatter", +"bebay", +"bebeast", +"bebed", +"bebeerine", +"bebeeru", +"bebelted", +"bebilya", +"bebite", +"bebization", +"beblain", +"beblear", +"bebled", +"bebless", +"beblister", +"beblood", +"bebloom", +"beblotch", +"beblubber", +"bebog", +"bebop", +"beboss", +"bebotch", +"bebothered", +"bebouldered", +"bebrave", +"bebreech", +"bebrine", +"bebrother", +"bebrush", +"bebump", +"bebusy", +"bebuttoned", +"becall", +"becalm", +"becalmment", +"becap", +"becard", +"becarpet", +"becarve", +"becassocked", +"becater", +"because", +"beccafico", +"becense", +"bechained", +"bechalk", +"bechance", +"becharm", +"bechase", +"bechatter", +"bechauffeur", +"becheck", +"becher", +"bechern", +"bechignoned", +"bechirp", +"Bechtler", +"Bechuana", +"becircled", +"becivet", +"Beck", +"beck", +"beckelite", +"becker", +"becket", +"beckiron", +"beckon", +"beckoner", +"beckoning", +"beckoningly", +"Becky", +"beclad", +"beclamor", +"beclamour", +"beclang", +"beclart", +"beclasp", +"beclatter", +"beclaw", +"becloak", +"beclog", +"beclothe", +"becloud", +"beclout", +"beclown", +"becluster", +"becobweb", +"becoiffed", +"becollier", +"becolme", +"becolor", +"becombed", +"become", +"becomes", +"becoming", +"becomingly", +"becomingness", +"becomma", +"becompass", +"becompliment", +"becoom", +"becoresh", +"becost", +"becousined", +"becovet", +"becoward", +"becquerelite", +"becram", +"becramp", +"becrampon", +"becrawl", +"becreep", +"becrime", +"becrimson", +"becrinolined", +"becripple", +"becroak", +"becross", +"becrowd", +"becrown", +"becrush", +"becrust", +"becry", +"becudgel", +"becuffed", +"becuiba", +"becumber", +"becuna", +"becurl", +"becurry", +"becurse", +"becurtained", +"becushioned", +"becut", +"bed", +"bedabble", +"bedad", +"bedaggered", +"bedamn", +"bedamp", +"bedangled", +"bedare", +"bedark", +"bedarken", +"bedash", +"bedaub", +"bedawn", +"beday", +"bedaze", +"bedazement", +"bedazzle", +"bedazzlement", +"bedazzling", +"bedazzlingly", +"bedboard", +"bedbug", +"bedcap", +"bedcase", +"bedchair", +"bedchamber", +"bedclothes", +"bedcord", +"bedcover", +"bedded", +"bedder", +"bedding", +"bedead", +"bedeaf", +"bedeafen", +"bedebt", +"bedeck", +"bedecorate", +"bedeguar", +"bedel", +"beden", +"bedene", +"bedesman", +"bedevil", +"bedevilment", +"bedew", +"bedewer", +"bedewoman", +"bedfast", +"bedfellow", +"bedfellowship", +"bedflower", +"bedfoot", +"Bedford", +"bedframe", +"bedgery", +"bedgoer", +"bedgown", +"bediademed", +"bediamonded", +"bediaper", +"bedight", +"bedikah", +"bedim", +"bedimple", +"bedin", +"bedip", +"bedirt", +"bedirter", +"bedirty", +"bedismal", +"bedizen", +"bedizenment", +"bedkey", +"bedlam", +"bedlamer", +"Bedlamic", +"bedlamism", +"bedlamite", +"bedlamitish", +"bedlamize", +"bedlar", +"bedless", +"bedlids", +"bedmaker", +"bedmaking", +"bedman", +"bedmate", +"bedoctor", +"bedog", +"bedolt", +"bedot", +"bedote", +"Bedouin", +"Bedouinism", +"bedouse", +"bedown", +"bedoyo", +"bedpan", +"bedplate", +"bedpost", +"bedquilt", +"bedrabble", +"bedraggle", +"bedragglement", +"bedrail", +"bedral", +"bedrape", +"bedravel", +"bedrench", +"bedress", +"bedribble", +"bedrid", +"bedridden", +"bedriddenness", +"bedrift", +"bedright", +"bedrip", +"bedrivel", +"bedrizzle", +"bedrock", +"bedroll", +"bedroom", +"bedrop", +"bedrown", +"bedrowse", +"bedrug", +"bedscrew", +"bedsick", +"bedside", +"bedsite", +"bedsock", +"bedsore", +"bedspread", +"bedspring", +"bedstaff", +"bedstand", +"bedstaves", +"bedstead", +"bedstock", +"bedstraw", +"bedstring", +"bedtick", +"bedticking", +"bedtime", +"bedub", +"beduchess", +"beduck", +"beduke", +"bedull", +"bedumb", +"bedunce", +"bedunch", +"bedung", +"bedur", +"bedusk", +"bedust", +"bedwarf", +"bedway", +"bedways", +"bedwell", +"bedye", +"Bee", +"bee", +"beearn", +"beebread", +"beech", +"beechdrops", +"beechen", +"beechnut", +"beechwood", +"beechwoods", +"beechy", +"beedged", +"beedom", +"beef", +"beefeater", +"beefer", +"beefhead", +"beefheaded", +"beefily", +"beefin", +"beefiness", +"beefish", +"beefishness", +"beefless", +"beeflower", +"beefsteak", +"beeftongue", +"beefwood", +"beefy", +"beegerite", +"beehead", +"beeheaded", +"beeherd", +"beehive", +"beehouse", +"beeish", +"beeishness", +"beek", +"beekeeper", +"beekeeping", +"beekite", +"Beekmantown", +"beelbow", +"beelike", +"beeline", +"beelol", +"Beelzebub", +"Beelzebubian", +"Beelzebul", +"beeman", +"beemaster", +"been", +"beennut", +"beer", +"beerage", +"beerbachite", +"beerbibber", +"beerhouse", +"beerily", +"beeriness", +"beerish", +"beerishly", +"beermaker", +"beermaking", +"beermonger", +"beerocracy", +"Beerothite", +"beerpull", +"beery", +"bees", +"beest", +"beestings", +"beeswax", +"beeswing", +"beeswinged", +"beet", +"beeth", +"Beethovenian", +"Beethovenish", +"Beethovian", +"beetle", +"beetled", +"beetlehead", +"beetleheaded", +"beetler", +"beetlestock", +"beetlestone", +"beetleweed", +"beetmister", +"beetrave", +"beetroot", +"beetrooty", +"beety", +"beeve", +"beevish", +"beeware", +"beeway", +"beeweed", +"beewise", +"beewort", +"befall", +"befame", +"befamilied", +"befamine", +"befan", +"befancy", +"befanned", +"befathered", +"befavor", +"befavour", +"befeather", +"beferned", +"befetished", +"befetter", +"befezzed", +"befiddle", +"befilch", +"befile", +"befilleted", +"befilmed", +"befilth", +"befinger", +"befire", +"befist", +"befit", +"befitting", +"befittingly", +"befittingness", +"beflag", +"beflannel", +"beflap", +"beflatter", +"beflea", +"befleck", +"beflounce", +"beflour", +"beflout", +"beflower", +"beflum", +"befluster", +"befoam", +"befog", +"befool", +"befoolment", +"befop", +"before", +"beforehand", +"beforeness", +"beforested", +"beforetime", +"beforetimes", +"befortune", +"befoul", +"befouler", +"befoulment", +"befountained", +"befraught", +"befreckle", +"befreeze", +"befreight", +"befret", +"befriend", +"befriender", +"befriendment", +"befrill", +"befringe", +"befriz", +"befrocked", +"befrogged", +"befrounce", +"befrumple", +"befuddle", +"befuddlement", +"befuddler", +"befume", +"befurbelowed", +"befurred", +"beg", +"begabled", +"begad", +"begall", +"begani", +"begar", +"begari", +"begarlanded", +"begarnish", +"begartered", +"begash", +"begat", +"begaud", +"begaudy", +"begay", +"begaze", +"begeck", +"begem", +"beget", +"begettal", +"begetter", +"beggable", +"beggar", +"beggardom", +"beggarer", +"beggaress", +"beggarhood", +"beggarism", +"beggarlike", +"beggarliness", +"beggarly", +"beggarman", +"beggarweed", +"beggarwise", +"beggarwoman", +"beggary", +"Beggiatoa", +"Beggiatoaceae", +"beggiatoaceous", +"begging", +"beggingly", +"beggingwise", +"Beghard", +"begift", +"begiggle", +"begild", +"begin", +"beginger", +"beginner", +"beginning", +"begird", +"begirdle", +"beglad", +"beglamour", +"beglare", +"beglerbeg", +"beglerbeglic", +"beglerbegluc", +"beglerbegship", +"beglerbey", +"beglic", +"beglide", +"beglitter", +"beglobed", +"begloom", +"begloze", +"begluc", +"beglue", +"begnaw", +"bego", +"begob", +"begobs", +"begoggled", +"begohm", +"begone", +"begonia", +"Begoniaceae", +"begoniaceous", +"Begoniales", +"begorra", +"begorry", +"begotten", +"begottenness", +"begoud", +"begowk", +"begowned", +"begrace", +"begrain", +"begrave", +"begray", +"begrease", +"begreen", +"begrett", +"begrim", +"begrime", +"begrimer", +"begroan", +"begrown", +"begrudge", +"begrudgingly", +"begruntle", +"begrutch", +"begrutten", +"beguard", +"beguess", +"beguile", +"beguileful", +"beguilement", +"beguiler", +"beguiling", +"beguilingly", +"Beguin", +"Beguine", +"beguine", +"begulf", +"begum", +"begun", +"begunk", +"begut", +"behale", +"behalf", +"behallow", +"behammer", +"behap", +"behatted", +"behave", +"behavior", +"behavioral", +"behaviored", +"behaviorism", +"behaviorist", +"behavioristic", +"behavioristically", +"behead", +"beheadal", +"beheader", +"beheadlined", +"behear", +"behears", +"behearse", +"behedge", +"beheld", +"behelp", +"behemoth", +"behen", +"behenate", +"behenic", +"behest", +"behind", +"behinder", +"behindhand", +"behindsight", +"behint", +"behn", +"behold", +"beholdable", +"beholden", +"beholder", +"beholding", +"beholdingness", +"behoney", +"behoof", +"behooped", +"behoot", +"behoove", +"behooveful", +"behoovefully", +"behoovefulness", +"behooves", +"behooving", +"behoovingly", +"behorn", +"behorror", +"behowl", +"behung", +"behusband", +"behymn", +"behypocrite", +"beice", +"Beid", +"beige", +"being", +"beingless", +"beingness", +"beinked", +"beira", +"beisa", +"Beja", +"bejabers", +"bejade", +"bejan", +"bejant", +"bejaundice", +"bejazz", +"bejel", +"bejewel", +"bejezebel", +"bejig", +"bejuggle", +"bejumble", +"bekah", +"bekerchief", +"bekick", +"bekilted", +"beking", +"bekinkinite", +"bekiss", +"bekko", +"beknave", +"beknight", +"beknit", +"beknived", +"beknotted", +"beknottedly", +"beknottedness", +"beknow", +"beknown", +"Bel", +"bel", +"bela", +"belabor", +"belaced", +"beladle", +"belady", +"belage", +"belah", +"Belait", +"Belaites", +"belam", +"Belamcanda", +"belanda", +"belar", +"belard", +"belash", +"belate", +"belated", +"belatedly", +"belatedness", +"belatticed", +"belaud", +"belauder", +"belavendered", +"belay", +"belayer", +"belch", +"belcher", +"beld", +"beldam", +"beldamship", +"belderroot", +"belduque", +"beleaf", +"beleaguer", +"beleaguerer", +"beleaguerment", +"beleap", +"beleave", +"belecture", +"beledgered", +"belee", +"belemnid", +"belemnite", +"Belemnites", +"belemnitic", +"Belemnitidae", +"belemnoid", +"Belemnoidea", +"beletter", +"belfried", +"belfry", +"belga", +"Belgae", +"Belgian", +"Belgic", +"Belgophile", +"Belgrade", +"Belgravia", +"Belgravian", +"Belial", +"Belialic", +"Belialist", +"belibel", +"belick", +"belie", +"belief", +"beliefful", +"belieffulness", +"beliefless", +"belier", +"believability", +"believable", +"believableness", +"believe", +"believer", +"believing", +"believingly", +"belight", +"beliked", +"Belili", +"belimousined", +"Belinda", +"Belinuridae", +"Belinurus", +"belion", +"beliquor", +"Belis", +"belite", +"belitter", +"belittle", +"belittlement", +"belittler", +"belive", +"bell", +"Bella", +"Bellabella", +"Bellacoola", +"belladonna", +"bellarmine", +"Bellatrix", +"bellbind", +"bellbird", +"bellbottle", +"bellboy", +"belle", +"belled", +"belledom", +"Belleek", +"bellehood", +"belleric", +"Bellerophon", +"Bellerophontidae", +"belletrist", +"belletristic", +"bellflower", +"bellhanger", +"bellhanging", +"bellhop", +"bellhouse", +"bellicism", +"bellicose", +"bellicosely", +"bellicoseness", +"bellicosity", +"bellied", +"belliferous", +"belligerence", +"belligerency", +"belligerent", +"belligerently", +"belling", +"bellipotent", +"Bellis", +"bellite", +"bellmaker", +"bellmaking", +"bellman", +"bellmanship", +"bellmaster", +"bellmouth", +"bellmouthed", +"Bellona", +"Bellonian", +"bellonion", +"bellote", +"Bellovaci", +"bellow", +"bellower", +"bellows", +"bellowsful", +"bellowslike", +"bellowsmaker", +"bellowsmaking", +"bellowsman", +"bellpull", +"belltail", +"belltopper", +"belltopperdom", +"bellware", +"bellwaver", +"bellweed", +"bellwether", +"bellwind", +"bellwine", +"bellwood", +"bellwort", +"belly", +"bellyache", +"bellyband", +"bellyer", +"bellyfish", +"bellyflaught", +"bellyful", +"bellying", +"bellyland", +"bellylike", +"bellyman", +"bellypiece", +"bellypinch", +"beloam", +"beloeilite", +"beloid", +"belomancy", +"Belone", +"belonesite", +"belong", +"belonger", +"belonging", +"belonid", +"Belonidae", +"belonite", +"belonoid", +"belonosphaerite", +"belord", +"Belostoma", +"Belostomatidae", +"Belostomidae", +"belout", +"belove", +"beloved", +"below", +"belowstairs", +"belozenged", +"Belshazzar", +"Belshazzaresque", +"belsire", +"belt", +"Beltane", +"belted", +"Beltene", +"belter", +"Beltian", +"beltie", +"beltine", +"belting", +"Beltir", +"Beltis", +"beltmaker", +"beltmaking", +"beltman", +"belton", +"beltwise", +"Beluchi", +"Belucki", +"beluga", +"belugite", +"belute", +"belve", +"belvedere", +"Belverdian", +"bely", +"belying", +"belyingly", +"belzebuth", +"bema", +"bemad", +"bemadam", +"bemaddening", +"bemail", +"bemaim", +"bemajesty", +"beman", +"bemangle", +"bemantle", +"bemar", +"bemartyr", +"bemask", +"bemaster", +"bemat", +"bemata", +"bemaul", +"bemazed", +"Bemba", +"Bembecidae", +"Bembex", +"bemeal", +"bemean", +"bemedaled", +"bemedalled", +"bementite", +"bemercy", +"bemingle", +"beminstrel", +"bemire", +"bemirement", +"bemirror", +"bemirrorment", +"bemist", +"bemistress", +"bemitered", +"bemitred", +"bemix", +"bemoan", +"bemoanable", +"bemoaner", +"bemoaning", +"bemoaningly", +"bemoat", +"bemock", +"bemoil", +"bemoisten", +"bemole", +"bemolt", +"bemonster", +"bemoon", +"bemotto", +"bemoult", +"bemouth", +"bemuck", +"bemud", +"bemuddle", +"bemuddlement", +"bemuddy", +"bemuffle", +"bemurmur", +"bemuse", +"bemused", +"bemusedly", +"bemusement", +"bemusk", +"bemuslined", +"bemuzzle", +"Ben", +"ben", +"bena", +"benab", +"Benacus", +"bename", +"benami", +"benamidar", +"benasty", +"benben", +"bench", +"benchboard", +"bencher", +"benchership", +"benchfellow", +"benchful", +"benching", +"benchland", +"benchlet", +"benchman", +"benchwork", +"benchy", +"bencite", +"bend", +"benda", +"bendability", +"bendable", +"bended", +"bender", +"bending", +"bendingly", +"bendlet", +"bendsome", +"bendwise", +"bendy", +"bene", +"beneaped", +"beneath", +"beneception", +"beneceptive", +"beneceptor", +"benedicite", +"Benedict", +"benedict", +"Benedicta", +"Benedictine", +"Benedictinism", +"benediction", +"benedictional", +"benedictionary", +"benedictive", +"benedictively", +"benedictory", +"Benedictus", +"benedight", +"benefaction", +"benefactive", +"benefactor", +"benefactorship", +"benefactory", +"benefactress", +"benefic", +"benefice", +"beneficed", +"beneficeless", +"beneficence", +"beneficent", +"beneficential", +"beneficently", +"beneficial", +"beneficially", +"beneficialness", +"beneficiary", +"beneficiaryship", +"beneficiate", +"beneficiation", +"benefit", +"benefiter", +"beneighbored", +"Benelux", +"benempt", +"benempted", +"beneplacito", +"benet", +"Benetnasch", +"benettle", +"Beneventan", +"Beneventana", +"benevolence", +"benevolent", +"benevolently", +"benevolentness", +"benevolist", +"beng", +"Bengal", +"Bengalese", +"Bengali", +"Bengalic", +"bengaline", +"Bengola", +"Beni", +"beni", +"benight", +"benighted", +"benightedness", +"benighten", +"benighter", +"benightmare", +"benightment", +"benign", +"benignancy", +"benignant", +"benignantly", +"benignity", +"benignly", +"Benin", +"Benincasa", +"benison", +"benitoite", +"benj", +"Benjamin", +"benjamin", +"benjaminite", +"Benjamite", +"Benjy", +"benjy", +"Benkulen", +"benmost", +"benn", +"benne", +"bennel", +"Bennet", +"bennet", +"Bennettitaceae", +"bennettitaceous", +"Bennettitales", +"Bennettites", +"bennetweed", +"Benny", +"benny", +"beno", +"benorth", +"benote", +"bensel", +"bensh", +"benshea", +"benshee", +"benshi", +"bent", +"bentang", +"benthal", +"Benthamic", +"Benthamism", +"Benthamite", +"benthic", +"benthon", +"benthonic", +"benthos", +"Bentincks", +"bentiness", +"benting", +"Benton", +"bentonite", +"bentstar", +"bentwood", +"benty", +"Benu", +"benumb", +"benumbed", +"benumbedness", +"benumbing", +"benumbingly", +"benumbment", +"benward", +"benweed", +"benzacridine", +"benzal", +"benzalacetone", +"benzalacetophenone", +"benzalaniline", +"benzalazine", +"benzalcohol", +"benzalcyanhydrin", +"benzaldehyde", +"benzaldiphenyl", +"benzaldoxime", +"benzalethylamine", +"benzalhydrazine", +"benzalphenylhydrazone", +"benzalphthalide", +"benzamide", +"benzamido", +"benzamine", +"benzaminic", +"benzamino", +"benzanalgen", +"benzanilide", +"benzanthrone", +"benzantialdoxime", +"benzazide", +"benzazimide", +"benzazine", +"benzazole", +"benzbitriazole", +"benzdiazine", +"benzdifuran", +"benzdioxazine", +"benzdioxdiazine", +"benzdioxtriazine", +"Benzedrine", +"benzein", +"benzene", +"benzenediazonium", +"benzenoid", +"benzenyl", +"benzhydrol", +"benzhydroxamic", +"benzidine", +"benzidino", +"benzil", +"benzilic", +"benzimidazole", +"benziminazole", +"benzinduline", +"benzine", +"benzo", +"benzoate", +"benzoated", +"benzoazurine", +"benzobis", +"benzocaine", +"benzocoumaran", +"benzodiazine", +"benzodiazole", +"benzoflavine", +"benzofluorene", +"benzofulvene", +"benzofuran", +"benzofuroquinoxaline", +"benzofuryl", +"benzoglycolic", +"benzoglyoxaline", +"benzohydrol", +"benzoic", +"benzoid", +"benzoin", +"benzoinated", +"benzoiodohydrin", +"benzol", +"benzolate", +"benzole", +"benzolize", +"benzomorpholine", +"benzonaphthol", +"benzonitrile", +"benzonitrol", +"benzoperoxide", +"benzophenanthrazine", +"benzophenanthroline", +"benzophenazine", +"benzophenol", +"benzophenone", +"benzophenothiazine", +"benzophenoxazine", +"benzophloroglucinol", +"benzophosphinic", +"benzophthalazine", +"benzopinacone", +"benzopyran", +"benzopyranyl", +"benzopyrazolone", +"benzopyrylium", +"benzoquinoline", +"benzoquinone", +"benzoquinoxaline", +"benzosulphimide", +"benzotetrazine", +"benzotetrazole", +"benzothiazine", +"benzothiazole", +"benzothiazoline", +"benzothiodiazole", +"benzothiofuran", +"benzothiophene", +"benzothiopyran", +"benzotoluide", +"benzotriazine", +"benzotriazole", +"benzotrichloride", +"benzotrifuran", +"benzoxate", +"benzoxy", +"benzoxyacetic", +"benzoxycamphor", +"benzoxyphenanthrene", +"benzoyl", +"benzoylate", +"benzoylation", +"benzoylformic", +"benzoylglycine", +"benzpinacone", +"benzthiophen", +"benztrioxazine", +"benzyl", +"benzylamine", +"benzylic", +"benzylidene", +"benzylpenicillin", +"beode", +"Beothuk", +"Beothukan", +"Beowulf", +"bepaid", +"Bepaint", +"bepale", +"bepaper", +"beparch", +"beparody", +"beparse", +"bepart", +"bepaste", +"bepastured", +"bepat", +"bepatched", +"bepaw", +"bepearl", +"bepelt", +"bepen", +"bepepper", +"beperiwigged", +"bepester", +"bepewed", +"bephilter", +"bephrase", +"bepicture", +"bepiece", +"bepierce", +"bepile", +"bepill", +"bepillared", +"bepimple", +"bepinch", +"bepistoled", +"bepity", +"beplague", +"beplaided", +"beplaster", +"beplumed", +"bepommel", +"bepowder", +"bepraise", +"bepraisement", +"bepraiser", +"beprank", +"bepray", +"bepreach", +"bepress", +"bepretty", +"bepride", +"beprose", +"bepuddle", +"bepuff", +"bepun", +"bepurple", +"bepuzzle", +"bepuzzlement", +"bequalm", +"bequeath", +"bequeathable", +"bequeathal", +"bequeather", +"bequeathment", +"bequest", +"bequirtle", +"bequote", +"ber", +"berain", +"berairou", +"berakah", +"berake", +"berakoth", +"berapt", +"berascal", +"berat", +"berate", +"berattle", +"beraunite", +"beray", +"berbamine", +"Berber", +"Berberi", +"Berberian", +"berberid", +"Berberidaceae", +"berberidaceous", +"berberine", +"Berberis", +"berberry", +"Berchemia", +"Berchta", +"berdache", +"bere", +"Berean", +"bereason", +"bereave", +"bereavement", +"bereaven", +"bereaver", +"bereft", +"berend", +"Berengaria", +"Berengarian", +"Berengarianism", +"berengelite", +"Berenice", +"Bereshith", +"beresite", +"beret", +"berewick", +"berg", +"bergalith", +"Bergama", +"Bergamask", +"bergamiol", +"Bergamo", +"Bergamot", +"bergamot", +"bergander", +"bergaptene", +"berger", +"berghaan", +"berginization", +"berginize", +"berglet", +"bergschrund", +"Bergsonian", +"Bergsonism", +"bergut", +"bergy", +"bergylt", +"berhyme", +"Beri", +"beribanded", +"beribboned", +"beriberi", +"beriberic", +"beride", +"berigora", +"beringed", +"beringite", +"beringleted", +"berinse", +"berith", +"Berkeleian", +"Berkeleianism", +"Berkeleyism", +"Berkeleyite", +"berkelium", +"berkovets", +"berkowitz", +"Berkshire", +"berley", +"berlin", +"berline", +"Berliner", +"berlinite", +"Berlinize", +"berm", +"Bermuda", +"Bermudian", +"bermudite", +"Bern", +"Bernard", +"Bernardina", +"Bernardine", +"berne", +"Bernese", +"Bernice", +"Bernicia", +"bernicle", +"Berninesque", +"Bernoullian", +"berobed", +"Beroe", +"Beroida", +"Beroidae", +"beroll", +"Berossos", +"berouged", +"beround", +"berrendo", +"berret", +"berri", +"berried", +"berrier", +"berrigan", +"berrugate", +"berry", +"berrybush", +"berryless", +"berrylike", +"berrypicker", +"berrypicking", +"berseem", +"berserk", +"berserker", +"Bersiamite", +"Bersil", +"Bert", +"Bertat", +"Berteroa", +"berth", +"Bertha", +"berthage", +"berthed", +"berther", +"berthierite", +"berthing", +"Berthold", +"Bertholletia", +"Bertie", +"Bertolonia", +"Bertram", +"bertram", +"bertrandite", +"bertrum", +"beruffed", +"beruffled", +"berust", +"bervie", +"berycid", +"Berycidae", +"beryciform", +"berycine", +"berycoid", +"Berycoidea", +"berycoidean", +"Berycoidei", +"Berycomorphi", +"beryl", +"berylate", +"beryllia", +"berylline", +"berylliosis", +"beryllium", +"berylloid", +"beryllonate", +"beryllonite", +"beryllosis", +"Berytidae", +"Beryx", +"berzelianite", +"berzeliite", +"bes", +"besa", +"besagne", +"besaiel", +"besaint", +"besan", +"besanctify", +"besauce", +"bescab", +"bescarf", +"bescatter", +"bescent", +"bescorch", +"bescorn", +"bescoundrel", +"bescour", +"bescourge", +"bescramble", +"bescrape", +"bescratch", +"bescrawl", +"bescreen", +"bescribble", +"bescurf", +"bescurvy", +"bescutcheon", +"beseam", +"besee", +"beseech", +"beseecher", +"beseeching", +"beseechingly", +"beseechingness", +"beseechment", +"beseem", +"beseeming", +"beseemingly", +"beseemingness", +"beseemliness", +"beseemly", +"beseen", +"beset", +"besetment", +"besetter", +"besetting", +"beshackle", +"beshade", +"beshadow", +"beshag", +"beshake", +"beshame", +"beshawled", +"beshear", +"beshell", +"beshield", +"beshine", +"beshiver", +"beshlik", +"beshod", +"beshout", +"beshow", +"beshower", +"beshrew", +"beshriek", +"beshrivel", +"beshroud", +"besiclometer", +"beside", +"besides", +"besiege", +"besieged", +"besiegement", +"besieger", +"besieging", +"besiegingly", +"besigh", +"besilver", +"besin", +"besing", +"besiren", +"besit", +"beslab", +"beslap", +"beslash", +"beslave", +"beslaver", +"besleeve", +"beslime", +"beslimer", +"beslings", +"beslipper", +"beslobber", +"beslow", +"beslubber", +"beslur", +"beslushed", +"besmear", +"besmearer", +"besmell", +"besmile", +"besmirch", +"besmircher", +"besmirchment", +"besmoke", +"besmooth", +"besmother", +"besmouch", +"besmudge", +"besmut", +"besmutch", +"besnare", +"besneer", +"besnivel", +"besnow", +"besnuff", +"besodden", +"besogne", +"besognier", +"besoil", +"besom", +"besomer", +"besonnet", +"besoot", +"besoothe", +"besoothement", +"besot", +"besotment", +"besotted", +"besottedly", +"besottedness", +"besotting", +"besottingly", +"besought", +"besoul", +"besour", +"bespangle", +"bespate", +"bespatter", +"bespatterer", +"bespatterment", +"bespawl", +"bespeak", +"bespeakable", +"bespeaker", +"bespecked", +"bespeckle", +"bespecklement", +"bespectacled", +"besped", +"bespeech", +"bespeed", +"bespell", +"bespelled", +"bespend", +"bespete", +"bespew", +"bespice", +"bespill", +"bespin", +"bespirit", +"bespit", +"besplash", +"besplatter", +"besplit", +"bespoke", +"bespoken", +"bespot", +"bespottedness", +"bespouse", +"bespout", +"bespray", +"bespread", +"besprent", +"besprinkle", +"besprinkler", +"bespurred", +"besputter", +"bespy", +"besqueeze", +"besquib", +"besra", +"Bess", +"Bessarabian", +"Besselian", +"Bessemer", +"bessemer", +"Bessemerize", +"bessemerize", +"Bessera", +"Bessi", +"Bessie", +"Bessy", +"best", +"bestab", +"bestain", +"bestamp", +"bestar", +"bestare", +"bestarve", +"bestatued", +"bestay", +"bestayed", +"bestead", +"besteer", +"bestench", +"bester", +"bestial", +"bestialism", +"bestialist", +"bestiality", +"bestialize", +"bestially", +"bestiarian", +"bestiarianism", +"bestiary", +"bestick", +"bestill", +"bestink", +"bestir", +"bestness", +"bestock", +"bestore", +"bestorm", +"bestove", +"bestow", +"bestowable", +"bestowage", +"bestowal", +"bestower", +"bestowing", +"bestowment", +"bestraddle", +"bestrapped", +"bestraught", +"bestraw", +"bestreak", +"bestream", +"bestrew", +"bestrewment", +"bestride", +"bestripe", +"bestrode", +"bestubbled", +"bestuck", +"bestud", +"besugar", +"besuit", +"besully", +"beswarm", +"besweatered", +"besweeten", +"beswelter", +"beswim", +"beswinge", +"beswitch", +"bet", +"Beta", +"beta", +"betacism", +"betacismus", +"betafite", +"betag", +"betail", +"betailor", +"betaine", +"betainogen", +"betalk", +"betallow", +"betangle", +"betanglement", +"betask", +"betassel", +"betatron", +"betattered", +"betaxed", +"betear", +"beteela", +"beteem", +"betel", +"Betelgeuse", +"Beth", +"beth", +"bethabara", +"bethankit", +"bethel", +"Bethesda", +"bethflower", +"bethink", +"Bethlehem", +"Bethlehemite", +"bethought", +"bethrall", +"bethreaten", +"bethroot", +"Bethuel", +"bethumb", +"bethump", +"bethunder", +"bethwack", +"Bethylidae", +"betide", +"betimber", +"betimes", +"betinge", +"betipple", +"betire", +"betis", +"betitle", +"betocsin", +"betoil", +"betoken", +"betokener", +"betone", +"betongue", +"Betonica", +"betony", +"betorcin", +"betorcinol", +"betoss", +"betowel", +"betowered", +"Betoya", +"Betoyan", +"betrace", +"betrail", +"betrample", +"betrap", +"betravel", +"betray", +"betrayal", +"betrayer", +"betrayment", +"betread", +"betrend", +"betrim", +"betrinket", +"betroth", +"betrothal", +"betrothed", +"betrothment", +"betrough", +"betrousered", +"betrumpet", +"betrunk", +"Betsey", +"Betsileos", +"Betsimisaraka", +"betso", +"Betsy", +"Betta", +"betted", +"better", +"betterer", +"bettergates", +"bettering", +"betterly", +"betterment", +"bettermost", +"betterness", +"betters", +"Bettina", +"Bettine", +"betting", +"bettong", +"bettonga", +"Bettongia", +"bettor", +"Betty", +"betty", +"betuckered", +"Betula", +"Betulaceae", +"betulaceous", +"betulin", +"betulinamaric", +"betulinic", +"betulinol", +"Betulites", +"beturbaned", +"betusked", +"betutor", +"betutored", +"betwattled", +"between", +"betweenbrain", +"betweenity", +"betweenmaid", +"betweenness", +"betweenwhiles", +"betwine", +"betwit", +"betwixen", +"betwixt", +"beudantite", +"Beulah", +"beuniformed", +"bevatron", +"beveil", +"bevel", +"beveled", +"beveler", +"bevelled", +"bevelment", +"bevenom", +"bever", +"beverage", +"beverse", +"bevesseled", +"bevesselled", +"beveto", +"bevillain", +"bevined", +"bevoiled", +"bevomit", +"bevue", +"bevy", +"bewail", +"bewailable", +"bewailer", +"bewailing", +"bewailingly", +"bewailment", +"bewaitered", +"bewall", +"beware", +"bewash", +"bewaste", +"bewater", +"beweary", +"beweep", +"beweeper", +"bewelcome", +"bewelter", +"bewept", +"bewest", +"bewet", +"bewhig", +"bewhiskered", +"bewhisper", +"bewhistle", +"bewhite", +"bewhiten", +"bewidow", +"bewig", +"bewigged", +"bewilder", +"bewildered", +"bewilderedly", +"bewilderedness", +"bewildering", +"bewilderingly", +"bewilderment", +"bewimple", +"bewinged", +"bewinter", +"bewired", +"bewitch", +"bewitchedness", +"bewitcher", +"bewitchery", +"bewitchful", +"bewitching", +"bewitchingly", +"bewitchingness", +"bewitchment", +"bewith", +"bewizard", +"bework", +"beworm", +"beworn", +"beworry", +"beworship", +"bewrap", +"bewrathed", +"bewray", +"bewrayer", +"bewrayingly", +"bewrayment", +"bewreath", +"bewreck", +"bewrite", +"bey", +"beydom", +"beylic", +"beylical", +"beyond", +"beyrichite", +"beyship", +"Bezaleel", +"Bezaleelian", +"bezant", +"bezantee", +"bezanty", +"bezel", +"bezesteen", +"bezetta", +"bezique", +"bezoar", +"bezoardic", +"bezonian", +"Bezpopovets", +"bezzi", +"bezzle", +"bezzo", +"bhabar", +"Bhadon", +"Bhaga", +"bhagavat", +"bhagavata", +"bhaiachari", +"bhaiyachara", +"bhakta", +"bhakti", +"bhalu", +"bhandar", +"bhandari", +"bhang", +"bhangi", +"Bhar", +"bhara", +"bharal", +"Bharata", +"bhat", +"bhava", +"Bhavani", +"bheesty", +"bhikku", +"bhikshu", +"Bhil", +"Bhili", +"Bhima", +"Bhojpuri", +"bhoosa", +"Bhotia", +"Bhotiya", +"Bhowani", +"bhoy", +"Bhumij", +"bhungi", +"bhungini", +"bhut", +"Bhutanese", +"Bhutani", +"bhutatathata", +"Bhutia", +"biabo", +"biacetyl", +"biacetylene", +"biacid", +"biacromial", +"biacuminate", +"biacuru", +"bialate", +"biallyl", +"bialveolar", +"Bianca", +"Bianchi", +"bianchite", +"bianco", +"biangular", +"biangulate", +"biangulated", +"biangulous", +"bianisidine", +"biannual", +"biannually", +"biannulate", +"biarchy", +"biarcuate", +"biarcuated", +"biarticular", +"biarticulate", +"biarticulated", +"bias", +"biasness", +"biasteric", +"biaswise", +"biatomic", +"biauricular", +"biauriculate", +"biaxal", +"biaxial", +"biaxiality", +"biaxially", +"biaxillary", +"bib", +"bibacious", +"bibacity", +"bibasic", +"bibation", +"bibb", +"bibber", +"bibble", +"bibbler", +"bibbons", +"bibcock", +"bibenzyl", +"bibi", +"Bibio", +"bibionid", +"Bibionidae", +"bibiri", +"bibitory", +"Bible", +"bibless", +"Biblic", +"Biblical", +"Biblicality", +"Biblically", +"Biblicism", +"Biblicist", +"Biblicistic", +"Biblicolegal", +"Biblicoliterary", +"Biblicopsychological", +"biblioclasm", +"biblioclast", +"bibliofilm", +"bibliogenesis", +"bibliognost", +"bibliognostic", +"bibliogony", +"bibliograph", +"bibliographer", +"bibliographic", +"bibliographical", +"bibliographically", +"bibliographize", +"bibliography", +"biblioklept", +"bibliokleptomania", +"bibliokleptomaniac", +"bibliolater", +"bibliolatrous", +"bibliolatry", +"bibliological", +"bibliologist", +"bibliology", +"bibliomancy", +"bibliomane", +"bibliomania", +"bibliomaniac", +"bibliomaniacal", +"bibliomanian", +"bibliomanianism", +"bibliomanism", +"bibliomanist", +"bibliopegic", +"bibliopegist", +"bibliopegistic", +"bibliopegy", +"bibliophage", +"bibliophagic", +"bibliophagist", +"bibliophagous", +"bibliophile", +"bibliophilic", +"bibliophilism", +"bibliophilist", +"bibliophilistic", +"bibliophily", +"bibliophobia", +"bibliopolar", +"bibliopole", +"bibliopolery", +"bibliopolic", +"bibliopolical", +"bibliopolically", +"bibliopolism", +"bibliopolist", +"bibliopolistic", +"bibliopoly", +"bibliosoph", +"bibliotaph", +"bibliotaphic", +"bibliothec", +"bibliotheca", +"bibliothecal", +"bibliothecarial", +"bibliothecarian", +"bibliothecary", +"bibliotherapeutic", +"bibliotherapist", +"bibliotherapy", +"bibliothetic", +"bibliotic", +"bibliotics", +"bibliotist", +"Biblism", +"Biblist", +"biblus", +"biborate", +"bibracteate", +"bibracteolate", +"bibulosity", +"bibulous", +"bibulously", +"bibulousness", +"Bibulus", +"bicalcarate", +"bicameral", +"bicameralism", +"bicamerist", +"bicapitate", +"bicapsular", +"bicarbonate", +"bicarbureted", +"bicarinate", +"bicarpellary", +"bicarpellate", +"bicaudal", +"bicaudate", +"Bice", +"bice", +"bicellular", +"bicentenary", +"bicentennial", +"bicephalic", +"bicephalous", +"biceps", +"bicetyl", +"bichir", +"bichloride", +"bichord", +"bichromate", +"bichromatic", +"bichromatize", +"bichrome", +"bichromic", +"bichy", +"biciliate", +"biciliated", +"bicipital", +"bicipitous", +"bicircular", +"bicirrose", +"bick", +"bicker", +"bickerer", +"bickern", +"biclavate", +"biclinium", +"bicollateral", +"bicollaterality", +"bicolligate", +"bicolor", +"bicolored", +"bicolorous", +"biconcave", +"biconcavity", +"bicondylar", +"bicone", +"biconic", +"biconical", +"biconically", +"biconjugate", +"biconsonantal", +"biconvex", +"bicorn", +"bicornate", +"bicorne", +"bicorned", +"bicornous", +"bicornuate", +"bicornuous", +"bicornute", +"bicorporal", +"bicorporate", +"bicorporeal", +"bicostate", +"bicrenate", +"bicrescentic", +"bicrofarad", +"bicron", +"bicrural", +"bicursal", +"bicuspid", +"bicuspidate", +"bicyanide", +"bicycle", +"bicycler", +"bicyclic", +"bicyclism", +"bicyclist", +"bicyclo", +"bicycloheptane", +"bicylindrical", +"bid", +"bidactyl", +"bidactyle", +"bidactylous", +"bidar", +"bidarka", +"bidcock", +"biddable", +"biddableness", +"biddably", +"biddance", +"Biddelian", +"bidder", +"bidding", +"Biddulphia", +"Biddulphiaceae", +"Biddy", +"biddy", +"bide", +"Bidens", +"bident", +"bidental", +"bidentate", +"bidented", +"bidential", +"bidenticulate", +"bider", +"bidet", +"bidigitate", +"bidimensional", +"biding", +"bidirectional", +"bidiurnal", +"Bidpai", +"bidri", +"biduous", +"bieberite", +"Biedermeier", +"bield", +"bieldy", +"bielectrolysis", +"bielenite", +"Bielid", +"Bielorouss", +"bien", +"bienly", +"bienness", +"biennia", +"biennial", +"biennially", +"biennium", +"bier", +"bierbalk", +"biethnic", +"bietle", +"bifacial", +"bifanged", +"bifara", +"bifarious", +"bifariously", +"bifer", +"biferous", +"biff", +"biffin", +"bifid", +"bifidate", +"bifidated", +"bifidity", +"bifidly", +"bifilar", +"bifilarly", +"bifistular", +"biflabellate", +"biflagellate", +"biflecnode", +"biflected", +"biflex", +"biflorate", +"biflorous", +"bifluoride", +"bifocal", +"bifoil", +"bifold", +"bifolia", +"bifoliate", +"bifoliolate", +"bifolium", +"biforked", +"biform", +"biformed", +"biformity", +"biforous", +"bifront", +"bifrontal", +"bifronted", +"bifurcal", +"bifurcate", +"bifurcated", +"bifurcately", +"bifurcation", +"big", +"biga", +"bigamic", +"bigamist", +"bigamistic", +"bigamize", +"bigamous", +"bigamously", +"bigamy", +"bigarade", +"bigaroon", +"bigarreau", +"bigbloom", +"bigemina", +"bigeminal", +"bigeminate", +"bigeminated", +"bigeminum", +"bigener", +"bigeneric", +"bigential", +"bigeye", +"bigg", +"biggah", +"biggen", +"bigger", +"biggest", +"biggin", +"biggish", +"biggonet", +"bigha", +"bighead", +"bighearted", +"bigheartedness", +"bighorn", +"bight", +"biglandular", +"biglenoid", +"biglot", +"bigmouth", +"bigmouthed", +"bigness", +"Bignonia", +"Bignoniaceae", +"bignoniaceous", +"bignoniad", +"bignou", +"bigoniac", +"bigonial", +"bigot", +"bigoted", +"bigotedly", +"bigotish", +"bigotry", +"bigotty", +"bigroot", +"bigthatch", +"biguanide", +"biguttate", +"biguttulate", +"bigwig", +"bigwigged", +"bigwiggedness", +"bigwiggery", +"bigwiggism", +"Bihai", +"Biham", +"bihamate", +"Bihari", +"biharmonic", +"bihourly", +"bihydrazine", +"bija", +"bijasal", +"bijou", +"bijouterie", +"bijoux", +"bijugate", +"bijugular", +"bike", +"bikh", +"bikhaconitine", +"bikini", +"Bikol", +"Bikram", +"Bikukulla", +"Bilaan", +"bilabe", +"bilabial", +"bilabiate", +"bilalo", +"bilamellar", +"bilamellate", +"bilamellated", +"bilaminar", +"bilaminate", +"bilaminated", +"bilander", +"bilateral", +"bilateralism", +"bilaterality", +"bilaterally", +"bilateralness", +"Bilati", +"bilberry", +"bilbie", +"bilbo", +"bilboquet", +"bilby", +"bilch", +"bilcock", +"bildar", +"bilders", +"bile", +"bilestone", +"bilge", +"bilgy", +"Bilharzia", +"bilharzial", +"bilharziasis", +"bilharzic", +"bilharziosis", +"bilianic", +"biliary", +"biliate", +"biliation", +"bilic", +"bilicyanin", +"bilifaction", +"biliferous", +"bilification", +"bilifuscin", +"bilify", +"bilihumin", +"bilimbi", +"bilimbing", +"biliment", +"Bilin", +"bilinear", +"bilineate", +"bilingual", +"bilingualism", +"bilingually", +"bilinguar", +"bilinguist", +"bilinigrin", +"bilinite", +"bilio", +"bilious", +"biliously", +"biliousness", +"biliprasin", +"bilipurpurin", +"bilipyrrhin", +"bilirubin", +"bilirubinemia", +"bilirubinic", +"bilirubinuria", +"biliteral", +"biliteralism", +"bilith", +"bilithon", +"biliverdic", +"biliverdin", +"bilixanthin", +"bilk", +"bilker", +"Bill", +"bill", +"billa", +"billable", +"billabong", +"billback", +"billbeetle", +"Billbergia", +"billboard", +"billbroking", +"billbug", +"billed", +"biller", +"billet", +"billeter", +"billethead", +"billeting", +"billetwood", +"billety", +"billfish", +"billfold", +"billhead", +"billheading", +"billholder", +"billhook", +"billian", +"billiard", +"billiardist", +"billiardly", +"billiards", +"Billiken", +"billikin", +"billing", +"billingsgate", +"billion", +"billionaire", +"billionism", +"billionth", +"billitonite", +"Billjim", +"billman", +"billon", +"billot", +"billow", +"billowiness", +"billowy", +"billposter", +"billposting", +"billsticker", +"billsticking", +"Billy", +"billy", +"billyboy", +"billycan", +"billycock", +"billyer", +"billyhood", +"billywix", +"bilo", +"bilobated", +"bilobe", +"bilobed", +"bilobiate", +"bilobular", +"bilocation", +"bilocellate", +"bilocular", +"biloculate", +"Biloculina", +"biloculine", +"bilophodont", +"Biloxi", +"bilsh", +"Bilskirnir", +"bilsted", +"biltong", +"biltongue", +"Bim", +"bimaculate", +"bimaculated", +"bimalar", +"Bimana", +"bimanal", +"bimane", +"bimanous", +"bimanual", +"bimanually", +"bimarginate", +"bimarine", +"bimastic", +"bimastism", +"bimastoid", +"bimasty", +"bimaxillary", +"bimbil", +"Bimbisara", +"bimeby", +"bimensal", +"bimester", +"bimestrial", +"bimetalic", +"bimetallism", +"bimetallist", +"bimetallistic", +"bimillenary", +"bimillennium", +"bimillionaire", +"Bimini", +"Bimmeler", +"bimodal", +"bimodality", +"bimolecular", +"bimonthly", +"bimotored", +"bimotors", +"bimucronate", +"bimuscular", +"bin", +"binal", +"binaphthyl", +"binarium", +"binary", +"binate", +"binately", +"bination", +"binational", +"binaural", +"binauricular", +"binbashi", +"bind", +"binder", +"bindery", +"bindheimite", +"binding", +"bindingly", +"bindingness", +"bindle", +"bindlet", +"bindoree", +"bindweb", +"bindweed", +"bindwith", +"bindwood", +"bine", +"binervate", +"bineweed", +"bing", +"binge", +"bingey", +"binghi", +"bingle", +"bingo", +"bingy", +"binh", +"Bini", +"biniodide", +"Binitarian", +"Binitarianism", +"bink", +"binman", +"binna", +"binnacle", +"binning", +"binnite", +"binnogue", +"bino", +"binocle", +"binocular", +"binocularity", +"binocularly", +"binoculate", +"binodal", +"binode", +"binodose", +"binodous", +"binomenclature", +"binomial", +"binomialism", +"binomially", +"binominal", +"binominated", +"binominous", +"binormal", +"binotic", +"binotonous", +"binous", +"binoxalate", +"binoxide", +"bint", +"bintangor", +"binturong", +"binuclear", +"binucleate", +"binucleated", +"binucleolate", +"binukau", +"Binzuru", +"biobibliographical", +"biobibliography", +"bioblast", +"bioblastic", +"biocatalyst", +"biocellate", +"biocentric", +"biochemic", +"biochemical", +"biochemically", +"biochemics", +"biochemist", +"biochemistry", +"biochemy", +"biochore", +"bioclimatic", +"bioclimatology", +"biocoenose", +"biocoenosis", +"biocoenotic", +"biocycle", +"biod", +"biodynamic", +"biodynamical", +"biodynamics", +"biodyne", +"bioecologic", +"bioecological", +"bioecologically", +"bioecologist", +"bioecology", +"biogen", +"biogenase", +"biogenesis", +"biogenesist", +"biogenetic", +"biogenetical", +"biogenetically", +"biogenetics", +"biogenous", +"biogeny", +"biogeochemistry", +"biogeographic", +"biogeographical", +"biogeographically", +"biogeography", +"biognosis", +"biograph", +"biographee", +"biographer", +"biographic", +"biographical", +"biographically", +"biographist", +"biographize", +"biography", +"bioherm", +"biokinetics", +"biolinguistics", +"biolith", +"biologese", +"biologic", +"biological", +"biologically", +"biologicohumanistic", +"biologism", +"biologist", +"biologize", +"biology", +"bioluminescence", +"bioluminescent", +"biolysis", +"biolytic", +"biomagnetic", +"biomagnetism", +"biomathematics", +"biome", +"biomechanical", +"biomechanics", +"biometeorology", +"biometer", +"biometric", +"biometrical", +"biometrically", +"biometrician", +"biometricist", +"biometrics", +"biometry", +"biomicroscopy", +"bion", +"bionergy", +"bionomic", +"bionomical", +"bionomically", +"bionomics", +"bionomist", +"bionomy", +"biophagism", +"biophagous", +"biophagy", +"biophilous", +"biophore", +"biophotophone", +"biophysical", +"biophysicochemical", +"biophysics", +"biophysiography", +"biophysiological", +"biophysiologist", +"biophysiology", +"biophyte", +"bioplasm", +"bioplasmic", +"bioplast", +"bioplastic", +"bioprecipitation", +"biopsic", +"biopsy", +"biopsychic", +"biopsychical", +"biopsychological", +"biopsychologist", +"biopsychology", +"biopyribole", +"bioral", +"biorbital", +"biordinal", +"bioreaction", +"biorgan", +"bios", +"bioscope", +"bioscopic", +"bioscopy", +"biose", +"biosis", +"biosocial", +"biosociological", +"biosphere", +"biostatic", +"biostatical", +"biostatics", +"biostatistics", +"biosterin", +"biosterol", +"biostratigraphy", +"biosynthesis", +"biosynthetic", +"biosystematic", +"biosystematics", +"biosystematist", +"biosystematy", +"Biota", +"biota", +"biotaxy", +"biotechnics", +"biotic", +"biotical", +"biotics", +"biotin", +"biotite", +"biotitic", +"biotome", +"biotomy", +"biotope", +"biotype", +"biotypic", +"biovular", +"biovulate", +"bioxalate", +"bioxide", +"bipack", +"bipaleolate", +"Bipaliidae", +"Bipalium", +"bipalmate", +"biparasitic", +"biparental", +"biparietal", +"biparous", +"biparted", +"bipartible", +"bipartient", +"bipartile", +"bipartisan", +"bipartisanship", +"bipartite", +"bipartitely", +"bipartition", +"biparty", +"bipaschal", +"bipectinate", +"bipectinated", +"biped", +"bipedal", +"bipedality", +"bipedism", +"bipeltate", +"bipennate", +"bipennated", +"bipenniform", +"biperforate", +"bipersonal", +"bipetalous", +"biphase", +"biphasic", +"biphenol", +"biphenyl", +"biphenylene", +"bipinnaria", +"bipinnate", +"bipinnated", +"bipinnately", +"bipinnatifid", +"bipinnatiparted", +"bipinnatipartite", +"bipinnatisect", +"bipinnatisected", +"biplanal", +"biplanar", +"biplane", +"biplicate", +"biplicity", +"biplosion", +"biplosive", +"bipod", +"bipolar", +"bipolarity", +"bipolarize", +"Bipont", +"Bipontine", +"biporose", +"biporous", +"biprism", +"biprong", +"bipunctal", +"bipunctate", +"bipunctual", +"bipupillate", +"bipyramid", +"bipyramidal", +"bipyridine", +"bipyridyl", +"biquadrantal", +"biquadrate", +"biquadratic", +"biquarterly", +"biquartz", +"biquintile", +"biracial", +"biracialism", +"biradial", +"biradiate", +"biradiated", +"biramous", +"birational", +"birch", +"birchbark", +"birchen", +"birching", +"birchman", +"birchwood", +"bird", +"birdbander", +"birdbanding", +"birdbath", +"birdberry", +"birdcall", +"birdcatcher", +"birdcatching", +"birdclapper", +"birdcraft", +"birddom", +"birdeen", +"birder", +"birdglue", +"birdhood", +"birdhouse", +"birdie", +"birdikin", +"birding", +"birdland", +"birdless", +"birdlet", +"birdlike", +"birdlime", +"birdling", +"birdlore", +"birdman", +"birdmouthed", +"birdnest", +"birdnester", +"birdseed", +"birdstone", +"birdweed", +"birdwise", +"birdwoman", +"birdy", +"birectangular", +"birefracting", +"birefraction", +"birefractive", +"birefringence", +"birefringent", +"bireme", +"biretta", +"Birgus", +"biri", +"biriba", +"birimose", +"birk", +"birken", +"Birkenhead", +"Birkenia", +"Birkeniidae", +"birkie", +"birkremite", +"birl", +"birle", +"birler", +"birlie", +"birlieman", +"birlinn", +"birma", +"Birmingham", +"Birminghamize", +"birn", +"birny", +"Biron", +"birostrate", +"birostrated", +"birotation", +"birotatory", +"birr", +"birse", +"birsle", +"birsy", +"birth", +"birthbed", +"birthday", +"birthland", +"birthless", +"birthmark", +"birthmate", +"birthnight", +"birthplace", +"birthright", +"birthroot", +"birthstone", +"birthstool", +"birthwort", +"birthy", +"bis", +"bisabol", +"bisaccate", +"bisacromial", +"bisalt", +"Bisaltae", +"bisantler", +"bisaxillary", +"bisbeeite", +"biscacha", +"Biscanism", +"Biscayan", +"Biscayanism", +"biscayen", +"Biscayner", +"bischofite", +"biscotin", +"biscuit", +"biscuiting", +"biscuitlike", +"biscuitmaker", +"biscuitmaking", +"biscuitroot", +"biscuitry", +"bisdiapason", +"bisdimethylamino", +"bisect", +"bisection", +"bisectional", +"bisectionally", +"bisector", +"bisectrices", +"bisectrix", +"bisegment", +"biseptate", +"biserial", +"biserially", +"biseriate", +"biseriately", +"biserrate", +"bisetose", +"bisetous", +"bisexed", +"bisext", +"bisexual", +"bisexualism", +"bisexuality", +"bisexually", +"bisexuous", +"bisglyoxaline", +"Bishareen", +"Bishari", +"Bisharin", +"bishop", +"bishopdom", +"bishopess", +"bishopful", +"bishophood", +"bishopless", +"bishoplet", +"bishoplike", +"bishopling", +"bishopric", +"bishopship", +"bishopweed", +"bisiliac", +"bisilicate", +"bisiliquous", +"bisimine", +"bisinuate", +"bisinuation", +"bisischiadic", +"bisischiatic", +"Bisley", +"bislings", +"bismar", +"Bismarck", +"Bismarckian", +"Bismarckianism", +"bismarine", +"bismerpund", +"bismillah", +"bismite", +"Bismosol", +"bismuth", +"bismuthal", +"bismuthate", +"bismuthic", +"bismuthide", +"bismuthiferous", +"bismuthine", +"bismuthinite", +"bismuthite", +"bismuthous", +"bismuthyl", +"bismutite", +"bismutoplagionite", +"bismutosmaltite", +"bismutosphaerite", +"bisnaga", +"bison", +"bisonant", +"bisontine", +"bisphenoid", +"bispinose", +"bispinous", +"bispore", +"bisporous", +"bisque", +"bisquette", +"bissext", +"bissextile", +"bisson", +"bistate", +"bistephanic", +"bister", +"bistered", +"bistetrazole", +"bisti", +"bistipular", +"bistipulate", +"bistipuled", +"bistort", +"Bistorta", +"bistournage", +"bistoury", +"bistratal", +"bistratose", +"bistriate", +"bistriazole", +"bistro", +"bisubstituted", +"bisubstitution", +"bisulcate", +"bisulfid", +"bisulphate", +"bisulphide", +"bisulphite", +"bisyllabic", +"bisyllabism", +"bisymmetric", +"bisymmetrical", +"bisymmetrically", +"bisymmetry", +"bit", +"bitable", +"bitangent", +"bitangential", +"bitanhol", +"bitartrate", +"bitbrace", +"bitch", +"bite", +"bitemporal", +"bitentaculate", +"biter", +"biternate", +"biternately", +"bitesheep", +"bitewing", +"bitheism", +"Bithynian", +"biti", +"biting", +"bitingly", +"bitingness", +"Bitis", +"bitless", +"bito", +"bitolyl", +"bitonality", +"bitreadle", +"bitripartite", +"bitripinnatifid", +"bitriseptate", +"bitrochanteric", +"bitstock", +"bitstone", +"bitt", +"bitted", +"bitten", +"bitter", +"bitterbark", +"bitterblain", +"bitterbloom", +"bitterbur", +"bitterbush", +"bitterful", +"bitterhead", +"bitterhearted", +"bitterheartedness", +"bittering", +"bitterish", +"bitterishness", +"bitterless", +"bitterling", +"bitterly", +"bittern", +"bitterness", +"bitternut", +"bitterroot", +"bitters", +"bittersweet", +"bitterweed", +"bitterwood", +"bitterworm", +"bitterwort", +"bitthead", +"bittie", +"Bittium", +"bittock", +"bitty", +"bitubercular", +"bituberculate", +"bituberculated", +"Bitulithic", +"bitulithic", +"bitume", +"bitumed", +"bitumen", +"bituminate", +"bituminiferous", +"bituminization", +"bituminize", +"bituminoid", +"bituminous", +"bitwise", +"bityite", +"bitypic", +"biune", +"biunial", +"biunity", +"biunivocal", +"biurate", +"biurea", +"biuret", +"bivalence", +"bivalency", +"bivalent", +"bivalve", +"bivalved", +"Bivalvia", +"bivalvian", +"bivalvous", +"bivalvular", +"bivariant", +"bivariate", +"bivascular", +"bivaulted", +"bivector", +"biventer", +"biventral", +"biverbal", +"bivinyl", +"bivious", +"bivittate", +"bivocal", +"bivocalized", +"bivoltine", +"bivoluminous", +"bivouac", +"biwa", +"biweekly", +"biwinter", +"Bixa", +"Bixaceae", +"bixaceous", +"bixbyite", +"bixin", +"biyearly", +"biz", +"bizardite", +"bizarre", +"bizarrely", +"bizarreness", +"Bizen", +"bizet", +"bizonal", +"bizone", +"Bizonia", +"bizygomatic", +"bizz", +"blab", +"blabber", +"blabberer", +"blachong", +"black", +"blackacre", +"blackamoor", +"blackback", +"blackball", +"blackballer", +"blackband", +"Blackbeard", +"blackbelly", +"blackberry", +"blackbine", +"blackbird", +"blackbirder", +"blackbirding", +"blackboard", +"blackboy", +"blackbreast", +"blackbush", +"blackbutt", +"blackcap", +"blackcoat", +"blackcock", +"blackdamp", +"blacken", +"blackener", +"blackening", +"blacker", +"blacketeer", +"blackey", +"blackeyes", +"blackface", +"Blackfeet", +"blackfellow", +"blackfellows", +"blackfin", +"blackfire", +"blackfish", +"blackfisher", +"blackfishing", +"Blackfoot", +"blackfoot", +"Blackfriars", +"blackguard", +"blackguardism", +"blackguardize", +"blackguardly", +"blackguardry", +"Blackhander", +"blackhead", +"blackheads", +"blackheart", +"blackhearted", +"blackheartedness", +"blackie", +"blacking", +"blackish", +"blackishly", +"blackishness", +"blackit", +"blackjack", +"blackland", +"blackleg", +"blackleggery", +"blacklegism", +"blacklegs", +"blackly", +"blackmail", +"blackmailer", +"blackneb", +"blackneck", +"blackness", +"blacknob", +"blackout", +"blackpoll", +"blackroot", +"blackseed", +"blackshirted", +"blacksmith", +"blacksmithing", +"blackstick", +"blackstrap", +"blacktail", +"blackthorn", +"blacktongue", +"blacktree", +"blackwash", +"blackwasher", +"blackwater", +"blackwood", +"blackwork", +"blackwort", +"blacky", +"blad", +"bladder", +"bladderet", +"bladderless", +"bladderlike", +"bladdernose", +"bladdernut", +"bladderpod", +"bladderseed", +"bladderweed", +"bladderwort", +"bladdery", +"blade", +"bladebone", +"bladed", +"bladelet", +"bladelike", +"blader", +"bladesmith", +"bladewise", +"blading", +"bladish", +"blady", +"bladygrass", +"blae", +"blaeberry", +"blaeness", +"blaewort", +"blaff", +"blaffert", +"blaflum", +"blah", +"blahlaut", +"blain", +"blair", +"blairmorite", +"Blake", +"blake", +"blakeberyed", +"blamable", +"blamableness", +"blamably", +"blame", +"blamed", +"blameful", +"blamefully", +"blamefulness", +"blameless", +"blamelessly", +"blamelessness", +"blamer", +"blameworthiness", +"blameworthy", +"blaming", +"blamingly", +"blan", +"blanc", +"blanca", +"blancard", +"Blanch", +"blanch", +"blancher", +"blanching", +"blanchingly", +"blancmange", +"blancmanger", +"blanco", +"bland", +"blanda", +"Blandfordia", +"blandiloquence", +"blandiloquious", +"blandiloquous", +"blandish", +"blandisher", +"blandishing", +"blandishingly", +"blandishment", +"blandly", +"blandness", +"blank", +"blankard", +"blankbook", +"blanked", +"blankeel", +"blanket", +"blanketed", +"blanketeer", +"blanketflower", +"blanketing", +"blanketless", +"blanketmaker", +"blanketmaking", +"blanketry", +"blanketweed", +"blankety", +"blanking", +"blankish", +"Blankit", +"blankite", +"blankly", +"blankness", +"blanky", +"blanque", +"blanquillo", +"blare", +"Blarina", +"blarney", +"blarneyer", +"blarnid", +"blarny", +"blart", +"blas", +"blase", +"blash", +"blashy", +"Blasia", +"blaspheme", +"blasphemer", +"blasphemous", +"blasphemously", +"blasphemousness", +"blasphemy", +"blast", +"blasted", +"blastema", +"blastemal", +"blastematic", +"blastemic", +"blaster", +"blastful", +"blasthole", +"blastid", +"blastie", +"blasting", +"blastment", +"blastocarpous", +"blastocheme", +"blastochyle", +"blastocoele", +"blastocolla", +"blastocyst", +"blastocyte", +"blastoderm", +"blastodermatic", +"blastodermic", +"blastodisk", +"blastogenesis", +"blastogenetic", +"blastogenic", +"blastogeny", +"blastogranitic", +"blastoid", +"Blastoidea", +"blastoma", +"blastomata", +"blastomere", +"blastomeric", +"Blastomyces", +"blastomycete", +"Blastomycetes", +"blastomycetic", +"blastomycetous", +"blastomycosis", +"blastomycotic", +"blastoneuropore", +"Blastophaga", +"blastophitic", +"blastophoral", +"blastophore", +"blastophoric", +"blastophthoria", +"blastophthoric", +"blastophyllum", +"blastoporal", +"blastopore", +"blastoporic", +"blastoporphyritic", +"blastosphere", +"blastospheric", +"blastostylar", +"blastostyle", +"blastozooid", +"blastplate", +"blastula", +"blastulae", +"blastular", +"blastulation", +"blastule", +"blasty", +"blat", +"blatancy", +"blatant", +"blatantly", +"blate", +"blately", +"blateness", +"blather", +"blatherer", +"blatherskite", +"blathery", +"blatjang", +"Blatta", +"blatta", +"Blattariae", +"blatter", +"blatterer", +"blatti", +"blattid", +"Blattidae", +"blattiform", +"Blattodea", +"blattoid", +"Blattoidea", +"blaubok", +"Blaugas", +"blauwbok", +"blaver", +"blaw", +"blawort", +"blay", +"blaze", +"blazer", +"blazing", +"blazingly", +"blazon", +"blazoner", +"blazoning", +"blazonment", +"blazonry", +"blazy", +"bleaberry", +"bleach", +"bleachability", +"bleachable", +"bleached", +"bleacher", +"bleacherite", +"bleacherman", +"bleachery", +"bleachfield", +"bleachground", +"bleachhouse", +"bleaching", +"bleachman", +"bleachworks", +"bleachyard", +"bleak", +"bleakish", +"bleakly", +"bleakness", +"bleaky", +"blear", +"bleared", +"blearedness", +"bleareye", +"bleariness", +"blearness", +"bleary", +"bleat", +"bleater", +"bleating", +"bleatingly", +"bleaty", +"bleb", +"blebby", +"blechnoid", +"Blechnum", +"bleck", +"blee", +"bleed", +"bleeder", +"bleeding", +"bleekbok", +"bleery", +"bleeze", +"bleezy", +"blellum", +"blemish", +"blemisher", +"blemishment", +"Blemmyes", +"blench", +"blencher", +"blenching", +"blenchingly", +"blencorn", +"blend", +"blendcorn", +"blende", +"blended", +"blender", +"blending", +"blendor", +"blendure", +"blendwater", +"blennadenitis", +"blennemesis", +"blennenteria", +"blennenteritis", +"blenniid", +"Blenniidae", +"blenniiform", +"Blenniiformes", +"blennioid", +"Blennioidea", +"blennocele", +"blennocystitis", +"blennoemesis", +"blennogenic", +"blennogenous", +"blennoid", +"blennoma", +"blennometritis", +"blennophlogisma", +"blennophlogosis", +"blennophthalmia", +"blennoptysis", +"blennorrhagia", +"blennorrhagic", +"blennorrhea", +"blennorrheal", +"blennorrhinia", +"blennosis", +"blennostasis", +"blennostatic", +"blennothorax", +"blennotorrhea", +"blennuria", +"blenny", +"blennymenitis", +"blent", +"bleo", +"blephara", +"blepharadenitis", +"blepharal", +"blepharanthracosis", +"blepharedema", +"blepharelcosis", +"blepharemphysema", +"Blephariglottis", +"blepharism", +"blepharitic", +"blepharitis", +"blepharoadenitis", +"blepharoadenoma", +"blepharoatheroma", +"blepharoblennorrhea", +"blepharocarcinoma", +"Blepharocera", +"Blepharoceridae", +"blepharochalasis", +"blepharochromidrosis", +"blepharoclonus", +"blepharocoloboma", +"blepharoconjunctivitis", +"blepharodiastasis", +"blepharodyschroia", +"blepharohematidrosis", +"blepharolithiasis", +"blepharomelasma", +"blepharoncosis", +"blepharoncus", +"blepharophimosis", +"blepharophryplasty", +"blepharophthalmia", +"blepharophyma", +"blepharoplast", +"blepharoplastic", +"blepharoplasty", +"blepharoplegia", +"blepharoptosis", +"blepharopyorrhea", +"blepharorrhaphy", +"blepharospasm", +"blepharospath", +"blepharosphincterectomy", +"blepharostat", +"blepharostenosis", +"blepharosymphysis", +"blepharosyndesmitis", +"blepharosynechia", +"blepharotomy", +"blepharydatis", +"Blephillia", +"blesbok", +"blesbuck", +"bless", +"blessed", +"blessedly", +"blessedness", +"blesser", +"blessing", +"blessingly", +"blest", +"blet", +"bletheration", +"Bletia", +"Bletilla", +"blewits", +"blibe", +"blick", +"blickey", +"Blighia", +"blight", +"blightbird", +"blighted", +"blighter", +"blighting", +"blightingly", +"blighty", +"blimbing", +"blimp", +"blimy", +"blind", +"blindage", +"blindball", +"blinded", +"blindedly", +"blinder", +"blindeyes", +"blindfast", +"blindfish", +"blindfold", +"blindfolded", +"blindfoldedness", +"blindfolder", +"blindfoldly", +"blinding", +"blindingly", +"blindish", +"blindless", +"blindling", +"blindly", +"blindness", +"blindstory", +"blindweed", +"blindworm", +"blink", +"blinkard", +"blinked", +"blinker", +"blinkered", +"blinking", +"blinkingly", +"blinks", +"blinky", +"blinter", +"blintze", +"blip", +"bliss", +"blissful", +"blissfully", +"blissfulness", +"blissless", +"blissom", +"blister", +"blistered", +"blistering", +"blisteringly", +"blisterweed", +"blisterwort", +"blistery", +"blite", +"blithe", +"blithebread", +"blitheful", +"blithefully", +"blithehearted", +"blithelike", +"blithely", +"blithemeat", +"blithen", +"blitheness", +"blither", +"blithering", +"blithesome", +"blithesomely", +"blithesomeness", +"blitter", +"Blitum", +"blitz", +"blitzbuggy", +"blitzkrieg", +"blizz", +"blizzard", +"blizzardly", +"blizzardous", +"blizzardy", +"blo", +"bloat", +"bloated", +"bloatedness", +"bloater", +"bloating", +"blob", +"blobbed", +"blobber", +"blobby", +"bloc", +"block", +"blockade", +"blockader", +"blockage", +"blockbuster", +"blocked", +"blocker", +"blockhead", +"blockheaded", +"blockheadedly", +"blockheadedness", +"blockheadish", +"blockheadishness", +"blockheadism", +"blockholer", +"blockhouse", +"blockiness", +"blocking", +"blockish", +"blockishly", +"blockishness", +"blocklayer", +"blocklike", +"blockmaker", +"blockmaking", +"blockman", +"blockpate", +"blockship", +"blocky", +"blodite", +"bloke", +"blolly", +"blomstrandine", +"blonde", +"blondeness", +"blondine", +"blood", +"bloodalley", +"bloodalp", +"bloodbeat", +"bloodberry", +"bloodbird", +"bloodcurdler", +"bloodcurdling", +"blooddrop", +"blooddrops", +"blooded", +"bloodfin", +"bloodflower", +"bloodguilt", +"bloodguiltiness", +"bloodguiltless", +"bloodguilty", +"bloodhound", +"bloodied", +"bloodily", +"bloodiness", +"bloodleaf", +"bloodless", +"bloodlessly", +"bloodlessness", +"bloodletter", +"bloodletting", +"bloodline", +"bloodmobile", +"bloodmonger", +"bloodnoun", +"bloodripe", +"bloodripeness", +"bloodroot", +"bloodshed", +"bloodshedder", +"bloodshedding", +"bloodshot", +"bloodshotten", +"bloodspiller", +"bloodspilling", +"bloodstain", +"bloodstained", +"bloodstainedness", +"bloodstanch", +"bloodstock", +"bloodstone", +"bloodstroke", +"bloodsuck", +"bloodsucker", +"bloodsucking", +"bloodthirst", +"bloodthirster", +"bloodthirstily", +"bloodthirstiness", +"bloodthirsting", +"bloodthirsty", +"bloodweed", +"bloodwite", +"bloodwood", +"bloodworm", +"bloodwort", +"bloodworthy", +"bloody", +"bloodybones", +"blooey", +"bloom", +"bloomage", +"bloomer", +"Bloomeria", +"bloomerism", +"bloomers", +"bloomery", +"bloomfell", +"blooming", +"bloomingly", +"bloomingness", +"bloomkin", +"bloomless", +"Bloomsburian", +"Bloomsbury", +"bloomy", +"bloop", +"blooper", +"blooping", +"blore", +"blosmy", +"blossom", +"blossombill", +"blossomed", +"blossomhead", +"blossomless", +"blossomry", +"blossomtime", +"blossomy", +"blot", +"blotch", +"blotched", +"blotchy", +"blotless", +"blotter", +"blottesque", +"blottesquely", +"blotting", +"blottingly", +"blotto", +"blotty", +"bloubiskop", +"blouse", +"bloused", +"blousing", +"blout", +"blow", +"blowback", +"blowball", +"blowcock", +"blowdown", +"blowen", +"blower", +"blowfish", +"blowfly", +"blowgun", +"blowhard", +"blowhole", +"blowiness", +"blowing", +"blowings", +"blowiron", +"blowlamp", +"blowline", +"blown", +"blowoff", +"blowout", +"blowpipe", +"blowpoint", +"blowproof", +"blowspray", +"blowth", +"blowtorch", +"blowtube", +"blowup", +"blowy", +"blowze", +"blowzed", +"blowzing", +"blowzy", +"blub", +"blubber", +"blubberer", +"blubbering", +"blubberingly", +"blubberman", +"blubberous", +"blubbery", +"blucher", +"bludgeon", +"bludgeoned", +"bludgeoneer", +"bludgeoner", +"blue", +"blueback", +"bluebead", +"Bluebeard", +"bluebeard", +"Bluebeardism", +"bluebell", +"bluebelled", +"blueberry", +"bluebill", +"bluebird", +"blueblaw", +"bluebonnet", +"bluebook", +"bluebottle", +"bluebreast", +"bluebuck", +"bluebush", +"bluebutton", +"bluecap", +"bluecoat", +"bluecup", +"bluefish", +"bluegill", +"bluegown", +"bluegrass", +"bluehearted", +"bluehearts", +"blueing", +"bluejack", +"bluejacket", +"bluejoint", +"blueleg", +"bluelegs", +"bluely", +"blueness", +"bluenose", +"Bluenoser", +"blueprint", +"blueprinter", +"bluer", +"blues", +"bluesides", +"bluestem", +"bluestocking", +"bluestockingish", +"bluestockingism", +"bluestone", +"bluestoner", +"bluet", +"bluethroat", +"bluetongue", +"bluetop", +"blueweed", +"bluewing", +"bluewood", +"bluey", +"bluff", +"bluffable", +"bluffer", +"bluffly", +"bluffness", +"bluffy", +"bluggy", +"bluing", +"bluish", +"bluishness", +"bluism", +"Blumea", +"blunder", +"blunderbuss", +"blunderer", +"blunderful", +"blunderhead", +"blunderheaded", +"blunderheadedness", +"blundering", +"blunderingly", +"blundersome", +"blunge", +"blunger", +"blunk", +"blunker", +"blunks", +"blunnen", +"blunt", +"blunter", +"blunthead", +"blunthearted", +"bluntie", +"bluntish", +"bluntly", +"bluntness", +"blup", +"blur", +"blurb", +"blurbist", +"blurred", +"blurredness", +"blurrer", +"blurry", +"blurt", +"blush", +"blusher", +"blushful", +"blushfully", +"blushfulness", +"blushiness", +"blushing", +"blushingly", +"blushless", +"blushwort", +"blushy", +"bluster", +"blusteration", +"blusterer", +"blustering", +"blusteringly", +"blusterous", +"blusterously", +"blustery", +"blype", +"bo", +"boa", +"Boaedon", +"boagane", +"Boanbura", +"Boanerges", +"boanergism", +"boar", +"boarcite", +"board", +"boardable", +"boarder", +"boarding", +"boardinghouse", +"boardlike", +"boardly", +"boardman", +"boardwalk", +"boardy", +"boarfish", +"boarhound", +"boarish", +"boarishly", +"boarishness", +"boarship", +"boarskin", +"boarspear", +"boarstaff", +"boarwood", +"boast", +"boaster", +"boastful", +"boastfully", +"boastfulness", +"boasting", +"boastive", +"boastless", +"boat", +"boatable", +"boatage", +"boatbill", +"boatbuilder", +"boatbuilding", +"boater", +"boatfalls", +"boatful", +"boathead", +"boatheader", +"boathouse", +"boatie", +"boating", +"boatkeeper", +"boatless", +"boatlike", +"boatlip", +"boatload", +"boatloader", +"boatloading", +"boatly", +"boatman", +"boatmanship", +"boatmaster", +"boatowner", +"boatsetter", +"boatshop", +"boatside", +"boatsman", +"boatswain", +"boattail", +"boatward", +"boatwise", +"boatwoman", +"boatwright", +"Bob", +"bob", +"boba", +"bobac", +"Bobadil", +"Bobadilian", +"Bobadilish", +"Bobadilism", +"bobbed", +"bobber", +"bobbery", +"bobbin", +"bobbiner", +"bobbinet", +"bobbing", +"Bobbinite", +"bobbinwork", +"bobbish", +"bobbishly", +"bobble", +"bobby", +"bobcat", +"bobcoat", +"bobeche", +"bobfly", +"bobierrite", +"bobization", +"bobjerom", +"bobo", +"bobolink", +"bobotie", +"bobsled", +"bobsleigh", +"bobstay", +"bobtail", +"bobtailed", +"bobwhite", +"bobwood", +"bocaccio", +"bocal", +"bocardo", +"bocasine", +"bocca", +"boccale", +"boccarella", +"boccaro", +"bocce", +"Bocconia", +"boce", +"bocedization", +"Boche", +"bocher", +"Bochism", +"bock", +"bockerel", +"bockeret", +"bocking", +"bocoy", +"bod", +"bodach", +"bodacious", +"bodaciously", +"bode", +"bodeful", +"bodega", +"bodement", +"boden", +"bodenbenderite", +"boder", +"bodewash", +"bodge", +"bodger", +"bodgery", +"bodhi", +"bodhisattva", +"bodice", +"bodiced", +"bodicemaker", +"bodicemaking", +"bodied", +"bodier", +"bodieron", +"bodikin", +"bodiless", +"bodilessness", +"bodiliness", +"bodily", +"bodiment", +"boding", +"bodingly", +"bodkin", +"bodkinwise", +"bodle", +"Bodleian", +"Bodo", +"bodock", +"Bodoni", +"body", +"bodybending", +"bodybuilder", +"bodyguard", +"bodyhood", +"bodyless", +"bodymaker", +"bodymaking", +"bodyplate", +"bodywise", +"bodywood", +"bodywork", +"Boebera", +"Boedromion", +"Boehmenism", +"Boehmenist", +"Boehmenite", +"Boehmeria", +"boeotarch", +"Boeotian", +"Boeotic", +"Boer", +"Boerdom", +"Boerhavia", +"Boethian", +"Boethusian", +"bog", +"boga", +"bogan", +"bogard", +"bogart", +"bogberry", +"bogey", +"bogeyman", +"boggart", +"boggin", +"bogginess", +"boggish", +"boggle", +"bogglebo", +"boggler", +"boggy", +"boghole", +"bogie", +"bogieman", +"bogier", +"Bogijiab", +"bogland", +"boglander", +"bogle", +"bogledom", +"boglet", +"bogman", +"bogmire", +"Bogo", +"bogo", +"Bogomil", +"Bogomile", +"Bogomilian", +"bogong", +"Bogota", +"bogsucker", +"bogtrot", +"bogtrotter", +"bogtrotting", +"bogue", +"bogum", +"bogus", +"bogusness", +"bogway", +"bogwood", +"bogwort", +"bogy", +"bogydom", +"bogyism", +"bogyland", +"Bohairic", +"bohawn", +"bohea", +"Bohemia", +"Bohemian", +"Bohemianism", +"bohemium", +"bohereen", +"bohireen", +"boho", +"bohor", +"bohunk", +"boid", +"Boidae", +"Boii", +"Boiko", +"boil", +"boilable", +"boildown", +"boiled", +"boiler", +"boilerful", +"boilerhouse", +"boilerless", +"boilermaker", +"boilermaking", +"boilerman", +"boilersmith", +"boilerworks", +"boilery", +"boiling", +"boilinglike", +"boilingly", +"boilover", +"boily", +"Bois", +"boist", +"boisterous", +"boisterously", +"boisterousness", +"bojite", +"bojo", +"bokadam", +"bokard", +"bokark", +"boke", +"Bokhara", +"Bokharan", +"bokom", +"bola", +"Bolag", +"bolar", +"Bolboxalis", +"bold", +"bolden", +"Bolderian", +"boldhearted", +"boldine", +"boldly", +"boldness", +"boldo", +"Boldu", +"bole", +"bolection", +"bolectioned", +"boled", +"boleite", +"Bolelia", +"bolelike", +"bolero", +"Boletaceae", +"boletaceous", +"bolete", +"Boletus", +"boleweed", +"bolewort", +"bolide", +"bolimba", +"bolis", +"bolivar", +"bolivarite", +"bolivia", +"Bolivian", +"boliviano", +"bolk", +"boll", +"Bollandist", +"bollard", +"bolled", +"boller", +"bolling", +"bollock", +"bollworm", +"bolly", +"Bolo", +"bolo", +"Bologna", +"Bolognan", +"Bolognese", +"bolograph", +"bolographic", +"bolographically", +"bolography", +"Boloism", +"boloman", +"bolometer", +"bolometric", +"boloney", +"boloroot", +"Bolshevik", +"Bolsheviki", +"Bolshevikian", +"Bolshevism", +"Bolshevist", +"Bolshevistic", +"Bolshevistically", +"Bolshevize", +"Bolshie", +"bolson", +"bolster", +"bolsterer", +"bolsterwork", +"bolt", +"boltage", +"boltant", +"boltcutter", +"boltel", +"bolter", +"bolthead", +"boltheader", +"boltheading", +"bolthole", +"bolti", +"bolting", +"boltless", +"boltlike", +"boltmaker", +"boltmaking", +"Boltonia", +"boltonite", +"boltrope", +"boltsmith", +"boltstrake", +"boltuprightness", +"boltwork", +"bolus", +"Bolyaian", +"bom", +"boma", +"Bomarea", +"bomb", +"bombable", +"Bombacaceae", +"bombacaceous", +"bombard", +"bombarde", +"bombardelle", +"bombarder", +"bombardier", +"bombardment", +"bombardon", +"bombast", +"bombaster", +"bombastic", +"bombastically", +"bombastry", +"Bombax", +"Bombay", +"bombazet", +"bombazine", +"bombed", +"bomber", +"bombiccite", +"Bombidae", +"bombilate", +"bombilation", +"Bombinae", +"bombinate", +"bombination", +"bombo", +"bombola", +"bombonne", +"bombous", +"bombproof", +"bombshell", +"bombsight", +"Bombus", +"bombycid", +"Bombycidae", +"bombyciform", +"Bombycilla", +"Bombycillidae", +"Bombycina", +"bombycine", +"Bombyliidae", +"Bombyx", +"Bon", +"bon", +"bonaci", +"bonagh", +"bonaght", +"bonair", +"bonairly", +"bonairness", +"bonally", +"bonang", +"bonanza", +"Bonapartean", +"Bonapartism", +"Bonapartist", +"Bonasa", +"bonasus", +"bonaventure", +"Bonaveria", +"bonavist", +"Bonbo", +"bonbon", +"bonce", +"bond", +"bondage", +"bondager", +"bondar", +"bonded", +"Bondelswarts", +"bonder", +"bonderman", +"bondfolk", +"bondholder", +"bondholding", +"bonding", +"bondless", +"bondman", +"bondmanship", +"bondsman", +"bondstone", +"bondswoman", +"bonduc", +"bondwoman", +"bone", +"boneache", +"bonebinder", +"boneblack", +"bonebreaker", +"boned", +"bonedog", +"bonefish", +"boneflower", +"bonehead", +"boneheaded", +"boneless", +"bonelessly", +"bonelessness", +"bonelet", +"bonelike", +"Bonellia", +"boner", +"boneset", +"bonesetter", +"bonesetting", +"boneshaker", +"boneshaw", +"bonetail", +"bonewood", +"bonework", +"bonewort", +"Boney", +"bonfire", +"bong", +"Bongo", +"bongo", +"bonhomie", +"Boni", +"boniata", +"Boniface", +"bonification", +"boniform", +"bonify", +"boniness", +"boninite", +"bonitarian", +"bonitary", +"bonito", +"bonk", +"bonnaz", +"bonnet", +"bonneted", +"bonneter", +"bonnethead", +"bonnetless", +"bonnetlike", +"bonnetman", +"bonnibel", +"bonnily", +"bonniness", +"Bonny", +"bonny", +"bonnyclabber", +"bonnyish", +"bonnyvis", +"Bononian", +"bonsai", +"bonspiel", +"bontebok", +"bontebuck", +"bontequagga", +"Bontok", +"bonus", +"bonxie", +"bony", +"bonyfish", +"bonze", +"bonzer", +"bonzery", +"bonzian", +"boo", +"boob", +"boobery", +"boobily", +"boobook", +"booby", +"boobyalla", +"boobyish", +"boobyism", +"bood", +"boodie", +"boodle", +"boodledom", +"boodleism", +"boodleize", +"boodler", +"boody", +"boof", +"booger", +"boogiewoogie", +"boohoo", +"boojum", +"book", +"bookable", +"bookbinder", +"bookbindery", +"bookbinding", +"bookboard", +"bookcase", +"bookcraft", +"bookdealer", +"bookdom", +"booked", +"booker", +"bookery", +"bookfold", +"bookful", +"bookholder", +"bookhood", +"bookie", +"bookiness", +"booking", +"bookish", +"bookishly", +"bookishness", +"bookism", +"bookkeeper", +"bookkeeping", +"bookland", +"bookless", +"booklet", +"booklike", +"bookling", +"booklore", +"booklover", +"bookmaker", +"bookmaking", +"Bookman", +"bookman", +"bookmark", +"bookmarker", +"bookmate", +"bookmobile", +"bookmonger", +"bookplate", +"bookpress", +"bookrack", +"bookrest", +"bookroom", +"bookseller", +"booksellerish", +"booksellerism", +"bookselling", +"bookshelf", +"bookshop", +"bookstack", +"bookstall", +"bookstand", +"bookstore", +"bookward", +"bookwards", +"bookways", +"bookwise", +"bookwork", +"bookworm", +"bookwright", +"booky", +"bool", +"Boolian", +"booly", +"boolya", +"boom", +"boomable", +"boomage", +"boomah", +"boomboat", +"boomdas", +"boomer", +"boomerang", +"booming", +"boomingly", +"boomless", +"boomlet", +"boomorah", +"boomslang", +"boomslange", +"boomster", +"boomy", +"boon", +"boondock", +"boondocks", +"boondoggle", +"boondoggler", +"Boone", +"boonfellow", +"boongary", +"boonk", +"boonless", +"Boophilus", +"boopis", +"boor", +"boorish", +"boorishly", +"boorishness", +"boort", +"boose", +"boost", +"booster", +"boosterism", +"boosy", +"boot", +"bootblack", +"bootboy", +"booted", +"bootee", +"booter", +"bootery", +"Bootes", +"bootful", +"booth", +"boother", +"Boothian", +"boothite", +"bootholder", +"boothose", +"Bootid", +"bootied", +"bootikin", +"booting", +"bootjack", +"bootlace", +"bootleg", +"bootlegger", +"bootlegging", +"bootless", +"bootlessly", +"bootlessness", +"bootlick", +"bootlicker", +"bootmaker", +"bootmaking", +"boots", +"bootstrap", +"booty", +"bootyless", +"booze", +"boozed", +"boozer", +"boozily", +"booziness", +"boozy", +"bop", +"bopeep", +"boppist", +"bopyrid", +"Bopyridae", +"bopyridian", +"Bopyrus", +"bor", +"bora", +"borable", +"borachio", +"boracic", +"boraciferous", +"boracous", +"borage", +"Boraginaceae", +"boraginaceous", +"Borago", +"Borak", +"borak", +"boral", +"Boran", +"Borana", +"Borani", +"borasca", +"borasque", +"Borassus", +"borate", +"borax", +"Borboridae", +"Borborus", +"borborygmic", +"borborygmus", +"bord", +"bordage", +"bordar", +"bordarius", +"Bordeaux", +"bordel", +"bordello", +"border", +"bordered", +"borderer", +"Borderies", +"bordering", +"borderism", +"borderland", +"borderlander", +"borderless", +"borderline", +"bordermark", +"Borderside", +"bordroom", +"bordure", +"bordured", +"bore", +"boreable", +"boread", +"Boreades", +"boreal", +"borealis", +"borean", +"Boreas", +"borecole", +"boredom", +"boree", +"boreen", +"boregat", +"borehole", +"Boreiad", +"boreism", +"borele", +"borer", +"boresome", +"Boreus", +"borg", +"borgh", +"borghalpenny", +"Borghese", +"borh", +"boric", +"borickite", +"boride", +"borine", +"boring", +"boringly", +"boringness", +"Borinqueno", +"Boris", +"borish", +"borism", +"bority", +"borize", +"borlase", +"born", +"borne", +"Bornean", +"Borneo", +"borneol", +"borning", +"bornite", +"bornitic", +"bornyl", +"Boro", +"boro", +"Borocaine", +"borocalcite", +"borocarbide", +"borocitrate", +"borofluohydric", +"borofluoric", +"borofluoride", +"borofluorin", +"boroglycerate", +"boroglyceride", +"boroglycerine", +"borolanite", +"boron", +"boronatrocalcite", +"Boronia", +"boronic", +"borophenol", +"borophenylic", +"Bororo", +"Bororoan", +"borosalicylate", +"borosalicylic", +"borosilicate", +"borosilicic", +"borotungstate", +"borotungstic", +"borough", +"boroughlet", +"boroughmaster", +"boroughmonger", +"boroughmongering", +"boroughmongery", +"boroughship", +"borowolframic", +"borracha", +"borrel", +"Borrelia", +"Borrelomycetaceae", +"Borreria", +"Borrichia", +"Borromean", +"Borrovian", +"borrow", +"borrowable", +"borrower", +"borrowing", +"borsch", +"borscht", +"borsholder", +"borsht", +"borstall", +"bort", +"bortsch", +"borty", +"bortz", +"Boruca", +"Borussian", +"borwort", +"boryl", +"Borzicactus", +"borzoi", +"Bos", +"Bosc", +"boscage", +"bosch", +"boschbok", +"Boschneger", +"boschvark", +"boschveld", +"bose", +"Boselaphus", +"boser", +"bosh", +"Boshas", +"bosher", +"Bosjesman", +"bosjesman", +"bosk", +"bosker", +"bosket", +"boskiness", +"bosky", +"bosn", +"Bosniac", +"Bosniak", +"Bosnian", +"Bosnisch", +"bosom", +"bosomed", +"bosomer", +"bosomy", +"Bosporan", +"Bosporanic", +"Bosporian", +"bosporus", +"boss", +"bossage", +"bossdom", +"bossed", +"bosselated", +"bosselation", +"bosser", +"bosset", +"bossiness", +"bossing", +"bossism", +"bosslet", +"bossship", +"bossy", +"bostangi", +"bostanji", +"bosthoon", +"Boston", +"boston", +"Bostonese", +"Bostonian", +"bostonite", +"bostrychid", +"Bostrychidae", +"bostrychoid", +"bostrychoidal", +"bostryx", +"bosun", +"Boswellia", +"Boswellian", +"Boswelliana", +"Boswellism", +"Boswellize", +"bot", +"bota", +"botanic", +"botanical", +"botanically", +"botanist", +"botanize", +"botanizer", +"botanomancy", +"botanophile", +"botanophilist", +"botany", +"botargo", +"Botaurinae", +"Botaurus", +"botch", +"botched", +"botchedly", +"botcher", +"botcherly", +"botchery", +"botchily", +"botchiness", +"botchka", +"botchy", +"bote", +"Botein", +"botella", +"boterol", +"botfly", +"both", +"bother", +"botheration", +"botherer", +"botherheaded", +"botherment", +"bothersome", +"bothlike", +"Bothnian", +"Bothnic", +"bothrenchyma", +"Bothriocephalus", +"Bothriocidaris", +"Bothriolepis", +"bothrium", +"Bothrodendron", +"bothropic", +"Bothrops", +"bothros", +"bothsided", +"bothsidedness", +"bothway", +"bothy", +"Botocudo", +"botonee", +"botong", +"Botrychium", +"Botrydium", +"Botryllidae", +"Botryllus", +"botryogen", +"botryoid", +"botryoidal", +"botryoidally", +"botryolite", +"Botryomyces", +"botryomycoma", +"botryomycosis", +"botryomycotic", +"Botryopteriaceae", +"botryopterid", +"Botryopteris", +"botryose", +"botryotherapy", +"Botrytis", +"bott", +"bottekin", +"Botticellian", +"bottine", +"bottle", +"bottlebird", +"bottled", +"bottleflower", +"bottleful", +"bottlehead", +"bottleholder", +"bottlelike", +"bottlemaker", +"bottlemaking", +"bottleman", +"bottleneck", +"bottlenest", +"bottlenose", +"bottler", +"bottling", +"bottom", +"bottomchrome", +"bottomed", +"bottomer", +"bottoming", +"bottomless", +"bottomlessly", +"bottomlessness", +"bottommost", +"bottomry", +"bottstick", +"botuliform", +"botulin", +"botulinum", +"botulism", +"botulismus", +"bouchal", +"bouchaleen", +"boucharde", +"bouche", +"boucher", +"boucherism", +"boucherize", +"bouchette", +"boud", +"boudoir", +"bouffancy", +"bouffant", +"Bougainvillaea", +"Bougainvillea", +"Bougainvillia", +"Bougainvilliidae", +"bougar", +"bouge", +"bouget", +"bough", +"boughed", +"boughless", +"boughpot", +"bought", +"boughten", +"boughy", +"bougie", +"bouillabaisse", +"bouillon", +"bouk", +"boukit", +"boulangerite", +"Boulangism", +"Boulangist", +"boulder", +"boulderhead", +"bouldering", +"bouldery", +"boule", +"boulevard", +"boulevardize", +"boultel", +"boulter", +"boulterer", +"boun", +"bounce", +"bounceable", +"bounceably", +"bouncer", +"bouncing", +"bouncingly", +"bound", +"boundable", +"boundary", +"bounded", +"boundedly", +"boundedness", +"bounden", +"bounder", +"bounding", +"boundingly", +"boundless", +"boundlessly", +"boundlessness", +"boundly", +"boundness", +"bounteous", +"bounteously", +"bounteousness", +"bountied", +"bountiful", +"bountifully", +"bountifulness", +"bountith", +"bountree", +"bounty", +"bountyless", +"bouquet", +"bourasque", +"Bourbon", +"bourbon", +"Bourbonesque", +"Bourbonian", +"Bourbonism", +"Bourbonist", +"bourbonize", +"bourd", +"bourder", +"bourdon", +"bourette", +"bourg", +"bourgeois", +"bourgeoise", +"bourgeoisie", +"bourgeoisitic", +"Bourignian", +"Bourignianism", +"Bourignianist", +"Bourignonism", +"Bourignonist", +"bourn", +"bournless", +"bournonite", +"bourock", +"Bourout", +"bourse", +"bourtree", +"bouse", +"bouser", +"Boussingaultia", +"boussingaultite", +"boustrophedon", +"boustrophedonic", +"bousy", +"bout", +"boutade", +"Bouteloua", +"bouto", +"boutonniere", +"boutylka", +"Bouvardia", +"bouw", +"bovarism", +"bovarysm", +"bovate", +"bovenland", +"bovicide", +"boviculture", +"bovid", +"Bovidae", +"boviform", +"bovine", +"bovinely", +"bovinity", +"Bovista", +"bovoid", +"bovovaccination", +"bovovaccine", +"bow", +"bowable", +"bowback", +"bowbells", +"bowbent", +"bowboy", +"Bowdichia", +"bowdlerism", +"bowdlerization", +"bowdlerize", +"bowed", +"bowedness", +"bowel", +"boweled", +"bowelless", +"bowellike", +"bowels", +"bowenite", +"bower", +"bowerbird", +"bowerlet", +"bowermaiden", +"bowermay", +"bowerwoman", +"Bowery", +"bowery", +"Boweryish", +"bowet", +"bowfin", +"bowgrace", +"bowhead", +"bowie", +"bowieful", +"bowing", +"bowingly", +"bowk", +"bowkail", +"bowker", +"bowknot", +"bowl", +"bowla", +"bowleg", +"bowlegged", +"bowleggedness", +"bowler", +"bowless", +"bowlful", +"bowlike", +"bowline", +"bowling", +"bowllike", +"bowlmaker", +"bowls", +"bowly", +"bowmaker", +"bowmaking", +"bowman", +"bowpin", +"bowralite", +"bowshot", +"bowsprit", +"bowstave", +"bowstring", +"bowstringed", +"bowwoman", +"bowwood", +"bowwort", +"bowwow", +"bowyer", +"boxberry", +"boxboard", +"boxbush", +"boxcar", +"boxen", +"Boxer", +"boxer", +"Boxerism", +"boxfish", +"boxful", +"boxhaul", +"boxhead", +"boxing", +"boxkeeper", +"boxlike", +"boxmaker", +"boxmaking", +"boxman", +"boxthorn", +"boxty", +"boxwallah", +"boxwood", +"boxwork", +"boxy", +"boy", +"boyang", +"boyar", +"boyard", +"boyardism", +"boyardom", +"boyarism", +"boycott", +"boycottage", +"boycotter", +"boycottism", +"boydom", +"boyer", +"boyhood", +"boyish", +"boyishly", +"boyishness", +"boyism", +"boyla", +"boylike", +"boyology", +"boysenberry", +"boyship", +"boza", +"bozal", +"bozo", +"bozze", +"bra", +"brab", +"brabagious", +"brabant", +"Brabanter", +"Brabantine", +"brabble", +"brabblement", +"brabbler", +"brabblingly", +"Brabejum", +"braca", +"braccate", +"braccia", +"bracciale", +"braccianite", +"braccio", +"brace", +"braced", +"bracelet", +"braceleted", +"bracer", +"bracero", +"braces", +"brach", +"Brachelytra", +"brachelytrous", +"bracherer", +"brachering", +"brachet", +"brachial", +"brachialgia", +"brachialis", +"Brachiata", +"brachiate", +"brachiation", +"brachiator", +"brachiferous", +"brachigerous", +"Brachinus", +"brachiocephalic", +"brachiocrural", +"brachiocubital", +"brachiocyllosis", +"brachiofacial", +"brachiofaciolingual", +"brachioganoid", +"Brachioganoidei", +"brachiolaria", +"brachiolarian", +"brachiopod", +"Brachiopoda", +"brachiopode", +"brachiopodist", +"brachiopodous", +"brachioradial", +"brachioradialis", +"brachiorrhachidian", +"brachiorrheuma", +"brachiosaur", +"Brachiosaurus", +"brachiostrophosis", +"brachiotomy", +"brachistocephali", +"brachistocephalic", +"brachistocephalous", +"brachistocephaly", +"brachistochrone", +"brachistochronic", +"brachistochronous", +"brachium", +"brachtmema", +"brachyaxis", +"brachycardia", +"brachycatalectic", +"brachycephal", +"brachycephalic", +"brachycephalism", +"brachycephalization", +"brachycephalize", +"brachycephalous", +"brachycephaly", +"Brachycera", +"brachyceral", +"brachyceric", +"brachycerous", +"brachychronic", +"brachycnemic", +"Brachycome", +"brachycranial", +"brachydactyl", +"brachydactylic", +"brachydactylism", +"brachydactylous", +"brachydactyly", +"brachydiagonal", +"brachydodrome", +"brachydodromous", +"brachydomal", +"brachydomatic", +"brachydome", +"brachydont", +"brachydontism", +"brachyfacial", +"brachyglossal", +"brachygnathia", +"brachygnathism", +"brachygnathous", +"brachygrapher", +"brachygraphic", +"brachygraphical", +"brachygraphy", +"brachyhieric", +"brachylogy", +"brachymetropia", +"brachymetropic", +"Brachyoura", +"brachyphalangia", +"Brachyphyllum", +"brachypinacoid", +"brachypinacoidal", +"brachypleural", +"brachypnea", +"brachypodine", +"brachypodous", +"brachyprism", +"brachyprosopic", +"brachypterous", +"brachypyramid", +"brachyrrhinia", +"brachysclereid", +"brachyskelic", +"brachysm", +"brachystaphylic", +"Brachystegia", +"brachystochrone", +"Brachystomata", +"brachystomatous", +"brachystomous", +"brachytic", +"brachytypous", +"Brachyura", +"brachyural", +"brachyuran", +"brachyuranic", +"brachyure", +"brachyurous", +"Brachyurus", +"bracing", +"bracingly", +"bracingness", +"brack", +"brackebuschite", +"bracken", +"brackened", +"bracker", +"bracket", +"bracketing", +"bracketwise", +"brackish", +"brackishness", +"brackmard", +"bracky", +"Bracon", +"braconid", +"Braconidae", +"bract", +"bractea", +"bracteal", +"bracteate", +"bracted", +"bracteiform", +"bracteolate", +"bracteole", +"bracteose", +"bractless", +"bractlet", +"brad", +"bradawl", +"Bradbury", +"Bradburya", +"bradenhead", +"bradmaker", +"Bradshaw", +"bradsot", +"bradyacousia", +"bradycardia", +"bradycauma", +"bradycinesia", +"bradycrotic", +"bradydactylia", +"bradyesthesia", +"bradyglossia", +"bradykinesia", +"bradykinetic", +"bradylalia", +"bradylexia", +"bradylogia", +"bradynosus", +"bradypepsia", +"bradypeptic", +"bradyphagia", +"bradyphasia", +"bradyphemia", +"bradyphrasia", +"bradyphrenia", +"bradypnea", +"bradypnoea", +"bradypod", +"bradypode", +"Bradypodidae", +"bradypodoid", +"Bradypus", +"bradyseism", +"bradyseismal", +"bradyseismic", +"bradyseismical", +"bradyseismism", +"bradyspermatism", +"bradysphygmia", +"bradystalsis", +"bradyteleocinesia", +"bradyteleokinesis", +"bradytocia", +"bradytrophic", +"bradyuria", +"brae", +"braeface", +"braehead", +"braeman", +"braeside", +"brag", +"braggardism", +"braggart", +"braggartism", +"braggartly", +"braggartry", +"braggat", +"bragger", +"braggery", +"bragget", +"bragging", +"braggingly", +"braggish", +"braggishly", +"Bragi", +"bragite", +"bragless", +"braguette", +"Brahm", +"Brahma", +"brahmachari", +"Brahmahood", +"Brahmaic", +"Brahman", +"Brahmana", +"Brahmanaspati", +"Brahmanda", +"Brahmaness", +"Brahmanhood", +"Brahmani", +"Brahmanic", +"Brahmanical", +"Brahmanism", +"Brahmanist", +"Brahmanistic", +"Brahmanize", +"Brahmany", +"Brahmi", +"Brahmic", +"Brahmin", +"Brahminic", +"Brahminism", +"Brahmoism", +"Brahmsian", +"Brahmsite", +"Brahui", +"braid", +"braided", +"braider", +"braiding", +"Braidism", +"Braidist", +"brail", +"Braille", +"Braillist", +"brain", +"brainache", +"braincap", +"braincraft", +"brainer", +"brainfag", +"brainge", +"braininess", +"brainless", +"brainlessly", +"brainlessness", +"brainlike", +"brainpan", +"brains", +"brainsick", +"brainsickly", +"brainsickness", +"brainstone", +"brainward", +"brainwash", +"brainwasher", +"brainwashing", +"brainwater", +"brainwood", +"brainwork", +"brainworker", +"brainy", +"braird", +"braireau", +"brairo", +"braise", +"brake", +"brakeage", +"brakehand", +"brakehead", +"brakeless", +"brakeload", +"brakemaker", +"brakemaking", +"brakeman", +"braker", +"brakeroot", +"brakesman", +"brakie", +"braky", +"Bram", +"Bramantesque", +"Bramantip", +"bramble", +"brambleberry", +"bramblebush", +"brambled", +"brambling", +"brambly", +"brambrack", +"Bramia", +"bran", +"brancard", +"branch", +"branchage", +"branched", +"Branchellion", +"brancher", +"branchery", +"branchful", +"branchi", +"branchia", +"branchiae", +"branchial", +"Branchiata", +"branchiate", +"branchicolous", +"branchiferous", +"branchiform", +"branchihyal", +"branchiness", +"branching", +"Branchiobdella", +"branchiocardiac", +"branchiogenous", +"branchiomere", +"branchiomeric", +"branchiomerism", +"branchiopallial", +"branchiopod", +"Branchiopoda", +"branchiopodan", +"branchiopodous", +"Branchiopulmonata", +"branchiopulmonate", +"branchiosaur", +"Branchiosauria", +"branchiosaurian", +"Branchiosaurus", +"branchiostegal", +"Branchiostegidae", +"branchiostegite", +"branchiostegous", +"Branchiostoma", +"branchiostomid", +"Branchiostomidae", +"Branchipodidae", +"Branchipus", +"branchireme", +"Branchiura", +"branchiurous", +"branchless", +"branchlet", +"branchlike", +"branchling", +"branchman", +"branchstand", +"branchway", +"branchy", +"brand", +"branded", +"Brandenburg", +"Brandenburger", +"brander", +"brandering", +"brandied", +"brandify", +"brandise", +"brandish", +"brandisher", +"brandisite", +"brandless", +"brandling", +"brandreth", +"brandy", +"brandyball", +"brandyman", +"brandywine", +"brangle", +"brangled", +"branglement", +"brangler", +"brangling", +"branial", +"brank", +"brankie", +"brankursine", +"branle", +"branner", +"brannerite", +"branny", +"bransle", +"bransolder", +"brant", +"Branta", +"brantail", +"brantness", +"Brasenia", +"brash", +"brashiness", +"brashness", +"brashy", +"brasiletto", +"brasque", +"brass", +"brassage", +"brassard", +"brassart", +"Brassavola", +"brassbound", +"brassbounder", +"brasse", +"brasser", +"brasset", +"Brassia", +"brassic", +"Brassica", +"Brassicaceae", +"brassicaceous", +"brassidic", +"brassie", +"brassiere", +"brassily", +"brassiness", +"brassish", +"brasslike", +"brassware", +"brasswork", +"brassworker", +"brassworks", +"brassy", +"brassylic", +"brat", +"bratling", +"bratstvo", +"brattach", +"brattice", +"bratticer", +"bratticing", +"brattie", +"brattish", +"brattishing", +"brattle", +"brauna", +"Brauneberger", +"Brauneria", +"braunite", +"Brauronia", +"Brauronian", +"Brava", +"bravade", +"bravado", +"bravadoism", +"brave", +"bravehearted", +"bravely", +"braveness", +"braver", +"bravery", +"braving", +"bravish", +"bravo", +"bravoite", +"bravura", +"bravuraish", +"braw", +"brawl", +"brawler", +"brawling", +"brawlingly", +"brawlsome", +"brawly", +"brawlys", +"brawn", +"brawned", +"brawnedness", +"brawner", +"brawnily", +"brawniness", +"brawny", +"braws", +"braxy", +"bray", +"brayer", +"brayera", +"brayerin", +"braystone", +"braza", +"braze", +"brazen", +"brazenface", +"brazenfaced", +"brazenfacedly", +"brazenly", +"brazenness", +"brazer", +"brazera", +"brazier", +"braziery", +"brazil", +"brazilein", +"brazilette", +"Brazilian", +"brazilin", +"brazilite", +"brazilwood", +"breach", +"breacher", +"breachful", +"breachy", +"bread", +"breadbasket", +"breadberry", +"breadboard", +"breadbox", +"breadearner", +"breadearning", +"breaden", +"breadfruit", +"breadless", +"breadlessness", +"breadmaker", +"breadmaking", +"breadman", +"breadnut", +"breadroot", +"breadseller", +"breadstuff", +"breadth", +"breadthen", +"breadthless", +"breadthriders", +"breadthways", +"breadthwise", +"breadwinner", +"breadwinning", +"breaghe", +"break", +"breakable", +"breakableness", +"breakably", +"breakage", +"breakaway", +"breakax", +"breakback", +"breakbones", +"breakdown", +"breaker", +"breakerman", +"breakfast", +"breakfaster", +"breakfastless", +"breaking", +"breakless", +"breakneck", +"breakoff", +"breakout", +"breakover", +"breakshugh", +"breakstone", +"breakthrough", +"breakup", +"breakwater", +"breakwind", +"bream", +"breards", +"breast", +"breastband", +"breastbeam", +"breastbone", +"breasted", +"breaster", +"breastfeeding", +"breastful", +"breastheight", +"breasthook", +"breastie", +"breasting", +"breastless", +"breastmark", +"breastpiece", +"breastpin", +"breastplate", +"breastplow", +"breastrail", +"breastrope", +"breastsummer", +"breastweed", +"breastwise", +"breastwood", +"breastwork", +"breath", +"breathable", +"breathableness", +"breathe", +"breathed", +"breather", +"breathful", +"breathiness", +"breathing", +"breathingly", +"breathless", +"breathlessly", +"breathlessness", +"breathseller", +"breathy", +"breba", +"breccia", +"breccial", +"brecciated", +"brecciation", +"brecham", +"Brechites", +"breck", +"brecken", +"bred", +"bredbergite", +"brede", +"bredi", +"bree", +"breech", +"breechblock", +"breechcloth", +"breechclout", +"breeched", +"breeches", +"breechesflower", +"breechesless", +"breeching", +"breechless", +"breechloader", +"breed", +"breedable", +"breedbate", +"breeder", +"breediness", +"breeding", +"breedy", +"breek", +"breekless", +"breekums", +"breeze", +"breezeful", +"breezeless", +"breezelike", +"breezeway", +"breezily", +"breeziness", +"breezy", +"bregma", +"bregmata", +"bregmate", +"bregmatic", +"brehon", +"brehonship", +"brei", +"breislakite", +"breithauptite", +"brekkle", +"brelaw", +"breloque", +"breme", +"bremely", +"bremeness", +"Bremia", +"bremsstrahlung", +"brennage", +"brent", +"Brenthis", +"brephic", +"Brescian", +"bret", +"bretelle", +"bretesse", +"breth", +"brethren", +"Breton", +"Bretonian", +"Bretschneideraceae", +"brett", +"brettice", +"Bretwalda", +"Bretwaldadom", +"Bretwaldaship", +"breunnerite", +"breva", +"breve", +"brevet", +"brevetcy", +"breviary", +"breviate", +"breviature", +"brevicaudate", +"brevicipitid", +"Brevicipitidae", +"breviconic", +"brevier", +"brevifoliate", +"breviger", +"brevilingual", +"breviloquence", +"breviloquent", +"breviped", +"brevipen", +"brevipennate", +"breviradiate", +"brevirostral", +"brevirostrate", +"Brevirostrines", +"brevit", +"brevity", +"brew", +"brewage", +"brewer", +"brewership", +"brewery", +"brewhouse", +"brewing", +"brewis", +"brewmaster", +"brewst", +"brewster", +"brewsterite", +"brey", +"Brian", +"briar", +"briarberry", +"Briard", +"Briarean", +"Briareus", +"briarroot", +"bribe", +"bribee", +"bribegiver", +"bribegiving", +"bribemonger", +"briber", +"bribery", +"bribetaker", +"bribetaking", +"bribeworthy", +"Bribri", +"brichen", +"brichette", +"brick", +"brickbat", +"brickcroft", +"brickel", +"bricken", +"brickfield", +"brickfielder", +"brickhood", +"bricking", +"brickish", +"brickkiln", +"bricklayer", +"bricklaying", +"brickle", +"brickleness", +"bricklike", +"brickliner", +"bricklining", +"brickly", +"brickmaker", +"brickmaking", +"brickmason", +"brickset", +"bricksetter", +"bricktimber", +"brickwise", +"brickwork", +"bricky", +"brickyard", +"bricole", +"bridal", +"bridale", +"bridaler", +"bridally", +"Bride", +"bride", +"bridebed", +"bridebowl", +"bridecake", +"bridechamber", +"bridecup", +"bridegod", +"bridegroom", +"bridegroomship", +"bridehead", +"bridehood", +"brideknot", +"bridelace", +"brideless", +"bridelike", +"bridely", +"bridemaid", +"bridemaiden", +"bridemaidship", +"brideship", +"bridesmaid", +"bridesmaiding", +"bridesman", +"bridestake", +"bridewain", +"brideweed", +"bridewell", +"bridewort", +"bridge", +"bridgeable", +"bridgeboard", +"bridgebote", +"bridgebuilder", +"bridgebuilding", +"bridged", +"bridgehead", +"bridgekeeper", +"bridgeless", +"bridgelike", +"bridgemaker", +"bridgemaking", +"bridgeman", +"bridgemaster", +"bridgepot", +"Bridger", +"bridger", +"Bridget", +"bridgetree", +"bridgeward", +"bridgewards", +"bridgeway", +"bridgework", +"bridging", +"bridle", +"bridled", +"bridleless", +"bridleman", +"bridler", +"bridling", +"bridoon", +"brief", +"briefing", +"briefless", +"brieflessly", +"brieflessness", +"briefly", +"briefness", +"briefs", +"brier", +"brierberry", +"briered", +"brierroot", +"brierwood", +"briery", +"brieve", +"brig", +"brigade", +"brigadier", +"brigadiership", +"brigalow", +"brigand", +"brigandage", +"brigander", +"brigandine", +"brigandish", +"brigandishly", +"brigandism", +"Brigantes", +"Brigantia", +"brigantine", +"brigatry", +"brigbote", +"brigetty", +"Briggsian", +"Brighella", +"Brighid", +"bright", +"brighten", +"brightener", +"brightening", +"Brighteyes", +"brighteyes", +"brightish", +"brightly", +"brightness", +"brightsmith", +"brightsome", +"brightsomeness", +"brightwork", +"Brigid", +"Brigittine", +"brill", +"brilliance", +"brilliancy", +"brilliandeer", +"brilliant", +"brilliantine", +"brilliantly", +"brilliantness", +"brilliantwise", +"brilliolette", +"brillolette", +"brills", +"brim", +"brimborion", +"brimborium", +"brimful", +"brimfully", +"brimfulness", +"briming", +"brimless", +"brimmed", +"brimmer", +"brimming", +"brimmingly", +"brimstone", +"brimstonewort", +"brimstony", +"brin", +"brindlish", +"brine", +"brinehouse", +"brineless", +"brineman", +"briner", +"bring", +"bringal", +"bringall", +"bringer", +"brininess", +"brinish", +"brinishness", +"brinjal", +"brinjarry", +"brink", +"brinkless", +"briny", +"brioche", +"briolette", +"brique", +"briquette", +"brisk", +"brisken", +"brisket", +"briskish", +"briskly", +"briskness", +"brisling", +"brisque", +"briss", +"Brissotin", +"Brissotine", +"bristle", +"bristlebird", +"bristlecone", +"bristled", +"bristleless", +"bristlelike", +"bristler", +"bristletail", +"bristlewort", +"bristliness", +"bristly", +"Bristol", +"brisure", +"brit", +"Britain", +"Britannia", +"Britannian", +"Britannic", +"Britannically", +"britchka", +"brith", +"brither", +"Briticism", +"British", +"Britisher", +"Britishhood", +"Britishism", +"Britishly", +"Britishness", +"Briton", +"Britoness", +"britska", +"Brittany", +"britten", +"brittle", +"brittlebush", +"brittlely", +"brittleness", +"brittlestem", +"brittlewood", +"brittlewort", +"brittling", +"Briza", +"brizz", +"broach", +"broacher", +"broad", +"broadacre", +"broadax", +"broadbill", +"Broadbrim", +"broadbrim", +"broadcast", +"broadcaster", +"broadcloth", +"broaden", +"broadhead", +"broadhearted", +"broadhorn", +"broadish", +"broadleaf", +"broadloom", +"broadly", +"broadmouth", +"broadness", +"broadpiece", +"broadshare", +"broadsheet", +"broadside", +"broadspread", +"broadsword", +"broadtail", +"broadthroat", +"Broadway", +"broadway", +"Broadwayite", +"broadways", +"broadwife", +"broadwise", +"brob", +"Brobdingnag", +"Brobdingnagian", +"brocade", +"brocaded", +"brocard", +"brocardic", +"brocatel", +"brocatello", +"broccoli", +"broch", +"brochan", +"brochant", +"brochantite", +"broche", +"brochette", +"brochidodromous", +"brocho", +"brochure", +"brock", +"brockage", +"brocked", +"brocket", +"brockle", +"brod", +"brodder", +"brodeglass", +"brodequin", +"broderer", +"Brodiaea", +"brog", +"brogan", +"brogger", +"broggerite", +"broggle", +"brogue", +"brogueful", +"brogueneer", +"broguer", +"broguery", +"broguish", +"broider", +"broiderer", +"broideress", +"broidery", +"broigne", +"broil", +"broiler", +"broiling", +"broilingly", +"brokage", +"broke", +"broken", +"brokenhearted", +"brokenheartedly", +"brokenheartedness", +"brokenly", +"brokenness", +"broker", +"brokerage", +"brokeress", +"brokership", +"broking", +"brolga", +"broll", +"brolly", +"broma", +"bromacetanilide", +"bromacetate", +"bromacetic", +"bromacetone", +"bromal", +"bromalbumin", +"bromamide", +"bromargyrite", +"bromate", +"bromaurate", +"bromauric", +"brombenzamide", +"brombenzene", +"brombenzyl", +"bromcamphor", +"bromcresol", +"brome", +"bromeigon", +"Bromeikon", +"bromeikon", +"Bromelia", +"Bromeliaceae", +"bromeliaceous", +"bromeliad", +"bromelin", +"bromellite", +"bromethyl", +"bromethylene", +"bromgelatin", +"bromhidrosis", +"bromhydrate", +"bromhydric", +"Bromian", +"bromic", +"bromide", +"bromidic", +"bromidically", +"bromidrosis", +"brominate", +"bromination", +"bromindigo", +"bromine", +"brominism", +"brominize", +"bromiodide", +"Bromios", +"bromism", +"bromite", +"Bromius", +"bromization", +"bromize", +"bromizer", +"bromlite", +"bromoacetone", +"bromoaurate", +"bromoauric", +"bromobenzene", +"bromobenzyl", +"bromocamphor", +"bromochlorophenol", +"bromocresol", +"bromocyanidation", +"bromocyanide", +"bromocyanogen", +"bromoethylene", +"bromoform", +"bromogelatin", +"bromohydrate", +"bromohydrin", +"bromoil", +"bromoiodide", +"bromoiodism", +"bromoiodized", +"bromoketone", +"bromol", +"bromomania", +"bromomenorrhea", +"bromomethane", +"bromometric", +"bromometrical", +"bromometrically", +"bromometry", +"bromonaphthalene", +"bromophenol", +"bromopicrin", +"bromopnea", +"bromoprotein", +"bromothymol", +"bromous", +"bromphenol", +"brompicrin", +"bromthymol", +"bromuret", +"Bromus", +"bromvogel", +"bromyrite", +"bronc", +"bronchadenitis", +"bronchi", +"bronchia", +"bronchial", +"bronchially", +"bronchiarctia", +"bronchiectasis", +"bronchiectatic", +"bronchiloquy", +"bronchiocele", +"bronchiocrisis", +"bronchiogenic", +"bronchiolar", +"bronchiole", +"bronchioli", +"bronchiolitis", +"bronchiolus", +"bronchiospasm", +"bronchiostenosis", +"bronchitic", +"bronchitis", +"bronchium", +"bronchoadenitis", +"bronchoalveolar", +"bronchoaspergillosis", +"bronchoblennorrhea", +"bronchocavernous", +"bronchocele", +"bronchocephalitis", +"bronchoconstriction", +"bronchoconstrictor", +"bronchodilatation", +"bronchodilator", +"bronchoegophony", +"bronchoesophagoscopy", +"bronchogenic", +"bronchohemorrhagia", +"broncholemmitis", +"broncholith", +"broncholithiasis", +"bronchomotor", +"bronchomucormycosis", +"bronchomycosis", +"bronchopathy", +"bronchophonic", +"bronchophony", +"bronchophthisis", +"bronchoplasty", +"bronchoplegia", +"bronchopleurisy", +"bronchopneumonia", +"bronchopneumonic", +"bronchopulmonary", +"bronchorrhagia", +"bronchorrhaphy", +"bronchorrhea", +"bronchoscope", +"bronchoscopic", +"bronchoscopist", +"bronchoscopy", +"bronchospasm", +"bronchostenosis", +"bronchostomy", +"bronchotetany", +"bronchotome", +"bronchotomist", +"bronchotomy", +"bronchotracheal", +"bronchotyphoid", +"bronchotyphus", +"bronchovesicular", +"bronchus", +"bronco", +"broncobuster", +"brongniardite", +"bronk", +"Bronteana", +"bronteon", +"brontephobia", +"Brontesque", +"bronteum", +"brontide", +"brontogram", +"brontograph", +"brontolite", +"brontology", +"brontometer", +"brontophobia", +"Brontops", +"Brontosaurus", +"brontoscopy", +"Brontotherium", +"Brontozoum", +"Bronx", +"bronze", +"bronzed", +"bronzelike", +"bronzen", +"bronzer", +"bronzesmith", +"bronzewing", +"bronzify", +"bronzine", +"bronzing", +"bronzite", +"bronzitite", +"bronzy", +"broo", +"brooch", +"brood", +"brooder", +"broodiness", +"brooding", +"broodingly", +"broodless", +"broodlet", +"broodling", +"broody", +"brook", +"brookable", +"brooked", +"brookflower", +"brookie", +"brookite", +"brookless", +"brooklet", +"brooklike", +"brooklime", +"Brooklynite", +"brookside", +"brookweed", +"brooky", +"brool", +"broom", +"broombush", +"broomcorn", +"broomer", +"broommaker", +"broommaking", +"broomrape", +"broomroot", +"broomshank", +"broomstaff", +"broomstick", +"broomstraw", +"broomtail", +"broomweed", +"broomwood", +"broomwort", +"broomy", +"broon", +"broose", +"broozled", +"brose", +"Brosimum", +"brosot", +"brosy", +"brot", +"brotan", +"brotany", +"broth", +"brothel", +"brotheler", +"brothellike", +"brothelry", +"brother", +"brotherhood", +"brotherless", +"brotherlike", +"brotherliness", +"brotherly", +"brothership", +"Brotherton", +"brotherwort", +"brothy", +"brotocrystal", +"Brotula", +"brotulid", +"Brotulidae", +"brotuliform", +"brough", +"brougham", +"brought", +"Broussonetia", +"brow", +"browache", +"Browallia", +"browallia", +"browband", +"browbeat", +"browbeater", +"browbound", +"browden", +"browed", +"browis", +"browless", +"browman", +"brown", +"brownback", +"browner", +"Brownian", +"brownie", +"browniness", +"browning", +"Browningesque", +"brownish", +"Brownism", +"Brownist", +"Brownistic", +"Brownistical", +"brownly", +"brownness", +"brownout", +"brownstone", +"browntail", +"browntop", +"brownweed", +"brownwort", +"browny", +"browpiece", +"browpost", +"browse", +"browser", +"browsick", +"browsing", +"browst", +"bruang", +"Brucella", +"brucellosis", +"Bruchidae", +"Bruchus", +"brucia", +"brucina", +"brucine", +"brucite", +"bruckle", +"bruckled", +"bruckleness", +"Bructeri", +"brugh", +"brugnatellite", +"bruin", +"bruise", +"bruiser", +"bruisewort", +"bruising", +"bruit", +"bruiter", +"bruke", +"Brule", +"brulee", +"brulyie", +"brulyiement", +"brumal", +"Brumalia", +"brumby", +"brume", +"Brummagem", +"brummagem", +"brumous", +"brumstane", +"brumstone", +"brunch", +"Brunella", +"Brunellia", +"Brunelliaceae", +"brunelliaceous", +"brunet", +"brunetness", +"brunette", +"brunetteness", +"Brunfelsia", +"brunissure", +"Brunistic", +"brunneous", +"Brunnichia", +"Bruno", +"Brunonia", +"Brunoniaceae", +"Brunonian", +"Brunonism", +"Brunswick", +"brunswick", +"brunt", +"bruscus", +"brush", +"brushable", +"brushball", +"brushbird", +"brushbush", +"brushed", +"brusher", +"brushes", +"brushet", +"brushful", +"brushiness", +"brushing", +"brushite", +"brushland", +"brushless", +"brushlessness", +"brushlet", +"brushlike", +"brushmaker", +"brushmaking", +"brushman", +"brushoff", +"brushproof", +"brushwood", +"brushwork", +"brushy", +"brusque", +"brusquely", +"brusqueness", +"Brussels", +"brustle", +"brut", +"Bruta", +"brutage", +"brutal", +"brutalism", +"brutalist", +"brutalitarian", +"brutality", +"brutalization", +"brutalize", +"brutally", +"brute", +"brutedom", +"brutelike", +"brutely", +"bruteness", +"brutification", +"brutify", +"bruting", +"brutish", +"brutishly", +"brutishness", +"brutism", +"brutter", +"Brutus", +"bruzz", +"Bryaceae", +"bryaceous", +"Bryales", +"Bryanism", +"Bryanite", +"Bryanthus", +"bryogenin", +"bryological", +"bryologist", +"bryology", +"Bryonia", +"bryonidin", +"bryonin", +"bryony", +"Bryophyllum", +"Bryophyta", +"bryophyte", +"bryophytic", +"Bryozoa", +"bryozoan", +"bryozoon", +"bryozoum", +"Brython", +"Brythonic", +"Bryum", +"Bu", +"bu", +"bual", +"buaze", +"bub", +"buba", +"bubal", +"bubaline", +"Bubalis", +"bubalis", +"Bubastid", +"Bubastite", +"bubble", +"bubbleless", +"bubblement", +"bubbler", +"bubbling", +"bubblingly", +"bubblish", +"bubbly", +"bubby", +"bubbybush", +"Bube", +"bubinga", +"Bubo", +"bubo", +"buboed", +"bubonalgia", +"bubonic", +"Bubonidae", +"bubonocele", +"bubukle", +"bucare", +"bucca", +"buccal", +"buccally", +"buccan", +"buccaneer", +"buccaneerish", +"buccate", +"Buccellarius", +"buccina", +"buccinal", +"buccinator", +"buccinatory", +"Buccinidae", +"bucciniform", +"buccinoid", +"Buccinum", +"Bucco", +"buccobranchial", +"buccocervical", +"buccogingival", +"buccolabial", +"buccolingual", +"bucconasal", +"Bucconidae", +"Bucconinae", +"buccopharyngeal", +"buccula", +"Bucculatrix", +"bucentaur", +"Bucephala", +"Bucephalus", +"Buceros", +"Bucerotes", +"Bucerotidae", +"Bucerotinae", +"Buchanan", +"Buchanite", +"buchite", +"Buchloe", +"Buchmanism", +"Buchmanite", +"Buchnera", +"buchnerite", +"buchonite", +"buchu", +"buck", +"buckaroo", +"buckberry", +"buckboard", +"buckbrush", +"buckbush", +"bucked", +"buckeen", +"bucker", +"bucket", +"bucketer", +"bucketful", +"bucketing", +"bucketmaker", +"bucketmaking", +"bucketman", +"buckety", +"buckeye", +"buckhorn", +"buckhound", +"buckie", +"bucking", +"buckish", +"buckishly", +"buckishness", +"buckjump", +"buckjumper", +"bucklandite", +"buckle", +"buckled", +"buckleless", +"buckler", +"Buckleya", +"buckling", +"bucklum", +"bucko", +"buckplate", +"buckpot", +"buckra", +"buckram", +"bucksaw", +"buckshee", +"buckshot", +"buckskin", +"buckskinned", +"buckstall", +"buckstay", +"buckstone", +"bucktail", +"buckthorn", +"bucktooth", +"buckwagon", +"buckwash", +"buckwasher", +"buckwashing", +"buckwheat", +"buckwheater", +"buckwheatlike", +"bucky", +"bucoliast", +"bucolic", +"bucolical", +"bucolically", +"bucolicism", +"Bucorvinae", +"Bucorvus", +"bucrane", +"bucranium", +"bud", +"buda", +"buddage", +"budder", +"Buddh", +"Buddha", +"Buddhahood", +"Buddhaship", +"buddhi", +"Buddhic", +"Buddhism", +"Buddhist", +"Buddhistic", +"Buddhistical", +"Buddhology", +"budding", +"buddle", +"Buddleia", +"buddleman", +"buddler", +"buddy", +"budge", +"budger", +"budgeree", +"budgereegah", +"budgerigar", +"budgerow", +"budget", +"budgetary", +"budgeteer", +"budgeter", +"budgetful", +"Budh", +"budless", +"budlet", +"budlike", +"budmash", +"Budorcas", +"budtime", +"Budukha", +"Buduma", +"budwood", +"budworm", +"budzat", +"Buettneria", +"Buettneriaceae", +"bufagin", +"buff", +"buffable", +"buffalo", +"buffaloback", +"buffball", +"buffcoat", +"buffed", +"buffer", +"buffet", +"buffeter", +"buffing", +"buffle", +"bufflehead", +"bufflehorn", +"buffont", +"buffoon", +"buffoonery", +"buffoonesque", +"buffoonish", +"buffoonism", +"buffware", +"buffy", +"bufidin", +"bufo", +"Bufonidae", +"bufonite", +"bufotalin", +"bug", +"bugaboo", +"bugan", +"bugbane", +"bugbear", +"bugbeardom", +"bugbearish", +"bugbite", +"bugdom", +"bugfish", +"bugger", +"buggery", +"bugginess", +"buggy", +"buggyman", +"bughead", +"bughouse", +"Bugi", +"Buginese", +"Buginvillaea", +"bugle", +"bugled", +"bugler", +"buglet", +"bugleweed", +"buglewort", +"bugloss", +"bugologist", +"bugology", +"bugproof", +"bugre", +"bugseed", +"bugweed", +"bugwort", +"buhl", +"buhr", +"buhrstone", +"build", +"buildable", +"builder", +"building", +"buildingless", +"buildress", +"buildup", +"built", +"buirdly", +"buisson", +"buist", +"Bukat", +"Bukeyef", +"bukh", +"Bukidnon", +"bukshi", +"bulak", +"Bulanda", +"bulb", +"bulbaceous", +"bulbar", +"bulbed", +"bulbiferous", +"bulbiform", +"bulbil", +"Bulbilis", +"bulbilla", +"bulbless", +"bulblet", +"bulblike", +"bulbocapnin", +"bulbocapnine", +"bulbocavernosus", +"bulbocavernous", +"Bulbochaete", +"Bulbocodium", +"bulbomedullary", +"bulbomembranous", +"bulbonuclear", +"Bulbophyllum", +"bulborectal", +"bulbose", +"bulbospinal", +"bulbotuber", +"bulbous", +"bulbul", +"bulbule", +"bulby", +"bulchin", +"Bulgar", +"Bulgari", +"Bulgarian", +"Bulgaric", +"Bulgarophil", +"bulge", +"bulger", +"bulginess", +"bulgy", +"bulimia", +"bulimiac", +"bulimic", +"bulimiform", +"bulimoid", +"Bulimulidae", +"Bulimus", +"bulimy", +"bulk", +"bulked", +"bulker", +"bulkhead", +"bulkheaded", +"bulkily", +"bulkiness", +"bulkish", +"bulky", +"bull", +"bulla", +"bullace", +"bullamacow", +"bullan", +"bullary", +"bullate", +"bullated", +"bullation", +"bullback", +"bullbaiting", +"bullbat", +"bullbeggar", +"bullberry", +"bullbird", +"bullboat", +"bullcart", +"bullcomber", +"bulldog", +"bulldogged", +"bulldoggedness", +"bulldoggy", +"bulldogism", +"bulldoze", +"bulldozer", +"buller", +"bullet", +"bulleted", +"bullethead", +"bulletheaded", +"bulletheadedness", +"bulletin", +"bulletless", +"bulletlike", +"bulletmaker", +"bulletmaking", +"bulletproof", +"bulletwood", +"bullety", +"bullfeast", +"bullfight", +"bullfighter", +"bullfighting", +"bullfinch", +"bullfist", +"bullflower", +"bullfoot", +"bullfrog", +"bullhead", +"bullheaded", +"bullheadedly", +"bullheadedness", +"bullhide", +"bullhoof", +"bullhorn", +"Bullidae", +"bulliform", +"bullimong", +"bulling", +"bullion", +"bullionism", +"bullionist", +"bullionless", +"bullish", +"bullishly", +"bullishness", +"bullism", +"bullit", +"bullneck", +"bullnose", +"bullnut", +"bullock", +"bullocker", +"Bullockite", +"bullockman", +"bullocky", +"Bullom", +"bullous", +"bullpates", +"bullpoll", +"bullpout", +"bullskin", +"bullsticker", +"bullsucker", +"bullswool", +"bulltoad", +"bullule", +"bullweed", +"bullwhack", +"bullwhacker", +"bullwhip", +"bullwort", +"bully", +"bullyable", +"bullydom", +"bullyhuff", +"bullying", +"bullyism", +"bullyrag", +"bullyragger", +"bullyragging", +"bullyrook", +"bulrush", +"bulrushlike", +"bulrushy", +"bulse", +"bult", +"bulter", +"bultey", +"bultong", +"bultow", +"bulwand", +"bulwark", +"bum", +"bumbailiff", +"bumbailiffship", +"bumbarge", +"bumbaste", +"bumbaze", +"bumbee", +"bumbershoot", +"bumble", +"bumblebee", +"bumbleberry", +"Bumbledom", +"bumblefoot", +"bumblekite", +"bumblepuppy", +"bumbler", +"bumbo", +"bumboat", +"bumboatman", +"bumboatwoman", +"bumclock", +"Bumelia", +"bumicky", +"bummalo", +"bummaree", +"bummed", +"bummer", +"bummerish", +"bummie", +"bumming", +"bummler", +"bummock", +"bump", +"bumpee", +"bumper", +"bumperette", +"bumpily", +"bumpiness", +"bumping", +"bumpingly", +"bumpkin", +"bumpkinet", +"bumpkinish", +"bumpkinly", +"bumpology", +"bumptious", +"bumptiously", +"bumptiousness", +"bumpy", +"bumtrap", +"bumwood", +"bun", +"Buna", +"buna", +"buncal", +"bunce", +"bunch", +"bunchberry", +"buncher", +"bunchflower", +"bunchily", +"bunchiness", +"bunchy", +"buncombe", +"bund", +"Bunda", +"Bundahish", +"Bundeli", +"bunder", +"Bundestag", +"bundle", +"bundler", +"bundlerooted", +"bundlet", +"bundobust", +"bundook", +"Bundu", +"bundweed", +"bundy", +"bunemost", +"bung", +"Bunga", +"bungaloid", +"bungalow", +"bungarum", +"Bungarus", +"bungee", +"bungerly", +"bungey", +"bungfu", +"bungfull", +"bunghole", +"bungle", +"bungler", +"bunglesome", +"bungling", +"bunglingly", +"bungmaker", +"bungo", +"bungwall", +"bungy", +"Buninahua", +"bunion", +"bunk", +"bunker", +"bunkerman", +"bunkery", +"bunkhouse", +"bunkie", +"bunkload", +"bunko", +"bunkum", +"bunnell", +"bunny", +"bunnymouth", +"bunodont", +"Bunodonta", +"bunolophodont", +"Bunomastodontidae", +"bunoselenodont", +"bunsenite", +"bunt", +"buntal", +"bunted", +"Bunter", +"bunter", +"bunting", +"buntline", +"bunton", +"bunty", +"bunya", +"bunyah", +"bunyip", +"Bunyoro", +"buoy", +"buoyage", +"buoyance", +"buoyancy", +"buoyant", +"buoyantly", +"buoyantness", +"Buphaga", +"buphthalmia", +"buphthalmic", +"Buphthalmum", +"bupleurol", +"Bupleurum", +"buplever", +"buprestid", +"Buprestidae", +"buprestidan", +"Buprestis", +"bur", +"buran", +"burao", +"Burbank", +"burbank", +"burbankian", +"Burbankism", +"burbark", +"Burberry", +"burble", +"burbler", +"burbly", +"burbot", +"burbush", +"burd", +"burdalone", +"burden", +"burdener", +"burdenless", +"burdenous", +"burdensome", +"burdensomely", +"burdensomeness", +"burdie", +"Burdigalian", +"burdock", +"burdon", +"bure", +"bureau", +"bureaucracy", +"bureaucrat", +"bureaucratic", +"bureaucratical", +"bureaucratically", +"bureaucratism", +"bureaucratist", +"bureaucratization", +"bureaucratize", +"bureaux", +"burel", +"burele", +"buret", +"burette", +"burfish", +"burg", +"burgage", +"burgality", +"burgall", +"burgee", +"burgensic", +"burgeon", +"burgess", +"burgessdom", +"burggrave", +"burgh", +"burghal", +"burghalpenny", +"burghbote", +"burghemot", +"burgher", +"burgherage", +"burgherdom", +"burgheress", +"burgherhood", +"burghermaster", +"burghership", +"burghmaster", +"burghmoot", +"burglar", +"burglarious", +"burglariously", +"burglarize", +"burglarproof", +"burglary", +"burgle", +"burgomaster", +"burgomastership", +"burgonet", +"burgoo", +"burgoyne", +"burgrave", +"burgraviate", +"burgul", +"Burgundian", +"Burgundy", +"burgus", +"burgware", +"burhead", +"Burhinidae", +"Burhinus", +"Buri", +"buri", +"burial", +"burian", +"Buriat", +"buried", +"burier", +"burin", +"burinist", +"burion", +"buriti", +"burka", +"burke", +"burker", +"burkundaz", +"burl", +"burlap", +"burled", +"burler", +"burlesque", +"burlesquely", +"burlesquer", +"burlet", +"burletta", +"Burley", +"burlily", +"burliness", +"Burlington", +"burly", +"Burman", +"Burmannia", +"Burmanniaceae", +"burmanniaceous", +"Burmese", +"burmite", +"burn", +"burnable", +"burnbeat", +"burned", +"burner", +"burnet", +"burnetize", +"burnfire", +"burnie", +"burniebee", +"burning", +"burningly", +"burnish", +"burnishable", +"burnisher", +"burnishing", +"burnishment", +"burnoose", +"burnoosed", +"burnous", +"burnout", +"burnover", +"Burnsian", +"burnside", +"burnsides", +"burnt", +"burntweed", +"burnut", +"burnwood", +"burny", +"buro", +"burp", +"burr", +"burrah", +"burrawang", +"burred", +"burrel", +"burrer", +"burrgrailer", +"burring", +"burrish", +"burrito", +"burrknot", +"burro", +"burrobrush", +"burrow", +"burroweed", +"burrower", +"burrowstown", +"burry", +"bursa", +"bursal", +"bursar", +"bursarial", +"bursarship", +"bursary", +"bursate", +"bursattee", +"bursautee", +"burse", +"burseed", +"Bursera", +"Burseraceae", +"Burseraceous", +"bursicle", +"bursiculate", +"bursiform", +"bursitis", +"burst", +"burster", +"burstwort", +"burt", +"burthenman", +"burton", +"burtonization", +"burtonize", +"burucha", +"Burushaski", +"Burut", +"burweed", +"bury", +"burying", +"bus", +"Busaos", +"busby", +"buscarl", +"buscarle", +"bush", +"bushbeater", +"bushbuck", +"bushcraft", +"bushed", +"bushel", +"busheler", +"bushelful", +"bushelman", +"bushelwoman", +"busher", +"bushfighter", +"bushfighting", +"bushful", +"bushhammer", +"bushi", +"bushily", +"bushiness", +"bushing", +"bushland", +"bushless", +"bushlet", +"bushlike", +"bushmaker", +"bushmaking", +"Bushman", +"bushmanship", +"bushmaster", +"bushment", +"Bushongo", +"bushranger", +"bushranging", +"bushrope", +"bushveld", +"bushwa", +"bushwhack", +"bushwhacker", +"bushwhacking", +"bushwife", +"bushwoman", +"bushwood", +"bushy", +"busied", +"busily", +"busine", +"business", +"businesslike", +"businesslikeness", +"businessman", +"businesswoman", +"busk", +"busked", +"busker", +"busket", +"buskin", +"buskined", +"buskle", +"busky", +"busman", +"buss", +"busser", +"bussock", +"bussu", +"bust", +"bustard", +"busted", +"bustee", +"buster", +"busthead", +"bustic", +"busticate", +"bustle", +"bustled", +"bustler", +"bustling", +"bustlingly", +"busy", +"busybodied", +"busybody", +"busybodyish", +"busybodyism", +"busybodyness", +"Busycon", +"busyhead", +"busying", +"busyish", +"busyness", +"busywork", +"but", +"butadiene", +"butadiyne", +"butanal", +"butane", +"butanoic", +"butanol", +"butanolid", +"butanolide", +"butanone", +"butch", +"butcher", +"butcherbird", +"butcherdom", +"butcherer", +"butcheress", +"butchering", +"butcherless", +"butcherliness", +"butcherly", +"butcherous", +"butchery", +"Bute", +"Butea", +"butein", +"butene", +"butenyl", +"Buteo", +"buteonine", +"butic", +"butine", +"butler", +"butlerage", +"butlerdom", +"butleress", +"butlerism", +"butlerlike", +"butlership", +"butlery", +"butment", +"Butomaceae", +"butomaceous", +"Butomus", +"butoxy", +"butoxyl", +"Butsu", +"butt", +"butte", +"butter", +"butteraceous", +"butterback", +"butterball", +"butterbill", +"butterbird", +"butterbox", +"butterbump", +"butterbur", +"butterbush", +"buttercup", +"buttered", +"butterfat", +"butterfingered", +"butterfingers", +"butterfish", +"butterflower", +"butterfly", +"butterflylike", +"butterhead", +"butterine", +"butteriness", +"butteris", +"butterjags", +"butterless", +"butterlike", +"buttermaker", +"buttermaking", +"butterman", +"buttermilk", +"buttermonger", +"buttermouth", +"butternose", +"butternut", +"butterroot", +"butterscotch", +"butterweed", +"butterwife", +"butterwoman", +"butterworker", +"butterwort", +"butterwright", +"buttery", +"butteryfingered", +"buttgenbachite", +"butting", +"buttinsky", +"buttle", +"buttock", +"buttocked", +"buttocker", +"button", +"buttonball", +"buttonbur", +"buttonbush", +"buttoned", +"buttoner", +"buttonhold", +"buttonholder", +"buttonhole", +"buttonholer", +"buttonhook", +"buttonless", +"buttonlike", +"buttonmold", +"buttons", +"buttonweed", +"buttonwood", +"buttony", +"buttress", +"buttressless", +"buttresslike", +"buttstock", +"buttwoman", +"buttwood", +"butty", +"buttyman", +"butyl", +"butylamine", +"butylation", +"butylene", +"butylic", +"Butyn", +"butyne", +"butyr", +"butyraceous", +"butyral", +"butyraldehyde", +"butyrate", +"butyric", +"butyrically", +"butyrin", +"butyrinase", +"butyrochloral", +"butyrolactone", +"butyrometer", +"butyrometric", +"butyrone", +"butyrous", +"butyrousness", +"butyryl", +"Buxaceae", +"buxaceous", +"Buxbaumia", +"Buxbaumiaceae", +"buxerry", +"buxom", +"buxomly", +"buxomness", +"Buxus", +"buy", +"buyable", +"buyer", +"Buyides", +"buzane", +"buzylene", +"buzz", +"buzzard", +"buzzardlike", +"buzzardly", +"buzzer", +"buzzerphone", +"buzzgloak", +"buzzies", +"buzzing", +"buzzingly", +"buzzle", +"buzzwig", +"buzzy", +"by", +"Byblidaceae", +"Byblis", +"bycoket", +"bye", +"byee", +"byegaein", +"byeman", +"byepath", +"byerite", +"byerlite", +"byestreet", +"byeworker", +"byeworkman", +"bygane", +"byganging", +"bygo", +"bygoing", +"bygone", +"byhand", +"bylaw", +"bylawman", +"byname", +"bynedestin", +"Bynin", +"byon", +"byordinar", +"byordinary", +"byous", +"byously", +"bypass", +"bypasser", +"bypast", +"bypath", +"byplay", +"byre", +"byreman", +"byrewards", +"byrewoman", +"byrlaw", +"byrlawman", +"byrnie", +"byroad", +"Byronesque", +"Byronian", +"Byroniana", +"Byronic", +"Byronically", +"Byronics", +"Byronish", +"Byronism", +"Byronist", +"Byronite", +"Byronize", +"byrrus", +"Byrsonima", +"byrthynsak", +"Bysacki", +"bysen", +"bysmalith", +"byspell", +"byssaceous", +"byssal", +"byssiferous", +"byssin", +"byssine", +"byssinosis", +"byssogenous", +"byssoid", +"byssolite", +"byssus", +"bystander", +"bystreet", +"byth", +"bytime", +"bytownite", +"bytownitite", +"bywalk", +"bywalker", +"byway", +"bywoner", +"byword", +"bywork", +"Byzantian", +"Byzantine", +"Byzantinesque", +"Byzantinism", +"Byzantinize", +"C", +"c", +"ca", +"caam", +"caama", +"caaming", +"caapeba", +"caatinga", +"cab", +"caba", +"cabaan", +"caback", +"cabaho", +"cabal", +"cabala", +"cabalassou", +"cabaletta", +"cabalic", +"cabalism", +"cabalist", +"cabalistic", +"cabalistical", +"cabalistically", +"caballer", +"caballine", +"caban", +"cabana", +"cabaret", +"cabas", +"cabasset", +"cabassou", +"cabbage", +"cabbagehead", +"cabbagewood", +"cabbagy", +"cabber", +"cabble", +"cabbler", +"cabby", +"cabda", +"cabdriver", +"cabdriving", +"cabellerote", +"caber", +"cabernet", +"cabestro", +"cabezon", +"cabilliau", +"cabin", +"Cabinda", +"cabinet", +"cabinetmaker", +"cabinetmaking", +"cabinetry", +"cabinetwork", +"cabinetworker", +"cabinetworking", +"cabio", +"Cabirean", +"Cabiri", +"Cabiria", +"Cabirian", +"Cabiric", +"Cabiritic", +"cable", +"cabled", +"cablegram", +"cableless", +"cablelike", +"cableman", +"cabler", +"cablet", +"cableway", +"cabling", +"cabman", +"cabob", +"caboceer", +"cabochon", +"cabocle", +"Cabomba", +"Cabombaceae", +"caboodle", +"cabook", +"caboose", +"caboshed", +"cabot", +"cabotage", +"cabree", +"cabrerite", +"cabreuva", +"cabrilla", +"cabriole", +"cabriolet", +"cabrit", +"cabstand", +"cabureiba", +"cabuya", +"Caca", +"Cacajao", +"Cacalia", +"cacam", +"Cacan", +"Cacana", +"cacanthrax", +"cacao", +"Cacara", +"Cacatua", +"Cacatuidae", +"Cacatuinae", +"Caccabis", +"cacesthesia", +"cacesthesis", +"cachalot", +"cachaza", +"cache", +"cachectic", +"cachemia", +"cachemic", +"cachet", +"cachexia", +"cachexic", +"cachexy", +"cachibou", +"cachinnate", +"cachinnation", +"cachinnator", +"cachinnatory", +"cacholong", +"cachou", +"cachrys", +"cachucha", +"cachunde", +"Cacicus", +"cacidrosis", +"caciocavallo", +"cacique", +"caciqueship", +"caciquism", +"cack", +"cackerel", +"cackle", +"cackler", +"cacocholia", +"cacochroia", +"cacochylia", +"cacochymia", +"cacochymic", +"cacochymical", +"cacochymy", +"cacocnemia", +"cacodaemoniac", +"cacodaemonial", +"cacodaemonic", +"cacodemon", +"cacodemonia", +"cacodemoniac", +"cacodemonial", +"cacodemonic", +"cacodemonize", +"cacodemonomania", +"cacodontia", +"cacodorous", +"cacodoxian", +"cacodoxical", +"cacodoxy", +"cacodyl", +"cacodylate", +"cacodylic", +"cacoeconomy", +"cacoepist", +"cacoepistic", +"cacoepy", +"cacoethes", +"cacoethic", +"cacogalactia", +"cacogastric", +"cacogenesis", +"cacogenic", +"cacogenics", +"cacogeusia", +"cacoglossia", +"cacographer", +"cacographic", +"cacographical", +"cacography", +"cacology", +"cacomagician", +"cacomelia", +"cacomistle", +"cacomixl", +"cacomixle", +"cacomorphia", +"cacomorphosis", +"caconychia", +"caconym", +"caconymic", +"cacoon", +"cacopathy", +"cacopharyngia", +"cacophonia", +"cacophonic", +"cacophonical", +"cacophonically", +"cacophonist", +"cacophonize", +"cacophonous", +"cacophonously", +"cacophony", +"cacophthalmia", +"cacoplasia", +"cacoplastic", +"cacoproctia", +"cacorhythmic", +"cacorrhachis", +"cacorrhinia", +"cacosmia", +"cacospermia", +"cacosplanchnia", +"cacostomia", +"cacothansia", +"cacotheline", +"cacothesis", +"cacothymia", +"cacotrichia", +"cacotrophia", +"cacotrophic", +"cacotrophy", +"cacotype", +"cacoxene", +"cacoxenite", +"cacozeal", +"cacozealous", +"cacozyme", +"Cactaceae", +"cactaceous", +"Cactales", +"cacti", +"cactiform", +"cactoid", +"Cactus", +"cacuminal", +"cacuminate", +"cacumination", +"cacuminous", +"cacur", +"cad", +"cadalene", +"cadamba", +"cadastral", +"cadastration", +"cadastre", +"cadaver", +"cadaveric", +"cadaverine", +"cadaverize", +"cadaverous", +"cadaverously", +"cadaverousness", +"cadbait", +"cadbit", +"cadbote", +"caddice", +"caddiced", +"Caddie", +"caddie", +"caddis", +"caddised", +"caddish", +"caddishly", +"caddishness", +"caddle", +"Caddo", +"Caddoan", +"caddow", +"caddy", +"cade", +"cadelle", +"cadence", +"cadenced", +"cadency", +"cadent", +"cadential", +"cadenza", +"cader", +"caderas", +"Cadet", +"cadet", +"cadetcy", +"cadetship", +"cadette", +"cadew", +"cadge", +"cadger", +"cadgily", +"cadginess", +"cadgy", +"cadi", +"cadilesker", +"cadinene", +"cadism", +"cadiueio", +"cadjan", +"cadlock", +"Cadmean", +"cadmia", +"cadmic", +"cadmide", +"cadmiferous", +"cadmium", +"cadmiumize", +"Cadmopone", +"Cadmus", +"cados", +"cadrans", +"cadre", +"cadua", +"caduac", +"caduca", +"caducary", +"caducean", +"caduceus", +"caduciary", +"caducibranch", +"Caducibranchiata", +"caducibranchiate", +"caducicorn", +"caducity", +"caducous", +"cadus", +"Cadwal", +"Cadwallader", +"cadweed", +"caeca", +"caecal", +"caecally", +"caecectomy", +"caeciform", +"Caecilia", +"Caeciliae", +"caecilian", +"Caeciliidae", +"caecitis", +"caecocolic", +"caecostomy", +"caecotomy", +"caecum", +"Caedmonian", +"Caedmonic", +"Caelian", +"caelometer", +"Caelum", +"Caelus", +"Caenogaea", +"Caenogaean", +"Caenolestes", +"caenostylic", +"caenostyly", +"caeoma", +"caeremoniarius", +"Caerphilly", +"Caesalpinia", +"Caesalpiniaceae", +"caesalpiniaceous", +"Caesar", +"Caesardom", +"Caesarean", +"Caesareanize", +"Caesarian", +"Caesarism", +"Caesarist", +"Caesarize", +"caesaropapacy", +"caesaropapism", +"caesaropopism", +"Caesarotomy", +"Caesarship", +"caesious", +"caesura", +"caesural", +"caesuric", +"cafeneh", +"cafenet", +"cafeteria", +"caffa", +"caffeate", +"caffeic", +"caffeina", +"caffeine", +"caffeinic", +"caffeinism", +"caffeism", +"caffeol", +"caffeone", +"caffetannic", +"caffetannin", +"caffiso", +"caffle", +"caffoline", +"caffoy", +"cafh", +"cafiz", +"caftan", +"caftaned", +"cag", +"Cagayan", +"cage", +"caged", +"cageful", +"cageless", +"cagelike", +"cageling", +"cageman", +"cager", +"cagester", +"cagework", +"cagey", +"caggy", +"cagily", +"cagit", +"cagmag", +"Cagn", +"Cahenslyism", +"Cahill", +"cahincic", +"Cahita", +"cahiz", +"Cahnite", +"Cahokia", +"cahoot", +"cahot", +"cahow", +"Cahuapana", +"Cahuilla", +"caickle", +"caid", +"cailcedra", +"cailleach", +"caimacam", +"caimakam", +"caiman", +"caimitillo", +"caimito", +"Cain", +"cain", +"Caingang", +"Caingua", +"Cainian", +"Cainish", +"Cainism", +"Cainite", +"Cainitic", +"caique", +"caiquejee", +"Cairba", +"caird", +"Cairene", +"cairn", +"cairned", +"cairngorm", +"cairngorum", +"cairny", +"Cairo", +"caisson", +"caissoned", +"Caitanyas", +"Caite", +"caitiff", +"Cajan", +"Cajanus", +"cajeput", +"cajole", +"cajolement", +"cajoler", +"cajolery", +"cajoling", +"cajolingly", +"cajuela", +"Cajun", +"cajun", +"cajuput", +"cajuputene", +"cajuputol", +"Cakavci", +"Cakchikel", +"cake", +"cakebox", +"cakebread", +"cakehouse", +"cakemaker", +"cakemaking", +"caker", +"cakette", +"cakewalk", +"cakewalker", +"cakey", +"Cakile", +"caky", +"cal", +"calaba", +"Calabar", +"Calabari", +"calabash", +"calabaza", +"calabazilla", +"calaber", +"calaboose", +"calabrasella", +"Calabrese", +"calabrese", +"Calabrian", +"calade", +"Caladium", +"calais", +"calalu", +"Calamagrostis", +"calamanco", +"calamansi", +"Calamariaceae", +"calamariaceous", +"Calamariales", +"calamarian", +"calamarioid", +"calamaroid", +"calamary", +"calambac", +"calambour", +"calamiferous", +"calamiform", +"calaminary", +"calamine", +"calamint", +"Calamintha", +"calamistral", +"calamistrum", +"calamite", +"calamitean", +"Calamites", +"calamitoid", +"calamitous", +"calamitously", +"calamitousness", +"calamity", +"Calamodendron", +"calamondin", +"Calamopitys", +"Calamospermae", +"Calamostachys", +"calamus", +"calander", +"Calandra", +"calandria", +"Calandridae", +"Calandrinae", +"Calandrinia", +"calangay", +"calantas", +"Calanthe", +"calapite", +"Calappa", +"Calappidae", +"Calas", +"calascione", +"calash", +"Calathea", +"calathian", +"calathidium", +"calathiform", +"calathiscus", +"calathus", +"Calatrava", +"calaverite", +"calbroben", +"calcaneal", +"calcaneoastragalar", +"calcaneoastragaloid", +"calcaneocuboid", +"calcaneofibular", +"calcaneonavicular", +"calcaneoplantar", +"calcaneoscaphoid", +"calcaneotibial", +"calcaneum", +"calcaneus", +"calcar", +"calcarate", +"Calcarea", +"calcareoargillaceous", +"calcareobituminous", +"calcareocorneous", +"calcareosiliceous", +"calcareosulphurous", +"calcareous", +"calcareously", +"calcareousness", +"calcariferous", +"calcariform", +"calcarine", +"calced", +"calceiform", +"calcemia", +"Calceolaria", +"calceolate", +"Calchaqui", +"Calchaquian", +"calcic", +"calciclase", +"calcicole", +"calcicolous", +"calcicosis", +"calciferol", +"Calciferous", +"calciferous", +"calcific", +"calcification", +"calcified", +"calciform", +"calcifugal", +"calcifuge", +"calcifugous", +"calcify", +"calcigenous", +"calcigerous", +"calcimeter", +"calcimine", +"calciminer", +"calcinable", +"calcination", +"calcinatory", +"calcine", +"calcined", +"calciner", +"calcinize", +"calciobiotite", +"calciocarnotite", +"calcioferrite", +"calcioscheelite", +"calciovolborthite", +"calcipexy", +"calciphile", +"calciphilia", +"calciphilous", +"calciphobe", +"calciphobous", +"calciphyre", +"calciprivic", +"calcisponge", +"Calcispongiae", +"calcite", +"calcitestaceous", +"calcitic", +"calcitrant", +"calcitrate", +"calcitreation", +"calcium", +"calcivorous", +"calcographer", +"calcographic", +"calcography", +"calcrete", +"calculability", +"calculable", +"Calculagraph", +"calculary", +"calculate", +"calculated", +"calculatedly", +"calculating", +"calculatingly", +"calculation", +"calculational", +"calculative", +"calculator", +"calculatory", +"calculi", +"calculiform", +"calculist", +"calculous", +"calculus", +"Calcydon", +"calden", +"caldron", +"calean", +"Caleb", +"Caledonia", +"Caledonian", +"caledonite", +"calefacient", +"calefaction", +"calefactive", +"calefactor", +"calefactory", +"calelectric", +"calelectrical", +"calelectricity", +"Calemes", +"calendal", +"calendar", +"calendarer", +"calendarial", +"calendarian", +"calendaric", +"calender", +"calenderer", +"calendric", +"calendrical", +"calendry", +"calends", +"Calendula", +"calendulin", +"calentural", +"calenture", +"calenturist", +"calepin", +"calescence", +"calescent", +"calf", +"calfbound", +"calfhood", +"calfish", +"calfkill", +"calfless", +"calflike", +"calfling", +"calfskin", +"Caliban", +"Calibanism", +"caliber", +"calibered", +"calibogus", +"calibrate", +"calibration", +"calibrator", +"calibre", +"Caliburn", +"Caliburno", +"calicate", +"calices", +"caliciform", +"calicle", +"calico", +"calicoback", +"calicoed", +"calicular", +"caliculate", +"Calicut", +"calid", +"calidity", +"caliduct", +"California", +"Californian", +"californite", +"californium", +"caliga", +"caligated", +"caliginous", +"caliginously", +"caligo", +"Calimeris", +"Calinago", +"calinda", +"calinut", +"caliological", +"caliologist", +"caliology", +"calipash", +"calipee", +"caliper", +"caliperer", +"calipers", +"caliph", +"caliphal", +"caliphate", +"caliphship", +"Calista", +"calistheneum", +"calisthenic", +"calisthenical", +"calisthenics", +"Calite", +"caliver", +"calix", +"Calixtin", +"Calixtus", +"calk", +"calkage", +"calker", +"calkin", +"calking", +"call", +"Calla", +"callable", +"callainite", +"callant", +"callboy", +"caller", +"callet", +"calli", +"Callianassa", +"Callianassidae", +"Calliandra", +"Callicarpa", +"Callicebus", +"callid", +"callidity", +"callidness", +"calligraph", +"calligrapha", +"calligrapher", +"calligraphic", +"calligraphical", +"calligraphically", +"calligraphist", +"calligraphy", +"calling", +"Callionymidae", +"Callionymus", +"Calliope", +"calliophone", +"Calliopsis", +"calliper", +"calliperer", +"Calliphora", +"calliphorid", +"Calliphoridae", +"calliphorine", +"callipygian", +"callipygous", +"Callirrhoe", +"Callisaurus", +"callisection", +"callisteia", +"Callistemon", +"Callistephus", +"Callithrix", +"callithump", +"callithumpian", +"Callitrichaceae", +"callitrichaceous", +"Callitriche", +"Callitrichidae", +"Callitris", +"callitype", +"callo", +"Callorhynchidae", +"Callorhynchus", +"callosal", +"callose", +"callosity", +"callosomarginal", +"callosum", +"callous", +"callously", +"callousness", +"Callovian", +"callow", +"callower", +"callowman", +"callowness", +"Calluna", +"callus", +"Callynteria", +"calm", +"calmant", +"calmative", +"calmer", +"calmierer", +"calmingly", +"calmly", +"calmness", +"calmy", +"Calocarpum", +"Calochortaceae", +"Calochortus", +"calodemon", +"calography", +"calomba", +"calomel", +"calomorphic", +"Calonectria", +"Calonyction", +"calool", +"Calophyllum", +"Calopogon", +"calor", +"calorescence", +"calorescent", +"caloric", +"caloricity", +"calorie", +"calorifacient", +"calorific", +"calorifical", +"calorifically", +"calorification", +"calorifics", +"calorifier", +"calorify", +"calorigenic", +"calorimeter", +"calorimetric", +"calorimetrical", +"calorimetrically", +"calorimetry", +"calorimotor", +"caloris", +"calorisator", +"calorist", +"Calorite", +"calorize", +"calorizer", +"Calosoma", +"Calotermes", +"calotermitid", +"Calotermitidae", +"Calothrix", +"calotte", +"calotype", +"calotypic", +"calotypist", +"caloyer", +"calp", +"calpac", +"calpack", +"calpacked", +"calpulli", +"Caltha", +"caltrap", +"caltrop", +"calumba", +"calumet", +"calumniate", +"calumniation", +"calumniative", +"calumniator", +"calumniatory", +"calumnious", +"calumniously", +"calumniousness", +"calumny", +"Calusa", +"calutron", +"Calvados", +"calvaria", +"calvarium", +"Calvary", +"Calvatia", +"calve", +"calved", +"calver", +"calves", +"Calvin", +"Calvinian", +"Calvinism", +"Calvinist", +"Calvinistic", +"Calvinistical", +"Calvinistically", +"Calvinize", +"calvish", +"calvities", +"calvity", +"calvous", +"calx", +"calycanth", +"Calycanthaceae", +"calycanthaceous", +"calycanthemous", +"calycanthemy", +"calycanthine", +"Calycanthus", +"calycate", +"Calyceraceae", +"calyceraceous", +"calyces", +"calyciferous", +"calycifloral", +"calyciflorate", +"calyciflorous", +"calyciform", +"calycinal", +"calycine", +"calycle", +"calycled", +"Calycocarpum", +"calycoid", +"calycoideous", +"Calycophora", +"Calycophorae", +"calycophoran", +"Calycozoa", +"calycozoan", +"calycozoic", +"calycozoon", +"calycular", +"calyculate", +"calyculated", +"calycule", +"calyculus", +"Calydon", +"Calydonian", +"Calymene", +"calymma", +"calyphyomy", +"calypsist", +"Calypso", +"calypso", +"calypsonian", +"calypter", +"Calypterae", +"Calyptoblastea", +"calyptoblastic", +"Calyptorhynchus", +"calyptra", +"Calyptraea", +"Calyptranthes", +"Calyptrata", +"Calyptratae", +"calyptrate", +"calyptriform", +"calyptrimorphous", +"calyptro", +"calyptrogen", +"Calyptrogyne", +"Calystegia", +"calyx", +"cam", +"camaca", +"Camacan", +"camagon", +"camail", +"camailed", +"Camaldolensian", +"Camaldolese", +"Camaldolesian", +"Camaldolite", +"Camaldule", +"Camaldulian", +"camalote", +"caman", +"camansi", +"camara", +"camaraderie", +"Camarasaurus", +"camarilla", +"camass", +"Camassia", +"camata", +"camatina", +"Camaxtli", +"camb", +"Camball", +"Cambalo", +"Cambarus", +"cambaye", +"camber", +"Cambeva", +"cambial", +"cambiform", +"cambiogenetic", +"cambism", +"cambist", +"cambistry", +"cambium", +"Cambodian", +"cambogia", +"cambrel", +"cambresine", +"Cambrian", +"Cambric", +"cambricleaf", +"cambuca", +"Cambuscan", +"Cambyuskan", +"Came", +"came", +"cameist", +"camel", +"camelback", +"cameleer", +"Camelid", +"Camelidae", +"Camelina", +"cameline", +"camelish", +"camelishness", +"camelkeeper", +"Camellia", +"Camelliaceae", +"camellike", +"camellin", +"Camellus", +"camelman", +"cameloid", +"Cameloidea", +"camelopard", +"Camelopardalis", +"Camelopardid", +"Camelopardidae", +"Camelopardus", +"camelry", +"Camelus", +"Camembert", +"Camenae", +"Camenes", +"cameo", +"cameograph", +"cameography", +"camera", +"cameral", +"cameralism", +"cameralist", +"cameralistic", +"cameralistics", +"cameraman", +"Camerata", +"camerate", +"camerated", +"cameration", +"camerier", +"Camerina", +"Camerinidae", +"camerist", +"camerlingo", +"Cameronian", +"Camestres", +"camilla", +"camillus", +"camion", +"camisado", +"Camisard", +"camise", +"camisia", +"camisole", +"camlet", +"camleteen", +"Cammarum", +"cammed", +"cammock", +"cammocky", +"camomile", +"camoodi", +"camoodie", +"Camorra", +"Camorrism", +"Camorrist", +"Camorrista", +"camouflage", +"camouflager", +"camp", +"Campa", +"campagna", +"campagnol", +"campaign", +"campaigner", +"campana", +"campane", +"campanero", +"Campanian", +"campaniform", +"campanile", +"campaniliform", +"campanilla", +"campanini", +"campanist", +"campanistic", +"campanologer", +"campanological", +"campanologically", +"campanologist", +"campanology", +"Campanula", +"Campanulaceae", +"campanulaceous", +"Campanulales", +"campanular", +"Campanularia", +"Campanulariae", +"campanularian", +"Campanularidae", +"Campanulatae", +"campanulate", +"campanulated", +"campanulous", +"Campaspe", +"Campbellism", +"Campbellite", +"campbellite", +"campcraft", +"Campe", +"Campephagidae", +"campephagine", +"Campephilus", +"camper", +"campestral", +"campfight", +"campfire", +"campground", +"camphane", +"camphanic", +"camphanone", +"camphanyl", +"camphene", +"camphine", +"camphire", +"campho", +"camphocarboxylic", +"camphoid", +"camphol", +"campholic", +"campholide", +"campholytic", +"camphor", +"camphoraceous", +"camphorate", +"camphoric", +"camphorize", +"camphorone", +"camphoronic", +"camphoroyl", +"camphorphorone", +"camphorwood", +"camphory", +"camphoryl", +"camphylene", +"Campignian", +"campimeter", +"campimetrical", +"campimetry", +"Campine", +"campion", +"cample", +"campmaster", +"campo", +"Campodea", +"campodeid", +"Campodeidae", +"campodeiform", +"campodeoid", +"campody", +"Camponotus", +"campoo", +"camporee", +"campshed", +"campshedding", +"campsheeting", +"campshot", +"campstool", +"camptodrome", +"camptonite", +"Camptosorus", +"campulitropal", +"campulitropous", +"campus", +"campward", +"campylite", +"campylodrome", +"campylometer", +"Campyloneuron", +"campylospermous", +"campylotropal", +"campylotropous", +"camshach", +"camshachle", +"camshaft", +"camstane", +"camstone", +"camuning", +"camus", +"camused", +"camwood", +"can", +"Cana", +"Canaan", +"Canaanite", +"Canaanitess", +"Canaanitic", +"Canaanitish", +"canaba", +"Canacee", +"Canada", +"canada", +"Canadian", +"Canadianism", +"Canadianization", +"Canadianize", +"canadine", +"canadite", +"canadol", +"canaigre", +"canaille", +"canajong", +"canal", +"canalage", +"canalboat", +"canalicular", +"canaliculate", +"canaliculated", +"canaliculation", +"canaliculi", +"canaliculization", +"canaliculus", +"canaliferous", +"canaliform", +"canalization", +"canalize", +"canaller", +"canalling", +"canalman", +"canalside", +"Canamary", +"canamo", +"Cananaean", +"Cananga", +"Canangium", +"canape", +"canapina", +"canard", +"Canari", +"canari", +"Canarian", +"canarin", +"Canariote", +"Canarium", +"Canarsee", +"canary", +"canasta", +"canaster", +"canaut", +"Canavali", +"Canavalia", +"canavalin", +"Canberra", +"cancan", +"cancel", +"cancelable", +"cancelation", +"canceleer", +"canceler", +"cancellarian", +"cancellate", +"cancellated", +"cancellation", +"cancelli", +"cancellous", +"cancellus", +"cancelment", +"cancer", +"cancerate", +"canceration", +"cancerdrops", +"cancered", +"cancerigenic", +"cancerism", +"cancerophobe", +"cancerophobia", +"cancerous", +"cancerously", +"cancerousness", +"cancerroot", +"cancerweed", +"cancerwort", +"canch", +"canchalagua", +"Canchi", +"Cancri", +"Cancrid", +"cancriform", +"cancrinite", +"cancrisocial", +"cancrivorous", +"cancrizans", +"cancroid", +"cancrophagous", +"cancrum", +"cand", +"Candace", +"candareen", +"candela", +"candelabra", +"candelabrum", +"candelilla", +"candent", +"candescence", +"candescent", +"candescently", +"candid", +"candidacy", +"candidate", +"candidateship", +"candidature", +"candidly", +"candidness", +"candied", +"candier", +"candify", +"Candiot", +"candiru", +"candle", +"candleball", +"candlebeam", +"candleberry", +"candlebomb", +"candlebox", +"candlefish", +"candleholder", +"candlelight", +"candlelighted", +"candlelighter", +"candlelighting", +"candlelit", +"candlemaker", +"candlemaking", +"Candlemas", +"candlenut", +"candlepin", +"candler", +"candlerent", +"candleshine", +"candleshrift", +"candlestand", +"candlestick", +"candlesticked", +"candlestickward", +"candlewaster", +"candlewasting", +"candlewick", +"candlewood", +"candlewright", +"candock", +"Candollea", +"Candolleaceae", +"candolleaceous", +"candor", +"candroy", +"candy", +"candymaker", +"candymaking", +"candys", +"candystick", +"candytuft", +"candyweed", +"cane", +"canebrake", +"canel", +"canelike", +"canella", +"Canellaceae", +"canellaceous", +"Canelo", +"canelo", +"caneology", +"canephor", +"canephore", +"canephoros", +"canephroi", +"caner", +"canescence", +"canescent", +"canette", +"canewise", +"canework", +"Canfield", +"canfieldite", +"canful", +"cangan", +"cangia", +"cangle", +"cangler", +"cangue", +"canhoop", +"Canichana", +"Canichanan", +"canicola", +"Canicula", +"canicular", +"canicule", +"canid", +"Canidae", +"Canidia", +"canille", +"caninal", +"canine", +"caniniform", +"caninity", +"caninus", +"canioned", +"canions", +"Canis", +"Canisiana", +"canistel", +"canister", +"canities", +"canjac", +"cank", +"canker", +"cankerberry", +"cankerbird", +"cankereat", +"cankered", +"cankeredly", +"cankeredness", +"cankerflower", +"cankerous", +"cankerroot", +"cankerweed", +"cankerworm", +"cankerwort", +"cankery", +"canmaker", +"canmaking", +"canman", +"Canna", +"canna", +"cannabic", +"Cannabinaceae", +"cannabinaceous", +"cannabine", +"cannabinol", +"Cannabis", +"cannabism", +"Cannaceae", +"cannaceous", +"cannach", +"canned", +"cannel", +"cannelated", +"cannelure", +"cannelured", +"cannequin", +"canner", +"cannery", +"cannet", +"cannibal", +"cannibalean", +"cannibalic", +"cannibalish", +"cannibalism", +"cannibalistic", +"cannibalistically", +"cannibality", +"cannibalization", +"cannibalize", +"cannibally", +"cannikin", +"cannily", +"canniness", +"canning", +"cannon", +"cannonade", +"cannoned", +"cannoneer", +"cannoneering", +"Cannonism", +"cannonproof", +"cannonry", +"cannot", +"Cannstatt", +"cannula", +"cannular", +"cannulate", +"cannulated", +"canny", +"canoe", +"canoeing", +"Canoeiro", +"canoeist", +"canoeload", +"canoeman", +"canoewood", +"canon", +"canoncito", +"canoness", +"canonic", +"canonical", +"canonically", +"canonicalness", +"canonicals", +"canonicate", +"canonicity", +"canonics", +"canonist", +"canonistic", +"canonistical", +"canonizant", +"canonization", +"canonize", +"canonizer", +"canonlike", +"canonry", +"canonship", +"canoodle", +"canoodler", +"Canopic", +"canopic", +"Canopus", +"canopy", +"canorous", +"canorously", +"canorousness", +"Canossa", +"canroy", +"canroyer", +"canso", +"cant", +"Cantab", +"cantabank", +"cantabile", +"Cantabri", +"Cantabrian", +"Cantabrigian", +"Cantabrize", +"cantala", +"cantalite", +"cantaloupe", +"cantankerous", +"cantankerously", +"cantankerousness", +"cantar", +"cantara", +"cantaro", +"cantata", +"Cantate", +"cantation", +"cantative", +"cantatory", +"cantboard", +"canted", +"canteen", +"cantefable", +"canter", +"Canterburian", +"Canterburianism", +"Canterbury", +"canterer", +"canthal", +"Cantharellus", +"Cantharidae", +"cantharidal", +"cantharidate", +"cantharides", +"cantharidian", +"cantharidin", +"cantharidism", +"cantharidize", +"cantharis", +"cantharophilous", +"cantharus", +"canthectomy", +"canthitis", +"cantholysis", +"canthoplasty", +"canthorrhaphy", +"canthotomy", +"canthus", +"cantic", +"canticle", +"cantico", +"cantilena", +"cantilene", +"cantilever", +"cantilevered", +"cantillate", +"cantillation", +"cantily", +"cantina", +"cantiness", +"canting", +"cantingly", +"cantingness", +"cantion", +"cantish", +"cantle", +"cantlet", +"canto", +"Canton", +"canton", +"cantonal", +"cantonalism", +"cantoned", +"cantoner", +"Cantonese", +"cantonment", +"cantoon", +"cantor", +"cantoral", +"Cantorian", +"cantoris", +"cantorous", +"cantorship", +"cantred", +"cantref", +"cantrip", +"cantus", +"cantwise", +"canty", +"Canuck", +"canun", +"canvas", +"canvasback", +"canvasman", +"canvass", +"canvassy", +"cany", +"canyon", +"canzon", +"canzonet", +"caoba", +"Caodaism", +"Caodaist", +"caoutchouc", +"caoutchoucin", +"cap", +"capability", +"capable", +"capableness", +"capably", +"capacious", +"capaciously", +"capaciousness", +"capacitance", +"capacitate", +"capacitation", +"capacitative", +"capacitativly", +"capacitive", +"capacitor", +"capacity", +"capanna", +"capanne", +"caparison", +"capax", +"capcase", +"Cape", +"cape", +"caped", +"capel", +"capelet", +"capelin", +"capeline", +"Capella", +"capellet", +"caper", +"caperbush", +"capercaillie", +"capercally", +"capercut", +"caperer", +"capering", +"caperingly", +"Capernaism", +"Capernaite", +"Capernaitic", +"Capernaitical", +"Capernaitically", +"Capernaitish", +"capernoited", +"capernoitie", +"capernoity", +"capersome", +"caperwort", +"capes", +"capeskin", +"Capetian", +"Capetonian", +"capeweed", +"capewise", +"capful", +"Caph", +"caph", +"caphar", +"caphite", +"Caphtor", +"Caphtorim", +"capias", +"capicha", +"capillaceous", +"capillaire", +"capillament", +"capillarectasia", +"capillarily", +"capillarimeter", +"capillariness", +"capillariomotor", +"capillarity", +"capillary", +"capillation", +"capilliculture", +"capilliform", +"capillitial", +"capillitium", +"capillose", +"capistrate", +"capital", +"capitaldom", +"capitaled", +"capitalism", +"capitalist", +"capitalistic", +"capitalistically", +"capitalizable", +"capitalization", +"capitalize", +"capitally", +"capitalness", +"capitan", +"capitate", +"capitated", +"capitatim", +"capitation", +"capitative", +"capitatum", +"capitellar", +"capitellate", +"capitelliform", +"capitellum", +"Capito", +"Capitol", +"Capitolian", +"Capitoline", +"Capitolium", +"Capitonidae", +"Capitoninae", +"capitoul", +"capitoulate", +"capitulant", +"capitular", +"capitularly", +"capitulary", +"capitulate", +"capitulation", +"capitulator", +"capitulatory", +"capituliform", +"capitulum", +"capivi", +"capkin", +"capless", +"caplin", +"capmaker", +"capmaking", +"capman", +"capmint", +"Capnodium", +"Capnoides", +"capnomancy", +"capocchia", +"capomo", +"capon", +"caponier", +"caponize", +"caponizer", +"caporal", +"capot", +"capote", +"cappadine", +"Cappadocian", +"Capparidaceae", +"capparidaceous", +"Capparis", +"capped", +"cappelenite", +"capper", +"cappie", +"capping", +"capple", +"cappy", +"Capra", +"caprate", +"Caprella", +"Caprellidae", +"caprelline", +"capreol", +"capreolar", +"capreolary", +"capreolate", +"capreoline", +"Capreolus", +"Capri", +"capric", +"capriccetto", +"capricci", +"capriccio", +"caprice", +"capricious", +"capriciously", +"capriciousness", +"Capricorn", +"Capricornid", +"Capricornus", +"caprid", +"caprificate", +"caprification", +"caprificator", +"caprifig", +"Caprifoliaceae", +"caprifoliaceous", +"Caprifolium", +"caprifolium", +"capriform", +"caprigenous", +"Caprimulgi", +"Caprimulgidae", +"Caprimulgiformes", +"caprimulgine", +"Caprimulgus", +"caprin", +"caprine", +"caprinic", +"Capriola", +"capriole", +"Capriote", +"capriped", +"capripede", +"caprizant", +"caproate", +"caproic", +"caproin", +"Capromys", +"caprone", +"capronic", +"capronyl", +"caproyl", +"capryl", +"caprylate", +"caprylene", +"caprylic", +"caprylin", +"caprylone", +"caprylyl", +"capsa", +"capsaicin", +"Capsella", +"capsheaf", +"capshore", +"Capsian", +"capsicin", +"Capsicum", +"capsicum", +"capsid", +"Capsidae", +"capsizal", +"capsize", +"capstan", +"capstone", +"capsula", +"capsulae", +"capsular", +"capsulate", +"capsulated", +"capsulation", +"capsule", +"capsulectomy", +"capsuler", +"capsuliferous", +"capsuliform", +"capsuligerous", +"capsulitis", +"capsulociliary", +"capsulogenous", +"capsulolenticular", +"capsulopupillary", +"capsulorrhaphy", +"capsulotome", +"capsulotomy", +"capsumin", +"captaculum", +"captain", +"captaincy", +"captainess", +"captainly", +"captainry", +"captainship", +"captance", +"captation", +"caption", +"captious", +"captiously", +"captiousness", +"captivate", +"captivately", +"captivating", +"captivatingly", +"captivation", +"captivative", +"captivator", +"captivatrix", +"captive", +"captivity", +"captor", +"captress", +"capturable", +"capture", +"capturer", +"Capuan", +"capuche", +"capuched", +"Capuchin", +"capuchin", +"capucine", +"capulet", +"capulin", +"capybara", +"Caquetio", +"car", +"Cara", +"carabao", +"carabeen", +"carabid", +"Carabidae", +"carabidan", +"carabideous", +"carabidoid", +"carabin", +"carabineer", +"Carabini", +"caraboid", +"Carabus", +"carabus", +"caracal", +"caracara", +"caracol", +"caracole", +"caracoler", +"caracoli", +"caracolite", +"caracoller", +"caracore", +"caract", +"Caractacus", +"caracter", +"Caradoc", +"carafe", +"Caragana", +"Caraguata", +"caraguata", +"Caraho", +"caraibe", +"Caraipa", +"caraipi", +"Caraja", +"Carajas", +"carajura", +"caramba", +"carambola", +"carambole", +"caramel", +"caramelan", +"caramelen", +"caramelin", +"caramelization", +"caramelize", +"caramoussal", +"carancha", +"caranda", +"Carandas", +"caranday", +"carane", +"Caranga", +"carangid", +"Carangidae", +"carangoid", +"Carangus", +"caranna", +"Caranx", +"Carapa", +"carapace", +"carapaced", +"Carapache", +"Carapacho", +"carapacic", +"carapato", +"carapax", +"Carapidae", +"carapine", +"carapo", +"Carapus", +"Carara", +"carat", +"caratch", +"caraunda", +"caravan", +"caravaneer", +"caravanist", +"caravanner", +"caravansary", +"caravanserai", +"caravanserial", +"caravel", +"caraway", +"Carayan", +"carbacidometer", +"carbamate", +"carbamic", +"carbamide", +"carbamido", +"carbamine", +"carbamino", +"carbamyl", +"carbanil", +"carbanilic", +"carbanilide", +"carbarn", +"carbasus", +"carbazic", +"carbazide", +"carbazine", +"carbazole", +"carbazylic", +"carbeen", +"carbene", +"carberry", +"carbethoxy", +"carbethoxyl", +"carbide", +"carbimide", +"carbine", +"carbinol", +"carbinyl", +"carbo", +"carboazotine", +"carbocinchomeronic", +"carbodiimide", +"carbodynamite", +"carbogelatin", +"carbohemoglobin", +"carbohydrase", +"carbohydrate", +"carbohydraturia", +"carbohydrazide", +"carbohydride", +"carbohydrogen", +"carbolate", +"carbolated", +"carbolfuchsin", +"carbolic", +"carbolineate", +"Carbolineum", +"carbolize", +"Carboloy", +"carboluria", +"carbolxylol", +"carbomethene", +"carbomethoxy", +"carbomethoxyl", +"carbon", +"carbona", +"carbonaceous", +"carbonade", +"carbonado", +"Carbonari", +"Carbonarism", +"Carbonarist", +"carbonatation", +"carbonate", +"carbonation", +"carbonatization", +"carbonator", +"carbonemia", +"carbonero", +"carbonic", +"carbonide", +"Carboniferous", +"carboniferous", +"carbonification", +"carbonify", +"carbonigenous", +"carbonimeter", +"carbonimide", +"carbonite", +"carbonitride", +"carbonium", +"carbonizable", +"carbonization", +"carbonize", +"carbonizer", +"carbonless", +"Carbonnieux", +"carbonometer", +"carbonometry", +"carbonous", +"carbonuria", +"carbonyl", +"carbonylene", +"carbonylic", +"carbophilous", +"carbora", +"Carborundum", +"carborundum", +"carbosilicate", +"carbostyril", +"carboxide", +"carboxy", +"Carboxydomonas", +"carboxyhemoglobin", +"carboxyl", +"carboxylase", +"carboxylate", +"carboxylation", +"carboxylic", +"carboy", +"carboyed", +"carbro", +"carbromal", +"carbuilder", +"carbuncle", +"carbuncled", +"carbuncular", +"carbungi", +"carburant", +"carburate", +"carburation", +"carburator", +"carbure", +"carburet", +"carburetant", +"carburetor", +"carburization", +"carburize", +"carburizer", +"carburometer", +"carbyl", +"carbylamine", +"carcajou", +"carcake", +"carcanet", +"carcaneted", +"carcass", +"Carcavelhos", +"carceag", +"carcel", +"carceral", +"carcerate", +"carceration", +"Carcharhinus", +"Carcharias", +"carchariid", +"Carchariidae", +"carcharioid", +"Carcharodon", +"carcharodont", +"carcinemia", +"carcinogen", +"carcinogenesis", +"carcinogenic", +"carcinoid", +"carcinological", +"carcinologist", +"carcinology", +"carcinolysin", +"carcinolytic", +"carcinoma", +"carcinomata", +"carcinomatoid", +"carcinomatosis", +"carcinomatous", +"carcinomorphic", +"carcinophagous", +"carcinopolypus", +"carcinosarcoma", +"carcinosarcomata", +"Carcinoscorpius", +"carcinosis", +"carcoon", +"card", +"cardaissin", +"Cardamine", +"cardamom", +"Cardanic", +"cardboard", +"cardcase", +"cardecu", +"carded", +"cardel", +"carder", +"cardholder", +"cardia", +"cardiac", +"cardiacal", +"Cardiacea", +"cardiacean", +"cardiagra", +"cardiagram", +"cardiagraph", +"cardiagraphy", +"cardial", +"cardialgia", +"cardialgy", +"cardiameter", +"cardiamorphia", +"cardianesthesia", +"cardianeuria", +"cardiant", +"cardiaplegia", +"cardiarctia", +"cardiasthenia", +"cardiasthma", +"cardiataxia", +"cardiatomy", +"cardiatrophia", +"cardiauxe", +"Cardiazol", +"cardicentesis", +"cardiectasis", +"cardiectomize", +"cardiectomy", +"cardielcosis", +"cardiemphraxia", +"cardiform", +"Cardigan", +"cardigan", +"Cardiidae", +"cardin", +"cardinal", +"cardinalate", +"cardinalic", +"Cardinalis", +"cardinalism", +"cardinalist", +"cardinalitial", +"cardinalitian", +"cardinally", +"cardinalship", +"cardines", +"carding", +"cardioaccelerator", +"cardioarterial", +"cardioblast", +"cardiocarpum", +"cardiocele", +"cardiocentesis", +"cardiocirrhosis", +"cardioclasia", +"cardioclasis", +"cardiodilator", +"cardiodynamics", +"cardiodynia", +"cardiodysesthesia", +"cardiodysneuria", +"cardiogenesis", +"cardiogenic", +"cardiogram", +"cardiograph", +"cardiographic", +"cardiography", +"cardiohepatic", +"cardioid", +"cardiokinetic", +"cardiolith", +"cardiological", +"cardiologist", +"cardiology", +"cardiolysis", +"cardiomalacia", +"cardiomegaly", +"cardiomelanosis", +"cardiometer", +"cardiometric", +"cardiometry", +"cardiomotility", +"cardiomyoliposis", +"cardiomyomalacia", +"cardioncus", +"cardionecrosis", +"cardionephric", +"cardioneural", +"cardioneurosis", +"cardionosus", +"cardioparplasis", +"cardiopathic", +"cardiopathy", +"cardiopericarditis", +"cardiophobe", +"cardiophobia", +"cardiophrenia", +"cardioplasty", +"cardioplegia", +"cardiopneumatic", +"cardiopneumograph", +"cardioptosis", +"cardiopulmonary", +"cardiopuncture", +"cardiopyloric", +"cardiorenal", +"cardiorespiratory", +"cardiorrhaphy", +"cardiorrheuma", +"cardiorrhexis", +"cardioschisis", +"cardiosclerosis", +"cardioscope", +"cardiospasm", +"Cardiospermum", +"cardiosphygmogram", +"cardiosphygmograph", +"cardiosymphysis", +"cardiotherapy", +"cardiotomy", +"cardiotonic", +"cardiotoxic", +"cardiotrophia", +"cardiotrophotherapy", +"cardiovascular", +"cardiovisceral", +"cardipaludism", +"cardipericarditis", +"cardisophistical", +"carditic", +"carditis", +"Cardium", +"cardlike", +"cardmaker", +"cardmaking", +"cardo", +"cardol", +"cardon", +"cardona", +"cardoncillo", +"cardooer", +"cardoon", +"cardophagus", +"cardplayer", +"cardroom", +"cardsharp", +"cardsharping", +"cardstock", +"Carduaceae", +"carduaceous", +"Carduelis", +"Carduus", +"care", +"carecloth", +"careen", +"careenage", +"careener", +"career", +"careerer", +"careering", +"careeringly", +"careerist", +"carefree", +"careful", +"carefully", +"carefulness", +"careless", +"carelessly", +"carelessness", +"carene", +"carer", +"caress", +"caressant", +"caresser", +"caressing", +"caressingly", +"caressive", +"caressively", +"carest", +"caret", +"caretaker", +"caretaking", +"Caretta", +"Carettochelydidae", +"careworn", +"Carex", +"carfare", +"carfax", +"carfuffle", +"carful", +"carga", +"cargo", +"cargoose", +"carhop", +"carhouse", +"cariacine", +"Cariacus", +"cariama", +"Cariamae", +"Carian", +"Carib", +"Caribal", +"Cariban", +"Caribbean", +"Caribbee", +"Caribi", +"Caribisi", +"caribou", +"Carica", +"Caricaceae", +"caricaceous", +"caricatura", +"caricaturable", +"caricatural", +"caricature", +"caricaturist", +"caricetum", +"caricographer", +"caricography", +"caricologist", +"caricology", +"caricous", +"carid", +"Carida", +"Caridea", +"caridean", +"caridoid", +"Caridomorpha", +"caries", +"Carijona", +"carillon", +"carillonneur", +"carina", +"carinal", +"Carinaria", +"Carinatae", +"carinate", +"carinated", +"carination", +"Cariniana", +"cariniform", +"Carinthian", +"cariole", +"carioling", +"cariosity", +"carious", +"cariousness", +"Caripuna", +"Cariri", +"Caririan", +"Carissa", +"caritative", +"caritive", +"Cariyo", +"cark", +"carking", +"carkingly", +"carkled", +"Carl", +"carl", +"carless", +"carlet", +"carlie", +"carlin", +"Carlina", +"carline", +"carling", +"carlings", +"carlish", +"carlishness", +"Carlisle", +"Carlism", +"Carlist", +"carload", +"carloading", +"carloadings", +"carlot", +"Carlovingian", +"carls", +"Carludovica", +"Carlylean", +"Carlyleian", +"Carlylese", +"Carlylesque", +"Carlylian", +"Carlylism", +"carmagnole", +"carmalum", +"Carman", +"carman", +"Carmanians", +"Carmel", +"Carmela", +"carmele", +"Carmelite", +"Carmelitess", +"carmeloite", +"Carmen", +"carminative", +"Carmine", +"carmine", +"carminette", +"carminic", +"carminite", +"carminophilous", +"carmoisin", +"carmot", +"Carnacian", +"carnage", +"carnaged", +"carnal", +"carnalism", +"carnalite", +"carnality", +"carnalize", +"carnallite", +"carnally", +"carnalness", +"carnaptious", +"Carnaria", +"carnassial", +"carnate", +"carnation", +"carnationed", +"carnationist", +"carnauba", +"carnaubic", +"carnaubyl", +"Carnegie", +"Carnegiea", +"carnelian", +"carneol", +"carneole", +"carneous", +"carney", +"carnic", +"carniferous", +"carniferrin", +"carnifex", +"carnification", +"carnifices", +"carnificial", +"carniform", +"carnify", +"Carniolan", +"carnival", +"carnivaler", +"carnivalesque", +"Carnivora", +"carnivoracity", +"carnivoral", +"carnivore", +"carnivorism", +"carnivorous", +"carnivorously", +"carnivorousness", +"carnose", +"carnosine", +"carnosity", +"carnotite", +"carnous", +"Caro", +"caroa", +"carob", +"caroba", +"caroche", +"Caroid", +"Carol", +"carol", +"Carolan", +"Carolean", +"caroler", +"caroli", +"carolin", +"Carolina", +"Caroline", +"caroline", +"Caroling", +"Carolingian", +"Carolinian", +"carolus", +"carom", +"carombolette", +"carone", +"caronic", +"caroome", +"caroon", +"carotene", +"carotenoid", +"carotic", +"carotid", +"carotidal", +"carotidean", +"carotin", +"carotinemia", +"carotinoid", +"caroubier", +"carousal", +"carouse", +"carouser", +"carousing", +"carousingly", +"carp", +"carpaine", +"carpal", +"carpale", +"carpalia", +"Carpathian", +"carpel", +"carpellary", +"carpellate", +"carpent", +"carpenter", +"Carpenteria", +"carpentering", +"carpentership", +"carpentry", +"carper", +"carpet", +"carpetbag", +"carpetbagger", +"carpetbaggery", +"carpetbaggism", +"carpetbagism", +"carpetbeater", +"carpeting", +"carpetlayer", +"carpetless", +"carpetmaker", +"carpetmaking", +"carpetmonger", +"carpetweb", +"carpetweed", +"carpetwork", +"carpetwoven", +"Carphiophiops", +"carpholite", +"Carphophis", +"carphosiderite", +"carpid", +"carpidium", +"carpincho", +"carping", +"carpingly", +"carpintero", +"Carpinus", +"Carpiodes", +"carpitis", +"carpium", +"carpocace", +"Carpocapsa", +"carpocarpal", +"carpocephala", +"carpocephalum", +"carpocerite", +"carpocervical", +"Carpocratian", +"Carpodacus", +"Carpodetus", +"carpogam", +"carpogamy", +"carpogenic", +"carpogenous", +"carpogone", +"carpogonial", +"carpogonium", +"Carpoidea", +"carpolite", +"carpolith", +"carpological", +"carpologically", +"carpologist", +"carpology", +"carpomania", +"carpometacarpal", +"carpometacarpus", +"carpopedal", +"Carpophaga", +"carpophagous", +"carpophalangeal", +"carpophore", +"carpophyll", +"carpophyte", +"carpopodite", +"carpopoditic", +"carpoptosia", +"carpoptosis", +"carport", +"carpos", +"carposperm", +"carposporangia", +"carposporangial", +"carposporangium", +"carpospore", +"carposporic", +"carposporous", +"carpostome", +"carpus", +"carquaise", +"carr", +"carrack", +"carrageen", +"carrageenin", +"Carrara", +"Carraran", +"carrel", +"carriable", +"carriage", +"carriageable", +"carriageful", +"carriageless", +"carriagesmith", +"carriageway", +"Carrick", +"carrick", +"Carrie", +"carried", +"carrier", +"carrion", +"carritch", +"carritches", +"carriwitchet", +"Carrizo", +"carrizo", +"carroch", +"carrollite", +"carronade", +"carrot", +"carrotage", +"carroter", +"carrotiness", +"carrottop", +"carrotweed", +"carrotwood", +"carroty", +"carrousel", +"carrow", +"Carry", +"carry", +"carryall", +"carrying", +"carrytale", +"carse", +"carshop", +"carsick", +"carsmith", +"cart", +"cartable", +"cartaceous", +"cartage", +"cartboot", +"cartbote", +"carte", +"cartel", +"cartelism", +"cartelist", +"cartelization", +"cartelize", +"carter", +"Cartesian", +"Cartesianism", +"cartful", +"Carthaginian", +"carthame", +"carthamic", +"carthamin", +"Carthamus", +"Carthusian", +"Cartier", +"cartilage", +"cartilaginean", +"Cartilaginei", +"cartilagineous", +"Cartilagines", +"cartilaginification", +"cartilaginoid", +"cartilaginous", +"cartisane", +"Cartist", +"cartload", +"cartmaker", +"cartmaking", +"cartman", +"cartobibliography", +"cartogram", +"cartograph", +"cartographer", +"cartographic", +"cartographical", +"cartographically", +"cartography", +"cartomancy", +"carton", +"cartonnage", +"cartoon", +"cartoonist", +"cartouche", +"cartridge", +"cartsale", +"cartulary", +"cartway", +"cartwright", +"cartwrighting", +"carty", +"carua", +"carucage", +"carucal", +"carucate", +"carucated", +"Carum", +"caruncle", +"caruncula", +"carunculae", +"caruncular", +"carunculate", +"carunculated", +"carunculous", +"carvacrol", +"carvacryl", +"carval", +"carve", +"carvel", +"carven", +"carvene", +"carver", +"carvership", +"carvestrene", +"carving", +"carvoepra", +"carvol", +"carvomenthene", +"carvone", +"carvyl", +"carwitchet", +"Carya", +"caryatic", +"caryatid", +"caryatidal", +"caryatidean", +"caryatidic", +"caryl", +"Caryocar", +"Caryocaraceae", +"caryocaraceous", +"Caryophyllaceae", +"caryophyllaceous", +"caryophyllene", +"caryophylleous", +"caryophyllin", +"caryophyllous", +"Caryophyllus", +"caryopilite", +"caryopses", +"caryopsides", +"caryopsis", +"Caryopteris", +"Caryota", +"casaba", +"casabe", +"casal", +"casalty", +"Casamarca", +"Casanovanic", +"Casasia", +"casate", +"casaun", +"casava", +"casave", +"casavi", +"casbah", +"cascabel", +"cascade", +"Cascadia", +"Cascadian", +"cascadite", +"cascado", +"cascalho", +"cascalote", +"cascara", +"cascarilla", +"cascaron", +"casco", +"cascol", +"case", +"Casearia", +"casease", +"caseate", +"caseation", +"casebook", +"casebox", +"cased", +"caseful", +"casefy", +"caseharden", +"caseic", +"casein", +"caseinate", +"caseinogen", +"casekeeper", +"Casel", +"caseless", +"caselessly", +"casemaker", +"casemaking", +"casemate", +"casemated", +"casement", +"casemented", +"caseolysis", +"caseose", +"caseous", +"caser", +"casern", +"caseum", +"caseweed", +"casewood", +"casework", +"caseworker", +"caseworm", +"cash", +"casha", +"cashable", +"cashableness", +"cashaw", +"cashbook", +"cashbox", +"cashboy", +"cashcuttee", +"cashel", +"cashew", +"cashgirl", +"Cashibo", +"cashier", +"cashierer", +"cashierment", +"cashkeeper", +"cashment", +"Cashmere", +"cashmere", +"cashmerette", +"Cashmirian", +"Casimir", +"Casimiroa", +"casing", +"casino", +"casiri", +"cask", +"casket", +"casking", +"casklike", +"Caslon", +"Caspar", +"Casparian", +"Caspian", +"casque", +"casqued", +"casquet", +"casquetel", +"casquette", +"cass", +"cassabanana", +"cassabully", +"cassady", +"Cassandra", +"cassareep", +"cassation", +"casse", +"Cassegrain", +"Cassegrainian", +"casselty", +"cassena", +"casserole", +"Cassia", +"cassia", +"Cassiaceae", +"Cassian", +"cassican", +"Cassicus", +"Cassida", +"cassideous", +"cassidid", +"Cassididae", +"Cassidinae", +"cassidony", +"Cassidulina", +"cassiduloid", +"Cassiduloidea", +"Cassie", +"cassie", +"Cassiepeia", +"cassimere", +"cassina", +"cassine", +"Cassinese", +"cassinette", +"Cassinian", +"cassino", +"cassinoid", +"cassioberry", +"Cassiope", +"Cassiopeia", +"Cassiopeian", +"Cassiopeid", +"cassiopeium", +"Cassis", +"cassis", +"cassiterite", +"Cassius", +"cassock", +"cassolette", +"casson", +"cassonade", +"cassoon", +"cassowary", +"cassumunar", +"Cassytha", +"Cassythaceae", +"cast", +"castable", +"castagnole", +"Castalia", +"Castalian", +"Castalides", +"Castalio", +"Castanea", +"castanean", +"castaneous", +"castanet", +"Castanopsis", +"Castanospermum", +"castaway", +"caste", +"casteless", +"castelet", +"castellan", +"castellano", +"castellanship", +"castellany", +"castellar", +"castellate", +"castellated", +"castellation", +"caster", +"casterless", +"casthouse", +"castice", +"castigable", +"castigate", +"castigation", +"castigative", +"castigator", +"castigatory", +"Castilian", +"Castilla", +"Castilleja", +"Castilloa", +"casting", +"castle", +"castled", +"castlelike", +"castlet", +"castlewards", +"castlewise", +"castling", +"castock", +"castoff", +"Castor", +"castor", +"Castores", +"castoreum", +"castorial", +"Castoridae", +"castorin", +"castorite", +"castorized", +"Castoroides", +"castory", +"castra", +"castral", +"castrametation", +"castrate", +"castrater", +"castration", +"castrator", +"castrensial", +"castrensian", +"castrum", +"castuli", +"casual", +"casualism", +"casualist", +"casuality", +"casually", +"casualness", +"casualty", +"Casuariidae", +"Casuariiformes", +"Casuarina", +"Casuarinaceae", +"casuarinaceous", +"Casuarinales", +"Casuarius", +"casuary", +"casuist", +"casuistess", +"casuistic", +"casuistical", +"casuistically", +"casuistry", +"casula", +"caswellite", +"Casziel", +"Cat", +"cat", +"catabaptist", +"catabases", +"catabasis", +"catabatic", +"catabibazon", +"catabiotic", +"catabolic", +"catabolically", +"catabolin", +"catabolism", +"catabolite", +"catabolize", +"catacaustic", +"catachreses", +"catachresis", +"catachrestic", +"catachrestical", +"catachrestically", +"catachthonian", +"cataclasm", +"cataclasmic", +"cataclastic", +"cataclinal", +"cataclysm", +"cataclysmal", +"cataclysmatic", +"cataclysmatist", +"cataclysmic", +"cataclysmically", +"cataclysmist", +"catacomb", +"catacorolla", +"catacoustics", +"catacromyodian", +"catacrotic", +"catacrotism", +"catacumbal", +"catadicrotic", +"catadicrotism", +"catadioptric", +"catadioptrical", +"catadioptrics", +"catadromous", +"catafalco", +"catafalque", +"catagenesis", +"catagenetic", +"catagmatic", +"Cataian", +"catakinesis", +"catakinetic", +"catakinetomer", +"catakinomeric", +"Catalan", +"Catalanganes", +"Catalanist", +"catalase", +"Catalaunian", +"catalecta", +"catalectic", +"catalecticant", +"catalepsis", +"catalepsy", +"cataleptic", +"cataleptiform", +"cataleptize", +"cataleptoid", +"catalexis", +"catalina", +"catalineta", +"catalinite", +"catallactic", +"catallactically", +"catallactics", +"catallum", +"catalogia", +"catalogic", +"catalogical", +"catalogist", +"catalogistic", +"catalogue", +"cataloguer", +"cataloguish", +"cataloguist", +"cataloguize", +"Catalonian", +"catalowne", +"Catalpa", +"catalpa", +"catalufa", +"catalyses", +"catalysis", +"catalyst", +"catalyte", +"catalytic", +"catalytical", +"catalytically", +"catalyzator", +"catalyze", +"catalyzer", +"catamaran", +"Catamarcan", +"Catamarenan", +"catamenia", +"catamenial", +"catamite", +"catamited", +"catamiting", +"catamount", +"catamountain", +"catan", +"Catananche", +"catapan", +"catapasm", +"catapetalous", +"cataphasia", +"cataphatic", +"cataphora", +"cataphoresis", +"cataphoretic", +"cataphoria", +"cataphoric", +"cataphract", +"Cataphracta", +"Cataphracti", +"cataphrenia", +"cataphrenic", +"Cataphrygian", +"cataphrygianism", +"cataphyll", +"cataphylla", +"cataphyllary", +"cataphyllum", +"cataphysical", +"cataplasia", +"cataplasis", +"cataplasm", +"catapleiite", +"cataplexy", +"catapult", +"catapultic", +"catapultier", +"cataract", +"cataractal", +"cataracted", +"cataractine", +"cataractous", +"cataractwise", +"cataria", +"catarinite", +"catarrh", +"catarrhal", +"catarrhally", +"catarrhed", +"Catarrhina", +"catarrhine", +"catarrhinian", +"catarrhous", +"catasarka", +"Catasetum", +"catasta", +"catastaltic", +"catastasis", +"catastate", +"catastatic", +"catasterism", +"catastrophal", +"catastrophe", +"catastrophic", +"catastrophical", +"catastrophically", +"catastrophism", +"catastrophist", +"catathymic", +"catatonia", +"catatoniac", +"catatonic", +"catawampous", +"catawampously", +"catawamptious", +"catawamptiously", +"catawampus", +"Catawba", +"catberry", +"catbird", +"catboat", +"catcall", +"catch", +"catchable", +"catchall", +"catchcry", +"catcher", +"catchfly", +"catchiness", +"catching", +"catchingly", +"catchingness", +"catchland", +"catchment", +"catchpenny", +"catchplate", +"catchpole", +"catchpolery", +"catchpoleship", +"catchpoll", +"catchpollery", +"catchup", +"catchwater", +"catchweed", +"catchweight", +"catchword", +"catchwork", +"catchy", +"catclaw", +"catdom", +"cate", +"catechesis", +"catechetic", +"catechetical", +"catechetically", +"catechin", +"catechism", +"catechismal", +"catechist", +"catechistic", +"catechistical", +"catechistically", +"catechizable", +"catechization", +"catechize", +"catechizer", +"catechol", +"catechu", +"catechumen", +"catechumenal", +"catechumenate", +"catechumenical", +"catechumenically", +"catechumenism", +"catechumenship", +"catechutannic", +"categorem", +"categorematic", +"categorematical", +"categorematically", +"categorial", +"categoric", +"categorical", +"categorically", +"categoricalness", +"categorist", +"categorization", +"categorize", +"category", +"catelectrotonic", +"catelectrotonus", +"catella", +"catena", +"catenae", +"catenarian", +"catenary", +"catenate", +"catenated", +"catenation", +"catenoid", +"catenulate", +"catepuce", +"cater", +"cateran", +"catercap", +"catercorner", +"caterer", +"caterership", +"cateress", +"caterpillar", +"caterpillared", +"caterpillarlike", +"caterva", +"caterwaul", +"caterwauler", +"caterwauling", +"Catesbaea", +"cateye", +"catface", +"catfaced", +"catfacing", +"catfall", +"catfish", +"catfoot", +"catfooted", +"catgut", +"Catha", +"Cathari", +"Catharina", +"Catharine", +"Catharism", +"Catharist", +"Catharistic", +"catharization", +"catharize", +"catharpin", +"catharping", +"Cathars", +"catharsis", +"Cathartae", +"Cathartes", +"cathartic", +"cathartical", +"cathartically", +"catharticalness", +"Cathartidae", +"Cathartides", +"Cathartolinum", +"Cathay", +"Cathayan", +"cathead", +"cathect", +"cathectic", +"cathection", +"cathedra", +"cathedral", +"cathedraled", +"cathedralesque", +"cathedralic", +"cathedrallike", +"cathedralwise", +"cathedratic", +"cathedratica", +"cathedratical", +"cathedratically", +"cathedraticum", +"cathepsin", +"Catherine", +"catheter", +"catheterism", +"catheterization", +"catheterize", +"catheti", +"cathetometer", +"cathetometric", +"cathetus", +"cathexion", +"cathexis", +"cathidine", +"cathin", +"cathine", +"cathinine", +"cathion", +"cathisma", +"cathodal", +"cathode", +"cathodic", +"cathodical", +"cathodically", +"cathodofluorescence", +"cathodograph", +"cathodography", +"cathodoluminescence", +"cathograph", +"cathography", +"cathole", +"catholic", +"catholical", +"catholically", +"catholicalness", +"catholicate", +"catholicism", +"catholicist", +"catholicity", +"catholicize", +"catholicizer", +"catholicly", +"catholicness", +"catholicon", +"catholicos", +"catholicus", +"catholyte", +"cathood", +"cathop", +"cathro", +"Catilinarian", +"cation", +"cationic", +"cativo", +"catjang", +"catkin", +"catkinate", +"catlap", +"catlike", +"catlin", +"catling", +"catlinite", +"catmalison", +"catmint", +"catnip", +"catoblepas", +"Catocala", +"catocalid", +"catocathartic", +"catoctin", +"Catodon", +"catodont", +"catogene", +"catogenic", +"Catoism", +"Catonian", +"Catonic", +"Catonically", +"Catonism", +"catoptric", +"catoptrical", +"catoptrically", +"catoptrics", +"catoptrite", +"catoptromancy", +"catoptromantic", +"Catoquina", +"catostomid", +"Catostomidae", +"catostomoid", +"Catostomus", +"catpiece", +"catpipe", +"catproof", +"Catskill", +"catskin", +"catstep", +"catstick", +"catstitch", +"catstitcher", +"catstone", +"catsup", +"cattabu", +"cattail", +"cattalo", +"cattery", +"Catti", +"cattily", +"cattimandoo", +"cattiness", +"catting", +"cattish", +"cattishly", +"cattishness", +"cattle", +"cattlebush", +"cattlegate", +"cattleless", +"cattleman", +"Cattleya", +"cattleya", +"cattleyak", +"Catty", +"catty", +"cattyman", +"Catullian", +"catvine", +"catwalk", +"catwise", +"catwood", +"catwort", +"caubeen", +"cauboge", +"Caucasian", +"Caucasic", +"Caucasoid", +"cauch", +"cauchillo", +"caucho", +"caucus", +"cauda", +"caudad", +"caudae", +"caudal", +"caudally", +"caudalward", +"Caudata", +"caudata", +"caudate", +"caudated", +"caudation", +"caudatolenticular", +"caudatory", +"caudatum", +"caudex", +"caudices", +"caudicle", +"caudiform", +"caudillism", +"caudle", +"caudocephalad", +"caudodorsal", +"caudofemoral", +"caudolateral", +"caudotibial", +"caudotibialis", +"Caughnawaga", +"caught", +"cauk", +"caul", +"cauld", +"cauldrife", +"cauldrifeness", +"Caulerpa", +"Caulerpaceae", +"caulerpaceous", +"caules", +"caulescent", +"caulicle", +"caulicole", +"caulicolous", +"caulicule", +"cauliculus", +"cauliferous", +"cauliflorous", +"cauliflory", +"cauliflower", +"cauliform", +"cauligenous", +"caulinar", +"caulinary", +"cauline", +"caulis", +"Caulite", +"caulivorous", +"caulocarpic", +"caulocarpous", +"caulome", +"caulomer", +"caulomic", +"caulophylline", +"Caulophyllum", +"Caulopteris", +"caulopteris", +"caulosarc", +"caulotaxis", +"caulotaxy", +"caulote", +"caum", +"cauma", +"caumatic", +"caunch", +"Caunos", +"Caunus", +"caup", +"caupo", +"caupones", +"Cauqui", +"caurale", +"Caurus", +"causability", +"causable", +"causal", +"causalgia", +"causality", +"causally", +"causate", +"causation", +"causational", +"causationism", +"causationist", +"causative", +"causatively", +"causativeness", +"causativity", +"cause", +"causeful", +"causeless", +"causelessly", +"causelessness", +"causer", +"causerie", +"causeway", +"causewayman", +"causey", +"causidical", +"causing", +"causingness", +"causse", +"causson", +"caustic", +"caustical", +"caustically", +"causticiser", +"causticism", +"causticity", +"causticization", +"causticize", +"causticizer", +"causticly", +"causticness", +"caustification", +"caustify", +"Causus", +"cautel", +"cautelous", +"cautelously", +"cautelousness", +"cauter", +"cauterant", +"cauterization", +"cauterize", +"cautery", +"caution", +"cautionary", +"cautioner", +"cautionry", +"cautious", +"cautiously", +"cautiousness", +"cautivo", +"cava", +"cavae", +"caval", +"cavalcade", +"cavalero", +"cavalier", +"cavalierish", +"cavalierishness", +"cavalierism", +"cavalierly", +"cavalierness", +"cavaliero", +"cavaliership", +"cavalla", +"cavalry", +"cavalryman", +"cavascope", +"cavate", +"cavatina", +"cave", +"caveat", +"caveator", +"cavekeeper", +"cavel", +"cavelet", +"cavelike", +"cavendish", +"cavern", +"cavernal", +"caverned", +"cavernicolous", +"cavernitis", +"cavernlike", +"cavernoma", +"cavernous", +"cavernously", +"cavernulous", +"cavesson", +"cavetto", +"Cavia", +"caviar", +"cavicorn", +"Cavicornia", +"Cavidae", +"cavie", +"cavil", +"caviler", +"caviling", +"cavilingly", +"cavilingness", +"cavillation", +"Cavina", +"caving", +"cavings", +"cavish", +"cavitary", +"cavitate", +"cavitation", +"cavitied", +"cavity", +"caviya", +"cavort", +"cavus", +"cavy", +"caw", +"cawk", +"cawky", +"cawney", +"cawquaw", +"caxiri", +"caxon", +"Caxton", +"Caxtonian", +"cay", +"Cayapa", +"Cayapo", +"Cayenne", +"cayenne", +"cayenned", +"Cayleyan", +"cayman", +"Cayubaba", +"Cayubaban", +"Cayuga", +"Cayugan", +"Cayuse", +"Cayuvava", +"caza", +"cazimi", +"Ccoya", +"ce", +"Ceanothus", +"cearin", +"cease", +"ceaseless", +"ceaselessly", +"ceaselessness", +"ceasmic", +"Cebalrai", +"Cebatha", +"cebell", +"cebian", +"cebid", +"Cebidae", +"cebil", +"cebine", +"ceboid", +"cebollite", +"cebur", +"Cebus", +"cecidiologist", +"cecidiology", +"cecidium", +"cecidogenous", +"cecidologist", +"cecidology", +"cecidomyian", +"cecidomyiid", +"Cecidomyiidae", +"cecidomyiidous", +"Cecil", +"Cecile", +"Cecilia", +"cecilite", +"cecils", +"Cecily", +"cecity", +"cecograph", +"Cecomorphae", +"cecomorphic", +"cecostomy", +"Cecropia", +"Cecrops", +"cecutiency", +"cedar", +"cedarbird", +"cedared", +"cedarn", +"cedarware", +"cedarwood", +"cedary", +"cede", +"cedent", +"ceder", +"cedilla", +"cedrat", +"cedrate", +"cedre", +"Cedrela", +"cedrene", +"Cedric", +"cedrin", +"cedrine", +"cedriret", +"cedrium", +"cedrol", +"cedron", +"Cedrus", +"cedry", +"cedula", +"cee", +"Ceiba", +"ceibo", +"ceil", +"ceile", +"ceiler", +"ceilidh", +"ceiling", +"ceilinged", +"ceilingward", +"ceilingwards", +"ceilometer", +"Celadon", +"celadon", +"celadonite", +"Celaeno", +"celandine", +"Celanese", +"Celarent", +"Celastraceae", +"celastraceous", +"Celastrus", +"celation", +"celative", +"celature", +"Celebesian", +"celebrant", +"celebrate", +"celebrated", +"celebratedness", +"celebrater", +"celebration", +"celebrative", +"celebrator", +"celebratory", +"celebrity", +"celemin", +"celemines", +"celeomorph", +"Celeomorphae", +"celeomorphic", +"celeriac", +"celerity", +"celery", +"celesta", +"Celeste", +"celeste", +"celestial", +"celestiality", +"celestialize", +"celestially", +"celestialness", +"celestina", +"Celestine", +"celestine", +"Celestinian", +"celestite", +"celestitude", +"Celia", +"celiac", +"celiadelphus", +"celiagra", +"celialgia", +"celibacy", +"celibatarian", +"celibate", +"celibatic", +"celibatist", +"celibatory", +"celidographer", +"celidography", +"celiectasia", +"celiectomy", +"celiemia", +"celiitis", +"celiocele", +"celiocentesis", +"celiocolpotomy", +"celiocyesis", +"celiodynia", +"celioelytrotomy", +"celioenterotomy", +"celiogastrotomy", +"celiohysterotomy", +"celiolymph", +"celiomyalgia", +"celiomyodynia", +"celiomyomectomy", +"celiomyomotomy", +"celiomyositis", +"celioncus", +"celioparacentesis", +"celiopyosis", +"celiorrhaphy", +"celiorrhea", +"celiosalpingectomy", +"celiosalpingotomy", +"celioschisis", +"celioscope", +"celioscopy", +"celiotomy", +"celite", +"cell", +"cella", +"cellae", +"cellar", +"cellarage", +"cellarer", +"cellaress", +"cellaret", +"cellaring", +"cellarless", +"cellarman", +"cellarous", +"cellarway", +"cellarwoman", +"cellated", +"celled", +"Cellepora", +"cellepore", +"Cellfalcicula", +"celliferous", +"celliform", +"cellifugal", +"cellipetal", +"cellist", +"Cellite", +"cello", +"cellobiose", +"celloid", +"celloidin", +"celloist", +"cellophane", +"cellose", +"Cellucotton", +"cellular", +"cellularity", +"cellularly", +"cellulase", +"cellulate", +"cellulated", +"cellulation", +"cellule", +"cellulicidal", +"celluliferous", +"cellulifugal", +"cellulifugally", +"cellulin", +"cellulipetal", +"cellulipetally", +"cellulitis", +"cellulocutaneous", +"cellulofibrous", +"Celluloid", +"celluloid", +"celluloided", +"Cellulomonadeae", +"Cellulomonas", +"cellulose", +"cellulosic", +"cellulosity", +"cellulotoxic", +"cellulous", +"Cellvibrio", +"Celosia", +"Celotex", +"celotomy", +"Celsia", +"celsian", +"Celsius", +"Celt", +"celt", +"Celtdom", +"Celtiberi", +"Celtiberian", +"Celtic", +"Celtically", +"Celticism", +"Celticist", +"Celticize", +"Celtidaceae", +"celtiform", +"Celtillyrians", +"Celtis", +"Celtish", +"Celtism", +"Celtist", +"celtium", +"Celtization", +"Celtologist", +"Celtologue", +"Celtomaniac", +"Celtophil", +"Celtophobe", +"Celtophobia", +"celtuce", +"cembalist", +"cembalo", +"cement", +"cemental", +"cementation", +"cementatory", +"cementer", +"cementification", +"cementin", +"cementite", +"cementitious", +"cementless", +"cementmaker", +"cementmaking", +"cementoblast", +"cementoma", +"cementum", +"cemeterial", +"cemetery", +"cenacle", +"cenaculum", +"cenanthous", +"cenanthy", +"cencerro", +"Cenchrus", +"cendre", +"cenobian", +"cenobite", +"cenobitic", +"cenobitical", +"cenobitically", +"cenobitism", +"cenobium", +"cenoby", +"cenogenesis", +"cenogenetic", +"cenogenetically", +"cenogonous", +"Cenomanian", +"cenosite", +"cenosity", +"cenospecies", +"cenospecific", +"cenospecifically", +"cenotaph", +"cenotaphic", +"cenotaphy", +"Cenozoic", +"cenozoology", +"cense", +"censer", +"censerless", +"censive", +"censor", +"censorable", +"censorate", +"censorial", +"censorious", +"censoriously", +"censoriousness", +"censorship", +"censual", +"censurability", +"censurable", +"censurableness", +"censurably", +"censure", +"censureless", +"censurer", +"censureship", +"census", +"cent", +"centage", +"cental", +"centare", +"centaur", +"centaurdom", +"Centaurea", +"centauress", +"centauri", +"centaurial", +"centaurian", +"centauric", +"Centaurid", +"Centauridium", +"Centaurium", +"centauromachia", +"centauromachy", +"Centaurus", +"centaurus", +"centaury", +"centavo", +"centena", +"centenar", +"centenarian", +"centenarianism", +"centenary", +"centenier", +"centenionalis", +"centennial", +"centennially", +"center", +"centerable", +"centerboard", +"centered", +"centerer", +"centering", +"centerless", +"centermost", +"centerpiece", +"centervelic", +"centerward", +"centerwise", +"centesimal", +"centesimally", +"centesimate", +"centesimation", +"centesimi", +"centesimo", +"centesis", +"Centetes", +"centetid", +"Centetidae", +"centgener", +"centiar", +"centiare", +"centibar", +"centifolious", +"centigrade", +"centigram", +"centile", +"centiliter", +"centillion", +"centillionth", +"Centiloquy", +"centime", +"centimeter", +"centimo", +"centimolar", +"centinormal", +"centipedal", +"centipede", +"centiplume", +"centipoise", +"centistere", +"centistoke", +"centner", +"cento", +"centonical", +"centonism", +"centrad", +"central", +"centrale", +"Centrales", +"centralism", +"centralist", +"centralistic", +"centrality", +"centralization", +"centralize", +"centralizer", +"centrally", +"centralness", +"centranth", +"Centranthus", +"centrarchid", +"Centrarchidae", +"centrarchoid", +"Centraxonia", +"centraxonial", +"Centrechinoida", +"centric", +"Centricae", +"centrical", +"centricality", +"centrically", +"centricalness", +"centricipital", +"centriciput", +"centricity", +"centriffed", +"centrifugal", +"centrifugalization", +"centrifugalize", +"centrifugaller", +"centrifugally", +"centrifugate", +"centrifugation", +"centrifuge", +"centrifugence", +"centriole", +"centripetal", +"centripetalism", +"centripetally", +"centripetence", +"centripetency", +"centriscid", +"Centriscidae", +"centrisciform", +"centriscoid", +"Centriscus", +"centrist", +"centroacinar", +"centrobaric", +"centrobarical", +"centroclinal", +"centrode", +"centrodesmose", +"centrodesmus", +"centrodorsal", +"centrodorsally", +"centroid", +"centroidal", +"centrolecithal", +"Centrolepidaceae", +"centrolepidaceous", +"centrolinead", +"centrolineal", +"centromere", +"centronucleus", +"centroplasm", +"Centropomidae", +"Centropomus", +"Centrosema", +"centrosome", +"centrosomic", +"Centrosoyus", +"Centrospermae", +"centrosphere", +"centrosymmetric", +"centrosymmetry", +"Centrotus", +"centrum", +"centry", +"centum", +"centumvir", +"centumviral", +"centumvirate", +"Centunculus", +"centuple", +"centuplicate", +"centuplication", +"centuply", +"centuria", +"centurial", +"centuriate", +"centuriation", +"centuriator", +"centuried", +"centurion", +"century", +"ceorl", +"ceorlish", +"cep", +"cepa", +"cepaceous", +"cepe", +"cephaeline", +"Cephaelis", +"Cephalacanthidae", +"Cephalacanthus", +"cephalad", +"cephalagra", +"cephalalgia", +"cephalalgic", +"cephalalgy", +"cephalanthium", +"cephalanthous", +"Cephalanthus", +"Cephalaspis", +"Cephalata", +"cephalate", +"cephaldemae", +"cephalemia", +"cephaletron", +"Cephaleuros", +"cephalhematoma", +"cephalhydrocele", +"cephalic", +"cephalin", +"Cephalina", +"cephaline", +"cephalism", +"cephalitis", +"cephalization", +"cephaloauricular", +"Cephalobranchiata", +"cephalobranchiate", +"cephalocathartic", +"cephalocaudal", +"cephalocele", +"cephalocentesis", +"cephalocercal", +"Cephalocereus", +"cephalochord", +"Cephalochorda", +"cephalochordal", +"Cephalochordata", +"cephalochordate", +"cephaloclasia", +"cephaloclast", +"cephalocone", +"cephaloconic", +"cephalocyst", +"cephalodiscid", +"Cephalodiscida", +"Cephalodiscus", +"cephalodymia", +"cephalodymus", +"cephalodynia", +"cephalofacial", +"cephalogenesis", +"cephalogram", +"cephalograph", +"cephalohumeral", +"cephalohumeralis", +"cephaloid", +"cephalology", +"cephalomancy", +"cephalomant", +"cephalomelus", +"cephalomenia", +"cephalomeningitis", +"cephalomere", +"cephalometer", +"cephalometric", +"cephalometry", +"cephalomotor", +"cephalomyitis", +"cephalon", +"cephalonasal", +"cephalopagus", +"cephalopathy", +"cephalopharyngeal", +"cephalophine", +"cephalophorous", +"Cephalophus", +"cephalophyma", +"cephaloplegia", +"cephaloplegic", +"cephalopod", +"Cephalopoda", +"cephalopodan", +"cephalopodic", +"cephalopodous", +"Cephalopterus", +"cephalorachidian", +"cephalorhachidian", +"cephalosome", +"cephalospinal", +"Cephalosporium", +"cephalostyle", +"Cephalotaceae", +"cephalotaceous", +"Cephalotaxus", +"cephalotheca", +"cephalothecal", +"cephalothoracic", +"cephalothoracopagus", +"cephalothorax", +"cephalotome", +"cephalotomy", +"cephalotractor", +"cephalotribe", +"cephalotripsy", +"cephalotrocha", +"Cephalotus", +"cephalous", +"Cephas", +"Cepheid", +"cephid", +"Cephidae", +"Cephus", +"Cepolidae", +"ceps", +"ceptor", +"cequi", +"ceraceous", +"cerago", +"ceral", +"ceramal", +"cerambycid", +"Cerambycidae", +"Ceramiaceae", +"ceramiaceous", +"ceramic", +"ceramicite", +"ceramics", +"ceramidium", +"ceramist", +"Ceramium", +"ceramographic", +"ceramography", +"cerargyrite", +"ceras", +"cerasein", +"cerasin", +"cerastes", +"Cerastium", +"Cerasus", +"cerata", +"cerate", +"ceratectomy", +"cerated", +"ceratiasis", +"ceratiid", +"Ceratiidae", +"ceratioid", +"ceration", +"ceratite", +"Ceratites", +"ceratitic", +"Ceratitidae", +"Ceratitis", +"ceratitoid", +"Ceratitoidea", +"Ceratium", +"Ceratobatrachinae", +"ceratoblast", +"ceratobranchial", +"ceratocricoid", +"Ceratodidae", +"Ceratodontidae", +"Ceratodus", +"ceratofibrous", +"ceratoglossal", +"ceratoglossus", +"ceratohyal", +"ceratohyoid", +"ceratoid", +"ceratomandibular", +"ceratomania", +"Ceratonia", +"Ceratophrys", +"Ceratophyllaceae", +"ceratophyllaceous", +"Ceratophyllum", +"Ceratophyta", +"ceratophyte", +"Ceratops", +"Ceratopsia", +"ceratopsian", +"ceratopsid", +"Ceratopsidae", +"Ceratopteridaceae", +"ceratopteridaceous", +"Ceratopteris", +"ceratorhine", +"Ceratosa", +"Ceratosaurus", +"Ceratospongiae", +"ceratospongian", +"Ceratostomataceae", +"Ceratostomella", +"ceratotheca", +"ceratothecal", +"Ceratozamia", +"ceraunia", +"ceraunics", +"ceraunogram", +"ceraunograph", +"ceraunomancy", +"ceraunophone", +"ceraunoscope", +"ceraunoscopy", +"Cerberean", +"Cerberic", +"Cerberus", +"cercal", +"cercaria", +"cercarial", +"cercarian", +"cercariform", +"cercelee", +"cerci", +"Cercidiphyllaceae", +"Cercis", +"Cercocebus", +"Cercolabes", +"Cercolabidae", +"cercomonad", +"Cercomonadidae", +"Cercomonas", +"cercopid", +"Cercopidae", +"cercopithecid", +"Cercopithecidae", +"cercopithecoid", +"Cercopithecus", +"cercopod", +"Cercospora", +"Cercosporella", +"cercus", +"Cerdonian", +"cere", +"cereal", +"cerealian", +"cerealin", +"cerealism", +"cerealist", +"cerealose", +"cerebella", +"cerebellar", +"cerebellifugal", +"cerebellipetal", +"cerebellocortex", +"cerebellopontile", +"cerebellopontine", +"cerebellorubral", +"cerebellospinal", +"cerebellum", +"cerebra", +"cerebral", +"cerebralgia", +"cerebralism", +"cerebralist", +"cerebralization", +"cerebralize", +"cerebrally", +"cerebrasthenia", +"cerebrasthenic", +"cerebrate", +"cerebration", +"cerebrational", +"Cerebratulus", +"cerebric", +"cerebricity", +"cerebriform", +"cerebriformly", +"cerebrifugal", +"cerebrin", +"cerebripetal", +"cerebritis", +"cerebrize", +"cerebrocardiac", +"cerebrogalactose", +"cerebroganglion", +"cerebroganglionic", +"cerebroid", +"cerebrology", +"cerebroma", +"cerebromalacia", +"cerebromedullary", +"cerebromeningeal", +"cerebromeningitis", +"cerebrometer", +"cerebron", +"cerebronic", +"cerebroparietal", +"cerebropathy", +"cerebropedal", +"cerebrophysiology", +"cerebropontile", +"cerebropsychosis", +"cerebrorachidian", +"cerebrosclerosis", +"cerebroscope", +"cerebroscopy", +"cerebrose", +"cerebrosensorial", +"cerebroside", +"cerebrosis", +"cerebrospinal", +"cerebrospinant", +"cerebrosuria", +"cerebrotomy", +"cerebrotonia", +"cerebrotonic", +"cerebrovisceral", +"cerebrum", +"cerecloth", +"cered", +"cereless", +"cerement", +"ceremonial", +"ceremonialism", +"ceremonialist", +"ceremonialize", +"ceremonially", +"ceremonious", +"ceremoniously", +"ceremoniousness", +"ceremony", +"cereous", +"cerer", +"ceresin", +"Cereus", +"cerevis", +"ceria", +"Cerialia", +"cerianthid", +"Cerianthidae", +"cerianthoid", +"Cerianthus", +"ceric", +"ceride", +"ceriferous", +"cerigerous", +"cerillo", +"ceriman", +"cerin", +"cerine", +"Cerinthe", +"Cerinthian", +"Ceriomyces", +"Cerion", +"Cerionidae", +"ceriops", +"Ceriornis", +"cerise", +"cerite", +"Cerithiidae", +"cerithioid", +"Cerithium", +"cerium", +"cermet", +"cern", +"cerniture", +"cernuous", +"cero", +"cerograph", +"cerographic", +"cerographist", +"cerography", +"ceroline", +"cerolite", +"ceroma", +"ceromancy", +"cerophilous", +"ceroplast", +"ceroplastic", +"ceroplastics", +"ceroplasty", +"cerotate", +"cerote", +"cerotene", +"cerotic", +"cerotin", +"cerotype", +"cerous", +"ceroxyle", +"Ceroxylon", +"cerrero", +"cerrial", +"cerris", +"certain", +"certainly", +"certainty", +"Certhia", +"Certhiidae", +"certie", +"certifiable", +"certifiableness", +"certifiably", +"certificate", +"certification", +"certificative", +"certificator", +"certificatory", +"certified", +"certifier", +"certify", +"certiorari", +"certiorate", +"certioration", +"certis", +"certitude", +"certosina", +"certosino", +"certy", +"cerule", +"cerulean", +"cerulein", +"ceruleite", +"ceruleolactite", +"ceruleous", +"cerulescent", +"ceruleum", +"cerulignol", +"cerulignone", +"cerumen", +"ceruminal", +"ceruminiferous", +"ceruminous", +"cerumniparous", +"ceruse", +"cerussite", +"Cervantist", +"cervantite", +"cervical", +"Cervicapra", +"cervicaprine", +"cervicectomy", +"cervicicardiac", +"cervicide", +"cerviciplex", +"cervicispinal", +"cervicitis", +"cervicoauricular", +"cervicoaxillary", +"cervicobasilar", +"cervicobrachial", +"cervicobregmatic", +"cervicobuccal", +"cervicodorsal", +"cervicodynia", +"cervicofacial", +"cervicohumeral", +"cervicolabial", +"cervicolingual", +"cervicolumbar", +"cervicomuscular", +"cerviconasal", +"cervicorn", +"cervicoscapular", +"cervicothoracic", +"cervicovaginal", +"cervicovesical", +"cervid", +"Cervidae", +"Cervinae", +"cervine", +"cervisia", +"cervisial", +"cervix", +"cervoid", +"cervuline", +"Cervulus", +"Cervus", +"ceryl", +"Cerynean", +"Cesare", +"cesarevitch", +"cesarolite", +"cesious", +"cesium", +"cespititous", +"cespitose", +"cespitosely", +"cespitulose", +"cess", +"cessantly", +"cessation", +"cessative", +"cessavit", +"cesser", +"cession", +"cessionaire", +"cessionary", +"cessor", +"cesspipe", +"cesspit", +"cesspool", +"cest", +"Cestida", +"Cestidae", +"Cestoda", +"Cestodaria", +"cestode", +"cestoid", +"Cestoidea", +"cestoidean", +"Cestracion", +"cestraciont", +"Cestraciontes", +"Cestraciontidae", +"Cestrian", +"Cestrum", +"cestrum", +"cestus", +"Cetacea", +"cetacean", +"cetaceous", +"cetaceum", +"cetane", +"Cete", +"cetene", +"ceterach", +"ceti", +"cetic", +"ceticide", +"Cetid", +"cetin", +"Cetiosauria", +"cetiosaurian", +"Cetiosaurus", +"cetological", +"cetologist", +"cetology", +"Cetomorpha", +"cetomorphic", +"Cetonia", +"cetonian", +"Cetoniides", +"Cetoniinae", +"cetorhinid", +"Cetorhinidae", +"cetorhinoid", +"Cetorhinus", +"cetotolite", +"Cetraria", +"cetraric", +"cetrarin", +"Cetus", +"cetyl", +"cetylene", +"cetylic", +"cevadilla", +"cevadilline", +"cevadine", +"Cevennian", +"Cevenol", +"Cevenole", +"cevine", +"cevitamic", +"ceylanite", +"Ceylon", +"Ceylonese", +"ceylonite", +"ceyssatite", +"Ceyx", +"Cezannesque", +"cha", +"chaa", +"chab", +"chabasie", +"chabazite", +"Chablis", +"chabot", +"chabouk", +"chabuk", +"chabutra", +"Chac", +"chacate", +"chachalaca", +"Chachapuya", +"chack", +"Chackchiuma", +"chacker", +"chackle", +"chackler", +"chacma", +"Chaco", +"chacona", +"chacte", +"chad", +"chadacryst", +"Chaenactis", +"Chaenolobus", +"Chaenomeles", +"chaeta", +"Chaetangiaceae", +"Chaetangium", +"Chaetetes", +"Chaetetidae", +"Chaetifera", +"chaetiferous", +"Chaetites", +"Chaetitidae", +"Chaetochloa", +"Chaetodon", +"chaetodont", +"chaetodontid", +"Chaetodontidae", +"chaetognath", +"Chaetognatha", +"chaetognathan", +"chaetognathous", +"Chaetophora", +"Chaetophoraceae", +"chaetophoraceous", +"Chaetophorales", +"chaetophorous", +"chaetopod", +"Chaetopoda", +"chaetopodan", +"chaetopodous", +"chaetopterin", +"Chaetopterus", +"chaetosema", +"Chaetosoma", +"Chaetosomatidae", +"Chaetosomidae", +"chaetotactic", +"chaetotaxy", +"Chaetura", +"chafe", +"chafer", +"chafery", +"chafewax", +"chafeweed", +"chaff", +"chaffcutter", +"chaffer", +"chafferer", +"chaffinch", +"chaffiness", +"chaffing", +"chaffingly", +"chaffless", +"chafflike", +"chaffman", +"chaffseed", +"chaffwax", +"chaffweed", +"chaffy", +"chaft", +"chafted", +"Chaga", +"chagan", +"Chagga", +"chagrin", +"chaguar", +"chagul", +"chahar", +"chai", +"Chailletiaceae", +"chain", +"chainage", +"chained", +"chainer", +"chainette", +"chainless", +"chainlet", +"chainmaker", +"chainmaking", +"chainman", +"chainon", +"chainsmith", +"chainwale", +"chainwork", +"chair", +"chairer", +"chairless", +"chairmaker", +"chairmaking", +"chairman", +"chairmanship", +"chairmender", +"chairmending", +"chairwarmer", +"chairwoman", +"chais", +"chaise", +"chaiseless", +"Chait", +"chaitya", +"chaja", +"chaka", +"chakar", +"chakari", +"Chakavski", +"chakazi", +"chakdar", +"chakobu", +"chakra", +"chakram", +"chakravartin", +"chaksi", +"chal", +"chalaco", +"chalana", +"chalastic", +"Chalastogastra", +"chalaza", +"chalazal", +"chalaze", +"chalazian", +"chalaziferous", +"chalazion", +"chalazogam", +"chalazogamic", +"chalazogamy", +"chalazoidite", +"chalcanthite", +"Chalcedonian", +"chalcedonic", +"chalcedonous", +"chalcedony", +"chalcedonyx", +"chalchuite", +"chalcid", +"Chalcidian", +"Chalcidic", +"chalcidicum", +"chalcidid", +"Chalcididae", +"chalcidiform", +"chalcidoid", +"Chalcidoidea", +"Chalcioecus", +"Chalcis", +"chalcites", +"chalcocite", +"chalcograph", +"chalcographer", +"chalcographic", +"chalcographical", +"chalcographist", +"chalcography", +"chalcolite", +"chalcolithic", +"chalcomancy", +"chalcomenite", +"chalcon", +"chalcone", +"chalcophanite", +"chalcophyllite", +"chalcopyrite", +"chalcosiderite", +"chalcosine", +"chalcostibite", +"chalcotrichite", +"chalcotript", +"chalcus", +"Chaldaei", +"Chaldaic", +"Chaldaical", +"Chaldaism", +"Chaldean", +"Chaldee", +"chalder", +"chaldron", +"chalet", +"chalice", +"chaliced", +"chalicosis", +"chalicothere", +"chalicotheriid", +"Chalicotheriidae", +"chalicotherioid", +"Chalicotherium", +"Chalina", +"Chalinidae", +"chalinine", +"Chalinitis", +"chalk", +"chalkcutter", +"chalker", +"chalkiness", +"chalklike", +"chalkography", +"chalkosideric", +"chalkstone", +"chalkstony", +"chalkworker", +"chalky", +"challah", +"challenge", +"challengeable", +"challengee", +"challengeful", +"challenger", +"challengingly", +"challie", +"challis", +"challote", +"chalmer", +"chalon", +"chalone", +"Chalons", +"chalque", +"chalta", +"Chalukya", +"Chalukyan", +"chalumeau", +"chalutz", +"chalutzim", +"Chalybean", +"chalybeate", +"chalybeous", +"Chalybes", +"chalybite", +"Cham", +"cham", +"Chama", +"Chamacea", +"Chamacoco", +"Chamaebatia", +"Chamaecistus", +"chamaecranial", +"Chamaecrista", +"Chamaecyparis", +"Chamaedaphne", +"Chamaeleo", +"Chamaeleon", +"Chamaeleontidae", +"Chamaelirium", +"Chamaenerion", +"Chamaepericlymenum", +"chamaeprosopic", +"Chamaerops", +"chamaerrhine", +"Chamaesaura", +"Chamaesiphon", +"Chamaesiphonaceae", +"Chamaesiphonaceous", +"Chamaesiphonales", +"Chamaesyce", +"chamal", +"Chamar", +"chamar", +"chamber", +"chamberdeacon", +"chambered", +"chamberer", +"chambering", +"chamberlain", +"chamberlainry", +"chamberlainship", +"chamberlet", +"chamberleted", +"chamberletted", +"chambermaid", +"Chambertin", +"chamberwoman", +"Chambioa", +"chambray", +"chambrel", +"chambul", +"chamecephalic", +"chamecephalous", +"chamecephalus", +"chamecephaly", +"chameleon", +"chameleonic", +"chameleonize", +"chameleonlike", +"chamfer", +"chamferer", +"chamfron", +"Chamian", +"Chamicuro", +"Chamidae", +"chamisal", +"chamiso", +"Chamite", +"chamite", +"Chamkanni", +"chamma", +"chamois", +"Chamoisette", +"chamoisite", +"chamoline", +"Chamomilla", +"Chamorro", +"Chamos", +"champ", +"Champa", +"champac", +"champaca", +"champacol", +"champagne", +"champagneless", +"champagnize", +"champaign", +"champain", +"champaka", +"champer", +"champertor", +"champertous", +"champerty", +"champignon", +"champion", +"championess", +"championize", +"championless", +"championlike", +"championship", +"Champlain", +"Champlainic", +"champleve", +"champy", +"Chanabal", +"Chanca", +"chance", +"chanceful", +"chancefully", +"chancefulness", +"chancel", +"chanceled", +"chanceless", +"chancellery", +"chancellor", +"chancellorate", +"chancelloress", +"chancellorism", +"chancellorship", +"chancer", +"chancery", +"chancewise", +"chanche", +"chanchito", +"chanco", +"chancre", +"chancriform", +"chancroid", +"chancroidal", +"chancrous", +"chancy", +"chandala", +"chandam", +"chandelier", +"Chandi", +"chandi", +"chandler", +"chandleress", +"chandlering", +"chandlery", +"chandoo", +"chandu", +"chandul", +"Chane", +"chanfrin", +"Chang", +"chang", +"changa", +"changar", +"change", +"changeability", +"changeable", +"changeableness", +"changeably", +"changedale", +"changedness", +"changeful", +"changefully", +"changefulness", +"changeless", +"changelessly", +"changelessness", +"changeling", +"changement", +"changer", +"Changoan", +"Changos", +"Changuina", +"Changuinan", +"Chanidae", +"chank", +"chankings", +"channel", +"channelbill", +"channeled", +"channeler", +"channeling", +"channelization", +"channelize", +"channelled", +"channeller", +"channelling", +"channelwards", +"channer", +"chanson", +"chansonnette", +"chanst", +"chant", +"chantable", +"chanter", +"chanterelle", +"chantership", +"chantey", +"chanteyman", +"chanticleer", +"chanting", +"chantingly", +"chantlate", +"chantress", +"chantry", +"chao", +"chaogenous", +"chaology", +"chaos", +"chaotic", +"chaotical", +"chaotically", +"chaoticness", +"Chaouia", +"chap", +"Chapacura", +"Chapacuran", +"chapah", +"Chapanec", +"chaparral", +"chaparro", +"chapatty", +"chapbook", +"chape", +"chapeau", +"chapeaux", +"chaped", +"chapel", +"chapeless", +"chapelet", +"chapelgoer", +"chapelgoing", +"chapellage", +"chapellany", +"chapelman", +"chapelmaster", +"chapelry", +"chapelward", +"chaperno", +"chaperon", +"chaperonage", +"chaperone", +"chaperonless", +"chapfallen", +"chapin", +"chapiter", +"chapitral", +"chaplain", +"chaplaincy", +"chaplainry", +"chaplainship", +"chapless", +"chaplet", +"chapleted", +"chapman", +"chapmanship", +"chapournet", +"chapournetted", +"chappaul", +"chapped", +"chapper", +"chappie", +"chappin", +"chapping", +"chappow", +"chappy", +"chaps", +"chapt", +"chaptalization", +"chaptalize", +"chapter", +"chapteral", +"chapterful", +"chapwoman", +"char", +"Chara", +"charabanc", +"charabancer", +"charac", +"Characeae", +"characeous", +"characetum", +"characin", +"characine", +"characinid", +"Characinidae", +"characinoid", +"character", +"characterful", +"characterial", +"characterical", +"characterism", +"characterist", +"characteristic", +"characteristical", +"characteristically", +"characteristicalness", +"characteristicness", +"characterizable", +"characterization", +"characterize", +"characterizer", +"characterless", +"characterlessness", +"characterological", +"characterologist", +"characterology", +"charactery", +"charade", +"Charadrii", +"Charadriidae", +"charadriiform", +"Charadriiformes", +"charadrine", +"charadrioid", +"Charadriomorphae", +"Charadrius", +"Charales", +"charas", +"charbon", +"Charca", +"charcoal", +"charcoaly", +"charcutier", +"chard", +"chardock", +"chare", +"charer", +"charet", +"charette", +"charge", +"chargeability", +"chargeable", +"chargeableness", +"chargeably", +"chargee", +"chargeless", +"chargeling", +"chargeman", +"charger", +"chargeship", +"charging", +"Charicleia", +"charier", +"charily", +"chariness", +"chariot", +"charioted", +"chariotee", +"charioteer", +"charioteership", +"chariotlike", +"chariotman", +"chariotry", +"chariotway", +"charism", +"charisma", +"charismatic", +"Charissa", +"charisticary", +"charitable", +"charitableness", +"charitably", +"Charites", +"charity", +"charityless", +"charivari", +"chark", +"charka", +"charkha", +"charkhana", +"charlady", +"charlatan", +"charlatanic", +"charlatanical", +"charlatanically", +"charlatanish", +"charlatanism", +"charlatanistic", +"charlatanry", +"charlatanship", +"Charles", +"Charleston", +"Charley", +"Charlie", +"charlock", +"Charlotte", +"charm", +"charmedly", +"charmel", +"charmer", +"charmful", +"charmfully", +"charmfulness", +"charming", +"charmingly", +"charmingness", +"charmless", +"charmlessly", +"charmwise", +"charnel", +"charnockite", +"Charon", +"Charonian", +"Charonic", +"Charontas", +"Charophyta", +"charpit", +"charpoy", +"charqued", +"charqui", +"charr", +"Charruan", +"Charruas", +"charry", +"charshaf", +"charsingha", +"chart", +"chartaceous", +"charter", +"charterable", +"charterage", +"chartered", +"charterer", +"charterhouse", +"Charterist", +"charterless", +"chartermaster", +"charthouse", +"charting", +"Chartism", +"Chartist", +"chartist", +"chartless", +"chartographist", +"chartology", +"chartometer", +"chartophylax", +"chartreuse", +"Chartreux", +"chartroom", +"chartula", +"chartulary", +"charuk", +"charwoman", +"chary", +"Charybdian", +"Charybdis", +"chasable", +"chase", +"chaseable", +"chaser", +"Chasidim", +"chasing", +"chasm", +"chasma", +"chasmal", +"chasmed", +"chasmic", +"chasmogamic", +"chasmogamous", +"chasmogamy", +"chasmophyte", +"chasmy", +"chasse", +"Chasselas", +"chassepot", +"chasseur", +"chassignite", +"chassis", +"Chastacosta", +"chaste", +"chastely", +"chasten", +"chastener", +"chasteness", +"chasteningly", +"chastenment", +"chasteweed", +"chastisable", +"chastise", +"chastisement", +"chastiser", +"chastity", +"chasuble", +"chasubled", +"chat", +"chataka", +"Chateau", +"chateau", +"chateaux", +"chatelain", +"chatelaine", +"chatelainry", +"chatellany", +"chathamite", +"chati", +"Chatillon", +"Chatino", +"Chatot", +"chatoyance", +"chatoyancy", +"chatoyant", +"chatsome", +"chatta", +"chattable", +"Chattanooga", +"Chattanoogan", +"chattation", +"chattel", +"chattelhood", +"chattelism", +"chattelization", +"chattelize", +"chattelship", +"chatter", +"chatteration", +"chatterbag", +"chatterbox", +"chatterer", +"chattering", +"chatteringly", +"chattermag", +"chattermagging", +"Chattertonian", +"chattery", +"Chatti", +"chattily", +"chattiness", +"chatting", +"chattingly", +"chatty", +"chatwood", +"Chaucerian", +"Chauceriana", +"Chaucerianism", +"Chaucerism", +"Chauchat", +"chaudron", +"chauffer", +"chauffeur", +"chauffeurship", +"Chaui", +"chauk", +"chaukidari", +"Chauliodes", +"chaulmoogra", +"chaulmoograte", +"chaulmoogric", +"Chauna", +"chaus", +"chausseemeile", +"Chautauqua", +"Chautauquan", +"chaute", +"chauth", +"chauvinism", +"chauvinist", +"chauvinistic", +"chauvinistically", +"Chavante", +"Chavantean", +"chavender", +"chavibetol", +"chavicin", +"chavicine", +"chavicol", +"chavish", +"chaw", +"chawan", +"chawbacon", +"chawer", +"Chawia", +"chawk", +"chawl", +"chawstick", +"chay", +"chaya", +"chayaroot", +"Chayma", +"Chayota", +"chayote", +"chayroot", +"chazan", +"Chazy", +"che", +"cheap", +"cheapen", +"cheapener", +"cheapery", +"cheaping", +"cheapish", +"cheaply", +"cheapness", +"Cheapside", +"cheat", +"cheatable", +"cheatableness", +"cheatee", +"cheater", +"cheatery", +"cheating", +"cheatingly", +"cheatrie", +"Chebacco", +"chebec", +"chebel", +"chebog", +"chebule", +"chebulinic", +"Chechehet", +"Chechen", +"check", +"checkable", +"checkage", +"checkbird", +"checkbite", +"checkbook", +"checked", +"checker", +"checkerbelly", +"checkerberry", +"checkerbloom", +"checkerboard", +"checkerbreast", +"checkered", +"checkerist", +"checkers", +"checkerwise", +"checkerwork", +"checkhook", +"checkless", +"checkman", +"checkmate", +"checkoff", +"checkrack", +"checkrein", +"checkroll", +"checkroom", +"checkrope", +"checkrow", +"checkrowed", +"checkrower", +"checkstone", +"checkstrap", +"checkstring", +"checkup", +"checkweigher", +"checkwork", +"checky", +"cheddaring", +"cheddite", +"cheder", +"chedlock", +"chee", +"cheecha", +"cheechako", +"cheek", +"cheekbone", +"cheeker", +"cheekily", +"cheekiness", +"cheekish", +"cheekless", +"cheekpiece", +"cheeky", +"cheep", +"cheeper", +"cheepily", +"cheepiness", +"cheepy", +"cheer", +"cheered", +"cheerer", +"cheerful", +"cheerfulize", +"cheerfully", +"cheerfulness", +"cheerfulsome", +"cheerily", +"cheeriness", +"cheering", +"cheeringly", +"cheerio", +"cheerleader", +"cheerless", +"cheerlessly", +"cheerlessness", +"cheerly", +"cheery", +"cheese", +"cheeseboard", +"cheesebox", +"cheeseburger", +"cheesecake", +"cheesecloth", +"cheesecurd", +"cheesecutter", +"cheeseflower", +"cheeselip", +"cheesemonger", +"cheesemongering", +"cheesemongerly", +"cheesemongery", +"cheeseparer", +"cheeseparing", +"cheeser", +"cheesery", +"cheesewood", +"cheesiness", +"cheesy", +"cheet", +"cheetah", +"cheeter", +"cheetie", +"chef", +"Chefrinia", +"chegoe", +"chegre", +"Chehalis", +"Cheilanthes", +"cheilitis", +"Cheilodipteridae", +"Cheilodipterus", +"Cheilostomata", +"cheilostomatous", +"cheir", +"cheiragra", +"Cheiranthus", +"Cheirogaleus", +"Cheiroglossa", +"cheirognomy", +"cheirography", +"cheirolin", +"cheirology", +"cheiromancy", +"cheiromegaly", +"cheiropatagium", +"cheiropodist", +"cheiropody", +"cheiropompholyx", +"Cheiroptera", +"cheiropterygium", +"cheirosophy", +"cheirospasm", +"Cheirotherium", +"Cheka", +"chekan", +"cheke", +"cheki", +"Chekist", +"chekmak", +"chela", +"chelaship", +"chelate", +"chelation", +"chelem", +"chelerythrine", +"chelicer", +"chelicera", +"cheliceral", +"chelicerate", +"chelicere", +"chelide", +"chelidon", +"chelidonate", +"chelidonian", +"chelidonic", +"chelidonine", +"Chelidonium", +"Chelidosaurus", +"Cheliferidea", +"cheliferous", +"cheliform", +"chelingo", +"cheliped", +"Chellean", +"chello", +"Chelodina", +"chelodine", +"chelone", +"Chelonia", +"chelonian", +"chelonid", +"Chelonidae", +"cheloniid", +"Cheloniidae", +"chelonin", +"chelophore", +"chelp", +"Cheltenham", +"Chelura", +"Chelydidae", +"Chelydra", +"Chelydridae", +"chelydroid", +"chelys", +"Chemakuan", +"chemasthenia", +"chemawinite", +"Chemehuevi", +"chemesthesis", +"chemiatric", +"chemiatrist", +"chemiatry", +"chemic", +"chemical", +"chemicalization", +"chemicalize", +"chemically", +"chemicker", +"chemicoastrological", +"chemicobiologic", +"chemicobiology", +"chemicocautery", +"chemicodynamic", +"chemicoengineering", +"chemicoluminescence", +"chemicomechanical", +"chemicomineralogical", +"chemicopharmaceutical", +"chemicophysical", +"chemicophysics", +"chemicophysiological", +"chemicovital", +"chemigraph", +"chemigraphic", +"chemigraphy", +"chemiloon", +"chemiluminescence", +"chemiotactic", +"chemiotaxic", +"chemiotaxis", +"chemiotropic", +"chemiotropism", +"chemiphotic", +"chemis", +"chemise", +"chemisette", +"chemism", +"chemisorb", +"chemisorption", +"chemist", +"chemistry", +"chemitype", +"chemitypy", +"chemoceptor", +"chemokinesis", +"chemokinetic", +"chemolysis", +"chemolytic", +"chemolyze", +"chemoreception", +"chemoreceptor", +"chemoreflex", +"chemoresistance", +"chemoserotherapy", +"chemosis", +"chemosmosis", +"chemosmotic", +"chemosynthesis", +"chemosynthetic", +"chemotactic", +"chemotactically", +"chemotaxis", +"chemotaxy", +"chemotherapeutic", +"chemotherapeutics", +"chemotherapist", +"chemotherapy", +"chemotic", +"chemotropic", +"chemotropically", +"chemotropism", +"Chemung", +"chemurgic", +"chemurgical", +"chemurgy", +"Chen", +"chena", +"chende", +"chenevixite", +"Cheney", +"cheng", +"chenica", +"chenille", +"cheniller", +"chenopod", +"Chenopodiaceae", +"chenopodiaceous", +"Chenopodiales", +"Chenopodium", +"cheoplastic", +"chepster", +"cheque", +"Chequers", +"Chera", +"chercock", +"cherem", +"Cheremiss", +"Cheremissian", +"cherimoya", +"cherish", +"cherishable", +"cherisher", +"cherishing", +"cherishingly", +"cherishment", +"Cherkess", +"Cherkesser", +"Chermes", +"Chermidae", +"Chermish", +"Chernomorish", +"chernozem", +"Cherokee", +"cheroot", +"cherried", +"cherry", +"cherryblossom", +"cherrylike", +"chersonese", +"Chersydridae", +"chert", +"cherte", +"cherty", +"cherub", +"cherubic", +"cherubical", +"cherubically", +"cherubim", +"cherubimic", +"cherubimical", +"cherubin", +"Cherusci", +"Chervante", +"chervil", +"chervonets", +"Chesapeake", +"Cheshire", +"cheson", +"chess", +"chessboard", +"chessdom", +"chessel", +"chesser", +"chessist", +"chessman", +"chessmen", +"chesstree", +"chessylite", +"chest", +"Chester", +"chester", +"chesterfield", +"Chesterfieldian", +"chesterlite", +"chestful", +"chestily", +"chestiness", +"chestnut", +"chestnutty", +"chesty", +"cheth", +"chettik", +"chetty", +"chetverik", +"chetvert", +"chevage", +"cheval", +"chevalier", +"chevaline", +"chevance", +"cheve", +"cheven", +"chevener", +"chevesaile", +"chevin", +"Cheviot", +"chevisance", +"chevise", +"chevon", +"chevrette", +"chevron", +"chevrone", +"chevronel", +"chevronelly", +"chevronwise", +"chevrony", +"chevrotain", +"chevy", +"chew", +"chewbark", +"chewer", +"chewink", +"chewstick", +"chewy", +"Cheyenne", +"cheyney", +"chhatri", +"chi", +"chia", +"Chiam", +"Chian", +"Chianti", +"Chiapanec", +"Chiapanecan", +"chiaroscurist", +"chiaroscuro", +"chiasm", +"chiasma", +"chiasmal", +"chiasmatype", +"chiasmatypy", +"chiasmic", +"Chiasmodon", +"chiasmodontid", +"Chiasmodontidae", +"chiasmus", +"chiastic", +"chiastolite", +"chiastoneural", +"chiastoneurous", +"chiastoneury", +"chiaus", +"Chibcha", +"Chibchan", +"chibinite", +"chibouk", +"chibrit", +"chic", +"chicane", +"chicaner", +"chicanery", +"chicaric", +"chicayote", +"Chicha", +"chichi", +"chichicaste", +"Chichimec", +"chichimecan", +"chichipate", +"chichipe", +"chichituna", +"chick", +"chickabiddy", +"chickadee", +"Chickahominy", +"Chickamauga", +"chickaree", +"Chickasaw", +"chickasaw", +"chickell", +"chicken", +"chickenberry", +"chickenbill", +"chickenbreasted", +"chickenhearted", +"chickenheartedly", +"chickenheartedness", +"chickenhood", +"chickenweed", +"chickenwort", +"chicker", +"chickhood", +"chickling", +"chickstone", +"chickweed", +"chickwit", +"chicky", +"chicle", +"chicness", +"Chico", +"chico", +"Chicomecoatl", +"chicory", +"chicot", +"chicote", +"chicqued", +"chicquer", +"chicquest", +"chicquing", +"chid", +"chidden", +"chide", +"chider", +"chiding", +"chidingly", +"chidingness", +"chidra", +"chief", +"chiefdom", +"chiefery", +"chiefess", +"chiefest", +"chiefish", +"chiefless", +"chiefling", +"chiefly", +"chiefship", +"chieftain", +"chieftaincy", +"chieftainess", +"chieftainry", +"chieftainship", +"chieftess", +"chield", +"Chien", +"chien", +"chiffer", +"chiffon", +"chiffonade", +"chiffonier", +"chiffony", +"chifforobe", +"chigetai", +"chiggak", +"chigger", +"chiggerweed", +"chignon", +"chignoned", +"chigoe", +"chih", +"chihfu", +"Chihuahua", +"chikara", +"chil", +"chilacavote", +"chilalgia", +"chilarium", +"chilblain", +"Chilcat", +"child", +"childbearing", +"childbed", +"childbirth", +"childcrowing", +"childe", +"childed", +"Childermas", +"childhood", +"childing", +"childish", +"childishly", +"childishness", +"childkind", +"childless", +"childlessness", +"childlike", +"childlikeness", +"childly", +"childness", +"childrenite", +"childridden", +"childship", +"childward", +"chile", +"Chilean", +"Chileanization", +"Chileanize", +"chilectropion", +"chilenite", +"chili", +"chiliad", +"chiliadal", +"chiliadic", +"chiliagon", +"chiliahedron", +"chiliarch", +"chiliarchia", +"chiliarchy", +"chiliasm", +"chiliast", +"chiliastic", +"chilicote", +"chilicothe", +"chilidium", +"Chilina", +"Chilinidae", +"chiliomb", +"Chilion", +"chilitis", +"Chilkat", +"chill", +"chilla", +"chillagite", +"chilled", +"chiller", +"chillily", +"chilliness", +"chilling", +"chillingly", +"chillish", +"Chilliwack", +"chillness", +"chillo", +"chillroom", +"chillsome", +"chillum", +"chillumchee", +"chilly", +"chilognath", +"Chilognatha", +"chilognathan", +"chilognathous", +"chilogrammo", +"chiloma", +"Chilomastix", +"chiloncus", +"chiloplasty", +"chilopod", +"Chilopoda", +"chilopodan", +"chilopodous", +"Chilopsis", +"Chilostoma", +"Chilostomata", +"chilostomatous", +"chilostome", +"chilotomy", +"Chiltern", +"chilver", +"chimaera", +"chimaerid", +"Chimaeridae", +"chimaeroid", +"Chimaeroidei", +"Chimakuan", +"Chimakum", +"Chimalakwe", +"Chimalapa", +"Chimane", +"chimango", +"Chimaphila", +"Chimarikan", +"Chimariko", +"chimble", +"chime", +"chimer", +"chimera", +"chimeric", +"chimerical", +"chimerically", +"chimericalness", +"chimesmaster", +"chiminage", +"Chimmesyan", +"chimney", +"chimneyhead", +"chimneyless", +"chimneyman", +"Chimonanthus", +"chimopeelagic", +"chimpanzee", +"Chimu", +"Chin", +"chin", +"china", +"chinaberry", +"chinalike", +"Chinaman", +"chinamania", +"chinamaniac", +"chinampa", +"chinanta", +"Chinantecan", +"Chinantecs", +"chinaphthol", +"chinar", +"chinaroot", +"Chinatown", +"chinaware", +"chinawoman", +"chinband", +"chinch", +"chincha", +"Chinchasuyu", +"chinchayote", +"chinche", +"chincherinchee", +"chinchilla", +"chinching", +"chincloth", +"chincough", +"chine", +"chined", +"Chinee", +"Chinese", +"Chinesery", +"ching", +"chingma", +"Chingpaw", +"Chinhwan", +"chinik", +"chinin", +"Chink", +"chink", +"chinkara", +"chinker", +"chinkerinchee", +"chinking", +"chinkle", +"chinks", +"chinky", +"chinless", +"chinnam", +"chinned", +"chinny", +"chino", +"chinoa", +"chinol", +"Chinook", +"Chinookan", +"chinotoxine", +"chinotti", +"chinpiece", +"chinquapin", +"chinse", +"chint", +"chintz", +"chinwood", +"Chiococca", +"chiococcine", +"Chiogenes", +"chiolite", +"chionablepsia", +"Chionanthus", +"Chionaspis", +"Chionididae", +"Chionis", +"Chionodoxa", +"Chiot", +"chiotilla", +"chip", +"chipchap", +"chipchop", +"Chipewyan", +"chiplet", +"chipling", +"chipmunk", +"chippable", +"chippage", +"chipped", +"Chippendale", +"chipper", +"chipping", +"chippy", +"chips", +"chipwood", +"Chiquitan", +"Chiquito", +"chiragra", +"chiral", +"chiralgia", +"chirality", +"chirapsia", +"chirarthritis", +"chirata", +"Chiriana", +"Chiricahua", +"Chiriguano", +"chirimen", +"Chirino", +"chirinola", +"chiripa", +"chirivita", +"chirk", +"chirm", +"chiro", +"chirocosmetics", +"chirogale", +"chirognomic", +"chirognomically", +"chirognomist", +"chirognomy", +"chirognostic", +"chirograph", +"chirographary", +"chirographer", +"chirographic", +"chirographical", +"chirography", +"chirogymnast", +"chirological", +"chirologically", +"chirologist", +"chirology", +"chiromance", +"chiromancer", +"chiromancist", +"chiromancy", +"chiromant", +"chiromantic", +"chiromantical", +"Chiromantis", +"chiromegaly", +"chirometer", +"Chiromyidae", +"Chiromys", +"Chiron", +"chironomic", +"chironomid", +"Chironomidae", +"Chironomus", +"chironomy", +"chironym", +"chiropatagium", +"chiroplasty", +"chiropod", +"chiropodial", +"chiropodic", +"chiropodical", +"chiropodist", +"chiropodistry", +"chiropodous", +"chiropody", +"chiropompholyx", +"chiropractic", +"chiropractor", +"chiropraxis", +"chiropter", +"Chiroptera", +"chiropteran", +"chiropterite", +"chiropterophilous", +"chiropterous", +"chiropterygian", +"chiropterygious", +"chiropterygium", +"chirosophist", +"chirospasm", +"Chirotes", +"chirotherian", +"Chirotherium", +"chirothesia", +"chirotonsor", +"chirotonsory", +"chirotony", +"chirotype", +"chirp", +"chirper", +"chirpily", +"chirpiness", +"chirping", +"chirpingly", +"chirpling", +"chirpy", +"chirr", +"chirrup", +"chirruper", +"chirrupy", +"chirurgeon", +"chirurgery", +"Chisedec", +"chisel", +"chiseled", +"chiseler", +"chisellike", +"chiselly", +"chiselmouth", +"chit", +"Chita", +"chitak", +"chital", +"chitchat", +"chitchatty", +"Chitimacha", +"Chitimachan", +"chitin", +"chitinization", +"chitinized", +"chitinocalcareous", +"chitinogenous", +"chitinoid", +"chitinous", +"chiton", +"chitosamine", +"chitosan", +"chitose", +"chitra", +"Chitrali", +"chittamwood", +"chitter", +"chitterling", +"chitty", +"chivalresque", +"chivalric", +"chivalrous", +"chivalrously", +"chivalrousness", +"chivalry", +"chive", +"chivey", +"chiviatite", +"Chiwere", +"chkalik", +"chladnite", +"chlamyd", +"chlamydate", +"chlamydeous", +"Chlamydobacteriaceae", +"chlamydobacteriaceous", +"Chlamydobacteriales", +"Chlamydomonadaceae", +"Chlamydomonadidae", +"Chlamydomonas", +"Chlamydosaurus", +"Chlamydoselachidae", +"Chlamydoselachus", +"chlamydospore", +"Chlamydozoa", +"chlamydozoan", +"chlamyphore", +"Chlamyphorus", +"chlamys", +"Chleuh", +"chloanthite", +"chloasma", +"Chloe", +"chlor", +"chloracetate", +"chloragogen", +"chloral", +"chloralformamide", +"chloralide", +"chloralism", +"chloralization", +"chloralize", +"chloralose", +"chloralum", +"chloramide", +"chloramine", +"chloramphenicol", +"chloranemia", +"chloranemic", +"chloranhydride", +"chloranil", +"Chloranthaceae", +"chloranthaceous", +"Chloranthus", +"chloranthy", +"chlorapatite", +"chlorastrolite", +"chlorate", +"chlorazide", +"chlorcosane", +"chlordan", +"chlordane", +"chlore", +"Chlorella", +"Chlorellaceae", +"chlorellaceous", +"chloremia", +"chlorenchyma", +"chlorhydrate", +"chlorhydric", +"chloric", +"chloridate", +"chloridation", +"chloride", +"Chloridella", +"Chloridellidae", +"chlorider", +"chloridize", +"chlorimeter", +"chlorimetric", +"chlorimetry", +"chlorinate", +"chlorination", +"chlorinator", +"chlorine", +"chlorinize", +"chlorinous", +"chloriodide", +"Chlorion", +"Chlorioninae", +"chlorite", +"chloritic", +"chloritization", +"chloritize", +"chloritoid", +"chlorize", +"chlormethane", +"chlormethylic", +"chloroacetate", +"chloroacetic", +"chloroacetone", +"chloroacetophenone", +"chloroamide", +"chloroamine", +"chloroanaemia", +"chloroanemia", +"chloroaurate", +"chloroauric", +"chloroaurite", +"chlorobenzene", +"chlorobromide", +"chlorocalcite", +"chlorocarbonate", +"chlorochromates", +"chlorochromic", +"chlorochrous", +"Chlorococcaceae", +"Chlorococcales", +"Chlorococcum", +"Chlorococcus", +"chlorocresol", +"chlorocruorin", +"chlorodize", +"chloroform", +"chloroformate", +"chloroformic", +"chloroformism", +"chloroformist", +"chloroformization", +"chloroformize", +"chlorogenic", +"chlorogenine", +"chlorohydrin", +"chlorohydrocarbon", +"chloroiodide", +"chloroleucite", +"chloroma", +"chloromelanite", +"chlorometer", +"chloromethane", +"chlorometric", +"chlorometry", +"Chloromycetin", +"chloronitrate", +"chloropal", +"chloropalladates", +"chloropalladic", +"chlorophane", +"chlorophenol", +"chlorophoenicite", +"Chlorophora", +"Chlorophyceae", +"chlorophyceous", +"chlorophyl", +"chlorophyll", +"chlorophyllaceous", +"chlorophyllan", +"chlorophyllase", +"chlorophyllian", +"chlorophyllide", +"chlorophylliferous", +"chlorophylligenous", +"chlorophylligerous", +"chlorophyllin", +"chlorophyllite", +"chlorophylloid", +"chlorophyllose", +"chlorophyllous", +"chloropia", +"chloropicrin", +"chloroplast", +"chloroplastic", +"chloroplastid", +"chloroplatinate", +"chloroplatinic", +"chloroplatinite", +"chloroplatinous", +"chloroprene", +"chloropsia", +"chloroquine", +"chlorosilicate", +"chlorosis", +"chlorospinel", +"chlorosulphonic", +"chlorotic", +"chlorous", +"chlorozincate", +"chlorsalol", +"chloryl", +"Chnuphis", +"cho", +"choachyte", +"choana", +"choanate", +"Choanephora", +"choanocytal", +"choanocyte", +"Choanoflagellata", +"choanoflagellate", +"Choanoflagellida", +"Choanoflagellidae", +"choanoid", +"choanophorous", +"choanosomal", +"choanosome", +"choate", +"choaty", +"chob", +"choca", +"chocard", +"Chocho", +"chocho", +"chock", +"chockablock", +"chocker", +"chockler", +"chockman", +"Choco", +"Chocoan", +"chocolate", +"Choctaw", +"choel", +"choenix", +"Choeropsis", +"Choes", +"choffer", +"choga", +"chogak", +"chogset", +"Choiak", +"choice", +"choiceful", +"choiceless", +"choicelessness", +"choicely", +"choiceness", +"choicy", +"choil", +"choiler", +"choir", +"choirboy", +"choirlike", +"choirman", +"choirmaster", +"choirwise", +"Choisya", +"chokage", +"choke", +"chokeberry", +"chokebore", +"chokecherry", +"chokedamp", +"choker", +"chokered", +"chokerman", +"chokestrap", +"chokeweed", +"chokidar", +"choking", +"chokingly", +"chokra", +"choky", +"Chol", +"chol", +"Chola", +"chola", +"cholagogic", +"cholagogue", +"cholalic", +"cholane", +"cholangioitis", +"cholangitis", +"cholanic", +"cholanthrene", +"cholate", +"chold", +"choleate", +"cholecyanine", +"cholecyst", +"cholecystalgia", +"cholecystectasia", +"cholecystectomy", +"cholecystenterorrhaphy", +"cholecystenterostomy", +"cholecystgastrostomy", +"cholecystic", +"cholecystitis", +"cholecystnephrostomy", +"cholecystocolostomy", +"cholecystocolotomy", +"cholecystoduodenostomy", +"cholecystogastrostomy", +"cholecystogram", +"cholecystography", +"cholecystoileostomy", +"cholecystojejunostomy", +"cholecystokinin", +"cholecystolithiasis", +"cholecystolithotripsy", +"cholecystonephrostomy", +"cholecystopexy", +"cholecystorrhaphy", +"cholecystostomy", +"cholecystotomy", +"choledoch", +"choledochal", +"choledochectomy", +"choledochitis", +"choledochoduodenostomy", +"choledochoenterostomy", +"choledocholithiasis", +"choledocholithotomy", +"choledocholithotripsy", +"choledochoplasty", +"choledochorrhaphy", +"choledochostomy", +"choledochotomy", +"cholehematin", +"choleic", +"choleine", +"choleinic", +"cholelith", +"cholelithiasis", +"cholelithic", +"cholelithotomy", +"cholelithotripsy", +"cholelithotrity", +"cholemia", +"choleokinase", +"cholepoietic", +"choler", +"cholera", +"choleraic", +"choleric", +"cholericly", +"cholericness", +"choleriform", +"cholerigenous", +"cholerine", +"choleroid", +"choleromania", +"cholerophobia", +"cholerrhagia", +"cholestane", +"cholestanol", +"cholesteatoma", +"cholesteatomatous", +"cholestene", +"cholesterate", +"cholesteremia", +"cholesteric", +"cholesterin", +"cholesterinemia", +"cholesterinic", +"cholesterinuria", +"cholesterol", +"cholesterolemia", +"cholesteroluria", +"cholesterosis", +"cholesteryl", +"choletelin", +"choletherapy", +"choleuria", +"choli", +"choliamb", +"choliambic", +"choliambist", +"cholic", +"choline", +"cholinergic", +"cholinesterase", +"cholinic", +"cholla", +"choller", +"Cholo", +"cholochrome", +"cholocyanine", +"Choloepus", +"chologenetic", +"choloidic", +"choloidinic", +"chololith", +"chololithic", +"Cholonan", +"Cholones", +"cholophein", +"cholorrhea", +"choloscopy", +"cholterheaded", +"cholum", +"choluria", +"Choluteca", +"chomp", +"chondral", +"chondralgia", +"chondrarsenite", +"chondre", +"chondrectomy", +"chondrenchyma", +"chondric", +"chondrification", +"chondrify", +"chondrigen", +"chondrigenous", +"Chondrilla", +"chondrin", +"chondrinous", +"chondriocont", +"chondriome", +"chondriomere", +"chondriomite", +"chondriosomal", +"chondriosome", +"chondriosphere", +"chondrite", +"chondritic", +"chondritis", +"chondroadenoma", +"chondroalbuminoid", +"chondroangioma", +"chondroarthritis", +"chondroblast", +"chondroblastoma", +"chondrocarcinoma", +"chondrocele", +"chondroclasis", +"chondroclast", +"chondrocoracoid", +"chondrocostal", +"chondrocranial", +"chondrocranium", +"chondrocyte", +"chondrodite", +"chondroditic", +"chondrodynia", +"chondrodystrophia", +"chondrodystrophy", +"chondroendothelioma", +"chondroepiphysis", +"chondrofetal", +"chondrofibroma", +"chondrofibromatous", +"Chondroganoidei", +"chondrogen", +"chondrogenesis", +"chondrogenetic", +"chondrogenous", +"chondrogeny", +"chondroglossal", +"chondroglossus", +"chondrography", +"chondroid", +"chondroitic", +"chondroitin", +"chondrolipoma", +"chondrology", +"chondroma", +"chondromalacia", +"chondromatous", +"chondromucoid", +"Chondromyces", +"chondromyoma", +"chondromyxoma", +"chondromyxosarcoma", +"chondropharyngeal", +"chondropharyngeus", +"chondrophore", +"chondrophyte", +"chondroplast", +"chondroplastic", +"chondroplasty", +"chondroprotein", +"chondropterygian", +"Chondropterygii", +"chondropterygious", +"chondrosamine", +"chondrosarcoma", +"chondrosarcomatous", +"chondroseptum", +"chondrosin", +"chondrosis", +"chondroskeleton", +"chondrostean", +"Chondrostei", +"chondrosteoma", +"chondrosteous", +"chondrosternal", +"chondrotome", +"chondrotomy", +"chondroxiphoid", +"chondrule", +"chondrus", +"chonolith", +"chonta", +"Chontal", +"Chontalan", +"Chontaquiro", +"chontawood", +"choop", +"choosable", +"choosableness", +"choose", +"chooser", +"choosing", +"choosingly", +"choosy", +"chop", +"chopa", +"chopboat", +"chopfallen", +"chophouse", +"chopin", +"chopine", +"choplogic", +"chopped", +"chopper", +"choppered", +"chopping", +"choppy", +"chopstick", +"Chopunnish", +"Chora", +"choragic", +"choragion", +"choragium", +"choragus", +"choragy", +"Chorai", +"choral", +"choralcelo", +"choraleon", +"choralist", +"chorally", +"Chorasmian", +"chord", +"chorda", +"Chordaceae", +"chordacentrous", +"chordacentrum", +"chordaceous", +"chordal", +"chordally", +"chordamesoderm", +"Chordata", +"chordate", +"chorded", +"Chordeiles", +"chorditis", +"chordoid", +"chordomesoderm", +"chordotomy", +"chordotonal", +"chore", +"chorea", +"choreal", +"choreatic", +"choree", +"choregic", +"choregus", +"choregy", +"choreic", +"choreiform", +"choreograph", +"choreographer", +"choreographic", +"choreographical", +"choreography", +"choreoid", +"choreomania", +"chorepiscopal", +"chorepiscopus", +"choreus", +"choreutic", +"chorial", +"choriamb", +"choriambic", +"choriambize", +"choriambus", +"choric", +"chorine", +"chorioadenoma", +"chorioallantoic", +"chorioallantoid", +"chorioallantois", +"choriocapillaris", +"choriocapillary", +"choriocarcinoma", +"choriocele", +"chorioepithelioma", +"chorioid", +"chorioidal", +"chorioiditis", +"chorioidocyclitis", +"chorioidoiritis", +"chorioidoretinitis", +"chorioma", +"chorion", +"chorionepithelioma", +"chorionic", +"Chorioptes", +"chorioptic", +"chorioretinal", +"chorioretinitis", +"Choripetalae", +"choripetalous", +"choriphyllous", +"chorisepalous", +"chorisis", +"chorism", +"chorist", +"choristate", +"chorister", +"choristership", +"choristic", +"choristoblastoma", +"choristoma", +"choristry", +"chorization", +"chorizont", +"chorizontal", +"chorizontes", +"chorizontic", +"chorizontist", +"chorogi", +"chorograph", +"chorographer", +"chorographic", +"chorographical", +"chorographically", +"chorography", +"choroid", +"choroidal", +"choroidea", +"choroiditis", +"choroidocyclitis", +"choroidoiritis", +"choroidoretinitis", +"chorological", +"chorologist", +"chorology", +"choromania", +"choromanic", +"chorometry", +"chorook", +"Chorotega", +"Choroti", +"chort", +"chorten", +"Chorti", +"chortle", +"chortler", +"chortosterol", +"chorus", +"choruser", +"choruslike", +"Chorwat", +"choryos", +"chose", +"chosen", +"chott", +"Chou", +"Chouan", +"Chouanize", +"chouette", +"chough", +"chouka", +"choultry", +"choup", +"chouquette", +"chous", +"chouse", +"chouser", +"chousingha", +"chow", +"Chowanoc", +"chowchow", +"chowder", +"chowderhead", +"chowderheaded", +"chowk", +"chowry", +"choya", +"choyroot", +"Chozar", +"chrematheism", +"chrematist", +"chrematistic", +"chrematistics", +"chreotechnics", +"chresmology", +"chrestomathic", +"chrestomathics", +"chrestomathy", +"chria", +"chrimsel", +"Chris", +"chrism", +"chrisma", +"chrismal", +"chrismary", +"chrismatine", +"chrismation", +"chrismatite", +"chrismatize", +"chrismatory", +"chrismon", +"chrisom", +"chrisomloosing", +"chrisroot", +"Chrissie", +"Christ", +"Christabel", +"Christadelphian", +"Christadelphianism", +"christcross", +"Christdom", +"Christed", +"christen", +"Christendie", +"Christendom", +"christened", +"christener", +"christening", +"Christenmas", +"Christhood", +"Christiad", +"Christian", +"Christiana", +"Christiania", +"Christianiadeal", +"Christianism", +"christianite", +"Christianity", +"Christianization", +"Christianize", +"Christianizer", +"Christianlike", +"Christianly", +"Christianness", +"Christianogentilism", +"Christianography", +"Christianomastix", +"Christianopaganism", +"Christicide", +"Christie", +"Christiform", +"Christina", +"Christine", +"Christless", +"Christlessness", +"Christlike", +"Christlikeness", +"Christliness", +"Christly", +"Christmas", +"Christmasberry", +"Christmasing", +"Christmastide", +"Christmasy", +"Christocentric", +"Christogram", +"Christolatry", +"Christological", +"Christologist", +"Christology", +"Christophany", +"Christopher", +"Christos", +"chroatol", +"Chrobat", +"chroma", +"chromaffin", +"chromaffinic", +"chromammine", +"chromaphil", +"chromaphore", +"chromascope", +"chromate", +"chromatic", +"chromatical", +"chromatically", +"chromatician", +"chromaticism", +"chromaticity", +"chromatics", +"chromatid", +"chromatin", +"chromatinic", +"Chromatioideae", +"chromatism", +"chromatist", +"Chromatium", +"chromatize", +"chromatocyte", +"chromatodysopia", +"chromatogenous", +"chromatogram", +"chromatograph", +"chromatographic", +"chromatography", +"chromatoid", +"chromatology", +"chromatolysis", +"chromatolytic", +"chromatometer", +"chromatone", +"chromatopathia", +"chromatopathic", +"chromatopathy", +"chromatophil", +"chromatophile", +"chromatophilia", +"chromatophilic", +"chromatophilous", +"chromatophobia", +"chromatophore", +"chromatophoric", +"chromatophorous", +"chromatoplasm", +"chromatopsia", +"chromatoptometer", +"chromatoptometry", +"chromatoscope", +"chromatoscopy", +"chromatosis", +"chromatosphere", +"chromatospheric", +"chromatrope", +"chromaturia", +"chromatype", +"chromazurine", +"chromdiagnosis", +"chrome", +"chromene", +"chromesthesia", +"chromic", +"chromicize", +"chromid", +"Chromidae", +"Chromides", +"chromidial", +"Chromididae", +"chromidiogamy", +"chromidiosome", +"chromidium", +"chromidrosis", +"chromiferous", +"chromiole", +"chromism", +"chromite", +"chromitite", +"chromium", +"chromo", +"Chromobacterieae", +"Chromobacterium", +"chromoblast", +"chromocenter", +"chromocentral", +"chromochalcographic", +"chromochalcography", +"chromocollograph", +"chromocollographic", +"chromocollography", +"chromocollotype", +"chromocollotypy", +"chromocratic", +"chromocyte", +"chromocytometer", +"chromodermatosis", +"chromodiascope", +"chromogen", +"chromogene", +"chromogenesis", +"chromogenetic", +"chromogenic", +"chromogenous", +"chromogram", +"chromograph", +"chromoisomer", +"chromoisomeric", +"chromoisomerism", +"chromoleucite", +"chromolipoid", +"chromolith", +"chromolithic", +"chromolithograph", +"chromolithographer", +"chromolithographic", +"chromolithography", +"chromolysis", +"chromomere", +"chromometer", +"chromone", +"chromonema", +"chromoparous", +"chromophage", +"chromophane", +"chromophile", +"chromophilic", +"chromophilous", +"chromophobic", +"chromophore", +"chromophoric", +"chromophorous", +"chromophotograph", +"chromophotographic", +"chromophotography", +"chromophotolithograph", +"chromophyll", +"chromoplasm", +"chromoplasmic", +"chromoplast", +"chromoplastid", +"chromoprotein", +"chromopsia", +"chromoptometer", +"chromoptometrical", +"chromosantonin", +"chromoscope", +"chromoscopic", +"chromoscopy", +"chromosomal", +"chromosome", +"chromosphere", +"chromospheric", +"chromotherapist", +"chromotherapy", +"chromotrope", +"chromotropic", +"chromotropism", +"chromotropy", +"chromotype", +"chromotypic", +"chromotypographic", +"chromotypography", +"chromotypy", +"chromous", +"chromoxylograph", +"chromoxylography", +"chromule", +"chromy", +"chromyl", +"chronal", +"chronanagram", +"chronaxia", +"chronaxie", +"chronaxy", +"chronic", +"chronical", +"chronically", +"chronicity", +"chronicle", +"chronicler", +"chronicon", +"chronisotherm", +"chronist", +"chronobarometer", +"chronocinematography", +"chronocrator", +"chronocyclegraph", +"chronodeik", +"chronogeneous", +"chronogenesis", +"chronogenetic", +"chronogram", +"chronogrammatic", +"chronogrammatical", +"chronogrammatically", +"chronogrammatist", +"chronogrammic", +"chronograph", +"chronographer", +"chronographic", +"chronographical", +"chronographically", +"chronography", +"chronoisothermal", +"chronologer", +"chronologic", +"chronological", +"chronologically", +"chronologist", +"chronologize", +"chronology", +"chronomancy", +"chronomantic", +"chronometer", +"chronometric", +"chronometrical", +"chronometrically", +"chronometry", +"chrononomy", +"chronopher", +"chronophotograph", +"chronophotographic", +"chronophotography", +"Chronos", +"chronoscope", +"chronoscopic", +"chronoscopically", +"chronoscopy", +"chronosemic", +"chronostichon", +"chronothermal", +"chronothermometer", +"chronotropic", +"chronotropism", +"Chroococcaceae", +"chroococcaceous", +"Chroococcales", +"chroococcoid", +"Chroococcus", +"Chrosperma", +"chrotta", +"chrysal", +"chrysalid", +"chrysalidal", +"chrysalides", +"chrysalidian", +"chrysaline", +"chrysalis", +"chrysaloid", +"chrysamine", +"chrysammic", +"chrysamminic", +"Chrysamphora", +"chrysaniline", +"chrysanisic", +"chrysanthemin", +"chrysanthemum", +"chrysanthous", +"Chrysaor", +"chrysarobin", +"chrysatropic", +"chrysazin", +"chrysazol", +"chryselectrum", +"chryselephantine", +"Chrysemys", +"chrysene", +"chrysenic", +"chrysid", +"Chrysidella", +"chrysidid", +"Chrysididae", +"chrysin", +"Chrysippus", +"Chrysis", +"chrysoaristocracy", +"Chrysobalanaceae", +"Chrysobalanus", +"chrysoberyl", +"chrysobull", +"chrysocarpous", +"chrysochlore", +"Chrysochloridae", +"Chrysochloris", +"chrysochlorous", +"chrysochrous", +"chrysocolla", +"chrysocracy", +"chrysoeriol", +"chrysogen", +"chrysograph", +"chrysographer", +"chrysography", +"chrysohermidin", +"chrysoidine", +"chrysolite", +"chrysolitic", +"chrysology", +"Chrysolophus", +"chrysomelid", +"Chrysomelidae", +"chrysomonad", +"Chrysomonadales", +"Chrysomonadina", +"chrysomonadine", +"Chrysomyia", +"Chrysopa", +"chrysopal", +"chrysopee", +"chrysophan", +"chrysophanic", +"Chrysophanus", +"chrysophenine", +"chrysophilist", +"chrysophilite", +"Chrysophlyctis", +"chrysophyll", +"Chrysophyllum", +"chrysopid", +"Chrysopidae", +"chrysopoeia", +"chrysopoetic", +"chrysopoetics", +"chrysoprase", +"Chrysops", +"Chrysopsis", +"chrysorin", +"chrysosperm", +"Chrysosplenium", +"Chrysothamnus", +"Chrysothrix", +"chrysotile", +"Chrysotis", +"chrystocrene", +"chthonian", +"chthonic", +"chthonophagia", +"chthonophagy", +"chub", +"chubbed", +"chubbedness", +"chubbily", +"chubbiness", +"chubby", +"Chuchona", +"chuck", +"chucker", +"chuckhole", +"chuckies", +"chucking", +"chuckingly", +"chuckle", +"chucklehead", +"chuckleheaded", +"chuckler", +"chucklingly", +"chuckrum", +"chuckstone", +"chuckwalla", +"chucky", +"Chud", +"chuddar", +"Chude", +"Chudic", +"Chueta", +"chufa", +"chuff", +"chuffy", +"chug", +"chugger", +"chuhra", +"Chuje", +"chukar", +"Chukchi", +"chukker", +"chukor", +"chulan", +"chullpa", +"chum", +"Chumashan", +"Chumawi", +"chummage", +"chummer", +"chummery", +"chummily", +"chummy", +"chump", +"chumpaka", +"chumpish", +"chumpishness", +"Chumpivilca", +"chumpy", +"chumship", +"Chumulu", +"Chun", +"chun", +"chunari", +"Chuncho", +"chunga", +"chunk", +"chunkhead", +"chunkily", +"chunkiness", +"chunky", +"chunner", +"chunnia", +"chunter", +"chupak", +"chupon", +"chuprassie", +"chuprassy", +"church", +"churchanity", +"churchcraft", +"churchdom", +"churchful", +"churchgoer", +"churchgoing", +"churchgrith", +"churchianity", +"churchified", +"churchiness", +"churching", +"churchish", +"churchism", +"churchite", +"churchless", +"churchlet", +"churchlike", +"churchliness", +"churchly", +"churchman", +"churchmanly", +"churchmanship", +"churchmaster", +"churchscot", +"churchward", +"churchwarden", +"churchwardenism", +"churchwardenize", +"churchwardenship", +"churchwards", +"churchway", +"churchwise", +"churchwoman", +"churchy", +"churchyard", +"churel", +"churinga", +"churl", +"churled", +"churlhood", +"churlish", +"churlishly", +"churlishness", +"churly", +"churm", +"churn", +"churnability", +"churnful", +"churning", +"churnmilk", +"churnstaff", +"Churoya", +"Churoyan", +"churr", +"Churrigueresque", +"churruck", +"churrus", +"churrworm", +"chut", +"chute", +"chuter", +"chutney", +"Chuvash", +"Chwana", +"chyack", +"chyak", +"chylaceous", +"chylangioma", +"chylaqueous", +"chyle", +"chylemia", +"chylidrosis", +"chylifaction", +"chylifactive", +"chylifactory", +"chyliferous", +"chylific", +"chylification", +"chylificatory", +"chyliform", +"chylify", +"chylocaulous", +"chylocauly", +"chylocele", +"chylocyst", +"chyloid", +"chylomicron", +"chylopericardium", +"chylophyllous", +"chylophylly", +"chylopoiesis", +"chylopoietic", +"chylosis", +"chylothorax", +"chylous", +"chyluria", +"chymaqueous", +"chymase", +"chyme", +"chymia", +"chymic", +"chymiferous", +"chymification", +"chymify", +"chymosin", +"chymosinogen", +"chymotrypsin", +"chymotrypsinogen", +"chymous", +"chypre", +"chytra", +"chytrid", +"Chytridiaceae", +"chytridiaceous", +"chytridial", +"Chytridiales", +"chytridiose", +"chytridiosis", +"Chytridium", +"Chytroi", +"cibarial", +"cibarian", +"cibarious", +"cibation", +"cibol", +"Cibola", +"Cibolan", +"Ciboney", +"cibophobia", +"ciborium", +"cibory", +"ciboule", +"cicad", +"cicada", +"Cicadellidae", +"cicadid", +"Cicadidae", +"cicala", +"cicatrice", +"cicatrices", +"cicatricial", +"cicatricle", +"cicatricose", +"cicatricula", +"cicatricule", +"cicatrisive", +"cicatrix", +"cicatrizant", +"cicatrizate", +"cicatrization", +"cicatrize", +"cicatrizer", +"cicatrose", +"Cicely", +"cicely", +"cicer", +"ciceronage", +"cicerone", +"ciceroni", +"Ciceronian", +"Ciceronianism", +"Ciceronianize", +"Ciceronic", +"Ciceronically", +"ciceronism", +"ciceronize", +"cichlid", +"Cichlidae", +"cichloid", +"cichoraceous", +"Cichoriaceae", +"cichoriaceous", +"Cichorium", +"Cicindela", +"cicindelid", +"cicindelidae", +"cicisbeism", +"ciclatoun", +"Ciconia", +"Ciconiae", +"ciconian", +"ciconiid", +"Ciconiidae", +"ciconiiform", +"Ciconiiformes", +"ciconine", +"ciconioid", +"Cicuta", +"cicutoxin", +"Cid", +"cidarid", +"Cidaridae", +"cidaris", +"Cidaroida", +"cider", +"ciderish", +"ciderist", +"ciderkin", +"cig", +"cigala", +"cigar", +"cigaresque", +"cigarette", +"cigarfish", +"cigarillo", +"cigarito", +"cigarless", +"cigua", +"ciguatera", +"cilectomy", +"cilia", +"ciliary", +"Ciliata", +"ciliate", +"ciliated", +"ciliately", +"ciliation", +"cilice", +"Cilician", +"cilicious", +"Cilicism", +"ciliella", +"ciliferous", +"ciliform", +"ciliiferous", +"ciliiform", +"Cilioflagellata", +"cilioflagellate", +"ciliograde", +"ciliolate", +"ciliolum", +"Ciliophora", +"cilioretinal", +"cilioscleral", +"ciliospinal", +"ciliotomy", +"cilium", +"cillosis", +"cimbia", +"Cimbri", +"Cimbrian", +"Cimbric", +"cimelia", +"cimex", +"cimicid", +"Cimicidae", +"cimicide", +"cimiciform", +"Cimicifuga", +"cimicifugin", +"cimicoid", +"ciminite", +"cimline", +"Cimmeria", +"Cimmerian", +"Cimmerianism", +"cimolite", +"cinch", +"cincher", +"cincholoipon", +"cincholoiponic", +"cinchomeronic", +"Cinchona", +"Cinchonaceae", +"cinchonaceous", +"cinchonamine", +"cinchonate", +"cinchonia", +"cinchonic", +"cinchonicine", +"cinchonidia", +"cinchonidine", +"cinchonine", +"cinchoninic", +"cinchonism", +"cinchonization", +"cinchonize", +"cinchonology", +"cinchophen", +"cinchotine", +"cinchotoxine", +"cincinnal", +"Cincinnati", +"Cincinnatia", +"Cincinnatian", +"cincinnus", +"Cinclidae", +"Cinclidotus", +"cinclis", +"Cinclus", +"cinct", +"cincture", +"cinder", +"Cinderella", +"cinderlike", +"cinderman", +"cinderous", +"cindery", +"cine", +"cinecamera", +"cinefilm", +"cinel", +"cinema", +"Cinemascope", +"cinematic", +"cinematical", +"cinematically", +"cinematize", +"cinematograph", +"cinematographer", +"cinematographic", +"cinematographical", +"cinematographically", +"cinematographist", +"cinematography", +"cinemelodrama", +"cinemize", +"cinemograph", +"cinenchyma", +"cinenchymatous", +"cinene", +"cinenegative", +"cineole", +"cineolic", +"cinephone", +"cinephotomicrography", +"cineplastics", +"cineplasty", +"cineraceous", +"Cinerama", +"Cineraria", +"cinerarium", +"cinerary", +"cineration", +"cinerator", +"cinerea", +"cinereal", +"cinereous", +"cineritious", +"cinevariety", +"cingle", +"cingular", +"cingulate", +"cingulated", +"cingulum", +"cinnabar", +"cinnabaric", +"cinnabarine", +"cinnamal", +"cinnamaldehyde", +"cinnamate", +"cinnamein", +"cinnamene", +"cinnamenyl", +"cinnamic", +"Cinnamodendron", +"cinnamol", +"cinnamomic", +"Cinnamomum", +"cinnamon", +"cinnamoned", +"cinnamonic", +"cinnamonlike", +"cinnamonroot", +"cinnamonwood", +"cinnamyl", +"cinnamylidene", +"cinnoline", +"cinnyl", +"cinquain", +"cinque", +"cinquecentism", +"cinquecentist", +"cinquecento", +"cinquefoil", +"cinquefoiled", +"cinquepace", +"cinter", +"Cinura", +"cinuran", +"cinurous", +"cion", +"cionectomy", +"cionitis", +"cionocranial", +"cionocranian", +"cionoptosis", +"cionorrhaphia", +"cionotome", +"cionotomy", +"Cipango", +"cipher", +"cipherable", +"cipherdom", +"cipherer", +"cipherhood", +"cipo", +"cipolin", +"cippus", +"circa", +"Circaea", +"Circaeaceae", +"Circaetus", +"Circassian", +"Circassic", +"Circe", +"Circean", +"Circensian", +"circinal", +"circinate", +"circinately", +"circination", +"Circinus", +"circiter", +"circle", +"circled", +"circler", +"circlet", +"circlewise", +"circling", +"circovarian", +"circuit", +"circuitable", +"circuital", +"circuiteer", +"circuiter", +"circuition", +"circuitman", +"circuitor", +"circuitous", +"circuitously", +"circuitousness", +"circuity", +"circulable", +"circulant", +"circular", +"circularism", +"circularity", +"circularization", +"circularize", +"circularizer", +"circularly", +"circularness", +"circularwise", +"circulate", +"circulation", +"circulative", +"circulator", +"circulatory", +"circumagitate", +"circumagitation", +"circumambages", +"circumambagious", +"circumambience", +"circumambiency", +"circumambient", +"circumambulate", +"circumambulation", +"circumambulator", +"circumambulatory", +"circumanal", +"circumantarctic", +"circumarctic", +"circumarticular", +"circumaviate", +"circumaviation", +"circumaviator", +"circumaxial", +"circumaxile", +"circumaxillary", +"circumbasal", +"circumbendibus", +"circumboreal", +"circumbuccal", +"circumbulbar", +"circumcallosal", +"Circumcellion", +"circumcenter", +"circumcentral", +"circumcinct", +"circumcincture", +"circumcircle", +"circumcise", +"circumciser", +"circumcision", +"circumclude", +"circumclusion", +"circumcolumnar", +"circumcone", +"circumconic", +"circumcorneal", +"circumcrescence", +"circumcrescent", +"circumdenudation", +"circumdiction", +"circumduce", +"circumduct", +"circumduction", +"circumesophagal", +"circumesophageal", +"circumference", +"circumferential", +"circumferentially", +"circumferentor", +"circumflant", +"circumflect", +"circumflex", +"circumflexion", +"circumfluence", +"circumfluent", +"circumfluous", +"circumforaneous", +"circumfulgent", +"circumfuse", +"circumfusile", +"circumfusion", +"circumgenital", +"circumgyrate", +"circumgyration", +"circumgyratory", +"circumhorizontal", +"circumincession", +"circuminsession", +"circuminsular", +"circumintestinal", +"circumitineration", +"circumjacence", +"circumjacency", +"circumjacent", +"circumlental", +"circumlitio", +"circumlittoral", +"circumlocute", +"circumlocution", +"circumlocutional", +"circumlocutionary", +"circumlocutionist", +"circumlocutory", +"circummeridian", +"circummeridional", +"circummigration", +"circummundane", +"circummure", +"circumnatant", +"circumnavigable", +"circumnavigate", +"circumnavigation", +"circumnavigator", +"circumnavigatory", +"circumneutral", +"circumnuclear", +"circumnutate", +"circumnutation", +"circumnutatory", +"circumocular", +"circumoesophagal", +"circumoral", +"circumorbital", +"circumpacific", +"circumpallial", +"circumparallelogram", +"circumpentagon", +"circumplicate", +"circumplication", +"circumpolar", +"circumpolygon", +"circumpose", +"circumposition", +"circumradius", +"circumrenal", +"circumrotate", +"circumrotation", +"circumrotatory", +"circumsail", +"circumscissile", +"circumscribable", +"circumscribe", +"circumscribed", +"circumscriber", +"circumscript", +"circumscription", +"circumscriptive", +"circumscriptively", +"circumscriptly", +"circumsinous", +"circumspangle", +"circumspatial", +"circumspect", +"circumspection", +"circumspective", +"circumspectively", +"circumspectly", +"circumspectness", +"circumspheral", +"circumstance", +"circumstanced", +"circumstantiability", +"circumstantiable", +"circumstantial", +"circumstantiality", +"circumstantially", +"circumstantialness", +"circumstantiate", +"circumstantiation", +"circumtabular", +"circumterraneous", +"circumterrestrial", +"circumtonsillar", +"circumtropical", +"circumumbilical", +"circumundulate", +"circumundulation", +"circumvallate", +"circumvallation", +"circumvascular", +"circumvent", +"circumventer", +"circumvention", +"circumventive", +"circumventor", +"circumviate", +"circumvolant", +"circumvolute", +"circumvolution", +"circumvolutory", +"circumvolve", +"circumzenithal", +"circus", +"circusy", +"cirque", +"cirrate", +"cirrated", +"Cirratulidae", +"Cirratulus", +"Cirrhopetalum", +"cirrhosed", +"cirrhosis", +"cirrhotic", +"cirrhous", +"cirri", +"cirribranch", +"cirriferous", +"cirriform", +"cirrigerous", +"cirrigrade", +"cirriped", +"Cirripedia", +"cirripedial", +"cirrolite", +"cirropodous", +"cirrose", +"Cirrostomi", +"cirrous", +"cirrus", +"cirsectomy", +"Cirsium", +"cirsocele", +"cirsoid", +"cirsomphalos", +"cirsophthalmia", +"cirsotome", +"cirsotomy", +"ciruela", +"cirurgian", +"Cisalpine", +"cisalpine", +"Cisalpinism", +"cisandine", +"cisatlantic", +"cisco", +"cise", +"cisele", +"cisgangetic", +"cisjurane", +"cisleithan", +"cismarine", +"Cismontane", +"cismontane", +"Cismontanism", +"cisoceanic", +"cispadane", +"cisplatine", +"cispontine", +"cisrhenane", +"Cissampelos", +"cissing", +"cissoid", +"cissoidal", +"Cissus", +"cist", +"cista", +"Cistaceae", +"cistaceous", +"cistae", +"cisted", +"Cistercian", +"Cistercianism", +"cistern", +"cisterna", +"cisternal", +"cistic", +"cistophoric", +"cistophorus", +"Cistudo", +"Cistus", +"cistvaen", +"cit", +"citable", +"citadel", +"citation", +"citator", +"citatory", +"cite", +"citee", +"Citellus", +"citer", +"citess", +"cithara", +"Citharexylum", +"citharist", +"citharista", +"citharoedi", +"citharoedic", +"citharoedus", +"cither", +"citied", +"citification", +"citified", +"citify", +"Citigradae", +"citigrade", +"citizen", +"citizendom", +"citizeness", +"citizenhood", +"citizenish", +"citizenism", +"citizenize", +"citizenly", +"citizenry", +"citizenship", +"citole", +"citraconate", +"citraconic", +"citral", +"citramide", +"citramontane", +"citrange", +"citrangeade", +"citrate", +"citrated", +"citrean", +"citrene", +"citreous", +"citric", +"citriculture", +"citriculturist", +"citril", +"citrin", +"citrination", +"citrine", +"citrinin", +"citrinous", +"citrometer", +"Citromyces", +"citron", +"citronade", +"citronella", +"citronellal", +"citronelle", +"citronellic", +"citronellol", +"citronin", +"citronwood", +"Citropsis", +"citropten", +"citrous", +"citrullin", +"Citrullus", +"Citrus", +"citrus", +"citrylidene", +"cittern", +"citua", +"city", +"citycism", +"citydom", +"cityfolk", +"cityful", +"cityish", +"cityless", +"cityness", +"cityscape", +"cityward", +"citywards", +"cive", +"civet", +"civetlike", +"civetone", +"civic", +"civically", +"civicism", +"civics", +"civil", +"civilian", +"civility", +"civilizable", +"civilization", +"civilizational", +"civilizatory", +"civilize", +"civilized", +"civilizedness", +"civilizee", +"civilizer", +"civilly", +"civilness", +"civism", +"Civitan", +"civvy", +"cixiid", +"Cixiidae", +"Cixo", +"clabber", +"clabbery", +"clachan", +"clack", +"Clackama", +"clackdish", +"clacker", +"clacket", +"clackety", +"clad", +"cladanthous", +"cladautoicous", +"cladding", +"cladine", +"cladocarpous", +"Cladocera", +"cladoceran", +"cladocerous", +"cladode", +"cladodial", +"cladodont", +"cladodontid", +"Cladodontidae", +"Cladodus", +"cladogenous", +"Cladonia", +"Cladoniaceae", +"cladoniaceous", +"cladonioid", +"Cladophora", +"Cladophoraceae", +"cladophoraceous", +"Cladophorales", +"cladophyll", +"cladophyllum", +"cladoptosis", +"cladose", +"Cladoselache", +"Cladoselachea", +"cladoselachian", +"Cladoselachidae", +"cladosiphonic", +"Cladosporium", +"Cladothrix", +"Cladrastis", +"cladus", +"clag", +"claggum", +"claggy", +"Claiborne", +"Claibornian", +"claim", +"claimable", +"claimant", +"claimer", +"claimless", +"clairaudience", +"clairaudient", +"clairaudiently", +"clairce", +"clairecole", +"clairecolle", +"clairschach", +"clairschacher", +"clairsentience", +"clairsentient", +"clairvoyance", +"clairvoyancy", +"clairvoyant", +"clairvoyantly", +"claith", +"claithes", +"claiver", +"Clallam", +"clam", +"clamant", +"clamantly", +"clamative", +"Clamatores", +"clamatorial", +"clamatory", +"clamb", +"clambake", +"clamber", +"clamberer", +"clamcracker", +"clame", +"clamer", +"clammed", +"clammer", +"clammily", +"clamminess", +"clamming", +"clammish", +"clammy", +"clammyweed", +"clamor", +"clamorer", +"clamorist", +"clamorous", +"clamorously", +"clamorousness", +"clamorsome", +"clamp", +"clamper", +"clamshell", +"clamworm", +"clan", +"clancular", +"clancularly", +"clandestine", +"clandestinely", +"clandestineness", +"clandestinity", +"clanfellow", +"clang", +"clangful", +"clangingly", +"clangor", +"clangorous", +"clangorously", +"Clangula", +"clanjamfray", +"clanjamfrey", +"clanjamfrie", +"clanjamphrey", +"clank", +"clankety", +"clanking", +"clankingly", +"clankingness", +"clankless", +"clanless", +"clanned", +"clanning", +"clannishly", +"clannishness", +"clansfolk", +"clanship", +"clansman", +"clansmanship", +"clanswoman", +"Claosaurus", +"clap", +"clapboard", +"clapbread", +"clapmatch", +"clapnet", +"clapped", +"clapper", +"clapperclaw", +"clapperclawer", +"clapperdudgeon", +"clappermaclaw", +"clapping", +"clapt", +"claptrap", +"clapwort", +"claque", +"claquer", +"Clara", +"clarabella", +"clarain", +"Clare", +"Clarence", +"Clarenceux", +"Clarenceuxship", +"Clarencieux", +"clarendon", +"claret", +"Claretian", +"Claribel", +"claribella", +"Clarice", +"clarifiant", +"clarification", +"clarifier", +"clarify", +"clarigation", +"clarin", +"Clarinda", +"clarinet", +"clarinetist", +"clarinettist", +"clarion", +"clarionet", +"Clarissa", +"Clarisse", +"Clarist", +"clarity", +"clark", +"clarkeite", +"Clarkia", +"claro", +"Claromontane", +"clarshech", +"clart", +"clarty", +"clary", +"clash", +"clasher", +"clashingly", +"clashy", +"clasmatocyte", +"clasmatosis", +"clasp", +"clasper", +"clasping", +"claspt", +"class", +"classable", +"classbook", +"classed", +"classer", +"classes", +"classfellow", +"classic", +"classical", +"classicalism", +"classicalist", +"classicality", +"classicalize", +"classically", +"classicalness", +"classicism", +"classicist", +"classicistic", +"classicize", +"classicolatry", +"classifiable", +"classific", +"classifically", +"classification", +"classificational", +"classificator", +"classificatory", +"classified", +"classifier", +"classis", +"classism", +"classman", +"classmanship", +"classmate", +"classroom", +"classwise", +"classwork", +"classy", +"clastic", +"clat", +"clatch", +"Clathraceae", +"clathraceous", +"Clathraria", +"clathrarian", +"clathrate", +"Clathrina", +"Clathrinidae", +"clathroid", +"clathrose", +"clathrulate", +"Clathrus", +"Clatsop", +"clatter", +"clatterer", +"clatteringly", +"clattertrap", +"clattery", +"clatty", +"Claude", +"claudent", +"claudetite", +"Claudia", +"Claudian", +"claudicant", +"claudicate", +"claudication", +"Claudio", +"Claudius", +"claught", +"clausal", +"clause", +"Clausilia", +"Clausiliidae", +"clausthalite", +"claustra", +"claustral", +"claustration", +"claustrophobia", +"claustrum", +"clausula", +"clausular", +"clausule", +"clausure", +"claut", +"clava", +"clavacin", +"claval", +"Clavaria", +"Clavariaceae", +"clavariaceous", +"clavate", +"clavated", +"clavately", +"clavation", +"clave", +"clavecin", +"clavecinist", +"clavel", +"clavelization", +"clavelize", +"clavellate", +"clavellated", +"claver", +"clavial", +"claviature", +"clavicembalo", +"Claviceps", +"clavichord", +"clavichordist", +"clavicithern", +"clavicle", +"clavicorn", +"clavicornate", +"Clavicornes", +"Clavicornia", +"clavicotomy", +"clavicular", +"clavicularium", +"claviculate", +"claviculus", +"clavicylinder", +"clavicymbal", +"clavicytherium", +"clavier", +"clavierist", +"claviform", +"claviger", +"clavigerous", +"claviharp", +"clavilux", +"claviol", +"clavipectoral", +"clavis", +"clavodeltoid", +"clavodeltoideus", +"clavola", +"clavolae", +"clavolet", +"clavus", +"clavy", +"claw", +"clawed", +"clawer", +"clawk", +"clawker", +"clawless", +"clay", +"claybank", +"claybrained", +"clayen", +"clayer", +"clayey", +"clayiness", +"clayish", +"claylike", +"clayman", +"claymore", +"Clayoquot", +"claypan", +"Claytonia", +"clayware", +"clayweed", +"cleach", +"clead", +"cleaded", +"cleading", +"cleam", +"cleamer", +"clean", +"cleanable", +"cleaner", +"cleanhanded", +"cleanhandedness", +"cleanhearted", +"cleaning", +"cleanish", +"cleanlily", +"cleanliness", +"cleanly", +"cleanness", +"cleanout", +"cleansable", +"cleanse", +"cleanser", +"cleansing", +"cleanskins", +"cleanup", +"clear", +"clearable", +"clearage", +"clearance", +"clearcole", +"clearedness", +"clearer", +"clearheaded", +"clearheadedly", +"clearheadedness", +"clearhearted", +"clearing", +"clearinghouse", +"clearish", +"clearly", +"clearness", +"clearskins", +"clearstarch", +"clearweed", +"clearwing", +"cleat", +"cleavability", +"cleavable", +"cleavage", +"cleave", +"cleaveful", +"cleavelandite", +"cleaver", +"cleavers", +"cleaverwort", +"cleaving", +"cleavingly", +"cleche", +"cleck", +"cled", +"cledge", +"cledgy", +"cledonism", +"clee", +"cleek", +"cleeked", +"cleeky", +"clef", +"cleft", +"clefted", +"cleg", +"cleidagra", +"cleidarthritis", +"cleidocostal", +"cleidocranial", +"cleidohyoid", +"cleidomancy", +"cleidomastoid", +"cleidorrhexis", +"cleidoscapular", +"cleidosternal", +"cleidotomy", +"cleidotripsy", +"cleistocarp", +"cleistocarpous", +"cleistogamic", +"cleistogamically", +"cleistogamous", +"cleistogamously", +"cleistogamy", +"cleistogene", +"cleistogenous", +"cleistogeny", +"cleistothecium", +"Cleistothecopsis", +"cleithral", +"cleithrum", +"clem", +"Clematis", +"clematite", +"Clemclemalats", +"clemence", +"clemency", +"Clement", +"clement", +"Clementina", +"Clementine", +"clemently", +"clench", +"cleoid", +"Cleome", +"Cleopatra", +"clep", +"Clepsine", +"clepsydra", +"cleptobiosis", +"cleptobiotic", +"clerestoried", +"clerestory", +"clergy", +"clergyable", +"clergylike", +"clergyman", +"clergywoman", +"cleric", +"clerical", +"clericalism", +"clericalist", +"clericality", +"clericalize", +"clerically", +"clericate", +"clericature", +"clericism", +"clericity", +"clerid", +"Cleridae", +"clerihew", +"clerisy", +"clerk", +"clerkage", +"clerkdom", +"clerkery", +"clerkess", +"clerkhood", +"clerking", +"clerkish", +"clerkless", +"clerklike", +"clerkliness", +"clerkly", +"clerkship", +"Clerodendron", +"cleromancy", +"cleronomy", +"cleruch", +"cleruchial", +"cleruchic", +"cleruchy", +"Clerus", +"cletch", +"Clethra", +"Clethraceae", +"clethraceous", +"cleuch", +"cleve", +"cleveite", +"clever", +"cleverality", +"cleverish", +"cleverishly", +"cleverly", +"cleverness", +"clevis", +"clew", +"cliack", +"clianthus", +"cliche", +"click", +"clicker", +"clicket", +"clickless", +"clicky", +"Clidastes", +"cliency", +"client", +"clientage", +"cliental", +"cliented", +"clientelage", +"clientele", +"clientless", +"clientry", +"clientship", +"cliff", +"cliffed", +"cliffless", +"clifflet", +"clifflike", +"cliffside", +"cliffsman", +"cliffweed", +"cliffy", +"clift", +"Cliftonia", +"cliftonite", +"clifty", +"clima", +"Climaciaceae", +"climaciaceous", +"Climacium", +"climacteric", +"climacterical", +"climacterically", +"climactic", +"climactical", +"climactically", +"climacus", +"climata", +"climatal", +"climate", +"climath", +"climatic", +"climatical", +"climatically", +"Climatius", +"climatize", +"climatographical", +"climatography", +"climatologic", +"climatological", +"climatologically", +"climatologist", +"climatology", +"climatometer", +"climatotherapeutics", +"climatotherapy", +"climature", +"climax", +"climb", +"climbable", +"climber", +"climbing", +"clime", +"climograph", +"clinal", +"clinamen", +"clinamina", +"clinandria", +"clinandrium", +"clinanthia", +"clinanthium", +"clinch", +"clincher", +"clinchingly", +"clinchingness", +"cline", +"cling", +"clinger", +"clingfish", +"clinging", +"clingingly", +"clingingness", +"clingstone", +"clingy", +"clinia", +"clinic", +"clinical", +"clinically", +"clinician", +"clinicist", +"clinicopathological", +"clinium", +"clink", +"clinker", +"clinkerer", +"clinkery", +"clinking", +"clinkstone", +"clinkum", +"clinoaxis", +"clinocephalic", +"clinocephalism", +"clinocephalous", +"clinocephalus", +"clinocephaly", +"clinochlore", +"clinoclase", +"clinoclasite", +"clinodiagonal", +"clinodomatic", +"clinodome", +"clinograph", +"clinographic", +"clinohedral", +"clinohedrite", +"clinohumite", +"clinoid", +"clinologic", +"clinology", +"clinometer", +"clinometric", +"clinometrical", +"clinometry", +"clinopinacoid", +"clinopinacoidal", +"Clinopodium", +"clinoprism", +"clinopyramid", +"clinopyroxene", +"clinorhombic", +"clinospore", +"clinostat", +"clinquant", +"clint", +"clinting", +"Clinton", +"Clintonia", +"clintonite", +"clinty", +"Clio", +"Cliona", +"Clione", +"clip", +"clipei", +"clipeus", +"clippable", +"clipped", +"clipper", +"clipperman", +"clipping", +"clips", +"clipse", +"clipsheet", +"clipsome", +"clipt", +"clique", +"cliquedom", +"cliqueless", +"cliquish", +"cliquishly", +"cliquishness", +"cliquism", +"cliquy", +"cliseometer", +"clisere", +"clishmaclaver", +"Clisiocampa", +"Clistogastra", +"clit", +"clitch", +"clite", +"clitella", +"clitellar", +"clitelliferous", +"clitelline", +"clitellum", +"clitellus", +"clites", +"clithe", +"clithral", +"clithridiate", +"clitia", +"clition", +"Clitocybe", +"Clitoria", +"clitoridauxe", +"clitoridean", +"clitoridectomy", +"clitoriditis", +"clitoridotomy", +"clitoris", +"clitorism", +"clitoritis", +"clitter", +"clitterclatter", +"clival", +"clive", +"clivers", +"Clivia", +"clivis", +"clivus", +"cloaca", +"cloacal", +"cloacaline", +"cloacean", +"cloacinal", +"cloacinean", +"cloacitis", +"cloak", +"cloakage", +"cloaked", +"cloakedly", +"cloaking", +"cloakless", +"cloaklet", +"cloakmaker", +"cloakmaking", +"cloakroom", +"cloakwise", +"cloam", +"cloamen", +"cloamer", +"clobber", +"clobberer", +"clochan", +"cloche", +"clocher", +"clochette", +"clock", +"clockbird", +"clockcase", +"clocked", +"clocker", +"clockface", +"clockhouse", +"clockkeeper", +"clockless", +"clocklike", +"clockmaker", +"clockmaking", +"clockmutch", +"clockroom", +"clocksmith", +"clockwise", +"clockwork", +"clod", +"clodbreaker", +"clodder", +"cloddily", +"cloddiness", +"cloddish", +"cloddishly", +"cloddishness", +"cloddy", +"clodhead", +"clodhopper", +"clodhopping", +"clodlet", +"clodpate", +"clodpated", +"clodpoll", +"cloff", +"clog", +"clogdogdo", +"clogger", +"cloggily", +"clogginess", +"cloggy", +"cloghad", +"cloglike", +"clogmaker", +"clogmaking", +"clogwood", +"clogwyn", +"cloiochoanitic", +"cloisonless", +"cloisonne", +"cloister", +"cloisteral", +"cloistered", +"cloisterer", +"cloisterless", +"cloisterlike", +"cloisterliness", +"cloisterly", +"cloisterwise", +"cloistral", +"cloistress", +"cloit", +"clomb", +"clomben", +"clonal", +"clone", +"clonic", +"clonicity", +"clonicotonic", +"clonism", +"clonorchiasis", +"Clonorchis", +"Clonothrix", +"clonus", +"cloof", +"cloop", +"cloot", +"clootie", +"clop", +"cloragen", +"clorargyrite", +"cloriodid", +"closable", +"close", +"closecross", +"closed", +"closefisted", +"closefistedly", +"closefistedness", +"closehanded", +"closehearted", +"closely", +"closemouth", +"closemouthed", +"closen", +"closeness", +"closer", +"closestool", +"closet", +"closewing", +"closh", +"closish", +"closter", +"Closterium", +"clostridial", +"Clostridium", +"closure", +"clot", +"clotbur", +"clote", +"cloth", +"clothbound", +"clothe", +"clothes", +"clothesbag", +"clothesbasket", +"clothesbrush", +"clotheshorse", +"clothesline", +"clothesman", +"clothesmonger", +"clothespin", +"clothespress", +"clothesyard", +"clothier", +"clothify", +"Clothilda", +"clothing", +"clothmaker", +"clothmaking", +"Clotho", +"clothworker", +"clothy", +"clottage", +"clottedness", +"clotter", +"clotty", +"cloture", +"clotweed", +"cloud", +"cloudage", +"cloudberry", +"cloudburst", +"cloudcap", +"clouded", +"cloudful", +"cloudily", +"cloudiness", +"clouding", +"cloudland", +"cloudless", +"cloudlessly", +"cloudlessness", +"cloudlet", +"cloudlike", +"cloudling", +"cloudology", +"cloudscape", +"cloudship", +"cloudward", +"cloudwards", +"cloudy", +"clough", +"clour", +"clout", +"clouted", +"clouter", +"clouterly", +"clouty", +"clove", +"cloven", +"clovene", +"clover", +"clovered", +"cloverlay", +"cloverleaf", +"cloveroot", +"cloverroot", +"clovery", +"clow", +"clown", +"clownade", +"clownage", +"clownery", +"clownheal", +"clownish", +"clownishly", +"clownishness", +"clownship", +"clowring", +"cloy", +"cloyedness", +"cloyer", +"cloying", +"cloyingly", +"cloyingness", +"cloyless", +"cloysome", +"club", +"clubbability", +"clubbable", +"clubbed", +"clubber", +"clubbily", +"clubbing", +"clubbish", +"clubbism", +"clubbist", +"clubby", +"clubdom", +"clubfellow", +"clubfisted", +"clubfoot", +"clubfooted", +"clubhand", +"clubhaul", +"clubhouse", +"clubionid", +"Clubionidae", +"clubland", +"clubman", +"clubmate", +"clubmobile", +"clubmonger", +"clubridden", +"clubroom", +"clubroot", +"clubstart", +"clubster", +"clubweed", +"clubwoman", +"clubwood", +"cluck", +"clue", +"cluff", +"clump", +"clumpish", +"clumproot", +"clumpy", +"clumse", +"clumsily", +"clumsiness", +"clumsy", +"clunch", +"clung", +"Cluniac", +"Cluniacensian", +"Clunisian", +"Clunist", +"clunk", +"clupanodonic", +"Clupea", +"clupeid", +"Clupeidae", +"clupeiform", +"clupeine", +"Clupeodei", +"clupeoid", +"cluricaune", +"Clusia", +"Clusiaceae", +"clusiaceous", +"cluster", +"clusterberry", +"clustered", +"clusterfist", +"clustering", +"clusteringly", +"clustery", +"clutch", +"clutchman", +"cluther", +"clutter", +"clutterer", +"clutterment", +"cluttery", +"cly", +"Clydesdale", +"Clydeside", +"Clydesider", +"clyer", +"clyfaker", +"clyfaking", +"Clymenia", +"clype", +"clypeal", +"Clypeaster", +"Clypeastridea", +"Clypeastrina", +"clypeastroid", +"Clypeastroida", +"Clypeastroidea", +"clypeate", +"clypeiform", +"clypeolar", +"clypeolate", +"clypeole", +"clypeus", +"clysis", +"clysma", +"clysmian", +"clysmic", +"clyster", +"clysterize", +"Clytemnestra", +"cnemapophysis", +"cnemial", +"cnemidium", +"Cnemidophorus", +"cnemis", +"Cneoraceae", +"cneoraceous", +"Cneorum", +"cnicin", +"Cnicus", +"cnida", +"Cnidaria", +"cnidarian", +"Cnidian", +"cnidoblast", +"cnidocell", +"cnidocil", +"cnidocyst", +"cnidophore", +"cnidophorous", +"cnidopod", +"cnidosac", +"Cnidoscolus", +"cnidosis", +"coabode", +"coabound", +"coabsume", +"coacceptor", +"coacervate", +"coacervation", +"coach", +"coachability", +"coachable", +"coachbuilder", +"coachbuilding", +"coachee", +"coacher", +"coachfellow", +"coachful", +"coaching", +"coachlet", +"coachmaker", +"coachmaking", +"coachman", +"coachmanship", +"coachmaster", +"coachsmith", +"coachsmithing", +"coachway", +"coachwhip", +"coachwise", +"coachwoman", +"coachwork", +"coachwright", +"coachy", +"coact", +"coaction", +"coactive", +"coactively", +"coactivity", +"coactor", +"coadamite", +"coadapt", +"coadaptation", +"coadequate", +"coadjacence", +"coadjacency", +"coadjacent", +"coadjacently", +"coadjudicator", +"coadjust", +"coadjustment", +"coadjutant", +"coadjutator", +"coadjute", +"coadjutement", +"coadjutive", +"coadjutor", +"coadjutorship", +"coadjutress", +"coadjutrix", +"coadjuvancy", +"coadjuvant", +"coadjuvate", +"coadminister", +"coadministration", +"coadministrator", +"coadministratrix", +"coadmiration", +"coadmire", +"coadmit", +"coadnate", +"coadore", +"coadsorbent", +"coadunate", +"coadunation", +"coadunative", +"coadunatively", +"coadunite", +"coadventure", +"coadventurer", +"coadvice", +"coaffirmation", +"coafforest", +"coaged", +"coagency", +"coagent", +"coaggregate", +"coaggregated", +"coaggregation", +"coagitate", +"coagitator", +"coagment", +"coagonize", +"coagriculturist", +"coagula", +"coagulability", +"coagulable", +"coagulant", +"coagulase", +"coagulate", +"coagulation", +"coagulative", +"coagulator", +"coagulatory", +"coagulin", +"coagulometer", +"coagulose", +"coagulum", +"Coahuiltecan", +"coaid", +"coaita", +"coak", +"coakum", +"coal", +"coalbag", +"coalbagger", +"coalbin", +"coalbox", +"coaldealer", +"coaler", +"coalesce", +"coalescence", +"coalescency", +"coalescent", +"coalfish", +"coalfitter", +"coalhole", +"coalification", +"coalify", +"Coalite", +"coalition", +"coalitional", +"coalitioner", +"coalitionist", +"coalize", +"coalizer", +"coalless", +"coalmonger", +"coalmouse", +"coalpit", +"coalrake", +"coalsack", +"coalternate", +"coalternation", +"coalternative", +"coaltitude", +"coaly", +"coalyard", +"coambassador", +"coambulant", +"coamiable", +"coaming", +"Coan", +"coanimate", +"coannex", +"coannihilate", +"coapostate", +"coapparition", +"coappear", +"coappearance", +"coapprehend", +"coapprentice", +"coappriser", +"coapprover", +"coapt", +"coaptate", +"coaptation", +"coaration", +"coarb", +"coarbiter", +"coarbitrator", +"coarctate", +"coarctation", +"coardent", +"coarrange", +"coarrangement", +"coarse", +"coarsely", +"coarsen", +"coarseness", +"coarsish", +"coascend", +"coassert", +"coasserter", +"coassession", +"coassessor", +"coassignee", +"coassist", +"coassistance", +"coassistant", +"coassume", +"coast", +"coastal", +"coastally", +"coaster", +"Coastguard", +"coastguardman", +"coasting", +"coastland", +"coastman", +"coastside", +"coastwaiter", +"coastward", +"coastwards", +"coastways", +"coastwise", +"coat", +"coated", +"coatee", +"coater", +"coati", +"coatie", +"coatimondie", +"coatimundi", +"coating", +"coatless", +"coatroom", +"coattail", +"coattailed", +"coattend", +"coattest", +"coattestation", +"coattestator", +"coaudience", +"coauditor", +"coaugment", +"coauthor", +"coauthority", +"coauthorship", +"coawareness", +"coax", +"coaxal", +"coaxation", +"coaxer", +"coaxial", +"coaxially", +"coaxing", +"coaxingly", +"coaxy", +"cob", +"cobaea", +"cobalt", +"cobaltammine", +"cobaltic", +"cobalticyanic", +"cobalticyanides", +"cobaltiferous", +"cobaltinitrite", +"cobaltite", +"cobaltocyanic", +"cobaltocyanide", +"cobaltous", +"cobang", +"cobbed", +"cobber", +"cobberer", +"cobbing", +"cobble", +"cobbler", +"cobblerfish", +"cobblerism", +"cobblerless", +"cobblership", +"cobblery", +"cobblestone", +"cobbling", +"cobbly", +"cobbra", +"cobby", +"cobcab", +"Cobdenism", +"Cobdenite", +"cobego", +"cobelief", +"cobeliever", +"cobelligerent", +"cobenignity", +"coberger", +"cobewail", +"cobhead", +"cobia", +"cobiron", +"cobishop", +"Cobitidae", +"Cobitis", +"coble", +"cobleman", +"Coblentzian", +"Cobleskill", +"cobless", +"cobloaf", +"cobnut", +"cobola", +"coboundless", +"cobourg", +"cobra", +"cobreathe", +"cobridgehead", +"cobriform", +"cobrother", +"cobstone", +"coburg", +"coburgess", +"coburgher", +"coburghership", +"Cobus", +"cobweb", +"cobwebbery", +"cobwebbing", +"cobwebby", +"cobwork", +"coca", +"cocaceous", +"cocaine", +"cocainism", +"cocainist", +"cocainization", +"cocainize", +"cocainomania", +"cocainomaniac", +"Cocama", +"Cocamama", +"cocamine", +"Cocanucos", +"cocarboxylase", +"cocash", +"cocashweed", +"cocause", +"cocautioner", +"Coccaceae", +"coccagee", +"coccal", +"Cocceian", +"Cocceianism", +"coccerin", +"cocci", +"coccid", +"Coccidae", +"coccidia", +"coccidial", +"coccidian", +"Coccidiidea", +"coccidioidal", +"Coccidioides", +"Coccidiomorpha", +"coccidiosis", +"coccidium", +"coccidology", +"cocciferous", +"cocciform", +"coccigenic", +"coccinella", +"coccinellid", +"Coccinellidae", +"coccionella", +"cocco", +"coccobacillus", +"coccochromatic", +"Coccogonales", +"coccogone", +"Coccogoneae", +"coccogonium", +"coccoid", +"coccolite", +"coccolith", +"coccolithophorid", +"Coccolithophoridae", +"Coccoloba", +"Coccolobis", +"Coccomyces", +"coccosphere", +"coccostean", +"coccosteid", +"Coccosteidae", +"Coccosteus", +"Coccothraustes", +"coccothraustine", +"Coccothrinax", +"coccous", +"coccule", +"cocculiferous", +"Cocculus", +"cocculus", +"coccus", +"coccydynia", +"coccygalgia", +"coccygeal", +"coccygean", +"coccygectomy", +"coccygerector", +"coccyges", +"coccygeus", +"coccygine", +"coccygodynia", +"coccygomorph", +"Coccygomorphae", +"coccygomorphic", +"coccygotomy", +"coccyodynia", +"coccyx", +"Coccyzus", +"cocentric", +"cochairman", +"cochal", +"cochief", +"Cochin", +"cochineal", +"cochlea", +"cochlear", +"cochleare", +"Cochlearia", +"cochlearifoliate", +"cochleariform", +"cochleate", +"cochleated", +"cochleiform", +"cochleitis", +"cochleous", +"cochlidiid", +"Cochlidiidae", +"cochliodont", +"Cochliodontidae", +"Cochliodus", +"Cochlospermaceae", +"cochlospermaceous", +"Cochlospermum", +"Cochranea", +"cochurchwarden", +"cocillana", +"cocircular", +"cocircularity", +"cocitizen", +"cocitizenship", +"cock", +"cockade", +"cockaded", +"Cockaigne", +"cockal", +"cockalorum", +"cockamaroo", +"cockarouse", +"cockateel", +"cockatoo", +"cockatrice", +"cockawee", +"cockbell", +"cockbill", +"cockbird", +"cockboat", +"cockbrain", +"cockchafer", +"cockcrow", +"cockcrower", +"cockcrowing", +"cocked", +"Cocker", +"cocker", +"cockerel", +"cockermeg", +"cockernony", +"cocket", +"cockeye", +"cockeyed", +"cockfight", +"cockfighting", +"cockhead", +"cockhorse", +"cockieleekie", +"cockily", +"cockiness", +"cocking", +"cockish", +"cockle", +"cockleboat", +"cocklebur", +"cockled", +"cockler", +"cockleshell", +"cocklet", +"cocklewife", +"cocklight", +"cockling", +"cockloft", +"cockly", +"cockmaster", +"cockmatch", +"cockmate", +"cockneian", +"cockneity", +"cockney", +"cockneybred", +"cockneydom", +"cockneyese", +"cockneyess", +"cockneyfication", +"cockneyfy", +"cockneyish", +"cockneyishly", +"cockneyism", +"cockneyize", +"cockneyland", +"cockneyship", +"cockpit", +"cockroach", +"cockscomb", +"cockscombed", +"cocksfoot", +"cockshead", +"cockshot", +"cockshut", +"cockshy", +"cockshying", +"cockspur", +"cockstone", +"cocksure", +"cocksuredom", +"cocksureism", +"cocksurely", +"cocksureness", +"cocksurety", +"cocktail", +"cockthrowing", +"cockup", +"cockweed", +"cocky", +"Cocle", +"coco", +"cocoa", +"cocoach", +"cocobolo", +"Coconino", +"coconnection", +"coconqueror", +"coconscious", +"coconsciously", +"coconsciousness", +"coconsecrator", +"coconspirator", +"coconstituent", +"cocontractor", +"Coconucan", +"Coconuco", +"coconut", +"cocoon", +"cocoonery", +"cocorico", +"cocoroot", +"Cocos", +"cocotte", +"cocovenantor", +"cocowood", +"cocowort", +"cocozelle", +"cocreate", +"cocreator", +"cocreatorship", +"cocreditor", +"cocrucify", +"coctile", +"coction", +"coctoantigen", +"coctoprecipitin", +"cocuisa", +"cocullo", +"cocurator", +"cocurrent", +"cocuswood", +"cocuyo", +"Cocytean", +"Cocytus", +"cod", +"coda", +"codamine", +"codbank", +"codder", +"codding", +"coddle", +"coddler", +"code", +"codebtor", +"codeclination", +"codecree", +"codefendant", +"codeine", +"codeless", +"codelight", +"codelinquency", +"codelinquent", +"codenization", +"codeposit", +"coder", +"coderive", +"codescendant", +"codespairer", +"codex", +"codfish", +"codfisher", +"codfishery", +"codger", +"codhead", +"codheaded", +"Codiaceae", +"codiaceous", +"Codiaeum", +"Codiales", +"codical", +"codices", +"codicil", +"codicilic", +"codicillary", +"codictatorship", +"codification", +"codifier", +"codify", +"codilla", +"codille", +"codiniac", +"codirectional", +"codirector", +"codiscoverer", +"codisjunct", +"codist", +"Codium", +"codivine", +"codling", +"codman", +"codo", +"codol", +"codomestication", +"codominant", +"codon", +"codpiece", +"codpitchings", +"Codrus", +"codshead", +"codworm", +"coe", +"coecal", +"coecum", +"coed", +"coeditor", +"coeditorship", +"coeducate", +"coeducation", +"coeducational", +"coeducationalism", +"coeducationalize", +"coeducationally", +"coeffect", +"coefficacy", +"coefficient", +"coefficiently", +"coeffluent", +"coeffluential", +"coelacanth", +"coelacanthid", +"Coelacanthidae", +"coelacanthine", +"Coelacanthini", +"coelacanthoid", +"coelacanthous", +"coelanaglyphic", +"coelar", +"coelarium", +"Coelastraceae", +"coelastraceous", +"Coelastrum", +"Coelata", +"coelder", +"coeldership", +"Coelebogyne", +"coelect", +"coelection", +"coelector", +"coelectron", +"coelelminth", +"Coelelminthes", +"coelelminthic", +"Coelentera", +"Coelenterata", +"coelenterate", +"coelenteric", +"coelenteron", +"coelestine", +"coelevate", +"coelho", +"coelia", +"coeliac", +"coelialgia", +"coelian", +"Coelicolae", +"Coelicolist", +"coeligenous", +"coelin", +"coeline", +"coeliomyalgia", +"coeliorrhea", +"coeliorrhoea", +"coelioscopy", +"coeliotomy", +"coeloblastic", +"coeloblastula", +"Coelococcus", +"coelodont", +"coelogastrula", +"Coeloglossum", +"Coelogyne", +"coelom", +"coeloma", +"Coelomata", +"coelomate", +"coelomatic", +"coelomatous", +"coelomesoblast", +"coelomic", +"Coelomocoela", +"coelomopore", +"coelonavigation", +"coelongated", +"coeloplanula", +"coelosperm", +"coelospermous", +"coelostat", +"coelozoic", +"coemanate", +"coembedded", +"coembody", +"coembrace", +"coeminency", +"coemperor", +"coemploy", +"coemployee", +"coemployment", +"coempt", +"coemption", +"coemptional", +"coemptionator", +"coemptive", +"coemptor", +"coenact", +"coenactor", +"coenaculous", +"coenamor", +"coenamorment", +"coenamourment", +"coenanthium", +"coendear", +"Coendidae", +"Coendou", +"coendure", +"coenenchym", +"coenenchyma", +"coenenchymal", +"coenenchymatous", +"coenenchyme", +"coenesthesia", +"coenesthesis", +"coenflame", +"coengage", +"coengager", +"coenjoy", +"coenobe", +"coenobiar", +"coenobic", +"coenobioid", +"coenobium", +"coenoblast", +"coenoblastic", +"coenocentrum", +"coenocyte", +"coenocytic", +"coenodioecism", +"coenoecial", +"coenoecic", +"coenoecium", +"coenogamete", +"coenomonoecism", +"coenosarc", +"coenosarcal", +"coenosarcous", +"coenosite", +"coenospecies", +"coenospecific", +"coenospecifically", +"coenosteal", +"coenosteum", +"coenotrope", +"coenotype", +"coenotypic", +"coenthrone", +"coenurus", +"coenzyme", +"coequal", +"coequality", +"coequalize", +"coequally", +"coequalness", +"coequate", +"coequated", +"coequation", +"coerce", +"coercement", +"coercer", +"coercibility", +"coercible", +"coercibleness", +"coercibly", +"coercion", +"coercionary", +"coercionist", +"coercitive", +"coercive", +"coercively", +"coerciveness", +"coercivity", +"Coerebidae", +"coeruleolactite", +"coessential", +"coessentiality", +"coessentially", +"coessentialness", +"coestablishment", +"coestate", +"coetaneity", +"coetaneous", +"coetaneously", +"coetaneousness", +"coeternal", +"coeternally", +"coeternity", +"coetus", +"coeval", +"coevality", +"coevally", +"coexchangeable", +"coexclusive", +"coexecutant", +"coexecutor", +"coexecutrix", +"coexert", +"coexertion", +"coexist", +"coexistence", +"coexistency", +"coexistent", +"coexpand", +"coexpanded", +"coexperiencer", +"coexpire", +"coexplosion", +"coextend", +"coextension", +"coextensive", +"coextensively", +"coextensiveness", +"coextent", +"cofactor", +"Cofane", +"cofaster", +"cofather", +"cofathership", +"cofeature", +"cofeoffee", +"coferment", +"cofermentation", +"coff", +"Coffea", +"coffee", +"coffeebush", +"coffeecake", +"coffeegrower", +"coffeegrowing", +"coffeehouse", +"coffeeleaf", +"coffeepot", +"coffeeroom", +"coffeetime", +"coffeeweed", +"coffeewood", +"coffer", +"cofferdam", +"cofferer", +"cofferfish", +"coffering", +"cofferlike", +"cofferwork", +"coffin", +"coffinless", +"coffinmaker", +"coffinmaking", +"coffle", +"coffret", +"cofighter", +"coforeknown", +"coformulator", +"cofounder", +"cofoundress", +"cofreighter", +"coft", +"cofunction", +"cog", +"cogence", +"cogency", +"cogener", +"cogeneric", +"cogent", +"cogently", +"cogged", +"cogger", +"coggie", +"cogging", +"coggle", +"coggledy", +"cogglety", +"coggly", +"coghle", +"cogitability", +"cogitable", +"cogitabund", +"cogitabundity", +"cogitabundly", +"cogitabundous", +"cogitant", +"cogitantly", +"cogitate", +"cogitatingly", +"cogitation", +"cogitative", +"cogitatively", +"cogitativeness", +"cogitativity", +"cogitator", +"coglorify", +"coglorious", +"cogman", +"cognac", +"cognate", +"cognateness", +"cognatic", +"cognatical", +"cognation", +"cognisable", +"cognisance", +"cognition", +"cognitional", +"cognitive", +"cognitively", +"cognitum", +"cognizability", +"cognizable", +"cognizableness", +"cognizably", +"cognizance", +"cognizant", +"cognize", +"cognizee", +"cognizer", +"cognizor", +"cognomen", +"cognominal", +"cognominate", +"cognomination", +"cognosce", +"cognoscent", +"cognoscibility", +"cognoscible", +"cognoscitive", +"cognoscitively", +"cogon", +"cogonal", +"cogovernment", +"cogovernor", +"cogracious", +"cograil", +"cogrediency", +"cogredient", +"cogroad", +"Cogswellia", +"coguarantor", +"coguardian", +"cogue", +"cogway", +"cogwheel", +"cogwood", +"cohabit", +"cohabitancy", +"cohabitant", +"cohabitation", +"coharmonious", +"coharmoniously", +"coharmonize", +"coheartedness", +"coheir", +"coheiress", +"coheirship", +"cohelper", +"cohelpership", +"Cohen", +"cohenite", +"coherald", +"cohere", +"coherence", +"coherency", +"coherent", +"coherently", +"coherer", +"coheretic", +"coheritage", +"coheritor", +"cohesibility", +"cohesible", +"cohesion", +"cohesive", +"cohesively", +"cohesiveness", +"cohibit", +"cohibition", +"cohibitive", +"cohibitor", +"coho", +"cohoba", +"cohobate", +"cohobation", +"cohobator", +"cohol", +"cohort", +"cohortation", +"cohortative", +"cohosh", +"cohune", +"cohusband", +"coidentity", +"coif", +"coifed", +"coiffure", +"coign", +"coigue", +"coil", +"coiled", +"coiler", +"coiling", +"coilsmith", +"coimmense", +"coimplicant", +"coimplicate", +"coimplore", +"coin", +"coinable", +"coinage", +"coincide", +"coincidence", +"coincidency", +"coincident", +"coincidental", +"coincidentally", +"coincidently", +"coincider", +"coinclination", +"coincline", +"coinclude", +"coincorporate", +"coindicant", +"coindicate", +"coindication", +"coindwelling", +"coiner", +"coinfeftment", +"coinfer", +"coinfinite", +"coinfinity", +"coinhabit", +"coinhabitant", +"coinhabitor", +"coinhere", +"coinherence", +"coinherent", +"coinheritance", +"coinheritor", +"coining", +"coinitial", +"coinmaker", +"coinmaking", +"coinmate", +"coinspire", +"coinstantaneity", +"coinstantaneous", +"coinstantaneously", +"coinstantaneousness", +"coinsurance", +"coinsure", +"cointense", +"cointension", +"cointensity", +"cointer", +"cointerest", +"cointersecting", +"cointise", +"Cointreau", +"coinventor", +"coinvolve", +"coiny", +"coir", +"coislander", +"coistrel", +"coistril", +"coital", +"coition", +"coiture", +"coitus", +"Coix", +"cojudge", +"cojuror", +"cojusticiar", +"coke", +"cokelike", +"cokeman", +"coker", +"cokernut", +"cokery", +"coking", +"coky", +"col", +"Cola", +"cola", +"colaborer", +"Colada", +"colalgia", +"Colan", +"colander", +"colane", +"colarin", +"colate", +"colation", +"colatitude", +"colatorium", +"colature", +"colauxe", +"colback", +"colberter", +"colbertine", +"Colbertism", +"colcannon", +"Colchian", +"Colchicaceae", +"colchicine", +"Colchicum", +"Colchis", +"colchyte", +"Colcine", +"colcothar", +"cold", +"colder", +"coldfinch", +"coldhearted", +"coldheartedly", +"coldheartedness", +"coldish", +"coldly", +"coldness", +"coldproof", +"coldslaw", +"cole", +"coleader", +"colecannon", +"colectomy", +"colegatee", +"colegislator", +"colemanite", +"colemouse", +"Coleochaetaceae", +"coleochaetaceous", +"Coleochaete", +"Coleophora", +"Coleophoridae", +"coleopter", +"Coleoptera", +"coleopteral", +"coleopteran", +"coleopterist", +"coleopteroid", +"coleopterological", +"coleopterology", +"coleopteron", +"coleopterous", +"coleoptile", +"coleoptilum", +"coleorhiza", +"Coleosporiaceae", +"Coleosporium", +"coleplant", +"coleseed", +"coleslaw", +"colessee", +"colessor", +"coletit", +"coleur", +"Coleus", +"colewort", +"coli", +"Colias", +"colibacillosis", +"colibacterin", +"colibri", +"colic", +"colical", +"colichemarde", +"colicky", +"colicolitis", +"colicroot", +"colicweed", +"colicwort", +"colicystitis", +"colicystopyelitis", +"coliform", +"Coliidae", +"Coliiformes", +"colilysin", +"Colima", +"colima", +"colin", +"colinear", +"colinephritis", +"coling", +"Colinus", +"coliplication", +"colipuncture", +"colipyelitis", +"colipyuria", +"colisepsis", +"Coliseum", +"coliseum", +"colitic", +"colitis", +"colitoxemia", +"coliuria", +"Colius", +"colk", +"coll", +"Colla", +"collaborate", +"collaboration", +"collaborationism", +"collaborationist", +"collaborative", +"collaboratively", +"collaborator", +"collage", +"collagen", +"collagenic", +"collagenous", +"collapse", +"collapsibility", +"collapsible", +"collar", +"collarband", +"collarbird", +"collarbone", +"collard", +"collare", +"collared", +"collaret", +"collarino", +"collarless", +"collarman", +"collatable", +"collate", +"collatee", +"collateral", +"collaterality", +"collaterally", +"collateralness", +"collation", +"collationer", +"collatitious", +"collative", +"collator", +"collatress", +"collaud", +"collaudation", +"colleague", +"colleagueship", +"collect", +"collectability", +"collectable", +"collectanea", +"collectarium", +"collected", +"collectedly", +"collectedness", +"collectibility", +"collectible", +"collection", +"collectional", +"collectioner", +"collective", +"collectively", +"collectiveness", +"collectivism", +"collectivist", +"collectivistic", +"collectivistically", +"collectivity", +"collectivization", +"collectivize", +"collector", +"collectorate", +"collectorship", +"collectress", +"colleen", +"collegatary", +"college", +"colleger", +"collegial", +"collegialism", +"collegiality", +"collegian", +"collegianer", +"Collegiant", +"collegiate", +"collegiately", +"collegiateness", +"collegiation", +"collegium", +"Collembola", +"collembolan", +"collembole", +"collembolic", +"collembolous", +"collenchyma", +"collenchymatic", +"collenchymatous", +"collenchyme", +"collencytal", +"collencyte", +"Colleri", +"Colleries", +"Collery", +"collery", +"collet", +"colleter", +"colleterial", +"colleterium", +"Colletes", +"Colletia", +"colletic", +"Colletidae", +"colletin", +"Colletotrichum", +"colletside", +"colley", +"collibert", +"colliculate", +"colliculus", +"collide", +"collidine", +"collie", +"collied", +"collier", +"colliery", +"collieshangie", +"colliform", +"colligate", +"colligation", +"colligative", +"colligible", +"collimate", +"collimation", +"collimator", +"collin", +"collinal", +"colline", +"collinear", +"collinearity", +"collinearly", +"collineate", +"collineation", +"colling", +"collingly", +"collingual", +"Collins", +"collins", +"Collinsia", +"collinsite", +"Collinsonia", +"colliquate", +"colliquation", +"colliquative", +"colliquativeness", +"collision", +"collisional", +"collisive", +"colloblast", +"collobrierite", +"collocal", +"Collocalia", +"collocate", +"collocation", +"collocationable", +"collocative", +"collocatory", +"collochemistry", +"collochromate", +"collock", +"collocution", +"collocutor", +"collocutory", +"collodiochloride", +"collodion", +"collodionization", +"collodionize", +"collodiotype", +"collodium", +"collogue", +"colloid", +"colloidal", +"colloidality", +"colloidize", +"colloidochemical", +"Collomia", +"collop", +"colloped", +"collophanite", +"collophore", +"colloque", +"colloquia", +"colloquial", +"colloquialism", +"colloquialist", +"colloquiality", +"colloquialize", +"colloquially", +"colloquialness", +"colloquist", +"colloquium", +"colloquize", +"colloquy", +"collothun", +"collotype", +"collotypic", +"collotypy", +"colloxylin", +"colluctation", +"collude", +"colluder", +"collum", +"collumelliaceous", +"collusion", +"collusive", +"collusively", +"collusiveness", +"collutorium", +"collutory", +"colluvial", +"colluvies", +"colly", +"collyba", +"Collybia", +"Collyridian", +"collyrite", +"collyrium", +"collywest", +"collyweston", +"collywobbles", +"colmar", +"colobin", +"colobium", +"coloboma", +"Colobus", +"Colocasia", +"colocentesis", +"Colocephali", +"colocephalous", +"coloclysis", +"colocola", +"colocolic", +"colocynth", +"colocynthin", +"colodyspepsia", +"coloenteritis", +"cologarithm", +"Cologne", +"cololite", +"Colombian", +"colombier", +"colombin", +"Colombina", +"colometric", +"colometrically", +"colometry", +"colon", +"colonalgia", +"colonate", +"colonel", +"colonelcy", +"colonelship", +"colongitude", +"colonial", +"colonialism", +"colonialist", +"colonialize", +"colonially", +"colonialness", +"colonic", +"colonist", +"colonitis", +"colonizability", +"colonizable", +"colonization", +"colonizationist", +"colonize", +"colonizer", +"colonnade", +"colonnaded", +"colonnette", +"colonopathy", +"colonopexy", +"colonoscope", +"colonoscopy", +"colony", +"colopexia", +"colopexotomy", +"colopexy", +"colophane", +"colophany", +"colophene", +"colophenic", +"colophon", +"colophonate", +"Colophonian", +"colophonic", +"colophonist", +"colophonite", +"colophonium", +"colophony", +"coloplication", +"coloproctitis", +"coloptosis", +"colopuncture", +"coloquintid", +"coloquintida", +"color", +"colorability", +"colorable", +"colorableness", +"colorably", +"Coloradan", +"Colorado", +"colorado", +"coloradoite", +"colorant", +"colorate", +"coloration", +"colorational", +"colorationally", +"colorative", +"coloratura", +"colorature", +"colorcast", +"colorectitis", +"colorectostomy", +"colored", +"colorer", +"colorfast", +"colorful", +"colorfully", +"colorfulness", +"colorific", +"colorifics", +"colorimeter", +"colorimetric", +"colorimetrical", +"colorimetrically", +"colorimetrics", +"colorimetrist", +"colorimetry", +"colorin", +"coloring", +"colorist", +"coloristic", +"colorization", +"colorize", +"colorless", +"colorlessly", +"colorlessness", +"colormaker", +"colormaking", +"colorman", +"colorrhaphy", +"colors", +"colortype", +"Colorum", +"colory", +"coloss", +"colossal", +"colossality", +"colossally", +"colossean", +"Colosseum", +"colossi", +"Colossian", +"Colossochelys", +"colossus", +"Colossuswise", +"colostomy", +"colostral", +"colostration", +"colostric", +"colostrous", +"colostrum", +"colotomy", +"colotyphoid", +"colove", +"colp", +"colpenchyma", +"colpeo", +"colpeurynter", +"colpeurysis", +"colpindach", +"colpitis", +"colpocele", +"colpocystocele", +"colpohyperplasia", +"colpohysterotomy", +"colpoperineoplasty", +"colpoperineorrhaphy", +"colpoplastic", +"colpoplasty", +"colpoptosis", +"colporrhagia", +"colporrhaphy", +"colporrhea", +"colporrhexis", +"colport", +"colportage", +"colporter", +"colporteur", +"colposcope", +"colposcopy", +"colpotomy", +"colpus", +"Colt", +"colt", +"colter", +"colthood", +"coltish", +"coltishly", +"coltishness", +"coltpixie", +"coltpixy", +"coltsfoot", +"coltskin", +"Coluber", +"colubrid", +"Colubridae", +"colubriform", +"Colubriformes", +"Colubriformia", +"Colubrina", +"Colubrinae", +"colubrine", +"colubroid", +"colugo", +"Columba", +"columbaceous", +"Columbae", +"Columban", +"Columbanian", +"columbarium", +"columbary", +"columbate", +"columbeion", +"Columbella", +"Columbia", +"columbiad", +"Columbian", +"columbic", +"Columbid", +"Columbidae", +"columbier", +"columbiferous", +"Columbiformes", +"columbin", +"Columbine", +"columbine", +"columbite", +"columbium", +"columbo", +"columboid", +"columbotantalate", +"columbotitanate", +"columella", +"columellar", +"columellate", +"Columellia", +"Columelliaceae", +"columelliform", +"column", +"columnal", +"columnar", +"columnarian", +"columnarity", +"columnated", +"columned", +"columner", +"columniation", +"columniferous", +"columniform", +"columning", +"columnist", +"columnization", +"columnwise", +"colunar", +"colure", +"Colutea", +"Colville", +"coly", +"Colymbidae", +"colymbiform", +"colymbion", +"Colymbriformes", +"Colymbus", +"colyone", +"colyonic", +"colytic", +"colyum", +"colyumist", +"colza", +"coma", +"comacine", +"comagistracy", +"comagmatic", +"comaker", +"comal", +"comamie", +"Coman", +"Comanche", +"Comanchean", +"Comandra", +"comanic", +"comart", +"Comarum", +"comate", +"comatose", +"comatosely", +"comatoseness", +"comatosity", +"comatous", +"comatula", +"comatulid", +"comb", +"combaron", +"combat", +"combatable", +"combatant", +"combater", +"combative", +"combatively", +"combativeness", +"combativity", +"combed", +"comber", +"combfish", +"combflower", +"combinable", +"combinableness", +"combinant", +"combinantive", +"combinate", +"combination", +"combinational", +"combinative", +"combinator", +"combinatorial", +"combinatory", +"combine", +"combined", +"combinedly", +"combinedness", +"combinement", +"combiner", +"combing", +"combining", +"comble", +"combless", +"comblessness", +"combmaker", +"combmaking", +"comboloio", +"comboy", +"Combretaceae", +"combretaceous", +"Combretum", +"combure", +"comburendo", +"comburent", +"comburgess", +"comburimeter", +"comburimetry", +"comburivorous", +"combust", +"combustibility", +"combustible", +"combustibleness", +"combustibly", +"combustion", +"combustive", +"combustor", +"combwise", +"combwright", +"comby", +"come", +"comeback", +"Comecrudo", +"comedial", +"comedian", +"comediant", +"comedic", +"comedical", +"comedienne", +"comedietta", +"comedist", +"comedo", +"comedown", +"comedy", +"comelily", +"comeliness", +"comeling", +"comely", +"comendite", +"comenic", +"comephorous", +"comer", +"comes", +"comestible", +"comet", +"cometarium", +"cometary", +"comether", +"cometic", +"cometical", +"cometlike", +"cometographer", +"cometographical", +"cometography", +"cometoid", +"cometology", +"cometwise", +"comeuppance", +"comfit", +"comfiture", +"comfort", +"comfortable", +"comfortableness", +"comfortably", +"comforter", +"comfortful", +"comforting", +"comfortingly", +"comfortless", +"comfortlessly", +"comfortlessness", +"comfortress", +"comfortroot", +"comfrey", +"comfy", +"Comiakin", +"comic", +"comical", +"comicality", +"comically", +"comicalness", +"comicocratic", +"comicocynical", +"comicodidactic", +"comicography", +"comicoprosaic", +"comicotragedy", +"comicotragic", +"comicotragical", +"comicry", +"Comid", +"comiferous", +"Cominform", +"coming", +"comingle", +"comino", +"Comintern", +"comism", +"comital", +"comitant", +"comitatensian", +"comitative", +"comitatus", +"comitia", +"comitial", +"Comitium", +"comitragedy", +"comity", +"comma", +"command", +"commandable", +"commandant", +"commandedness", +"commandeer", +"commander", +"commandership", +"commandery", +"commanding", +"commandingly", +"commandingness", +"commandless", +"commandment", +"commando", +"commandoman", +"commandress", +"commassation", +"commassee", +"commatic", +"commation", +"commatism", +"commeasurable", +"commeasure", +"commeddle", +"Commelina", +"Commelinaceae", +"commelinaceous", +"commemorable", +"commemorate", +"commemoration", +"commemorational", +"commemorative", +"commemoratively", +"commemorativeness", +"commemorator", +"commemoratory", +"commemorize", +"commence", +"commenceable", +"commencement", +"commencer", +"commend", +"commendable", +"commendableness", +"commendably", +"commendador", +"commendam", +"commendatary", +"commendation", +"commendator", +"commendatory", +"commender", +"commendingly", +"commendment", +"commensal", +"commensalism", +"commensalist", +"commensalistic", +"commensality", +"commensally", +"commensurability", +"commensurable", +"commensurableness", +"commensurably", +"commensurate", +"commensurately", +"commensurateness", +"commensuration", +"comment", +"commentarial", +"commentarialism", +"commentary", +"commentate", +"commentation", +"commentator", +"commentatorial", +"commentatorially", +"commentatorship", +"commenter", +"commerce", +"commerceless", +"commercer", +"commerciable", +"commercial", +"commercialism", +"commercialist", +"commercialistic", +"commerciality", +"commercialization", +"commercialize", +"commercially", +"commercium", +"commerge", +"commie", +"comminate", +"commination", +"comminative", +"comminator", +"comminatory", +"commingle", +"comminglement", +"commingler", +"comminister", +"comminuate", +"comminute", +"comminution", +"comminutor", +"Commiphora", +"commiserable", +"commiserate", +"commiseratingly", +"commiseration", +"commiserative", +"commiseratively", +"commiserator", +"commissar", +"commissarial", +"commissariat", +"commissary", +"commissaryship", +"commission", +"commissionaire", +"commissional", +"commissionate", +"commissioner", +"commissionership", +"commissionship", +"commissive", +"commissively", +"commissural", +"commissure", +"commissurotomy", +"commit", +"commitment", +"committable", +"committal", +"committee", +"committeeism", +"committeeman", +"committeeship", +"committeewoman", +"committent", +"committer", +"committible", +"committor", +"commix", +"commixt", +"commixtion", +"commixture", +"commodatary", +"commodate", +"commodation", +"commodatum", +"commode", +"commodious", +"commodiously", +"commodiousness", +"commoditable", +"commodity", +"commodore", +"common", +"commonable", +"commonage", +"commonality", +"commonalty", +"commoner", +"commonership", +"commoney", +"commonish", +"commonition", +"commonize", +"commonly", +"commonness", +"commonplace", +"commonplaceism", +"commonplacely", +"commonplaceness", +"commonplacer", +"commons", +"commonsensible", +"commonsensibly", +"commonsensical", +"commonsensically", +"commonty", +"commonweal", +"commonwealth", +"commonwealthism", +"commorancy", +"commorant", +"commorient", +"commorth", +"commot", +"commotion", +"commotional", +"commotive", +"commove", +"communa", +"communal", +"communalism", +"communalist", +"communalistic", +"communality", +"communalization", +"communalize", +"communalizer", +"communally", +"communard", +"commune", +"communer", +"communicability", +"communicable", +"communicableness", +"communicably", +"communicant", +"communicate", +"communicatee", +"communicating", +"communication", +"communicative", +"communicatively", +"communicativeness", +"communicator", +"communicatory", +"communion", +"communionist", +"communique", +"communism", +"communist", +"communistery", +"communistic", +"communistically", +"communital", +"communitarian", +"communitary", +"communitive", +"communitorium", +"community", +"communization", +"communize", +"commutability", +"commutable", +"commutableness", +"commutant", +"commutate", +"commutation", +"commutative", +"commutatively", +"commutator", +"commute", +"commuter", +"commuting", +"commutual", +"commutuality", +"Comnenian", +"comoid", +"comolecule", +"comortgagee", +"comose", +"comourn", +"comourner", +"comournful", +"comous", +"Comox", +"compact", +"compacted", +"compactedly", +"compactedness", +"compacter", +"compactible", +"compaction", +"compactly", +"compactness", +"compactor", +"compacture", +"compages", +"compaginate", +"compagination", +"companator", +"companion", +"companionability", +"companionable", +"companionableness", +"companionably", +"companionage", +"companionate", +"companionize", +"companionless", +"companionship", +"companionway", +"company", +"comparability", +"comparable", +"comparableness", +"comparably", +"comparascope", +"comparate", +"comparatival", +"comparative", +"comparatively", +"comparativeness", +"comparativist", +"comparator", +"compare", +"comparer", +"comparison", +"comparition", +"comparograph", +"compart", +"compartition", +"compartment", +"compartmental", +"compartmentalization", +"compartmentalize", +"compartmentally", +"compartmentize", +"compass", +"compassable", +"compasser", +"compasses", +"compassing", +"compassion", +"compassionable", +"compassionate", +"compassionately", +"compassionateness", +"compassionless", +"compassive", +"compassivity", +"compassless", +"compaternity", +"compatibility", +"compatible", +"compatibleness", +"compatibly", +"compatriot", +"compatriotic", +"compatriotism", +"compear", +"compearance", +"compearant", +"compeer", +"compel", +"compellable", +"compellably", +"compellation", +"compellative", +"compellent", +"compeller", +"compelling", +"compellingly", +"compend", +"compendency", +"compendent", +"compendia", +"compendiary", +"compendiate", +"compendious", +"compendiously", +"compendiousness", +"compendium", +"compenetrate", +"compenetration", +"compensable", +"compensate", +"compensating", +"compensatingly", +"compensation", +"compensational", +"compensative", +"compensativeness", +"compensator", +"compensatory", +"compense", +"compenser", +"compesce", +"compete", +"competence", +"competency", +"competent", +"competently", +"competentness", +"competition", +"competitioner", +"competitive", +"competitively", +"competitiveness", +"competitor", +"competitorship", +"competitory", +"competitress", +"competitrix", +"compilation", +"compilator", +"compilatory", +"compile", +"compilement", +"compiler", +"compital", +"Compitalia", +"compitum", +"complacence", +"complacency", +"complacent", +"complacential", +"complacentially", +"complacently", +"complain", +"complainable", +"complainant", +"complainer", +"complainingly", +"complainingness", +"complaint", +"complaintive", +"complaintiveness", +"complaisance", +"complaisant", +"complaisantly", +"complaisantness", +"complanar", +"complanate", +"complanation", +"complect", +"complected", +"complement", +"complemental", +"complementally", +"complementalness", +"complementariness", +"complementarism", +"complementary", +"complementation", +"complementative", +"complementer", +"complementoid", +"complete", +"completedness", +"completely", +"completement", +"completeness", +"completer", +"completion", +"completive", +"completively", +"completory", +"complex", +"complexedness", +"complexification", +"complexify", +"complexion", +"complexionably", +"complexional", +"complexionally", +"complexioned", +"complexionist", +"complexionless", +"complexity", +"complexively", +"complexly", +"complexness", +"complexus", +"compliable", +"compliableness", +"compliably", +"compliance", +"compliancy", +"compliant", +"compliantly", +"complicacy", +"complicant", +"complicate", +"complicated", +"complicatedly", +"complicatedness", +"complication", +"complicative", +"complice", +"complicitous", +"complicity", +"complier", +"compliment", +"complimentable", +"complimental", +"complimentally", +"complimentalness", +"complimentarily", +"complimentariness", +"complimentary", +"complimentation", +"complimentative", +"complimenter", +"complimentingly", +"complin", +"complot", +"complotter", +"Complutensian", +"compluvium", +"comply", +"compo", +"compoer", +"compole", +"compone", +"componed", +"componency", +"componendo", +"component", +"componental", +"componented", +"compony", +"comport", +"comportment", +"compos", +"compose", +"composed", +"composedly", +"composedness", +"composer", +"composita", +"Compositae", +"composite", +"compositely", +"compositeness", +"composition", +"compositional", +"compositionally", +"compositive", +"compositively", +"compositor", +"compositorial", +"compositous", +"composograph", +"compossibility", +"compossible", +"compost", +"composture", +"composure", +"compotation", +"compotationship", +"compotator", +"compotatory", +"compote", +"compotor", +"compound", +"compoundable", +"compoundedness", +"compounder", +"compounding", +"compoundness", +"comprachico", +"comprador", +"comprecation", +"compreg", +"compregnate", +"comprehend", +"comprehender", +"comprehendible", +"comprehendingly", +"comprehense", +"comprehensibility", +"comprehensible", +"comprehensibleness", +"comprehensibly", +"comprehension", +"comprehensive", +"comprehensively", +"comprehensiveness", +"comprehensor", +"compresbyter", +"compresbyterial", +"compresence", +"compresent", +"compress", +"compressed", +"compressedly", +"compressibility", +"compressible", +"compressibleness", +"compressingly", +"compression", +"compressional", +"compressive", +"compressively", +"compressometer", +"compressor", +"compressure", +"comprest", +"compriest", +"comprisable", +"comprisal", +"comprise", +"comprised", +"compromise", +"compromiser", +"compromising", +"compromisingly", +"compromissary", +"compromission", +"compromissorial", +"compromit", +"compromitment", +"comprovincial", +"Compsilura", +"Compsoa", +"Compsognathus", +"Compsothlypidae", +"compter", +"Comptometer", +"Comptonia", +"comptroller", +"comptrollership", +"compulsative", +"compulsatively", +"compulsatorily", +"compulsatory", +"compulsed", +"compulsion", +"compulsitor", +"compulsive", +"compulsively", +"compulsiveness", +"compulsorily", +"compulsoriness", +"compulsory", +"compunction", +"compunctionary", +"compunctionless", +"compunctious", +"compunctiously", +"compunctive", +"compurgation", +"compurgator", +"compurgatorial", +"compurgatory", +"compursion", +"computability", +"computable", +"computably", +"computation", +"computational", +"computative", +"computativeness", +"compute", +"computer", +"computist", +"computus", +"comrade", +"comradely", +"comradery", +"comradeship", +"Comsomol", +"comstockery", +"Comtian", +"Comtism", +"Comtist", +"comurmurer", +"Comus", +"con", +"conacaste", +"conacre", +"conal", +"conalbumin", +"conamed", +"Conant", +"conarial", +"conarium", +"conation", +"conational", +"conationalistic", +"conative", +"conatus", +"conaxial", +"concamerate", +"concamerated", +"concameration", +"concanavalin", +"concaptive", +"concassation", +"concatenary", +"concatenate", +"concatenation", +"concatenator", +"concausal", +"concause", +"concavation", +"concave", +"concavely", +"concaveness", +"concaver", +"concavity", +"conceal", +"concealable", +"concealed", +"concealedly", +"concealedness", +"concealer", +"concealment", +"concede", +"conceded", +"concededly", +"conceder", +"conceit", +"conceited", +"conceitedly", +"conceitedness", +"conceitless", +"conceity", +"conceivability", +"conceivable", +"conceivableness", +"conceivably", +"conceive", +"conceiver", +"concelebrate", +"concelebration", +"concent", +"concenter", +"concentive", +"concentralization", +"concentrate", +"concentrated", +"concentration", +"concentrative", +"concentrativeness", +"concentrator", +"concentric", +"concentrically", +"concentricity", +"concentual", +"concentus", +"concept", +"conceptacle", +"conceptacular", +"conceptaculum", +"conception", +"conceptional", +"conceptionist", +"conceptism", +"conceptive", +"conceptiveness", +"conceptual", +"conceptualism", +"conceptualist", +"conceptualistic", +"conceptuality", +"conceptualization", +"conceptualize", +"conceptually", +"conceptus", +"concern", +"concerned", +"concernedly", +"concernedness", +"concerning", +"concerningly", +"concerningness", +"concernment", +"concert", +"concerted", +"concertedly", +"concertgoer", +"concertina", +"concertinist", +"concertist", +"concertize", +"concertizer", +"concertmaster", +"concertmeister", +"concertment", +"concerto", +"concertstuck", +"concessible", +"concession", +"concessionaire", +"concessional", +"concessionary", +"concessioner", +"concessionist", +"concessive", +"concessively", +"concessiveness", +"concessor", +"concettism", +"concettist", +"conch", +"concha", +"conchal", +"conchate", +"conche", +"conched", +"concher", +"Conchifera", +"conchiferous", +"conchiform", +"conchinine", +"conchiolin", +"conchitic", +"conchitis", +"Conchobor", +"conchoid", +"conchoidal", +"conchoidally", +"conchological", +"conchologically", +"conchologist", +"conchologize", +"conchology", +"conchometer", +"conchometry", +"Conchostraca", +"conchotome", +"Conchubar", +"Conchucu", +"conchuela", +"conchy", +"conchyliated", +"conchyliferous", +"conchylium", +"concierge", +"concile", +"conciliable", +"conciliabule", +"conciliabulum", +"conciliar", +"conciliate", +"conciliating", +"conciliatingly", +"conciliation", +"conciliationist", +"conciliative", +"conciliator", +"conciliatorily", +"conciliatoriness", +"conciliatory", +"concilium", +"concinnity", +"concinnous", +"concionator", +"concipiency", +"concipient", +"concise", +"concisely", +"conciseness", +"concision", +"conclamant", +"conclamation", +"conclave", +"conclavist", +"concludable", +"conclude", +"concluder", +"concluding", +"concludingly", +"conclusion", +"conclusional", +"conclusionally", +"conclusive", +"conclusively", +"conclusiveness", +"conclusory", +"concoagulate", +"concoagulation", +"concoct", +"concocter", +"concoction", +"concoctive", +"concoctor", +"concolor", +"concolorous", +"concomitance", +"concomitancy", +"concomitant", +"concomitantly", +"conconscious", +"Concord", +"concord", +"concordal", +"concordance", +"concordancer", +"concordant", +"concordantial", +"concordantly", +"concordat", +"concordatory", +"concorder", +"concordial", +"concordist", +"concordity", +"concorporate", +"Concorrezanes", +"concourse", +"concreate", +"concremation", +"concrement", +"concresce", +"concrescence", +"concrescible", +"concrescive", +"concrete", +"concretely", +"concreteness", +"concreter", +"concretion", +"concretional", +"concretionary", +"concretism", +"concretive", +"concretively", +"concretize", +"concretor", +"concubinage", +"concubinal", +"concubinarian", +"concubinary", +"concubinate", +"concubine", +"concubinehood", +"concubitancy", +"concubitant", +"concubitous", +"concubitus", +"concupiscence", +"concupiscent", +"concupiscible", +"concupiscibleness", +"concupy", +"concur", +"concurrence", +"concurrency", +"concurrent", +"concurrently", +"concurrentness", +"concurring", +"concurringly", +"concursion", +"concurso", +"concursus", +"concuss", +"concussant", +"concussion", +"concussional", +"concussive", +"concutient", +"concyclic", +"concyclically", +"cond", +"Condalia", +"condemn", +"condemnable", +"condemnably", +"condemnate", +"condemnation", +"condemnatory", +"condemned", +"condemner", +"condemning", +"condemningly", +"condensability", +"condensable", +"condensance", +"condensary", +"condensate", +"condensation", +"condensational", +"condensative", +"condensator", +"condense", +"condensed", +"condensedly", +"condensedness", +"condenser", +"condensery", +"condensity", +"condescend", +"condescendence", +"condescendent", +"condescender", +"condescending", +"condescendingly", +"condescendingness", +"condescension", +"condescensive", +"condescensively", +"condescensiveness", +"condiction", +"condictious", +"condiddle", +"condiddlement", +"condign", +"condigness", +"condignity", +"condignly", +"condiment", +"condimental", +"condimentary", +"condisciple", +"condistillation", +"condite", +"condition", +"conditional", +"conditionalism", +"conditionalist", +"conditionality", +"conditionalize", +"conditionally", +"conditionate", +"conditioned", +"conditioner", +"condivision", +"condolatory", +"condole", +"condolement", +"condolence", +"condolent", +"condoler", +"condoling", +"condolingly", +"condominate", +"condominium", +"condonable", +"condonance", +"condonation", +"condonative", +"condone", +"condonement", +"condoner", +"condor", +"conduce", +"conducer", +"conducing", +"conducingly", +"conducive", +"conduciveness", +"conduct", +"conductance", +"conductibility", +"conductible", +"conductility", +"conductimeter", +"conductio", +"conduction", +"conductional", +"conductitious", +"conductive", +"conductively", +"conductivity", +"conductometer", +"conductometric", +"conductor", +"conductorial", +"conductorless", +"conductorship", +"conductory", +"conductress", +"conductus", +"conduit", +"conduplicate", +"conduplicated", +"conduplication", +"condurangin", +"condurango", +"condylar", +"condylarth", +"Condylarthra", +"condylarthrosis", +"condylarthrous", +"condyle", +"condylectomy", +"condylion", +"condyloid", +"condyloma", +"condylomatous", +"condylome", +"condylopod", +"Condylopoda", +"condylopodous", +"condylos", +"condylotomy", +"Condylura", +"condylure", +"cone", +"coned", +"coneen", +"coneflower", +"conehead", +"coneighboring", +"coneine", +"conelet", +"conemaker", +"conemaking", +"Conemaugh", +"conenose", +"conepate", +"coner", +"cones", +"conessine", +"Conestoga", +"confab", +"confabular", +"confabulate", +"confabulation", +"confabulator", +"confabulatory", +"confact", +"confarreate", +"confarreation", +"confated", +"confect", +"confection", +"confectionary", +"confectioner", +"confectionery", +"Confed", +"confederacy", +"confederal", +"confederalist", +"confederate", +"confederater", +"confederatio", +"confederation", +"confederationist", +"confederatism", +"confederative", +"confederatize", +"confederator", +"confelicity", +"conferee", +"conference", +"conferential", +"conferment", +"conferrable", +"conferral", +"conferrer", +"conferruminate", +"conferted", +"Conferva", +"Confervaceae", +"confervaceous", +"conferval", +"Confervales", +"confervoid", +"Confervoideae", +"confervous", +"confess", +"confessable", +"confessant", +"confessarius", +"confessary", +"confessedly", +"confesser", +"confessing", +"confessingly", +"confession", +"confessional", +"confessionalian", +"confessionalism", +"confessionalist", +"confessionary", +"confessionist", +"confessor", +"confessorship", +"confessory", +"confidant", +"confide", +"confidence", +"confidency", +"confident", +"confidential", +"confidentiality", +"confidentially", +"confidentialness", +"confidentiary", +"confidently", +"confidentness", +"confider", +"confiding", +"confidingly", +"confidingness", +"configural", +"configurate", +"configuration", +"configurational", +"configurationally", +"configurationism", +"configurationist", +"configurative", +"configure", +"confinable", +"confine", +"confineable", +"confined", +"confinedly", +"confinedness", +"confineless", +"confinement", +"confiner", +"confining", +"confinity", +"confirm", +"confirmable", +"confirmand", +"confirmation", +"confirmative", +"confirmatively", +"confirmatorily", +"confirmatory", +"confirmed", +"confirmedly", +"confirmedness", +"confirmee", +"confirmer", +"confirming", +"confirmingly", +"confirmity", +"confirmment", +"confirmor", +"confiscable", +"confiscatable", +"confiscate", +"confiscation", +"confiscator", +"confiscatory", +"confitent", +"confiteor", +"confiture", +"confix", +"conflagrant", +"conflagrate", +"conflagration", +"conflagrative", +"conflagrator", +"conflagratory", +"conflate", +"conflated", +"conflation", +"conflict", +"conflicting", +"conflictingly", +"confliction", +"conflictive", +"conflictory", +"conflow", +"confluence", +"confluent", +"confluently", +"conflux", +"confluxibility", +"confluxible", +"confluxibleness", +"confocal", +"conform", +"conformability", +"conformable", +"conformableness", +"conformably", +"conformal", +"conformance", +"conformant", +"conformate", +"conformation", +"conformator", +"conformer", +"conformist", +"conformity", +"confound", +"confoundable", +"confounded", +"confoundedly", +"confoundedness", +"confounder", +"confounding", +"confoundingly", +"confrater", +"confraternal", +"confraternity", +"confraternization", +"confrere", +"confriar", +"confrication", +"confront", +"confrontal", +"confrontation", +"confronte", +"confronter", +"confrontment", +"Confucian", +"Confucianism", +"Confucianist", +"confusability", +"confusable", +"confusably", +"confuse", +"confused", +"confusedly", +"confusedness", +"confusingly", +"confusion", +"confusional", +"confusticate", +"confustication", +"confutable", +"confutation", +"confutative", +"confutator", +"confute", +"confuter", +"conga", +"congeable", +"congeal", +"congealability", +"congealable", +"congealableness", +"congealedness", +"congealer", +"congealment", +"congee", +"congelation", +"congelative", +"congelifraction", +"congeliturbate", +"congeliturbation", +"congener", +"congeneracy", +"congeneric", +"congenerical", +"congenerous", +"congenerousness", +"congenetic", +"congenial", +"congeniality", +"congenialize", +"congenially", +"congenialness", +"congenital", +"congenitally", +"congenitalness", +"conger", +"congeree", +"congest", +"congested", +"congestible", +"congestion", +"congestive", +"congiary", +"congius", +"conglobate", +"conglobately", +"conglobation", +"conglobe", +"conglobulate", +"conglomerate", +"conglomeratic", +"conglomeration", +"conglutin", +"conglutinant", +"conglutinate", +"conglutination", +"conglutinative", +"Congo", +"Congoese", +"Congolese", +"Congoleum", +"congou", +"congratulable", +"congratulant", +"congratulate", +"congratulation", +"congratulational", +"congratulator", +"congratulatory", +"congredient", +"congreet", +"congregable", +"congreganist", +"congregant", +"congregate", +"congregation", +"congregational", +"congregationalism", +"Congregationalist", +"congregationalize", +"congregationally", +"Congregationer", +"congregationist", +"congregative", +"congregativeness", +"congregator", +"Congreso", +"congress", +"congresser", +"congressional", +"congressionalist", +"congressionally", +"congressionist", +"congressist", +"congressive", +"congressman", +"Congresso", +"congresswoman", +"Congreve", +"Congridae", +"congroid", +"congruence", +"congruency", +"congruent", +"congruential", +"congruently", +"congruism", +"congruist", +"congruistic", +"congruity", +"congruous", +"congruously", +"congruousness", +"conhydrine", +"Coniacian", +"conic", +"conical", +"conicality", +"conically", +"conicalness", +"coniceine", +"conichalcite", +"conicine", +"conicity", +"conicle", +"conicoid", +"conicopoly", +"conics", +"Conidae", +"conidia", +"conidial", +"conidian", +"conidiiferous", +"conidioid", +"conidiophore", +"conidiophorous", +"conidiospore", +"conidium", +"conifer", +"Coniferae", +"coniferin", +"coniferophyte", +"coniferous", +"conification", +"coniform", +"Conilurus", +"conima", +"conimene", +"conin", +"conine", +"Coniogramme", +"Coniophora", +"Coniopterygidae", +"Conioselinum", +"coniosis", +"Coniothyrium", +"coniroster", +"conirostral", +"Conirostres", +"Conium", +"conject", +"conjective", +"conjecturable", +"conjecturably", +"conjectural", +"conjecturalist", +"conjecturality", +"conjecturally", +"conjecture", +"conjecturer", +"conjobble", +"conjoin", +"conjoined", +"conjoinedly", +"conjoiner", +"conjoint", +"conjointly", +"conjointment", +"conjointness", +"conjubilant", +"conjugable", +"conjugacy", +"conjugal", +"Conjugales", +"conjugality", +"conjugally", +"conjugant", +"conjugata", +"Conjugatae", +"conjugate", +"conjugated", +"conjugately", +"conjugateness", +"conjugation", +"conjugational", +"conjugationally", +"conjugative", +"conjugator", +"conjugial", +"conjugium", +"conjunct", +"conjunction", +"conjunctional", +"conjunctionally", +"conjunctiva", +"conjunctival", +"conjunctive", +"conjunctively", +"conjunctiveness", +"conjunctivitis", +"conjunctly", +"conjunctur", +"conjunctural", +"conjuncture", +"conjuration", +"conjurator", +"conjure", +"conjurement", +"conjurer", +"conjurership", +"conjuror", +"conjury", +"conk", +"conkanee", +"conker", +"conkers", +"conky", +"conn", +"connach", +"Connaraceae", +"connaraceous", +"connarite", +"Connarus", +"connascency", +"connascent", +"connatal", +"connate", +"connately", +"connateness", +"connation", +"connatural", +"connaturality", +"connaturalize", +"connaturally", +"connaturalness", +"connature", +"connaught", +"connect", +"connectable", +"connectant", +"connected", +"connectedly", +"connectedness", +"connectible", +"connection", +"connectional", +"connectival", +"connective", +"connectively", +"connectivity", +"connector", +"connellite", +"conner", +"connex", +"connexion", +"connexionalism", +"connexity", +"connexive", +"connexivum", +"connexus", +"Connie", +"conning", +"conniption", +"connivance", +"connivancy", +"connivant", +"connivantly", +"connive", +"connivent", +"conniver", +"Connochaetes", +"connoissance", +"connoisseur", +"connoisseurship", +"connotation", +"connotative", +"connotatively", +"connote", +"connotive", +"connotively", +"connubial", +"connubiality", +"connubially", +"connubiate", +"connubium", +"connumerate", +"connumeration", +"Conocarpus", +"Conocephalum", +"Conocephalus", +"conoclinium", +"conocuneus", +"conodont", +"conoid", +"conoidal", +"conoidally", +"conoidic", +"conoidical", +"conoidically", +"Conolophus", +"conominee", +"cononintelligent", +"Conopholis", +"conopid", +"Conopidae", +"conoplain", +"conopodium", +"Conopophaga", +"Conopophagidae", +"Conor", +"Conorhinus", +"conormal", +"conoscope", +"conourish", +"Conoy", +"conphaseolin", +"conplane", +"conquedle", +"conquer", +"conquerable", +"conquerableness", +"conqueress", +"conquering", +"conqueringly", +"conquerment", +"conqueror", +"conquest", +"conquian", +"conquinamine", +"conquinine", +"conquistador", +"Conrad", +"conrector", +"conrectorship", +"conred", +"Conringia", +"consanguine", +"consanguineal", +"consanguinean", +"consanguineous", +"consanguineously", +"consanguinity", +"conscience", +"conscienceless", +"consciencelessly", +"consciencelessness", +"consciencewise", +"conscient", +"conscientious", +"conscientiously", +"conscientiousness", +"conscionable", +"conscionableness", +"conscionably", +"conscious", +"consciously", +"consciousness", +"conscribe", +"conscript", +"conscription", +"conscriptional", +"conscriptionist", +"conscriptive", +"consecrate", +"consecrated", +"consecratedness", +"consecrater", +"consecration", +"consecrative", +"consecrator", +"consecratory", +"consectary", +"consecute", +"consecution", +"consecutive", +"consecutively", +"consecutiveness", +"consecutives", +"consenescence", +"consenescency", +"consension", +"consensual", +"consensually", +"consensus", +"consent", +"consentable", +"consentaneity", +"consentaneous", +"consentaneously", +"consentaneousness", +"consentant", +"consenter", +"consentful", +"consentfully", +"consentience", +"consentient", +"consentiently", +"consenting", +"consentingly", +"consentingness", +"consentive", +"consentively", +"consentment", +"consequence", +"consequency", +"consequent", +"consequential", +"consequentiality", +"consequentially", +"consequentialness", +"consequently", +"consertal", +"conservable", +"conservacy", +"conservancy", +"conservant", +"conservate", +"conservation", +"conservational", +"conservationist", +"conservatism", +"conservatist", +"conservative", +"conservatively", +"conservativeness", +"conservatize", +"conservatoire", +"conservator", +"conservatorio", +"conservatorium", +"conservatorship", +"conservatory", +"conservatrix", +"conserve", +"conserver", +"consider", +"considerability", +"considerable", +"considerableness", +"considerably", +"considerance", +"considerate", +"considerately", +"considerateness", +"consideration", +"considerative", +"consideratively", +"considerativeness", +"considerator", +"considered", +"considerer", +"considering", +"consideringly", +"consign", +"consignable", +"consignatary", +"consignation", +"consignatory", +"consignee", +"consigneeship", +"consigner", +"consignificant", +"consignificate", +"consignification", +"consignificative", +"consignificator", +"consignify", +"consignment", +"consignor", +"consiliary", +"consilience", +"consilient", +"consimilar", +"consimilarity", +"consimilate", +"consist", +"consistence", +"consistency", +"consistent", +"consistently", +"consistorial", +"consistorian", +"consistory", +"consociate", +"consociation", +"consociational", +"consociationism", +"consociative", +"consocies", +"consol", +"consolable", +"consolableness", +"consolably", +"Consolamentum", +"consolation", +"Consolato", +"consolatorily", +"consolatoriness", +"consolatory", +"consolatrix", +"console", +"consolement", +"consoler", +"consolidant", +"consolidate", +"consolidated", +"consolidation", +"consolidationist", +"consolidative", +"consolidator", +"consoling", +"consolingly", +"consolute", +"consomme", +"consonance", +"consonancy", +"consonant", +"consonantal", +"consonantic", +"consonantism", +"consonantize", +"consonantly", +"consonantness", +"consonate", +"consonous", +"consort", +"consortable", +"consorter", +"consortial", +"consortion", +"consortism", +"consortium", +"consortship", +"consound", +"conspecies", +"conspecific", +"conspectus", +"consperse", +"conspersion", +"conspicuity", +"conspicuous", +"conspicuously", +"conspicuousness", +"conspiracy", +"conspirant", +"conspiration", +"conspirative", +"conspirator", +"conspiratorial", +"conspiratorially", +"conspiratory", +"conspiratress", +"conspire", +"conspirer", +"conspiring", +"conspiringly", +"conspue", +"constable", +"constablery", +"constableship", +"constabless", +"constablewick", +"constabular", +"constabulary", +"Constance", +"constancy", +"constant", +"constantan", +"Constantine", +"Constantinian", +"Constantinopolitan", +"constantly", +"constantness", +"constat", +"constatation", +"constate", +"constatory", +"constellate", +"constellation", +"constellatory", +"consternate", +"consternation", +"constipate", +"constipation", +"constituency", +"constituent", +"constituently", +"constitute", +"constituter", +"constitution", +"constitutional", +"constitutionalism", +"constitutionalist", +"constitutionality", +"constitutionalization", +"constitutionalize", +"constitutionally", +"constitutionary", +"constitutioner", +"constitutionist", +"constitutive", +"constitutively", +"constitutiveness", +"constitutor", +"constrain", +"constrainable", +"constrained", +"constrainedly", +"constrainedness", +"constrainer", +"constraining", +"constrainingly", +"constrainment", +"constraint", +"constrict", +"constricted", +"constriction", +"constrictive", +"constrictor", +"constringe", +"constringency", +"constringent", +"construability", +"construable", +"construct", +"constructer", +"constructible", +"construction", +"constructional", +"constructionally", +"constructionism", +"constructionist", +"constructive", +"constructively", +"constructiveness", +"constructivism", +"constructivist", +"constructor", +"constructorship", +"constructure", +"construe", +"construer", +"constuprate", +"constupration", +"consubsist", +"consubsistency", +"consubstantial", +"consubstantialism", +"consubstantialist", +"consubstantiality", +"consubstantially", +"consubstantiate", +"consubstantiation", +"consubstantiationist", +"consubstantive", +"consuete", +"consuetitude", +"consuetude", +"consuetudinal", +"consuetudinary", +"consul", +"consulage", +"consular", +"consularity", +"consulary", +"consulate", +"consulship", +"consult", +"consultable", +"consultant", +"consultary", +"consultation", +"consultative", +"consultatory", +"consultee", +"consulter", +"consulting", +"consultive", +"consultively", +"consultor", +"consultory", +"consumable", +"consume", +"consumedly", +"consumeless", +"consumer", +"consuming", +"consumingly", +"consumingness", +"consummate", +"consummately", +"consummation", +"consummative", +"consummatively", +"consummativeness", +"consummator", +"consummatory", +"consumpt", +"consumpted", +"consumptible", +"consumption", +"consumptional", +"consumptive", +"consumptively", +"consumptiveness", +"consumptivity", +"consute", +"contabescence", +"contabescent", +"contact", +"contactor", +"contactual", +"contactually", +"contagion", +"contagioned", +"contagionist", +"contagiosity", +"contagious", +"contagiously", +"contagiousness", +"contagium", +"contain", +"containable", +"container", +"containment", +"contakion", +"contaminable", +"contaminant", +"contaminate", +"contamination", +"contaminative", +"contaminator", +"contaminous", +"contangential", +"contango", +"conte", +"contect", +"contection", +"contemn", +"contemner", +"contemnible", +"contemnibly", +"contemning", +"contemningly", +"contemnor", +"contemper", +"contemperate", +"contemperature", +"contemplable", +"contemplamen", +"contemplant", +"contemplate", +"contemplatingly", +"contemplation", +"contemplatist", +"contemplative", +"contemplatively", +"contemplativeness", +"contemplator", +"contemplature", +"contemporanean", +"contemporaneity", +"contemporaneous", +"contemporaneously", +"contemporaneousness", +"contemporarily", +"contemporariness", +"contemporary", +"contemporize", +"contempt", +"contemptful", +"contemptibility", +"contemptible", +"contemptibleness", +"contemptibly", +"contemptuous", +"contemptuously", +"contemptuousness", +"contendent", +"contender", +"contending", +"contendingly", +"contendress", +"content", +"contentable", +"contented", +"contentedly", +"contentedness", +"contentful", +"contention", +"contentional", +"contentious", +"contentiously", +"contentiousness", +"contentless", +"contently", +"contentment", +"contentness", +"contents", +"conter", +"conterminal", +"conterminant", +"contermine", +"conterminous", +"conterminously", +"conterminousness", +"contest", +"contestable", +"contestableness", +"contestably", +"contestant", +"contestation", +"contestee", +"contester", +"contestingly", +"contestless", +"context", +"contextive", +"contextual", +"contextually", +"contextural", +"contexture", +"contextured", +"conticent", +"contignation", +"contiguity", +"contiguous", +"contiguously", +"contiguousness", +"continence", +"continency", +"continent", +"continental", +"Continentaler", +"continentalism", +"continentalist", +"continentality", +"Continentalize", +"continentally", +"continently", +"contingence", +"contingency", +"contingent", +"contingential", +"contingentialness", +"contingently", +"contingentness", +"continuable", +"continual", +"continuality", +"continually", +"continualness", +"continuance", +"continuancy", +"continuando", +"continuant", +"continuantly", +"continuate", +"continuately", +"continuateness", +"continuation", +"continuative", +"continuatively", +"continuativeness", +"continuator", +"continue", +"continued", +"continuedly", +"continuedness", +"continuer", +"continuingly", +"continuist", +"continuity", +"continuous", +"continuously", +"continuousness", +"continuum", +"contise", +"contline", +"conto", +"contorniate", +"contorsive", +"contort", +"Contortae", +"contorted", +"contortedly", +"contortedness", +"contortion", +"contortional", +"contortionate", +"contortioned", +"contortionist", +"contortionistic", +"contortive", +"contour", +"contourne", +"contra", +"contraband", +"contrabandage", +"contrabandery", +"contrabandism", +"contrabandist", +"contrabandista", +"contrabass", +"contrabassist", +"contrabasso", +"contracapitalist", +"contraception", +"contraceptionist", +"contraceptive", +"contracivil", +"contraclockwise", +"contract", +"contractable", +"contractant", +"contractation", +"contracted", +"contractedly", +"contractedness", +"contractee", +"contracter", +"contractibility", +"contractible", +"contractibleness", +"contractibly", +"contractile", +"contractility", +"contraction", +"contractional", +"contractionist", +"contractive", +"contractively", +"contractiveness", +"contractor", +"contractual", +"contractually", +"contracture", +"contractured", +"contradebt", +"contradict", +"contradictable", +"contradictedness", +"contradicter", +"contradiction", +"contradictional", +"contradictious", +"contradictiously", +"contradictiousness", +"contradictive", +"contradictively", +"contradictiveness", +"contradictor", +"contradictorily", +"contradictoriness", +"contradictory", +"contradiscriminate", +"contradistinct", +"contradistinction", +"contradistinctive", +"contradistinctively", +"contradistinctly", +"contradistinguish", +"contradivide", +"contrafacture", +"contrafagotto", +"contrafissura", +"contraflexure", +"contraflow", +"contrafocal", +"contragredience", +"contragredient", +"contrahent", +"contrail", +"contraindicate", +"contraindication", +"contraindicative", +"contralateral", +"contralto", +"contramarque", +"contranatural", +"contrantiscion", +"contraoctave", +"contraparallelogram", +"contraplex", +"contrapolarization", +"contrapone", +"contraponend", +"Contraposaune", +"contrapose", +"contraposit", +"contraposita", +"contraposition", +"contrapositive", +"contraprogressist", +"contraprop", +"contraproposal", +"contraption", +"contraptious", +"contrapuntal", +"contrapuntalist", +"contrapuntally", +"contrapuntist", +"contrapunto", +"contrarational", +"contraregular", +"contraregularity", +"contraremonstrance", +"contraremonstrant", +"contrarevolutionary", +"contrariant", +"contrariantly", +"contrariety", +"contrarily", +"contrariness", +"contrarious", +"contrariously", +"contrariousness", +"contrariwise", +"contrarotation", +"contrary", +"contrascriptural", +"contrast", +"contrastable", +"contrastably", +"contrastedly", +"contrastimulant", +"contrastimulation", +"contrastimulus", +"contrastingly", +"contrastive", +"contrastively", +"contrastment", +"contrasty", +"contrasuggestible", +"contratabular", +"contrate", +"contratempo", +"contratenor", +"contravalence", +"contravallation", +"contravariant", +"contravene", +"contravener", +"contravention", +"contraversion", +"contravindicate", +"contravindication", +"contrawise", +"contrayerva", +"contrectation", +"contreface", +"contrefort", +"contretemps", +"contributable", +"contribute", +"contribution", +"contributional", +"contributive", +"contributively", +"contributiveness", +"contributor", +"contributorial", +"contributorship", +"contributory", +"contrite", +"contritely", +"contriteness", +"contrition", +"contriturate", +"contrivance", +"contrivancy", +"contrive", +"contrivement", +"contriver", +"control", +"controllability", +"controllable", +"controllableness", +"controllably", +"controller", +"controllership", +"controlless", +"controllingly", +"controlment", +"controversial", +"controversialism", +"controversialist", +"controversialize", +"controversially", +"controversion", +"controversional", +"controversionalism", +"controversionalist", +"controversy", +"controvert", +"controverter", +"controvertible", +"controvertibly", +"controvertist", +"contubernal", +"contubernial", +"contubernium", +"contumacious", +"contumaciously", +"contumaciousness", +"contumacity", +"contumacy", +"contumelious", +"contumeliously", +"contumeliousness", +"contumely", +"contund", +"conturbation", +"contuse", +"contusion", +"contusioned", +"contusive", +"conubium", +"Conularia", +"conumerary", +"conumerous", +"conundrum", +"conundrumize", +"conurbation", +"conure", +"Conuropsis", +"Conurus", +"conus", +"conusable", +"conusance", +"conusant", +"conusee", +"conusor", +"conutrition", +"conuzee", +"conuzor", +"convalesce", +"convalescence", +"convalescency", +"convalescent", +"convalescently", +"convallamarin", +"Convallaria", +"Convallariaceae", +"convallariaceous", +"convallarin", +"convect", +"convection", +"convectional", +"convective", +"convectively", +"convector", +"convenable", +"convenably", +"convene", +"convenee", +"convener", +"convenership", +"convenience", +"conveniency", +"convenient", +"conveniently", +"convenientness", +"convent", +"conventical", +"conventically", +"conventicle", +"conventicler", +"conventicular", +"convention", +"conventional", +"conventionalism", +"conventionalist", +"conventionality", +"conventionalization", +"conventionalize", +"conventionally", +"conventionary", +"conventioner", +"conventionism", +"conventionist", +"conventionize", +"conventual", +"conventually", +"converge", +"convergement", +"convergence", +"convergency", +"convergent", +"convergescence", +"converging", +"conversable", +"conversableness", +"conversably", +"conversance", +"conversancy", +"conversant", +"conversantly", +"conversation", +"conversationable", +"conversational", +"conversationalist", +"conversationally", +"conversationism", +"conversationist", +"conversationize", +"conversative", +"converse", +"conversely", +"converser", +"conversibility", +"conversible", +"conversion", +"conversional", +"conversionism", +"conversionist", +"conversive", +"convert", +"converted", +"convertend", +"converter", +"convertibility", +"convertible", +"convertibleness", +"convertibly", +"converting", +"convertingness", +"convertise", +"convertism", +"convertite", +"convertive", +"convertor", +"conveth", +"convex", +"convexed", +"convexedly", +"convexedness", +"convexity", +"convexly", +"convexness", +"convey", +"conveyable", +"conveyal", +"conveyance", +"conveyancer", +"conveyancing", +"conveyer", +"convict", +"convictable", +"conviction", +"convictional", +"convictism", +"convictive", +"convictively", +"convictiveness", +"convictment", +"convictor", +"convince", +"convinced", +"convincedly", +"convincedness", +"convincement", +"convincer", +"convincibility", +"convincible", +"convincing", +"convincingly", +"convincingness", +"convival", +"convive", +"convivial", +"convivialist", +"conviviality", +"convivialize", +"convivially", +"convocant", +"convocate", +"convocation", +"convocational", +"convocationally", +"convocationist", +"convocative", +"convocator", +"convoke", +"convoker", +"Convoluta", +"convolute", +"convoluted", +"convolutely", +"convolution", +"convolutional", +"convolutionary", +"convolutive", +"convolve", +"convolvement", +"Convolvulaceae", +"convolvulaceous", +"convolvulad", +"convolvuli", +"convolvulic", +"convolvulin", +"convolvulinic", +"convolvulinolic", +"Convolvulus", +"convoy", +"convulsant", +"convulse", +"convulsedly", +"convulsibility", +"convulsible", +"convulsion", +"convulsional", +"convulsionary", +"convulsionism", +"convulsionist", +"convulsive", +"convulsively", +"convulsiveness", +"cony", +"conycatcher", +"conyrine", +"coo", +"cooba", +"coodle", +"cooee", +"cooer", +"coof", +"Coohee", +"cooing", +"cooingly", +"cooja", +"cook", +"cookable", +"cookbook", +"cookdom", +"cookee", +"cookeite", +"cooker", +"cookery", +"cookhouse", +"cooking", +"cookish", +"cookishly", +"cookless", +"cookmaid", +"cookout", +"cookroom", +"cookshack", +"cookshop", +"cookstove", +"cooky", +"cool", +"coolant", +"coolen", +"cooler", +"coolerman", +"coolheaded", +"coolheadedly", +"coolheadedness", +"coolhouse", +"coolibah", +"coolie", +"cooling", +"coolingly", +"coolingness", +"coolish", +"coolly", +"coolness", +"coolth", +"coolung", +"coolweed", +"coolwort", +"cooly", +"coom", +"coomb", +"coomy", +"coon", +"cooncan", +"coonily", +"cooniness", +"coonroot", +"coonskin", +"coontail", +"coontie", +"coony", +"coop", +"cooper", +"cooperage", +"Cooperia", +"coopering", +"coopery", +"cooree", +"Coorg", +"coorie", +"cooruptibly", +"Coos", +"cooser", +"coost", +"Coosuc", +"coot", +"cooter", +"cootfoot", +"coothay", +"cootie", +"cop", +"copa", +"copable", +"copacetic", +"copaene", +"copaiba", +"copaibic", +"Copaifera", +"Copaiva", +"copaivic", +"copaiye", +"copal", +"copalche", +"copalcocote", +"copaliferous", +"copalite", +"copalm", +"coparallel", +"coparcenary", +"coparcener", +"coparceny", +"coparent", +"copart", +"copartaker", +"copartner", +"copartnership", +"copartnery", +"coparty", +"copassionate", +"copastor", +"copastorate", +"copatain", +"copatentee", +"copatriot", +"copatron", +"copatroness", +"cope", +"Copehan", +"copei", +"Copelata", +"Copelatae", +"copelate", +"copellidine", +"copeman", +"copemate", +"copen", +"copending", +"copenetrate", +"Copeognatha", +"copepod", +"Copepoda", +"copepodan", +"copepodous", +"coper", +"coperception", +"coperiodic", +"Copernican", +"Copernicanism", +"Copernicia", +"coperta", +"copesman", +"copesmate", +"copestone", +"copetitioner", +"cophasal", +"Cophetua", +"cophosis", +"copiability", +"copiable", +"copiapite", +"copied", +"copier", +"copilot", +"coping", +"copiopia", +"copiopsia", +"copiosity", +"copious", +"copiously", +"copiousness", +"copis", +"copist", +"copita", +"coplaintiff", +"coplanar", +"coplanarity", +"copleased", +"coplotter", +"coploughing", +"coplowing", +"copolar", +"copolymer", +"copolymerization", +"copolymerize", +"coppaelite", +"copped", +"copper", +"copperas", +"copperbottom", +"copperer", +"copperhead", +"copperheadism", +"coppering", +"copperish", +"copperization", +"copperize", +"copperleaf", +"coppernose", +"coppernosed", +"copperplate", +"copperproof", +"coppersidesman", +"copperskin", +"coppersmith", +"coppersmithing", +"copperware", +"copperwing", +"copperworks", +"coppery", +"copperytailed", +"coppet", +"coppice", +"coppiced", +"coppicing", +"coppin", +"copping", +"copple", +"copplecrown", +"coppled", +"coppy", +"copr", +"copra", +"coprecipitate", +"coprecipitation", +"copremia", +"copremic", +"copresbyter", +"copresence", +"copresent", +"Coprides", +"Coprinae", +"coprincipal", +"coprincipate", +"Coprinus", +"coprisoner", +"coprodaeum", +"coproduce", +"coproducer", +"coprojector", +"coprolagnia", +"coprolagnist", +"coprolalia", +"coprolaliac", +"coprolite", +"coprolith", +"coprolitic", +"coprology", +"copromisor", +"copromoter", +"coprophagan", +"coprophagia", +"coprophagist", +"coprophagous", +"coprophagy", +"coprophilia", +"coprophiliac", +"coprophilic", +"coprophilism", +"coprophilous", +"coprophyte", +"coproprietor", +"coproprietorship", +"coprose", +"Coprosma", +"coprostasis", +"coprosterol", +"coprozoic", +"copse", +"copsewood", +"copsewooded", +"copsing", +"copsy", +"Copt", +"copter", +"Coptic", +"Coptis", +"copula", +"copulable", +"copular", +"copularium", +"copulate", +"copulation", +"copulative", +"copulatively", +"copulatory", +"copunctal", +"copurchaser", +"copus", +"copy", +"copybook", +"copycat", +"copygraph", +"copygraphed", +"copyhold", +"copyholder", +"copyholding", +"copyism", +"copyist", +"copyman", +"copyreader", +"copyright", +"copyrightable", +"copyrighter", +"copywise", +"coque", +"coquecigrue", +"coquelicot", +"coqueluche", +"coquet", +"coquetoon", +"coquetry", +"coquette", +"coquettish", +"coquettishly", +"coquettishness", +"coquicken", +"coquilla", +"Coquille", +"coquille", +"coquimbite", +"coquina", +"coquita", +"Coquitlam", +"coquito", +"cor", +"Cora", +"cora", +"Corabeca", +"Corabecan", +"corach", +"Coraciae", +"coracial", +"Coracias", +"Coracii", +"Coraciidae", +"coraciiform", +"Coraciiformes", +"coracine", +"coracle", +"coracler", +"coracoacromial", +"coracobrachial", +"coracobrachialis", +"coracoclavicular", +"coracocostal", +"coracohumeral", +"coracohyoid", +"coracoid", +"coracoidal", +"coracomandibular", +"coracomorph", +"Coracomorphae", +"coracomorphic", +"coracopectoral", +"coracoprocoracoid", +"coracoradialis", +"coracoscapular", +"coracovertebral", +"coradical", +"coradicate", +"corah", +"coraise", +"coral", +"coralberry", +"coralbush", +"coraled", +"coralflower", +"coralist", +"corallet", +"Corallian", +"corallic", +"Corallidae", +"corallidomous", +"coralliferous", +"coralliform", +"Coralligena", +"coralligenous", +"coralligerous", +"corallike", +"Corallina", +"Corallinaceae", +"corallinaceous", +"coralline", +"corallite", +"Corallium", +"coralloid", +"coralloidal", +"Corallorhiza", +"corallum", +"Corallus", +"coralroot", +"coralwort", +"coram", +"Corambis", +"coranto", +"corban", +"corbeau", +"corbeil", +"corbel", +"corbeling", +"corbicula", +"corbiculate", +"corbiculum", +"corbie", +"corbiestep", +"corbovinum", +"corbula", +"corcass", +"Corchorus", +"corcir", +"corcopali", +"Corcyraean", +"cord", +"cordage", +"Cordaitaceae", +"cordaitaceous", +"cordaitalean", +"Cordaitales", +"cordaitean", +"Cordaites", +"cordant", +"cordate", +"cordately", +"cordax", +"Cordeau", +"corded", +"cordel", +"Cordelia", +"Cordelier", +"cordeliere", +"cordelle", +"corder", +"Cordery", +"cordewane", +"Cordia", +"cordial", +"cordiality", +"cordialize", +"cordially", +"cordialness", +"cordiceps", +"cordicole", +"cordierite", +"cordies", +"cordiform", +"cordigeri", +"cordillera", +"cordilleran", +"cordiner", +"cording", +"cordite", +"corditis", +"cordleaf", +"cordmaker", +"cordoba", +"cordon", +"cordonnet", +"Cordovan", +"Cordula", +"corduroy", +"corduroyed", +"cordwain", +"cordwainer", +"cordwainery", +"cordwood", +"cordy", +"Cordyceps", +"cordyl", +"Cordylanthus", +"Cordyline", +"core", +"corebel", +"coreceiver", +"coreciprocal", +"corectome", +"corectomy", +"corector", +"cored", +"coredeem", +"coredeemer", +"coredemptress", +"coreductase", +"Coree", +"coreflexed", +"coregence", +"coregency", +"coregent", +"coregnancy", +"coregnant", +"coregonid", +"Coregonidae", +"coregonine", +"coregonoid", +"Coregonus", +"coreid", +"Coreidae", +"coreign", +"coreigner", +"corejoice", +"corelate", +"corelated", +"corelation", +"corelative", +"corelatively", +"coreless", +"coreligionist", +"corella", +"corelysis", +"Corema", +"coremaker", +"coremaking", +"coremium", +"coremorphosis", +"corenounce", +"coreometer", +"Coreopsis", +"coreplastic", +"coreplasty", +"corer", +"coresidence", +"coresidual", +"coresign", +"coresonant", +"coresort", +"corespect", +"corespondency", +"corespondent", +"coretomy", +"coreveler", +"coreveller", +"corevolve", +"corf", +"Corfiote", +"Corflambo", +"corge", +"corgi", +"coriaceous", +"corial", +"coriamyrtin", +"coriander", +"coriandrol", +"Coriandrum", +"Coriaria", +"Coriariaceae", +"coriariaceous", +"coriin", +"Corimelaena", +"Corimelaenidae", +"Corin", +"corindon", +"Corineus", +"coring", +"Corinna", +"corinne", +"Corinth", +"Corinthian", +"Corinthianesque", +"Corinthianism", +"Corinthianize", +"Coriolanus", +"coriparian", +"corium", +"Corixa", +"Corixidae", +"cork", +"corkage", +"corkboard", +"corke", +"corked", +"corker", +"corkiness", +"corking", +"corkish", +"corkite", +"corkmaker", +"corkmaking", +"corkscrew", +"corkscrewy", +"corkwing", +"corkwood", +"corky", +"corm", +"Cormac", +"cormel", +"cormidium", +"cormoid", +"Cormophyta", +"cormophyte", +"cormophytic", +"cormorant", +"cormous", +"cormus", +"corn", +"Cornaceae", +"cornaceous", +"cornage", +"cornbell", +"cornberry", +"cornbin", +"cornbinks", +"cornbird", +"cornbole", +"cornbottle", +"cornbrash", +"corncake", +"corncob", +"corncracker", +"corncrib", +"corncrusher", +"corndodger", +"cornea", +"corneagen", +"corneal", +"cornein", +"corneitis", +"cornel", +"Cornelia", +"cornelian", +"Cornelius", +"cornemuse", +"corneocalcareous", +"corneosclerotic", +"corneosiliceous", +"corneous", +"corner", +"cornerbind", +"cornered", +"cornerer", +"cornerpiece", +"cornerstone", +"cornerways", +"cornerwise", +"cornet", +"cornetcy", +"cornettino", +"cornettist", +"corneule", +"corneum", +"cornfield", +"cornfloor", +"cornflower", +"corngrower", +"cornhouse", +"cornhusk", +"cornhusker", +"cornhusking", +"cornic", +"cornice", +"cornicle", +"corniculate", +"corniculer", +"corniculum", +"Corniferous", +"cornific", +"cornification", +"cornified", +"corniform", +"cornigerous", +"cornin", +"corning", +"corniplume", +"Cornish", +"Cornishman", +"cornland", +"cornless", +"cornloft", +"cornmaster", +"cornmonger", +"cornopean", +"cornpipe", +"cornrick", +"cornroot", +"cornstalk", +"cornstarch", +"cornstook", +"cornu", +"cornual", +"cornuate", +"cornuated", +"cornubianite", +"cornucopia", +"Cornucopiae", +"cornucopian", +"cornucopiate", +"cornule", +"cornulite", +"Cornulites", +"cornupete", +"Cornus", +"cornute", +"cornuted", +"cornutine", +"cornuto", +"cornwallis", +"cornwallite", +"corny", +"coroa", +"Coroado", +"corocleisis", +"corodiary", +"corodiastasis", +"corodiastole", +"corody", +"corol", +"corolla", +"corollaceous", +"corollarial", +"corollarially", +"corollary", +"corollate", +"corollated", +"corolliferous", +"corolliform", +"corollike", +"corolline", +"corollitic", +"corometer", +"corona", +"coronach", +"coronad", +"coronadite", +"coronae", +"coronagraph", +"coronagraphic", +"coronal", +"coronale", +"coronaled", +"coronally", +"coronamen", +"coronary", +"coronate", +"coronated", +"coronation", +"coronatorial", +"coroner", +"coronership", +"coronet", +"coroneted", +"coronetted", +"coronetty", +"coroniform", +"Coronilla", +"coronillin", +"coronion", +"coronitis", +"coronium", +"coronize", +"coronobasilar", +"coronofacial", +"coronofrontal", +"coronoid", +"Coronopus", +"coronule", +"coroparelcysis", +"coroplast", +"coroplasta", +"coroplastic", +"Coropo", +"coroscopy", +"corotomy", +"corozo", +"corp", +"corpora", +"corporal", +"corporalism", +"corporality", +"corporally", +"corporalship", +"corporas", +"corporate", +"corporately", +"corporateness", +"corporation", +"corporational", +"corporationer", +"corporationism", +"corporative", +"corporator", +"corporature", +"corporeal", +"corporealist", +"corporeality", +"corporealization", +"corporealize", +"corporeally", +"corporealness", +"corporeals", +"corporeity", +"corporeous", +"corporification", +"corporify", +"corporosity", +"corposant", +"corps", +"corpsbruder", +"corpse", +"corpsman", +"corpulence", +"corpulency", +"corpulent", +"corpulently", +"corpulentness", +"corpus", +"corpuscle", +"corpuscular", +"corpuscularian", +"corpuscularity", +"corpusculated", +"corpuscule", +"corpusculous", +"corpusculum", +"corrade", +"corradial", +"corradiate", +"corradiation", +"corral", +"corrasion", +"corrasive", +"Correa", +"correal", +"correality", +"correct", +"correctable", +"correctant", +"corrected", +"correctedness", +"correctible", +"correcting", +"correctingly", +"correction", +"correctional", +"correctionalist", +"correctioner", +"correctitude", +"corrective", +"correctively", +"correctiveness", +"correctly", +"correctness", +"corrector", +"correctorship", +"correctress", +"correctrice", +"corregidor", +"correlatable", +"correlate", +"correlated", +"correlation", +"correlational", +"correlative", +"correlatively", +"correlativeness", +"correlativism", +"correlativity", +"correligionist", +"corrente", +"correption", +"corresol", +"correspond", +"correspondence", +"correspondency", +"correspondent", +"correspondential", +"correspondentially", +"correspondently", +"correspondentship", +"corresponder", +"corresponding", +"correspondingly", +"corresponsion", +"corresponsive", +"corresponsively", +"corridor", +"corridored", +"corrie", +"Corriedale", +"corrige", +"corrigenda", +"corrigendum", +"corrigent", +"corrigibility", +"corrigible", +"corrigibleness", +"corrigibly", +"Corrigiola", +"Corrigiolaceae", +"corrival", +"corrivality", +"corrivalry", +"corrivalship", +"corrivate", +"corrivation", +"corrobboree", +"corroborant", +"corroborate", +"corroboration", +"corroborative", +"corroboratively", +"corroborator", +"corroboratorily", +"corroboratory", +"corroboree", +"corrode", +"corrodent", +"Corrodentia", +"corroder", +"corrodiary", +"corrodibility", +"corrodible", +"corrodier", +"corroding", +"corrosibility", +"corrosible", +"corrosibleness", +"corrosion", +"corrosional", +"corrosive", +"corrosively", +"corrosiveness", +"corrosivity", +"corrugate", +"corrugated", +"corrugation", +"corrugator", +"corrupt", +"corrupted", +"corruptedly", +"corruptedness", +"corrupter", +"corruptful", +"corruptibility", +"corruptible", +"corruptibleness", +"corrupting", +"corruptingly", +"corruption", +"corruptionist", +"corruptive", +"corruptively", +"corruptly", +"corruptness", +"corruptor", +"corruptress", +"corsac", +"corsage", +"corsaint", +"corsair", +"corse", +"corselet", +"corsepresent", +"corsesque", +"corset", +"corseting", +"corsetless", +"corsetry", +"Corsican", +"corsie", +"corsite", +"corta", +"Cortaderia", +"cortege", +"Cortes", +"cortex", +"cortez", +"cortical", +"cortically", +"corticate", +"corticated", +"corticating", +"cortication", +"cortices", +"corticiferous", +"corticiform", +"corticifugal", +"corticifugally", +"corticipetal", +"corticipetally", +"Corticium", +"corticoafferent", +"corticoefferent", +"corticoline", +"corticopeduncular", +"corticose", +"corticospinal", +"corticosterone", +"corticostriate", +"corticous", +"cortin", +"cortina", +"cortinarious", +"Cortinarius", +"cortinate", +"cortisone", +"cortlandtite", +"Corton", +"coruco", +"coruler", +"Coruminacan", +"corundophilite", +"corundum", +"corupay", +"coruscant", +"coruscate", +"coruscation", +"corver", +"corvette", +"corvetto", +"Corvidae", +"corviform", +"corvillosum", +"corvina", +"Corvinae", +"corvine", +"corvoid", +"Corvus", +"Corybant", +"Corybantian", +"corybantiasm", +"Corybantic", +"corybantic", +"Corybantine", +"corybantish", +"corybulbin", +"corybulbine", +"corycavamine", +"corycavidin", +"corycavidine", +"corycavine", +"Corycia", +"Corycian", +"corydalin", +"corydaline", +"Corydalis", +"corydine", +"Corydon", +"coryl", +"Corylaceae", +"corylaceous", +"corylin", +"Corylopsis", +"Corylus", +"corymb", +"corymbed", +"corymbiate", +"corymbiated", +"corymbiferous", +"corymbiform", +"corymbose", +"corymbous", +"corynebacterial", +"Corynebacterium", +"Coryneum", +"corynine", +"Corynocarpaceae", +"corynocarpaceous", +"Corynocarpus", +"Corypha", +"Coryphaena", +"coryphaenid", +"Coryphaenidae", +"coryphaenoid", +"Coryphaenoididae", +"coryphaeus", +"coryphee", +"coryphene", +"Coryphodon", +"coryphodont", +"coryphylly", +"corytuberine", +"coryza", +"cos", +"cosalite", +"cosaque", +"cosavior", +"coscet", +"Coscinodiscaceae", +"Coscinodiscus", +"coscinomancy", +"coscoroba", +"coseasonal", +"coseat", +"cosec", +"cosecant", +"cosech", +"cosectarian", +"cosectional", +"cosegment", +"coseism", +"coseismal", +"coseismic", +"cosenator", +"cosentiency", +"cosentient", +"coservant", +"cosession", +"coset", +"cosettler", +"cosh", +"cosharer", +"cosheath", +"cosher", +"cosherer", +"coshering", +"coshery", +"cosignatory", +"cosigner", +"cosignitary", +"cosily", +"cosinage", +"cosine", +"cosiness", +"cosingular", +"cosinusoid", +"Cosmati", +"cosmecology", +"cosmesis", +"cosmetic", +"cosmetical", +"cosmetically", +"cosmetician", +"cosmetiste", +"cosmetological", +"cosmetologist", +"cosmetology", +"cosmic", +"cosmical", +"cosmicality", +"cosmically", +"cosmism", +"cosmist", +"cosmocracy", +"cosmocrat", +"cosmocratic", +"cosmogenesis", +"cosmogenetic", +"cosmogenic", +"cosmogeny", +"cosmogonal", +"cosmogoner", +"cosmogonic", +"cosmogonical", +"cosmogonist", +"cosmogonize", +"cosmogony", +"cosmographer", +"cosmographic", +"cosmographical", +"cosmographically", +"cosmographist", +"cosmography", +"cosmolabe", +"cosmolatry", +"cosmologic", +"cosmological", +"cosmologically", +"cosmologist", +"cosmology", +"cosmometry", +"cosmopathic", +"cosmoplastic", +"cosmopoietic", +"cosmopolicy", +"cosmopolis", +"cosmopolitan", +"cosmopolitanism", +"cosmopolitanization", +"cosmopolitanize", +"cosmopolitanly", +"cosmopolite", +"cosmopolitic", +"cosmopolitical", +"cosmopolitics", +"cosmopolitism", +"cosmorama", +"cosmoramic", +"cosmorganic", +"cosmos", +"cosmoscope", +"cosmosophy", +"cosmosphere", +"cosmotellurian", +"cosmotheism", +"cosmotheist", +"cosmotheistic", +"cosmothetic", +"cosmotron", +"cosmozoan", +"cosmozoic", +"cosmozoism", +"cosonant", +"cosounding", +"cosovereign", +"cosovereignty", +"cospecies", +"cospecific", +"cosphered", +"cosplendor", +"cosplendour", +"coss", +"Cossack", +"Cossaean", +"cossas", +"cosse", +"cosset", +"cossette", +"cossid", +"Cossidae", +"cossnent", +"cossyrite", +"cost", +"costa", +"Costaea", +"costal", +"costalgia", +"costally", +"costander", +"Costanoan", +"costar", +"costard", +"Costata", +"costate", +"costated", +"costean", +"costeaning", +"costectomy", +"costellate", +"coster", +"costerdom", +"costermonger", +"costicartilage", +"costicartilaginous", +"costicervical", +"costiferous", +"costiform", +"costing", +"costipulator", +"costispinal", +"costive", +"costively", +"costiveness", +"costless", +"costlessness", +"costliness", +"costly", +"costmary", +"costoabdominal", +"costoapical", +"costocentral", +"costochondral", +"costoclavicular", +"costocolic", +"costocoracoid", +"costodiaphragmatic", +"costogenic", +"costoinferior", +"costophrenic", +"costopleural", +"costopneumopexy", +"costopulmonary", +"costoscapular", +"costosternal", +"costosuperior", +"costothoracic", +"costotome", +"costotomy", +"costotrachelian", +"costotransversal", +"costotransverse", +"costovertebral", +"costoxiphoid", +"costraight", +"costrel", +"costula", +"costulation", +"costume", +"costumer", +"costumery", +"costumic", +"costumier", +"costumiere", +"costuming", +"costumist", +"costusroot", +"cosubject", +"cosubordinate", +"cosuffer", +"cosufferer", +"cosuggestion", +"cosuitor", +"cosurety", +"cosustain", +"coswearer", +"cosy", +"cosymmedian", +"cot", +"cotangent", +"cotangential", +"cotarius", +"cotarnine", +"cotch", +"cote", +"coteful", +"coteline", +"coteller", +"cotemporane", +"cotemporanean", +"cotemporaneous", +"cotemporaneously", +"cotemporary", +"cotenancy", +"cotenant", +"cotenure", +"coterell", +"coterie", +"coterminous", +"Cotesian", +"coth", +"cothamore", +"cothe", +"cotheorist", +"cothish", +"cothon", +"cothurn", +"cothurnal", +"cothurnate", +"cothurned", +"cothurnian", +"cothurnus", +"cothy", +"cotidal", +"cotillage", +"cotillion", +"Cotinga", +"cotingid", +"Cotingidae", +"cotingoid", +"Cotinus", +"cotise", +"cotitular", +"cotland", +"cotman", +"coto", +"cotoin", +"Cotonam", +"Cotoneaster", +"cotonier", +"cotorment", +"cotoro", +"cotorture", +"Cotoxo", +"cotquean", +"cotraitor", +"cotransfuse", +"cotranslator", +"cotranspire", +"cotransubstantiate", +"cotrine", +"cotripper", +"cotrustee", +"cotset", +"cotsetla", +"cotsetle", +"cotta", +"cottabus", +"cottage", +"cottaged", +"cottager", +"cottagers", +"cottagey", +"cotte", +"cotted", +"cotter", +"cotterel", +"cotterite", +"cotterway", +"cottid", +"Cottidae", +"cottier", +"cottierism", +"cottiform", +"cottoid", +"cotton", +"cottonade", +"cottonbush", +"cottonee", +"cottoneer", +"cottoner", +"Cottonian", +"cottonization", +"cottonize", +"cottonless", +"cottonmouth", +"cottonocracy", +"Cottonopolis", +"cottonseed", +"cottontail", +"cottontop", +"cottonweed", +"cottonwood", +"cottony", +"Cottus", +"cotty", +"cotuit", +"cotula", +"cotunnite", +"Coturnix", +"cotutor", +"cotwin", +"cotwinned", +"cotwist", +"cotyla", +"cotylar", +"cotyledon", +"cotyledonal", +"cotyledonar", +"cotyledonary", +"cotyledonous", +"cotyliform", +"cotyligerous", +"cotyliscus", +"cotyloid", +"Cotylophora", +"cotylophorous", +"cotylopubic", +"cotylosacral", +"cotylosaur", +"Cotylosauria", +"cotylosaurian", +"cotype", +"Cotys", +"Cotyttia", +"couac", +"coucal", +"couch", +"couchancy", +"couchant", +"couched", +"couchee", +"coucher", +"couching", +"couchmaker", +"couchmaking", +"couchmate", +"couchy", +"coude", +"coudee", +"coue", +"Coueism", +"cougar", +"cough", +"cougher", +"coughroot", +"coughweed", +"coughwort", +"cougnar", +"coul", +"could", +"couldron", +"coulee", +"coulisse", +"coulomb", +"coulometer", +"coulterneb", +"coulure", +"couma", +"coumalic", +"coumalin", +"coumara", +"coumaran", +"coumarate", +"coumaric", +"coumarilic", +"coumarin", +"coumarinic", +"coumarone", +"coumarou", +"Coumarouna", +"council", +"councilist", +"councilman", +"councilmanic", +"councilor", +"councilorship", +"councilwoman", +"counderstand", +"counite", +"couniversal", +"counsel", +"counselable", +"counselee", +"counselful", +"counselor", +"counselorship", +"count", +"countable", +"countableness", +"countably", +"countdom", +"countenance", +"countenancer", +"counter", +"counterabut", +"counteraccusation", +"counteracquittance", +"counteract", +"counteractant", +"counteracter", +"counteracting", +"counteractingly", +"counteraction", +"counteractive", +"counteractively", +"counteractivity", +"counteractor", +"counteraddress", +"counteradvance", +"counteradvantage", +"counteradvice", +"counteradvise", +"counteraffirm", +"counteraffirmation", +"counteragency", +"counteragent", +"counteragitate", +"counteragitation", +"counteralliance", +"counterambush", +"counterannouncement", +"counteranswer", +"counterappeal", +"counterappellant", +"counterapproach", +"counterapse", +"counterarch", +"counterargue", +"counterargument", +"counterartillery", +"counterassertion", +"counterassociation", +"counterassurance", +"counterattack", +"counterattestation", +"counterattired", +"counterattraction", +"counterattractive", +"counterattractively", +"counteraverment", +"counteravouch", +"counteravouchment", +"counterbalance", +"counterbarrage", +"counterbase", +"counterbattery", +"counterbeating", +"counterbend", +"counterbewitch", +"counterbid", +"counterblast", +"counterblow", +"counterbond", +"counterborder", +"counterbore", +"counterboycott", +"counterbrace", +"counterbranch", +"counterbrand", +"counterbreastwork", +"counterbuff", +"counterbuilding", +"countercampaign", +"countercarte", +"countercause", +"counterchange", +"counterchanged", +"countercharge", +"countercharm", +"countercheck", +"countercheer", +"counterclaim", +"counterclaimant", +"counterclockwise", +"countercolored", +"countercommand", +"countercompetition", +"countercomplaint", +"countercompony", +"countercondemnation", +"counterconquest", +"counterconversion", +"countercouchant", +"countercoupe", +"countercourant", +"countercraft", +"countercriticism", +"countercross", +"countercry", +"countercurrent", +"countercurrently", +"countercurrentwise", +"counterdance", +"counterdash", +"counterdecision", +"counterdeclaration", +"counterdecree", +"counterdefender", +"counterdemand", +"counterdemonstration", +"counterdeputation", +"counterdesire", +"counterdevelopment", +"counterdifficulty", +"counterdigged", +"counterdike", +"counterdiscipline", +"counterdisengage", +"counterdisengagement", +"counterdistinction", +"counterdistinguish", +"counterdoctrine", +"counterdogmatism", +"counterdraft", +"counterdrain", +"counterdrive", +"counterearth", +"counterefficiency", +"countereffort", +"counterembattled", +"counterembowed", +"counterenamel", +"counterend", +"counterenergy", +"counterengagement", +"counterengine", +"counterenthusiasm", +"counterentry", +"counterequivalent", +"counterermine", +"counterespionage", +"counterestablishment", +"counterevidence", +"counterexaggeration", +"counterexcitement", +"counterexcommunication", +"counterexercise", +"counterexplanation", +"counterexposition", +"counterexpostulation", +"counterextend", +"counterextension", +"counterfact", +"counterfallacy", +"counterfaller", +"counterfeit", +"counterfeiter", +"counterfeitly", +"counterfeitment", +"counterfeitness", +"counterferment", +"counterfessed", +"counterfire", +"counterfix", +"counterflange", +"counterflashing", +"counterflight", +"counterflory", +"counterflow", +"counterflux", +"counterfoil", +"counterforce", +"counterformula", +"counterfort", +"counterfugue", +"countergabble", +"countergabion", +"countergambit", +"countergarrison", +"countergauge", +"countergauger", +"countergift", +"countergirded", +"counterglow", +"counterguard", +"counterhaft", +"counterhammering", +"counterhypothesis", +"counteridea", +"counterideal", +"counterimagination", +"counterimitate", +"counterimitation", +"counterimpulse", +"counterindentation", +"counterindented", +"counterindicate", +"counterindication", +"counterinfluence", +"counterinsult", +"counterintelligence", +"counterinterest", +"counterinterpretation", +"counterintrigue", +"counterinvective", +"counterirritant", +"counterirritate", +"counterirritation", +"counterjudging", +"counterjumper", +"counterlath", +"counterlathing", +"counterlatration", +"counterlaw", +"counterleague", +"counterlegislation", +"counterlife", +"counterlocking", +"counterlode", +"counterlove", +"counterly", +"countermachination", +"counterman", +"countermand", +"countermandable", +"countermaneuver", +"countermanifesto", +"countermarch", +"countermark", +"countermarriage", +"countermeasure", +"countermeet", +"countermessage", +"countermigration", +"countermine", +"countermission", +"countermotion", +"countermount", +"countermove", +"countermovement", +"countermure", +"countermutiny", +"counternaiant", +"counternarrative", +"counternatural", +"counternecromancy", +"counternoise", +"counternotice", +"counterobjection", +"counterobligation", +"counteroffensive", +"counteroffer", +"counteropening", +"counteropponent", +"counteropposite", +"counterorator", +"counterorder", +"counterorganization", +"counterpaled", +"counterpaly", +"counterpane", +"counterpaned", +"counterparadox", +"counterparallel", +"counterparole", +"counterparry", +"counterpart", +"counterpassant", +"counterpassion", +"counterpenalty", +"counterpendent", +"counterpetition", +"counterpicture", +"counterpillar", +"counterplan", +"counterplay", +"counterplayer", +"counterplea", +"counterplead", +"counterpleading", +"counterplease", +"counterplot", +"counterpoint", +"counterpointe", +"counterpointed", +"counterpoise", +"counterpoison", +"counterpole", +"counterponderate", +"counterpose", +"counterposition", +"counterposting", +"counterpotence", +"counterpotency", +"counterpotent", +"counterpractice", +"counterpray", +"counterpreach", +"counterpreparation", +"counterpressure", +"counterprick", +"counterprinciple", +"counterprocess", +"counterproject", +"counterpronunciamento", +"counterproof", +"counterpropaganda", +"counterpropagandize", +"counterprophet", +"counterproposal", +"counterproposition", +"counterprotection", +"counterprotest", +"counterprove", +"counterpull", +"counterpunch", +"counterpuncture", +"counterpush", +"counterquartered", +"counterquarterly", +"counterquery", +"counterquestion", +"counterquip", +"counterradiation", +"counterraid", +"counterraising", +"counterrampant", +"counterrate", +"counterreaction", +"counterreason", +"counterreckoning", +"counterrecoil", +"counterreconnaissance", +"counterrefer", +"counterreflected", +"counterreform", +"counterreformation", +"counterreligion", +"counterremonstrant", +"counterreply", +"counterreprisal", +"counterresolution", +"counterrestoration", +"counterretreat", +"counterrevolution", +"counterrevolutionary", +"counterrevolutionist", +"counterrevolutionize", +"counterriposte", +"counterroll", +"counterround", +"counterruin", +"countersale", +"countersalient", +"counterscale", +"counterscalloped", +"counterscarp", +"counterscoff", +"countersconce", +"counterscrutiny", +"countersea", +"counterseal", +"countersecure", +"countersecurity", +"counterselection", +"countersense", +"counterservice", +"countershade", +"countershaft", +"countershafting", +"countershear", +"countershine", +"countershout", +"counterside", +"countersiege", +"countersign", +"countersignal", +"countersignature", +"countersink", +"countersleight", +"counterslope", +"countersmile", +"countersnarl", +"counterspying", +"counterstain", +"counterstamp", +"counterstand", +"counterstatant", +"counterstatement", +"counterstatute", +"counterstep", +"counterstimulate", +"counterstimulation", +"counterstimulus", +"counterstock", +"counterstratagem", +"counterstream", +"counterstrike", +"counterstroke", +"counterstruggle", +"countersubject", +"countersuggestion", +"countersuit", +"countersun", +"countersunk", +"countersurprise", +"counterswing", +"countersworn", +"countersympathy", +"countersynod", +"countertack", +"countertail", +"countertally", +"countertaste", +"countertechnicality", +"countertendency", +"countertenor", +"counterterm", +"counterterror", +"countertheme", +"countertheory", +"counterthought", +"counterthreat", +"counterthrust", +"counterthwarting", +"countertierce", +"countertime", +"countertouch", +"countertraction", +"countertrades", +"countertransference", +"countertranslation", +"countertraverse", +"countertreason", +"countertree", +"countertrench", +"countertrespass", +"countertrippant", +"countertripping", +"countertruth", +"countertug", +"counterturn", +"counterturned", +"countertype", +"countervail", +"countervair", +"countervairy", +"countervallation", +"countervaunt", +"countervene", +"countervengeance", +"countervenom", +"countervibration", +"counterview", +"countervindication", +"countervolition", +"countervolley", +"countervote", +"counterwager", +"counterwall", +"counterwarmth", +"counterwave", +"counterweigh", +"counterweight", +"counterweighted", +"counterwheel", +"counterwill", +"counterwilling", +"counterwind", +"counterwitness", +"counterword", +"counterwork", +"counterworker", +"counterwrite", +"countess", +"countfish", +"counting", +"countinghouse", +"countless", +"countor", +"countrified", +"countrifiedness", +"country", +"countryfolk", +"countryman", +"countrypeople", +"countryseat", +"countryside", +"countryward", +"countrywoman", +"countship", +"county", +"coup", +"coupage", +"coupe", +"couped", +"coupee", +"coupelet", +"couper", +"couple", +"coupled", +"couplement", +"coupler", +"coupleress", +"couplet", +"coupleteer", +"coupling", +"coupon", +"couponed", +"couponless", +"coupstick", +"coupure", +"courage", +"courageous", +"courageously", +"courageousness", +"courager", +"courant", +"courante", +"courap", +"couratari", +"courb", +"courbache", +"courbaril", +"courbash", +"courge", +"courida", +"courier", +"couril", +"courlan", +"Cours", +"course", +"coursed", +"courser", +"coursing", +"court", +"courtbred", +"courtcraft", +"courteous", +"courteously", +"courteousness", +"courtepy", +"courter", +"courtesan", +"courtesanry", +"courtesanship", +"courtesy", +"courtezanry", +"courtezanship", +"courthouse", +"courtier", +"courtierism", +"courtierly", +"courtiership", +"courtin", +"courtless", +"courtlet", +"courtlike", +"courtliness", +"courtling", +"courtly", +"courtman", +"courtroom", +"courtship", +"courtyard", +"courtzilite", +"couscous", +"couscousou", +"couseranite", +"cousin", +"cousinage", +"cousiness", +"cousinhood", +"cousinly", +"cousinry", +"cousinship", +"cousiny", +"coussinet", +"coustumier", +"coutel", +"coutelle", +"couter", +"Coutet", +"couth", +"couthie", +"couthily", +"couthiness", +"couthless", +"coutil", +"coutumier", +"couvade", +"couxia", +"covado", +"covalence", +"covalent", +"Covarecan", +"Covarecas", +"covariable", +"covariance", +"covariant", +"covariation", +"covassal", +"cove", +"coved", +"covelline", +"covellite", +"covenant", +"covenantal", +"covenanted", +"covenantee", +"Covenanter", +"covenanter", +"covenanting", +"covenantor", +"covent", +"coventrate", +"coventrize", +"Coventry", +"cover", +"coverage", +"coveralls", +"coverchief", +"covercle", +"covered", +"coverer", +"covering", +"coverless", +"coverlet", +"coverlid", +"coversed", +"coverside", +"coversine", +"coverslut", +"covert", +"covertical", +"covertly", +"covertness", +"coverture", +"covet", +"covetable", +"coveter", +"coveting", +"covetingly", +"covetiveness", +"covetous", +"covetously", +"covetousness", +"covey", +"covibrate", +"covibration", +"covid", +"Coviello", +"covillager", +"Covillea", +"covin", +"coving", +"covinous", +"covinously", +"covisit", +"covisitor", +"covite", +"covolume", +"covotary", +"cow", +"cowal", +"Cowan", +"coward", +"cowardice", +"cowardliness", +"cowardly", +"cowardness", +"cowardy", +"cowbane", +"cowbell", +"cowberry", +"cowbind", +"cowbird", +"cowboy", +"cowcatcher", +"cowdie", +"coween", +"cower", +"cowfish", +"cowgate", +"cowgram", +"cowhage", +"cowheart", +"cowhearted", +"cowheel", +"cowherb", +"cowherd", +"cowhide", +"cowhiding", +"cowhorn", +"Cowichan", +"cowish", +"cowitch", +"cowkeeper", +"cowl", +"cowle", +"cowled", +"cowleech", +"cowleeching", +"cowlick", +"cowlicks", +"cowlike", +"cowling", +"Cowlitz", +"cowlstaff", +"cowman", +"cowpath", +"cowpea", +"cowpen", +"Cowperian", +"cowperitis", +"cowpock", +"cowpox", +"cowpuncher", +"cowquake", +"cowrie", +"cowroid", +"cowshed", +"cowskin", +"cowslip", +"cowslipped", +"cowsucker", +"cowtail", +"cowthwort", +"cowtongue", +"cowweed", +"cowwheat", +"cowy", +"cowyard", +"cox", +"coxa", +"coxal", +"coxalgia", +"coxalgic", +"coxankylometer", +"coxarthritis", +"coxarthrocace", +"coxarthropathy", +"coxbones", +"coxcomb", +"coxcombess", +"coxcombhood", +"coxcombic", +"coxcombical", +"coxcombicality", +"coxcombically", +"coxcombity", +"coxcombry", +"coxcomby", +"coxcomical", +"coxcomically", +"coxite", +"coxitis", +"coxocerite", +"coxoceritic", +"coxodynia", +"coxofemoral", +"coxopodite", +"coxswain", +"coxy", +"coy", +"coyan", +"coydog", +"coyish", +"coyishness", +"coyly", +"coyness", +"coynye", +"coyo", +"coyol", +"coyote", +"Coyotero", +"coyotillo", +"coyoting", +"coypu", +"coyure", +"coz", +"coze", +"cozen", +"cozenage", +"cozener", +"cozening", +"cozeningly", +"cozier", +"cozily", +"coziness", +"cozy", +"crab", +"crabbed", +"crabbedly", +"crabbedness", +"crabber", +"crabbery", +"crabbing", +"crabby", +"crabcatcher", +"crabeater", +"craber", +"crabhole", +"crablet", +"crablike", +"crabman", +"crabmill", +"crabsidle", +"crabstick", +"crabweed", +"crabwise", +"crabwood", +"Cracca", +"Cracidae", +"Cracinae", +"crack", +"crackable", +"crackajack", +"crackbrain", +"crackbrained", +"crackbrainedness", +"crackdown", +"cracked", +"crackedness", +"cracker", +"crackerberry", +"crackerjack", +"crackers", +"crackhemp", +"crackiness", +"cracking", +"crackjaw", +"crackle", +"crackled", +"crackless", +"crackleware", +"crackling", +"crackly", +"crackmans", +"cracknel", +"crackpot", +"crackskull", +"cracksman", +"cracky", +"cracovienne", +"craddy", +"cradge", +"cradle", +"cradleboard", +"cradlechild", +"cradlefellow", +"cradleland", +"cradlelike", +"cradlemaker", +"cradlemaking", +"cradleman", +"cradlemate", +"cradler", +"cradleside", +"cradlesong", +"cradletime", +"cradling", +"Cradock", +"craft", +"craftily", +"craftiness", +"craftless", +"craftsman", +"craftsmanship", +"craftsmaster", +"craftswoman", +"craftwork", +"craftworker", +"crafty", +"crag", +"craggan", +"cragged", +"craggedness", +"craggily", +"cragginess", +"craggy", +"craglike", +"cragsman", +"cragwork", +"craichy", +"craigmontite", +"crain", +"craisey", +"craizey", +"crajuru", +"crake", +"crakefeet", +"crakow", +"cram", +"cramasie", +"crambambulee", +"crambambuli", +"Crambe", +"crambe", +"cramberry", +"crambid", +"Crambidae", +"Crambinae", +"cramble", +"crambly", +"crambo", +"Crambus", +"crammer", +"cramp", +"cramped", +"crampedness", +"cramper", +"crampet", +"crampfish", +"cramping", +"crampingly", +"crampon", +"cramponnee", +"crampy", +"cran", +"cranage", +"cranberry", +"crance", +"crandall", +"crandallite", +"crane", +"cranelike", +"craneman", +"craner", +"cranesman", +"craneway", +"craney", +"Crania", +"crania", +"craniacromial", +"craniad", +"cranial", +"cranially", +"cranian", +"Craniata", +"craniate", +"cranic", +"craniectomy", +"craniocele", +"craniocerebral", +"cranioclasis", +"cranioclasm", +"cranioclast", +"cranioclasty", +"craniodidymus", +"craniofacial", +"craniognomic", +"craniognomy", +"craniognosy", +"craniograph", +"craniographer", +"craniography", +"craniological", +"craniologically", +"craniologist", +"craniology", +"craniomalacia", +"craniomaxillary", +"craniometer", +"craniometric", +"craniometrical", +"craniometrically", +"craniometrist", +"craniometry", +"craniopagus", +"craniopathic", +"craniopathy", +"craniopharyngeal", +"craniophore", +"cranioplasty", +"craniopuncture", +"craniorhachischisis", +"craniosacral", +"cranioschisis", +"cranioscopical", +"cranioscopist", +"cranioscopy", +"craniospinal", +"craniostenosis", +"craniostosis", +"Craniota", +"craniotabes", +"craniotome", +"craniotomy", +"craniotopography", +"craniotympanic", +"craniovertebral", +"cranium", +"crank", +"crankbird", +"crankcase", +"cranked", +"cranker", +"crankery", +"crankily", +"crankiness", +"crankle", +"crankless", +"crankly", +"crankman", +"crankous", +"crankpin", +"crankshaft", +"crankum", +"cranky", +"crannage", +"crannied", +"crannock", +"crannog", +"crannoger", +"cranny", +"cranreuch", +"crantara", +"crants", +"crap", +"crapaud", +"crapaudine", +"crape", +"crapefish", +"crapehanger", +"crapelike", +"crappie", +"crappin", +"crapple", +"crappo", +"craps", +"crapshooter", +"crapulate", +"crapulence", +"crapulent", +"crapulous", +"crapulously", +"crapulousness", +"crapy", +"craquelure", +"crare", +"crash", +"crasher", +"crasis", +"craspedal", +"craspedodromous", +"craspedon", +"Craspedota", +"craspedotal", +"craspedote", +"crass", +"crassamentum", +"crassier", +"crassilingual", +"Crassina", +"crassitude", +"crassly", +"crassness", +"Crassula", +"Crassulaceae", +"crassulaceous", +"Crataegus", +"Crataeva", +"cratch", +"cratchens", +"cratches", +"crate", +"crateful", +"cratemaker", +"cratemaking", +"crateman", +"crater", +"crateral", +"cratered", +"Craterellus", +"Craterid", +"crateriform", +"crateris", +"craterkin", +"craterless", +"craterlet", +"craterlike", +"craterous", +"craticular", +"Cratinean", +"cratometer", +"cratometric", +"cratometry", +"craunch", +"craunching", +"craunchingly", +"cravat", +"crave", +"craven", +"Cravenette", +"cravenette", +"cravenhearted", +"cravenly", +"cravenness", +"craver", +"craving", +"cravingly", +"cravingness", +"cravo", +"craw", +"crawberry", +"crawdad", +"crawfish", +"crawfoot", +"crawful", +"crawl", +"crawler", +"crawlerize", +"crawley", +"crawleyroot", +"crawling", +"crawlingly", +"crawlsome", +"crawly", +"crawm", +"crawtae", +"Crawthumper", +"Crax", +"crayer", +"crayfish", +"crayon", +"crayonist", +"crayonstone", +"craze", +"crazed", +"crazedly", +"crazedness", +"crazily", +"craziness", +"crazingmill", +"crazy", +"crazycat", +"crazyweed", +"crea", +"creagh", +"creaght", +"creak", +"creaker", +"creakily", +"creakiness", +"creakingly", +"creaky", +"cream", +"creambush", +"creamcake", +"creamcup", +"creamer", +"creamery", +"creameryman", +"creamfruit", +"creamily", +"creaminess", +"creamless", +"creamlike", +"creammaker", +"creammaking", +"creamometer", +"creamsacs", +"creamware", +"creamy", +"creance", +"creancer", +"creant", +"crease", +"creaseless", +"creaser", +"creashaks", +"creasing", +"creasy", +"creat", +"creatable", +"create", +"createdness", +"creatic", +"creatine", +"creatinephosphoric", +"creatinine", +"creatininemia", +"creatinuria", +"creation", +"creational", +"creationary", +"creationism", +"creationist", +"creationistic", +"creative", +"creatively", +"creativeness", +"creativity", +"creatophagous", +"creator", +"creatorhood", +"creatorrhea", +"creatorship", +"creatotoxism", +"creatress", +"creatrix", +"creatural", +"creature", +"creaturehood", +"creatureless", +"creatureliness", +"creatureling", +"creaturely", +"creatureship", +"creaturize", +"crebricostate", +"crebrisulcate", +"crebrity", +"crebrous", +"creche", +"creddock", +"credence", +"credencive", +"credenciveness", +"credenda", +"credensive", +"credensiveness", +"credent", +"credential", +"credently", +"credenza", +"credibility", +"credible", +"credibleness", +"credibly", +"credit", +"creditability", +"creditable", +"creditableness", +"creditably", +"creditive", +"creditless", +"creditor", +"creditorship", +"creditress", +"creditrix", +"crednerite", +"Credo", +"credulity", +"credulous", +"credulously", +"credulousness", +"Cree", +"cree", +"creed", +"creedal", +"creedalism", +"creedalist", +"creeded", +"creedist", +"creedite", +"creedless", +"creedlessness", +"creedmore", +"creedsman", +"Creek", +"creek", +"creeker", +"creekfish", +"creekside", +"creekstuff", +"creeky", +"creel", +"creeler", +"creem", +"creen", +"creep", +"creepage", +"creeper", +"creepered", +"creeperless", +"creephole", +"creepie", +"creepiness", +"creeping", +"creepingly", +"creepmouse", +"creepmousy", +"creepy", +"creese", +"creesh", +"creeshie", +"creeshy", +"creirgist", +"cremaster", +"cremasterial", +"cremasteric", +"cremate", +"cremation", +"cremationism", +"cremationist", +"cremator", +"crematorial", +"crematorium", +"crematory", +"crembalum", +"cremnophobia", +"cremocarp", +"cremometer", +"cremone", +"cremor", +"cremorne", +"cremule", +"crena", +"crenate", +"crenated", +"crenately", +"crenation", +"crenature", +"crenel", +"crenelate", +"crenelated", +"crenelation", +"crenele", +"creneled", +"crenelet", +"crenellate", +"crenellation", +"crenic", +"crenitic", +"crenology", +"crenotherapy", +"Crenothrix", +"crenula", +"crenulate", +"crenulated", +"crenulation", +"creodont", +"Creodonta", +"creole", +"creoleize", +"creolian", +"Creolin", +"creolism", +"creolization", +"creolize", +"creophagia", +"creophagism", +"creophagist", +"creophagous", +"creophagy", +"creosol", +"creosote", +"creosoter", +"creosotic", +"crepance", +"crepe", +"crepehanger", +"Crepidula", +"crepine", +"crepiness", +"Crepis", +"crepitaculum", +"crepitant", +"crepitate", +"crepitation", +"crepitous", +"crepitus", +"crepon", +"crept", +"crepuscle", +"crepuscular", +"crepuscule", +"crepusculine", +"crepusculum", +"crepy", +"cresamine", +"crescendo", +"crescent", +"crescentade", +"crescentader", +"Crescentia", +"crescentic", +"crescentiform", +"crescentlike", +"crescentoid", +"crescentwise", +"crescive", +"crescograph", +"crescographic", +"cresegol", +"cresol", +"cresolin", +"cresorcinol", +"cresotate", +"cresotic", +"cresotinic", +"cresoxide", +"cresoxy", +"cresphontes", +"cress", +"cressed", +"cresselle", +"cresset", +"Cressida", +"cresson", +"cressweed", +"cresswort", +"cressy", +"crest", +"crested", +"crestfallen", +"crestfallenly", +"crestfallenness", +"cresting", +"crestless", +"crestline", +"crestmoreite", +"cresyl", +"cresylate", +"cresylene", +"cresylic", +"cresylite", +"creta", +"Cretaceous", +"cretaceous", +"cretaceously", +"Cretacic", +"Cretan", +"Crete", +"cretefaction", +"Cretic", +"cretic", +"cretification", +"cretify", +"cretin", +"cretinic", +"cretinism", +"cretinization", +"cretinize", +"cretinoid", +"cretinous", +"cretion", +"cretionary", +"Cretism", +"cretonne", +"crevalle", +"crevasse", +"crevice", +"creviced", +"crew", +"crewel", +"crewelist", +"crewellery", +"crewelwork", +"crewer", +"crewless", +"crewman", +"Crex", +"crib", +"cribbage", +"cribber", +"cribbing", +"cribble", +"cribellum", +"cribo", +"cribral", +"cribrate", +"cribrately", +"cribration", +"cribriform", +"cribrose", +"cribwork", +"cric", +"Cricetidae", +"cricetine", +"Cricetus", +"crick", +"cricket", +"cricketer", +"cricketing", +"crickety", +"crickey", +"crickle", +"cricoarytenoid", +"cricoid", +"cricopharyngeal", +"cricothyreoid", +"cricothyreotomy", +"cricothyroid", +"cricothyroidean", +"cricotomy", +"cricotracheotomy", +"Cricotus", +"cried", +"crier", +"criey", +"crig", +"crile", +"crime", +"Crimean", +"crimeful", +"crimeless", +"crimelessness", +"crimeproof", +"criminal", +"criminaldom", +"criminalese", +"criminalism", +"criminalist", +"criminalistic", +"criminalistician", +"criminalistics", +"criminality", +"criminally", +"criminalness", +"criminaloid", +"criminate", +"crimination", +"criminative", +"criminator", +"criminatory", +"crimine", +"criminogenesis", +"criminogenic", +"criminologic", +"criminological", +"criminologist", +"criminology", +"criminosis", +"criminous", +"criminously", +"criminousness", +"crimogenic", +"crimp", +"crimpage", +"crimper", +"crimping", +"crimple", +"crimpness", +"crimpy", +"crimson", +"crimsonly", +"crimsonness", +"crimsony", +"crin", +"crinal", +"crinanite", +"crinated", +"crinatory", +"crine", +"crined", +"crinet", +"cringe", +"cringeling", +"cringer", +"cringing", +"cringingly", +"cringingness", +"cringle", +"crinicultural", +"criniculture", +"criniferous", +"Criniger", +"crinigerous", +"criniparous", +"crinite", +"crinitory", +"crinivorous", +"crink", +"crinkle", +"crinkleroot", +"crinkly", +"crinoid", +"crinoidal", +"Crinoidea", +"crinoidean", +"crinoline", +"crinose", +"crinosity", +"crinula", +"Crinum", +"criobolium", +"criocephalus", +"Crioceras", +"crioceratite", +"crioceratitic", +"Crioceris", +"criophore", +"Criophoros", +"criosphinx", +"cripes", +"crippingly", +"cripple", +"crippledom", +"crippleness", +"crippler", +"crippling", +"cripply", +"crises", +"crisic", +"crisis", +"crisp", +"crispate", +"crispated", +"crispation", +"crispature", +"crisped", +"crisper", +"crispily", +"Crispin", +"crispine", +"crispiness", +"crisping", +"crisply", +"crispness", +"crispy", +"criss", +"crissal", +"crisscross", +"crissum", +"crista", +"cristate", +"Cristatella", +"cristiform", +"Cristineaux", +"Cristino", +"Cristispira", +"Cristivomer", +"cristobalite", +"critch", +"criteria", +"criteriology", +"criterion", +"criterional", +"criterium", +"crith", +"Crithidia", +"crithmene", +"crithomancy", +"critic", +"critical", +"criticality", +"critically", +"criticalness", +"criticaster", +"criticasterism", +"criticastry", +"criticisable", +"criticism", +"criticist", +"criticizable", +"criticize", +"criticizer", +"criticizingly", +"critickin", +"criticship", +"criticule", +"critique", +"critling", +"crizzle", +"cro", +"croak", +"Croaker", +"croaker", +"croakily", +"croakiness", +"croaky", +"Croat", +"Croatan", +"Croatian", +"croc", +"Crocanthemum", +"crocard", +"croceic", +"crocein", +"croceine", +"croceous", +"crocetin", +"croche", +"crochet", +"crocheter", +"crocheting", +"croci", +"crocidolite", +"Crocidura", +"crocin", +"crock", +"crocker", +"crockery", +"crockeryware", +"crocket", +"crocketed", +"crocky", +"crocodile", +"Crocodilia", +"crocodilian", +"Crocodilidae", +"crocodiline", +"crocodilite", +"crocodiloid", +"Crocodilus", +"Crocodylidae", +"Crocodylus", +"crocoisite", +"crocoite", +"croconate", +"croconic", +"Crocosmia", +"Crocus", +"crocus", +"crocused", +"croft", +"crofter", +"crofterization", +"crofterize", +"crofting", +"croftland", +"croisette", +"croissante", +"Crokinole", +"Crom", +"cromaltite", +"crome", +"Cromer", +"Cromerian", +"cromfordite", +"cromlech", +"cromorna", +"cromorne", +"Cromwell", +"Cromwellian", +"Cronartium", +"crone", +"croneberry", +"cronet", +"Cronian", +"cronish", +"cronk", +"cronkness", +"cronstedtite", +"crony", +"crood", +"croodle", +"crook", +"crookback", +"crookbacked", +"crookbill", +"crookbilled", +"crooked", +"crookedly", +"crookedness", +"crooken", +"crookesite", +"crookfingered", +"crookheaded", +"crookkneed", +"crookle", +"crooklegged", +"crookneck", +"crooknecked", +"crooknosed", +"crookshouldered", +"crooksided", +"crooksterned", +"crooktoothed", +"crool", +"Croomia", +"croon", +"crooner", +"crooning", +"crooningly", +"crop", +"crophead", +"cropland", +"cropman", +"croppa", +"cropper", +"croppie", +"cropplecrown", +"croppy", +"cropshin", +"cropsick", +"cropsickness", +"cropweed", +"croquet", +"croquette", +"crore", +"crosa", +"Crosby", +"crosier", +"crosiered", +"crosnes", +"cross", +"crossability", +"crossable", +"crossarm", +"crossband", +"crossbar", +"crossbeak", +"crossbeam", +"crossbelt", +"crossbill", +"crossbolt", +"crossbolted", +"crossbones", +"crossbow", +"crossbowman", +"crossbred", +"crossbreed", +"crosscurrent", +"crosscurrented", +"crosscut", +"crosscutter", +"crosscutting", +"crosse", +"crossed", +"crosser", +"crossette", +"crossfall", +"crossfish", +"crossflow", +"crossflower", +"crossfoot", +"crosshackle", +"crosshand", +"crosshatch", +"crosshaul", +"crosshauling", +"crosshead", +"crossing", +"crossite", +"crossjack", +"crosslegs", +"crosslet", +"crossleted", +"crosslight", +"crosslighted", +"crossline", +"crossly", +"crossness", +"crossopodia", +"crossopterygian", +"Crossopterygii", +"Crossosoma", +"Crossosomataceae", +"crossosomataceous", +"crossover", +"crosspatch", +"crosspath", +"crosspiece", +"crosspoint", +"crossrail", +"crossroad", +"crossroads", +"crossrow", +"crossruff", +"crosstail", +"crosstie", +"crosstied", +"crosstoes", +"crosstrack", +"crosstree", +"crosswalk", +"crossway", +"crossways", +"crossweb", +"crossweed", +"crosswise", +"crossword", +"crosswort", +"crostarie", +"crotal", +"Crotalaria", +"crotalic", +"Crotalidae", +"crotaliform", +"Crotalinae", +"crotaline", +"crotalism", +"crotalo", +"crotaloid", +"crotalum", +"Crotalus", +"crotaphic", +"crotaphion", +"crotaphite", +"crotaphitic", +"Crotaphytus", +"crotch", +"crotched", +"crotchet", +"crotcheteer", +"crotchetiness", +"crotchety", +"crotchy", +"crotin", +"Croton", +"crotonaldehyde", +"crotonate", +"crotonic", +"crotonization", +"crotonyl", +"crotonylene", +"Crotophaga", +"crottels", +"crottle", +"crotyl", +"crouch", +"crouchant", +"crouched", +"croucher", +"crouching", +"crouchingly", +"crounotherapy", +"croup", +"croupade", +"croupal", +"croupe", +"crouperbush", +"croupier", +"croupily", +"croupiness", +"croupous", +"croupy", +"crouse", +"crousely", +"crout", +"croute", +"crouton", +"crow", +"crowbait", +"crowbar", +"crowberry", +"crowbill", +"crowd", +"crowded", +"crowdedly", +"crowdedness", +"crowder", +"crowdweed", +"crowdy", +"crower", +"crowflower", +"crowfoot", +"crowfooted", +"crowhop", +"crowing", +"crowingly", +"crowkeeper", +"crowl", +"crown", +"crownbeard", +"crowned", +"crowner", +"crownless", +"crownlet", +"crownling", +"crownmaker", +"crownwork", +"crownwort", +"crowshay", +"crowstep", +"crowstepped", +"crowstick", +"crowstone", +"crowtoe", +"croy", +"croyden", +"croydon", +"croze", +"crozer", +"crozzle", +"crozzly", +"crubeen", +"cruce", +"cruces", +"crucethouse", +"cruche", +"crucial", +"cruciality", +"crucially", +"crucian", +"Crucianella", +"cruciate", +"cruciately", +"cruciation", +"crucible", +"Crucibulum", +"crucifer", +"Cruciferae", +"cruciferous", +"crucificial", +"crucified", +"crucifier", +"crucifix", +"crucifixion", +"cruciform", +"cruciformity", +"cruciformly", +"crucify", +"crucigerous", +"crucilly", +"crucily", +"cruck", +"crude", +"crudely", +"crudeness", +"crudity", +"crudwort", +"cruel", +"cruelhearted", +"cruelize", +"cruelly", +"cruelness", +"cruels", +"cruelty", +"cruent", +"cruentation", +"cruet", +"cruety", +"cruise", +"cruiser", +"cruisken", +"cruive", +"cruller", +"crum", +"crumb", +"crumbable", +"crumbcloth", +"crumber", +"crumble", +"crumblement", +"crumblet", +"crumbliness", +"crumblingness", +"crumblings", +"crumbly", +"crumby", +"crumen", +"crumenal", +"crumlet", +"crummie", +"crummier", +"crummiest", +"crummock", +"crummy", +"crump", +"crumper", +"crumpet", +"crumple", +"crumpled", +"crumpler", +"crumpling", +"crumply", +"crumpy", +"crunch", +"crunchable", +"crunchiness", +"crunching", +"crunchingly", +"crunchingness", +"crunchweed", +"crunchy", +"crunk", +"crunkle", +"crunodal", +"crunode", +"crunt", +"cruor", +"crupper", +"crural", +"crureus", +"crurogenital", +"cruroinguinal", +"crurotarsal", +"crus", +"crusade", +"crusader", +"crusado", +"Crusca", +"cruse", +"crush", +"crushability", +"crushable", +"crushed", +"crusher", +"crushing", +"crushingly", +"crusie", +"crusily", +"crust", +"crusta", +"Crustacea", +"crustaceal", +"crustacean", +"crustaceological", +"crustaceologist", +"crustaceology", +"crustaceous", +"crustade", +"crustal", +"crustalogical", +"crustalogist", +"crustalogy", +"crustate", +"crustated", +"crustation", +"crusted", +"crustedly", +"cruster", +"crustific", +"crustification", +"crustily", +"crustiness", +"crustless", +"crustose", +"crustosis", +"crusty", +"crutch", +"crutched", +"crutcher", +"crutching", +"crutchlike", +"cruth", +"crutter", +"crux", +"cruzeiro", +"cry", +"cryable", +"cryaesthesia", +"cryalgesia", +"cryanesthesia", +"crybaby", +"cryesthesia", +"crying", +"cryingly", +"crymodynia", +"crymotherapy", +"cryoconite", +"cryogen", +"cryogenic", +"cryogenics", +"cryogeny", +"cryohydrate", +"cryohydric", +"cryolite", +"cryometer", +"cryophile", +"cryophilic", +"cryophoric", +"cryophorus", +"cryophyllite", +"cryophyte", +"cryoplankton", +"cryoscope", +"cryoscopic", +"cryoscopy", +"cryosel", +"cryostase", +"cryostat", +"crypt", +"crypta", +"cryptal", +"cryptamnesia", +"cryptamnesic", +"cryptanalysis", +"cryptanalyst", +"cryptarch", +"cryptarchy", +"crypted", +"Crypteronia", +"Crypteroniaceae", +"cryptesthesia", +"cryptesthetic", +"cryptic", +"cryptical", +"cryptically", +"cryptoagnostic", +"cryptobatholithic", +"cryptobranch", +"Cryptobranchia", +"Cryptobranchiata", +"cryptobranchiate", +"Cryptobranchidae", +"Cryptobranchus", +"cryptocarp", +"cryptocarpic", +"cryptocarpous", +"Cryptocarya", +"Cryptocephala", +"cryptocephalous", +"Cryptocerata", +"cryptocerous", +"cryptoclastic", +"Cryptocleidus", +"cryptococci", +"cryptococcic", +"Cryptococcus", +"cryptococcus", +"cryptocommercial", +"cryptocrystalline", +"cryptocrystallization", +"cryptodeist", +"Cryptodira", +"cryptodiran", +"cryptodire", +"cryptodirous", +"cryptodouble", +"cryptodynamic", +"cryptogam", +"Cryptogamia", +"cryptogamian", +"cryptogamic", +"cryptogamical", +"cryptogamist", +"cryptogamous", +"cryptogamy", +"cryptogenetic", +"cryptogenic", +"cryptogenous", +"Cryptoglaux", +"cryptoglioma", +"cryptogram", +"Cryptogramma", +"cryptogrammatic", +"cryptogrammatical", +"cryptogrammatist", +"cryptogrammic", +"cryptograph", +"cryptographal", +"cryptographer", +"cryptographic", +"cryptographical", +"cryptographically", +"cryptographist", +"cryptography", +"cryptoheresy", +"cryptoheretic", +"cryptoinflationist", +"cryptolite", +"cryptologist", +"cryptology", +"cryptolunatic", +"cryptomere", +"Cryptomeria", +"cryptomerous", +"cryptomnesia", +"cryptomnesic", +"cryptomonad", +"Cryptomonadales", +"Cryptomonadina", +"cryptonema", +"Cryptonemiales", +"cryptoneurous", +"cryptonym", +"cryptonymous", +"cryptopapist", +"cryptoperthite", +"Cryptophagidae", +"cryptophthalmos", +"Cryptophyceae", +"cryptophyte", +"cryptopine", +"cryptoporticus", +"Cryptoprocta", +"cryptoproselyte", +"cryptoproselytism", +"cryptopyic", +"cryptopyrrole", +"cryptorchid", +"cryptorchidism", +"cryptorchis", +"Cryptorhynchus", +"cryptorrhesis", +"cryptorrhetic", +"cryptoscope", +"cryptoscopy", +"cryptosplenetic", +"Cryptostegia", +"cryptostoma", +"Cryptostomata", +"cryptostomate", +"cryptostome", +"Cryptotaenia", +"cryptous", +"cryptovalence", +"cryptovalency", +"cryptozonate", +"Cryptozonia", +"cryptozygosity", +"cryptozygous", +"Crypturi", +"Crypturidae", +"crystal", +"crystallic", +"crystalliferous", +"crystalliform", +"crystalligerous", +"crystallin", +"crystalline", +"crystallinity", +"crystallite", +"crystallitic", +"crystallitis", +"crystallizability", +"crystallizable", +"crystallization", +"crystallize", +"crystallized", +"crystallizer", +"crystalloblastic", +"crystallochemical", +"crystallochemistry", +"crystallogenesis", +"crystallogenetic", +"crystallogenic", +"crystallogenical", +"crystallogeny", +"crystallogram", +"crystallographer", +"crystallographic", +"crystallographical", +"crystallographically", +"crystallography", +"crystalloid", +"crystalloidal", +"crystallology", +"crystalloluminescence", +"crystallomagnetic", +"crystallomancy", +"crystallometric", +"crystallometry", +"crystallophyllian", +"crystallose", +"crystallurgy", +"crystalwort", +"crystic", +"crystograph", +"crystoleum", +"Crystolon", +"crystosphene", +"csardas", +"Ctenacanthus", +"ctene", +"ctenidial", +"ctenidium", +"cteniform", +"Ctenocephalus", +"ctenocyst", +"ctenodactyl", +"Ctenodipterini", +"ctenodont", +"Ctenodontidae", +"Ctenodus", +"ctenoid", +"ctenoidean", +"Ctenoidei", +"ctenoidian", +"ctenolium", +"Ctenophora", +"ctenophoral", +"ctenophoran", +"ctenophore", +"ctenophoric", +"ctenophorous", +"Ctenoplana", +"Ctenostomata", +"ctenostomatous", +"ctenostome", +"ctetology", +"cuadra", +"Cuailnge", +"cuapinole", +"cuarenta", +"cuarta", +"cuarteron", +"cuartilla", +"cuartillo", +"cub", +"Cuba", +"cubage", +"Cuban", +"cubangle", +"cubanite", +"Cubanize", +"cubatory", +"cubature", +"cubbing", +"cubbish", +"cubbishly", +"cubbishness", +"cubby", +"cubbyhole", +"cubbyhouse", +"cubbyyew", +"cubdom", +"cube", +"cubeb", +"cubelet", +"Cubelium", +"cuber", +"cubhood", +"cubi", +"cubic", +"cubica", +"cubical", +"cubically", +"cubicalness", +"cubicity", +"cubicle", +"cubicly", +"cubicone", +"cubicontravariant", +"cubicovariant", +"cubicular", +"cubiculum", +"cubiform", +"cubism", +"cubist", +"cubit", +"cubital", +"cubitale", +"cubited", +"cubitiere", +"cubito", +"cubitocarpal", +"cubitocutaneous", +"cubitodigital", +"cubitometacarpal", +"cubitopalmar", +"cubitoplantar", +"cubitoradial", +"cubitus", +"cubmaster", +"cubocalcaneal", +"cuboctahedron", +"cubocube", +"cubocuneiform", +"cubododecahedral", +"cuboid", +"cuboidal", +"cuboides", +"cubomancy", +"Cubomedusae", +"cubomedusan", +"cubometatarsal", +"cubonavicular", +"Cuchan", +"Cuchulainn", +"cuck", +"cuckhold", +"cuckold", +"cuckoldom", +"cuckoldry", +"cuckoldy", +"cuckoo", +"cuckooflower", +"cuckoomaid", +"cuckoopint", +"cuckoopintle", +"cuckstool", +"cucoline", +"Cucujid", +"Cucujidae", +"Cucujus", +"Cuculi", +"Cuculidae", +"cuculiform", +"Cuculiformes", +"cuculine", +"cuculla", +"cucullaris", +"cucullate", +"cucullately", +"cuculliform", +"cucullus", +"cuculoid", +"Cuculus", +"Cucumaria", +"Cucumariidae", +"cucumber", +"cucumiform", +"Cucumis", +"cucurbit", +"Cucurbita", +"Cucurbitaceae", +"cucurbitaceous", +"cucurbite", +"cucurbitine", +"cud", +"cudava", +"cudbear", +"cudden", +"cuddle", +"cuddleable", +"cuddlesome", +"cuddly", +"Cuddy", +"cuddy", +"cuddyhole", +"cudgel", +"cudgeler", +"cudgerie", +"cudweed", +"cue", +"cueball", +"cueca", +"cueist", +"cueman", +"cuemanship", +"cuerda", +"cuesta", +"Cueva", +"cuff", +"cuffer", +"cuffin", +"cuffy", +"cuffyism", +"cuggermugger", +"cuichunchulli", +"cuinage", +"cuir", +"cuirass", +"cuirassed", +"cuirassier", +"cuisinary", +"cuisine", +"cuissard", +"cuissart", +"cuisse", +"cuissen", +"cuisten", +"Cuitlateco", +"cuittikin", +"Cujam", +"cuke", +"Culavamsa", +"culbut", +"Culdee", +"culebra", +"culet", +"culeus", +"Culex", +"culgee", +"culicid", +"Culicidae", +"culicidal", +"culicide", +"culiciform", +"culicifugal", +"culicifuge", +"Culicinae", +"culicine", +"Culicoides", +"culilawan", +"culinarily", +"culinary", +"cull", +"culla", +"cullage", +"Cullen", +"culler", +"cullet", +"culling", +"cullion", +"cullis", +"cully", +"culm", +"culmen", +"culmicolous", +"culmiferous", +"culmigenous", +"culminal", +"culminant", +"culminate", +"culmination", +"culmy", +"culotte", +"culottes", +"culottic", +"culottism", +"culpa", +"culpability", +"culpable", +"culpableness", +"culpably", +"culpatory", +"culpose", +"culprit", +"cult", +"cultch", +"cultellation", +"cultellus", +"culteranismo", +"cultic", +"cultigen", +"cultirostral", +"Cultirostres", +"cultish", +"cultism", +"cultismo", +"cultist", +"cultivability", +"cultivable", +"cultivably", +"cultivar", +"cultivatability", +"cultivatable", +"cultivate", +"cultivated", +"cultivation", +"cultivator", +"cultrate", +"cultrated", +"cultriform", +"cultrirostral", +"Cultrirostres", +"cultual", +"culturable", +"cultural", +"culturally", +"culture", +"cultured", +"culturine", +"culturist", +"culturization", +"culturize", +"culturological", +"culturologically", +"culturologist", +"culturology", +"cultus", +"culver", +"culverfoot", +"culverhouse", +"culverin", +"culverineer", +"culverkey", +"culvert", +"culvertage", +"culverwort", +"cum", +"Cumacea", +"cumacean", +"cumaceous", +"Cumaean", +"cumal", +"cumaldehyde", +"Cumanagoto", +"cumaphyte", +"cumaphytic", +"cumaphytism", +"Cumar", +"cumay", +"cumbent", +"cumber", +"cumberer", +"cumberlandite", +"cumberless", +"cumberment", +"cumbersome", +"cumbersomely", +"cumbersomeness", +"cumberworld", +"cumbha", +"cumbly", +"cumbraite", +"cumbrance", +"cumbre", +"Cumbrian", +"cumbrous", +"cumbrously", +"cumbrousness", +"cumbu", +"cumene", +"cumengite", +"cumenyl", +"cumflutter", +"cumhal", +"cumic", +"cumidin", +"cumidine", +"cumin", +"cuminal", +"cuminic", +"cuminoin", +"cuminol", +"cuminole", +"cuminseed", +"cuminyl", +"cummer", +"cummerbund", +"cummin", +"cummingtonite", +"cumol", +"cump", +"cumshaw", +"cumulant", +"cumular", +"cumulate", +"cumulately", +"cumulation", +"cumulatist", +"cumulative", +"cumulatively", +"cumulativeness", +"cumuli", +"cumuliform", +"cumulite", +"cumulophyric", +"cumulose", +"cumulous", +"cumulus", +"cumyl", +"Cuna", +"cunabular", +"Cunan", +"Cunarder", +"Cunas", +"cunctation", +"cunctatious", +"cunctative", +"cunctator", +"cunctatorship", +"cunctatury", +"cunctipotent", +"cundeamor", +"cuneal", +"cuneate", +"cuneately", +"cuneatic", +"cuneator", +"cuneiform", +"cuneiformist", +"cuneocuboid", +"cuneonavicular", +"cuneoscaphoid", +"cunette", +"cuneus", +"cungeboi", +"cunicular", +"cuniculus", +"cunila", +"cunjah", +"cunjer", +"cunjevoi", +"cunner", +"cunnilinctus", +"cunnilingus", +"cunning", +"Cunninghamia", +"cunningly", +"cunningness", +"Cunonia", +"Cunoniaceae", +"cunoniaceous", +"cunye", +"Cunza", +"Cuon", +"cuorin", +"cup", +"Cupania", +"cupay", +"cupbearer", +"cupboard", +"cupcake", +"cupel", +"cupeler", +"cupellation", +"cupflower", +"cupful", +"Cuphea", +"cuphead", +"cupholder", +"Cupid", +"cupidinous", +"cupidity", +"cupidon", +"cupidone", +"cupless", +"cupmaker", +"cupmaking", +"cupman", +"cupmate", +"cupola", +"cupolaman", +"cupolar", +"cupolated", +"cupped", +"cupper", +"cupping", +"cuppy", +"cuprammonia", +"cuprammonium", +"cupreine", +"cuprene", +"cupreous", +"Cupressaceae", +"cupressineous", +"Cupressinoxylon", +"Cupressus", +"cupric", +"cupride", +"cupriferous", +"cuprite", +"cuproammonium", +"cuprobismutite", +"cuprocyanide", +"cuprodescloizite", +"cuproid", +"cuproiodargyrite", +"cupromanganese", +"cupronickel", +"cuproplumbite", +"cuproscheelite", +"cuprose", +"cuprosilicon", +"cuprotungstite", +"cuprous", +"cuprum", +"cupseed", +"cupstone", +"cupula", +"cupulate", +"cupule", +"Cupuliferae", +"cupuliferous", +"cupuliform", +"cur", +"curability", +"curable", +"curableness", +"curably", +"curacao", +"curacy", +"curare", +"curarine", +"curarization", +"curarize", +"curassow", +"curatage", +"curate", +"curatel", +"curateship", +"curatess", +"curatial", +"curatic", +"curation", +"curative", +"curatively", +"curativeness", +"curatize", +"curatolatry", +"curator", +"curatorial", +"curatorium", +"curatorship", +"curatory", +"curatrix", +"Curavecan", +"curb", +"curbable", +"curber", +"curbing", +"curbless", +"curblike", +"curbstone", +"curbstoner", +"curby", +"curcas", +"curch", +"curcuddoch", +"Curculio", +"curculionid", +"Curculionidae", +"curculionist", +"Curcuma", +"curcumin", +"curd", +"curdiness", +"curdle", +"curdler", +"curdly", +"curdwort", +"curdy", +"cure", +"cureless", +"curelessly", +"curemaster", +"curer", +"curettage", +"curette", +"curettement", +"curfew", +"curial", +"curialism", +"curialist", +"curialistic", +"curiality", +"curiate", +"Curiatii", +"curiboca", +"curie", +"curiescopy", +"curietherapy", +"curin", +"curine", +"curing", +"curio", +"curiologic", +"curiologically", +"curiologics", +"curiology", +"curiomaniac", +"curiosa", +"curiosity", +"curioso", +"curious", +"curiously", +"curiousness", +"curite", +"Curitis", +"curium", +"curl", +"curled", +"curledly", +"curledness", +"curler", +"curlew", +"curlewberry", +"curlicue", +"curliewurly", +"curlike", +"curlily", +"curliness", +"curling", +"curlingly", +"curlpaper", +"curly", +"curlycue", +"curlyhead", +"curlylocks", +"curmudgeon", +"curmudgeonery", +"curmudgeonish", +"curmudgeonly", +"curmurring", +"curn", +"curney", +"curnock", +"curple", +"curr", +"currach", +"currack", +"curragh", +"currant", +"curratow", +"currawang", +"currency", +"current", +"currently", +"currentness", +"currentwise", +"curricle", +"curricula", +"curricular", +"curricularization", +"curricularize", +"curriculum", +"curried", +"currier", +"curriery", +"currish", +"currishly", +"currishness", +"curry", +"currycomb", +"curryfavel", +"Cursa", +"cursal", +"curse", +"cursed", +"cursedly", +"cursedness", +"curser", +"curship", +"cursitor", +"cursive", +"cursively", +"cursiveness", +"cursor", +"cursorary", +"Cursores", +"Cursoria", +"cursorial", +"Cursoriidae", +"cursorily", +"cursoriness", +"cursorious", +"Cursorius", +"cursory", +"curst", +"curstful", +"curstfully", +"curstly", +"curstness", +"cursus", +"curt", +"curtail", +"curtailed", +"curtailedly", +"curtailer", +"curtailment", +"curtain", +"curtaining", +"curtainless", +"curtainwise", +"curtal", +"Curtana", +"curtate", +"curtation", +"curtesy", +"curtilage", +"Curtise", +"curtly", +"curtness", +"curtsy", +"curua", +"curuba", +"Curucaneca", +"Curucanecan", +"curucucu", +"curule", +"Curuminaca", +"Curuminacan", +"Curupira", +"cururo", +"curvaceous", +"curvaceousness", +"curvacious", +"curvant", +"curvate", +"curvation", +"curvature", +"curve", +"curved", +"curvedly", +"curvedness", +"curver", +"curvesome", +"curvesomeness", +"curvet", +"curvicaudate", +"curvicostate", +"curvidentate", +"curvifoliate", +"curviform", +"curvilineal", +"curvilinear", +"curvilinearity", +"curvilinearly", +"curvimeter", +"curvinervate", +"curvinerved", +"curvirostral", +"Curvirostres", +"curviserial", +"curvital", +"curvity", +"curvograph", +"curvometer", +"curvous", +"curvulate", +"curvy", +"curwhibble", +"curwillet", +"cuscohygrine", +"cusconine", +"Cuscus", +"cuscus", +"Cuscuta", +"Cuscutaceae", +"cuscutaceous", +"cusec", +"cuselite", +"cush", +"cushag", +"cushat", +"cushaw", +"cushewbird", +"cushion", +"cushioned", +"cushionflower", +"cushionless", +"cushionlike", +"cushiony", +"Cushite", +"Cushitic", +"cushlamochree", +"cushy", +"cusie", +"cusinero", +"cusk", +"cusp", +"cuspal", +"cusparidine", +"cusparine", +"cuspate", +"cusped", +"cuspid", +"cuspidal", +"cuspidate", +"cuspidation", +"cuspidine", +"cuspidor", +"cuspule", +"cuss", +"cussed", +"cussedly", +"cussedness", +"cusser", +"cusso", +"custard", +"custerite", +"custodee", +"custodes", +"custodial", +"custodiam", +"custodian", +"custodianship", +"custodier", +"custody", +"custom", +"customable", +"customarily", +"customariness", +"customary", +"customer", +"customhouse", +"customs", +"custumal", +"cut", +"cutaneal", +"cutaneous", +"cutaneously", +"cutaway", +"cutback", +"cutch", +"cutcher", +"cutcherry", +"cute", +"cutely", +"cuteness", +"Cuterebra", +"Cuthbert", +"cutheal", +"cuticle", +"cuticolor", +"cuticula", +"cuticular", +"cuticularization", +"cuticularize", +"cuticulate", +"cutidure", +"cutie", +"cutification", +"cutigeral", +"cutin", +"cutinization", +"cutinize", +"cutireaction", +"cutis", +"cutisector", +"Cutiterebra", +"cutitis", +"cutization", +"cutlass", +"cutler", +"cutleress", +"Cutleria", +"Cutleriaceae", +"cutleriaceous", +"Cutleriales", +"cutlery", +"cutlet", +"cutling", +"cutlips", +"cutocellulose", +"cutoff", +"cutout", +"cutover", +"cutpurse", +"cuttable", +"cuttage", +"cuttail", +"cuttanee", +"cutted", +"cutter", +"cutterhead", +"cutterman", +"cutthroat", +"cutting", +"cuttingly", +"cuttingness", +"cuttle", +"cuttlebone", +"cuttlefish", +"cuttler", +"cuttoo", +"cutty", +"cuttyhunk", +"cutup", +"cutwater", +"cutweed", +"cutwork", +"cutworm", +"cuvette", +"Cuvierian", +"cuvy", +"cuya", +"Cuzceno", +"cwierc", +"cwm", +"cyamelide", +"Cyamus", +"cyan", +"cyanacetic", +"cyanamide", +"cyananthrol", +"Cyanastraceae", +"Cyanastrum", +"cyanate", +"cyanaurate", +"cyanauric", +"cyanbenzyl", +"cyancarbonic", +"Cyanea", +"cyanean", +"cyanemia", +"cyaneous", +"cyanephidrosis", +"cyanformate", +"cyanformic", +"cyanhidrosis", +"cyanhydrate", +"cyanhydric", +"cyanhydrin", +"cyanic", +"cyanicide", +"cyanidation", +"cyanide", +"cyanidin", +"cyanidine", +"cyanidrosis", +"cyanimide", +"cyanin", +"cyanine", +"cyanite", +"cyanize", +"cyanmethemoglobin", +"cyanoacetate", +"cyanoacetic", +"cyanoaurate", +"cyanoauric", +"cyanobenzene", +"cyanocarbonic", +"cyanochlorous", +"cyanochroia", +"cyanochroic", +"Cyanocitta", +"cyanocrystallin", +"cyanoderma", +"cyanogen", +"cyanogenesis", +"cyanogenetic", +"cyanogenic", +"cyanoguanidine", +"cyanohermidin", +"cyanohydrin", +"cyanol", +"cyanole", +"cyanomaclurin", +"cyanometer", +"cyanomethaemoglobin", +"cyanomethemoglobin", +"cyanometric", +"cyanometry", +"cyanopathic", +"cyanopathy", +"cyanophile", +"cyanophilous", +"cyanophoric", +"cyanophose", +"Cyanophyceae", +"cyanophycean", +"cyanophyceous", +"cyanophycin", +"cyanopia", +"cyanoplastid", +"cyanoplatinite", +"cyanoplatinous", +"cyanopsia", +"cyanose", +"cyanosed", +"cyanosis", +"Cyanospiza", +"cyanotic", +"cyanotrichite", +"cyanotype", +"cyanuramide", +"cyanurate", +"cyanuret", +"cyanuric", +"cyanurine", +"cyanus", +"cyaphenine", +"cyath", +"Cyathaspis", +"Cyathea", +"Cyatheaceae", +"cyatheaceous", +"cyathiform", +"cyathium", +"cyathoid", +"cyatholith", +"Cyathophyllidae", +"cyathophylline", +"cyathophylloid", +"Cyathophyllum", +"cyathos", +"cyathozooid", +"cyathus", +"cybernetic", +"cyberneticist", +"cybernetics", +"Cybister", +"cycad", +"Cycadaceae", +"cycadaceous", +"Cycadales", +"cycadean", +"cycadeoid", +"Cycadeoidea", +"cycadeous", +"cycadiform", +"cycadlike", +"cycadofilicale", +"Cycadofilicales", +"Cycadofilices", +"cycadofilicinean", +"Cycadophyta", +"Cycas", +"Cycladic", +"cyclamen", +"cyclamin", +"cyclamine", +"cyclammonium", +"cyclane", +"Cyclanthaceae", +"cyclanthaceous", +"Cyclanthales", +"Cyclanthus", +"cyclar", +"cyclarthrodial", +"cyclarthrsis", +"cyclas", +"cycle", +"cyclecar", +"cycledom", +"cyclene", +"cycler", +"cyclesmith", +"Cycliae", +"cyclian", +"cyclic", +"cyclical", +"cyclically", +"cyclicism", +"cyclide", +"cycling", +"cyclism", +"cyclist", +"cyclistic", +"cyclitic", +"cyclitis", +"cyclization", +"cyclize", +"cycloalkane", +"Cyclobothra", +"cyclobutane", +"cyclocoelic", +"cyclocoelous", +"Cycloconium", +"cyclodiolefin", +"cycloganoid", +"Cycloganoidei", +"cyclogram", +"cyclograph", +"cyclographer", +"cycloheptane", +"cycloheptanone", +"cyclohexane", +"cyclohexanol", +"cyclohexanone", +"cyclohexene", +"cyclohexyl", +"cycloid", +"cycloidal", +"cycloidally", +"cycloidean", +"Cycloidei", +"cycloidian", +"cycloidotrope", +"cyclolith", +"Cycloloma", +"cyclomania", +"cyclometer", +"cyclometric", +"cyclometrical", +"cyclometry", +"Cyclomyaria", +"cyclomyarian", +"cyclonal", +"cyclone", +"cyclonic", +"cyclonical", +"cyclonically", +"cyclonist", +"cyclonite", +"cyclonologist", +"cyclonology", +"cyclonometer", +"cyclonoscope", +"cycloolefin", +"cycloparaffin", +"cyclope", +"Cyclopean", +"cyclopean", +"cyclopedia", +"cyclopedic", +"cyclopedical", +"cyclopedically", +"cyclopedist", +"cyclopentadiene", +"cyclopentane", +"cyclopentanone", +"cyclopentene", +"Cyclopes", +"cyclopes", +"cyclophoria", +"cyclophoric", +"Cyclophorus", +"cyclophrenia", +"cyclopia", +"Cyclopic", +"cyclopism", +"cyclopite", +"cycloplegia", +"cycloplegic", +"cyclopoid", +"cyclopropane", +"Cyclops", +"Cyclopteridae", +"cyclopteroid", +"cyclopterous", +"cyclopy", +"cyclorama", +"cycloramic", +"Cyclorrhapha", +"cyclorrhaphous", +"cycloscope", +"cyclose", +"cyclosis", +"cyclospermous", +"Cyclospondyli", +"cyclospondylic", +"cyclospondylous", +"Cyclosporales", +"Cyclosporeae", +"Cyclosporinae", +"cyclosporous", +"Cyclostoma", +"Cyclostomata", +"cyclostomate", +"Cyclostomatidae", +"cyclostomatous", +"cyclostome", +"Cyclostomes", +"Cyclostomi", +"Cyclostomidae", +"cyclostomous", +"cyclostrophic", +"cyclostyle", +"Cyclotella", +"cyclothem", +"cyclothure", +"cyclothurine", +"Cyclothurus", +"cyclothyme", +"cyclothymia", +"cyclothymiac", +"cyclothymic", +"cyclotome", +"cyclotomic", +"cyclotomy", +"Cyclotosaurus", +"cyclotron", +"cyclovertebral", +"cyclus", +"Cydippe", +"cydippian", +"cydippid", +"Cydippida", +"Cydonia", +"Cydonian", +"cydonium", +"cyesiology", +"cyesis", +"cygneous", +"cygnet", +"Cygnid", +"Cygninae", +"cygnine", +"Cygnus", +"cyke", +"cylinder", +"cylindered", +"cylinderer", +"cylinderlike", +"cylindraceous", +"cylindrarthrosis", +"Cylindrella", +"cylindrelloid", +"cylindrenchyma", +"cylindric", +"cylindrical", +"cylindricality", +"cylindrically", +"cylindricalness", +"cylindricity", +"cylindricule", +"cylindriform", +"cylindrite", +"cylindrocellular", +"cylindrocephalic", +"cylindroconical", +"cylindroconoidal", +"cylindrocylindric", +"cylindrodendrite", +"cylindrograph", +"cylindroid", +"cylindroidal", +"cylindroma", +"cylindromatous", +"cylindrometric", +"cylindroogival", +"Cylindrophis", +"Cylindrosporium", +"cylindruria", +"cylix", +"Cyllenian", +"Cyllenius", +"cyllosis", +"cyma", +"cymagraph", +"cymaphen", +"cymaphyte", +"cymaphytic", +"cymaphytism", +"cymar", +"cymation", +"cymatium", +"cymba", +"cymbaeform", +"cymbal", +"Cymbalaria", +"cymbaleer", +"cymbaler", +"cymbaline", +"cymbalist", +"cymballike", +"cymbalo", +"cymbalon", +"cymbate", +"Cymbella", +"cymbiform", +"Cymbium", +"cymbling", +"cymbocephalic", +"cymbocephalous", +"cymbocephaly", +"Cymbopogon", +"cyme", +"cymelet", +"cymene", +"cymiferous", +"cymling", +"Cymodoceaceae", +"cymogene", +"cymograph", +"cymographic", +"cymoid", +"Cymoidium", +"cymometer", +"cymophane", +"cymophanous", +"cymophenol", +"cymoscope", +"cymose", +"cymosely", +"cymotrichous", +"cymotrichy", +"cymous", +"Cymraeg", +"Cymric", +"Cymry", +"cymule", +"cymulose", +"cynanche", +"Cynanchum", +"cynanthropy", +"Cynara", +"cynaraceous", +"cynarctomachy", +"cynareous", +"cynaroid", +"cynebot", +"cynegetic", +"cynegetics", +"cynegild", +"cynhyena", +"Cynias", +"cyniatria", +"cyniatrics", +"cynic", +"cynical", +"cynically", +"cynicalness", +"cynicism", +"cynicist", +"cynipid", +"Cynipidae", +"cynipidous", +"cynipoid", +"Cynipoidea", +"Cynips", +"cynism", +"cynocephalic", +"cynocephalous", +"cynocephalus", +"cynoclept", +"Cynocrambaceae", +"cynocrambaceous", +"Cynocrambe", +"Cynodon", +"cynodont", +"Cynodontia", +"Cynogale", +"cynogenealogist", +"cynogenealogy", +"Cynoglossum", +"Cynognathus", +"cynography", +"cynoid", +"Cynoidea", +"cynology", +"Cynomoriaceae", +"cynomoriaceous", +"Cynomorium", +"Cynomorpha", +"cynomorphic", +"cynomorphous", +"Cynomys", +"cynophile", +"cynophilic", +"cynophilist", +"cynophobe", +"cynophobia", +"Cynopithecidae", +"cynopithecoid", +"cynopodous", +"cynorrhodon", +"Cynosarges", +"Cynoscion", +"Cynosura", +"cynosural", +"cynosure", +"Cynosurus", +"cynotherapy", +"Cynoxylon", +"Cynthia", +"Cynthian", +"Cynthiidae", +"Cynthius", +"cyp", +"Cyperaceae", +"cyperaceous", +"Cyperus", +"cyphella", +"cyphellate", +"Cyphomandra", +"cyphonautes", +"cyphonism", +"Cypraea", +"cypraeid", +"Cypraeidae", +"cypraeiform", +"cypraeoid", +"cypre", +"cypres", +"cypress", +"cypressed", +"cypressroot", +"Cypria", +"Cyprian", +"Cyprididae", +"Cypridina", +"Cypridinidae", +"cypridinoid", +"Cyprina", +"cyprine", +"cyprinid", +"Cyprinidae", +"cypriniform", +"cyprinine", +"cyprinodont", +"Cyprinodontes", +"Cyprinodontidae", +"cyprinodontoid", +"cyprinoid", +"Cyprinoidea", +"cyprinoidean", +"Cyprinus", +"Cypriote", +"Cypripedium", +"Cypris", +"cypsela", +"Cypseli", +"Cypselid", +"Cypselidae", +"cypseliform", +"Cypseliformes", +"cypseline", +"cypseloid", +"cypselomorph", +"Cypselomorphae", +"cypselomorphic", +"cypselous", +"Cypselus", +"cyptozoic", +"Cyrano", +"Cyrenaic", +"Cyrenaicism", +"Cyrenian", +"Cyril", +"Cyrilla", +"Cyrillaceae", +"cyrillaceous", +"Cyrillian", +"Cyrillianism", +"Cyrillic", +"cyriologic", +"cyriological", +"Cyrtandraceae", +"Cyrtidae", +"cyrtoceracone", +"Cyrtoceras", +"cyrtoceratite", +"cyrtoceratitic", +"cyrtograph", +"cyrtolite", +"cyrtometer", +"Cyrtomium", +"cyrtopia", +"cyrtosis", +"Cyrus", +"cyrus", +"cyst", +"cystadenoma", +"cystadenosarcoma", +"cystal", +"cystalgia", +"cystamine", +"cystaster", +"cystatrophia", +"cystatrophy", +"cystectasia", +"cystectasy", +"cystectomy", +"cysted", +"cysteine", +"cysteinic", +"cystelcosis", +"cystenchyma", +"cystenchymatous", +"cystencyte", +"cysterethism", +"cystic", +"cysticarpic", +"cysticarpium", +"cysticercoid", +"cysticercoidal", +"cysticercosis", +"cysticercus", +"cysticolous", +"cystid", +"Cystidea", +"cystidean", +"cystidicolous", +"cystidium", +"cystiferous", +"cystiform", +"cystigerous", +"Cystignathidae", +"cystignathine", +"cystine", +"cystinuria", +"cystirrhea", +"cystis", +"cystitis", +"cystitome", +"cystoadenoma", +"cystocarcinoma", +"cystocarp", +"cystocarpic", +"cystocele", +"cystocolostomy", +"cystocyte", +"cystodynia", +"cystoelytroplasty", +"cystoenterocele", +"cystoepiplocele", +"cystoepithelioma", +"cystofibroma", +"Cystoflagellata", +"cystoflagellate", +"cystogenesis", +"cystogenous", +"cystogram", +"cystoid", +"Cystoidea", +"cystoidean", +"cystolith", +"cystolithectomy", +"cystolithiasis", +"cystolithic", +"cystoma", +"cystomatous", +"cystomorphous", +"cystomyoma", +"cystomyxoma", +"Cystonectae", +"cystonectous", +"cystonephrosis", +"cystoneuralgia", +"cystoparalysis", +"Cystophora", +"cystophore", +"cystophotography", +"cystophthisis", +"cystoplasty", +"cystoplegia", +"cystoproctostomy", +"Cystopteris", +"cystoptosis", +"Cystopus", +"cystopyelitis", +"cystopyelography", +"cystopyelonephritis", +"cystoradiography", +"cystorrhagia", +"cystorrhaphy", +"cystorrhea", +"cystosarcoma", +"cystoschisis", +"cystoscope", +"cystoscopic", +"cystoscopy", +"cystose", +"cystospasm", +"cystospastic", +"cystospore", +"cystostomy", +"cystosyrinx", +"cystotome", +"cystotomy", +"cystotrachelotomy", +"cystoureteritis", +"cystourethritis", +"cystous", +"cytase", +"cytasic", +"Cytherea", +"Cytherean", +"Cytherella", +"Cytherellidae", +"Cytinaceae", +"cytinaceous", +"Cytinus", +"cytioderm", +"cytisine", +"Cytisus", +"cytitis", +"cytoblast", +"cytoblastema", +"cytoblastemal", +"cytoblastematous", +"cytoblastemic", +"cytoblastemous", +"cytochemistry", +"cytochrome", +"cytochylema", +"cytocide", +"cytoclasis", +"cytoclastic", +"cytococcus", +"cytocyst", +"cytode", +"cytodendrite", +"cytoderm", +"cytodiagnosis", +"cytodieresis", +"cytodieretic", +"cytogamy", +"cytogene", +"cytogenesis", +"cytogenetic", +"cytogenetical", +"cytogenetically", +"cytogeneticist", +"cytogenetics", +"cytogenic", +"cytogenous", +"cytogeny", +"cytoglobin", +"cytohyaloplasm", +"cytoid", +"cytokinesis", +"cytolist", +"cytologic", +"cytological", +"cytologically", +"cytologist", +"cytology", +"cytolymph", +"cytolysin", +"cytolysis", +"cytolytic", +"cytoma", +"cytomere", +"cytometer", +"cytomicrosome", +"cytomitome", +"cytomorphosis", +"cyton", +"cytoparaplastin", +"cytopathologic", +"cytopathological", +"cytopathologically", +"cytopathology", +"Cytophaga", +"cytophagous", +"cytophagy", +"cytopharynx", +"cytophil", +"cytophysics", +"cytophysiology", +"cytoplasm", +"cytoplasmic", +"cytoplast", +"cytoplastic", +"cytoproct", +"cytopyge", +"cytoreticulum", +"cytoryctes", +"cytosine", +"cytosome", +"Cytospora", +"Cytosporina", +"cytost", +"cytostomal", +"cytostome", +"cytostroma", +"cytostromatic", +"cytotactic", +"cytotaxis", +"cytotoxic", +"cytotoxin", +"cytotrophoblast", +"cytotrophy", +"cytotropic", +"cytotropism", +"cytozoic", +"cytozoon", +"cytozymase", +"cytozyme", +"cytula", +"Cyzicene", +"cyzicene", +"czar", +"czardas", +"czardom", +"czarevitch", +"czarevna", +"czarian", +"czaric", +"czarina", +"czarinian", +"czarish", +"czarism", +"czarist", +"czaristic", +"czaritza", +"czarowitch", +"czarowitz", +"czarship", +"Czech", +"Czechic", +"Czechish", +"Czechization", +"Czechoslovak", +"Czechoslovakian", +"D", +"d", +"da", +"daalder", +"dab", +"dabb", +"dabba", +"dabber", +"dabble", +"dabbler", +"dabbling", +"dabblingly", +"dabblingness", +"dabby", +"dabchick", +"Dabih", +"Dabitis", +"dablet", +"daboia", +"daboya", +"dabster", +"dace", +"Dacelo", +"Daceloninae", +"dacelonine", +"dachshound", +"dachshund", +"Dacian", +"dacite", +"dacitic", +"dacker", +"dacoit", +"dacoitage", +"dacoity", +"dacryadenalgia", +"dacryadenitis", +"dacryagogue", +"dacrycystalgia", +"Dacrydium", +"dacryelcosis", +"dacryoadenalgia", +"dacryoadenitis", +"dacryoblenorrhea", +"dacryocele", +"dacryocyst", +"dacryocystalgia", +"dacryocystitis", +"dacryocystoblennorrhea", +"dacryocystocele", +"dacryocystoptosis", +"dacryocystorhinostomy", +"dacryocystosyringotomy", +"dacryocystotome", +"dacryocystotomy", +"dacryohelcosis", +"dacryohemorrhea", +"dacryolite", +"dacryolith", +"dacryolithiasis", +"dacryoma", +"dacryon", +"dacryops", +"dacryopyorrhea", +"dacryopyosis", +"dacryosolenitis", +"dacryostenosis", +"dacryosyrinx", +"dacryuria", +"Dactyl", +"dactyl", +"dactylar", +"dactylate", +"dactylic", +"dactylically", +"dactylioglyph", +"dactylioglyphic", +"dactylioglyphist", +"dactylioglyphtic", +"dactylioglyphy", +"dactyliographer", +"dactyliographic", +"dactyliography", +"dactyliology", +"dactyliomancy", +"dactylion", +"dactyliotheca", +"Dactylis", +"dactylist", +"dactylitic", +"dactylitis", +"dactylogram", +"dactylograph", +"dactylographic", +"dactylography", +"dactyloid", +"dactylology", +"dactylomegaly", +"dactylonomy", +"dactylopatagium", +"Dactylopius", +"dactylopodite", +"dactylopore", +"Dactylopteridae", +"Dactylopterus", +"dactylorhiza", +"dactyloscopic", +"dactyloscopy", +"dactylose", +"dactylosternal", +"dactylosymphysis", +"dactylotheca", +"dactylous", +"dactylozooid", +"dactylus", +"Dacus", +"dacyorrhea", +"dad", +"Dada", +"dada", +"Dadaism", +"Dadaist", +"dadap", +"Dadayag", +"dadder", +"daddle", +"daddock", +"daddocky", +"daddy", +"daddynut", +"dade", +"dadenhudd", +"dado", +"Dadoxylon", +"Dadu", +"daduchus", +"Dadupanthi", +"dae", +"Daedal", +"daedal", +"Daedalea", +"Daedalean", +"Daedalian", +"Daedalic", +"Daedalidae", +"Daedalist", +"daedaloid", +"Daedalus", +"daemon", +"Daemonelix", +"daemonic", +"daemonurgist", +"daemonurgy", +"daemony", +"daer", +"daff", +"daffery", +"daffing", +"daffish", +"daffle", +"daffodil", +"daffodilly", +"daffy", +"daffydowndilly", +"Dafla", +"daft", +"daftberry", +"daftlike", +"daftly", +"daftness", +"dag", +"dagaba", +"dagame", +"dagassa", +"Dagbamba", +"Dagbane", +"dagesh", +"Dagestan", +"dagga", +"dagger", +"daggerbush", +"daggered", +"daggerlike", +"daggerproof", +"daggers", +"daggle", +"daggletail", +"daggletailed", +"daggly", +"daggy", +"daghesh", +"daglock", +"Dagmar", +"Dago", +"dagoba", +"Dagomba", +"dags", +"Daguerrean", +"daguerreotype", +"daguerreotyper", +"daguerreotypic", +"daguerreotypist", +"daguerreotypy", +"dah", +"dahabeah", +"Dahlia", +"Dahoman", +"Dahomeyan", +"dahoon", +"Daibutsu", +"daidle", +"daidly", +"Daijo", +"daiker", +"daikon", +"Dail", +"Dailamite", +"dailiness", +"daily", +"daimen", +"daimiate", +"daimio", +"daimon", +"daimonic", +"daimonion", +"daimonistic", +"daimonology", +"dain", +"daincha", +"dainteth", +"daintify", +"daintihood", +"daintily", +"daintiness", +"daintith", +"dainty", +"Daira", +"daira", +"dairi", +"dairy", +"dairying", +"dairymaid", +"dairyman", +"dairywoman", +"dais", +"daisied", +"daisy", +"daisybush", +"daitya", +"daiva", +"dak", +"daker", +"Dakhini", +"dakir", +"Dakota", +"daktylon", +"daktylos", +"dal", +"dalar", +"Dalarnian", +"Dalbergia", +"Dalcassian", +"dale", +"Dalea", +"Dalecarlian", +"daleman", +"daler", +"dalesfolk", +"dalesman", +"dalespeople", +"daleswoman", +"daleth", +"dali", +"Dalibarda", +"dalk", +"dallack", +"dalle", +"dalles", +"dalliance", +"dallier", +"dally", +"dallying", +"dallyingly", +"Dalmania", +"Dalmanites", +"Dalmatian", +"Dalmatic", +"dalmatic", +"Dalradian", +"dalt", +"dalteen", +"dalton", +"Daltonian", +"Daltonic", +"Daltonism", +"Daltonist", +"dam", +"dama", +"damage", +"damageability", +"damageable", +"damageableness", +"damageably", +"damagement", +"damager", +"damages", +"damagingly", +"daman", +"Damara", +"Damascene", +"damascene", +"damascened", +"damascener", +"damascenine", +"Damascus", +"damask", +"damaskeen", +"damasse", +"damassin", +"Damayanti", +"dambonitol", +"dambose", +"dambrod", +"dame", +"damenization", +"damewort", +"Damgalnunna", +"Damia", +"damiana", +"Damianist", +"damie", +"damier", +"damine", +"damkjernite", +"damlike", +"dammar", +"Dammara", +"damme", +"dammer", +"dammish", +"damn", +"damnability", +"damnable", +"damnableness", +"damnably", +"damnation", +"damnatory", +"damned", +"damner", +"damnification", +"damnify", +"Damnii", +"damning", +"damningly", +"damningness", +"damnonians", +"Damnonii", +"damnous", +"damnously", +"Damoclean", +"Damocles", +"Damoetas", +"damoiseau", +"Damon", +"damonico", +"damourite", +"damp", +"dampang", +"damped", +"dampen", +"dampener", +"damper", +"damping", +"dampish", +"dampishly", +"dampishness", +"damply", +"dampness", +"dampproof", +"dampproofer", +"dampproofing", +"dampy", +"damsel", +"damselfish", +"damselhood", +"damson", +"Dan", +"dan", +"Danaan", +"Danagla", +"Danai", +"Danaid", +"danaid", +"Danaidae", +"danaide", +"Danaidean", +"Danainae", +"danaine", +"Danais", +"danaite", +"Danakil", +"danalite", +"danburite", +"dancalite", +"dance", +"dancer", +"danceress", +"dancery", +"dancette", +"dancing", +"dancingly", +"dand", +"danda", +"dandelion", +"dander", +"dandiacal", +"dandiacally", +"dandically", +"dandification", +"dandify", +"dandilly", +"dandily", +"dandiprat", +"dandizette", +"dandle", +"dandler", +"dandling", +"dandlingly", +"dandruff", +"dandruffy", +"dandy", +"dandydom", +"dandyish", +"dandyism", +"dandyize", +"dandyling", +"Dane", +"Daneball", +"Daneflower", +"Danegeld", +"Danelaw", +"Daneweed", +"Danewort", +"dang", +"danger", +"dangerful", +"dangerfully", +"dangerless", +"dangerous", +"dangerously", +"dangerousness", +"dangersome", +"dangle", +"dangleberry", +"danglement", +"dangler", +"danglin", +"dangling", +"danglingly", +"Danian", +"Danic", +"danicism", +"Daniel", +"Danielic", +"Daniglacial", +"danio", +"Danish", +"Danism", +"Danite", +"Danization", +"Danize", +"dank", +"Dankali", +"dankish", +"dankishness", +"dankly", +"dankness", +"danli", +"Dannebrog", +"dannemorite", +"danner", +"dannock", +"danoranja", +"dansant", +"danseuse", +"danta", +"Dantean", +"Dantesque", +"Danthonia", +"Dantist", +"Dantology", +"Dantomania", +"danton", +"Dantonesque", +"Dantonist", +"Dantophilist", +"Dantophily", +"Danube", +"Danubian", +"Danuri", +"Danzig", +"Danziger", +"dao", +"daoine", +"dap", +"Dapedium", +"Dapedius", +"Daphnaceae", +"Daphne", +"Daphnean", +"Daphnephoria", +"daphnetin", +"Daphnia", +"daphnin", +"daphnioid", +"Daphnis", +"daphnoid", +"dapicho", +"dapico", +"dapifer", +"dapper", +"dapperling", +"dapperly", +"dapperness", +"dapple", +"dappled", +"dar", +"darabukka", +"darac", +"daraf", +"Darapti", +"darat", +"darbha", +"darby", +"Darbyism", +"Darbyite", +"Dard", +"Dardan", +"dardanarius", +"Dardani", +"dardanium", +"dardaol", +"Dardic", +"Dardistan", +"dare", +"dareall", +"daredevil", +"daredevilism", +"daredevilry", +"daredeviltry", +"dareful", +"darer", +"Dares", +"daresay", +"darg", +"dargah", +"darger", +"Darghin", +"Dargo", +"dargsman", +"dargue", +"dari", +"daribah", +"daric", +"Darien", +"Darii", +"daring", +"daringly", +"daringness", +"dariole", +"Darius", +"Darjeeling", +"dark", +"darken", +"darkener", +"darkening", +"darkful", +"darkhearted", +"darkheartedness", +"darkish", +"darkishness", +"darkle", +"darkling", +"darklings", +"darkly", +"darkmans", +"darkness", +"darkroom", +"darkskin", +"darksome", +"darksomeness", +"darky", +"darling", +"darlingly", +"darlingness", +"Darlingtonia", +"darn", +"darnation", +"darned", +"darnel", +"darner", +"darnex", +"darning", +"daroga", +"daroo", +"darr", +"darrein", +"darshana", +"Darsonval", +"Darsonvalism", +"darst", +"dart", +"Dartagnan", +"dartars", +"dartboard", +"darter", +"darting", +"dartingly", +"dartingness", +"dartle", +"dartlike", +"dartman", +"Dartmoor", +"dartoic", +"dartoid", +"dartos", +"dartre", +"dartrose", +"dartrous", +"darts", +"dartsman", +"Darwinian", +"Darwinical", +"Darwinically", +"Darwinism", +"Darwinist", +"Darwinistic", +"Darwinite", +"Darwinize", +"darzee", +"das", +"Daschagga", +"dash", +"dashboard", +"dashed", +"dashedly", +"dashee", +"dasheen", +"dasher", +"dashing", +"dashingly", +"dashmaker", +"Dashnak", +"Dashnakist", +"Dashnaktzutiun", +"dashplate", +"dashpot", +"dashwheel", +"dashy", +"dasi", +"Dasiphora", +"dasnt", +"dassie", +"dassy", +"dastard", +"dastardize", +"dastardliness", +"dastardly", +"dastur", +"dasturi", +"Dasya", +"Dasyatidae", +"Dasyatis", +"Dasycladaceae", +"dasycladaceous", +"Dasylirion", +"dasymeter", +"dasypaedal", +"dasypaedes", +"dasypaedic", +"Dasypeltis", +"dasyphyllous", +"Dasypodidae", +"dasypodoid", +"Dasyprocta", +"Dasyproctidae", +"dasyproctine", +"Dasypus", +"Dasystephana", +"dasyure", +"Dasyuridae", +"dasyurine", +"dasyuroid", +"Dasyurus", +"Dasyus", +"data", +"datable", +"datableness", +"datably", +"dataria", +"datary", +"datch", +"datcha", +"date", +"dateless", +"datemark", +"dater", +"datil", +"dating", +"dation", +"Datisca", +"Datiscaceae", +"datiscaceous", +"datiscetin", +"datiscin", +"datiscoside", +"Datisi", +"Datism", +"datival", +"dative", +"datively", +"dativogerundial", +"datolite", +"datolitic", +"dattock", +"datum", +"Datura", +"daturic", +"daturism", +"daub", +"daube", +"Daubentonia", +"Daubentoniidae", +"dauber", +"daubery", +"daubing", +"daubingly", +"daubreeite", +"daubreelite", +"daubster", +"dauby", +"Daucus", +"daud", +"daughter", +"daughterhood", +"daughterkin", +"daughterless", +"daughterlike", +"daughterliness", +"daughterling", +"daughterly", +"daughtership", +"Daulias", +"daunch", +"dauncy", +"Daunii", +"daunt", +"daunter", +"daunting", +"dauntingly", +"dauntingness", +"dauntless", +"dauntlessly", +"dauntlessness", +"daunton", +"dauphin", +"dauphine", +"dauphiness", +"Daur", +"Dauri", +"daut", +"dautie", +"dauw", +"davach", +"Davallia", +"Dave", +"daven", +"davenport", +"daver", +"daverdy", +"David", +"Davidian", +"Davidic", +"Davidical", +"Davidist", +"davidsonite", +"Daviesia", +"daviesite", +"davit", +"davoch", +"Davy", +"davy", +"davyne", +"daw", +"dawdle", +"dawdler", +"dawdling", +"dawdlingly", +"dawdy", +"dawish", +"dawkin", +"dawn", +"dawning", +"dawnlight", +"dawnlike", +"dawnstreak", +"dawnward", +"dawny", +"Dawsonia", +"Dawsoniaceae", +"dawsoniaceous", +"dawsonite", +"dawtet", +"dawtit", +"dawut", +"day", +"dayabhaga", +"Dayakker", +"dayal", +"daybeam", +"dayberry", +"dayblush", +"daybook", +"daybreak", +"daydawn", +"daydream", +"daydreamer", +"daydreamy", +"daydrudge", +"dayflower", +"dayfly", +"daygoing", +"dayless", +"daylight", +"daylit", +"daylong", +"dayman", +"daymare", +"daymark", +"dayroom", +"days", +"dayshine", +"daysman", +"dayspring", +"daystar", +"daystreak", +"daytale", +"daytide", +"daytime", +"daytimes", +"dayward", +"daywork", +"dayworker", +"daywrit", +"Daza", +"daze", +"dazed", +"dazedly", +"dazedness", +"dazement", +"dazingly", +"dazy", +"dazzle", +"dazzlement", +"dazzler", +"dazzlingly", +"de", +"deacetylate", +"deacetylation", +"deacidification", +"deacidify", +"deacon", +"deaconal", +"deaconate", +"deaconess", +"deaconhood", +"deaconize", +"deaconry", +"deaconship", +"deactivate", +"deactivation", +"dead", +"deadbeat", +"deadborn", +"deadcenter", +"deaden", +"deadener", +"deadening", +"deader", +"deadeye", +"deadfall", +"deadhead", +"deadheadism", +"deadhearted", +"deadheartedly", +"deadheartedness", +"deadhouse", +"deading", +"deadish", +"deadishly", +"deadishness", +"deadlatch", +"deadlight", +"deadlily", +"deadline", +"deadliness", +"deadlock", +"deadly", +"deadman", +"deadmelt", +"deadness", +"deadpan", +"deadpay", +"deadtongue", +"deadwood", +"deadwort", +"deaerate", +"deaeration", +"deaerator", +"deaf", +"deafen", +"deafening", +"deafeningly", +"deafforest", +"deafforestation", +"deafish", +"deafly", +"deafness", +"deair", +"deal", +"dealable", +"dealate", +"dealated", +"dealation", +"dealbate", +"dealbation", +"dealbuminize", +"dealcoholist", +"dealcoholization", +"dealcoholize", +"dealer", +"dealerdom", +"dealership", +"dealfish", +"dealing", +"dealkalize", +"dealkylate", +"dealkylation", +"dealt", +"deambulation", +"deambulatory", +"deamidase", +"deamidate", +"deamidation", +"deamidization", +"deamidize", +"deaminase", +"deaminate", +"deamination", +"deaminization", +"deaminize", +"deammonation", +"dean", +"deanathematize", +"deaner", +"deanery", +"deaness", +"deanimalize", +"deanship", +"deanthropomorphic", +"deanthropomorphism", +"deanthropomorphization", +"deanthropomorphize", +"deappetizing", +"deaquation", +"dear", +"dearborn", +"dearie", +"dearly", +"dearness", +"dearomatize", +"dearsenicate", +"dearsenicator", +"dearsenicize", +"dearth", +"dearthfu", +"dearticulation", +"dearworth", +"dearworthily", +"dearworthiness", +"deary", +"deash", +"deasil", +"deaspirate", +"deaspiration", +"deassimilation", +"death", +"deathbed", +"deathblow", +"deathday", +"deathful", +"deathfully", +"deathfulness", +"deathify", +"deathin", +"deathiness", +"deathless", +"deathlessly", +"deathlessness", +"deathlike", +"deathliness", +"deathling", +"deathly", +"deathroot", +"deathshot", +"deathsman", +"deathtrap", +"deathward", +"deathwards", +"deathwatch", +"deathweed", +"deathworm", +"deathy", +"deave", +"deavely", +"Deb", +"deb", +"debacle", +"debadge", +"debamboozle", +"debar", +"debarbarization", +"debarbarize", +"debark", +"debarkation", +"debarkment", +"debarment", +"debarrance", +"debarrass", +"debarration", +"debase", +"debasedness", +"debasement", +"debaser", +"debasingly", +"debatable", +"debate", +"debateful", +"debatefully", +"debatement", +"debater", +"debating", +"debatingly", +"debauch", +"debauched", +"debauchedly", +"debauchedness", +"debauchee", +"debaucher", +"debauchery", +"debauchment", +"Debby", +"debby", +"debeige", +"debellate", +"debellation", +"debellator", +"deben", +"debenture", +"debentured", +"debenzolize", +"debile", +"debilissima", +"debilitant", +"debilitate", +"debilitated", +"debilitation", +"debilitative", +"debility", +"debind", +"debit", +"debiteuse", +"debituminization", +"debituminize", +"deblaterate", +"deblateration", +"deboistly", +"deboistness", +"debonair", +"debonaire", +"debonairity", +"debonairly", +"debonairness", +"debonnaire", +"Deborah", +"debord", +"debordment", +"debosh", +"deboshed", +"debouch", +"debouchment", +"debride", +"debrief", +"debris", +"debrominate", +"debromination", +"debruise", +"debt", +"debtee", +"debtful", +"debtless", +"debtor", +"debtorship", +"debullition", +"debunk", +"debunker", +"debunkment", +"debus", +"Debussyan", +"Debussyanize", +"debut", +"debutant", +"debutante", +"decachord", +"decad", +"decadactylous", +"decadal", +"decadally", +"decadarch", +"decadarchy", +"decadary", +"decadation", +"decade", +"decadence", +"decadency", +"decadent", +"decadentism", +"decadently", +"decadescent", +"decadianome", +"decadic", +"decadist", +"decadrachm", +"decadrachma", +"decaesarize", +"decaffeinate", +"decaffeinize", +"decafid", +"decagon", +"decagonal", +"decagram", +"decagramme", +"decahedral", +"decahedron", +"decahydrate", +"decahydrated", +"decahydronaphthalene", +"Decaisnea", +"decal", +"decalcification", +"decalcifier", +"decalcify", +"decalcomania", +"decalcomaniac", +"decalescence", +"decalescent", +"Decalin", +"decaliter", +"decalitre", +"decalobate", +"Decalogist", +"Decalogue", +"decalvant", +"decalvation", +"decameral", +"Decameron", +"Decameronic", +"decamerous", +"decameter", +"decametre", +"decamp", +"decampment", +"decan", +"decanal", +"decanally", +"decanate", +"decane", +"decangular", +"decani", +"decanically", +"decannulation", +"decanonization", +"decanonize", +"decant", +"decantate", +"decantation", +"decanter", +"decantherous", +"decap", +"decapetalous", +"decaphyllous", +"decapitable", +"decapitalization", +"decapitalize", +"decapitate", +"decapitation", +"decapitator", +"decapod", +"Decapoda", +"decapodal", +"decapodan", +"decapodiform", +"decapodous", +"decapper", +"decapsulate", +"decapsulation", +"decarbonate", +"decarbonator", +"decarbonization", +"decarbonize", +"decarbonized", +"decarbonizer", +"decarboxylate", +"decarboxylation", +"decarboxylization", +"decarboxylize", +"decarburation", +"decarburization", +"decarburize", +"decarch", +"decarchy", +"decardinalize", +"decare", +"decarhinus", +"decarnate", +"decarnated", +"decart", +"decasemic", +"decasepalous", +"decaspermal", +"decaspermous", +"decast", +"decastellate", +"decastere", +"decastich", +"decastyle", +"decasualization", +"decasualize", +"decasyllabic", +"decasyllable", +"decasyllabon", +"decate", +"decathlon", +"decatholicize", +"decatize", +"decatizer", +"decatoic", +"decator", +"decatyl", +"decaudate", +"decaudation", +"decay", +"decayable", +"decayed", +"decayedness", +"decayer", +"decayless", +"decease", +"deceased", +"decedent", +"deceit", +"deceitful", +"deceitfully", +"deceitfulness", +"deceivability", +"deceivable", +"deceivableness", +"deceivably", +"deceive", +"deceiver", +"deceiving", +"deceivingly", +"decelerate", +"deceleration", +"decelerator", +"decelerometer", +"December", +"Decemberish", +"Decemberly", +"Decembrist", +"decemcostate", +"decemdentate", +"decemfid", +"decemflorous", +"decemfoliate", +"decemfoliolate", +"decemjugate", +"decemlocular", +"decempartite", +"decempeda", +"decempedal", +"decempedate", +"decempennate", +"decemplex", +"decemplicate", +"decempunctate", +"decemstriate", +"decemuiri", +"decemvir", +"decemviral", +"decemvirate", +"decemvirship", +"decenary", +"decence", +"decency", +"decene", +"decennal", +"decennary", +"decennia", +"decenniad", +"decennial", +"decennially", +"decennium", +"decennoval", +"decent", +"decenter", +"decently", +"decentness", +"decentralism", +"decentralist", +"decentralization", +"decentralize", +"decentration", +"decentre", +"decenyl", +"decephalization", +"deceptibility", +"deceptible", +"deception", +"deceptious", +"deceptiously", +"deceptitious", +"deceptive", +"deceptively", +"deceptiveness", +"deceptivity", +"decerebrate", +"decerebration", +"decerebrize", +"decern", +"decerniture", +"decernment", +"decess", +"decession", +"dechemicalization", +"dechemicalize", +"dechenite", +"Dechlog", +"dechlore", +"dechlorination", +"dechoralize", +"dechristianization", +"dechristianize", +"Decian", +"deciare", +"deciatine", +"decibel", +"deciceronize", +"decidable", +"decide", +"decided", +"decidedly", +"decidedness", +"decider", +"decidingly", +"decidua", +"decidual", +"deciduary", +"Deciduata", +"deciduate", +"deciduitis", +"deciduoma", +"deciduous", +"deciduously", +"deciduousness", +"decigram", +"decigramme", +"decil", +"decile", +"deciliter", +"decillion", +"decillionth", +"decima", +"decimal", +"decimalism", +"decimalist", +"decimalization", +"decimalize", +"decimally", +"decimate", +"decimation", +"decimator", +"decimestrial", +"decimeter", +"decimolar", +"decimole", +"decimosexto", +"Decimus", +"decinormal", +"decipher", +"decipherability", +"decipherable", +"decipherably", +"decipherer", +"decipherment", +"decipium", +"decipolar", +"decision", +"decisional", +"decisive", +"decisively", +"decisiveness", +"decistere", +"decitizenize", +"Decius", +"decivilization", +"decivilize", +"deck", +"decke", +"decked", +"deckel", +"decker", +"deckhead", +"deckhouse", +"deckie", +"decking", +"deckle", +"deckload", +"deckswabber", +"declaim", +"declaimant", +"declaimer", +"declamation", +"declamatoriness", +"declamatory", +"declarable", +"declarant", +"declaration", +"declarative", +"declaratively", +"declarator", +"declaratorily", +"declaratory", +"declare", +"declared", +"declaredly", +"declaredness", +"declarer", +"declass", +"declassicize", +"declassify", +"declension", +"declensional", +"declensionally", +"declericalize", +"declimatize", +"declinable", +"declinal", +"declinate", +"declination", +"declinational", +"declinatory", +"declinature", +"decline", +"declined", +"declinedness", +"decliner", +"declinograph", +"declinometer", +"declivate", +"declive", +"declivitous", +"declivity", +"declivous", +"declutch", +"decoagulate", +"decoagulation", +"decoat", +"decocainize", +"decoct", +"decoctible", +"decoction", +"decoctive", +"decoctum", +"decode", +"Decodon", +"decohere", +"decoherence", +"decoherer", +"decohesion", +"decoic", +"decoke", +"decollate", +"decollated", +"decollation", +"decollator", +"decolletage", +"decollete", +"decolor", +"decolorant", +"decolorate", +"decoloration", +"decolorimeter", +"decolorization", +"decolorize", +"decolorizer", +"decolour", +"decommission", +"decompensate", +"decompensation", +"decomplex", +"decomponible", +"decomposability", +"decomposable", +"decompose", +"decomposed", +"decomposer", +"decomposite", +"decomposition", +"decomposure", +"decompound", +"decompoundable", +"decompoundly", +"decompress", +"decompressing", +"decompression", +"decompressive", +"deconcatenate", +"deconcentrate", +"deconcentration", +"deconcentrator", +"decongestive", +"deconsecrate", +"deconsecration", +"deconsider", +"deconsideration", +"decontaminate", +"decontamination", +"decontrol", +"deconventionalize", +"decopperization", +"decopperize", +"decorability", +"decorable", +"decorably", +"decorament", +"decorate", +"decorated", +"decoration", +"decorationist", +"decorative", +"decoratively", +"decorativeness", +"decorator", +"decoratory", +"decorist", +"decorous", +"decorously", +"decorousness", +"decorrugative", +"decorticate", +"decortication", +"decorticator", +"decorticosis", +"decorum", +"decostate", +"decoy", +"decoyer", +"decoyman", +"decrassify", +"decream", +"decrease", +"decreaseless", +"decreasing", +"decreasingly", +"decreation", +"decreative", +"decree", +"decreeable", +"decreement", +"decreer", +"decreet", +"decrement", +"decrementless", +"decremeter", +"decrepit", +"decrepitate", +"decrepitation", +"decrepitly", +"decrepitness", +"decrepitude", +"decrescence", +"decrescendo", +"decrescent", +"decretal", +"decretalist", +"decrete", +"decretist", +"decretive", +"decretively", +"decretorial", +"decretorily", +"decretory", +"decretum", +"decrew", +"decrial", +"decried", +"decrier", +"decrown", +"decrudescence", +"decrustation", +"decry", +"decrystallization", +"decubital", +"decubitus", +"decultivate", +"deculturate", +"decuman", +"decumana", +"decumanus", +"Decumaria", +"decumary", +"decumbence", +"decumbency", +"decumbent", +"decumbently", +"decumbiture", +"decuple", +"decuplet", +"decuria", +"decurion", +"decurionate", +"decurrence", +"decurrency", +"decurrent", +"decurrently", +"decurring", +"decursion", +"decursive", +"decursively", +"decurtate", +"decurvation", +"decurvature", +"decurve", +"decury", +"decus", +"decussate", +"decussated", +"decussately", +"decussation", +"decussis", +"decussorium", +"decyl", +"decylene", +"decylenic", +"decylic", +"decyne", +"Dedan", +"Dedanim", +"Dedanite", +"dedecorate", +"dedecoration", +"dedecorous", +"dedendum", +"dedentition", +"dedicant", +"dedicate", +"dedicatee", +"dedication", +"dedicational", +"dedicative", +"dedicator", +"dedicatorial", +"dedicatorily", +"dedicatory", +"dedicature", +"dedifferentiate", +"dedifferentiation", +"dedimus", +"deditician", +"dediticiancy", +"dedition", +"dedo", +"dedoggerelize", +"dedogmatize", +"dedolation", +"deduce", +"deducement", +"deducibility", +"deducible", +"deducibleness", +"deducibly", +"deducive", +"deduct", +"deductible", +"deduction", +"deductive", +"deductively", +"deductory", +"deduplication", +"dee", +"deed", +"deedbox", +"deedeed", +"deedful", +"deedfully", +"deedily", +"deediness", +"deedless", +"deedy", +"deem", +"deemer", +"deemie", +"deemster", +"deemstership", +"deep", +"deepen", +"deepener", +"deepening", +"deepeningly", +"Deepfreeze", +"deeping", +"deepish", +"deeplier", +"deeply", +"deepmost", +"deepmouthed", +"deepness", +"deepsome", +"deepwater", +"deepwaterman", +"deer", +"deerberry", +"deerdog", +"deerdrive", +"deerfood", +"deerhair", +"deerherd", +"deerhorn", +"deerhound", +"deerlet", +"deermeat", +"deerskin", +"deerstalker", +"deerstalking", +"deerstand", +"deerstealer", +"deertongue", +"deerweed", +"deerwood", +"deeryard", +"deevey", +"deevilick", +"deface", +"defaceable", +"defacement", +"defacer", +"defacing", +"defacingly", +"defalcate", +"defalcation", +"defalcator", +"defalk", +"defamation", +"defamatory", +"defame", +"defamed", +"defamer", +"defamingly", +"defassa", +"defat", +"default", +"defaultant", +"defaulter", +"defaultless", +"defaulture", +"defeasance", +"defeasanced", +"defease", +"defeasibility", +"defeasible", +"defeasibleness", +"defeat", +"defeater", +"defeatism", +"defeatist", +"defeatment", +"defeature", +"defecant", +"defecate", +"defecation", +"defecator", +"defect", +"defectibility", +"defectible", +"defection", +"defectionist", +"defectious", +"defective", +"defectively", +"defectiveness", +"defectless", +"defectology", +"defector", +"defectoscope", +"defedation", +"defeminize", +"defence", +"defend", +"defendable", +"defendant", +"defender", +"defendress", +"defenestration", +"defensative", +"defense", +"defenseless", +"defenselessly", +"defenselessness", +"defensibility", +"defensible", +"defensibleness", +"defensibly", +"defension", +"defensive", +"defensively", +"defensiveness", +"defensor", +"defensorship", +"defensory", +"defer", +"deferable", +"deference", +"deferent", +"deferentectomy", +"deferential", +"deferentiality", +"deferentially", +"deferentitis", +"deferment", +"deferrable", +"deferral", +"deferred", +"deferrer", +"deferrization", +"deferrize", +"defervesce", +"defervescence", +"defervescent", +"defeudalize", +"defiable", +"defial", +"defiance", +"defiant", +"defiantly", +"defiantness", +"defiber", +"defibrinate", +"defibrination", +"defibrinize", +"deficience", +"deficiency", +"deficient", +"deficiently", +"deficit", +"defier", +"defiguration", +"defilade", +"defile", +"defiled", +"defiledness", +"defilement", +"defiler", +"defiliation", +"defiling", +"defilingly", +"definability", +"definable", +"definably", +"define", +"defined", +"definedly", +"definement", +"definer", +"definiendum", +"definiens", +"definite", +"definitely", +"definiteness", +"definition", +"definitional", +"definitiones", +"definitive", +"definitively", +"definitiveness", +"definitization", +"definitize", +"definitor", +"definitude", +"deflagrability", +"deflagrable", +"deflagrate", +"deflagration", +"deflagrator", +"deflate", +"deflation", +"deflationary", +"deflationist", +"deflator", +"deflect", +"deflectable", +"deflected", +"deflection", +"deflectionization", +"deflectionize", +"deflective", +"deflectometer", +"deflector", +"deflesh", +"deflex", +"deflexibility", +"deflexible", +"deflexion", +"deflexure", +"deflocculant", +"deflocculate", +"deflocculation", +"deflocculator", +"deflorate", +"defloration", +"deflorescence", +"deflower", +"deflowerer", +"defluent", +"defluous", +"defluvium", +"defluxion", +"defoedation", +"defog", +"defoliage", +"defoliate", +"defoliated", +"defoliation", +"defoliator", +"deforce", +"deforcement", +"deforceor", +"deforcer", +"deforciant", +"deforest", +"deforestation", +"deforester", +"deform", +"deformability", +"deformable", +"deformalize", +"deformation", +"deformational", +"deformative", +"deformed", +"deformedly", +"deformedness", +"deformer", +"deformeter", +"deformism", +"deformity", +"defortify", +"defoul", +"defraud", +"defraudation", +"defrauder", +"defraudment", +"defray", +"defrayable", +"defrayal", +"defrayer", +"defrayment", +"defreeze", +"defrication", +"defrock", +"defrost", +"defroster", +"deft", +"defterdar", +"deftly", +"deftness", +"defunct", +"defunction", +"defunctionalization", +"defunctionalize", +"defunctness", +"defuse", +"defusion", +"defy", +"defyingly", +"deg", +"deganglionate", +"degarnish", +"degas", +"degasification", +"degasifier", +"degasify", +"degasser", +"degauss", +"degelatinize", +"degelation", +"degeneracy", +"degeneralize", +"degenerate", +"degenerately", +"degenerateness", +"degeneration", +"degenerationist", +"degenerative", +"degenerescence", +"degenerescent", +"degentilize", +"degerm", +"degerminate", +"degerminator", +"degged", +"degger", +"deglaciation", +"deglaze", +"deglutinate", +"deglutination", +"deglutition", +"deglutitious", +"deglutitive", +"deglutitory", +"deglycerin", +"deglycerine", +"degorge", +"degradable", +"degradand", +"degradation", +"degradational", +"degradative", +"degrade", +"degraded", +"degradedly", +"degradedness"]; + +fold(strs, function (x, y) { print(x + y); }); diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/parse_error.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/parse_error.js new file mode 100644 index 000000000..a8859d06d --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/parse_error.js @@ -0,0 +1 @@ +function a() { \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 088a614bd..992c924af 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -19,6 +19,7 @@ import java.util.Set; import junit.framework.Assert; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.MappedSourceModule; import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; @@ -27,8 +28,10 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; +import com.ibm.wala.cast.loader.CAstAbstractLoader; import com.ibm.wala.classLoader.SourceFileModule; import com.ibm.wala.classLoader.SourceModule; +import com.ibm.wala.classLoader.SourceURLModule; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.CallGraph; @@ -39,6 +42,7 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.IRFactory; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; /** * TODO this class is a mess. rewrite. @@ -74,7 +78,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J } - public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException { + public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(); AnalysisScope scope = makeScriptScope(dir, name, loaders); @@ -99,16 +103,16 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J return scope; } - public static JSCFABuilder makeScriptCGBuilder(String dir, String name) throws IOException { + public static JSCFABuilder makeScriptCGBuilder(String dir, String name) throws IOException, WalaException { return makeScriptCGBuilder(dir, name, CGBuilderType.ZERO_ONE_CFA); } - public static CallGraph makeScriptCG(String dir, String name) throws IOException, IllegalArgumentException, CancelException { + public static CallGraph makeScriptCG(String dir, String name) throws IOException, IllegalArgumentException, CancelException, WalaException { return makeScriptCG(dir, name, CGBuilderType.ZERO_ONE_CFA); } public static CallGraph makeScriptCG(String dir, String name, CGBuilderType builderType) throws IOException, - IllegalArgumentException, CancelException { + IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder b = makeScriptCGBuilder(dir, name, builderType); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); @@ -116,26 +120,36 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J } public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, - CancelException { + CancelException, WalaException { PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); return CG; } - public static JSCFABuilder makeHTMLCGBuilder(URL url) throws IOException { + public static JSCFABuilder makeHTMLCGBuilder(URL url) throws IOException, WalaException { return makeHTMLCGBuilder(url, CGBuilderType.ZERO_ONE_CFA); } - public static JSCFABuilder makeHTMLCGBuilder(URL url, CGBuilderType builderType) throws IOException { + public static JSCFABuilder makeHTMLCGBuilder(URL url, CGBuilderType builderType) throws IOException, WalaException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); - Set script = WebUtil.extractScriptFromHTML(url); - JSCFABuilder builder = makeCGBuilder(new WebPageLoaderFactory(translatorFactory, preprocessor), script.toArray(new SourceModule[script.size()]), builderType, AstIRFactory.makeDefaultFactory()); + SourceModule[] scripts; + IRFactory irFactory = AstIRFactory.makeDefaultFactory(); + JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); + try { + Set script = WebUtil.extractScriptFromHTML(url); + scripts = script.toArray(new SourceModule[script.size()]); + } catch (Error e) { + SourceModule dummy = new SourceURLModule(url); + scripts = new SourceModule[]{ dummy }; + ((CAstAbstractLoader)loaders.getTheLoader()).addMessage(dummy, e.warning); + } + JSCFABuilder builder = makeCGBuilder(loaders, scripts, builderType, irFactory); builder.setBaseURL(url); return builder; } - public static CallGraph makeHTMLCG(URL url) throws IOException, IllegalArgumentException, CancelException { + public static CallGraph makeHTMLCG(URL url) throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder b = makeHTMLCGBuilder(url); CallGraph CG = b.makeCallGraph(b.getOptions()); dumpCG(b.getPointerAnalysis(), CG); @@ -143,18 +157,18 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J } public static CallGraph makeHTMLCG(URL url, CGBuilderType builderType) throws IOException, IllegalArgumentException, - CancelException { + CancelException, WalaException { PropagationCallGraphBuilder b = makeHTMLCGBuilder(url, builderType); CallGraph CG = b.makeCallGraph(b.getOptions()); return CG; } - public static JSCFABuilder makeCGBuilder(JavaScriptLoaderFactory loaders, SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException { + public static JSCFABuilder makeCGBuilder(JavaScriptLoaderFactory loaders, SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, WalaException { AnalysisScope scope = makeScope(scripts, loaders, JavaScriptLoader.JS); return makeCG(loaders, scope, builderType, irFactory); } - protected static JSCFABuilder makeCG(JavaScriptLoaderFactory loaders, AnalysisScope scope, CGBuilderType builderType, IRFactory irFactory) throws IOException { + protected static JSCFABuilder makeCG(JavaScriptLoaderFactory loaders, AnalysisScope scope, CGBuilderType builderType, IRFactory irFactory) throws IOException, WalaException { try { IClassHierarchy cha = makeHierarchy(scope, loaders); com.ibm.wala.cast.js.util.Util.checkForFrontEndErrors(cha); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java index fde00df4a..83e90bf00 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java @@ -18,6 +18,7 @@ import org.junit.Test; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.CGBuilderType; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { @@ -29,7 +30,7 @@ public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { }; - @Test public void testAjaxslt() throws IOException, IllegalArgumentException, CancelException { + @Test public void testAjaxslt() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); // don't handle call / apply; it makes things blow up CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ZERO_ONE_CFA_NO_CALL_APPLY); @@ -41,7 +42,7 @@ public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { }; - @Test public void testAjaxpath() throws IOException, IllegalArgumentException, CancelException { + @Test public void testAjaxpath() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xpath.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForAjaxpath); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java index 3723c11f7..2e116c57d 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java @@ -18,6 +18,7 @@ import com.ibm.wala.ipa.callgraph.propagation.cfa.ZeroXInstanceKeys; import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public abstract class TestArgumentSensitivity extends TestJSCallGraphShape { @@ -29,7 +30,7 @@ public abstract class TestArgumentSensitivity extends TestJSCallGraphShape { new Object[] { "tests/args.js/a", new String[] { "tests/args.js/x"} }, new Object[] { "tests/args.js/a", new String[] { "tests/args.js/y", "tests/args.js/z", "!tests/args.js/wrong" } } }; - @Test public void testArgs() throws IOException, IllegalArgumentException, CancelException, ClassHierarchyException { + @Test public void testArgs() throws IOException, IllegalArgumentException, CancelException, ClassHierarchyException, WalaException { JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(); AnalysisScope scope = JSCallGraphBuilderUtil.makeScriptScope("tests", "args.js", loaders); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java index 6caac9617..ec2dde4ed 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java @@ -13,6 +13,7 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.ContextSelector; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public abstract class TestForInLoopHack extends TestJSCallGraphShape { @@ -22,14 +23,14 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { JSSourceExtractor.DELETE_UPON_EXIT = false; } - @Test public void testPage3WithoutHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testPage3WithoutHack() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/page3.html"); JSCFABuilder builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); CallGraph CG = builder.makeCallGraph(builder.getOptions()); JSCallGraphBuilderUtil.dumpCG(builder.getPointerAnalysis(), CG); } - @Test public void testPage3WithHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testPage3WithHack() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/page3.html"); JSCFABuilder builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); addHackedForInLoopSensitivity(builder); @@ -38,7 +39,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { } @Ignore("This test now blows up due to proper handling of the || construct, used in extend(). Should handle this eventually.") - @Test public void testJQueryWithHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testJQueryWithHack() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/jquery_hacked.html"); JSCFABuilder builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); addHackedForInLoopSensitivity(builder); @@ -47,7 +48,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { } /* - @Test public void testJQueryEx1WithHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testJQueryEx1WithHack() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/jquery/ex1.html"); JSCFABuilder builder = Util.makeHTMLCGBuilder(url); addHackedForInLoopSensitivity(builder); @@ -73,7 +74,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { new String[] { "tests/badforin.js/testForIn2" } } }; - @Test public void testBadForInWithoutHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testBadForInWithoutHack() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "badforin.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); JSCallGraphBuilderUtil.dumpCG(B.getPointerAnalysis(), CG); @@ -91,7 +92,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { new String[] { "!tests/badforin.js/testForIn1" } } }; - @Test public void testBadForInWithHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testBadForInWithHack() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "badforin.js"); addHackedForInLoopSensitivity(B); CallGraph CG = B.makeCallGraph(B.getOptions()); @@ -117,7 +118,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { new String[] { "tests/badforin2.js/testForIn2" } } }; - @Test public void testbadforin2WithoutHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testbadforin2WithoutHack() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "badforin2.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); JSCallGraphBuilderUtil.dumpCG(B.getPointerAnalysis(), CG); @@ -135,7 +136,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { new String[] { "!tests/badforin2.js/testForIn1" } } }; - @Test public void testbadforin2WithHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testbadforin2WithHack() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "badforin2.js"); addHackedForInLoopSensitivity(B); CallGraph CG = B.makeCallGraph(B.getOptions()); @@ -144,7 +145,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { verifyGraphAssertions(CG, assertionsForbadforin2HackPrecision); } - @Test public void testForInRecursion() throws IOException, IllegalArgumentException, CancelException { + @Test public void testForInRecursion() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "badforin3.js"); addHackedForInLoopSensitivity(B); CallGraph CG = B.makeCallGraph(B.getOptions()); @@ -153,7 +154,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { /* - @Test public void testYahooWithoutHack() throws IOException, IllegalArgumentException, CancelException { + @Test public void testYahooWithoutHack() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = Util.makeScriptCGBuilder("frameworks", "yahoo.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); Util.dumpCG(B.getPointerAnalysis(), CG); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java index f6ace8db9..3ae3bec4a 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java @@ -12,6 +12,7 @@ import com.ibm.wala.cast.js.html.JSSourceExtractor; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public class TestJQueryExamples extends TestJSCallGraphShape { @@ -26,7 +27,7 @@ public class TestJQueryExamples extends TestJSCallGraphShape { } @Ignore("This tries to analyze unmodified jquery, which we can't do yet") - @Test public void testEx1() throws IOException, IllegalArgumentException, CancelException { + @Test public void testEx1() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/jquery/ex1.html"); JSCFABuilder builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); CallGraph CG = builder.makeCallGraph(builder.getOptions()); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java index 71235ef30..84c09c98c 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestLexicalModRef.java @@ -22,13 +22,14 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.intset.OrdinalSet; public abstract class TestLexicalModRef { @Test - public void testSimpleLexical() throws IOException, IllegalArgumentException, CancelException { + public void testSimpleLexical() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "simple-lexical.js"); CallGraph CG = b.makeCallGraph(b.getOptions()); LexicalModRef lexAccesses = LexicalModRef.make(CG, b.getPointerAnalysis()); @@ -50,7 +51,14 @@ public abstract class TestLexicalModRef { // function "inner3" reads exactly innerName, inner3, and x and z via callees OrdinalSet> readVars = readResult.get(n); Assert.assertEquals(4, readVars.size()); - Assert.assertEquals("[[Node: Context: Everywhere,x], [Node: Context: Everywhere,inner3], [Node: Context: Everywhere,innerName], [Node: Context: Everywhere,z]]", readVars.toString()); + for(Pair rv : readVars) { + Assert.assertTrue(rv.toString(), + "[Node: Context: Everywhere,x]".equals(rv.toString()) || + "[Node: Context: Everywhere,inner3]".equals(rv.toString()) || + "[Node: Context: Everywhere,innerName]".equals(rv.toString()) || + "[Node: Context: Everywhere,z]".equals(rv.toString())); + + } } } } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShape.java index af585e372..ec5dc9627 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShape.java @@ -18,6 +18,7 @@ import org.junit.Test; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public abstract class TestMediawikiCallGraphShape extends TestJSCallGraphShape { @@ -30,7 +31,7 @@ public abstract class TestMediawikiCallGraphShape extends TestJSCallGraphShape { }; @Ignore("not terminating; Julian, take a look?") - @Test public void testSwineFlu() throws IOException, IllegalArgumentException, CancelException { + @Test public void testSwineFlu() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = new URL("http://en.wikipedia.org/wiki/2009_swine_flu_outbreak"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForSwineFlu); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 138ce3d48..72cfea0a3 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -19,19 +19,22 @@ import junit.framework.Assert; import org.junit.Test; -import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.LocalPointerKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder; +import com.ibm.wala.ipa.callgraph.propagation.SSAPropagationCallGraphBuilder; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.MonitorUtil.IProgressMonitor; +import com.ibm.wala.util.WalaException; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.IVector; import com.ibm.wala.util.collections.Iterator2Collection; @@ -53,7 +56,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new String[] { "tests/args.js/a" } }, new Object[] { "tests/args.js/a", new String[] { "tests/args.js/x", "tests/args.js/y" } } }; -@Test public void testArgs() throws IOException, IllegalArgumentException, CancelException { +@Test public void testArgs() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "args.js"); verifyGraphAssertions(CG, assertionsForArgs); } @@ -71,7 +74,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/simple.js/weirder", new String[] { "prologue.js/Math_abs" } } }; @Test - public void testSimple() throws IOException, IllegalArgumentException, CancelException { + public void testSimple() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "simple.js"); verifyGraphAssertions(CG, assertionsForSimple); } @@ -85,7 +88,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/objects.js/objects_are_fun", new String[] { "tests/objects.js/other", "tests/objects.js/whatever" } } }; @Test - public void testObjects() throws IOException, IllegalArgumentException, CancelException { + public void testObjects() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "objects.js"); verifyGraphAssertions(CG, assertionsForObjects); } @@ -106,7 +109,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testInherit() throws IOException, IllegalArgumentException, CancelException { + public void testInherit() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "inherit.js"); verifyGraphAssertions(CG, assertionsForInherit); } @@ -117,7 +120,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new String[] { "suffix:ctor$1/_fromctor", "suffix:ctor$2/_fromctor", "suffix:ctor$3/_fromctor" } } }; @Test - public void testNewfn() throws IOException, IllegalArgumentException, CancelException { + public void testNewfn() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "newfn.js"); verifyGraphAssertions(CG, assertionsForNewfn); } @@ -130,7 +133,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { "tests/control-flow.js/testWhile", "tests/control-flow.js/testFor", "tests/control-flow.js/testReturn" } } }; @Test - public void testControlflow() throws IOException, IllegalArgumentException, CancelException { + public void testControlflow() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "control-flow.js"); verifyGraphAssertions(CG, assertionsForControlflow); } @@ -144,7 +147,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { "tests/more-control-flow.js/testFor", "tests/more-control-flow.js/testReturn" } } }; @Test - public void testMoreControlflow() throws IOException, IllegalArgumentException, CancelException { + public void testMoreControlflow() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "more-control-flow.js"); verifyGraphAssertions(CG, assertionsForMoreControlflow); } @@ -154,7 +157,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/forin.js/testForIn", new String[] { "tests/forin.js/testForIn1", "tests/forin.js/testForIn2" } } }; @Test - public void testForin() throws IOException, IllegalArgumentException, CancelException { + public void testForin() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCFABuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "forin.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); // JSCallGraphUtil.AVOID_DUMP = false; @@ -175,13 +178,13 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new String[] { "tests/simple-lexical.js/outer/inner", "tests/simple-lexical.js/outer/inner3" } } }; @Test - public void testSimpleLexical() throws IOException, IllegalArgumentException, CancelException { + public void testSimpleLexical() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "simple-lexical.js"); verifyGraphAssertions(CG, assertionsForSimpleLexical); } @Test - public void testRecursiveLexical() throws IOException, IllegalArgumentException, CancelException { + public void testRecursiveLexical() throws IOException, IllegalArgumentException, CancelException, WalaException { // just checking that we have a sufficient bailout to ensure termination JSCallGraphBuilderUtil.makeScriptCG("tests", "recursive_lexical.js"); } @@ -192,7 +195,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:lexical_multiple_calls.js", new String[] { "suffix:reachable2" } }}; @Test - public void testLexicalMultiple() throws IOException, IllegalArgumentException, CancelException { + public void testLexicalMultiple() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "lexical_multiple_calls.js"); verifyGraphAssertions(CG, assertionsForLexicalMultiple); } @@ -210,7 +213,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new String[] { "tests/try.js/targetOne", "tests/try.js/targetTwo", "tests/try.js/three", "tests/try.js/two" } } }; @Test - public void testTry() throws IOException, IllegalArgumentException, CancelException { + public void testTry() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "try.js"); verifyGraphAssertions(CG, assertionsForTry); } @@ -220,7 +223,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/string-op.js", new String[] { "tests/string-op.js/getOp", "tests/string-op.js/plusNum" } } }; @Test - public void testStringOp() throws IOException, IllegalArgumentException, CancelException { + public void testStringOp() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "string-op.js"); B.getOptions().setTraceStringConstants(true); CallGraph CG = B.makeCallGraph(B.getOptions()); @@ -235,7 +238,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { "tests/upward.js/tester2" } } }; @Test - public void testUpward() throws IOException, IllegalArgumentException, CancelException { + public void testUpward() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "upward.js"); verifyGraphAssertions(CG, assertionsForUpward); } @@ -245,7 +248,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/string-prims.js", new String[] { "prologue.js/String_prototype_split", "prologue.js/String_prototype_toUpperCase" } } }; @Test - public void testStringPrims() throws IOException, IllegalArgumentException, CancelException { + public void testStringPrims() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "string-prims.js"); B.getOptions().setTraceStringConstants(true); CallGraph CG = B.makeCallGraph(B.getOptions()); @@ -258,7 +261,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/nested.js", new String[] { "tests/nested.js/f", "tests/nested.js/f/ff", "tests/nested.js/f/ff/fff" } } }; @Test - public void testNested() throws IOException, IllegalArgumentException, CancelException { + public void testNested() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "nested.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); verifyGraphAssertions(CG, assertionsForNested); @@ -268,7 +271,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new String[] { "tests/instanceof.js" } } }; @Test - public void testInstanceof() throws IOException, IllegalArgumentException, CancelException { + public void testInstanceof() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "instanceof.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); verifyGraphAssertions(CG, assertionsForInstanceof); @@ -286,19 +289,19 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { */ @Test - public void testCrash1() throws IOException, IllegalArgumentException, CancelException { + public void testCrash1() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "crash1.js"); verifyGraphAssertions(CG, null); } @Test - public void testCrash2() throws IOException, IllegalArgumentException, CancelException { + public void testCrash2() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "crash2.js"); verifyGraphAssertions(CG, null); } @Test - public void testLexicalCtor() throws IOException, IllegalArgumentException, CancelException { + public void testLexicalCtor() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "lexical-ctor.js"); verifyGraphAssertions(CG, null); } @@ -308,7 +311,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "tests/multivar.js", new String[] { "tests/multivar.js/a", "tests/multivar.js/bf", "tests/multivar.js/c" } } }; @Test - public void testMultivar() throws IOException, IllegalArgumentException, CancelException { + public void testMultivar() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "multivar.js"); verifyGraphAssertions(CG, assertionsForMultivar); } @@ -319,7 +322,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:test2", new String[] { "suffix:foo_of_B" } } }; @Test - public void testProtoypeContamination() throws IOException, IllegalArgumentException, CancelException { + public void testProtoypeContamination() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "prototype_contamination_bug.js"); verifyGraphAssertions(CG, assertionsForPrototypeContamination); verifyNoEdges(CG, "suffix:test1", "suffix:foo_of_B"); @@ -327,20 +330,20 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { } @Test - public void testStackOverflowOnSsaConversionBug() throws IOException, IllegalArgumentException, CancelException { + public void testStackOverflowOnSsaConversionBug() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "stack_overflow_on_ssa_conversion.js"); // all we need is for it to finish building CG successfully. } @Test - public void testExtJSSwitch() throws IOException, IllegalArgumentException, CancelException { + public void testExtJSSwitch() throws IOException, IllegalArgumentException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "extjs_switch.js"); // all we need is for it to finish building CG successfully. } @Test - public void testFunctionDotCall() throws IOException, IllegalArgumentException, CancelException { + public void testFunctionDotCall() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph cg = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_call.js"); for (CGNode n : cg) { if (n.getMethod().getName().toString().equals("call4")) { @@ -362,7 +365,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { @Test - public void testFunctionDotApply() throws IOException, IllegalArgumentException, CancelException { + public void testFunctionDotApply() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_apply.js"); verifyGraphAssertions(CG, assertionsForFunctionApply); } @@ -372,7 +375,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:function_apply2.js", new String[] { "suffix:theThree" } } }; @Test - public void testFunctionDotApply2() throws IOException, IllegalArgumentException, CancelException { + public void testFunctionDotApply2() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_apply2.js"); verifyGraphAssertions(CG, assertionsForFunctionApply2); } @@ -382,7 +385,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:wrap1.js", new String[] { "suffix:i_am_reachable" } } }; @Test - public void testWrap1() throws IllegalArgumentException, IOException, CancelException { + public void testWrap1() throws IllegalArgumentException, IOException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "wrap1.js"); verifyGraphAssertions(CG, assertionsForWrap1); } @@ -392,7 +395,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:wrap2.js", new String[] { "suffix:i_am_reachable" } } }; @Test - public void testWrap2() throws IllegalArgumentException, IOException, CancelException { + public void testWrap2() throws IllegalArgumentException, IOException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "wrap2.js"); verifyGraphAssertions(CG, assertionsForWrap2); } @@ -402,7 +405,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:wrap3.js", new String[] { "suffix:i_am_reachable" } } }; @Test - public void testWrap3() throws IllegalArgumentException, IOException, CancelException { + public void testWrap3() throws IllegalArgumentException, IOException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "wrap3.js"); verifyGraphAssertions(CG, assertionsForWrap3); } @@ -412,7 +415,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:call.js", new String[] { "suffix:f3" } } }; @Test - public void testComplexCall() throws IOException, IllegalArgumentException, CancelException { + public void testComplexCall() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "complex_call.js"); for(CGNode nd : CG) System.out.println(nd); @@ -425,7 +428,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:global_object.js", new String[] { "suffix:biz" } } }; @Test - public void testGlobalObjPassing() throws IOException, IllegalArgumentException, CancelException { + public void testGlobalObjPassing() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "global_object.js"); verifyGraphAssertions(CG, assertionsForGlobalObj); } @@ -435,7 +438,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:global_object2.js", new String[] { "suffix:foo" } } }; @Test - public void testGlobalObj2() throws IOException, IllegalArgumentException, CancelException { + public void testGlobalObj2() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "global_object2.js"); verifyGraphAssertions(CG, assertionsForGlobalObj2); } @@ -447,7 +450,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:return_this.js", new String[] { "suffix:bar" } } }; @Test - public void testReturnThis() throws IOException, IllegalArgumentException, CancelException { + public void testReturnThis() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "return_this.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); // JSCallGraphUtil.AVOID_DUMP = false; @@ -468,7 +471,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { // and test2 does not call bar1 @Test - public void testReturnThis2() throws IOException, IllegalArgumentException, CancelException { + public void testReturnThis2() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "return_this2.js"); verifyGraphAssertions(CG, assertionsForReturnThis2); } @@ -480,7 +483,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testArguments() throws IOException, IllegalArgumentException, CancelException { + public void testArguments() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "arguments.js"); verifyGraphAssertions(CG, assertionsForArguments); } @@ -490,7 +493,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { new Object[] { "suffix:Function_is_a_function.js", new String[] { "suffix:Function_prototype_call" } } }; @Test - public void testFunctionIsAFunction() throws IOException, IllegalArgumentException, CancelException { + public void testFunctionIsAFunction() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "Function_is_a_function.js"); verifyGraphAssertions(CG, assertionsForFunctionIsAFunction); } @@ -502,13 +505,13 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testLexicalBroken() throws IOException, IllegalArgumentException, CancelException { + public void testLexicalBroken() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "lexical_broken.js"); verifyGraphAssertions(CG, assertionsForLexicalBroken); } @Test - public void testDeadPhi() throws IllegalArgumentException, IOException, CancelException { + public void testDeadPhi() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "dead_phi.js"); } @@ -518,7 +521,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testScopingOverwriteFunction() throws IllegalArgumentException, IOException, CancelException { + public void testScopingOverwriteFunction() throws IllegalArgumentException, IOException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "scoping_test.js"); verifyGraphAssertions(CG, assertionsForScopingOverwriteFunction); } @@ -529,7 +532,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testNestedAssignToParam() throws IllegalArgumentException, IOException, CancelException { + public void testNestedAssignToParam() throws IllegalArgumentException, IOException, CancelException, WalaException { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "nested_assign_to_param.js"); verifyGraphAssertions(CG, assertionsForNestedParamAssign); } @@ -542,7 +545,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testDispatch() throws IOException, IllegalArgumentException, CancelException { + public void testDispatch() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "dispatch.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); // JSCallGraphUtil.AVOID_DUMP = false; @@ -557,7 +560,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { @Test - public void testDispatchSameTarget() throws IOException, IllegalArgumentException, CancelException { + public void testDispatchSameTarget() throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "dispatch_same_target.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); // JSCallGraphUtil.AVOID_DUMP = false; @@ -574,7 +577,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testForInPrototype() throws IllegalArgumentException, IOException, CancelException { + public void testForInPrototype() throws IllegalArgumentException, IOException, CancelException, WalaException { CallGraph cg = JSCallGraphBuilderUtil.makeScriptCG("tests", "for_in_prototype.js"); verifyGraphAssertions(cg, assertionsForForInPrototype); } @@ -588,7 +591,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testArrayIndexConv() throws IllegalArgumentException, IOException, CancelException { + public void testArrayIndexConv() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "array_index_conv.js"); CallGraph cg = b.makeCallGraph(b.getOptions()); verifyGraphAssertions(cg, assertionsForArrayIndexConv); @@ -603,7 +606,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testArrayIndexConv2() throws IllegalArgumentException, IOException, CancelException { + public void testArrayIndexConv2() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "array_index_conv2.js"); b.setContextSelector(new ForInContextSelector(b.getContextSelector())); CallGraph cg = b.makeCallGraph(b.getOptions()); @@ -618,7 +621,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { }; @Test - public void testDateAsProperty() throws IllegalArgumentException, IOException, CancelException { + public void testDateAsProperty() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "date-property.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); //JSCallGraphUtil.AVOID_DUMP = false; @@ -626,6 +629,40 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { verifyGraphAssertions(CG, assertionsForDateProperty); } + private static final Object[][] assertionsForDeadCode = new Object[][] { + new Object[] { ROOT, new String[] { "tests/dead.js" } }, + new Object[] { "tests/dead.js", new String[] { "suffix:twoReturns" } } + }; + + @Test + public void testDeadCode() throws IllegalArgumentException, IOException, CancelException, WalaException { + PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "dead.js"); + CallGraph CG = B.makeCallGraph(B.getOptions()); + //JSCallGraphUtil.AVOID_DUMP = false; + //JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); + verifyGraphAssertions(CG, assertionsForDeadCode); + } + + @Test(expected = CallGraphBuilderCancelException.class) + public void testManyStrings() throws IllegalArgumentException, IOException, CancelException, WalaException { + SSAPropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "many-strings.js"); + B.getOptions().setTraceStringConstants(true); + final long startTime = System.currentTimeMillis(); + CallGraph CG = B.makeCallGraph(B.getOptions(), new IProgressMonitor() { + public void beginTask(String task, int totalWork) { + } + public boolean isCanceled() { + return System.currentTimeMillis() > (startTime + 10000L); + } + public void done() { + } + public void worked(int units) { + } + }); + JSCallGraphUtil.AVOID_DUMP = false; + JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); + } + protected IVector>> computeIkIdToVns(PointerAnalysis pa) { // Created by reversing the points to mapping for local pointer keys. diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java index acff3ab54..3e8c25d7e 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java @@ -22,6 +22,7 @@ import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape { @@ -52,7 +53,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testPage1() throws IOException, IllegalArgumentException, CancelException { + @Test public void testPage1() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/page1.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage1); @@ -63,7 +64,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape new Object[] { "page2.html", new String[] { "page2.html/__WINDOW_MAIN__" } } }; - @Test public void testPage2() throws IOException, IllegalArgumentException, CancelException { + @Test public void testPage2() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/page2.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage2); @@ -80,7 +81,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testCrawlPage11() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage11() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page11.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage11); @@ -97,7 +98,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testCrawlPage11b() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage11b() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page11b.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage11b); @@ -129,7 +130,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape }, }; - @Test public void testCrawlPage12() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage12() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page12.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage12); @@ -162,7 +163,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testCrawlPage13() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage13() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page13.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage13); @@ -180,7 +181,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testCrawlPage15() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage15() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page15.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage15); @@ -198,7 +199,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testCrawlPage16() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage16() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page16.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage16); @@ -221,7 +222,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } }; - @Test public void testCrawlPage17() throws IOException, IllegalArgumentException, CancelException { + @Test public void testCrawlPage17() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/crawl/page17.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForPage17); @@ -234,19 +235,19 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape new Object[] { "apollo-example.html/__WINDOW_MAIN__/signon", new String[] { "preamble.js/DOMWindow/window_open" } } }; - @Test public void testApolloExample() throws IOException, IllegalArgumentException, CancelException { + @Test public void testApolloExample() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/apollo-example.html"); CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url); verifyGraphAssertions(CG, assertionsForApolloExample); } - @Test public void testNojs() throws IOException, IllegalArgumentException, CancelException { + @Test public void testNojs() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/nojs.html"); // all we need is for it to finish building CG successfully. JSCallGraphBuilderUtil.makeHTMLCG(url); } - @Test public void testPage4() throws IOException, IllegalArgumentException, CancelException { + @Test public void testPage4() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/page4.html"); JSCallGraphBuilderUtil.makeHTMLCG(url); } @@ -261,7 +262,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape new Object[]{ "suffix:forall_base", "pages/collection.js", 4, 4 } }; - @Test public void testList() throws IOException, IllegalArgumentException, CancelException { + @Test public void testList() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/list.html"); JSCFABuilder builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); CallGraph CG = builder.makeCallGraph(builder.getOptions()); @@ -270,7 +271,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape verifySourceAssertions(CG, sourceAssertionsForList); } - @Test public void testIframeTest2() throws IOException, IllegalArgumentException, CancelException { + @Test public void testIframeTest2() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/iframeTest2.html"); JSCallGraphBuilderUtil.makeHTMLCG(url); } @@ -284,7 +285,7 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape }; - @Test public void testWindowx() throws IOException, IllegalArgumentException, CancelException { + @Test public void testWindowx() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/windowx.html"); JSCFABuilder builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url); CallGraph CG = builder.makeCallGraph(builder.getOptions()); @@ -293,14 +294,14 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape } /* - @Test public void testJQuery() throws IOException, IllegalArgumentException, CancelException { + @Test public void testJQuery() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/jquery.html"); CallGraph CG = Util.makeHTMLCG(url); } */ /* - @Test public void testDojoTest() throws IllegalArgumentException, IOException, CancelException { + @Test public void testDojoTest() throws IllegalArgumentException, IOException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("pages/dojo/test.html"); CallGraph CG = Util.makeHTMLCG(url); verifyGraphAssertions(CG, null); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java index 43fe8516f..f57386a22 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java @@ -17,20 +17,21 @@ import junit.framework.Assert; import org.junit.Test; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.MappedSourceModule; import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.core.tests.util.WalaTestCase; public class TestWebUtil extends WalaTestCase { - @Test public void testAjaxslt() { + @Test public void testAjaxslt() throws Error { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); Assert.assertTrue(url != null); Set mod = WebUtil.extractScriptFromHTML( url ); Assert.assertTrue(mod != null); } - @Test public void testAjaxpath() { + @Test public void testAjaxpath() throws Error { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xpath.html"); Assert.assertTrue(url != null); Set mod = WebUtil.extractScriptFromHTML( url ); diff --git a/com.ibm.wala.cast.js/.project b/com.ibm.wala.cast.js/.project index e79c65660..ac04b2cc3 100644 --- a/com.ibm.wala.cast.js/.project +++ b/com.ibm.wala.cast.js/.project @@ -2,6 +2,8 @@ com.ibm.wala.cast.js + + org.eclipse.jdt.core.javabuilder diff --git a/com.ibm.wala.cast.js/dat/preamble.js b/com.ibm.wala.cast.js/dat/preamble.js index caad70cc6..19dea2996 100644 --- a/com.ibm.wala.cast.js/dat/preamble.js +++ b/com.ibm.wala.cast.js/dat/preamble.js @@ -22,6 +22,9 @@ NamedNodeList = function NamedNodeList() { var maxLength = 10; var local = new Array(10); var counter = -1; + + local[0] = new DOMElement(); + this[0] = local[0]; var checkAndIncrease = function checkAndIncrease() { if(counter >= maxLength - 1) { @@ -37,6 +40,11 @@ NamedNodeList = function NamedNodeList() { this.get = function _get(index) { return local[ index ]; } + + this.item = function _item(index) { + return new DOMElement(); + //return local[ index ]; + } this.add = function add(elem) { checkAndIncrease(); @@ -89,6 +97,7 @@ NamedNodeList = function NamedNodeList() { } DOMNode = function DOMNode() { // An impostor for the Node class + this.attributes = new NamedNodeList(); this.childNodes = new NamedNodeList(); this.insertBefore = function Node_prototype_insertBefore(newChild, refChild) { this.childNodes.insertBefore(newChild, refChild); @@ -110,6 +119,10 @@ DOMNode = function DOMNode() { // An impostor for the Node class this.ownerDocument = document; this.ownerWindow = window; this.ownerWindow.XMLHttpRequest = XMLHttpRequest; + + //these fields exist so we need to at least stub them out for pointer analysis + this.innerText = new String(); + this.innerHTML = new String(); this.collect = function collect(predicate, result) { if (predicate(this)) { @@ -117,6 +130,9 @@ DOMNode = function DOMNode() { // An impostor for the Node class } this.childNodes.collect(predicate, result); } + + this.selectNodes = function(a) { + } }; DOMNode.prototype.addEventListener = function Node_prototype_addEventListener(name, fn) { fn(); }; @@ -147,12 +163,17 @@ DOMDocument = function DOMDocument() { this.getElementById = function Document_prototype_getElementById(id) { var result = new Array(); - this.collect(function check_id(x) { return x.id == id; }, result); + result[0] = new DOMHTMLGenericElement("model"); + //this.collect(function check_id(x) { return x.id == id; }, result); return result[0]; }; this.getElementsByTagName = function Document_prototype_getElementsByTagName(name) { - // TODO: implement + // TODO: change this to use the tag name and not the ID + var result = new Array(); + result[0] = new DOMHTMLGenericElement("model"); + //this.collect(function check_id(x) { return x.id == id; }, result); + return result; }; this.createTextNode = function Document_prototype_createTextNode(txt) { @@ -163,6 +184,10 @@ DOMDocument = function DOMDocument() { this.write = function Document_prototype_write (stuff) { }; + + this.writeln = function Document_prototype_write (stuff) { + + }; }; DOMDocument.prototype.createDocumentFragment = function Document_prototype_createDocumentFragment() { // TODO: model me @@ -193,17 +218,22 @@ DOMHTMLDocument = function DOMHTMLDocument() { this.forms = new Array(); } - Location = function Location(){ + this.port = new String(); + this.port.value = new String(); this.host = new String(); this.hostname = new String(); this.href = new String(); this.search = new String(); this.protocol = new String(); + this.protocol.value = new String(); this.pathname = new String(); this.toString = function Location_to_string(){ return new String(); } + this.replace = function Location_replace(name) { + } + this.assign = function Location_assign(a) {} } Image = function Image() { @@ -270,9 +300,53 @@ document = new DOMHTMLDocument(); // Creating the root window object window = new DOMWindow(); +document.body = new Object(); + document.location = location; window.location = location; +document.domain = new Object(); +document.title = new String(); + +function Referrer() { + this.toString = function () { return new String();} +} +document.referrer = new Referrer(); +document.evaluate = function evaluate(a, b, c, d, e) { +} +document.execCommand = function execCommand(a,b,c) {} + +function Cookie() { + this.toString = function() { return new String(); } +} +document.cookie = new Cookie(); + +document.createExpression = function createExpression(a,b) {return new String()} + +window.parseFloat = parseFloat; +window.parseInt = parseInt; + +function ExecScript(code) { +} + +window.execScript = ExecScript; +window.eval = eval; + +function prompt(a, b) { + return new String(); +} + +window.prompt = prompt; + +window.escape = escape; +window.encodeURI = encodeURI; +window.encodeURIComponent = encodeURIComponent; +window.unescape = unescape; +window.decodeURI = decodeURI; +window.decodeURIComponent = decodeURIComponent; + +window.navigate = function navigate(a) {} + window.document = document; document.defaultView = window; window.XMLHttpRequest = XMLHttpRequest; @@ -283,11 +357,20 @@ clearInterval = window.clearInterval; var dojo = new DOJOObj(); +function ElementStyle() { + this.background = new String(); +} + DOMElement = function DOMElement() { // An impostor for the Element class // inherits from Node this.DOMNode = DOMNode; this.DOMNode(); delete this.DOMNode; + + this.style = new ElementStyle(); + + this.outerHTML = new String(); + this.src = new String(); // The get/set/remove attribute methods cannot be run using 'onclick','onmouseover', 'on...' kind of arguments for name. // since that would be used as a workaround for eval @@ -303,10 +386,14 @@ DOMElement = function DOMElement() { // An impostor for the Element class this.removeAttribute = function Element_prototype_removeAttribute(name) { delete this[name]; }; + + this.insertAdjacentHTML = function insertAdjacentHTML(a, b) { + }; this.getElementsByTagName = function Element_prototype_getElementsByTagName(tagName) { var result = new Array(); - this.collect(function check_tag(x) { return x.name == tagName; }, result); + result[0] = new DOMHTMLGenericElement("model"); + //this.collect(function check_tag(x) { return x.name == tagName; }, result); return result; }; @@ -359,6 +446,34 @@ DOMHTMLElement = function DOMHTMLElement() { // An impostor for the HTMLElement this.forms = new Array(); this.formCount = 0; + + // Set Javascript properties + this.getAttribute = function getAttribute(name) { + if(name == "id") return this.id; + else if(name == "title") return this.title; + else if(name == "lang") return this.lang; + else if(name == "dir") return this.dir; + else if(name == "class") return this.className; + else return this.attributes.get(name); + } + + this.setAttribute = function setAttribute(name, value) { + if(name == "id") this.id = value; + else if(name == "title") this.title = value; + else if(name == "lang") this.lang = value; + else if(name == "dir") this.dir = value; + else if(name == "class") this.className = value; + else return this.attributes.set(name, value); + } + + this.removeAttribute = function removeAttribute(name) { + if(name == "id") this.id = null; + else if(name == "title") this.title = null; + else if(name == "lang") this.lang = null; + else if(name == "dir") this.dir = null; + else if(name == "class") this.className = null; + else return this.attributes.remove(name); + } } // Just a hack until all HTML elements have corresponding constructors @@ -380,6 +495,7 @@ DOMHTMLGenericElement = function DOMHTMLGenericElement(tagName) { this.documentWindow = window; this.getContext = function() { return new CanvasRenderingContext2D(); }; + this.getAttribute = function() {return new String();} }; CanvasRenderingContext2D = function CanvasRenderingContext2D() {}; @@ -423,6 +539,37 @@ DOMHTMLFormElement = function DOMHTMLFormElement() { this.enctype = "application/x-www-form-urlencoded"; this.method = "get"; this.target = null; + + // Set Javascript properties + this.getAttribute = function getAttribute(name) { + if(name == "name") return this.name; + else if(name == "accept-charset") return this.acceptCharset; + else if(name == "action") return this.action; + else if(name == "enctype") return this.enctype; + else if(name == "method") return this.method; + else if(name == "target") return this.target; + else return this.prototype.getAttribute(name); + } + + this.setAttribute = function setAttribute(name, value) { + if(name == "name") this.name = value; + else if(name == "accept-charset") this.acceptCharset = value; + else if(name == "action") this.action = value; + else if(name == "enctype") this.enctype = value; + else if(name == "method") this.method = value; + else if(name == "target") this.target = value; + else return this.prototype.setAttribute(name, value); + } + + this.removeAttribute = function removeAttribute(name) { + if(name == "name") this.name = null; + else if(name == "accept-charset") this.acceptCharset = null; + else if(name == "action") this.action = null; + else if(name == "enctype") this.enctype = null; + else if(name == "method") this.method = null; + else if(name == "target") this.target = null; + else return this.prototype.removeAttribute(name); + } } DOMHTMLTableElement = function DOMHTMLTableElement () { @@ -437,12 +584,18 @@ DOMHTMLTableElement = function DOMHTMLTableElement () { XMLHttpRequest = function XMLHttpRequest() { + this.responseText = new String(); + this.responseXML = new DOMNode(); + this.UNSENT = 0; this.OPENED = 1; this.HEADERS_RECEIVED = 2; this.LOADING = 3; this.DONE = 4; + this.onreadystatechange = function xhr_onreadystatechange() { + } + this.orsc_handler = function xhr_orsc_handler() { this.onreadystatechange(); } @@ -467,11 +620,11 @@ XMLHttpRequest = function XMLHttpRequest() { } this.getResponseHeader = function xhr_getResponseHeader(header) { - + return new String(); } this.getAllResponseHeaders = function xhr_getAllResponseHeaders() { - + return new String(); } }; @@ -486,3 +639,10 @@ for(var n = 0; n < dom_nodes.length; n++) { dom_nodes[n].onreadystatechange(); } +function ActiveXObject() { + this.async = new String(); + this.loadXML = function AXOloadXML(url) { + } +} + + diff --git a/com.ibm.wala.cast.js/dat/prologue.js b/com.ibm.wala.cast.js/dat/prologue.js index ea9ec16cc..27e3d54f4 100755 --- a/com.ibm.wala.cast.js/dat/prologue.js +++ b/com.ibm.wala.cast.js/dat/prologue.js @@ -309,6 +309,10 @@ local_array.prototype = { res[i] = callback.call(thisArg, this[i], i, this); res.length = this.length; return res; + }, + + item: function Array_prototype_item(index) { + return this[index]; } }; @@ -404,6 +408,13 @@ local_string.prototype = { loadFile: function loadFile() { // magic function body handled in analysis. + }, + + link: function String_prototype_link(url) { + }, + + anchor: function String_prototype_anchor(url) { + return new String(); } }; @@ -608,3 +619,12 @@ Date.now = function Date_now() { return new Date().valueOf(); }; +function Error(str) { + this.message = new String(); +} + +function EvalError(str) { + this.message = new String(); +} + + diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java index fd5597024..25a3278da 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java @@ -1,26 +1,35 @@ package com.ibm.wala.cast.js.html; import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public class CompositeFileMapping implements FileMapping { - private final FileMapping a; - private final FileMapping b; + private final List mappings = new ArrayList(2); public CompositeFileMapping(FileMapping a, FileMapping b) { - this.a = a; - this.b = b; + addMapping(a); + addMapping(b); } + private void addMapping(FileMapping fm) { + if (fm instanceof CompositeFileMapping) { + mappings.addAll(((CompositeFileMapping)fm).mappings); + } else { + mappings.add(fm); + } + } @Override public IncludedPosition getIncludedPosition(Position line) { - IncludedPosition p = a.getIncludedPosition(line); - if (p != null) { - return p; - } else { - return b.getIncludedPosition(line); + for (FileMapping fm : mappings) { + IncludedPosition result = fm.getIncludedPosition(line); + if (result != null) { + return result; + } } + return null; } @Override @@ -30,6 +39,6 @@ public class CompositeFileMapping implements FileMapping { } public String toString() { - return a + "," + b; + return mappings.toString(); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DefaultSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DefaultSourceExtractor.java index 141e320fc..1a36a1d35 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DefaultSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DefaultSourceExtractor.java @@ -91,13 +91,17 @@ public class DefaultSourceExtractor extends DomLessSourceExtractor{ private void newLine(){ domRegion.println(""); } + + private String makeRef(String object, String property) { + return object + "[\"" + property + "\"]"; + } protected void writeElement(ITag tag, String cons, String varName){ Map> attrs = tag.getAllAttributes(); printlnIndented("function make_" + varName + "(parent) {", tag); stack.push(varName); - + printlnIndented("this.temp = " + cons + ";", tag); printlnIndented("this.temp(\"" + tag.getName() + "\");", tag); for (Map.Entry> e : attrs.entrySet()){ @@ -113,20 +117,23 @@ public class DefaultSourceExtractor extends DomLessSourceExtractor{ } if (tag.getName().equalsIgnoreCase("INPUT")) { String prop = attrs.containsKey("name") ? attrs.get("name").fst : null; String type = attrs.containsKey("type") ? attrs.get("type").fst : null; - + if (type != null && prop != null) { - if (type.equalsIgnoreCase("RADIO")) { - if (! sets.contains(Pair.make(forms.peek(), prop))) { - sets.add(Pair.make(forms.peek(), prop)); - printlnIndented(" currentForm." + prop + " = new Array();", tag); - printlnIndented(" currentForm." + prop + "Counter = 0;", tag); + //input tags do not need to be in a form + if (!forms.isEmpty()) { + if (type.equalsIgnoreCase("RADIO")) { + if (! sets.contains(Pair.make(forms.peek(), prop))) { + sets.add(Pair.make(forms.peek(), prop)); + printlnIndented(" " + makeRef("currentForm", prop) + " = new Array();", tag); + printlnIndented(" " + makeRef("currentForm", prop + "Counter") + " = 0;", tag); + } + printlnIndented(" " + makeRef(makeRef("currentForm", prop), prop + "Counter++") + " = this;", tag); + } else { + printlnIndented(" " + makeRef("currentForm", prop) + " = this;", tag); + } } - printlnIndented(" currentForm." + prop + "[currentForm." + prop + "Counter++] = this;", tag); - } else { - printlnIndented(" currentForm." + prop + " = this;", tag); } } - } printlnIndented(varName + " = this;", tag); printlnIndented("document." + varName + " = this;", tag); @@ -139,7 +146,8 @@ public class DefaultSourceExtractor extends DomLessSourceExtractor{ } protected void writeEventAttribute(ITag tag, Position pos, String attr, String value, String varName, String varName2){ - if(attr.substring(0,2).equals("on")) { + //There should probably be more checking to see what the attributes are since we allow things like: ; to be used as attributes now. + if(attr.length() >= 2 && attr.substring(0,2).equals("on")) { printlnIndented(varName + "." + attr + " = function " + tag.getName().toLowerCase() + "_" + attr + "(event) {" + value + "};", tag); entrypointRegion.println(varName2 + "." + attr + "(null);", tag.getElementPosition(), entrypointUrl); } else if (value != null) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index 66b73bce0..73693d450 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -23,6 +23,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.util.collections.Pair; @@ -35,6 +36,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } protected static class HtmlCallback implements IGeneratorCallback{ + + public static final boolean DEBUG = false; + protected final URL entrypointUrl; protected final IUrlResolver urlResolver; @@ -131,7 +135,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { url = new URL(entrypointUrl, "#" + tag.getElementPosition().getFirstOffset()); } catch (MalformedURLException e) { // TODO Auto-generated catch block - e.printStackTrace(); + if (DEBUG) { + e.printStackTrace(); + } } Position pos = a.getValue().snd; String attName = a.getKey(); @@ -171,7 +177,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } } catch (IOException e) { - System.err.println("Error reading script file: " + e.getMessage()); + if (DEBUG) { + System.err.println("Error reading script file: " + e.getMessage()); + } } } @@ -182,10 +190,23 @@ public class DomLessSourceExtractor extends JSSourceExtractor { return; } - InputStream scriptInputStream = scriptSrc.openConnection().getInputStream(); - try{ + InputStream scriptInputStream; + try { + scriptInputStream = scriptSrc.openConnection().getInputStream(); + } catch (Exception e) { + //it looks like this happens when we can't resolve the url? + if (DEBUG) { + System.err.println("Error reading script: " + scriptSrc); + System.err.println(e); + e.printStackTrace(System.err); + } + return; + } + + BufferedReader scriptReader = null; + try { String line; - BufferedReader scriptReader = new BufferedReader(new UnicodeReader(scriptInputStream, "UTF8")); + scriptReader = new BufferedReader(new UnicodeReader(scriptInputStream, "UTF8")); StringBuffer x = new StringBuffer(); while ((line = scriptReader.readLine()) != null) { x.append(line).append("\n"); @@ -194,7 +215,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { scriptRegion.println(x.toString(), scriptTag.getElementPosition(), scriptSrc); } finally { - scriptInputStream.close(); + if (scriptReader != null) { + scriptReader.close(); + } } } @@ -223,9 +246,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { finalRegion.println("window.__MAIN__();"); } } - + public Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) - throws IOException { + throws IOException, Error { InputStream inputStreamReader = WebUtil.getStream(entrypointUrl); IGeneratorCallback htmlCallback = createHtmlCallback(entrypointUrl, urlResolver); @@ -237,6 +260,9 @@ public class DomLessSourceExtractor extends JSSourceExtractor { // writing the final region into one SourceFileModule. File outputFile = createOutputFile(entrypointUrl, DELETE_UPON_EXIT, USE_TEMP_NAME); FileMapping fileMapping = finalRegion.writeToFile(new PrintStream(outputFile)); + if (fileMapping == null) { + fileMapping = new EmptyFileMapping(); + } MappedSourceModule singleFileModule = new MappedSourceFileModule(outputFile, outputFile.getName(), fileMapping); return Collections.singleton(singleFileModule); } @@ -262,7 +288,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException, Error { // DomLessSourceExtractor domLessScopeGenerator = new DomLessSourceExtractor(); JSSourceExtractor domLessScopeGenerator = new DefaultSourceExtractor(); JSSourceExtractor.DELETE_UPON_EXIT = false; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java new file mode 100644 index 000000000..fc743b69f --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java @@ -0,0 +1,19 @@ +package com.ibm.wala.cast.js.html; + +import java.io.PrintStream; + +import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; + +public class EmptyFileMapping implements FileMapping { + + @Override + public IncludedPosition getIncludedPosition(Position line) { + return null; + } + + @Override + public void dump(PrintStream ps) { + ps.println("empty mapping"); + } + +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java index 8bf32cfd7..d1913aa0c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IHtmlParser.java @@ -13,6 +13,8 @@ package com.ibm.wala.cast.js.html; import java.io.InputStream; import java.net.URL; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; + /** * @author danielk * @author yinnonh @@ -25,7 +27,8 @@ public interface IHtmlParser { * @param reader * @param callback * @param fileName + * @throws Error */ - public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName); + public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) throws Error; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java index c93ef1730..8f889d03e 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java @@ -14,6 +14,8 @@ import java.io.IOException; import java.net.URL; import java.util.Set; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; + /** * Extracts scripts from a given URL of an HTML. Retrieves also attached js files. * Provides file and line mapping for each extracted SourceFileModule back to the original file and line number. @@ -23,10 +25,10 @@ import java.util.Set; */ public abstract class JSSourceExtractor { - public static boolean DELETE_UPON_EXIT = false; + public static boolean DELETE_UPON_EXIT = true; - public static boolean USE_TEMP_NAME = false; + public static boolean USE_TEMP_NAME = true; - public abstract Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException; + public abstract Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java index 608e2c531..49e12db0a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java @@ -17,8 +17,8 @@ import java.net.URL; import java.net.URLConnection; import java.util.Set; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; -import com.ibm.wala.util.debug.Assertions; public class WebUtil { @@ -34,19 +34,7 @@ public class WebUtil { WebUtil.factory = factory; } - public static Set extractScriptFromHTML(String url) { - try { - if (! url.startsWith("file://")) { - url = "file://" + url; - } - return extractScriptFromHTML(new URL(url)); - } catch (MalformedURLException e) { - Assertions.UNREACHABLE( e.toString() ); - return null; - } - } - - public static Set extractScriptFromHTML(URL url) { + public static Set extractScriptFromHTML(URL url) throws Error { try { JSSourceExtractor extractor = new DefaultSourceExtractor(); return extractor.extractSources(url, factory.getParser(), new IdentityUrlResolver()); @@ -55,7 +43,7 @@ public class WebUtil { } } - public static void main(String[] args) throws MalformedURLException { + public static void main(String[] args) throws MalformedURLException, Error { System.err.println(extractScriptFromHTML(new URL(args[0]))); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java index 20b4c256a..75a5e1691 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java @@ -15,14 +15,19 @@ import java.io.InputStream; import java.net.URL; import java.util.Iterator; import java.util.List; +import java.util.Set; import net.htmlparser.jericho.Config; import net.htmlparser.jericho.Element; +import net.htmlparser.jericho.Logger; import net.htmlparser.jericho.LoggerProvider; import net.htmlparser.jericho.Source; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.js.html.IHtmlCallback; import com.ibm.wala.cast.js.html.IHtmlParser; +import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.warnings.Warning; /** @@ -30,20 +35,87 @@ import com.ibm.wala.cast.js.html.IHtmlParser; * Uses the Jericho parser to go over the HTML */ public class JerichoHtmlParser implements IHtmlParser{ + static Set warnings = HashSetFactory.make(); + static{ - Config.LoggerProvider = LoggerProvider.STDERR; + class CAstLoggerProvider implements LoggerProvider { + @Override + public Logger getLogger(String arg0) { + class CAstLogger implements Logger { + + @Override + public void debug(String arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void error(final String arg0) { + warnings.add(new Warning() { + @Override + public String getMsg() { + return arg0; + } + }); + } + + @Override + public void info(String arg0) { + // TODO Auto-generated method stub + + } + + @Override + public boolean isDebugEnabled() { + return true; + } + + @Override + public boolean isErrorEnabled() { + return true; + } + + @Override + public boolean isInfoEnabled() { + return true; + } + + @Override + public boolean isWarnEnabled() { + return true; + } + + @Override + public void warn(String arg0) { + // TODO Auto-generated method stub + + } + + } + + return new CAstLogger(); + } + + } + + Config.LoggerProvider = new CAstLoggerProvider(); } - public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) { + public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) throws TranslatorToCAst.Error { + warnings.clear(); Parser parser = new Parser(callback, fileName); Source src; try { src = new Source(reader); + src.setLogger(Config.LoggerProvider.getLogger(fileName)); List childElements = src.getChildElements(); for (Iterator nodeIterator = childElements.iterator(); nodeIterator.hasNext();) { Element e = nodeIterator.next(); parser.parse(e); } + if (! warnings.isEmpty()) { + throw new TranslatorToCAst.Error(warnings.iterator().next()); + } } catch (IOException e) { System.err.println("Error parsing file: " + e.getMessage()); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java index eac171bee..5f2f16d29 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java @@ -29,11 +29,9 @@ import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; -import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; -import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.DefUse; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.IRFactory; @@ -304,29 +302,6 @@ public class ForInContextSelector implements ContextSelector { return f; } - // simulate effect of ToString conversion on key - private InstanceKey simulateToString(IClassHierarchy cha, InstanceKey key) { - IClass stringClass = cha.lookupClass(JavaScriptTypes.String); - IClass numberClass = cha.lookupClass(JavaScriptTypes.Number); - if(key instanceof ConstantKey) { - Object value = ((ConstantKey)key).getValue(); - if(value instanceof String) { - return key; - } else if(value instanceof Number) { - Double dval = ((Number)value).doubleValue(); - return new ConstantKey(dval, numberClass); - } else if(value instanceof Boolean) { - Boolean bval = (Boolean)value; - return new ConstantKey(bval.toString(), stringClass); - } else if(value == null) { - return new ConstantKey("null", stringClass); - } - } /*else if(key != null && key.getConcreteType() == numberClass) { - return key; - }*/ - return new ConcreteTypeKey(stringClass); - } - public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); String calleeFullName = callee.getDeclaringClass().getName().toString(); @@ -334,22 +309,18 @@ public class ForInContextSelector implements ContextSelector { if(USE_NAME_TO_SELECT_CONTEXT) { if(calleeShortName.contains(HACK_METHOD_STR) && receiver.length > index) { // we assume that the argument is only used as a property name, so we can do ToString - return new ForInContext(baseContext, simulateToString(caller.getClassHierarchy(), receiver[index])); + return new ForInContext(baseContext, receiver[index]); } } else if(receiver.length > index) { Frequency f = usesFirstArgAsPropertyName(callee); - /* - if(f == Frequency.ALWAYS) { - return new ForInContext(baseContext, simulateToString(caller.getClassHierarchy(), receiver[index])); - } else if(f == Frequency.SOMETIMES) { - */ + if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) { if(receiver[index] == null) { IClass undef = caller.getClassHierarchy().lookupClass(JavaScriptTypes.Undefined); return new ForInContext(baseContext, new ConcreteTypeKey(undef)); } else { return new ForInContext(baseContext, receiver[index]); } - //} + } } if (USE_CPA_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { return new SelectiveCPAContext(baseContext, receiver); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index 4fdead4a0..a7ae2ebfe 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -20,6 +20,7 @@ import java.util.Set; import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.js.translator.JSAstTranslator; @@ -182,17 +183,22 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra } } }; - CAstEntity tree = toCAst.translateToCAst(); - if (DEBUG) { - CAstPrinter.printTo(tree, new PrintWriter(System.err)); + CAstEntity tree; + try { + tree = toCAst.translateToCAst(); + if (DEBUG) { + CAstPrinter.printTo(tree, new PrintWriter(System.err)); + } + toIR.translate(tree, M); + for (String name : names) { + IClass fcls = cl.lookupClass(name, cha); + cha.addClass(fcls); + } + return names; + } catch (Error e) { + return Collections.emptySet(); } - toIR.translate(tree, M); - for (String name : names) { - IClass fcls = cl.lookupClass(name, cha); - cha.addClass(fcls); - } - return names; - } catch (RuntimeException e) { + } catch (RuntimeException e) { return Collections.emptySet(); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index 0b9aeee77..d81f28cf9 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -73,6 +73,9 @@ import com.ibm.wala.ssa.SSAUnaryOpInstruction; import com.ibm.wala.ssa.SymbolTable; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.CancelRuntimeException; +import com.ibm.wala.util.MonitorUtil; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.IntSetAction; @@ -614,6 +617,11 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph rhs.getValue().foreach(new IntSetAction() { @Override public void act(int x) { + try { + MonitorUtil.throwExceptionIfCanceled(getBuilder().monitor); + } catch (CancelException e) { + throw new CancelRuntimeException(e); + } InstanceKey ik = system.getInstanceKey(x); handleJavascriptDispatch(instruction, ik); } @@ -732,6 +740,11 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph if (isStringConstant(iks1[i])) { for (int j = 0; j < iks2.length; j++) { if (isStringConstant(iks2[j])) { + try { + MonitorUtil.throwExceptionIfCanceled(builder.monitor); + } catch (CancelException e) { + throw new CancelRuntimeException(e); + } String v1 = (String) ((ConstantKey) iks1[i]).getValue(); String v2 = (String) ((ConstantKey) iks2[j]).getValue(); if (v1.indexOf(v2) == -1 && v2.indexOf(v1) == -1) { @@ -757,6 +770,11 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph if (doDefault) { for (int i = 0; i < iks1.length; i++) { for (int j = 0; j < iks2.length; j++) { + try { + MonitorUtil.throwExceptionIfCanceled(builder.monitor); + } catch (CancelException e) { + throw new CancelRuntimeException(e); + } if (handleBinaryOperatorArgs(iks1[i], iks2[j])) { changed = CHANGED; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 254de5034..8c0988de6 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -28,6 +28,7 @@ import com.ibm.wala.cast.ipa.callgraph.CAstAnalysisScope; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; import com.ibm.wala.cast.ir.ssa.AbstractReflectivePut; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.loader.JavaScriptLoader; @@ -53,6 +54,7 @@ import com.ibm.wala.ssa.SSABinaryOpInstruction; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.ssa.SSAPhiInstruction; +import com.ibm.wala.util.WalaException; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Iterator2Iterable; import com.ibm.wala.util.collections.ObjectArrayMapping; @@ -245,7 +247,12 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); - Set script = WebUtil.extractScriptFromHTML(url); + Set script = null; + try { + script = WebUtil.extractScriptFromHTML(url); + } catch (Error e) { + assert false : e.warning; + } Map summaries = findCorrelatedAccesses(script); return summaries; } @@ -256,7 +263,11 @@ public class CorrelationFinder { WebPageLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory); CAstAnalysisScope scope = new CAstAnalysisScope(scripts, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); - Util.checkForFrontEndErrors(cha); + try { + Util.checkForFrontEndErrors(cha); + } catch (WalaException e) { + return Collections.emptyMap(); + } IRFactory factory = AstIRFactory.makeDefaultFactory(); Map correlations = HashMapFactory.make(); 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 efd0d7378..93d951e0e 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 @@ -13,7 +13,6 @@ package com.ibm.wala.cast.js.loader; import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -72,7 +71,6 @@ import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.Language; import com.ibm.wala.classLoader.LanguageImpl; import com.ibm.wala.classLoader.Module; -import com.ibm.wala.classLoader.ModuleEntry; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.classLoader.SourceURLModule; @@ -652,6 +650,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { public IClass getSuperclass() { return null; } + } class JavaScriptCodeBody extends AstFunctionClass { @@ -693,7 +692,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { JavaScriptMethodObject(IClass cls, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(cls, functionQualifiers, cfg, symtab, AstMethodReference.fnReference(cls.getReference()), hasCatchBlock, caughtTypes, - hasMonitorOp, lexicalInfo, debugInfo); + hasMonitorOp, lexicalInfo, debugInfo, null); // force creation of these constants by calling the getter methods symtab.getNullConstant(); @@ -925,14 +924,4 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { protected boolean shouldTranslate(CAstEntity entity) { return true; } - - @Override - protected void finishTranslation() { - Iterator ms = getModulesWithParseErrors(); - while (ms.hasNext()) { - ModuleEntry m = ms.next(); - System.err.println(m); - System.err.println(getMessages(m)); - } - } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java index 6fd454797..91414fe41 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java @@ -6,11 +6,12 @@ import com.ibm.wala.cast.loader.CAstAbstractLoader; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.classLoader.ModuleEntry; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.util.WalaException; import com.ibm.wala.util.warnings.Warning; public class Util { - public static void checkForFrontEndErrors(IClassHierarchy cha) { + public static void checkForFrontEndErrors(IClassHierarchy cha) throws WalaException { StringBuffer message = null; for(IClassLoader loader : cha.getLoaders()) { if (loader instanceof CAstAbstractLoader) { @@ -33,7 +34,7 @@ public class Util { } if (message != null) { message.append("end of front end errors\n"); - throw new AssertionError(String.valueOf(message)); + throw new WalaException(String.valueOf(message)); } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java index 3afecfea2..8f2931575 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java @@ -612,12 +612,12 @@ public class SSAConversion extends AbstractSSAConversion { System.err.println(("<<< done " + ir.getMethod())); return ssa.getComputedLocalMap(); } catch (RuntimeException e) { - System.err.println(("exception " + e + " while converting:")); - System.err.println(ir); +// System.err.println(("exception " + e + " while converting:")); +// System.err.println(ir); throw e; } catch (Error e) { - System.err.println(("error " + e + " while converting:")); - System.err.println(ir); +// System.err.println(("error " + e + " while converting:")); +// System.err.println(ir); throw e; } } 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 f36a6d18a..5f470b4d2 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 @@ -74,12 +74,14 @@ import com.ibm.wala.ssa.SymbolTable; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.MapUtil; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.graph.INodeWithNumber; import com.ibm.wala.util.graph.impl.SparseNumberedGraph; +import com.ibm.wala.util.graph.traverse.DFS; import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.IntSetUtil; import com.ibm.wala.util.intset.MutableIntSet; @@ -880,6 +882,8 @@ public abstract class AstTranslator extends CAstVisitor blocks = new ArrayList(); + private PreBasicBlock entryBlock; + private final Map nodeToBlock = new LinkedHashMap(); private final Map>> delayedEdges = new LinkedHashMap>>(); @@ -973,6 +977,7 @@ public abstract class AstTranslator extends CAstVisitor blocks, + IncipientCFG icfg, + EdgeOperation normal, + EdgeOperation except) { + for (PreBasicBlock src : blocks) { + for (Iterator j = icfg.getSuccNodes(src); j.hasNext();) { + PreBasicBlock dst = (PreBasicBlock) j.next(); + if (isCatchBlock(dst.getNumber()) || (dst.isExitBlock() && icfg.exceptionalToExit.contains(src))) { + except.act(src, dst); + } + + if (dst.isExitBlock() ? icfg.normalToExit.contains(src) : !isCatchBlock(dst.getNumber())) { + normal.act(src, dst); + } + } + } + } + AstCFG(CAstEntity n, IncipientCFG icfg, SymbolTable symtab) { super(null); + + Set liveBlocks = DFS.getReachableNodes(icfg, Collections.singleton(icfg.entryBlock)); List blocks = icfg.blocks; - + boolean hasDeadBlocks = blocks.size() > liveBlocks.size(); + this.symtab = symtab; functionName = n.getName(); - instructionToBlockMap = new int[blocks.size()]; + instructionToBlockMap = new int[liveBlocks.size()]; - for (int i = 0; i < blocks.size(); i++) - instructionToBlockMap[i] = blocks.get(i).getLastInstructionIndex(); + final Map> normalEdges = + hasDeadBlocks? HashMapFactory.>make() : null; + final Map> exceptionalEdges = + hasDeadBlocks? HashMapFactory.>make() : null; + if (hasDeadBlocks) { + transferEdges(liveBlocks, icfg, new EdgeOperation() { + public void act(PreBasicBlock src, PreBasicBlock dst) { + if (! normalEdges.containsKey(src)) { + normalEdges.put(src, HashSetFactory.make()); + } + normalEdges.get(src).add(dst); + } + }, new EdgeOperation() { + public void act(PreBasicBlock src, PreBasicBlock dst) { + if (! exceptionalEdges.containsKey(src)) { + exceptionalEdges.put(src, HashSetFactory.make()); + } + exceptionalEdges.get(src).add(dst); + } + }); + } + + for (int i = 0, blockNumber = 0; i < blocks.size(); i++) { + PreBasicBlock pb = blocks.get(i); + if (liveBlocks.contains(pb)) { + instructionToBlockMap[blockNumber] = blocks.get(i).getLastInstructionIndex(); - for (int i = 0; i < blocks.size(); i++) { - PreBasicBlock block = blocks.get(i); - this.addNode(block); - if (block.isCatchBlock()) { - setCatchBlock(i); + PreBasicBlock block = blocks.get(i); + block.setGraphNodeId(-1); + this.addNode(block); + if (block.isCatchBlock()) { + setCatchBlock(blockNumber); + } + + if (DEBUG_CFG) { + System.err.println(("added " + blocks.get(i) + " to final CFG as " + getNumber(blocks.get(i)))); + } + + blockNumber++; } - - if (DEBUG_CFG) - System.err.println(("added " + blocks.get(i) + " to final CFG as " + getNumber(blocks.get(i)))); } if (DEBUG_CFG) System.err.println((getMaxNumber() + " blocks total")); init(); - for (int i = 0; i < blocks.size(); i++) { - PreBasicBlock src = blocks.get(i); - for (Iterator j = icfg.getSuccNodes(src); j.hasNext();) { - PreBasicBlock dst = (PreBasicBlock) j.next(); - if (isCatchBlock(dst.getNumber()) || (dst.isExitBlock() && icfg.exceptionalToExit.contains(src))) { - if (DEBUG_CFG) - System.err.println(("exceptonal edge " + src + " -> " + dst)); - addExceptionalEdge(src, dst); - } - - if (dst.isExitBlock() ? icfg.normalToExit.contains(src) : !isCatchBlock(dst.getNumber())) { - if (DEBUG_CFG) - System.err.println(("normal edge " + src + " -> " + dst)); - addNormalEdge(src, dst); + if (hasDeadBlocks) { + for (int i = 0; i < blocks.size(); i++) { + PreBasicBlock src = blocks.get(i); + if (liveBlocks.contains(src)) { + if (normalEdges.containsKey(src)) { + for(PreBasicBlock succ : normalEdges.get(src)) { + addNormalEdge(src, succ); + } + } + if (exceptionalEdges.containsKey(src)) { + for(PreBasicBlock succ : exceptionalEdges.get(src)) { + addExceptionalEdge(src, succ); + } + } } } + } else { + transferEdges(liveBlocks, icfg, new EdgeOperation() { + public void act(PreBasicBlock src, PreBasicBlock dst) { + addNormalEdge(src, dst); + } + }, new EdgeOperation() { + public void act(PreBasicBlock src, PreBasicBlock dst) { + addExceptionalEdge(src, dst); + } + }); } - + int x = 0; instructions = new SSAInstruction[icfg.currentInstruction]; for (int i = 0; i < blocks.size(); i++) { - List bi = blocks.get(i).instructions(); - for (int j = 0; j < bi.size(); j++) { - instructions[x++] = bi.get(j); + if (liveBlocks.contains(blocks.get(i))) { + List bi = blocks.get(i).instructions(); + for (int j = 0; j < bi.size(); j++) { + instructions[x++] = bi.get(j); + } } } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java index 1bc4ecf74..a29542d0e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java @@ -13,14 +13,25 @@ import com.ibm.wala.cast.tree.impl.CAstNodeTypeMapRecorder; import com.ibm.wala.cast.tree.impl.CAstSourcePositionRecorder; import com.ibm.wala.cast.tree.rewrite.CAstCloner; import com.ibm.wala.cast.tree.rewrite.CAstRewriter; -import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.cast.tree.rewrite.CAstRewriter.CopyKey; import com.ibm.wala.cast.tree.rewrite.CAstRewriter.RewriteContext; +import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; +import com.ibm.wala.util.warnings.Warning; public interface TranslatorToCAst { public , K extends CopyKey> void addRewriter(CAstRewriterFactory factory, boolean prepend); - public CAstEntity translateToCAst() throws IOException; + public class Error extends Exception { + public final Warning warning; + + public Error(Warning message) { + super(message.getMsg()); + warning = message; + } + + } + + public CAstEntity translateToCAst() throws Error, IOException; public interface WalkContext, T> { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java index 4fd5aeef2..91093f3cb 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java @@ -10,6 +10,8 @@ *****************************************************************************/ package com.ibm.wala.cast.loader; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -23,6 +25,7 @@ import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; public abstract class AstDynamicPropertyClass extends AstClass { @@ -89,6 +92,10 @@ public abstract class AstDynamicPropertyClass extends AstClass { public IClassHierarchy getClassHierarchy() { return AstDynamicPropertyClass.this.getClassHierarchy(); } + + public Collection getAnnotations() { + return Collections.emptySet(); + } }); return declaredFields.get(name); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java index 7055522af..65fd4a827 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java @@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IField; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.strings.Atom; public class AstField implements IField { @@ -26,16 +27,24 @@ public class AstField implements IField { private final FieldReference ref; private final IClass declaringClass; private final IClassHierarchy cha; + private final Collection annotations; public AstField(FieldReference ref, Collection qualifiers, IClass declaringClass, - IClassHierarchy cha) + IClassHierarchy cha, + Collection annotations) { this.declaringClass = declaringClass; this.qualifiers = qualifiers; this.ref = ref; this.cha = cha; + this.annotations = annotations; + } + + + public Collection getAnnotations() { + return annotations; } public IClass getDeclaringClass() { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java index 8b6416a00..125b6562f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java @@ -26,6 +26,7 @@ import com.ibm.wala.types.Descriptor; import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.Selector; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.strings.Atom; @@ -113,10 +114,11 @@ public abstract class AstMethod implements IMethod { private final TypeReference[][] catchTypes; private final AstLexicalInformation lexicalInfo; private final DebuggingInformation debugInfo; + private final Collection annotations; protected AstMethod(IClass cls, Collection qualifiers, AbstractCFG cfg, SymbolTable symtab, MethodReference ref, boolean hasCatchBlock, TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, - DebuggingInformation debugInfo) { + DebuggingInformation debugInfo, Collection annotations) { this.cls = cls; this.cfg = cfg; this.ref = ref; @@ -127,12 +129,14 @@ public abstract class AstMethod implements IMethod { this.hasMonitorOp = hasMonitorOp; this.lexicalInfo = lexicalInfo; this.debugInfo = debugInfo; + this.annotations = annotations; } - protected AstMethod(IClass cls, Collection qualifiers, MethodReference ref) { + protected AstMethod(IClass cls, Collection qualifiers, MethodReference ref, Collection annotations) { this.cls = cls; this.qualifiers = qualifiers; this.ref = ref; + this.annotations = annotations; this.cfg = null; this.symtab = null; @@ -173,6 +177,10 @@ public abstract class AstMethod implements IMethod { return debugInfo; } + public Collection getAnnotations() { + return annotations; + } + /** * Parents of this method with respect to lexical scoping, that is, methods * containing state possibly referenced lexically in this method diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java index 8b200975a..72bfe78e9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java @@ -139,21 +139,17 @@ public abstract class CAstAbstractModuleLoader extends CAstAbstractLoader { } else if (moduleEntry instanceof SourceModule) { TranslatorToCAst xlatorToCAst = getTranslatorToCAst(ast, (SourceModule) moduleEntry); - CAstEntity fileEntity = xlatorToCAst.translateToCAst(); - - if (fileEntity != null) { + CAstEntity fileEntity = null; + try { + fileEntity = xlatorToCAst.translateToCAst(); + if (DEBUG) { CAstPrinter.printTo(fileEntity, new PrintWriter(System.err)); } topLevelEntities.add(Pair.make(fileEntity, moduleEntry)); - } else { - addMessage(moduleEntry, new Warning(Warning.SEVERE) { - @Override - public String getMsg() { - return "parse error"; - } - }); + } catch (TranslatorToCAst.Error e) { + addMessage(moduleEntry, e.warning); } } } catch (final MalformedURLException e) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java index 5f2460155..cfb10ca75 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstEntity.java @@ -177,4 +177,5 @@ public interface CAstEntity { * The CAst type of this entity. */ CAstType getType(); + } 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 3fda1d2df..6fdc59751 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 @@ -28,6 +28,8 @@ import com.ibm.wala.util.debug.Assertions; * TODO: document me. */ public abstract class CAstVisitor { + + public static boolean DEBUG = true; private Position currentPosition; @@ -899,15 +901,15 @@ public abstract class CAstVisitor { switch (n.getKind()) { case CAstNode.ARRAY_REF: { if (doVisitArrayRefNode(n, v, a, assign, preOp, context, visitor)) { - return true; + return true; } break; } case CAstNode.OBJECT_REF: { - if (assign ? visitor.visitObjectRefAssign(n, v, a, context, visitor) - : visitor.visitObjectRefAssignOp(n, v, a, preOp, context, visitor)) + if (assign ? visitor.visitObjectRefAssign(n, v, a, context, visitor) : visitor.visitObjectRefAssignOp(n, v, a, preOp, + context, visitor)) return true; visitor.visit(n.getChild(0), context, visitor); if (assign) @@ -918,8 +920,8 @@ public abstract class CAstVisitor { } case CAstNode.BLOCK_EXPR: { - if (assign ? visitor.visitBlockExprAssign(n, v, a, context, visitor) - : visitor.visitBlockExprAssignOp(n, v, a, preOp, context, visitor)) + if (assign ? visitor.visitBlockExprAssign(n, v, a, context, visitor) : visitor.visitBlockExprAssignOp(n, v, a, preOp, + context, visitor)) return true; // FIXME: is it correct to ignore all the other children? if (visitor.visitAssignNodes(n.getChild(n.getChildCount() - 1), context, v, a, visitor)) @@ -932,8 +934,7 @@ public abstract class CAstVisitor { } case CAstNode.VAR: { - if (assign ? visitor.visitVarAssign(n, v, a, context, visitor) - : visitor.visitVarAssignOp(n, v, a, preOp, context, visitor)) + if (assign ? visitor.visitVarAssign(n, v, a, context, visitor) : visitor.visitVarAssignOp(n, v, a, preOp, context, visitor)) return true; if (assign) visitor.leaveVarAssign(n, v, a, context, visitor); @@ -944,10 +945,10 @@ public abstract class CAstVisitor { default: { if (!visitor.doVisitAssignNodes(n, context, v, a, visitor)) { - System.err.println(("cannot handle assign to kind " + n.getKind())); - throw new UnsupportedOperationException( - "cannot handle assignment: " + - CAstPrinter.print(a, context.getSourceMap())); + if (DEBUG) { + System.err.println(("cannot handle assign to kind " + n.getKind())); + } + throw new UnsupportedOperationException("cannot handle assignment: " + CAstPrinter.print(a, context.getSourceMap())); } } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/ContextKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/ContextKey.java index 154eed38f..f8cb2d9ac 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/ContextKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/ContextKey.java @@ -102,6 +102,458 @@ public interface ContextKey { new ParameterKey(46), new ParameterKey(47), new ParameterKey(48), - new ParameterKey(49) + new ParameterKey(49), + //added based on functions seen in the wild... + //--------- + new ParameterKey(50), + new ParameterKey(51), + new ParameterKey(52), + new ParameterKey(53), + new ParameterKey(54), + new ParameterKey(55), + new ParameterKey(56), + new ParameterKey(57), + new ParameterKey(58), + new ParameterKey(59), + new ParameterKey(60), + new ParameterKey(61), + new ParameterKey(62), + new ParameterKey(63), + new ParameterKey(64), + new ParameterKey(65), + new ParameterKey(66), + new ParameterKey(67), + new ParameterKey(68), + new ParameterKey(69), + new ParameterKey(70), + new ParameterKey(71), + new ParameterKey(72), + new ParameterKey(73), + new ParameterKey(74), + new ParameterKey(75), + new ParameterKey(76), + new ParameterKey(77), + new ParameterKey(78), + new ParameterKey(79), + new ParameterKey(80), + new ParameterKey(81), + new ParameterKey(82), + new ParameterKey(83), + new ParameterKey(84), + new ParameterKey(85), + new ParameterKey(86), + new ParameterKey(87), + new ParameterKey(88), + new ParameterKey(89), + new ParameterKey(90), + new ParameterKey(91), + new ParameterKey(92), + new ParameterKey(93), + new ParameterKey(94), + new ParameterKey(95), + new ParameterKey(96), + new ParameterKey(97), + new ParameterKey(98), + new ParameterKey(99), + new ParameterKey(100), + new ParameterKey(101), + new ParameterKey(102), + new ParameterKey(103), + new ParameterKey(104), + new ParameterKey(105), + new ParameterKey(106), + new ParameterKey(107), + new ParameterKey(108), + new ParameterKey(109), + new ParameterKey(110), + new ParameterKey(111), + new ParameterKey(112), + new ParameterKey(113), + new ParameterKey(114), + new ParameterKey(115), + new ParameterKey(116), + new ParameterKey(117), + new ParameterKey(118), + new ParameterKey(119), + new ParameterKey(120), + new ParameterKey(121), + new ParameterKey(122), + new ParameterKey(123), + new ParameterKey(124), + new ParameterKey(125), + new ParameterKey(126), + new ParameterKey(127), + new ParameterKey(128), + new ParameterKey(129), + new ParameterKey(130), + new ParameterKey(131), + new ParameterKey(132), + new ParameterKey(133), + new ParameterKey(134), + new ParameterKey(135), + new ParameterKey(136), + new ParameterKey(137), + new ParameterKey(138), + new ParameterKey(139), + new ParameterKey(140), + new ParameterKey(141), + new ParameterKey(142), + new ParameterKey(143), + new ParameterKey(144), + new ParameterKey(145), + new ParameterKey(146), + new ParameterKey(147), + new ParameterKey(148), + new ParameterKey(149), + new ParameterKey(150), + new ParameterKey(151), + new ParameterKey(152), + new ParameterKey(153), + new ParameterKey(154), + new ParameterKey(155), + new ParameterKey(156), + new ParameterKey(157), + new ParameterKey(158), + new ParameterKey(159), + new ParameterKey(160), + new ParameterKey(161), + new ParameterKey(162), + new ParameterKey(163), + new ParameterKey(164), + new ParameterKey(165), + new ParameterKey(166), + new ParameterKey(167), + new ParameterKey(168), + new ParameterKey(169), + new ParameterKey(170), + new ParameterKey(171), + new ParameterKey(172), + new ParameterKey(173), + new ParameterKey(174), + new ParameterKey(175), + new ParameterKey(176), + new ParameterKey(177), + new ParameterKey(178), + new ParameterKey(179), + new ParameterKey(180), + new ParameterKey(181), + new ParameterKey(182), + new ParameterKey(183), + new ParameterKey(184), + new ParameterKey(185), + new ParameterKey(186), + new ParameterKey(187), + new ParameterKey(188), + new ParameterKey(189), + new ParameterKey(190), + new ParameterKey(191), + new ParameterKey(192), + new ParameterKey(193), + new ParameterKey(194), + new ParameterKey(195), + new ParameterKey(196), + new ParameterKey(197), + new ParameterKey(198), + new ParameterKey(199), + new ParameterKey(200), + new ParameterKey(201), + new ParameterKey(202), + new ParameterKey(203), + new ParameterKey(204), + new ParameterKey(205), + new ParameterKey(206), + new ParameterKey(207), + new ParameterKey(208), + new ParameterKey(209), + new ParameterKey(210), + new ParameterKey(211), + new ParameterKey(212), + new ParameterKey(213), + new ParameterKey(214), + new ParameterKey(215), + new ParameterKey(216), + new ParameterKey(217), + new ParameterKey(218), + new ParameterKey(219), + new ParameterKey(220), + new ParameterKey(221), + new ParameterKey(222), + new ParameterKey(223), + new ParameterKey(224), + new ParameterKey(225), + new ParameterKey(226), + new ParameterKey(227), + new ParameterKey(228), + new ParameterKey(229), + new ParameterKey(230), + new ParameterKey(231), + new ParameterKey(232), + new ParameterKey(233), + new ParameterKey(234), + new ParameterKey(235), + new ParameterKey(236), + new ParameterKey(237), + new ParameterKey(238), + new ParameterKey(239), + new ParameterKey(240), + new ParameterKey(241), + new ParameterKey(242), + new ParameterKey(243), + new ParameterKey(244), + new ParameterKey(245), + new ParameterKey(246), + new ParameterKey(247), + new ParameterKey(248), + new ParameterKey(249), + new ParameterKey(250), + new ParameterKey(251), + new ParameterKey(252), + new ParameterKey(253), + new ParameterKey(254), + new ParameterKey(255), + new ParameterKey(256), + new ParameterKey(257), + new ParameterKey(258), + new ParameterKey(259), + new ParameterKey(260), + new ParameterKey(261), + new ParameterKey(262), + new ParameterKey(263), + new ParameterKey(264), + new ParameterKey(265), + new ParameterKey(266), + new ParameterKey(267), + new ParameterKey(268), + new ParameterKey(269), + new ParameterKey(270), + new ParameterKey(271), + new ParameterKey(272), + new ParameterKey(273), + new ParameterKey(274), + new ParameterKey(275), + new ParameterKey(276), + new ParameterKey(277), + new ParameterKey(278), + new ParameterKey(279), + new ParameterKey(280), + new ParameterKey(281), + new ParameterKey(282), + new ParameterKey(283), + new ParameterKey(284), + new ParameterKey(285), + new ParameterKey(286), + new ParameterKey(287), + new ParameterKey(288), + new ParameterKey(289), + new ParameterKey(290), + new ParameterKey(291), + new ParameterKey(292), + new ParameterKey(293), + new ParameterKey(294), + new ParameterKey(295), + new ParameterKey(296), + new ParameterKey(297), + new ParameterKey(298), + new ParameterKey(299), + new ParameterKey(300), + new ParameterKey(301), + new ParameterKey(302), + new ParameterKey(303), + new ParameterKey(304), + new ParameterKey(305), + new ParameterKey(306), + new ParameterKey(307), + new ParameterKey(308), + new ParameterKey(309), + new ParameterKey(310), + new ParameterKey(311), + new ParameterKey(312), + new ParameterKey(313), + new ParameterKey(314), + new ParameterKey(315), + new ParameterKey(316), + new ParameterKey(317), + new ParameterKey(318), + new ParameterKey(319), + new ParameterKey(320), + new ParameterKey(321), + new ParameterKey(322), + new ParameterKey(323), + new ParameterKey(324), + new ParameterKey(325), + new ParameterKey(326), + new ParameterKey(327), + new ParameterKey(328), + new ParameterKey(329), + new ParameterKey(330), + new ParameterKey(331), + new ParameterKey(332), + new ParameterKey(333), + new ParameterKey(334), + new ParameterKey(335), + new ParameterKey(336), + new ParameterKey(337), + new ParameterKey(338), + new ParameterKey(339), + new ParameterKey(340), + new ParameterKey(341), + new ParameterKey(342), + new ParameterKey(343), + new ParameterKey(344), + new ParameterKey(345), + new ParameterKey(346), + new ParameterKey(347), + new ParameterKey(348), + new ParameterKey(349), + new ParameterKey(350), + new ParameterKey(351), + new ParameterKey(352), + new ParameterKey(353), + new ParameterKey(354), + new ParameterKey(355), + new ParameterKey(356), + new ParameterKey(357), + new ParameterKey(358), + new ParameterKey(359), + new ParameterKey(360), + new ParameterKey(361), + new ParameterKey(362), + new ParameterKey(363), + new ParameterKey(364), + new ParameterKey(365), + new ParameterKey(366), + new ParameterKey(367), + new ParameterKey(368), + new ParameterKey(369), + new ParameterKey(370), + new ParameterKey(371), + new ParameterKey(372), + new ParameterKey(373), + new ParameterKey(374), + new ParameterKey(375), + new ParameterKey(376), + new ParameterKey(377), + new ParameterKey(378), + new ParameterKey(379), + new ParameterKey(380), + new ParameterKey(381), + new ParameterKey(382), + new ParameterKey(383), + new ParameterKey(384), + new ParameterKey(385), + new ParameterKey(386), + new ParameterKey(387), + new ParameterKey(388), + new ParameterKey(389), + new ParameterKey(390), + new ParameterKey(391), + new ParameterKey(392), + new ParameterKey(393), + new ParameterKey(394), + new ParameterKey(395), + new ParameterKey(396), + new ParameterKey(397), + new ParameterKey(398), + new ParameterKey(399), + new ParameterKey(400), + new ParameterKey(401), + new ParameterKey(402), + new ParameterKey(403), + new ParameterKey(404), + new ParameterKey(405), + new ParameterKey(406), + new ParameterKey(407), + new ParameterKey(408), + new ParameterKey(409), + new ParameterKey(410), + new ParameterKey(411), + new ParameterKey(412), + new ParameterKey(413), + new ParameterKey(414), + new ParameterKey(415), + new ParameterKey(416), + new ParameterKey(417), + new ParameterKey(418), + new ParameterKey(419), + new ParameterKey(420), + new ParameterKey(421), + new ParameterKey(422), + new ParameterKey(423), + new ParameterKey(424), + new ParameterKey(425), + new ParameterKey(426), + new ParameterKey(427), + new ParameterKey(428), + new ParameterKey(429), + new ParameterKey(430), + new ParameterKey(431), + new ParameterKey(432), + new ParameterKey(433), + new ParameterKey(434), + new ParameterKey(435), + new ParameterKey(436), + new ParameterKey(437), + new ParameterKey(438), + new ParameterKey(439), + new ParameterKey(440), + new ParameterKey(441), + new ParameterKey(442), + new ParameterKey(443), + new ParameterKey(444), + new ParameterKey(445), + new ParameterKey(446), + new ParameterKey(447), + new ParameterKey(448), + new ParameterKey(449), + new ParameterKey(450), + new ParameterKey(451), + new ParameterKey(452), + new ParameterKey(453), + new ParameterKey(454), + new ParameterKey(455), + new ParameterKey(456), + new ParameterKey(457), + new ParameterKey(458), + new ParameterKey(459), + new ParameterKey(460), + new ParameterKey(461), + new ParameterKey(462), + new ParameterKey(463), + new ParameterKey(464), + new ParameterKey(465), + new ParameterKey(466), + new ParameterKey(467), + new ParameterKey(468), + new ParameterKey(469), + new ParameterKey(470), + new ParameterKey(471), + new ParameterKey(472), + new ParameterKey(473), + new ParameterKey(474), + new ParameterKey(475), + new ParameterKey(476), + new ParameterKey(477), + new ParameterKey(478), + new ParameterKey(479), + new ParameterKey(480), + new ParameterKey(481), + new ParameterKey(482), + new ParameterKey(483), + new ParameterKey(484), + new ParameterKey(485), + new ParameterKey(486), + new ParameterKey(487), + new ParameterKey(488), + new ParameterKey(489), + new ParameterKey(490), + new ParameterKey(491), + new ParameterKey(492), + new ParameterKey(493), + new ParameterKey(494), + new ParameterKey(495), + new ParameterKey(496), + new ParameterKey(497), + new ParameterKey(498), + new ParameterKey(499) }; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java index 288719f5f..c079d7296 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java @@ -152,7 +152,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap */ private final Set clinitVisited = HashSetFactory.make(); - private IProgressMonitor monitor; + public IProgressMonitor monitor; protected SSAPropagationCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache, PointerKeyFactory pointerKeyFactory) { From 1079d68aea749e6219724f893b6c53924f11eab9 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 10 Apr 2013 10:33:28 -0700 Subject: [PATCH 052/187] delete files --- .../java/com/ibm/wala/cast/loader/CAstAbstractNativeLoader.java | 0 .../source/java/com/ibm/wala/cast/tree/TranslatorToCAst.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractNativeLoader.java delete mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/TranslatorToCAst.java diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractNativeLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractNativeLoader.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/TranslatorToCAst.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/TranslatorToCAst.java deleted file mode 100644 index e69de29bb..000000000 From 355bf4ad69f36e77ee715689147cc9033da01fd8 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 10 Apr 2013 10:42:33 -0700 Subject: [PATCH 053/187] update ignores --- com.ibm.wala.cast.js.rhino.test/.gitignore | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/.gitignore b/com.ibm.wala.cast.js.rhino.test/.gitignore index 689a85716..2d19fc766 100644 --- a/com.ibm.wala.cast.js.rhino.test/.gitignore +++ b/com.ibm.wala.cast.js.rhino.test/.gitignore @@ -1,17 +1 @@ -/apollo-example.html -/crawl.html -/iframeTest2.html -/list.html -/nojs.html -/page1.html -/page11.html -/page11b.html -/page12.html -/page13.html -/page15.html -/page16.html -/page17.html -/page2.html -/page3.html -/page4.html -/windowx.html +*.html From 4f7ec12eddea04bf67f89ed99c5c4e316f638f73 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 10 Apr 2013 12:22:57 -0700 Subject: [PATCH 054/187] Expose temporary file created by source extractor. Fixes #19 --- .../wala/cast/js/test/JSCallGraphBuilderUtil.java | 2 +- .../com/ibm/wala/cast/js/test/TestWebUtil.java | 4 ++-- .../wala/cast/js/html/DomLessSourceExtractor.java | 11 +++++++++++ .../ibm/wala/cast/js/html/JSSourceExtractor.java | 8 ++++++++ .../source/com/ibm/wala/cast/js/html/WebUtil.java | 15 +++++++++++++-- .../callgraph/correlations/CorrelationFinder.java | 2 +- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 992c924af..3cd2a7a02 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -137,7 +137,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J IRFactory irFactory = AstIRFactory.makeDefaultFactory(); JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { - Set script = WebUtil.extractScriptFromHTML(url); + Set script = WebUtil.extractScriptFromHTML(url).fst; scripts = script.toArray(new SourceModule[script.size()]); } catch (Error e) { SourceModule dummy = new SourceURLModule(url); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java index f57386a22..3210b8703 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestWebUtil.java @@ -27,14 +27,14 @@ public class TestWebUtil extends WalaTestCase { @Test public void testAjaxslt() throws Error { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); Assert.assertTrue(url != null); - Set mod = WebUtil.extractScriptFromHTML( url ); + Set mod = WebUtil.extractScriptFromHTML( url ).fst; Assert.assertTrue(mod != null); } @Test public void testAjaxpath() throws Error { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xpath.html"); Assert.assertTrue(url != null); - Set mod = WebUtil.extractScriptFromHTML( url ); + Set mod = WebUtil.extractScriptFromHTML( url ).fst; Assert.assertTrue(mod != null); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index 73693d450..fedeb48d4 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -246,6 +246,11 @@ public class DomLessSourceExtractor extends JSSourceExtractor { finalRegion.println("window.__MAIN__();"); } } + + /** + * for storing the name of the temp file created by extractSources() + */ + private File tempFile; public Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error { @@ -259,6 +264,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { // writing the final region into one SourceFileModule. File outputFile = createOutputFile(entrypointUrl, DELETE_UPON_EXIT, USE_TEMP_NAME); + tempFile = outputFile; FileMapping fileMapping = finalRegion.writeToFile(new PrintStream(outputFile)); if (fileMapping == null) { fileMapping = new EmptyFileMapping(); @@ -301,5 +307,10 @@ public class DomLessSourceExtractor extends JSSourceExtractor { entry.getMapping().dump(System.out); } + + @Override + public File getTempFile() { + return tempFile; + } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java index 8f889d03e..0e25a5d79 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/JSSourceExtractor.java @@ -10,6 +10,7 @@ *****************************************************************************/ package com.ibm.wala.cast.js.html; +import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Set; @@ -31,4 +32,11 @@ public abstract class JSSourceExtractor { public abstract Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error; + /** + * Returns the temporary file created by a call to + * {@link #extractSources(URL, IHtmlParser, IUrlResolver)} which holds all the + * discovered JS source. If no such file exists, returns null + */ + public abstract File getTempFile(); + } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java index 49e12db0a..f7e2fccb8 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java @@ -10,6 +10,7 @@ *****************************************************************************/ package com.ibm.wala.cast.js.html; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -19,6 +20,7 @@ import java.util.Set; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; +import com.ibm.wala.util.collections.Pair; public class WebUtil { @@ -34,10 +36,19 @@ public class WebUtil { WebUtil.factory = factory; } - public static Set extractScriptFromHTML(URL url) throws Error { + /** + * + * @param url + * @return a pair (S,F), where S is a set of extracted sources, and F is the + * temp file holding the combined sources (or null if no + * such file exists) + * @throws Error + */ + public static Pair,File> extractScriptFromHTML(URL url) throws Error { try { JSSourceExtractor extractor = new DefaultSourceExtractor(); - return extractor.extractSources(url, factory.getParser(), new IdentityUrlResolver()); + Set sources = extractor.extractSources(url, factory.getParser(), new IdentityUrlResolver()); + return Pair.make(sources, extractor.getTempFile()); } catch (IOException e) { throw new RuntimeException("trouble with " + url, e); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 8c0988de6..f69be0d93 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -249,7 +249,7 @@ public class CorrelationFinder { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); Set script = null; try { - script = WebUtil.extractScriptFromHTML(url); + script = WebUtil.extractScriptFromHTML(url).fst; } catch (Error e) { assert false : e.warning; } From 00eb1d2bd2aff0747723c4457ae49e40309e8e65 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 10 Apr 2013 16:01:27 -0700 Subject: [PATCH 055/187] Set all projects to build against Java 6; no semantic change. Fixes #20 --- .../.settings/org.eclipse.jdt.core.prefs | 80 +++- .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.polyglot/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 100 ++++- .../META-INF/MANIFEST.MF | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 347 +++++++++++++++++- .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.test/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 40 +- .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 40 +- com.ibm.wala.cast.java/META-INF/MANIFEST.MF | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 336 ++++++++++++++++- .../META-INF/MANIFEST.MF | 1 + .../.settings/org.eclipse.jdt.core.prefs | 347 +++++++++++++++++- .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 12 +- .../META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 1 + com.ibm.wala.cast.js.test/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 44 ++- .../META-INF/MANIFEST.MF | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 43 ++- com.ibm.wala.cast.js/META-INF/MANIFEST.MF | 1 + com.ibm.wala.cast.test/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 39 +- com.ibm.wala.cast.test/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 40 +- com.ibm.wala.cast/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core.testdata/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 47 ++- .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core.tests/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 45 ++- com.ibm.wala.core.tests/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 12 +- com.ibm.wala.core/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.ide.jdt.test/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 81 +++- .../META-INF/MANIFEST.MF | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 339 +++++++++++++++++ .../.settings/org.eclipse.jdt.core.prefs | 335 +++++++++++++++++ .../.settings/org.eclipse.jdt.core.prefs | 339 +++++++++++++++++ com.ibm.wala.ide.tests/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 45 ++- com.ibm.wala.ide.tests/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.ide/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 76 +++- com.ibm.wala.ide/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.shrike/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 27 +- com.ibm.wala.shrike/META-INF/MANIFEST.MF | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 48 +-- 57 files changed, 2715 insertions(+), 212 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java.polyglot.test/.settings/org.eclipse.jdt.core.prefs index 687c6efd3..92bf738bc 100644 --- a/com.ibm.wala.cast.java.polyglot.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java.polyglot.test/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,78 @@ -#Mon Jul 02 13:01:58 EDT 2012 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -78,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF index ecf54ac6b..861ee8d27 100644 --- a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF @@ -14,5 +14,5 @@ Require-Bundle: com.ibm.wala.cast;bundle-version="1.0.0", com.ibm.wala.cast.test;bundle-version="1.0.0", com.ibm.wala.cast.java.polyglot;bundle-version="1.0.0", org.junit4;bundle-version="4.3.1" -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.polyglot/.classpath b/com.ibm.wala.cast.java.polyglot/.classpath index c3f9b76bd..0cae0feeb 100644 --- a/com.ibm.wala.cast.java.polyglot/.classpath +++ b/com.ibm.wala.cast.java.polyglot/.classpath @@ -4,6 +4,6 @@ - + diff --git a/com.ibm.wala.cast.java.polyglot/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java.polyglot/.settings/org.eclipse.jdt.core.prefs index 6468112dd..92bf738bc 100644 --- a/com.ibm.wala.cast.java.polyglot/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java.polyglot/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,81 @@ -#Mon Apr 16 10:59:09 EDT 2012 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 @@ -12,6 +86,7 @@ org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 @@ -23,7 +98,7 @@ org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declar org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 @@ -54,12 +129,17 @@ org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=132 +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true org.eclipse.jdt.core.formatter.compact_else_if=true org.eclipse.jdt.core.formatter.continuation_indentation=2 org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true @@ -70,10 +150,14 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert @@ -242,6 +326,8 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false @@ -254,5 +340,7 @@ org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF index 4d6963568..bfad0f04b 100644 --- a/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF @@ -11,7 +11,7 @@ Require-Bundle: com.ibm.wala.cast.java, com.ibm.wala.shrike, org.eclipse.jdt.core, org.eclipse.core.resources -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.java.translator.polyglot; uses:="com.ibm.wala.types, diff --git a/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs index a1ef38d20..92bf738bc 100644 --- a/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,346 @@ -#Thu Dec 11 09:45:37 EST 2008 eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=132 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF index 3dc8568bd..860f076cb 100644 --- a/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF @@ -4,5 +4,5 @@ Bundle-Name: Data Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.test.data Bundle-Version: 1.0.0 Bundle-Vendor: IBM -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.test/.classpath b/com.ibm.wala.cast.java.test/.classpath index 5e4c1fe99..4c62a8048 100644 --- a/com.ibm.wala.cast.java.test/.classpath +++ b/com.ibm.wala.cast.java.test/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.cast.java.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java.test/.settings/org.eclipse.jdt.core.prefs index 5967eda6e..92bf738bc 100644 --- a/com.ibm.wala.cast.java.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java.test/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore @@ -16,7 +17,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -24,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -47,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -59,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -138,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF index 0429e4c9c..008b4bb13 100644 --- a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF @@ -14,4 +14,4 @@ Require-Bundle: org.junit4, org.eclipse.core.runtime Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.java.test -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.java/.classpath b/com.ibm.wala.cast.java/.classpath index 5e4c1fe99..4c62a8048 100644 --- a/com.ibm.wala.cast.java/.classpath +++ b/com.ibm.wala.cast.java/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.cast.java/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java/.settings/org.eclipse.jdt.core.prefs index 5967eda6e..92bf738bc 100644 --- a/com.ibm.wala.cast.java/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore @@ -16,7 +17,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -24,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -47,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -59,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -138,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.java/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java/META-INF/MANIFEST.MF index 6acff7acc..d2bfa7384 100644 --- a/com.ibm.wala.cast.java/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java/META-INF/MANIFEST.MF @@ -23,4 +23,4 @@ Export-Package: com.ibm.wala.cast.java, com.ibm.wala.cast.java.translator, com.ibm.wala.cast.java.types Bundle-ClassPath: . -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.js.html.nu_validator/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.js.html.nu_validator/.settings/org.eclipse.jdt.core.prefs index d7bba4ec9..92bf738bc 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.js.html.nu_validator/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ -#Thu Jan 05 09:28:01 MST 2012 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -7,6 +7,340 @@ org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=132 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF index f86d202dd..a06f49ed6 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF @@ -12,3 +12,4 @@ Require-Bundle: com.ibm.wala.cast.js;bundle-version="1.0.0", com.ibm.wala.core.tests;bundle-version="1.1.3", com.ibm.wala.core;bundle-version="1.1.3", org.junit;bundle-version="4.8.1" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.js.rhino.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.js.rhino.test/.settings/org.eclipse.jdt.core.prefs index 8d2e167a8..92bf738bc 100644 --- a/com.ibm.wala.cast.js.rhino.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.js.rhino.test/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,346 @@ -#Tue Jun 23 17:34:49 EDT 2009 eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=132 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF index 1b4bbd0df..48df85e9d 100644 --- a/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF @@ -12,7 +12,7 @@ Require-Bundle: com.ibm.wala.cast.js.rhino;bundle-version="1.0.0", com.ibm.wala.cast.test;bundle-version="1.0.0", com.ibm.wala.core.tests;bundle-version="1.1.3", org.junit4;bundle-version="4.3.1" -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.js.rhino.test, com.ibm.wala.cast.js.test diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index f6a423973..5ebf5d40c 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -3,6 +3,6 @@ - + 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 9a013352f..92bf738bc 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 @@ -1,10 +1,9 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -73,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -152,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index ed6746337..488dd5508 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -9,7 +9,7 @@ Require-Bundle: org.eclipse.core.runtime, com.ibm.wala.cast;bundle-version="1.0.0", com.ibm.wala.cast.js;bundle-version="1.0.0", com.ibm.wala.core;bundle-version="1.1.3" -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.js.translator, com.ibm.wala.js.rhino, diff --git a/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF index 23f313798..d01eb95d1 100644 --- a/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF @@ -8,3 +8,4 @@ Bundle-Vendor: %providerName Bundle-Localization: plugin Bundle-ActivationPolicy: lazy Bundle-ClassPath: examples-src/ +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.js.test/.classpath b/com.ibm.wala.cast.js.test/.classpath index 54426554b..16223e57d 100755 --- a/com.ibm.wala.cast.js.test/.classpath +++ b/com.ibm.wala.cast.js.test/.classpath @@ -1,6 +1,6 @@ - + diff --git a/com.ibm.wala.cast.js.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.js.test/.settings/org.eclipse.jdt.core.prefs index a0b4067e0..92bf738bc 100755 --- a/com.ibm.wala.cast.js.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.js.test/.settings/org.eclipse.jdt.core.prefs @@ -1,8 +1,13 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore @@ -12,7 +17,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -20,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -43,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -55,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -134,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF index 87b3b989c..81204bc49 100755 --- a/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF @@ -15,4 +15,4 @@ Require-Bundle: com.ibm.wala.cast.js, com.ibm.wala.cast.test;bundle-version="1.0.0" Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.js.test -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.js/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.js/.settings/org.eclipse.jdt.core.prefs index 84cbc49b4..92bf738bc 100644 --- a/com.ibm.wala.cast.js/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.js/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,23 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -16,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -39,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -51,6 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -129,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF index f93b2ee2d..cc9a2e2df 100644 --- a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF @@ -34,3 +34,4 @@ Require-Bundle: com.ibm.wala.cast, org.eclipse.core.runtime;bundle-version="3.4.0", org.apache.commons.logging Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.test/.classpath b/com.ibm.wala.cast.test/.classpath index 16bc0928b..f070691d3 100644 --- a/com.ibm.wala.cast.test/.classpath +++ b/com.ibm.wala.cast.test/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.cast.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.test/.settings/org.eclipse.jdt.core.prefs index a45950a45..92bf738bc 100644 --- a/com.ibm.wala.cast.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.test/.settings/org.eclipse.jdt.core.prefs @@ -1,13 +1,13 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore @@ -17,7 +17,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -25,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -48,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -60,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -139,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.test/META-INF/MANIFEST.MF index b6b78348b..8471852c0 100644 --- a/com.ibm.wala.cast.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.test/META-INF/MANIFEST.MF @@ -12,5 +12,5 @@ Require-Bundle: com.ibm.wala.shrike, org.eclipse.core.runtime Export-Package: com.ibm.wala.cast.test -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast/.classpath b/com.ibm.wala.cast/.classpath index 55918424c..3c7697b49 100644 --- a/com.ibm.wala.cast/.classpath +++ b/com.ibm.wala.cast/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.cast/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast/.settings/org.eclipse.jdt.core.prefs index 5967eda6e..92bf738bc 100644 --- a/com.ibm.wala.cast/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore @@ -16,7 +17,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -24,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -47,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -59,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -138,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.cast/META-INF/MANIFEST.MF b/com.ibm.wala.cast/META-INF/MANIFEST.MF index 8456cb5c1..50084f0eb 100644 --- a/com.ibm.wala.cast/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast/META-INF/MANIFEST.MF @@ -27,5 +27,5 @@ Export-Package: com.ibm.wala.cast.analysis.typeInference, com.ibm.wala.cast.tree.visit, com.ibm.wala.cast.types, com.ibm.wala.cast.util -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.core.testdata/.classpath b/com.ibm.wala.core.testdata/.classpath index 5e4c1fe99..4c62a8048 100644 --- a/com.ibm.wala.core.testdata/.classpath +++ b/com.ibm.wala.core.testdata/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs index 73997db99..92bf738bc 100644 --- a/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs @@ -1,13 +1,13 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore @@ -17,32 +17,40 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=ignore +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -52,23 +60,19 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -147,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF index 1f65711bb..b488cc53c 100644 --- a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF @@ -4,4 +4,4 @@ Bundle-Name: Testdata Plug-in Bundle-SymbolicName: com.ibm.wala.core.testdata Bundle-Version: 1.0.0 Bundle-Vendor: IBM -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.core.tests/.classpath b/com.ibm.wala.core.tests/.classpath index e574430c5..331486565 100644 --- a/com.ibm.wala.core.tests/.classpath +++ b/com.ibm.wala.core.tests/.classpath @@ -3,6 +3,6 @@ - + diff --git a/com.ibm.wala.core.tests/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.core.tests/.settings/org.eclipse.jdt.core.prefs index 42255f460..92bf738bc 100644 --- a/com.ibm.wala.core.tests/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.core.tests/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,23 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -16,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -39,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -51,6 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -129,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF index ced4999ff..4eb18abef 100644 --- a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF @@ -21,6 +21,6 @@ Export-Package: com.ibm.wala.core.tests.basic, com.ibm.wala.examples.analysis.dataflow, com.ibm.wala.examples.drivers, com.ibm.wala.examples.properties -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Bundle-Activator: com.ibm.wala.core.tests.plugin.CoreTestsPlugin diff --git a/com.ibm.wala.core/.classpath b/com.ibm.wala.core/.classpath index 8b03ea23f..3a7372786 100644 --- a/com.ibm.wala.core/.classpath +++ b/com.ibm.wala.core/.classpath @@ -4,6 +4,6 @@ - + diff --git a/com.ibm.wala.core/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.core/.settings/org.eclipse.jdt.core.prefs index 9a013352f..92bf738bc 100644 --- a/com.ibm.wala.core/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.core/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,9 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -73,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -152,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.core/META-INF/MANIFEST.MF b/com.ibm.wala.core/META-INF/MANIFEST.MF index c92918699..53d6b3eaa 100644 --- a/com.ibm.wala.core/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core/META-INF/MANIFEST.MF @@ -59,4 +59,4 @@ Export-Package: ., com.ibm.wala.util.warnings, com.ibm.wala.viz, com.ibm.wala.viz.viewer -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.ide.jdt.test/.classpath b/com.ibm.wala.ide.jdt.test/.classpath index 3afaa84d1..59f4a0930 100644 --- a/com.ibm.wala.ide.jdt.test/.classpath +++ b/com.ibm.wala.ide.jdt.test/.classpath @@ -1,6 +1,6 @@ - + diff --git a/com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.core.prefs index 3e6680a6f..92bf738bc 100644 --- a/com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.ide.jdt.test/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,78 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -83,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF index 73ab8c599..6b0ee6589 100644 --- a/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF @@ -21,4 +21,4 @@ Require-Bundle: com.ibm.wala.cast.java.test;bundle-version="1.0.0", org.eclipse.core.runtime, org.eclipse.pde.core;bundle-version="3.6.0" Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.ide.jdt/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide.jdt/.settings/org.eclipse.jdt.core.prefs index c537b6306..92bf738bc 100644 --- a/com.ibm.wala.ide.jdt/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.ide.jdt/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,346 @@ eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=132 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.ide.jsdt.tests/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide.jsdt.tests/.settings/org.eclipse.jdt.core.prefs index 8000cd6ca..92bf738bc 100644 --- a/com.ibm.wala.ide.jsdt.tests/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.ide.jsdt.tests/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -6,6 +7,340 @@ org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=132 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.ide.jsdt/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide.jsdt/.settings/org.eclipse.jdt.core.prefs index c537b6306..92bf738bc 100644 --- a/com.ibm.wala.ide.jsdt/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.ide.jsdt/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,346 @@ eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=132 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/com.ibm.wala.ide.tests/.classpath b/com.ibm.wala.ide.tests/.classpath index 5e4c1fe99..4c62a8048 100644 --- a/com.ibm.wala.ide.tests/.classpath +++ b/com.ibm.wala.ide.tests/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.ide.tests/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide.tests/.settings/org.eclipse.jdt.core.prefs index 42255f460..92bf738bc 100644 --- a/com.ibm.wala.ide.tests/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.ide.tests/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,23 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -16,20 +25,32 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -39,7 +60,7 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled @@ -51,6 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -129,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF index d9b01270a..8a4a93376 100644 --- a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF @@ -16,7 +16,7 @@ Require-Bundle: com.ibm.wala.shrike, org.junit4;bundle-version="4.3.1", com.ibm.wala.ide.jdt;bundle-version="1.0.0" Bundle-Localization: plugin -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.ide.tests.util Bundle-Activator: com.ibm.wala.ide.test.Activator diff --git a/com.ibm.wala.ide/.classpath b/com.ibm.wala.ide/.classpath index 5e4c1fe99..4c62a8048 100644 --- a/com.ibm.wala.ide/.classpath +++ b/com.ibm.wala.ide/.classpath @@ -2,6 +2,6 @@ - + diff --git a/com.ibm.wala.ide/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.ide/.settings/org.eclipse.jdt.core.prefs index c512e0fa8..92bf738bc 100644 --- a/com.ibm.wala.ide/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.ide/.settings/org.eclipse.jdt.core.prefs @@ -1,15 +1,78 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -88,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.ide/META-INF/MANIFEST.MF b/com.ibm.wala.ide/META-INF/MANIFEST.MF index de545964e..4fa28d5d3 100644 --- a/com.ibm.wala.ide/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide/META-INF/MANIFEST.MF @@ -15,7 +15,7 @@ Require-Bundle: com.ibm.wala.core, org.eclipse.core.resources, org.eclipse.core.runtime Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: com.ibm.wala.ide.classloader, com.ibm.wala.ide.client, com.ibm.wala.ide.plugin, diff --git a/com.ibm.wala.shrike/.classpath b/com.ibm.wala.shrike/.classpath index 5e4c1fe99..4c62a8048 100644 --- a/com.ibm.wala.shrike/.classpath +++ b/com.ibm.wala.shrike/.classpath @@ -2,6 +2,6 @@ - + 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 8fcf3aa93..92bf738bc 100644 --- a/com.ibm.wala.shrike/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.shrike/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,9 @@ -#Thu Feb 03 10:12:26 EST 2011 eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -18,7 +17,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -26,15 +25,15 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public @@ -46,11 +45,12 @@ org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -72,7 +72,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 @@ -151,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert diff --git a/com.ibm.wala.shrike/META-INF/MANIFEST.MF b/com.ibm.wala.shrike/META-INF/MANIFEST.MF index 2f5b3ab32..006a0d84d 100644 --- a/com.ibm.wala.shrike/META-INF/MANIFEST.MF +++ b/com.ibm.wala.shrike/META-INF/MANIFEST.MF @@ -15,5 +15,5 @@ Export-Package: com.ibm.wala.shrike.bench, com.ibm.wala.shrikeBT.shrikeCT.tools, com.ibm.wala.shrikeBT.tools, com.ibm.wala.shrikeCT -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Require-Bundle: com.ibm.wala.util diff --git a/com.ibm.wala.util/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.util/.settings/org.eclipse.jdt.core.prefs index 704a7ba08..92bf738bc 100644 --- a/com.ibm.wala.util/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.util/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -6,19 +7,17 @@ org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=ignore +org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning @@ -26,29 +25,34 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning @@ -56,22 +60,17 @@ org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false @@ -152,9 +151,12 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=2 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert From 1cc5e5ce9c8c1c14b3169923dbbeec292800c5ea Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Wed, 10 Apr 2013 21:09:10 -0400 Subject: [PATCH 056/187] fixes for bug with dead code and exception handlers --- .../java/loader/JavaSourceLoaderImpl.java | 17 +++---- .../translator/JavaCAst2IRTranslator.java | 4 +- .../js/test/TestSimpleCallGraphShape.java | 5 ++ .../ipa/callgraph/ArgumentSpecialization.java | 3 +- .../js/ipa/callgraph/JSCallGraphUtil.java | 4 +- .../wala/cast/js/loader/JavaScriptLoader.java | 7 +-- .../cast/js/translator/JSAstTranslator.java | 5 +- .../ibm/wala/cast/ir/ssa/AstIRFactory.java | 15 +++--- .../cast/ir/translator/AstTranslator.java | 48 ++++++++----------- .../com/ibm/wala/cast/loader/AstMethod.java | 10 ++-- 10 files changed, 66 insertions(+), 52 deletions(-) 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 d0b942bdc..9684f85fd 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 @@ -49,6 +49,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap; import com.ibm.wala.cast.tree.CAstType; import com.ibm.wala.cast.tree.CAstType.Function; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.ClassLoaderImpl; import com.ibm.wala.classLoader.IClass; @@ -159,9 +160,9 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } private void addMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { declaredMethods.put(Util.methodEntityToSelector(methodEntity), new ConcreteJavaMethod(methodEntity, owner, cfg, symtab, - hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo)); + hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo)); } private void addMethod(CAstEntity methodEntity, IClass owner) { @@ -239,9 +240,9 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { private final TypeReference[] exceptionTypes; public JavaEntityMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(owner, methodEntity.getQualifiers(), cfg, symtab, MethodReference.findOrCreate(owner.getReference(), Util - .methodEntityToSelector(methodEntity)), hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo, JavaSourceLoaderImpl.this.getAnnotations(methodEntity)); + .methodEntityToSelector(methodEntity)), hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo, JavaSourceLoaderImpl.this.getAnnotations(methodEntity)); this.parameterTypes = computeParameterTypes(methodEntity); this.exceptionTypes = computeExceptionTypes(methodEntity); } @@ -350,8 +351,8 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { */ public class ConcreteJavaMethod extends JavaEntityMethod { public ConcreteJavaMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { - super(methodEntity, owner, cfg, symtab, hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo); + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + super(methodEntity, owner, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); } public IClassHierarchy getClassHierarchy() { @@ -478,8 +479,8 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } public void defineFunction(CAstEntity n, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { - ((JavaClass) owner).addMethod(n, owner, cfg, symtab, hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo); + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + ((JavaClass) owner).addMethod(n, owner, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); } public void defineAbstractFunction(CAstEntity n, IClass owner) { 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 a2f721d29..64c38481a 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 @@ -15,6 +15,7 @@ package com.ibm.wala.cast.java.translator; import java.util.Collection; import java.util.Iterator; +import java.util.Map; import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl; @@ -30,6 +31,7 @@ import com.ibm.wala.cast.tree.CAstType; import com.ibm.wala.cast.tree.CAstType.Method; import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.ModuleEntry; @@ -229,7 +231,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { // N.B.: base class may actually ask to create a synthetic type to wrap // code bodies, so we may see other things than TYPE_ENTITY here. diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 2addd63c7..11be6f5ce 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -643,6 +643,11 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { verifyGraphAssertions(CG, assertionsForDeadCode); } + @Test + public void testDeadCatch() throws IllegalArgumentException, IOException, CancelException, WalaException { + JSCallGraphBuilderUtil.makeScriptCG("tests", "dead_catch.js"); + } + @Test(expected = CallGraphBuilderCancelException.class) public void testManyStrings() throws IllegalArgumentException, IOException, CancelException, WalaException { SSAPropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "many-strings.js"); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java index ec6934dc6..d9b1e25e2 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java @@ -21,6 +21,7 @@ import com.ibm.wala.cast.util.CAstPattern; import com.ibm.wala.cast.util.CAstPattern.Segments; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.ControlFlowGraph; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.AnalysisCache; @@ -291,7 +292,7 @@ public class ArgumentSpecialization { @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { if (N == codeBodyEntity) { specializedCode = myloader.makeCodeBodyCode(cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, LI, debugInfo, method.getDeclaringClass()); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index a7ae2ebfe..c998c5398 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -16,6 +16,7 @@ import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Map; import java.util.Set; import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector; @@ -36,6 +37,7 @@ import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.ClassLoaderFactory; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.SourceURLModule; @@ -163,7 +165,7 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra JSAstTranslator toIR = new JSAstTranslator(cl) { @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { String fnName = "L" + composeEntityName(definingContext, N); names.add(fnName); 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 24ef0c3ed..76e1760f4 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 @@ -63,6 +63,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IClassLoader; @@ -705,7 +706,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { private CAstEntity entity; JavaScriptMethodObject(IClass cls, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(cls, functionQualifiers, cfg, symtab, AstMethodReference.fnReference(cls.getReference()), hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo, null); @@ -808,14 +809,14 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } public IMethod defineCodeBodyCode(String clsName, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { JavaScriptCodeBody C = (JavaScriptCodeBody) lookupClass(clsName, cha); assert C != null : clsName; return C.setCodeBody(makeCodeBodyCode(cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo, C)); } public JavaScriptMethodObject makeCodeBodyCode(AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo, + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo, IClass C) { return new JavaScriptMethodObject(C, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); 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 df6402b9d..6b3465599 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 @@ -10,6 +10,8 @@ *****************************************************************************/ package com.ibm.wala.cast.js.translator; +import java.util.Map; + import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.js.loader.JSCallSiteReference; import com.ibm.wala.cast.js.loader.JavaScriptLoader; @@ -26,6 +28,7 @@ import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ssa.SymbolTable; import com.ibm.wala.types.FieldReference; @@ -135,7 +138,7 @@ public class JSAstTranslator extends AstTranslator { } protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { if (DEBUG) System.err.println(("\n\nAdding code for " + N)); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java index 937275478..852c6d675 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java @@ -10,11 +10,14 @@ *****************************************************************************/ package com.ibm.wala.cast.ir.ssa; +import java.util.Map; + import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.ControlFlowGraph; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ssa.DefaultIRFactory; @@ -82,12 +85,12 @@ public class AstIRFactory implements IRFactory { } } - private void setupCatchTypes(SSACFG cfg, TypeReference[][] catchTypes) { - for (int i = 0; i < catchTypes.length; i++) { - if (catchTypes[i] != null) { - ExceptionHandlerBasicBlock bb = (ExceptionHandlerBasicBlock) cfg.getNode(i); - for (int j = 0; j < catchTypes[i].length; j++) { - bb.addCaughtExceptionType(catchTypes[i][j]); + private void setupCatchTypes(SSACFG cfg, Map map) { + for(Map.Entry e : map.entrySet()) { + if (e.getKey().getNumber() != -1) { + ExceptionHandlerBasicBlock bb = (ExceptionHandlerBasicBlock) cfg.getNode(e.getKey().getNumber()); + for (int j = 0; j < e.getValue().length; j++) { + bb.addCaughtExceptionType(e.getValue()[j]); } } } 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 5f470b4d2..e2b6de222 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 @@ -150,7 +150,7 @@ public abstract class AstTranslator extends CAstVisitor catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo); /** @@ -826,7 +826,7 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes(); void addEntityName(CAstEntity e, String name); @@ -2185,15 +2185,15 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return parent.getCatchTypes(); } @@ -2286,7 +2286,7 @@ public abstract class AstTranslator extends CAstVisitor catchTypes = HashMapFactory.make(); Set, Integer>> exposedReads; Set, Integer>> exposedWrites; @@ -2362,20 +2362,14 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return catchTypes; } @@ -3034,7 +3028,7 @@ public abstract class AstTranslator extends CAstVisitor catchTypes = functionContext.getCatchTypes(); AstCFG cfg = new AstCFG(n, functionContext.cfg(), symtab); Position[] line = functionContext.cfg().getLinePositionMap(); boolean katch = functionContext.cfg().hasCatchBlock(); @@ -4261,13 +4255,13 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java index 125b6562f..3745a4190 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java @@ -11,6 +11,7 @@ package com.ibm.wala.cast.loader; import java.util.Collection; +import java.util.Map; import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation; @@ -19,6 +20,7 @@ import com.ibm.wala.cast.tree.CAstQualifier; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.ControlFlowGraph; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ssa.SymbolTable; @@ -111,20 +113,20 @@ public abstract class AstMethod implements IMethod { private final MethodReference ref; private final boolean hasCatchBlock; private final boolean hasMonitorOp; - private final TypeReference[][] catchTypes; + private final Map catchTypes; private final AstLexicalInformation lexicalInfo; private final DebuggingInformation debugInfo; private final Collection annotations; protected AstMethod(IClass cls, Collection qualifiers, AbstractCFG cfg, SymbolTable symtab, MethodReference ref, - boolean hasCatchBlock, TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo, Collection annotations) { this.cls = cls; this.cfg = cfg; this.ref = ref; this.symtab = symtab; this.qualifiers = qualifiers; - this.catchTypes = catchTypes; + this.catchTypes = caughtTypes; this.hasCatchBlock = hasCatchBlock; this.hasMonitorOp = hasMonitorOp; this.lexicalInfo = lexicalInfo; @@ -161,7 +163,7 @@ public abstract class AstMethod implements IMethod { return symtab; } - public TypeReference[][] catchTypes() { + public Map catchTypes() { return catchTypes; } From b90583f4fdc78d60c00ef4ca20c9d6f49492d136 Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Thu, 11 Apr 2013 08:26:48 -0400 Subject: [PATCH 057/187] test file for dead code with exception handlers --- .../examples-src/tests/dead_catch.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/dead_catch.js diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/dead_catch.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/dead_catch.js new file mode 100644 index 000000000..1caca724a --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/dead_catch.js @@ -0,0 +1,7 @@ +(function() { + return; + try { + x(); + } catch (e) { + } +})(); From 67dd61e0052db8aa88945859763ae61f5f8f45f6 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 11 Apr 2013 11:57:14 -0700 Subject: [PATCH 058/187] update build prefs to allow for referencing restricted libs --- .../.settings/org.eclipse.jdt.core.prefs | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs index 92bf738bc..d9b5deebe 100644 --- a/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.core.testdata/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,10 @@ eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -11,18 +16,23 @@ org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=ignore org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=ignore org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning @@ -33,7 +43,10 @@ org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public @@ -41,36 +54,56 @@ org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false From 97cae293687f59e3cfe85a2e49054e4e2d455284 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 12 Apr 2013 10:24:12 -0700 Subject: [PATCH 059/187] add parse_error.js to excluded paths to get rid of compile error --- com.ibm.wala.cast.js.test.data/.settings/.jsdtscope | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.js.test.data/.settings/.jsdtscope b/com.ibm.wala.cast.js.test.data/.settings/.jsdtscope index 6fa134369..ce3edf87d 100644 --- a/com.ibm.wala.cast.js.test.data/.settings/.jsdtscope +++ b/com.ibm.wala.cast.js.test.data/.settings/.jsdtscope @@ -1,6 +1,6 @@ - + From f439646cb15ba19839d88544d5c217e0d1d3ed78 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 15 Apr 2013 08:58:42 +0200 Subject: [PATCH 060/187] fix potential NPE in AbstractRootMethod.addAllocation() --- .../src/com/ibm/wala/classLoader/ArrayClass.java | 11 ++++++++++- .../wala/ipa/callgraph/impl/AbstractRootMethod.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java index 4742d91e8..cd8ad5b72 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java @@ -243,7 +243,16 @@ public class ArrayClass implements IClass, Constants { } public int getDimensionality() { - int mask = getReference().getDerivedMask(); + return getArrayTypeDimensionality(getReference()); + } + + /** + * + * @param reference a type reference for an array type + * @return the dimensionality of the array + */ + public static int getArrayTypeDimensionality(TypeReference reference) { + int mask = reference.getDerivedMask(); if ((mask&PrimitiveMask) == PrimitiveMask) { mask >>= ElementBits; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java index 36aaabdcf..d52ee64a7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java @@ -207,7 +207,7 @@ public abstract class AbstractRootMethod extends SyntheticMethod { if (T.isReferenceType()) { NewSiteReference ref = NewSiteReference.make(statements.size(), T); if (T.isArrayType()) { - int[] sizes = new int[((ArrayClass)cha.lookupClass(T)).getDimensionality()]; + int[] sizes = new int[ArrayClass.getArrayTypeDimensionality(T)]; Arrays.fill(sizes, getValueNumberForIntConstant(1)); result = insts.NewInstruction(instance, ref, sizes); } else { From f58c47e47dc863a8132fdf9c052c37d60a0a0ce4 Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Fri, 19 Apr 2013 16:23:42 +0200 Subject: [PATCH 061/187] [releng] added preliminary maven tycho build support --- .gitignore | 1 + com.ibm.wala-feature/build.properties | 4 +- com.ibm.wala-feature/feature.xml | 4 +- com.ibm.wala-feature/pom.xml | 12 ++ com.ibm.wala-repository/category.xml | 13 ++ com.ibm.wala-repository/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 6 +- com.ibm.wala.cast.java.polyglot.test/pom.xml | 14 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.polyglot/pom.xml | 14 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.test.data/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 6 +- com.ibm.wala.cast.java.test/pom.xml | 12 ++ com.ibm.wala.cast.java/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java/build.properties | 4 +- com.ibm.wala.cast.java/pom.xml | 12 ++ .../pom.xml | 14 ++ com.ibm.wala.cast.js.rhino.test/pom.xml | 14 ++ com.ibm.wala.cast.js.rhino/pom.xml | 14 ++ com.ibm.wala.cast.js.test.data/pom.xml | 14 ++ com.ibm.wala.cast.js.test/pom.xml | 14 ++ com.ibm.wala.cast.js/pom.xml | 14 ++ com.ibm.wala.cast.test/META-INF/MANIFEST.MF | 4 +- com.ibm.wala.cast.test/pom.xml | 12 ++ com.ibm.wala.cast/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core.testdata/pom.xml | 12 ++ com.ibm.wala.core.tests/META-INF/MANIFEST.MF | 4 +- .../launchers/wala.core.launch | 1 - com.ibm.wala.core.tests/pom.xml | 12 ++ com.ibm.wala.core/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core/pom.xml | 12 ++ com.ibm.wala.ide-feature/build.properties | 4 +- com.ibm.wala.ide-feature/feature.xml | 11 +- com.ibm.wala.ide-feature/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.ide.jdt.test/pom.xml | 14 ++ com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF | 20 +-- com.ibm.wala.ide.jdt/pom.xml | 12 ++ com.ibm.wala.ide.jsdt.tests/pom.xml | 14 ++ com.ibm.wala.ide.jsdt/pom.xml | 14 ++ com.ibm.wala.ide.tests/META-INF/MANIFEST.MF | 4 +- com.ibm.wala.ide.tests/pom.xml | 14 ++ com.ibm.wala.ide/META-INF/MANIFEST.MF | 5 +- com.ibm.wala.ide/pom.xml | 12 ++ com.ibm.wala.shrike/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.shrike/pom.xml | 12 ++ com.ibm.wala.tests-feature/feature.xml | 6 +- com.ibm.wala.tests-feature/pom.xml | 12 ++ com.ibm.wala.tests.ide-feature/feature.xml | 9 +- com.ibm.wala.tests.ide-feature/pom.xml | 14 ++ com.ibm.wala.util/.gitignore | 1 + com.ibm.wala.util/META-INF/MANIFEST.MF | 5 +- com.ibm.wala.util/pom.xml | 12 ++ pom.xml | 147 ++++++++++++++++++ targets/e42/e42.target | 44 ++++++ targets/e42/pom.xml | 12 ++ targets/pom.xml | 16 ++ 60 files changed, 655 insertions(+), 66 deletions(-) create mode 100644 com.ibm.wala-feature/pom.xml create mode 100644 com.ibm.wala-repository/category.xml create mode 100644 com.ibm.wala-repository/pom.xml create mode 100644 com.ibm.wala.cast.java.polyglot.test/pom.xml create mode 100644 com.ibm.wala.cast.java.polyglot/pom.xml create mode 100644 com.ibm.wala.cast.java.test.data/pom.xml create mode 100644 com.ibm.wala.cast.java.test/pom.xml create mode 100644 com.ibm.wala.cast.java/pom.xml create mode 100644 com.ibm.wala.cast.js.html.nu_validator/pom.xml create mode 100644 com.ibm.wala.cast.js.rhino.test/pom.xml create mode 100644 com.ibm.wala.cast.js.rhino/pom.xml create mode 100644 com.ibm.wala.cast.js.test.data/pom.xml create mode 100644 com.ibm.wala.cast.js.test/pom.xml create mode 100644 com.ibm.wala.cast.js/pom.xml create mode 100644 com.ibm.wala.cast.test/pom.xml create mode 100644 com.ibm.wala.cast/pom.xml create mode 100644 com.ibm.wala.core.testdata/pom.xml create mode 100644 com.ibm.wala.core.tests/pom.xml create mode 100644 com.ibm.wala.core/pom.xml create mode 100644 com.ibm.wala.ide-feature/pom.xml create mode 100644 com.ibm.wala.ide.jdt.test/pom.xml create mode 100644 com.ibm.wala.ide.jdt/pom.xml create mode 100644 com.ibm.wala.ide.jsdt.tests/pom.xml create mode 100644 com.ibm.wala.ide.jsdt/pom.xml create mode 100644 com.ibm.wala.ide.tests/pom.xml create mode 100644 com.ibm.wala.ide/pom.xml create mode 100644 com.ibm.wala.shrike/pom.xml create mode 100644 com.ibm.wala.tests-feature/pom.xml create mode 100644 com.ibm.wala.tests.ide-feature/pom.xml create mode 100644 com.ibm.wala.util/.gitignore create mode 100644 com.ibm.wala.util/pom.xml create mode 100644 pom.xml create mode 100644 targets/e42/e42.target create mode 100644 targets/e42/pom.xml create mode 100644 targets/pom.xml diff --git a/.gitignore b/.gitignore index 7aa1eb0fc..1d84436da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +target/ */bin/ com.ibm.wala.cast.js.rhino/lib/ com.ibm.wala.cast.js/lib/ diff --git a/com.ibm.wala-feature/build.properties b/com.ibm.wala-feature/build.properties index fd680b6f8..b3a611b5c 100644 --- a/com.ibm.wala-feature/build.properties +++ b/com.ibm.wala-feature/build.properties @@ -1,4 +1,2 @@ bin.includes = feature.xml,\ - feature.properties,\ - license.html,\ - notice.html + feature.properties diff --git a/com.ibm.wala-feature/feature.xml b/com.ibm.wala-feature/feature.xml index bf8955345..93767740a 100644 --- a/com.ibm.wala-feature/feature.xml +++ b/com.ibm.wala-feature/feature.xml @@ -1,8 +1,8 @@ diff --git a/com.ibm.wala-feature/pom.xml b/com.ibm.wala-feature/pom.xml new file mode 100644 index 000000000..4cc0a7cd9 --- /dev/null +++ b/com.ibm.wala-feature/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala-feature + eclipse-feature + diff --git a/com.ibm.wala-repository/category.xml b/com.ibm.wala-repository/category.xml new file mode 100644 index 000000000..1413a77af --- /dev/null +++ b/com.ibm.wala-repository/category.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/com.ibm.wala-repository/pom.xml b/com.ibm.wala-repository/pom.xml new file mode 100644 index 000000000..5d56d786d --- /dev/null +++ b/com.ibm.wala-repository/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala-repository + eclipse-repository + diff --git a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF index 861ee8d27..6b4a7ee31 100644 --- a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA Cast Java Polyglot Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.polyglot.test -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.java.polyglot.test.Activator Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.cast;bundle-version="1.0.0", @@ -13,6 +13,6 @@ Require-Bundle: com.ibm.wala.cast;bundle-version="1.0.0", org.eclipse.core.runtime, com.ibm.wala.cast.test;bundle-version="1.0.0", com.ibm.wala.cast.java.polyglot;bundle-version="1.0.0", - org.junit4;bundle-version="4.3.1" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 + org.junit;bundle-version="4.0.0" +Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.polyglot.test/pom.xml b/com.ibm.wala.cast.java.polyglot.test/pom.xml new file mode 100644 index 000000000..717105108 --- /dev/null +++ b/com.ibm.wala.cast.java.polyglot.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.java.polyglot.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF index bfad0f04b..9a3cf5f5c 100644 --- a/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA CAst Java Polyglot Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.polyglot -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.cast.java, com.ibm.wala.cast, diff --git a/com.ibm.wala.cast.java.polyglot/pom.xml b/com.ibm.wala.cast.java.polyglot/pom.xml new file mode 100644 index 000000000..db2c5e47a --- /dev/null +++ b/com.ibm.wala.cast.java.polyglot/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.java.polyglot + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF index 860f076cb..069629ab7 100644 --- a/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Data Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.test.data -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.test.data/pom.xml b/com.ibm.wala.cast.java.test.data/pom.xml new file mode 100644 index 000000000..9b9f9d822 --- /dev/null +++ b/com.ibm.wala.cast.java.test.data/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java.test.data + eclipse-plugin + diff --git a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF index 008b4bb13..e5c8e8f21 100644 --- a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF @@ -5,13 +5,13 @@ Bundle-SymbolicName: com.ibm.wala.cast.java.test Bundle-Version: 1.0.0 Bundle-Activator: com.ibm.wala.cast.java.test.TestPlugin Bundle-Vendor: IBM -Require-Bundle: org.junit4, - com.ibm.wala.core.tests, +Require-Bundle: com.ibm.wala.core.tests, com.ibm.wala.cast.java, com.ibm.wala.cast, com.ibm.wala.core, com.ibm.wala.shrike, - org.eclipse.core.runtime + org.eclipse.core.runtime, + org.junit;bundle-version="4.0.0" Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.java.test Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.java.test/pom.xml b/com.ibm.wala.cast.java.test/pom.xml new file mode 100644 index 000000000..8060e2b93 --- /dev/null +++ b/com.ibm.wala.cast.java.test/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java.test + eclipse-test-plugin + diff --git a/com.ibm.wala.cast.java/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java/META-INF/MANIFEST.MF index d2bfa7384..a312ba006 100644 --- a/com.ibm.wala.cast.java/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Java Source WALA Front End Bundle-SymbolicName: com.ibm.wala.cast.java -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.java.JavaSourcePlugin Bundle-Vendor: rfuhrer@watson.ibm.com Require-Bundle: com.ibm.wala.cast, diff --git a/com.ibm.wala.cast.java/build.properties b/com.ibm.wala.cast.java/build.properties index d9146fc61..34d2e4d2d 100644 --- a/com.ibm.wala.cast.java/build.properties +++ b/com.ibm.wala.cast.java/build.properties @@ -1,6 +1,4 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - .,\ - lib/java_cup.jar,\ - lib/polyglot.jar + . diff --git a/com.ibm.wala.cast.java/pom.xml b/com.ibm.wala.cast.java/pom.xml new file mode 100644 index 000000000..5ebf1cc4f --- /dev/null +++ b/com.ibm.wala.cast.java/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml new file mode 100644 index 000000000..5d2add2d9 --- /dev/null +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.html.nu_validator + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.rhino.test/pom.xml b/com.ibm.wala.cast.js.rhino.test/pom.xml new file mode 100644 index 000000000..ca3571a60 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.rhino.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.rhino/pom.xml b/com.ibm.wala.cast.js.rhino/pom.xml new file mode 100644 index 000000000..3aa6b32f7 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.rhino + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.test.data/pom.xml b/com.ibm.wala.cast.js.test.data/pom.xml new file mode 100644 index 000000000..eceef9eec --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.test.data + 1.1.3-SNAPSHOT + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.test/pom.xml b/com.ibm.wala.cast.js.test/pom.xml new file mode 100644 index 000000000..077cfbff8 --- /dev/null +++ b/com.ibm.wala.cast.js.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.js/pom.xml b/com.ibm.wala.cast.js/pom.xml new file mode 100644 index 000000000..dbfd60b1d --- /dev/null +++ b/com.ibm.wala.cast.js/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.test/META-INF/MANIFEST.MF index 8471852c0..b04a11f95 100644 --- a/com.ibm.wala.cast.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.test/META-INF/MANIFEST.MF @@ -2,10 +2,10 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CAst Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.test -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Require-Bundle: - org.junit4, + org.junit;bundle-version="4.0.0", com.ibm.wala.core.tests, com.ibm.wala.cast, com.ibm.wala.core, diff --git a/com.ibm.wala.cast.test/pom.xml b/com.ibm.wala.cast.test/pom.xml new file mode 100644 index 000000000..6d9346166 --- /dev/null +++ b/com.ibm.wala.cast.test/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.test + eclipse-test-plugin + diff --git a/com.ibm.wala.cast/META-INF/MANIFEST.MF b/com.ibm.wala.cast/META-INF/MANIFEST.MF index 50084f0eb..129af4fc9 100644 --- a/com.ibm.wala.cast/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA CAst core Plug-in Bundle-SymbolicName: com.ibm.wala.cast -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.plugin.AstPlugin Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.core, diff --git a/com.ibm.wala.cast/pom.xml b/com.ibm.wala.cast/pom.xml new file mode 100644 index 000000000..46bda53b9 --- /dev/null +++ b/com.ibm.wala.cast/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast + eclipse-plugin + diff --git a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF index b488cc53c..47aa91192 100644 --- a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF @@ -2,6 +2,6 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Testdata Plug-in Bundle-SymbolicName: com.ibm.wala.core.testdata -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.core.testdata/pom.xml b/com.ibm.wala.core.testdata/pom.xml new file mode 100644 index 000000000..4eabfb994 --- /dev/null +++ b/com.ibm.wala.core.testdata/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.core.testdata + eclipse-plugin + diff --git a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF index 4eb18abef..313cdfd48 100644 --- a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF @@ -2,12 +2,12 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.core.tests;singleton:=true -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Require-Bundle: com.ibm.wala.shrike, com.ibm.wala.core, org.eclipse.core.runtime, - org.junit4;bundle-version="4.3.1" + org.junit;bundle-version="4.3.1" Bundle-Localization: plugin Export-Package: com.ibm.wala.core.tests.basic, com.ibm.wala.core.tests.callGraph, diff --git a/com.ibm.wala.core.tests/launchers/wala.core.launch b/com.ibm.wala.core.tests/launchers/wala.core.launch index 75adbe8cc..673313914 100644 --- a/com.ibm.wala.core.tests/launchers/wala.core.launch +++ b/com.ibm.wala.core.tests/launchers/wala.core.launch @@ -21,7 +21,6 @@ - diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml new file mode 100644 index 000000000..c3f48055f --- /dev/null +++ b/com.ibm.wala.core.tests/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.core.tests + eclipse-test-plugin + diff --git a/com.ibm.wala.core/META-INF/MANIFEST.MF b/com.ibm.wala.core/META-INF/MANIFEST.MF index 53d6b3eaa..6febf89c7 100644 --- a/com.ibm.wala.core/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Eclipse-LazyStart: true Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.core -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Require-Bundle: com.ibm.wala.shrike, diff --git a/com.ibm.wala.core/pom.xml b/com.ibm.wala.core/pom.xml new file mode 100644 index 000000000..012b60b6a --- /dev/null +++ b/com.ibm.wala.core/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.core + eclipse-plugin + diff --git a/com.ibm.wala.ide-feature/build.properties b/com.ibm.wala.ide-feature/build.properties index fd680b6f8..b3a611b5c 100644 --- a/com.ibm.wala.ide-feature/build.properties +++ b/com.ibm.wala.ide-feature/build.properties @@ -1,4 +1,2 @@ bin.includes = feature.xml,\ - feature.properties,\ - license.html,\ - notice.html + feature.properties diff --git a/com.ibm.wala.ide-feature/feature.xml b/com.ibm.wala.ide-feature/feature.xml index 564b94477..112c2234c 100644 --- a/com.ibm.wala.ide-feature/feature.xml +++ b/com.ibm.wala.ide-feature/feature.xml @@ -1,8 +1,8 @@ @@ -20,11 +20,4 @@ version="0.0.0" unpack="false"/> - - diff --git a/com.ibm.wala.ide-feature/pom.xml b/com.ibm.wala.ide-feature/pom.xml new file mode 100644 index 000000000..597c8b3e4 --- /dev/null +++ b/com.ibm.wala.ide-feature/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.ide-feature + eclipse-feature + diff --git a/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF index 6b0ee6589..6631e4688 100644 --- a/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF @@ -17,7 +17,7 @@ Require-Bundle: com.ibm.wala.cast.java.test;bundle-version="1.0.0", com.ibm.wala.util;bundle-version="1.1.3", org.eclipse.core.resources;bundle-version="3.4.1", org.eclipse.jdt.core;bundle-version="3.4.2", - org.junit4;bundle-version="4.8.1", + org.junit;bundle-version="4.8.1", org.eclipse.core.runtime, org.eclipse.pde.core;bundle-version="3.6.0" Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.ide.jdt.test/pom.xml b/com.ibm.wala.ide.jdt.test/pom.xml new file mode 100644 index 000000000..e2e2bdcb4 --- /dev/null +++ b/com.ibm.wala.ide.jdt.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.jdt.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF index eccacb821..9da941889 100644 --- a/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF @@ -2,20 +2,20 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA IDE JDT components Bundle-SymbolicName: com.ibm.wala.ide.jdt -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.ide.jdt.Activator Bundle-Vendor: IBM Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - com.ibm.wala.cast;bundle-version="1.0.0", - com.ibm.wala.cast.java;bundle-version="1.0.0", - com.ibm.wala.core;bundle-version="1.1.3", - com.ibm.wala.ide;bundle-version="1.1.3", - com.ibm.wala.shrike;bundle-version="1.3.1", - com.ibm.wala.util;bundle-version="2.0.0", - org.eclipse.core.resources;bundle-version="3.6.0", - org.eclipse.jdt.core;bundle-version="3.6.0", - org.eclipse.pde.core;bundle-version="3.6.0" + com.ibm.wala.cast, + com.ibm.wala.cast.java, + com.ibm.wala.core, + com.ibm.wala.ide, + com.ibm.wala.shrike, + com.ibm.wala.util, + org.eclipse.core.resources, + org.eclipse.jdt.core, + org.eclipse.pde.core Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.java.client, diff --git a/com.ibm.wala.ide.jdt/pom.xml b/com.ibm.wala.ide.jdt/pom.xml new file mode 100644 index 000000000..585a56782 --- /dev/null +++ b/com.ibm.wala.ide.jdt/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.ide.jdt + eclipse-plugin + diff --git a/com.ibm.wala.ide.jsdt.tests/pom.xml b/com.ibm.wala.ide.jsdt.tests/pom.xml new file mode 100644 index 000000000..b71cea93d --- /dev/null +++ b/com.ibm.wala.ide.jsdt.tests/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.jsdt.tests + 1.0.0-SNAPSHOT + eclipse-test-plugin + diff --git a/com.ibm.wala.ide.jsdt/pom.xml b/com.ibm.wala.ide.jsdt/pom.xml new file mode 100644 index 000000000..50c95d066 --- /dev/null +++ b/com.ibm.wala.ide.jsdt/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.jsdt + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF index 8a4a93376..f79b701d6 100644 --- a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.ide.tests;singleton:=true -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Require-Bundle: com.ibm.wala.shrike, com.ibm.wala.core, @@ -13,7 +13,7 @@ Require-Bundle: com.ibm.wala.shrike, org.eclipse.jdt.core, org.eclipse.ui, org.eclipse.ui.ide, - org.junit4;bundle-version="4.3.1", + org.junit;bundle-version="4.3.1", com.ibm.wala.ide.jdt;bundle-version="1.0.0" Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.ide.tests/pom.xml b/com.ibm.wala.ide.tests/pom.xml new file mode 100644 index 000000000..3cd5856a6 --- /dev/null +++ b/com.ibm.wala.ide.tests/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.tests + 1.1.3-SNAPSHOT + eclipse-test-plugin + diff --git a/com.ibm.wala.ide/META-INF/MANIFEST.MF b/com.ibm.wala.ide/META-INF/MANIFEST.MF index 4fa28d5d3..0b65e0c44 100644 --- a/com.ibm.wala.ide/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Eclipse-LazyStart: true Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.ide -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.ide.plugin.CorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -13,7 +13,8 @@ Require-Bundle: com.ibm.wala.core, org.eclipse.jface, org.eclipse.ui, org.eclipse.core.resources, - org.eclipse.core.runtime + org.eclipse.core.runtime, + org.eclipse.jdt.core Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: com.ibm.wala.ide.classloader, diff --git a/com.ibm.wala.ide/pom.xml b/com.ibm.wala.ide/pom.xml new file mode 100644 index 000000000..88a9b6db0 --- /dev/null +++ b/com.ibm.wala.ide/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.ide + eclipse-plugin + diff --git a/com.ibm.wala.shrike/META-INF/MANIFEST.MF b/com.ibm.wala.shrike/META-INF/MANIFEST.MF index 006a0d84d..5a6cd04c2 100644 --- a/com.ibm.wala.shrike/META-INF/MANIFEST.MF +++ b/com.ibm.wala.shrike/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.shrike -Bundle-Version: 1.3.1.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Bundle-ActivationPolicy: lazy Bundle-Localization: plugin diff --git a/com.ibm.wala.shrike/pom.xml b/com.ibm.wala.shrike/pom.xml new file mode 100644 index 000000000..ac1666afe --- /dev/null +++ b/com.ibm.wala.shrike/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.shrike + eclipse-plugin + diff --git a/com.ibm.wala.tests-feature/feature.xml b/com.ibm.wala.tests-feature/feature.xml index 6bf9f0603..0c21a45bc 100644 --- a/com.ibm.wala.tests-feature/feature.xml +++ b/com.ibm.wala.tests-feature/feature.xml @@ -1,8 +1,8 @@ @@ -19,7 +19,7 @@ install-size="0" version="0.0.0" unpack="false"/> - + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.tests-feature + eclipse-feature + diff --git a/com.ibm.wala.tests.ide-feature/feature.xml b/com.ibm.wala.tests.ide-feature/feature.xml index f8260d903..c9098793f 100644 --- a/com.ibm.wala.tests.ide-feature/feature.xml +++ b/com.ibm.wala.tests.ide-feature/feature.xml @@ -2,7 +2,7 @@ @@ -13,13 +13,6 @@ %license - - + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.tests.ide + 1.1.3-SNAPSHOT + eclipse-feature + diff --git a/com.ibm.wala.util/.gitignore b/com.ibm.wala.util/.gitignore new file mode 100644 index 000000000..1ad0b565d --- /dev/null +++ b/com.ibm.wala.util/.gitignore @@ -0,0 +1 @@ +/walaUtil.jar diff --git a/com.ibm.wala.util/META-INF/MANIFEST.MF b/com.ibm.wala.util/META-INF/MANIFEST.MF index 681dbf546..b3193cf24 100644 --- a/com.ibm.wala.util/META-INF/MANIFEST.MF +++ b/com.ibm.wala.util/META-INF/MANIFEST.MF @@ -1,8 +1,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 -Bundle-Name: Util +Bundle-Name: WALA Util Bundle-SymbolicName: com.ibm.wala.util -Bundle-Version: 2.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Export-Package: com.ibm.wala.dataflow.graph, com.ibm.wala.fixedpoint.impl, com.ibm.wala.fixpoint, @@ -25,3 +25,4 @@ Export-Package: com.ibm.wala.dataflow.graph, com.ibm.wala.viz Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ClassPath: walaUtil.jar +Bundle-Vendor: IBM diff --git a/com.ibm.wala.util/pom.xml b/com.ibm.wala.util/pom.xml new file mode 100644 index 000000000..9c5d38a00 --- /dev/null +++ b/com.ibm.wala.util/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.util + eclipse-plugin + diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..32616b48e --- /dev/null +++ b/pom.xml @@ -0,0 +1,147 @@ + + + 4.0.0 + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + pom + + + 0.17.0 + 1.3.4-SNAPSHOT + UTF-8 + b000 + scm:git:ssh://github.com:wala/WALA.git + + + + targets + com.ibm.wala-feature + com.ibm.wala.cast + com.ibm.wala.cast.java + com.ibm.wala.core + + com.ibm.wala.ide-feature + com.ibm.wala.ide + com.ibm.wala.ide.jdt + com.ibm.wala.shrike + com.ibm.wala.util + com.ibm.wala-repository + + com.ibm.wala.tests-feature + com.ibm.wala.core.tests + com.ibm.wala.core.testdata + com.ibm.wala.cast.test + com.ibm.wala.cast.java.test + com.ibm.wala.cast.java.test.data + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + + + com.ibm.wala.target + e42 + ${project-version} + + + + + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + 1.6 + 1.6 + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + attach-source + process-classes + + plugin-source + + + + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + 'v'yyyyMMdd-HHmm'-${build-alias}' + false + + true + + + + + org.eclipse.tycho.extras + tycho-sourceref-jgit + ${tycho-version} + + + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho-version} + + junit47 + ${tycho.test.jvmArgs} + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-director-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho-version} + + false + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho-version} + + + + diff --git a/targets/e42/e42.target b/targets/e42/e42.target new file mode 100644 index 000000000..f0093e439 --- /dev/null +++ b/targets/e42/e42.target @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/targets/e42/pom.xml b/targets/e42/pom.xml new file mode 100644 index 000000000..562fe70f0 --- /dev/null +++ b/targets/e42/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala.target + targets + 1.3.4-SNAPSHOT + + e42 + eclipse-target-definition + diff --git a/targets/pom.xml b/targets/pom.xml new file mode 100644 index 000000000..624e5e675 --- /dev/null +++ b/targets/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.target + targets + pom + + e42 + + From 4596492463a85887ac3a41e9a5d8cabab7ceae0d Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Fri, 19 Apr 2013 17:56:58 +0200 Subject: [PATCH 062/187] excluded test plugin execution for demo purpose --- pom.xml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 32616b48e..668676d73 100644 --- a/pom.xml +++ b/pom.xml @@ -29,22 +29,14 @@ com.ibm.wala.shrike com.ibm.wala.util com.ibm.wala-repository - + + --> From e9f26548c7a2c10ea30b439a21d8873628dbef55 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Wed, 24 Apr 2013 21:59:43 -0500 Subject: [PATCH 063/187] small fix to manifest --- com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF index 3f7ea1bf0..b7f4ac5e0 100644 --- a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF @@ -13,7 +13,7 @@ Require-Bundle: org.eclipse.ui, com.ibm.wala.core;bundle-version="1.1.3", com.ibm.wala.ide;bundle-version="1.1.3", com.ibm.wala.shrike;bundle-version="1.3.1", - com.ibm.wala.util;bundle-version="2.0.0", + com.ibm.wala.util;bundle-version="1.3.1", org.eclipse.wst.jsdt.core;bundle-version="1.1.0", org.eclipse.wst.jsdt.ui;bundle-version="1.1.0", org.eclipse.core.resources;bundle-version="3.6.0", From 680e43efce47579f167ce6b53a27a1ca8a93efc4 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Wed, 24 Apr 2013 22:10:15 -0500 Subject: [PATCH 064/187] right classloader for call graph tests --- .../tests/callGraph/CallGraphTestUtil.java | 38 ++++++++++++++++++- .../wala/core/tests/slicer/SlicerTest.java | 2 +- 2 files changed, 37 insertions(+), 3 deletions(-) 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 ba51c9417..0a56eb540 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 @@ -10,7 +10,11 @@ *******************************************************************************/ package com.ibm.wala.core.tests.callGraph; +import java.io.BufferedReader; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; @@ -22,6 +26,7 @@ import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.config.AnalysisScopeReader; +import com.ibm.wala.util.config.FileOfClasses; import com.ibm.wala.util.io.FileProvider; import com.ibm.wala.util.perf.StopwatchGC; @@ -44,8 +49,37 @@ public class CallGraphTestUtil { */ private static final boolean CHECK_FOOTPRINT = false; - public static AnalysisScope makeJ2SEAnalysisScope(String scopeFile, String exclusionsFile) throws IOException { - AnalysisScope scope = AnalysisScopeReader.readJavaScope(scopeFile, (new FileProvider()).getFile(exclusionsFile), MY_CLASSLOADER); + public static AnalysisScope makeJ2SEAnalysisScope(String scopeFileName, String exclusionsFileName) throws IOException { + AnalysisScope scope = AnalysisScope.createJavaAnalysisScope(); + FileProvider fileProvider = new FileProvider(); + File exclusionsFile = fileProvider.getFile(exclusionsFileName, MY_CLASSLOADER); + BufferedReader r = null; + try { + InputStream scopeStream = fileProvider.getInputStreamFromClassLoader(scopeFileName, MY_CLASSLOADER); + + String line; + + // assume the scope file is UTF-8 encoded; ASCII files will also be + // handled properly + // TODO allow specifying encoding as a parameter? + r = new BufferedReader(new InputStreamReader(scopeStream, "UTF-8")); + while ((line = r.readLine()) != null) { + AnalysisScopeReader.processScopeDefLine(scope, MY_CLASSLOADER, line); + } + + if (exclusionsFile != null) { + scope.setExclusions(FileOfClasses.createFileOfClasses(exclusionsFile)); + } + + } finally { + if (r != null) { + try { + r.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } return scope; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java index 2e243fbeb..e5020bd42 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java @@ -71,7 +71,7 @@ public class SlicerTest { private static AnalysisScope findOrCreateAnalysisScope() throws IOException { if (cachedScope == null) { - cachedScope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, "Java60RegressionExclusions.txt"); + cachedScope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, "/Java60RegressionExclusions.txt"); } return cachedScope; } From c99155e795f96a1a6bebe94622bd17dd2a2e0b08 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 27 Apr 2013 09:54:07 -0700 Subject: [PATCH 065/187] add extra dependencies for Eclipse Juno --- com.ibm.wala.ide.tests/META-INF/MANIFEST.MF | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF index 8a4a93376..e266579c2 100644 --- a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF @@ -14,7 +14,10 @@ Require-Bundle: com.ibm.wala.shrike, org.eclipse.ui, org.eclipse.ui.ide, org.junit4;bundle-version="4.3.1", - com.ibm.wala.ide.jdt;bundle-version="1.0.0" + com.ibm.wala.ide.jdt;bundle-version="1.0.0", + org.eclipse.osgi.services;bundle-version="3.3.100";resolution:=optional, + org.eclipse.e4.ui.model.workbench;bundle-version="0.10.1";resolution:=optional, + org.eclipse.e4.core.di;bundle-version="1.2.0";resolution:=optional Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy From cdeec43267883aa3d2d54da2280706742f18bb40 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 27 Apr 2013 09:54:07 -0700 Subject: [PATCH 066/187] add extra dependencies for Eclipse Juno --- com.ibm.wala.ide.tests/META-INF/MANIFEST.MF | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF index f79b701d6..98252d346 100644 --- a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF @@ -13,8 +13,11 @@ Require-Bundle: com.ibm.wala.shrike, org.eclipse.jdt.core, org.eclipse.ui, org.eclipse.ui.ide, - org.junit;bundle-version="4.3.1", - com.ibm.wala.ide.jdt;bundle-version="1.0.0" + org.junit4;bundle-version="4.3.1", + com.ibm.wala.ide.jdt;bundle-version="1.0.0", + org.eclipse.osgi.services;bundle-version="3.3.100";resolution:=optional, + org.eclipse.e4.ui.model.workbench;bundle-version="0.10.1";resolution:=optional, + org.eclipse.e4.core.di;bundle-version="1.2.0";resolution:=optional Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy From edad282c715a42606158cd7e7eef55e1f56c34e5 Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Fri, 19 Apr 2013 16:23:42 +0200 Subject: [PATCH 067/187] [releng] added preliminary maven tycho build support --- pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pom.xml b/pom.xml index 668676d73..c31c25551 100644 --- a/pom.xml +++ b/pom.xml @@ -29,14 +29,6 @@ com.ibm.wala.shrike com.ibm.wala.util com.ibm.wala-repository - From 4409b351db3e894f86c6f22d2f1068c1775ac5cf Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Mon, 29 Apr 2013 10:49:37 +0200 Subject: [PATCH 068/187] added js projects to tycho build --- com.ibm.wala.cast.java.polyglot/pom.xml | 46 +++-- .../META-INF/MANIFEST.MF | 2 +- .../pom.xml | 23 ++- com.ibm.wala.cast.js.rhino/.classpath | 1 - .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/build.properties | 3 +- com.ibm.wala.cast.js.rhino/pom.xml | 44 ++-- com.ibm.wala.cast.js/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js/build.properties | 6 +- com.ibm.wala.cast.js/pom.xml | 43 ++-- com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF | 16 +- com.ibm.wala.ide.jsdt/pom.xml | 4 +- pom.xml | 195 ++++++++++-------- targets/e42/e42.target | 42 +--- 14 files changed, 250 insertions(+), 179 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot/pom.xml b/com.ibm.wala.cast.java.polyglot/pom.xml index db2c5e47a..a513e29fc 100644 --- a/com.ibm.wala.cast.java.polyglot/pom.xml +++ b/com.ibm.wala.cast.java.polyglot/pom.xml @@ -1,14 +1,36 @@ - - 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala - com.ibm.wala.cast.java.polyglot - 1.0.0 - eclipse-plugin + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java.polyglot + eclipse-plugin + + + + + maven-antrun-plugin + 1.7 + + + process-resources + + + + + + + + run + + + + + + diff --git a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF index a06f49ed6..8dd23bd8c 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Nu_validator Bundle-SymbolicName: com.ibm.wala.cast.js.html.nu_validator -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Export-Package: com.ibm.wala.cast.js.html.nu_validator Require-Bundle: com.ibm.wala.cast.js;bundle-version="1.0.0", com.ibm.wala.cast.js.rhino.test;bundle-version="1.0.0", diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml index 5d2add2d9..f306175e5 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/pom.xml +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -5,10 +5,27 @@ WALA com.ibm.wala - 0.0.1-SNAPSHOT + 1.3.4-SNAPSHOT - com.ibm.wala com.ibm.wala.cast.js.html.nu_validator - 1.0.0-SNAPSHOT eclipse-plugin + + + + com.googlecode.maven-download-plugin + maven-download-plugin + + + + wget + + + http://repo1.maven.org/maven2/nu/validator/htmlparser/htmlparser/1.4/htmlparser-1.4.jar + lib/ + + + + + + diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index 5ebf5d40c..f28b70835 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -1,7 +1,6 @@ - diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index 488dd5508..ae8907d72 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Rhino Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js.rhino -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.js.rhino.Activator Bundle-Vendor: IBM Require-Bundle: org.eclipse.core.runtime, diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index 6c83edd19..a3f6a00c6 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,4 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/js.jar + lib/rhino-1.7R4.jar +jars.extra.classpath = lib/rhino-1.7R4.jar diff --git a/com.ibm.wala.cast.js.rhino/pom.xml b/com.ibm.wala.cast.js.rhino/pom.xml index 3aa6b32f7..0d46b60c4 100644 --- a/com.ibm.wala.cast.js.rhino/pom.xml +++ b/com.ibm.wala.cast.js.rhino/pom.xml @@ -1,14 +1,34 @@ - - 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala - com.ibm.wala.cast.js.rhino - 1.0.0 - eclipse-plugin + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.js.rhino + eclipse-plugin + + + + com.googlecode.maven-download-plugin + maven-download-plugin + + + + wget + + + http://repo1.maven.org/maven2/org/mozilla/rhino/1.7R4/rhino-1.7R4.jar + lib/ + + + + + + + + diff --git a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF index cc9a2e2df..78b20d0d1 100644 --- a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JavaScript Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js;singleton:=true -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-ClassPath: bin/, ., lib/js.jar, diff --git a/com.ibm.wala.cast.js/build.properties b/com.ibm.wala.cast.js/build.properties index 3bd5a0ed6..d20ca4fe7 100644 --- a/com.ibm.wala.cast.js/build.properties +++ b/com.ibm.wala.cast.js/build.properties @@ -1,8 +1,6 @@ -output.js.jar = bin/ -bin.includes = lib/js.jar,\ - lib/xalan.jar,\ - .,\ +bin.includes = .,\ META-INF/,\ bin/ source.. = source/,\ dat/ +jars.extra.classpath = lib/jericho-html-3.2.jar diff --git a/com.ibm.wala.cast.js/pom.xml b/com.ibm.wala.cast.js/pom.xml index dbfd60b1d..d96098106 100644 --- a/com.ibm.wala.cast.js/pom.xml +++ b/com.ibm.wala.cast.js/pom.xml @@ -1,14 +1,33 @@ - - 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala - com.ibm.wala.cast.js - 1.0.0 - eclipse-plugin + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js + eclipse-plugin + + + + com.googlecode.maven-download-plugin + maven-download-plugin + + + + wget + + + http://repo1.maven.org/maven2/net/htmlparser/jericho/jericho-html/3.2/jericho-html-3.2.jar + lib/ + + + + + + diff --git a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF index b7f4ac5e0..5c2dfc465 100644 --- a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF @@ -2,18 +2,18 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Jsdt Bundle-SymbolicName: com.ibm.wala.ide.jsdt -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.ide.jsdt.Activator Bundle-Vendor: IBM Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - com.ibm.wala.cast;bundle-version="1.0.0", - com.ibm.wala.cast.js;bundle-version="1.0.0", - com.ibm.wala.cast.js.rhino;bundle-version="1.0.0", - com.ibm.wala.core;bundle-version="1.1.3", - com.ibm.wala.ide;bundle-version="1.1.3", - com.ibm.wala.shrike;bundle-version="1.3.1", - com.ibm.wala.util;bundle-version="1.3.1", + com.ibm.wala.cast, + com.ibm.wala.cast.js, + com.ibm.wala.cast.js.rhino, + com.ibm.wala.core, + com.ibm.wala.ide, + com.ibm.wala.shrike, + com.ibm.wala.util, org.eclipse.wst.jsdt.core;bundle-version="1.1.0", org.eclipse.wst.jsdt.ui;bundle-version="1.1.0", org.eclipse.core.resources;bundle-version="3.6.0", diff --git a/com.ibm.wala.ide.jsdt/pom.xml b/com.ibm.wala.ide.jsdt/pom.xml index 50c95d066..baca929c2 100644 --- a/com.ibm.wala.ide.jsdt/pom.xml +++ b/com.ibm.wala.ide.jsdt/pom.xml @@ -5,10 +5,8 @@ WALA com.ibm.wala - 0.0.1-SNAPSHOT + 1.3.4-SNAPSHOT - com.ibm.wala com.ibm.wala.ide.jsdt - 1.0.0-SNAPSHOT eclipse-plugin diff --git a/pom.xml b/pom.xml index c31c25551..d36447bdd 100644 --- a/pom.xml +++ b/pom.xml @@ -7,27 +7,36 @@ WALA 1.3.4-SNAPSHOT pom - - - 0.17.0 + + 1.3.4-SNAPSHOT UTF-8 b000 - scm:git:ssh://github.com:wala/WALA.git + 0.17.0 + scm:git:ssh://github.com:wala/WALA.git - targets + targets + com.ibm.wala-feature + com.ibm.wala.core + com.ibm.wala.shrike + com.ibm.wala.util + com.ibm.wala.cast com.ibm.wala.cast.java - com.ibm.wala.core + + + com.ibm.wala.cast.js + com.ibm.wala.cast.js.rhino com.ibm.wala.ide-feature com.ibm.wala.ide com.ibm.wala.ide.jdt - com.ibm.wala.shrike - com.ibm.wala.util + com.ibm.wala.ide.jsdt + com.ibm.wala-repository @@ -35,13 +44,13 @@ org.eclipse.tycho tycho-maven-plugin - ${tycho-version} + ${tycho-version} true org.eclipse.tycho target-platform-configuration - ${tycho-version} + ${tycho-version} @@ -52,80 +61,98 @@ - - org.eclipse.tycho - tycho-compiler-plugin - ${tycho-version} - - 1.6 - 1.6 - - - - org.eclipse.tycho - tycho-source-plugin - ${tycho-version} - - - attach-source - process-classes - - plugin-source - - - - - - org.eclipse.tycho - tycho-packaging-plugin - ${tycho-version} - - 'v'yyyyMMdd-HHmm'-${build-alias}' - false - - true - - - - - org.eclipse.tycho.extras - tycho-sourceref-jgit - ${tycho-version} - - - - - org.eclipse.tycho - tycho-surefire-plugin - ${tycho-version} - - junit47 - ${tycho.test.jvmArgs} - - - - org.eclipse.tycho - tycho-p2-plugin - ${tycho-version} - - - org.eclipse.tycho - tycho-p2-director-plugin - ${tycho-version} - - - org.eclipse.tycho - tycho-p2-repository-plugin - ${tycho-version} - - false - - - - org.eclipse.tycho.extras - tycho-source-feature-plugin - ${tycho-version} - + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + 1.6 + 1.6 + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + attach-source + process-classes + + plugin-source + + + + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + 'v'yyyyMMdd-HHmm'-${build-alias}' + false + + true + + + + + org.eclipse.tycho.extras + tycho-sourceref-jgit + ${tycho-version} + + + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho-version} + + junit47 + ${tycho.test.jvmArgs} + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-director-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho-version} + + false + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho-version} + + + com.googlecode.maven-download-plugin + maven-download-plugin + 1.0.0 + + + + sonatype-public-repository + https://oss.sonatype.org/content/groups/public + + true + + + true + + + + diff --git a/targets/e42/e42.target b/targets/e42/e42.target index f0093e439..4871bfc32 100644 --- a/targets/e42/e42.target +++ b/targets/e42/e42.target @@ -1,44 +1,14 @@ - - - + - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - From 7c2d18cd585736914b31bcd4b3fd520bb99a31ce Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Fri, 19 Apr 2013 16:23:42 +0200 Subject: [PATCH 069/187] [releng] added preliminary maven tycho build support --- .gitignore | 1 + com.ibm.wala-feature/build.properties | 4 +- com.ibm.wala-feature/feature.xml | 4 +- com.ibm.wala-feature/pom.xml | 12 ++ com.ibm.wala-repository/category.xml | 13 ++ com.ibm.wala-repository/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 6 +- com.ibm.wala.cast.java.polyglot.test/pom.xml | 14 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.polyglot/pom.xml | 14 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.test.data/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 6 +- com.ibm.wala.cast.java.test/pom.xml | 12 ++ com.ibm.wala.cast.java/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java/build.properties | 4 +- com.ibm.wala.cast.java/pom.xml | 12 ++ .../pom.xml | 14 ++ com.ibm.wala.cast.js.rhino.test/pom.xml | 14 ++ com.ibm.wala.cast.js.rhino/pom.xml | 14 ++ com.ibm.wala.cast.js.test.data/pom.xml | 14 ++ com.ibm.wala.cast.js.test/pom.xml | 14 ++ com.ibm.wala.cast.js/pom.xml | 14 ++ com.ibm.wala.cast.test/META-INF/MANIFEST.MF | 4 +- com.ibm.wala.cast.test/pom.xml | 12 ++ com.ibm.wala.cast/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core.testdata/pom.xml | 12 ++ com.ibm.wala.core.tests/META-INF/MANIFEST.MF | 4 +- .../launchers/wala.core.launch | 1 - com.ibm.wala.core.tests/pom.xml | 12 ++ com.ibm.wala.core/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.core/pom.xml | 12 ++ com.ibm.wala.ide-feature/build.properties | 4 +- com.ibm.wala.ide-feature/feature.xml | 11 +- com.ibm.wala.ide-feature/pom.xml | 12 ++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.ide.jdt.test/pom.xml | 14 ++ com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF | 20 +-- com.ibm.wala.ide.jdt/pom.xml | 12 ++ com.ibm.wala.ide.jsdt.tests/pom.xml | 14 ++ com.ibm.wala.ide.jsdt/pom.xml | 14 ++ com.ibm.wala.ide.tests/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.ide.tests/pom.xml | 14 ++ com.ibm.wala.ide/META-INF/MANIFEST.MF | 5 +- com.ibm.wala.ide/pom.xml | 12 ++ com.ibm.wala.shrike/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.shrike/pom.xml | 12 ++ com.ibm.wala.tests-feature/feature.xml | 6 +- com.ibm.wala.tests-feature/pom.xml | 12 ++ com.ibm.wala.tests.ide-feature/feature.xml | 9 +- com.ibm.wala.tests.ide-feature/pom.xml | 14 ++ com.ibm.wala.util/.gitignore | 1 + com.ibm.wala.util/META-INF/MANIFEST.MF | 5 +- com.ibm.wala.util/pom.xml | 12 ++ pom.xml | 147 ++++++++++++++++++ targets/e42/e42.target | 44 ++++++ targets/e42/pom.xml | 12 ++ targets/pom.xml | 16 ++ 60 files changed, 654 insertions(+), 65 deletions(-) create mode 100644 com.ibm.wala-feature/pom.xml create mode 100644 com.ibm.wala-repository/category.xml create mode 100644 com.ibm.wala-repository/pom.xml create mode 100644 com.ibm.wala.cast.java.polyglot.test/pom.xml create mode 100644 com.ibm.wala.cast.java.polyglot/pom.xml create mode 100644 com.ibm.wala.cast.java.test.data/pom.xml create mode 100644 com.ibm.wala.cast.java.test/pom.xml create mode 100644 com.ibm.wala.cast.java/pom.xml create mode 100644 com.ibm.wala.cast.js.html.nu_validator/pom.xml create mode 100644 com.ibm.wala.cast.js.rhino.test/pom.xml create mode 100644 com.ibm.wala.cast.js.rhino/pom.xml create mode 100644 com.ibm.wala.cast.js.test.data/pom.xml create mode 100644 com.ibm.wala.cast.js.test/pom.xml create mode 100644 com.ibm.wala.cast.js/pom.xml create mode 100644 com.ibm.wala.cast.test/pom.xml create mode 100644 com.ibm.wala.cast/pom.xml create mode 100644 com.ibm.wala.core.testdata/pom.xml create mode 100644 com.ibm.wala.core.tests/pom.xml create mode 100644 com.ibm.wala.core/pom.xml create mode 100644 com.ibm.wala.ide-feature/pom.xml create mode 100644 com.ibm.wala.ide.jdt.test/pom.xml create mode 100644 com.ibm.wala.ide.jdt/pom.xml create mode 100644 com.ibm.wala.ide.jsdt.tests/pom.xml create mode 100644 com.ibm.wala.ide.jsdt/pom.xml create mode 100644 com.ibm.wala.ide.tests/pom.xml create mode 100644 com.ibm.wala.ide/pom.xml create mode 100644 com.ibm.wala.shrike/pom.xml create mode 100644 com.ibm.wala.tests-feature/pom.xml create mode 100644 com.ibm.wala.tests.ide-feature/pom.xml create mode 100644 com.ibm.wala.util/.gitignore create mode 100644 com.ibm.wala.util/pom.xml create mode 100644 pom.xml create mode 100644 targets/e42/e42.target create mode 100644 targets/e42/pom.xml create mode 100644 targets/pom.xml diff --git a/.gitignore b/.gitignore index 7aa1eb0fc..1d84436da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +target/ */bin/ com.ibm.wala.cast.js.rhino/lib/ com.ibm.wala.cast.js/lib/ diff --git a/com.ibm.wala-feature/build.properties b/com.ibm.wala-feature/build.properties index fd680b6f8..b3a611b5c 100644 --- a/com.ibm.wala-feature/build.properties +++ b/com.ibm.wala-feature/build.properties @@ -1,4 +1,2 @@ bin.includes = feature.xml,\ - feature.properties,\ - license.html,\ - notice.html + feature.properties diff --git a/com.ibm.wala-feature/feature.xml b/com.ibm.wala-feature/feature.xml index bf8955345..93767740a 100644 --- a/com.ibm.wala-feature/feature.xml +++ b/com.ibm.wala-feature/feature.xml @@ -1,8 +1,8 @@ diff --git a/com.ibm.wala-feature/pom.xml b/com.ibm.wala-feature/pom.xml new file mode 100644 index 000000000..4cc0a7cd9 --- /dev/null +++ b/com.ibm.wala-feature/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala-feature + eclipse-feature + diff --git a/com.ibm.wala-repository/category.xml b/com.ibm.wala-repository/category.xml new file mode 100644 index 000000000..1413a77af --- /dev/null +++ b/com.ibm.wala-repository/category.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/com.ibm.wala-repository/pom.xml b/com.ibm.wala-repository/pom.xml new file mode 100644 index 000000000..5d56d786d --- /dev/null +++ b/com.ibm.wala-repository/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala-repository + eclipse-repository + diff --git a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF index 861ee8d27..6b4a7ee31 100644 --- a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA Cast Java Polyglot Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.polyglot.test -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.java.polyglot.test.Activator Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.cast;bundle-version="1.0.0", @@ -13,6 +13,6 @@ Require-Bundle: com.ibm.wala.cast;bundle-version="1.0.0", org.eclipse.core.runtime, com.ibm.wala.cast.test;bundle-version="1.0.0", com.ibm.wala.cast.java.polyglot;bundle-version="1.0.0", - org.junit4;bundle-version="4.3.1" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 + org.junit;bundle-version="4.0.0" +Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.polyglot.test/pom.xml b/com.ibm.wala.cast.java.polyglot.test/pom.xml new file mode 100644 index 000000000..717105108 --- /dev/null +++ b/com.ibm.wala.cast.java.polyglot.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.java.polyglot.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF index bfad0f04b..9a3cf5f5c 100644 --- a/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA CAst Java Polyglot Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.polyglot -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.cast.java, com.ibm.wala.cast, diff --git a/com.ibm.wala.cast.java.polyglot/pom.xml b/com.ibm.wala.cast.java.polyglot/pom.xml new file mode 100644 index 000000000..db2c5e47a --- /dev/null +++ b/com.ibm.wala.cast.java.polyglot/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.java.polyglot + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF index 860f076cb..069629ab7 100644 --- a/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test.data/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Data Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.test.data -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.test.data/pom.xml b/com.ibm.wala.cast.java.test.data/pom.xml new file mode 100644 index 000000000..9b9f9d822 --- /dev/null +++ b/com.ibm.wala.cast.java.test.data/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java.test.data + eclipse-plugin + diff --git a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF index 008b4bb13..e5c8e8f21 100644 --- a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF @@ -5,13 +5,13 @@ Bundle-SymbolicName: com.ibm.wala.cast.java.test Bundle-Version: 1.0.0 Bundle-Activator: com.ibm.wala.cast.java.test.TestPlugin Bundle-Vendor: IBM -Require-Bundle: org.junit4, - com.ibm.wala.core.tests, +Require-Bundle: com.ibm.wala.core.tests, com.ibm.wala.cast.java, com.ibm.wala.cast, com.ibm.wala.core, com.ibm.wala.shrike, - org.eclipse.core.runtime + org.eclipse.core.runtime, + org.junit;bundle-version="4.0.0" Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.java.test Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.java.test/pom.xml b/com.ibm.wala.cast.java.test/pom.xml new file mode 100644 index 000000000..8060e2b93 --- /dev/null +++ b/com.ibm.wala.cast.java.test/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java.test + eclipse-test-plugin + diff --git a/com.ibm.wala.cast.java/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java/META-INF/MANIFEST.MF index d2bfa7384..a312ba006 100644 --- a/com.ibm.wala.cast.java/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Java Source WALA Front End Bundle-SymbolicName: com.ibm.wala.cast.java -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.java.JavaSourcePlugin Bundle-Vendor: rfuhrer@watson.ibm.com Require-Bundle: com.ibm.wala.cast, diff --git a/com.ibm.wala.cast.java/build.properties b/com.ibm.wala.cast.java/build.properties index d9146fc61..34d2e4d2d 100644 --- a/com.ibm.wala.cast.java/build.properties +++ b/com.ibm.wala.cast.java/build.properties @@ -1,6 +1,4 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - .,\ - lib/java_cup.jar,\ - lib/polyglot.jar + . diff --git a/com.ibm.wala.cast.java/pom.xml b/com.ibm.wala.cast.java/pom.xml new file mode 100644 index 000000000..5ebf1cc4f --- /dev/null +++ b/com.ibm.wala.cast.java/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml new file mode 100644 index 000000000..5d2add2d9 --- /dev/null +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.html.nu_validator + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.rhino.test/pom.xml b/com.ibm.wala.cast.js.rhino.test/pom.xml new file mode 100644 index 000000000..ca3571a60 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.rhino.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.rhino/pom.xml b/com.ibm.wala.cast.js.rhino/pom.xml new file mode 100644 index 000000000..3aa6b32f7 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.rhino + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.test.data/pom.xml b/com.ibm.wala.cast.js.test.data/pom.xml new file mode 100644 index 000000000..eceef9eec --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.test.data + 1.1.3-SNAPSHOT + eclipse-plugin + diff --git a/com.ibm.wala.cast.js.test/pom.xml b/com.ibm.wala.cast.js.test/pom.xml new file mode 100644 index 000000000..077cfbff8 --- /dev/null +++ b/com.ibm.wala.cast.js.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.js/pom.xml b/com.ibm.wala.cast.js/pom.xml new file mode 100644 index 000000000..dbfd60b1d --- /dev/null +++ b/com.ibm.wala.cast.js/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.cast.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.test/META-INF/MANIFEST.MF index 8471852c0..b04a11f95 100644 --- a/com.ibm.wala.cast.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.test/META-INF/MANIFEST.MF @@ -2,10 +2,10 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CAst Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.test -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Require-Bundle: - org.junit4, + org.junit;bundle-version="4.0.0", com.ibm.wala.core.tests, com.ibm.wala.cast, com.ibm.wala.core, diff --git a/com.ibm.wala.cast.test/pom.xml b/com.ibm.wala.cast.test/pom.xml new file mode 100644 index 000000000..6d9346166 --- /dev/null +++ b/com.ibm.wala.cast.test/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.test + eclipse-test-plugin + diff --git a/com.ibm.wala.cast/META-INF/MANIFEST.MF b/com.ibm.wala.cast/META-INF/MANIFEST.MF index 50084f0eb..129af4fc9 100644 --- a/com.ibm.wala.cast/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA CAst core Plug-in Bundle-SymbolicName: com.ibm.wala.cast -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.plugin.AstPlugin Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.core, diff --git a/com.ibm.wala.cast/pom.xml b/com.ibm.wala.cast/pom.xml new file mode 100644 index 000000000..46bda53b9 --- /dev/null +++ b/com.ibm.wala.cast/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast + eclipse-plugin + diff --git a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF index b488cc53c..47aa91192 100644 --- a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF @@ -2,6 +2,6 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Testdata Plug-in Bundle-SymbolicName: com.ibm.wala.core.testdata -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.core.testdata/pom.xml b/com.ibm.wala.core.testdata/pom.xml new file mode 100644 index 000000000..4eabfb994 --- /dev/null +++ b/com.ibm.wala.core.testdata/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.core.testdata + eclipse-plugin + diff --git a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF index 4eb18abef..313cdfd48 100644 --- a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF @@ -2,12 +2,12 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.core.tests;singleton:=true -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Require-Bundle: com.ibm.wala.shrike, com.ibm.wala.core, org.eclipse.core.runtime, - org.junit4;bundle-version="4.3.1" + org.junit;bundle-version="4.3.1" Bundle-Localization: plugin Export-Package: com.ibm.wala.core.tests.basic, com.ibm.wala.core.tests.callGraph, diff --git a/com.ibm.wala.core.tests/launchers/wala.core.launch b/com.ibm.wala.core.tests/launchers/wala.core.launch index 75adbe8cc..673313914 100644 --- a/com.ibm.wala.core.tests/launchers/wala.core.launch +++ b/com.ibm.wala.core.tests/launchers/wala.core.launch @@ -21,7 +21,6 @@ - diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml new file mode 100644 index 000000000..c3f48055f --- /dev/null +++ b/com.ibm.wala.core.tests/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.core.tests + eclipse-test-plugin + diff --git a/com.ibm.wala.core/META-INF/MANIFEST.MF b/com.ibm.wala.core/META-INF/MANIFEST.MF index 53d6b3eaa..6febf89c7 100644 --- a/com.ibm.wala.core/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Eclipse-LazyStart: true Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.core -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Require-Bundle: com.ibm.wala.shrike, diff --git a/com.ibm.wala.core/pom.xml b/com.ibm.wala.core/pom.xml new file mode 100644 index 000000000..012b60b6a --- /dev/null +++ b/com.ibm.wala.core/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.core + eclipse-plugin + diff --git a/com.ibm.wala.ide-feature/build.properties b/com.ibm.wala.ide-feature/build.properties index fd680b6f8..b3a611b5c 100644 --- a/com.ibm.wala.ide-feature/build.properties +++ b/com.ibm.wala.ide-feature/build.properties @@ -1,4 +1,2 @@ bin.includes = feature.xml,\ - feature.properties,\ - license.html,\ - notice.html + feature.properties diff --git a/com.ibm.wala.ide-feature/feature.xml b/com.ibm.wala.ide-feature/feature.xml index 564b94477..112c2234c 100644 --- a/com.ibm.wala.ide-feature/feature.xml +++ b/com.ibm.wala.ide-feature/feature.xml @@ -1,8 +1,8 @@ @@ -20,11 +20,4 @@ version="0.0.0" unpack="false"/> - - diff --git a/com.ibm.wala.ide-feature/pom.xml b/com.ibm.wala.ide-feature/pom.xml new file mode 100644 index 000000000..597c8b3e4 --- /dev/null +++ b/com.ibm.wala.ide-feature/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.ide-feature + eclipse-feature + diff --git a/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF index 6b0ee6589..6631e4688 100644 --- a/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jdt.test/META-INF/MANIFEST.MF @@ -17,7 +17,7 @@ Require-Bundle: com.ibm.wala.cast.java.test;bundle-version="1.0.0", com.ibm.wala.util;bundle-version="1.1.3", org.eclipse.core.resources;bundle-version="3.4.1", org.eclipse.jdt.core;bundle-version="3.4.2", - org.junit4;bundle-version="4.8.1", + org.junit;bundle-version="4.8.1", org.eclipse.core.runtime, org.eclipse.pde.core;bundle-version="3.6.0" Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.ide.jdt.test/pom.xml b/com.ibm.wala.ide.jdt.test/pom.xml new file mode 100644 index 000000000..e2e2bdcb4 --- /dev/null +++ b/com.ibm.wala.ide.jdt.test/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.jdt.test + 1.0.0 + eclipse-plugin + diff --git a/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF index eccacb821..9da941889 100644 --- a/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jdt/META-INF/MANIFEST.MF @@ -2,20 +2,20 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA IDE JDT components Bundle-SymbolicName: com.ibm.wala.ide.jdt -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.ide.jdt.Activator Bundle-Vendor: IBM Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - com.ibm.wala.cast;bundle-version="1.0.0", - com.ibm.wala.cast.java;bundle-version="1.0.0", - com.ibm.wala.core;bundle-version="1.1.3", - com.ibm.wala.ide;bundle-version="1.1.3", - com.ibm.wala.shrike;bundle-version="1.3.1", - com.ibm.wala.util;bundle-version="2.0.0", - org.eclipse.core.resources;bundle-version="3.6.0", - org.eclipse.jdt.core;bundle-version="3.6.0", - org.eclipse.pde.core;bundle-version="3.6.0" + com.ibm.wala.cast, + com.ibm.wala.cast.java, + com.ibm.wala.core, + com.ibm.wala.ide, + com.ibm.wala.shrike, + com.ibm.wala.util, + org.eclipse.core.resources, + org.eclipse.jdt.core, + org.eclipse.pde.core Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.java.client, diff --git a/com.ibm.wala.ide.jdt/pom.xml b/com.ibm.wala.ide.jdt/pom.xml new file mode 100644 index 000000000..585a56782 --- /dev/null +++ b/com.ibm.wala.ide.jdt/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.ide.jdt + eclipse-plugin + diff --git a/com.ibm.wala.ide.jsdt.tests/pom.xml b/com.ibm.wala.ide.jsdt.tests/pom.xml new file mode 100644 index 000000000..b71cea93d --- /dev/null +++ b/com.ibm.wala.ide.jsdt.tests/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.jsdt.tests + 1.0.0-SNAPSHOT + eclipse-test-plugin + diff --git a/com.ibm.wala.ide.jsdt/pom.xml b/com.ibm.wala.ide.jsdt/pom.xml new file mode 100644 index 000000000..50c95d066 --- /dev/null +++ b/com.ibm.wala.ide.jsdt/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.jsdt + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF index e266579c2..98252d346 100644 --- a/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.ide.tests;singleton:=true -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Require-Bundle: com.ibm.wala.shrike, com.ibm.wala.core, diff --git a/com.ibm.wala.ide.tests/pom.xml b/com.ibm.wala.ide.tests/pom.xml new file mode 100644 index 000000000..3cd5856a6 --- /dev/null +++ b/com.ibm.wala.ide.tests/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.ide.tests + 1.1.3-SNAPSHOT + eclipse-test-plugin + diff --git a/com.ibm.wala.ide/META-INF/MANIFEST.MF b/com.ibm.wala.ide/META-INF/MANIFEST.MF index 4fa28d5d3..0b65e0c44 100644 --- a/com.ibm.wala.ide/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Eclipse-LazyStart: true Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.ide -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.ide.plugin.CorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -13,7 +13,8 @@ Require-Bundle: com.ibm.wala.core, org.eclipse.jface, org.eclipse.ui, org.eclipse.core.resources, - org.eclipse.core.runtime + org.eclipse.core.runtime, + org.eclipse.jdt.core Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: com.ibm.wala.ide.classloader, diff --git a/com.ibm.wala.ide/pom.xml b/com.ibm.wala.ide/pom.xml new file mode 100644 index 000000000..88a9b6db0 --- /dev/null +++ b/com.ibm.wala.ide/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.ide + eclipse-plugin + diff --git a/com.ibm.wala.shrike/META-INF/MANIFEST.MF b/com.ibm.wala.shrike/META-INF/MANIFEST.MF index 006a0d84d..5a6cd04c2 100644 --- a/com.ibm.wala.shrike/META-INF/MANIFEST.MF +++ b/com.ibm.wala.shrike/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.shrike -Bundle-Version: 1.3.1.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Bundle-ActivationPolicy: lazy Bundle-Localization: plugin diff --git a/com.ibm.wala.shrike/pom.xml b/com.ibm.wala.shrike/pom.xml new file mode 100644 index 000000000..ac1666afe --- /dev/null +++ b/com.ibm.wala.shrike/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.shrike + eclipse-plugin + diff --git a/com.ibm.wala.tests-feature/feature.xml b/com.ibm.wala.tests-feature/feature.xml index 6bf9f0603..0c21a45bc 100644 --- a/com.ibm.wala.tests-feature/feature.xml +++ b/com.ibm.wala.tests-feature/feature.xml @@ -1,8 +1,8 @@ @@ -19,7 +19,7 @@ install-size="0" version="0.0.0" unpack="false"/> - + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.tests-feature + eclipse-feature + diff --git a/com.ibm.wala.tests.ide-feature/feature.xml b/com.ibm.wala.tests.ide-feature/feature.xml index f8260d903..c9098793f 100644 --- a/com.ibm.wala.tests.ide-feature/feature.xml +++ b/com.ibm.wala.tests.ide-feature/feature.xml @@ -2,7 +2,7 @@ @@ -13,13 +13,6 @@ %license - - + + 4.0.0 + + WALA + com.ibm.wala + 0.0.1-SNAPSHOT + + com.ibm.wala + com.ibm.wala.tests.ide + 1.1.3-SNAPSHOT + eclipse-feature + diff --git a/com.ibm.wala.util/.gitignore b/com.ibm.wala.util/.gitignore new file mode 100644 index 000000000..1ad0b565d --- /dev/null +++ b/com.ibm.wala.util/.gitignore @@ -0,0 +1 @@ +/walaUtil.jar diff --git a/com.ibm.wala.util/META-INF/MANIFEST.MF b/com.ibm.wala.util/META-INF/MANIFEST.MF index 681dbf546..b3193cf24 100644 --- a/com.ibm.wala.util/META-INF/MANIFEST.MF +++ b/com.ibm.wala.util/META-INF/MANIFEST.MF @@ -1,8 +1,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 -Bundle-Name: Util +Bundle-Name: WALA Util Bundle-SymbolicName: com.ibm.wala.util -Bundle-Version: 2.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Export-Package: com.ibm.wala.dataflow.graph, com.ibm.wala.fixedpoint.impl, com.ibm.wala.fixpoint, @@ -25,3 +25,4 @@ Export-Package: com.ibm.wala.dataflow.graph, com.ibm.wala.viz Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ClassPath: walaUtil.jar +Bundle-Vendor: IBM diff --git a/com.ibm.wala.util/pom.xml b/com.ibm.wala.util/pom.xml new file mode 100644 index 000000000..9c5d38a00 --- /dev/null +++ b/com.ibm.wala.util/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.util + eclipse-plugin + diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..32616b48e --- /dev/null +++ b/pom.xml @@ -0,0 +1,147 @@ + + + 4.0.0 + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + pom + + + 0.17.0 + 1.3.4-SNAPSHOT + UTF-8 + b000 + scm:git:ssh://github.com:wala/WALA.git + + + + targets + com.ibm.wala-feature + com.ibm.wala.cast + com.ibm.wala.cast.java + com.ibm.wala.core + + com.ibm.wala.ide-feature + com.ibm.wala.ide + com.ibm.wala.ide.jdt + com.ibm.wala.shrike + com.ibm.wala.util + com.ibm.wala-repository + + com.ibm.wala.tests-feature + com.ibm.wala.core.tests + com.ibm.wala.core.testdata + com.ibm.wala.cast.test + com.ibm.wala.cast.java.test + com.ibm.wala.cast.java.test.data + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + + + com.ibm.wala.target + e42 + ${project-version} + + + + + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + 1.6 + 1.6 + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + attach-source + process-classes + + plugin-source + + + + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + 'v'yyyyMMdd-HHmm'-${build-alias}' + false + + true + + + + + org.eclipse.tycho.extras + tycho-sourceref-jgit + ${tycho-version} + + + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho-version} + + junit47 + ${tycho.test.jvmArgs} + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-director-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho-version} + + false + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho-version} + + + + diff --git a/targets/e42/e42.target b/targets/e42/e42.target new file mode 100644 index 000000000..f0093e439 --- /dev/null +++ b/targets/e42/e42.target @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/targets/e42/pom.xml b/targets/e42/pom.xml new file mode 100644 index 000000000..562fe70f0 --- /dev/null +++ b/targets/e42/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.ibm.wala.target + targets + 1.3.4-SNAPSHOT + + e42 + eclipse-target-definition + diff --git a/targets/pom.xml b/targets/pom.xml new file mode 100644 index 000000000..624e5e675 --- /dev/null +++ b/targets/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + + com.ibm.wala.target + targets + pom + + e42 + + From df7808368a2daebce482dcb4b9fae19303ff8b9c Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Fri, 19 Apr 2013 17:56:58 +0200 Subject: [PATCH 070/187] excluded test plugin execution for demo purpose --- pom.xml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 32616b48e..668676d73 100644 --- a/pom.xml +++ b/pom.xml @@ -29,22 +29,14 @@ com.ibm.wala.shrike com.ibm.wala.util com.ibm.wala-repository - + + --> From c0a8d621e2390609a5e2b1bdd834e3b27f018836 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Wed, 24 Apr 2013 21:59:43 -0500 Subject: [PATCH 071/187] small fix to manifest --- com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF index 3f7ea1bf0..b7f4ac5e0 100644 --- a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF @@ -13,7 +13,7 @@ Require-Bundle: org.eclipse.ui, com.ibm.wala.core;bundle-version="1.1.3", com.ibm.wala.ide;bundle-version="1.1.3", com.ibm.wala.shrike;bundle-version="1.3.1", - com.ibm.wala.util;bundle-version="2.0.0", + com.ibm.wala.util;bundle-version="1.3.1", org.eclipse.wst.jsdt.core;bundle-version="1.1.0", org.eclipse.wst.jsdt.ui;bundle-version="1.1.0", org.eclipse.core.resources;bundle-version="3.6.0", From edbdf989a99607316bf7cece6bc921429ec131f2 Mon Sep 17 00:00:00 2001 From: Cosmin Radoi Date: Wed, 24 Apr 2013 22:10:15 -0500 Subject: [PATCH 072/187] right classloader for call graph tests --- .../tests/callGraph/CallGraphTestUtil.java | 38 ++++++++++++++++++- .../wala/core/tests/slicer/SlicerTest.java | 2 +- 2 files changed, 37 insertions(+), 3 deletions(-) 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 ba51c9417..0a56eb540 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 @@ -10,7 +10,11 @@ *******************************************************************************/ package com.ibm.wala.core.tests.callGraph; +import java.io.BufferedReader; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; @@ -22,6 +26,7 @@ import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.config.AnalysisScopeReader; +import com.ibm.wala.util.config.FileOfClasses; import com.ibm.wala.util.io.FileProvider; import com.ibm.wala.util.perf.StopwatchGC; @@ -44,8 +49,37 @@ public class CallGraphTestUtil { */ private static final boolean CHECK_FOOTPRINT = false; - public static AnalysisScope makeJ2SEAnalysisScope(String scopeFile, String exclusionsFile) throws IOException { - AnalysisScope scope = AnalysisScopeReader.readJavaScope(scopeFile, (new FileProvider()).getFile(exclusionsFile), MY_CLASSLOADER); + public static AnalysisScope makeJ2SEAnalysisScope(String scopeFileName, String exclusionsFileName) throws IOException { + AnalysisScope scope = AnalysisScope.createJavaAnalysisScope(); + FileProvider fileProvider = new FileProvider(); + File exclusionsFile = fileProvider.getFile(exclusionsFileName, MY_CLASSLOADER); + BufferedReader r = null; + try { + InputStream scopeStream = fileProvider.getInputStreamFromClassLoader(scopeFileName, MY_CLASSLOADER); + + String line; + + // assume the scope file is UTF-8 encoded; ASCII files will also be + // handled properly + // TODO allow specifying encoding as a parameter? + r = new BufferedReader(new InputStreamReader(scopeStream, "UTF-8")); + while ((line = r.readLine()) != null) { + AnalysisScopeReader.processScopeDefLine(scope, MY_CLASSLOADER, line); + } + + if (exclusionsFile != null) { + scope.setExclusions(FileOfClasses.createFileOfClasses(exclusionsFile)); + } + + } finally { + if (r != null) { + try { + r.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } return scope; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java index 2e243fbeb..e5020bd42 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java @@ -71,7 +71,7 @@ public class SlicerTest { private static AnalysisScope findOrCreateAnalysisScope() throws IOException { if (cachedScope == null) { - cachedScope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, "Java60RegressionExclusions.txt"); + cachedScope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, "/Java60RegressionExclusions.txt"); } return cachedScope; } From 901c23d32ee79f3eb228bf76af79fe6131404532 Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Fri, 19 Apr 2013 16:23:42 +0200 Subject: [PATCH 073/187] [releng] added preliminary maven tycho build support --- pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pom.xml b/pom.xml index 668676d73..c31c25551 100644 --- a/pom.xml +++ b/pom.xml @@ -29,14 +29,6 @@ com.ibm.wala.shrike com.ibm.wala.util com.ibm.wala-repository - From 87c164e402508ea854c8dd6195f44e1049bf5f3b Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Mon, 29 Apr 2013 10:49:37 +0200 Subject: [PATCH 074/187] added js projects to tycho build --- com.ibm.wala.cast.java.polyglot/pom.xml | 46 +++-- .../META-INF/MANIFEST.MF | 2 +- .../pom.xml | 23 ++- com.ibm.wala.cast.js.rhino/.classpath | 1 - .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/build.properties | 3 +- com.ibm.wala.cast.js.rhino/pom.xml | 44 ++-- com.ibm.wala.cast.js/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js/build.properties | 6 +- com.ibm.wala.cast.js/pom.xml | 43 ++-- com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF | 16 +- com.ibm.wala.ide.jsdt/pom.xml | 4 +- pom.xml | 195 ++++++++++-------- targets/e42/e42.target | 42 +--- 14 files changed, 250 insertions(+), 179 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot/pom.xml b/com.ibm.wala.cast.java.polyglot/pom.xml index db2c5e47a..a513e29fc 100644 --- a/com.ibm.wala.cast.java.polyglot/pom.xml +++ b/com.ibm.wala.cast.java.polyglot/pom.xml @@ -1,14 +1,36 @@ - - 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala - com.ibm.wala.cast.java.polyglot - 1.0.0 - eclipse-plugin + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.java.polyglot + eclipse-plugin + + + + + maven-antrun-plugin + 1.7 + + + process-resources + + + + + + + + run + + + + + + diff --git a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF index a06f49ed6..8dd23bd8c 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Nu_validator Bundle-SymbolicName: com.ibm.wala.cast.js.html.nu_validator -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Export-Package: com.ibm.wala.cast.js.html.nu_validator Require-Bundle: com.ibm.wala.cast.js;bundle-version="1.0.0", com.ibm.wala.cast.js.rhino.test;bundle-version="1.0.0", diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml index 5d2add2d9..f306175e5 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/pom.xml +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -5,10 +5,27 @@ WALA com.ibm.wala - 0.0.1-SNAPSHOT + 1.3.4-SNAPSHOT - com.ibm.wala com.ibm.wala.cast.js.html.nu_validator - 1.0.0-SNAPSHOT eclipse-plugin + + + + com.googlecode.maven-download-plugin + maven-download-plugin + + + + wget + + + http://repo1.maven.org/maven2/nu/validator/htmlparser/htmlparser/1.4/htmlparser-1.4.jar + lib/ + + + + + + diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index 5ebf5d40c..f28b70835 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -1,7 +1,6 @@ - diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index 488dd5508..ae8907d72 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Rhino Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js.rhino -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.js.rhino.Activator Bundle-Vendor: IBM Require-Bundle: org.eclipse.core.runtime, diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index 6c83edd19..a3f6a00c6 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,4 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/js.jar + lib/rhino-1.7R4.jar +jars.extra.classpath = lib/rhino-1.7R4.jar diff --git a/com.ibm.wala.cast.js.rhino/pom.xml b/com.ibm.wala.cast.js.rhino/pom.xml index 3aa6b32f7..0d46b60c4 100644 --- a/com.ibm.wala.cast.js.rhino/pom.xml +++ b/com.ibm.wala.cast.js.rhino/pom.xml @@ -1,14 +1,34 @@ - - 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala - com.ibm.wala.cast.js.rhino - 1.0.0 - eclipse-plugin + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala.cast.js.rhino + eclipse-plugin + + + + com.googlecode.maven-download-plugin + maven-download-plugin + + + + wget + + + http://repo1.maven.org/maven2/org/mozilla/rhino/1.7R4/rhino-1.7R4.jar + lib/ + + + + + + + + diff --git a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF index cc9a2e2df..78b20d0d1 100644 --- a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JavaScript Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js;singleton:=true -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-ClassPath: bin/, ., lib/js.jar, diff --git a/com.ibm.wala.cast.js/build.properties b/com.ibm.wala.cast.js/build.properties index 3bd5a0ed6..d20ca4fe7 100644 --- a/com.ibm.wala.cast.js/build.properties +++ b/com.ibm.wala.cast.js/build.properties @@ -1,8 +1,6 @@ -output.js.jar = bin/ -bin.includes = lib/js.jar,\ - lib/xalan.jar,\ - .,\ +bin.includes = .,\ META-INF/,\ bin/ source.. = source/,\ dat/ +jars.extra.classpath = lib/jericho-html-3.2.jar diff --git a/com.ibm.wala.cast.js/pom.xml b/com.ibm.wala.cast.js/pom.xml index dbfd60b1d..d96098106 100644 --- a/com.ibm.wala.cast.js/pom.xml +++ b/com.ibm.wala.cast.js/pom.xml @@ -1,14 +1,33 @@ - - 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala - com.ibm.wala.cast.js - 1.0.0 - eclipse-plugin + + 4.0.0 + + WALA + com.ibm.wala + 1.3.4-SNAPSHOT + + com.ibm.wala + com.ibm.wala.cast.js + eclipse-plugin + + + + com.googlecode.maven-download-plugin + maven-download-plugin + + + + wget + + + http://repo1.maven.org/maven2/net/htmlparser/jericho/jericho-html/3.2/jericho-html-3.2.jar + lib/ + + + + + + diff --git a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF index b7f4ac5e0..5c2dfc465 100644 --- a/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF +++ b/com.ibm.wala.ide.jsdt/META-INF/MANIFEST.MF @@ -2,18 +2,18 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Jsdt Bundle-SymbolicName: com.ibm.wala.ide.jsdt -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.ide.jsdt.Activator Bundle-Vendor: IBM Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - com.ibm.wala.cast;bundle-version="1.0.0", - com.ibm.wala.cast.js;bundle-version="1.0.0", - com.ibm.wala.cast.js.rhino;bundle-version="1.0.0", - com.ibm.wala.core;bundle-version="1.1.3", - com.ibm.wala.ide;bundle-version="1.1.3", - com.ibm.wala.shrike;bundle-version="1.3.1", - com.ibm.wala.util;bundle-version="1.3.1", + com.ibm.wala.cast, + com.ibm.wala.cast.js, + com.ibm.wala.cast.js.rhino, + com.ibm.wala.core, + com.ibm.wala.ide, + com.ibm.wala.shrike, + com.ibm.wala.util, org.eclipse.wst.jsdt.core;bundle-version="1.1.0", org.eclipse.wst.jsdt.ui;bundle-version="1.1.0", org.eclipse.core.resources;bundle-version="3.6.0", diff --git a/com.ibm.wala.ide.jsdt/pom.xml b/com.ibm.wala.ide.jsdt/pom.xml index 50c95d066..baca929c2 100644 --- a/com.ibm.wala.ide.jsdt/pom.xml +++ b/com.ibm.wala.ide.jsdt/pom.xml @@ -5,10 +5,8 @@ WALA com.ibm.wala - 0.0.1-SNAPSHOT + 1.3.4-SNAPSHOT - com.ibm.wala com.ibm.wala.ide.jsdt - 1.0.0-SNAPSHOT eclipse-plugin diff --git a/pom.xml b/pom.xml index c31c25551..d36447bdd 100644 --- a/pom.xml +++ b/pom.xml @@ -7,27 +7,36 @@ WALA 1.3.4-SNAPSHOT pom - - - 0.17.0 + + 1.3.4-SNAPSHOT UTF-8 b000 - scm:git:ssh://github.com:wala/WALA.git + 0.17.0 + scm:git:ssh://github.com:wala/WALA.git - targets + targets + com.ibm.wala-feature + com.ibm.wala.core + com.ibm.wala.shrike + com.ibm.wala.util + com.ibm.wala.cast com.ibm.wala.cast.java - com.ibm.wala.core + + + com.ibm.wala.cast.js + com.ibm.wala.cast.js.rhino com.ibm.wala.ide-feature com.ibm.wala.ide com.ibm.wala.ide.jdt - com.ibm.wala.shrike - com.ibm.wala.util + com.ibm.wala.ide.jsdt + com.ibm.wala-repository @@ -35,13 +44,13 @@ org.eclipse.tycho tycho-maven-plugin - ${tycho-version} + ${tycho-version} true org.eclipse.tycho target-platform-configuration - ${tycho-version} + ${tycho-version} @@ -52,80 +61,98 @@ - - org.eclipse.tycho - tycho-compiler-plugin - ${tycho-version} - - 1.6 - 1.6 - - - - org.eclipse.tycho - tycho-source-plugin - ${tycho-version} - - - attach-source - process-classes - - plugin-source - - - - - - org.eclipse.tycho - tycho-packaging-plugin - ${tycho-version} - - 'v'yyyyMMdd-HHmm'-${build-alias}' - false - - true - - - - - org.eclipse.tycho.extras - tycho-sourceref-jgit - ${tycho-version} - - - - - org.eclipse.tycho - tycho-surefire-plugin - ${tycho-version} - - junit47 - ${tycho.test.jvmArgs} - - - - org.eclipse.tycho - tycho-p2-plugin - ${tycho-version} - - - org.eclipse.tycho - tycho-p2-director-plugin - ${tycho-version} - - - org.eclipse.tycho - tycho-p2-repository-plugin - ${tycho-version} - - false - - - - org.eclipse.tycho.extras - tycho-source-feature-plugin - ${tycho-version} - + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + 1.6 + 1.6 + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + attach-source + process-classes + + plugin-source + + + + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + 'v'yyyyMMdd-HHmm'-${build-alias}' + false + + true + + + + + org.eclipse.tycho.extras + tycho-sourceref-jgit + ${tycho-version} + + + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho-version} + + junit47 + ${tycho.test.jvmArgs} + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-director-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho-version} + + false + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho-version} + + + com.googlecode.maven-download-plugin + maven-download-plugin + 1.0.0 + + + + sonatype-public-repository + https://oss.sonatype.org/content/groups/public + + true + + + true + + + + diff --git a/targets/e42/e42.target b/targets/e42/e42.target index f0093e439..4871bfc32 100644 --- a/targets/e42/e42.target +++ b/targets/e42/e42.target @@ -1,44 +1,14 @@ - - - + - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - From c6e88b6d802d2b4cfdc9800b5049e4a6d3da7974 Mon Sep 17 00:00:00 2001 From: Marcel Bruch Date: Mon, 29 Apr 2013 13:18:36 +0200 Subject: [PATCH 075/187] fixed classpath, added jericho jar to classpath --- com.ibm.wala.cast.js/META-INF/MANIFEST.MF | 6 ++---- com.ibm.wala.cast.js/build.properties | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF index 78b20d0d1..2695f013a 100644 --- a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF @@ -3,10 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Name: JavaScript Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js;singleton:=true Bundle-Version: 1.3.4.qualifier -Bundle-ClassPath: bin/, - ., - lib/js.jar, - lib/xalan.jar +Bundle-ClassPath: ., + lib/jericho-html-3.2.jar Bundle-Activator: com.ibm.wala.cast.js.JavaScriptPlugin Bundle-Vendor: IBM Export-Package: com.ibm.wala.cast.js, diff --git a/com.ibm.wala.cast.js/build.properties b/com.ibm.wala.cast.js/build.properties index d20ca4fe7..dd5bf223d 100644 --- a/com.ibm.wala.cast.js/build.properties +++ b/com.ibm.wala.cast.js/build.properties @@ -1,6 +1,6 @@ bin.includes = .,\ META-INF/,\ - bin/ + lib/,\ + lib/jericho-html-3.2.jar source.. = source/,\ dat/ -jars.extra.classpath = lib/jericho-html-3.2.jar From 7f9bcf2b7f699c50d2d8701f76c06f2e08e872b5 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 09:39:28 -0700 Subject: [PATCH 076/187] fix launchers to use execution environment --- .../launchers/JDTJavaIRTests (Manu).launch | 1 + com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch index 33de77075..d9338e89e 100644 --- a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch +++ b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch @@ -25,6 +25,7 @@ + diff --git a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch index de7b442a2..573b9928b 100644 --- a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch +++ b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch @@ -25,7 +25,7 @@ - + From 1f254e9b743a7e265782b43816e8d2db2fedbedd Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 10:12:12 -0700 Subject: [PATCH 077/187] formatting, fix warnings --- .../cfa/ContainerContextSelector.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java index f84afe2c5..999f37dca 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java @@ -103,6 +103,7 @@ public class ContainerContextSelector implements ContextSelector { * com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, * com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] keys) { if (DEBUG) { System.err.println("ContainerContextSelector: getCalleeTarget " + callee); @@ -170,7 +171,8 @@ public class ContainerContextSelector implements ContextSelector { } /** - * return true iff m represents one of the well-known methods in java.lang.reflect.Arrays that do some sort of arraycopy + * return true iff m represents one of the well-known methods in + * java.lang.reflect.Arrays that do some sort of arraycopy */ private static boolean isArrayCopyMethod(MethodReference m) { if (m.getDeclaringClass().equals(Arrays)) { @@ -194,8 +196,9 @@ public class ContainerContextSelector implements ContextSelector { } /** - * This method walks recursively up the definition of a context C, to see if the chain of contexts that give rise to C a) includes - * the method M. or b) includes the method in which the receiver was allocated + * This method walks recursively up the definition of a context C, to see if + * the chain of contexts that give rise to C a) includes the method M. or b) + * includes the method in which the receiver was allocated * * @return the matching context if found, null otherwise */ @@ -218,10 +221,11 @@ public class ContainerContextSelector implements ContextSelector { } /** - * This method walks recursively up the definition of a context C, to see if the chain of contexts that give rise to C includes - * the method M. + * This method walks recursively up the definition of a context C, to see if + * the chain of contexts that give rise to C includes the method M. * - * If C is a ReceiverInstanceContext, Let N be the node that allocated C.instance. If N.method == M, return N. Else return + * If C is a ReceiverInstanceContext, Let N be the node that allocated + * C.instance. If N.method == M, return N. Else return * findRecursiveMatchingContext(M, N.context) Else return null */ public static CGNode findNodeRecursiveMatchingContext(IMethod m, Context c) { @@ -254,10 +258,11 @@ public class ContainerContextSelector implements ContextSelector { } /** - * This method walks recursively up the definition of a context C, to see if the chain of contexts that give rise to C includes - * the method M. + * This method walks recursively up the definition of a context C, to see if + * the chain of contexts that give rise to C includes the method M. * - * If C is a ReceiverInstanceContext, Let N be the node that allocated C.instance. If N.method == M, return N.context. Else return + * If C is a ReceiverInstanceContext, Let N be the node that allocated + * C.instance. If N.method == M, return N.context. Else return * findRecursiveMatchingContext(M, N.context) Else return null */ public static Context findRecursiveMatchingContext(IMethod M, Context C) { @@ -333,6 +338,7 @@ public class ContainerContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; From dd09d46f7967c0cfe59b34bc5d42154df8627ea8 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 16:08:59 -0700 Subject: [PATCH 078/187] Build fixes. 1. Fixed polyglot antrun build, at least to work on JDK 1.7 on Mac. 2. Made cast.js.rhino point to Rhino 1.7R3. --- com.ibm.wala.cast.java.polyglot/build.xml | 4 ++-- com.ibm.wala.cast.java.polyglot/pom.xml | 9 +++++++++ com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/build.properties | 4 ++-- com.ibm.wala.cast.js.rhino/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot/build.xml b/com.ibm.wala.cast.java.polyglot/build.xml index 8ca4a9620..2f43d0bd9 100644 --- a/com.ibm.wala.cast.java.polyglot/build.xml +++ b/com.ibm.wala.cast.java.polyglot/build.xml @@ -17,7 +17,7 @@ - + diff --git a/com.ibm.wala.cast.java.polyglot/pom.xml b/com.ibm.wala.cast.java.polyglot/pom.xml index a513e29fc..064e19544 100644 --- a/com.ibm.wala.cast.java.polyglot/pom.xml +++ b/com.ibm.wala.cast.java.polyglot/pom.xml @@ -30,6 +30,15 @@ + + + com.sun + tools + 1.7 + system + ${java.home}/../lib/tools.jar + + diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index ae8907d72..49870d685 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -35,5 +35,5 @@ Export-Package: com.ibm.wala.cast.js.translator, org.mozilla.javascript.xml, org.mozilla.javascript.xml.impl.xmlbeans, org.mozilla.javascript.xmlimpl -Bundle-ClassPath: lib/js.jar, +Bundle-ClassPath: lib/rhino-1.7R3.jar, . diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index a3f6a00c6..2986328a0 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,5 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/rhino-1.7R4.jar -jars.extra.classpath = lib/rhino-1.7R4.jar + lib/rhino-1.7R3.jar +jars.extra.classpath = lib/rhino-1.7R3.jar diff --git a/com.ibm.wala.cast.js.rhino/pom.xml b/com.ibm.wala.cast.js.rhino/pom.xml index 0d46b60c4..093baa374 100644 --- a/com.ibm.wala.cast.js.rhino/pom.xml +++ b/com.ibm.wala.cast.js.rhino/pom.xml @@ -21,7 +21,7 @@ wget - http://repo1.maven.org/maven2/org/mozilla/rhino/1.7R4/rhino-1.7R4.jar + http://repo1.maven.org/maven2/org/mozilla/rhino/1.7R3/rhino-1.7R3.jar lib/ diff --git a/pom.xml b/pom.xml index d36447bdd..7e940677e 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ com.ibm.wala.cast.java - + com.ibm.wala.cast.java.polyglot com.ibm.wala.cast.js com.ibm.wala.cast.js.rhino From 6c9cf1087099fb325d30f6e94e1e9920bd84cc05 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 16:48:19 -0700 Subject: [PATCH 079/187] flipped useLocalValsForLexicalVars to false for Java; causes tests to break --- .../ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 64c38481a..ce1bdf46e 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 @@ -91,7 +91,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } protected boolean useLocalValuesForLexicalVars() { - return true; + return false; } protected void doThrow(WalkContext context, int exception) { From 80c031d48bd007139e15b3f192a9e1b8297776bb Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 20:33:10 -0700 Subject: [PATCH 080/187] store results in file --- .../launchers/PolyglotJavaIRTests.launch | 1 + 1 file changed, 1 insertion(+) diff --git a/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch b/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch index 4d9837fd2..4bc5c966f 100644 --- a/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch +++ b/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch @@ -7,6 +7,7 @@ + From 516d1522b9ff2dc330a0fd0d26c5491590c503f6 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 20:33:18 -0700 Subject: [PATCH 081/187] indentation --- .../src/Scoping2.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/com.ibm.wala.cast.java.test.data/src/Scoping2.java b/com.ibm.wala.cast.java.test.data/src/Scoping2.java index 3084fa492..7e21ccdec 100644 --- a/com.ibm.wala.cast.java.test.data/src/Scoping2.java +++ b/com.ibm.wala.cast.java.test.data/src/Scoping2.java @@ -9,20 +9,20 @@ * IBM Corporation - initial API and implementation *****************************************************************************/ public class Scoping2 { - public static void main(String[] args) { - Scoping2 s2= new Scoping2(); - { - final int x= 5; - System.out.println(x); - (new Object() { - public void foo() { - System.out.println("x = " + x); - } - }).foo(); - } - { - double x= 3.14; - System.out.println(x); - } + public static void main(String[] args) { + Scoping2 s2 = new Scoping2(); + { + final int x = 5; + System.out.println(x); + (new Object() { + public void foo() { + System.out.println("x = " + x); + } + }).foo(); } + { + double x = 3.14; + System.out.println(x); + } + } } \ No newline at end of file From 5f18830c3f10a7ac1b30cfab48eb78cd680a36c8 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 20:34:08 -0700 Subject: [PATCH 082/187] changes to adjust for lack of null instruction at index 0 --- .../src/com/ibm/wala/cast/java/test/JavaIRTests.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java index c94ec2ae7..48a4f8596 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java @@ -220,7 +220,7 @@ public abstract class JavaIRTests extends IRTests { MethodReference mref = descriptorToMethodRef("Source#ArrayLiteral1#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); CGNode node = cg.getNodes(mref).iterator().next(); - SSAInstruction s = node.getIR().getInstructions()[3]; + SSAInstruction s = node.getIR().getInstructions()[2]; Assert.assertTrue("Did not find new array instruction.", s instanceof SSANewInstruction); Assert.assertTrue("", ((SSANewInstruction) s).getNewSite().getDeclaredType().isArrayType()); } @@ -245,7 +245,7 @@ public abstract class JavaIRTests extends IRTests { final SSAInstruction[] instructions = node.getIR().getInstructions(); // test 1 { - SSAInstruction s1 = instructions[3]; + SSAInstruction s1 = instructions[2]; if (s1 instanceof SSANewInstruction) { Assert.assertTrue("", ((SSANewInstruction) s1).getNewSite().getDeclaredType().isArrayType()); } else { @@ -254,7 +254,7 @@ public abstract class JavaIRTests extends IRTests { } // test 2 { - SSAInstruction s2 = instructions[4]; + SSAInstruction s2 = instructions[3]; if (s2 instanceof SSANewInstruction) { Assert.assertTrue("", ((SSANewInstruction) s2).getNewSite().getDeclaredType().isArrayType()); } else { @@ -264,7 +264,7 @@ public abstract class JavaIRTests extends IRTests { // test 3: the last 4 instructions are of the form y[i] = i+1; { final SymbolTable symbolTable = node.getIR().getSymbolTable(); - for (int i = 5; i <= 8; i++) { + for (int i = 4; i <= 7; i++) { Assert.assertTrue("Expected only array stores.", instructions[i] instanceof SSAArrayStoreInstruction); SSAArrayStoreInstruction as = (SSAArrayStoreInstruction) instructions[i]; @@ -302,7 +302,7 @@ public abstract class JavaIRTests extends IRTests { MethodReference mref = descriptorToMethodRef("Source#QualifiedStatic#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); CGNode node = cg.getNodes(mref).iterator().next(); - SSAInstruction s = node.getIR().getInstructions()[5]; + SSAInstruction s = node.getIR().getInstructions()[4]; Assert.assertTrue("Did not find a getstatic instruction.", s instanceof SSAGetInstruction && ((SSAGetInstruction) s).isStatic()); From dcc7cd206dcf1dc2731bcdce6fa5facba2a0fd5b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 29 Apr 2013 20:34:40 -0700 Subject: [PATCH 083/187] bug fix: allow each language to determine when a CGNode represents the "definer" method for a lexical access --- .../AstJavaSSAPropagationCallGraphBuilder.java | 9 +++++++++ .../callgraph/JSSSAPropagationCallGraphBuilder.java | 7 ++++++- .../callgraph/AstSSAPropagationCallGraphBuilder.java | 11 ++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java index 1c4963bca..30beb2b12 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java @@ -34,6 +34,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.SSANewInstruction; import com.ibm.wala.ssa.SymbolTable; +import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.intset.IntSetAction; @@ -279,4 +280,12 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall protected ConstraintVisitor makeVisitor(CGNode node) { return new AstJavaConstraintVisitor(this, node); } + + @Override + protected boolean sameMethod(CGNode opNode, String definingMethod) { + MethodReference reference = opNode.getMethod().getReference(); + String selector = reference.getSelector().toString(); + String containingClass = reference.getDeclaringClass().getName().toString(); + return definingMethod.equals(containingClass + "/" + selector); + } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index d81f28cf9..cc331aab0 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -1036,6 +1036,11 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } else { PointerKey EA = getPointerKeyForLocal(caller, instruction.getDef(1)); system.newConstraint(EA, assignOperator, EF); - } + } + } + + @Override + protected boolean sameMethod(CGNode opNode, String definingMethod) { + return definingMethod.equals(opNode.getMethod().getReference().getDeclaringClass().getName().toString()); } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index 06e56bfbf..15d366332 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -693,7 +693,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa private Set getLexicalDefiners(final CGNode opNode, final Pair definer) { if (definer == null) { return Collections.singleton(getBuilder().getCallGraph().getFakeRootNode()); - } else if (definer.snd.equals(opNode.getMethod().getReference().getDeclaringClass().getName().toString())) { + } else if (getBuilder().sameMethod(opNode, definer.snd)) { // lexical access to a variable declared in opNode itself assert AstTranslator.NEW_LEXICAL; return Collections.singleton(opNode); @@ -1361,4 +1361,13 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa }); } } + + /** + * + * Is definingMethod the same as the method represented by opNode? We need this since the names for + * methods in some languages don't map in the straightforward way to the CGNode + */ + protected abstract boolean sameMethod(final CGNode opNode, final String definingMethod); + + } From a9719a948d2c7c293c11c18398524a88bddaa675 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Apr 2013 09:31:35 -0700 Subject: [PATCH 084/187] change default target to jar --- com.ibm.wala.cast.java.test.data/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.java.test.data/build.xml b/com.ibm.wala.cast.java.test.data/build.xml index 13a0c0aa4..be15e70da 100644 --- a/com.ibm.wala.cast.java.test.data/build.xml +++ b/com.ibm.wala.cast.java.test.data/build.xml @@ -1,5 +1,5 @@ - + From ed88385d82d5aeb829f717d2375418651865365e Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Apr 2013 09:35:03 -0700 Subject: [PATCH 085/187] remove unused launcher --- .../launchers/JDTJavaIRTests (Manu).launch | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch diff --git a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch deleted file mode 100644 index d9338e89e..000000000 --- a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests (Manu).launch +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 4fd82ac2ef9c648889c930831f0a89690e0a8270 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Apr 2013 09:35:19 -0700 Subject: [PATCH 086/187] use more reasonable default heap size --- com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch | 2 +- com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch index 32641dcf8..4ac63cce4 100644 --- a/com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch +++ b/com.ibm.wala.ide.jdt.test/launchers/JDTJava15IRTests.launch @@ -30,7 +30,7 @@ - + diff --git a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch index 573b9928b..666a35fc7 100644 --- a/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch +++ b/com.ibm.wala.ide.jdt.test/launchers/JDTJavaIRTests.launch @@ -30,7 +30,7 @@ - + From 897268c7f95a36e6e0f7b5966b4522229b03c54e Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Apr 2013 12:09:55 -0700 Subject: [PATCH 087/187] fix comment --- .../src/com/ibm/wala/classLoader/SourceFileModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java index 7ea57b9c6..75ccd1103 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java @@ -19,7 +19,7 @@ import java.net.URL; import com.ibm.wala.util.io.FileSuffixes; /** - * A {@link Module} which is a wrapper around a .java file + * A {@link Module} which is a wrapper around a source file */ public class SourceFileModule extends FileModule implements Module, ModuleEntry, SourceModule { From 8d5af4aece6dd764c203128765dacb669b853d9f Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Apr 2013 12:10:06 -0700 Subject: [PATCH 088/187] fix warnings --- .../wala/cast/js/test/JSCallGraphBuilderUtil.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 3cd2a7a02..d8335a0f3 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -25,10 +25,12 @@ import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.loader.CAstAbstractLoader; +import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.SourceFileModule; import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.classLoader.SourceURLModule; @@ -79,7 +81,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J } public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { - JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(); + JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(); AnalysisScope scope = makeScriptScope(dir, name, loaders); @@ -92,12 +94,13 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + "/" + name); } assert script != null : "cannot find " + dir + " and " + name; + SourceFileModule sourceModule = makeSourceModule(script, dir, name); AnalysisScope scope; if (script.openConnection() instanceof JarURLConnection) { scope = makeScope(new URL[] { script }, loaders, JavaScriptLoader.JS); } else { - scope = makeScope(new SourceFileModule[] { makeSourceModule(script, dir, name) }, loaders, JavaScriptLoader.JS); + scope = makeScope(new SourceFileModule[] { sourceModule }, loaders, JavaScriptLoader.JS); } return scope; @@ -119,7 +122,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J return CG; } - public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, + public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); @@ -134,7 +137,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static JSCFABuilder makeHTMLCGBuilder(URL url, CGBuilderType builderType) throws IOException, WalaException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; - IRFactory irFactory = AstIRFactory.makeDefaultFactory(); + IRFactory irFactory = AstIRFactory.makeDefaultFactory(); JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; @@ -163,12 +166,12 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J return CG; } - public static JSCFABuilder makeCGBuilder(JavaScriptLoaderFactory loaders, SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, WalaException { + public static JSCFABuilder makeCGBuilder(JavaScriptLoaderFactory loaders, SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, WalaException { AnalysisScope scope = makeScope(scripts, loaders, JavaScriptLoader.JS); return makeCG(loaders, scope, builderType, irFactory); } - protected static JSCFABuilder makeCG(JavaScriptLoaderFactory loaders, AnalysisScope scope, CGBuilderType builderType, IRFactory irFactory) throws IOException, WalaException { + protected static JSCFABuilder makeCG(JavaScriptLoaderFactory loaders, AnalysisScope scope, CGBuilderType builderType, IRFactory irFactory) throws IOException, WalaException { try { IClassHierarchy cha = makeHierarchy(scope, loaders); com.ibm.wala.cast.js.util.Util.checkForFrontEndErrors(cha); From fd6a02422e01d3e94f19d3fe091c589c1e4046d3 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 30 Apr 2013 12:17:05 -0700 Subject: [PATCH 089/187] undo one change from previous commit --- .../com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index d8335a0f3..43337a48c 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -94,13 +94,11 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + "/" + name); } assert script != null : "cannot find " + dir + " and " + name; - SourceFileModule sourceModule = makeSourceModule(script, dir, name); - AnalysisScope scope; if (script.openConnection() instanceof JarURLConnection) { scope = makeScope(new URL[] { script }, loaders, JavaScriptLoader.JS); } else { - scope = makeScope(new SourceFileModule[] { sourceModule }, loaders, JavaScriptLoader.JS); + scope = makeScope(new SourceFileModule[] { makeSourceModule(script, dir, name) }, loaders, JavaScriptLoader.JS); } return scope; From d149ca2c73a95bbb31d4e035905079abc4fe78a4 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 2 May 2013 10:55:45 -0700 Subject: [PATCH 090/187] Revert fix for tests; we need to figure out the right fix here. This reverts commit cab3c6c0c40890b69c497bdb958573c64de43267. --- .../tests/callGraph/CallGraphTestUtil.java | 38 +------------------ .../wala/core/tests/slicer/SlicerTest.java | 2 +- 2 files changed, 3 insertions(+), 37 deletions(-) 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 0a56eb540..ba51c9417 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 @@ -10,11 +10,7 @@ *******************************************************************************/ package com.ibm.wala.core.tests.callGraph; -import java.io.BufferedReader; -import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; @@ -26,7 +22,6 @@ import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.config.AnalysisScopeReader; -import com.ibm.wala.util.config.FileOfClasses; import com.ibm.wala.util.io.FileProvider; import com.ibm.wala.util.perf.StopwatchGC; @@ -49,37 +44,8 @@ public class CallGraphTestUtil { */ private static final boolean CHECK_FOOTPRINT = false; - public static AnalysisScope makeJ2SEAnalysisScope(String scopeFileName, String exclusionsFileName) throws IOException { - AnalysisScope scope = AnalysisScope.createJavaAnalysisScope(); - FileProvider fileProvider = new FileProvider(); - File exclusionsFile = fileProvider.getFile(exclusionsFileName, MY_CLASSLOADER); - BufferedReader r = null; - try { - InputStream scopeStream = fileProvider.getInputStreamFromClassLoader(scopeFileName, MY_CLASSLOADER); - - String line; - - // assume the scope file is UTF-8 encoded; ASCII files will also be - // handled properly - // TODO allow specifying encoding as a parameter? - r = new BufferedReader(new InputStreamReader(scopeStream, "UTF-8")); - while ((line = r.readLine()) != null) { - AnalysisScopeReader.processScopeDefLine(scope, MY_CLASSLOADER, line); - } - - if (exclusionsFile != null) { - scope.setExclusions(FileOfClasses.createFileOfClasses(exclusionsFile)); - } - - } finally { - if (r != null) { - try { - r.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + public static AnalysisScope makeJ2SEAnalysisScope(String scopeFile, String exclusionsFile) throws IOException { + AnalysisScope scope = AnalysisScopeReader.readJavaScope(scopeFile, (new FileProvider()).getFile(exclusionsFile), MY_CLASSLOADER); return scope; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java index e5020bd42..2e243fbeb 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java @@ -71,7 +71,7 @@ public class SlicerTest { private static AnalysisScope findOrCreateAnalysisScope() throws IOException { if (cachedScope == null) { - cachedScope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, "/Java60RegressionExclusions.txt"); + cachedScope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, "Java60RegressionExclusions.txt"); } return cachedScope; } From eac23e97a97159de517d1ff9a12d514c70e9c7ce Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 2 May 2013 11:43:49 -0700 Subject: [PATCH 091/187] enable reading scope files from jars --- .../com/ibm/wala/util/config/AnalysisScopeReader.java | 7 +++---- .../src/com/ibm/wala/util/io/FileProvider.java | 10 +++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java b/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java index 1de2a1cb4..f182b5c4f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/config/AnalysisScopeReader.java @@ -12,8 +12,8 @@ package com.ibm.wala.util.config; import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.util.jar.JarFile; @@ -56,13 +56,12 @@ public class AnalysisScopeReader { FileProvider fp) throws IOException { BufferedReader r = null; try { - File scopeFile = fp.getFile(scopeFileName, javaLoader); - assert scopeFile.exists(); + InputStream scopeFileInputStream = fp.getInputStreamFromClassLoader(scopeFileName, javaLoader); String line; // assume the scope file is UTF-8 encoded; ASCII files will also be handled properly // TODO allow specifying encoding as a parameter? - r = new BufferedReader(new InputStreamReader(new FileInputStream(scopeFile), "UTF-8")); + r = new BufferedReader(new InputStreamReader(scopeFileInputStream, "UTF-8")); while ((line = r.readLine()) != null) { processScopeDefLine(scope, javaLoader, line); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java index 2aa3dd35b..7573c9265 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java @@ -11,6 +11,7 @@ package com.ibm.wala.util.io;// 5724-D15 import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -109,7 +110,8 @@ public class FileProvider { } /** - * @throws FileNotFoundException + * First tries to read fileName from the ClassLoader loader. If unsuccessful, attempts to read file from + * the file system. If that fails, throws a {@link FileNotFoundException} */ public InputStream getInputStreamFromClassLoader(String fileName, ClassLoader loader) throws FileNotFoundException { if (loader == null) { @@ -120,6 +122,12 @@ public class FileProvider { } InputStream is = loader.getResourceAsStream(fileName); if (is == null) { + // couldn't load it from the class loader. try again from the + // system classloader + File f = new File(fileName); + if (f.exists()) { + return new FileInputStream(f); + } throw new FileNotFoundException(fileName); } return is; From 30686135da9b324240ee8b6fb41715acae6628ce Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 7 May 2013 14:43:49 -0700 Subject: [PATCH 092/187] Fix for bug with pi nodes reported by Andreas Sewe We weren't handling the case where the val of the pi instruction had an implicit points-to set. --- .../src/pi/PiNodeCallGraphTestCase.java | 14 ++++++++ .../tests/callGraph/PiNodeCallGraphTest.java | 17 +++++++--- .../SSAPropagationCallGraphBuilder.java | 32 +++++++++++++------ 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/com.ibm.wala.core.testdata/src/pi/PiNodeCallGraphTestCase.java b/com.ibm.wala.core.testdata/src/pi/PiNodeCallGraphTestCase.java index c95ec7b25..3b946c10e 100644 --- a/com.ibm.wala.core.testdata/src/pi/PiNodeCallGraphTestCase.java +++ b/com.ibm.wala.core.testdata/src/pi/PiNodeCallGraphTestCase.java @@ -24,14 +24,17 @@ class PiNodeCallGraphTestCase { static class This implements Whatever { + @Override public void unary1() { unary2(); } + @Override public void unary2() { } + @Override public void binary(Whatever arg) { this.unary1(); arg.unary2(); @@ -41,14 +44,17 @@ class PiNodeCallGraphTestCase { static class That implements Whatever { + @Override public void unary1() { } + @Override public void unary2() { unary1(); } + @Override public void binary(Whatever arg) { this.unary1(); arg.unary2(); @@ -67,6 +73,14 @@ class PiNodeCallGraphTestCase { x.binary(z); else y.binary(z); + localCast(); + } + + private static void localCast() { + Whatever y = new That(); + if (y instanceof This) { + y.binary(y); + } } } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java index a42408a96..ef0309ebe 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.util.Iterator; import java.util.Set; +import org.junit.Assert; import org.junit.Test; import com.ibm.wala.classLoader.CallSiteReference; @@ -37,6 +38,7 @@ import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.collections.Iterator2List; import com.ibm.wala.util.strings.Atom; /** @@ -83,7 +85,7 @@ public class PiNodeCallGraphTest extends WalaTestCase { return CallGraphTestUtil.buildZeroCFA(options, new AnalysisCache(), cha, scope, false); } - private void checkCallAssertions(CallGraph cg, int desiredNumberOfTargets, int desiredNumberOfCalls) { + private void checkCallAssertions(CallGraph cg, int desiredNumberOfTargets, int desiredNumberOfCalls, int numLocalCastCallees) { int numberOfCalls = 0; Set callerNodes = HashSetFactory.make(); @@ -93,7 +95,7 @@ public class PiNodeCallGraphTest extends WalaTestCase { for (CGNode n : callerNodes) { for (Iterator sites = n.iterateCallSites(); sites.hasNext();) { - CallSiteReference csRef = (CallSiteReference) sites.next(); + CallSiteReference csRef = sites.next(); if (csRef.getDeclaredTarget().equals(unary2Ref)) { numberOfCalls++; assert cg.getNumberOfTargets(n, csRef) == desiredNumberOfTargets; @@ -101,15 +103,20 @@ public class PiNodeCallGraphTest extends WalaTestCase { } } + assert numberOfCalls == desiredNumberOfCalls; + + CGNode localCastNode = cg.getNodes(MethodReference.findOrCreate(TypeReference.findOrCreate(loader, TestConstants.PI_TEST_MAIN), "localCast", "()V")).iterator().next(); + int actualLocalCastCallees = cg.getSuccNodeCount(localCastNode); + Assert.assertEquals(numLocalCastCallees, actualLocalCastCallees); } @Test public void testNoPiNodes() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { - checkCallAssertions(doGraph(false), 2, 2); + checkCallAssertions(doGraph(false), 2, 2, 2); } @Test public void testPiNodes() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { - checkCallAssertions(doGraph(true), 1, 2); - } + checkCallAssertions(doGraph(true), 1, 2, 1); + } } \ No newline at end of file diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java index c079d7296..7c89bfb4f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java @@ -1262,6 +1262,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap system.recordImplicitPointsToSet(dst); } else { ControlFlowGraph cfg = ir.getControlFlowGraph(); + int val = instruction.getVal(); if (com.ibm.wala.cfg.Util.endsWithConditionalBranch(cfg, getBasicBlock()) && cfg.getSuccNodeCount(getBasicBlock()) == 2) { SSAConditionalBranchInstruction cond = (SSAConditionalBranchInstruction) com.ibm.wala.cfg.Util.getLastInstruction(cfg, getBasicBlock()); @@ -1275,31 +1276,42 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap IClass cls = getClassHierarchy().lookupClass(type); if (cls == null) { PointerKey dst = getPointerKeyForLocal(instruction.getDef()); - addPiAssignment(dst, instruction.getVal()); + addPiAssignment(dst, val); } else { PointerKey dst = getFilteredPointerKeyForLocal(instruction.getDef(), new FilteredPointerKey.SingleClassFilter(cls)); - PointerKey src = getPointerKeyForLocal(instruction.getVal()); - if ((target == com.ibm.wala.cfg.Util.getTakenSuccessor(cfg, getBasicBlock()) && direction == 1) - || (target == com.ibm.wala.cfg.Util.getNotTakenSuccessor(cfg, getBasicBlock()) && direction == -1)) { - system.newConstraint(dst, getBuilder().filterOperator, src); + // if true, only allow objects assignable to cls. otherwise, only allow objects + // *not* assignable to cls + boolean useFilter = (target == com.ibm.wala.cfg.Util.getTakenSuccessor(cfg, getBasicBlock()) && direction == 1) + || (target == com.ibm.wala.cfg.Util.getNotTakenSuccessor(cfg, getBasicBlock()) && direction == -1); + PointerKey src = getPointerKeyForLocal(val); + if (contentsAreInvariant(symbolTable, du, val)) { + system.recordImplicitPointsToSet(src); + InstanceKey[] ik = getInvariantContents(val); + for (int j = 0; j < ik.length; j++) { + boolean assignable = getClassHierarchy().isAssignableFrom(cls, ik[j].getConcreteType()); + if ((assignable && useFilter) || (!assignable && !useFilter)) { + system.newConstraint(dst, ik[j]); + } + } } else { - system.newConstraint(dst, getBuilder().inverseFilterOperator, src); + FilterOperator op = useFilter ? getBuilder().filterOperator : getBuilder().inverseFilterOperator; + system.newConstraint(dst, op, src); } } } - } else if ((dir = nullConstantTest(cond, instruction.getVal())) != 0) { + } else if ((dir = nullConstantTest(cond, val)) != 0) { if ((target == com.ibm.wala.cfg.Util.getTakenSuccessor(cfg, getBasicBlock()) && dir == -1) || (target == com.ibm.wala.cfg.Util.getNotTakenSuccessor(cfg, getBasicBlock()) && dir == 1)) { PointerKey dst = getPointerKeyForLocal(instruction.getDef()); - addPiAssignment(dst, instruction.getVal()); + addPiAssignment(dst, val); } } else { PointerKey dst = getPointerKeyForLocal(instruction.getDef()); - addPiAssignment(dst, instruction.getVal()); + addPiAssignment(dst, val); } } else { PointerKey dst = getPointerKeyForLocal(instruction.getDef()); - addPiAssignment(dst, instruction.getVal()); + addPiAssignment(dst, val); } } } From d0b5e8ddd2139caa0c9ed6eced1664bfea59abb2 Mon Sep 17 00:00:00 2001 From: Andreas Sewe Date: Tue, 7 May 2013 18:27:13 +0200 Subject: [PATCH 093/187] Made TypeName.findOrCreate thread-safe --- com.ibm.wala.core/src/com/ibm/wala/types/TypeName.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/types/TypeName.java b/com.ibm.wala.core/src/com/ibm/wala/types/TypeName.java index 71550805c..2ed5a655d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/types/TypeName.java +++ b/com.ibm.wala.core/src/com/ibm/wala/types/TypeName.java @@ -43,7 +43,7 @@ public final class TypeName implements Serializable { */ private final static Map map = HashMapFactory.make(); - private static TypeName findOrCreate(TypeNameKey t) { + private static synchronized TypeName findOrCreate(TypeNameKey t) { TypeName result = map.get(t); if (result == null) { result = new TypeName(t); From bc2594237b919678941b62038e7d16829e09b67f Mon Sep 17 00:00:00 2001 From: Andreas Sewe Date: Tue, 7 May 2013 11:21:37 +0200 Subject: [PATCH 094/187] Made BytecodeClass.computeMethodMap thread-safe --- .../ibm/wala/classLoader/BytecodeClass.java | 48 +++++++++---------- .../com/ibm/wala/classLoader/JVMClass.java | 12 ++--- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index 0f943dc5a..dea566146 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -78,7 +78,7 @@ public abstract class BytecodeClass implements IClass { * * TODO: get rid of this for classes (though keep it for interfaces) instead ... use a VMT. */ - protected Map methodMap; + protected volatile Map methodMap; /** * A mapping from Selector to IMethod used to cache method lookups from superclasses @@ -385,13 +385,11 @@ public abstract class BytecodeClass implements IClass { * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ public Collection getDeclaredMethods() { - if (methodMap == null) { - try { - computeMethodMap(); - } catch (InvalidClassFileException e) { - e.printStackTrace(); - Assertions.UNREACHABLE(); - } + try { + computeMethodMap(); + } catch (InvalidClassFileException e) { + e.printStackTrace(); + Assertions.UNREACHABLE(); } return Collections.unmodifiableCollection(methodMap.values()); } @@ -400,13 +398,11 @@ public abstract class BytecodeClass implements IClass { * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.types.Selector) */ public IMethod getMethod(Selector selector) { - if (methodMap == null) { - try { - computeMethodMap(); - } catch (InvalidClassFileException e1) { - e1.printStackTrace(); - Assertions.UNREACHABLE(); - } + try { + computeMethodMap(); + } catch (InvalidClassFileException e1) { + e1.printStackTrace(); + Assertions.UNREACHABLE(); } // my methods + cached parent stuff @@ -555,15 +551,19 @@ public abstract class BytecodeClass implements IClass { */ protected void computeMethodMap() throws InvalidClassFileException { if (methodMap == null) { - IMethod[] methods = computeDeclaredMethods(); - if (methods.length > 5) { - methodMap = HashMapFactory.make(methods.length); - } else { - methodMap = new SmallMap(); - } - for (int i = 0; i < methods.length; i++) { - IMethod m = methods[i]; - methodMap.put(m.getReference().getSelector(), m); + synchronized (this) { + if (methodMap == null) { + IMethod[] methods = computeDeclaredMethods(); + if (methods.length > 5) { + methodMap = HashMapFactory.make(methods.length); + } else { + methodMap = new SmallMap(); + } + for (int i = 0; i < methods.length; i++) { + IMethod m = methods[i]; + methodMap.put(m.getReference().getSelector(), m); + } + } } } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java index 35ed44c38..f21516710 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java @@ -64,13 +64,11 @@ public abstract class JVMClass extends BytecodeClass * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ public IMethod getClassInitializer() { - if (methodMap == null) { - try { - computeMethodMap(); - } catch (InvalidClassFileException e) { - e.printStackTrace(); - Assertions.UNREACHABLE(); - } + try { + computeMethodMap(); + } catch (InvalidClassFileException e) { + e.printStackTrace(); + Assertions.UNREACHABLE(); } return methodMap.get(MethodReference.clinitSelector); } From 89e90cd44ee36c2ad751e1a685404a6f3b9a360d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 7 May 2013 14:59:12 -0700 Subject: [PATCH 095/187] rename computeMethodMap() to computeMethodMapIfNeeded() --- .../src/com/ibm/wala/classLoader/BytecodeClass.java | 6 +++--- .../src/com/ibm/wala/classLoader/JVMClass.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index dea566146..7a9e6bb9a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -386,7 +386,7 @@ public abstract class BytecodeClass implements IClass { */ public Collection getDeclaredMethods() { try { - computeMethodMap(); + computeMethodMapIfNeeded(); } catch (InvalidClassFileException e) { e.printStackTrace(); Assertions.UNREACHABLE(); @@ -399,7 +399,7 @@ public abstract class BytecodeClass implements IClass { */ public IMethod getMethod(Selector selector) { try { - computeMethodMap(); + computeMethodMapIfNeeded(); } catch (InvalidClassFileException e1) { e1.printStackTrace(); Assertions.UNREACHABLE(); @@ -549,7 +549,7 @@ public abstract class BytecodeClass implements IClass { /** * set up the methodMap mapping */ - protected void computeMethodMap() throws InvalidClassFileException { + protected void computeMethodMapIfNeeded() throws InvalidClassFileException { if (methodMap == null) { synchronized (this) { if (methodMap == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java index f21516710..a3ab48f99 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java @@ -65,7 +65,7 @@ public abstract class JVMClass extends BytecodeClass */ public IMethod getClassInitializer() { try { - computeMethodMap(); + computeMethodMapIfNeeded(); } catch (InvalidClassFileException e) { e.printStackTrace(); Assertions.UNREACHABLE(); From 16a0e02fa033991f262d19ec3d015f77794828fc Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 10 May 2013 20:55:13 -0700 Subject: [PATCH 096/187] add utility methods for creating n-CFA call graph builders --- .../examples/drivers/ScopeFileCallGraph.java | 7 ++- .../com/ibm/wala/ipa/callgraph/impl/Util.java | 45 +++++++++++++++++++ .../propagation/cfa/nCFABuilder.java | 3 +- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java index 224f2e0e7..bc9a8bce6 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/ScopeFileCallGraph.java @@ -58,6 +58,7 @@ public class ScopeFileCallGraph { */ public static void main(String[] args) throws IOException, ClassHierarchyException, IllegalArgumentException, CallGraphBuilderCancelException { + long start = System.currentTimeMillis(); Properties p = CommandLine.parse(args); String scopeFile = p.getProperty("scopeFile"); String entryClass = p.getProperty("entryClass"); @@ -76,13 +77,17 @@ public class ScopeFileCallGraph { Iterable entrypoints = entryClass != null ? makePublicEntrypoints(scope, cha, entryClass) : Util.makeMainEntrypoints(scope, cha, mainClass); options.setEntrypoints(entrypoints); // you can dial down reflection handling if you like - // options.setReflectionOptions(ReflectionOptions.NONE); +// options.setReflectionOptions(ReflectionOptions.NONE); AnalysisCache cache = new AnalysisCache(); // other builders can be constructed with different Util methods CallGraphBuilder builder = Util.makeZeroOneContainerCFABuilder(options, cache, cha, scope); +// CallGraphBuilder builder = Util.makeNCFABuilder(2, options, cache, cha, scope); +// CallGraphBuilder builder = Util.makeVanillaNCFABuilder(2, options, cache, cha, scope); System.out.println("building call graph..."); CallGraph cg = builder.makeCallGraph(options, null); + long end = System.currentTimeMillis(); System.out.println("done"); + System.out.println("took " + (end-start) + "ms"); System.out.println(CallGraphStats.getStats(cg)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java index 610b5d471..cc717bcef 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java @@ -30,6 +30,7 @@ import com.ibm.wala.ipa.callgraph.propagation.SSAPropagationCallGraphBuilder; import com.ibm.wala.ipa.callgraph.propagation.cfa.ZeroXCFABuilder; import com.ibm.wala.ipa.callgraph.propagation.cfa.ZeroXContainerCFABuilder; import com.ibm.wala.ipa.callgraph.propagation.cfa.ZeroXInstanceKeys; +import com.ibm.wala.ipa.callgraph.propagation.cfa.nCFABuilder; import com.ibm.wala.ipa.callgraph.propagation.rta.BasicRTABuilder; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ipa.summaries.BypassClassTargetSelector; @@ -429,6 +430,50 @@ public class Util { return new ZeroXContainerCFABuilder(cha, options, cache, appSelector, appInterpreter, ZeroXInstanceKeys.ALLOCATIONS | ZeroXInstanceKeys.SMUSH_MANY | ZeroXInstanceKeys.SMUSH_PRIMITIVE_HOLDERS | ZeroXInstanceKeys.SMUSH_STRINGS | ZeroXInstanceKeys.SMUSH_THROWABLES); } + + /** + * make a {@link CallGraphBuilder} that uses call-string context sensitivity, + * with call-string length limited to n, and a context-sensitive + * allocation-site-based heap abstraction. + */ + public static SSAPropagationCallGraphBuilder makeNCFABuilder(int n, AnalysisOptions options, AnalysisCache cache, + IClassHierarchy cha, AnalysisScope scope) { + if (options == null) { + throw new IllegalArgumentException("options is null"); + } + addDefaultSelectors(options, cha); + addDefaultBypassLogic(options, scope, Util.class.getClassLoader(), cha); + ContextSelector appSelector = null; + SSAContextInterpreter appInterpreter = null; + SSAPropagationCallGraphBuilder result = new nCFABuilder(n, cha, options, cache, appSelector, appInterpreter); + // nCFABuilder uses type-based heap abstraction by default, but we want allocation sites + result.setInstanceKeys(new ZeroXInstanceKeys(options, cha, result.getContextInterpreter(), ZeroXInstanceKeys.ALLOCATIONS + | ZeroXInstanceKeys.SMUSH_MANY | ZeroXInstanceKeys.SMUSH_PRIMITIVE_HOLDERS | ZeroXInstanceKeys.SMUSH_STRINGS + | ZeroXInstanceKeys.SMUSH_THROWABLES)); + return result; + } + + /** + * make a {@link CallGraphBuilder} that uses call-string context sensitivity, + * with call-string length limited to n, and a context-sensitive + * allocation-site-based heap abstraction. Standard optimizations in the heap + * abstraction like smushing of strings are disabled. + */ + public static SSAPropagationCallGraphBuilder makeVanillaNCFABuilder(int n, AnalysisOptions options, AnalysisCache cache, + IClassHierarchy cha, AnalysisScope scope) { + if (options == null) { + throw new IllegalArgumentException("options is null"); + } + addDefaultSelectors(options, cha); + addDefaultBypassLogic(options, scope, Util.class.getClassLoader(), cha); + ContextSelector appSelector = null; + SSAContextInterpreter appInterpreter = null; + SSAPropagationCallGraphBuilder result = new nCFABuilder(n, cha, options, cache, appSelector, appInterpreter); + // nCFABuilder uses type-based heap abstraction by default, but we want allocation sites + result.setInstanceKeys(new ZeroXInstanceKeys(options, cha, result.getContextInterpreter(), ZeroXInstanceKeys.ALLOCATIONS | ZeroXInstanceKeys.CONSTANT_SPECIFIC)); + return result; + } + /** * @param options options that govern call graph construction diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/nCFABuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/nCFABuilder.java index d429f4fbe..b739040d0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/nCFABuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/nCFABuilder.java @@ -23,7 +23,8 @@ import com.ibm.wala.ipa.callgraph.propagation.SSAPropagationCallGraphBuilder; import com.ibm.wala.ipa.cha.IClassHierarchy; /** - * nCFA Call graph builder + * nCFA Call graph builder. Note that by default, this builder uses a + * {@link ClassBasedInstanceKeys} heap model. */ public class nCFABuilder extends SSAPropagationCallGraphBuilder { From 0b557ac68542674d2a00c45998197d8f4fddc4ae Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 13 May 2013 13:46:11 -0700 Subject: [PATCH 097/187] temporary patch to keep build.xml file working --- com.ibm.wala.cast.js.rhino/build.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino/build.xml b/com.ibm.wala.cast.js.rhino/build.xml index 66a10dedf..dedbfe054 100644 --- a/com.ibm.wala.cast.js.rhino/build.xml +++ b/com.ibm.wala.cast.js.rhino/build.xml @@ -33,7 +33,7 @@ - + @@ -41,7 +41,7 @@ - + From 9d18e9486c83764a457d8226317e33eeb5cb8007 Mon Sep 17 00:00:00 2001 From: sjfink Date: Tue, 14 May 2013 12:18:10 -0700 Subject: [PATCH 098/187] fix typo in print statement --- .../com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java index 51d4faa2a..d5fe1dd4d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java @@ -212,7 +212,7 @@ public abstract class AbstractFixedPointSolver> implement @Override public String toString() { - StringBuffer result = new StringBuffer("Fixed Point Sytem:\n"); + StringBuffer result = new StringBuffer("Fixed Point System:\n"); for (Iterator it = getStatements(); it.hasNext();) { result.append(it.next()).append("\n"); } From c0e3cb9831bc20d5d2e5a54dfbd86a8810c8221c Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 14 May 2013 14:17:26 -0700 Subject: [PATCH 099/187] fix for handling of static methods in ContainerContextSelector --- .../src/demandpa/TestArraysCopyOf.java | 27 +++++++++++ .../core/tests/callGraph/CallGraphTest.java | 23 ++++++++++ .../cfa/ContainerContextSelector.java | 46 +++++++++++-------- 3 files changed, 76 insertions(+), 20 deletions(-) create mode 100644 com.ibm.wala.core.testdata/src/demandpa/TestArraysCopyOf.java diff --git a/com.ibm.wala.core.testdata/src/demandpa/TestArraysCopyOf.java b/com.ibm.wala.core.testdata/src/demandpa/TestArraysCopyOf.java new file mode 100644 index 000000000..71af05ac5 --- /dev/null +++ b/com.ibm.wala.core.testdata/src/demandpa/TestArraysCopyOf.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2008 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 demandpa; + +import java.util.Arrays; + +public class TestArraysCopyOf { + + public static void main(String[] args) { + Object[] o1 = new Object[1]; + Object[] o2 = new Object[1]; + o1[0] = new A(); + o2[0] = new B(); + Object[] o3 = Arrays.copyOf(o1, 1, Object[].class); + Arrays.copyOf(o2, 1, Object[].class); + Object x = o3[0]; + DemandPATestUtil.testThisVar(x); + } +} diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java index 0970dbe23..04990e585 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java @@ -20,6 +20,7 @@ import org.junit.Test; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.core.tests.demandpa.AbstractPtrTest; import com.ibm.wala.core.tests.util.TestConstants; import com.ibm.wala.core.tests.util.WalaTestCase; import com.ibm.wala.ipa.callgraph.AnalysisCache; @@ -27,11 +28,15 @@ import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.callgraph.CallGraphBuilder; import com.ibm.wala.ipa.callgraph.CallGraphStats; import com.ibm.wala.ipa.callgraph.Entrypoint; import com.ibm.wala.ipa.callgraph.impl.AllApplicationEntrypoints; import com.ibm.wala.ipa.callgraph.impl.DefaultEntrypoint; import com.ibm.wala.ipa.callgraph.impl.Util; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.callgraph.propagation.SSAPropagationCallGraphBuilder; import com.ibm.wala.ipa.cfg.BasicBlockInContext; import com.ibm.wala.ipa.cfg.InterproceduralCFG; @@ -48,6 +53,7 @@ import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.graph.Graph; import com.ibm.wala.util.graph.GraphIntegrity; import com.ibm.wala.util.graph.GraphIntegrity.UnsoundGraphException; +import com.ibm.wala.util.intset.OrdinalSet; import com.ibm.wala.util.strings.Atom; import com.ibm.wala.util.warnings.Warnings; @@ -235,6 +241,23 @@ public class CallGraphTest extends WalaTestCase { CallGraphTestUtil.buildZeroCFA(options, new AnalysisCache(), cha, scope, false); } + @Test + public void testZeroOneContainerCopyOf() throws IOException, ClassHierarchyException, IllegalArgumentException, CancelException { + AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, + CallGraphTestUtil.REGRESSION_EXCLUSIONS); + ClassHierarchy cha = ClassHierarchy.make(scope); + Iterable entrypoints = Util.makeMainEntrypoints(scope, cha, "Ldemandpa/TestArraysCopyOf"); + AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints); + AnalysisCache cache = new AnalysisCache(); + CallGraphBuilder builder = Util.makeZeroOneContainerCFABuilder(options, cache, cha, scope); + CallGraph cg = builder.makeCallGraph(options, null); + PointerAnalysis pa = builder.getPointerAnalysis(); + CGNode mainMethod = AbstractPtrTest.findMainMethod(cg); + PointerKey keyToQuery = AbstractPtrTest.getParam(mainMethod, "testThisVar", pa.getHeapModel()); + OrdinalSet pointsToSet = pa.getPointsToSet(keyToQuery); + Assert.assertEquals(1, pointsToSet.size()); + + } /** * make main entrypoints, even in the primordial loader. */ diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java index 999f37dca..c4a00b5db 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContainerContextSelector.java @@ -112,7 +112,7 @@ public class ContainerContextSelector implements ContextSelector { if (keys != null && keys.length > 0 && keys[0] != null) { receiver = keys[0]; } - if (receiver != null && mayUnderstand(caller, site, callee, receiver)) { + if (mayUnderstand(caller, site, callee, receiver)) { if (DEBUG) { System.err.println("May Understand: " + callee + " recv " + receiver); } @@ -280,6 +280,9 @@ public class ContainerContextSelector implements ContextSelector { if (site.isStatic()) { return false; } + if (receiver == null) { + return false; + } if (targetMethod.getDeclaringClass().getReference().equals(TypeReference.JavaLangObject)) { // ramp down context: assuming methods on java.lang.Object don't cause pollution // important for containers that invoke reflection @@ -289,25 +292,28 @@ public class ContainerContextSelector implements ContextSelector { return true; } - if (receiver == null) { - // any possible receiver. However, we will only handle this call - // if the concrete receiver type is interesting. - IClass klass = targetMethod.getDeclaringClass(); - int n = cha.getNumberOfImmediateSubclasses(klass); - if (n > 0) { - // the receiver is not "effectively final". - // give up and assume we might see an interesting subclass. - return true; - } - // only one possible receiver class - if (delegate.isInteresting(klass)) { - // we may create a receiver instance context for this call - return true; - } else { - // we will never create a receiver instance context for this call - return false; - } - } + // TODO MS disabling logic below; it has been disabled anyway + // for a while since we were avoiding calling this method with + // receiver == null. Should we delete it? +// if (receiver == null) { +// // any possible receiver. However, we will only handle this call +// // if the concrete receiver type is interesting. +// IClass klass = targetMethod.getDeclaringClass(); +// int n = cha.getNumberOfImmediateSubclasses(klass); +// if (n > 0) { +// // the receiver is not "effectively final". +// // give up and assume we might see an interesting subclass. +// return true; +// } +// // only one possible receiver class +// if (delegate.isInteresting(klass)) { +// // we may create a receiver instance context for this call +// return true; +// } else { +// // we will never create a receiver instance context for this call +// return false; +// } +// } if (!delegate.isInteresting(receiver.getConcreteType())) { return false; } From 310d0fff256ff26e60c7b4ba3e257fd3d8ed103f Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Wed, 15 May 2013 13:35:38 -0400 Subject: [PATCH 100/187] changes to ease use of WALA from an executable jar. also some very basic support for GXL, a graph format used by some software engineering tools. --- com.ibm.wala.cast.js.rhino/.classpath | 1 + .../META-INF/MANIFEST.MF | 4 +- com.ibm.wala.cast.js.rhino/build.properties | 2 +- .../tests/callGraph/CHACallGraphTest.java | 36 ++- .../AbstractNestedJarFileModule.java | 228 ++++++++++++++++++ .../wala/classLoader/NestedJarFileModule.java | 215 +---------------- .../classLoader/ResourceJarFileModule.java | 31 +++ .../ibm/wala/util/config/FileOfClasses.java | 3 +- .../com/ibm/wala/util/io/FileProvider.java | 5 +- .../src/com/ibm/wala/util/graph/GXL.java | 64 +++++ 10 files changed, 362 insertions(+), 227 deletions(-) create mode 100644 com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java create mode 100644 com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java create mode 100644 com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index f28b70835..5ebf5d40c 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -1,6 +1,7 @@ + diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index 49870d685..35ce3fb27 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -35,5 +35,5 @@ Export-Package: com.ibm.wala.cast.js.translator, org.mozilla.javascript.xml, org.mozilla.javascript.xml.impl.xmlbeans, org.mozilla.javascript.xmlimpl -Bundle-ClassPath: lib/rhino-1.7R3.jar, - . +Bundle-ClassPath: ., + lib/js.jar diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index 2986328a0..49aa09ae1 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,5 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/rhino-1.7R3.jar + lib/js.jar jars.extra.classpath = lib/rhino-1.7R3.jar diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java index aad8d8361..3691b4dd9 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java @@ -9,33 +9,43 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.Entrypoint; import com.ibm.wala.ipa.callgraph.cha.CHACallGraph; -import com.ibm.wala.ipa.callgraph.impl.AllApplicationEntrypoints; +import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.ClassHierarchyException; +import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.functions.Function; public class CHACallGraphTest { + @Test public void testJava_cup() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { - testCHA(TestConstants.JAVA_CUP, TestConstants.JAVA_CUP_MAIN); + testCHA(TestConstants.JAVA_CUP, TestConstants.JAVA_CUP_MAIN, CallGraphTestUtil.REGRESSION_EXCLUSIONS); + } + + public static CallGraph testCHA(String scopeFile, final String mainClass, final String exclusionsFile) throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { + return testCHA(scopeFile, exclusionsFile, new Function>() { + @Override + public Iterable apply(IClassHierarchy cha) { + return Util.makeMainEntrypoints(cha.getScope(), cha, mainClass); + } + }); } - public static CallGraph testCHA(String scopeFile, String mainClass) throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { - AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(scopeFile, CallGraphTestUtil.REGRESSION_EXCLUSIONS); - ClassHierarchy cha = ClassHierarchy.make(scope); - Iterable entrypoints; - if (mainClass == null) { - entrypoints = new AllApplicationEntrypoints(scope, cha); - } else { - entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, mainClass); - } + public static CallGraph testCHA(String scopeFile, + String exclusionsFile, + Function> makeEntrypoints) + throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException + { + AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(scopeFile, exclusionsFile); + IClassHierarchy cha = ClassHierarchy.make(scope); CHACallGraph CG = new CHACallGraph(cha); - CG.init(entrypoints); + CG.init(makeEntrypoints.apply(cha)); return CG; } public static void main(String[] args) throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { - testCHA(args[0], args.length>1? args[1]: null); + testCHA(args[0], args.length>1? args[1]: null, "Java60RegressionExclusions.txt"); } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java new file mode 100644 index 000000000..762c72420 --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java @@ -0,0 +1,228 @@ +/******************************************************************************* + * Copyright (c) 2002 - 2006 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.classLoader; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.jar.JarInputStream; +import java.util.zip.ZipEntry; + +import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.debug.Assertions; +import com.ibm.wala.util.io.FileSuffixes; +import com.ibm.wala.util.warnings.Warning; +import com.ibm.wala.util.warnings.Warnings; + +/** + * A Jar file nested in a parent jar file + */ +public abstract class AbstractNestedJarFileModule implements Module { + + private static final boolean DEBUG = false; + + /** + * For efficiency, we cache the byte[] holding each ZipEntry's contents; this will help avoid multiple unzipping TODO: use a soft + * reference? + */ + private HashMap cache = null; + + protected abstract InputStream getNestedContents() throws IOException; + + public InputStream getInputStream(String name) { + populateCache(); + byte[] b = cache.get(name); + return new ByteArrayInputStream(b); + } + + private void populateCache() { + if (cache != null) { + return; + } + cache = HashMapFactory.make(); + try { + final JarInputStream stream = new JarInputStream(getNestedContents()); + for (ZipEntry z = stream.getNextEntry(); z != null; z = stream.getNextEntry()) { + final String name = z.getName(); + if (DEBUG) { + System.err.println(("got entry: " + name)); + } + if (FileSuffixes.isClassFile(name) || FileSuffixes.isSourceFile(name)) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] temp = new byte[1024]; + int n = stream.read(temp); + while (n != -1) { + out.write(temp, 0, n); + n = stream.read(temp); + } + byte[] bb = out.toByteArray(); + cache.put(name, bb); + } + } + } catch (IOException e) { + // just go with what we have + Warnings.add(new Warning() { + + @Override + public String getMsg() { + return "could not read contents of nested jar file " + toString(); + } + }); + } + + } + + protected long getEntrySize(String name) { + populateCache(); + byte[] b = cache.get(name); + return b.length; + } + + /* + * @see com.ibm.wala.classLoader.Module#getEntries() + */ + public Iterator getEntries() { + populateCache(); + final Iterator it = cache.keySet().iterator(); + return new Iterator() { + String next = null; + { + advance(); + } + + private void advance() { + if (it.hasNext()) { + next = it.next(); + } else { + next = null; + } + } + + public boolean hasNext() { + return next != null; + } + + public ModuleEntry next() { + ModuleEntry result = new Entry(next); + advance(); + return result; + } + + public void remove() { + Assertions.UNREACHABLE(); + } + }; + } + + /** + * @author sfink an entry in a nested jar file. + */ + private class Entry implements ModuleEntry { + + private final String name; + + Entry(String name) { + this.name = name; + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#getName() + */ + public String getName() { + return name; + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() + */ + public boolean isClassFile() { + return FileSuffixes.isClassFile(getName()); + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() + */ + public InputStream getInputStream() { + return AbstractNestedJarFileModule.this.getInputStream(name); + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() + */ + public boolean isModuleFile() { + return false; + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#asModule() + */ + public Module asModule() { + Assertions.UNREACHABLE(); + return null; + } + + @Override + public String toString() { + return "nested entry: " + name; + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() + */ + public String getClassName() { + return FileSuffixes.stripSuffix(getName()); + } + + /* + * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() + */ + public boolean isSourceFile() { + return FileSuffixes.isSourceFile(getName()); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Entry other = (Entry) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + private AbstractNestedJarFileModule getOuterType() { + return AbstractNestedJarFileModule.this; + } + + } + +} \ No newline at end of file diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java index 046668242..6d595a5b9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002 - 2006 IBM Corporation. + * Copyright (c) 2007 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 @@ -11,37 +11,15 @@ package com.ibm.wala.classLoader; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.jar.JarInputStream; import java.util.zip.ZipEntry; -import com.ibm.wala.util.collections.HashMapFactory; -import com.ibm.wala.util.debug.Assertions; -import com.ibm.wala.util.io.FileSuffixes; -import com.ibm.wala.util.warnings.Warning; -import com.ibm.wala.util.warnings.Warnings; - -/** - * A Jar file nested in a parent jar file - */ -public class NestedJarFileModule implements Module { - - private static final boolean DEBUG = false; +public class NestedJarFileModule extends AbstractNestedJarFileModule { private final JarFileModule parent; private final ZipEntry entry; - /** - * For efficiency, we cache the byte[] holding each ZipEntry's contents; this will help avoid multiple unzipping TODO: use a soft - * reference? - */ - private HashMap cache = null; - public NestedJarFileModule(JarFileModule parent, ZipEntry entry) { this.parent = parent; this.entry = entry; @@ -53,190 +31,9 @@ public class NestedJarFileModule implements Module { } } - public InputStream getInputStream(String name) { - populateCache(); - byte[] b = cache.get(name); - return new ByteArrayInputStream(b); - } - - private void populateCache() { - if (cache != null) { - return; - } - cache = HashMapFactory.make(); - final byte[] b = parent.getContents(entry); - try { - final JarInputStream stream = new JarInputStream(new ByteArrayInputStream(b)); - for (ZipEntry z = stream.getNextEntry(); z != null; z = stream.getNextEntry()) { - final String name = z.getName(); - if (DEBUG) { - System.err.println(("got entry: " + name)); - } - if (FileSuffixes.isClassFile(name) || FileSuffixes.isSourceFile(name)) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] temp = new byte[1024]; - int n = stream.read(temp); - while (n != -1) { - out.write(temp, 0, n); - n = stream.read(temp); - } - byte[] bb = out.toByteArray(); - cache.put(name, bb); - } - } - } catch (IOException e) { - // just go with what we have - Warnings.add(new Warning() { - - @Override - public String getMsg() { - return "could not read contents of nested jar file " + entry.getName() + ", parent " + parent.getAbsolutePath(); - } - }); - } - - } - - protected long getEntrySize(String name) { - populateCache(); - byte[] b = cache.get(name); - return b.length; - } - - /* - * @see com.ibm.wala.classLoader.Module#getEntries() - */ - public Iterator getEntries() { - populateCache(); - final Iterator it = cache.keySet().iterator(); - return new Iterator() { - String next = null; - { - advance(); - } - - private void advance() { - if (it.hasNext()) { - next = it.next(); - } else { - next = null; - } - } - - public boolean hasNext() { - return next != null; - } - - public ModuleEntry next() { - ModuleEntry result = new Entry(next); - advance(); - return result; - } - - public void remove() { - Assertions.UNREACHABLE(); - } - }; - } - - /** - * @author sfink an entry in a nested jar file. - */ - private class Entry implements ModuleEntry { - - private final String name; - - Entry(String name) { - this.name = name; - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#getName() - */ - public String getName() { - return name; - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() - */ - public boolean isClassFile() { - return FileSuffixes.isClassFile(getName()); - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() - */ - public InputStream getInputStream() { - return NestedJarFileModule.this.getInputStream(name); - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() - */ - public boolean isModuleFile() { - return false; - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#asModule() - */ - public Module asModule() { - Assertions.UNREACHABLE(); - return null; - } - - @Override - public String toString() { - return "nested entry: " + name; - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() - */ - public String getClassName() { - return FileSuffixes.stripSuffix(getName()); - } - - /* - * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() - */ - public boolean isSourceFile() { - return FileSuffixes.isSourceFile(getName()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Entry other = (Entry) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - - private NestedJarFileModule getOuterType() { - return NestedJarFileModule.this; - } - + @Override + protected InputStream getNestedContents() { + return new ByteArrayInputStream(parent.getContents(entry)); } @Override @@ -269,4 +66,4 @@ public class NestedJarFileModule implements Module { return true; } -} \ No newline at end of file +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java new file mode 100644 index 000000000..5e1697d48 --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2007 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.classLoader; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class ResourceJarFileModule extends AbstractNestedJarFileModule { + + private final URL resourceURL; + + public ResourceJarFileModule(URL resourceURL) { + this.resourceURL = resourceURL; + } + + + @Override + protected InputStream getNestedContents() throws IOException { + return resourceURL.openConnection().getInputStream(); + } + +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/config/FileOfClasses.java b/com.ibm.wala.core/src/com/ibm/wala/util/config/FileOfClasses.java index 634a31c48..b6a8d7a10 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/config/FileOfClasses.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/config/FileOfClasses.java @@ -23,6 +23,7 @@ import java.util.regex.Pattern; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.ipa.callgraph.impl.SetOfClasses; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.io.FileProvider; /** * An object which represents a set of classes read from a text file. @@ -43,7 +44,7 @@ public class FileOfClasses extends SetOfClasses implements Serializable { private boolean needsCompile = false; private FileOfClasses(File textFile) throws IOException { - this(new FileInputStream(textFile)); + this(textFile.exists()? new FileInputStream(textFile): FileProvider.class.getClassLoader().getResourceAsStream(textFile.getName())); } public static FileOfClasses createFileOfClasses(File textFile) throws IOException { diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java index 7573c9265..e3e4d79ea 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/io/FileProvider.java @@ -27,6 +27,7 @@ import java.util.zip.ZipException; import com.ibm.wala.classLoader.JarFileModule; import com.ibm.wala.classLoader.Module; import com.ibm.wala.classLoader.NestedJarFileModule; +import com.ibm.wala.classLoader.ResourceJarFileModule; import com.ibm.wala.util.debug.Assertions; /** @@ -35,7 +36,7 @@ import com.ibm.wala.util.debug.Assertions; public class FileProvider { - private final static int DEBUG_LEVEL = 0; + private final static int DEBUG_LEVEL = Integer.parseInt(System.getProperty("wala.debug.file", "0")); /** * @param fileName @@ -164,6 +165,8 @@ public class FileProvider { JarEntry entry = jc.getJarEntry(); JarFileModule parent = new JarFileModule(f); return new NestedJarFileModule(parent, entry); + } else if (url.getProtocol().equals("rsrc")) { + return new ResourceJarFileModule(url); } else { String filePath = filePathFromURL(url); return new JarFileModule(new JarFile(filePath, false)); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java new file mode 100644 index 000000000..732ddeb94 --- /dev/null +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java @@ -0,0 +1,64 @@ +package com.ibm.wala.util.graph; + +import java.util.Iterator; +import java.util.Map; + +import com.ibm.wala.util.functions.Function; + +public class GXL { + + public interface EntityTypes { + String type(T entity); + String type(Graph entity); + String type(T from, T to); + } + + public static String toGXL(Graph G, + EntityTypes types, + String graphId, + Function nodeIds, + Function> nodeProperties) + { + StringBuffer sb = new StringBuffer(); + + sb.append("\n"); + sb.append("\n"); + sb.append("\n"); + sb.append(" \n"); + sb.append(" \n"); + + for(T n : G) { + sb.append(" \n"); + sb.append(" \n"); + Map props = nodeProperties.apply(n); + if (props != null) { + for(Map.Entry e : props.entrySet()) { + sb.append(" \n"); + if (e.getValue() != null) { + sb.append(" " + e.getValue() + "\n"); + } else { + sb.append(" \n"); + } + sb.append(" \n"); + } + } + sb.append(" \n"); + } + + for(T n : G) { + Iterator ss = G.getSuccNodes(n); + while (ss.hasNext()) { + T s = ss.next(); + sb.append(" \n"); + sb.append(" \n"); + + sb.append(" \n"); + } + } + + sb.append(" \n"); + sb.append("\n"); + + return sb.toString(); + } +} From c4ce3999cdea17efac2581ee3336e4e1f26e78b4 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 15 May 2013 10:55:58 -0700 Subject: [PATCH 101/187] fix possible NPE --- .../com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java index f794680a8..b4e868da1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java @@ -256,7 +256,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { throws IllegalArgumentException { Pair> p = getPointsToWithStates(pk, ikeyPred); final Collection p2SetWithStates = p.snd; - Collection finalP2Set = removeStates(p2SetWithStates); + Collection finalP2Set = p2SetWithStates != null ? removeStates(p2SetWithStates) : Collections.emptySet(); return Pair.make(p.fst, finalP2Set); } @@ -283,6 +283,9 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { * Unwrap a Collection of WithState objects, returning a Collection containing the wrapped objects */ private static Collection removeStates(final Collection> p2SetWithStates) { + if (p2SetWithStates == null) { + throw new IllegalArgumentException("p2SetWithStates == null"); + } Collection finalP2Set = Iterator2Collection.toSet(new MapIterator, T>(p2SetWithStates.iterator(), new Function, T>() { From f6cdbd0e0a6579ab1e58426f2a87aa40d63544ee Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 17 May 2013 17:58:37 -0700 Subject: [PATCH 102/187] switch back to rhino-1.7R3.jar, to be compatible with maven --- com.ibm.wala.cast.js.rhino/.classpath | 2 +- com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/build.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index 5ebf5d40c..41ccd7f97 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -1,8 +1,8 @@ - + diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index 35ce3fb27..c0fa3d389 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -36,4 +36,4 @@ Export-Package: com.ibm.wala.cast.js.translator, org.mozilla.javascript.xml.impl.xmlbeans, org.mozilla.javascript.xmlimpl Bundle-ClassPath: ., - lib/js.jar + lib/rhino-1.7R3.jar diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index 49aa09ae1..2986328a0 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,5 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/js.jar + lib/rhino-1.7R3.jar jars.extra.classpath = lib/rhino-1.7R3.jar From dd949bcbc4ca0d5bffd9e34ed51564c6883a7bd3 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 17 May 2013 19:47:53 -0700 Subject: [PATCH 103/187] config file for Travis CI --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..dff5f3a5d --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java From 3b1889121b909a4461a9dc40ece41a9335b45bcf Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 22 May 2013 15:39:19 -0700 Subject: [PATCH 104/187] add missing copyright headers --- .../polyglot/PolyglotJavaSourceAnalysisEngine.java | 10 ++++++++++ .../polyglot/PolyglotUnwoundIRTranslatorExtension.java | 10 ++++++++++ .../src/javaonepointfive/Annotations.java | 10 ++++++++++ .../javaonepointfive/TypeInferencePrimAndStringOp.java | 10 ++++++++++ .../src/p/NonPrimaryTopLevel.java | 10 ++++++++++ .../java/examples/ast/SynchronizedBlockDuplicator.java | 10 ++++++++++ .../ibm/wala/cast/java/ipa/modref/AstJavaModRef.java | 10 ++++++++++ .../ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java | 10 ++++++++++ .../wala/cast/java/ssa/AstJavaInstructionFactory.java | 10 ++++++++++ .../cast/java/ssa/AstJavaNewEnclosingInstruction.java | 10 ++++++++++ .../wala/cast/java/ssa/EnclosingObjectReference.java | 10 ++++++++++ .../js/test/TestSimplePageCallGraphShapeRhinoNu.java | 10 ++++++++++ .../cast/js/test/TestArgumentSensitivityRhino.java | 10 ++++++++++ .../ibm/wala/cast/js/test/TestForInLoopHackRhino.java | 10 ++++++++++ .../ibm/wala/cast/js/test/TestJQueryExamplesRhino.java | 10 ++++++++++ .../com/ibm/wala/cast/js/test/TestRhinoSourceMap.java | 10 ++++++++++ .../test/TestSimplePageCallGraphShapeRhinoJericho.java | 10 ++++++++++ .../com/ibm/wala/cast/js/vis/JsViewerDriver.java | 10 ++++++++++ .../CAstRhinoLoopUnwindingTranslatorFactory.java | 10 ++++++++++ .../cast/js/translator/CAstRhinoTranslatorFactory.java | 10 ++++++++++ .../ibm/wala/cast/js/translator/TypedNodeVisitor.java | 10 ++++++++++ .../source/com/ibm/wala/js/rhino/Activator.java | 10 ++++++++++ .../ibm/wala/cast/js/test/TestArgumentSensitivity.java | 10 ++++++++++ .../com/ibm/wala/cast/js/test/TestForInLoopHack.java | 10 ++++++++++ .../com/ibm/wala/cast/js/test/TestJQueryExamples.java | 10 ++++++++++ .../js/analysis/typeInference/JSPrimitiveType.java | 10 ++++++++++ .../ibm/wala/cast/js/html/CompositeFileMapping.java | 10 ++++++++++ .../com/ibm/wala/cast/js/html/EmptyFileMapping.java | 10 ++++++++++ .../source/com/ibm/wala/cast/js/html/FileMapping.java | 10 ++++++++++ .../source/com/ibm/wala/cast/js/html/ITag.java | 4 ++-- .../com/ibm/wala/cast/js/html/NestedRangeMapping.java | 10 ++++++++++ .../com/ibm/wala/cast/js/html/RangeFileMapping.java | 10 ++++++++++ .../ibm/wala/cast/js/html/WebPageLoaderFactory.java | 10 ++++++++++ .../cast/js/ipa/callgraph/ArgumentSpecialization.java | 10 ++++++++++ .../wala/cast/js/ipa/callgraph/GlobalObjectKey.java | 10 ++++++++++ .../wala/cast/js/ipa/callgraph/JSAnalysisOptions.java | 10 ++++++++++ .../JavaScriptConstructorContextSelector.java | 10 ++++++++++ .../callgraph/JavaScriptConstructorInstanceKeys.java | 10 ++++++++++ .../JavaScriptFunctionApplyContextInterpreter.java | 10 ++++++++++ .../JavaScriptFunctionApplyContextSelector.java | 10 ++++++++++ .../JavaScriptFunctionApplyTargetSelector.java | 10 ++++++++++ .../JavaScriptFunctionDotCallTargetSelector.java | 10 ++++++++++ .../cast/js/ipa/callgraph/LoadFileTargetSelector.java | 10 ++++++++++ .../callgraph/ObjectSensitivityContextSelector.java | 10 ++++++++++ .../ipa/callgraph/RecursionBoundContextSelector.java | 10 ++++++++++ .../ipa/callgraph/RecursionCheckContextSelector.java | 10 ++++++++++ .../callgraph/correlations/extraction/LabelPos.java | 10 ++++++++++ .../com/ibm/wala/cast/js/ssa/JSInstructionFactory.java | 10 ++++++++++ .../ibm/wala/cast/js/ssa/JavaScriptCheckReference.java | 10 ++++++++++ .../com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java | 10 ++++++++++ .../com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java | 10 ++++++++++ .../com/ibm/wala/cast/js/ssa/PrototypeLookup.java | 10 ++++++++++ .../source/com/ibm/wala/cast/js/ssa/SetPrototype.java | 10 ++++++++++ .../cast/js/translator/JSConstantFoldingRewriter.java | 10 ++++++++++ .../wala/cast/js/translator/JavaScriptCAstNode.java | 10 ++++++++++ .../JavaScriptLoopUnwindingTranslatorFactory.java | 10 ++++++++++ .../cast/js/translator/JavaScriptTranslatorToCAst.java | 10 ++++++++++ .../wala/cast/js/translator/PropertyReadExpander.java | 10 ++++++++++ .../source/com/ibm/wala/cast/js/util/Util.java | 10 ++++++++++ .../source/com/ibm/wala/cast/js/vis/JsPaPanel.java | 10 ++++++++++ .../source/com/ibm/wala/cast/js/vis/JsViewer.java | 10 ++++++++++ .../com/ibm/wala/cast/test/TestCAstTranslator.java | 10 ++++++++++ .../cast/ipa/callgraph/ArgumentInstanceContext.java | 10 ++++++++++ .../CrossLanguageSSAPropagationCallGraphBuilder.java | 10 ++++++++++ .../ipa/callgraph/LexicalScopingResolverContexts.java | 10 ++++++++++ .../callgraph/LexicalScopingSSAContextInterpreter.java | 10 ++++++++++ .../callgraph/OneLevelForLexicalAccessFunctions.java | 10 ++++++++++ .../ipa/callgraph/ScopeMappingKeysContextSelector.java | 10 ++++++++++ .../java/com/ibm/wala/cast/ipa/modref/AstModRef.java | 10 ++++++++++ .../com/ibm/wala/cast/ir/ssa/AstEchoInstruction.java | 10 ++++++++++ .../ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java | 10 ++++++++++ .../cast/ir/ssa/MultiReturnValueInvokeInstruction.java | 10 ++++++++++ .../ibm/wala/cast/ir/translator/ArrayOpHandler.java | 10 ++++++++++ .../cast/ir/translator/ConstantFoldingRewriter.java | 10 ++++++++++ .../wala/cast/ir/translator/ExposedNamesCollector.java | 10 ++++++++++ .../ibm/wala/cast/ir/translator/TranslatorToCAst.java | 10 ++++++++++ .../com/ibm/wala/cast/loader/CAstAbstractLoader.java | 10 ++++++++++ .../java/com/ibm/wala/cast/tree/CAstAnnotation.java | 10 ++++++++++ .../source/java/com/ibm/wala/cast/tree/CAstSymbol.java | 10 ++++++++++ .../com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java | 10 ++++++++++ .../ibm/wala/cast/tree/impl/CAstSymbolImplBase.java | 10 ++++++++++ .../java/com/ibm/wala/cast/tree/pattern/Alt.java | 10 ++++++++++ .../ibm/wala/cast/tree/rewrite/AstLoopUnwinder.java | 10 ++++++++++ .../ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java | 10 ++++++++++ .../wala/cast/tree/rewrite/CAstRewriterFactory.java | 10 ++++++++++ .../com/ibm/wala/cast/util/TargetLanguageSelector.java | 10 ++++++++++ .../src/annotations/AnnotatedClass1.java | 10 ++++++++++ .../src/annotations/AnnotatedClass2.java | 10 ++++++++++ .../src/annotations/DefaultVisableAnnotation.java | 10 ++++++++++ .../src/annotations/RuntimeInvisableAnnotation.java | 10 ++++++++++ .../src/annotations/RuntimeInvisableAnnotation2.java | 10 ++++++++++ .../RuntimeInvisableAnnotationForMethod.java | 10 ++++++++++ .../src/annotations/RuntimeVisableAnnotation.java | 10 ++++++++++ .../src/annotations/RuntimeVisableAnnotation2.java | 10 ++++++++++ .../annotations/RuntimeVisableAnnotationForMethod.java | 10 ++++++++++ com.ibm.wala.core.testdata/src/cfg/MonitorTest.java | 10 ++++++++++ .../src/classConstant/ClassConstant.java | 10 ++++++++++ .../src/multiDim/TestMultiDim.java | 10 ++++++++++ com.ibm.wala.core.testdata/src/reflection/Helper.java | 10 ++++++++++ .../src/reflection/Reflect10.java | 10 ++++++++++ .../src/reflection/Reflect11.java | 10 ++++++++++ .../src/reflection/Reflect12.java | 10 ++++++++++ .../src/reflection/Reflect13.java | 10 ++++++++++ .../src/reflection/Reflect14.java | 10 ++++++++++ .../src/reflection/Reflect15.java | 10 ++++++++++ .../src/reflection/Reflect16.java | 10 ++++++++++ .../src/reflection/Reflect17.java | 10 ++++++++++ .../src/reflection/Reflect18.java | 10 ++++++++++ .../src/reflection/Reflect19.java | 10 ++++++++++ .../src/reflection/Reflect20.java | 10 ++++++++++ .../src/reflection/Reflect21.java | 10 ++++++++++ .../src/reflection/Reflect22.java | 10 ++++++++++ .../src/reflection/Reflect23.java | 10 ++++++++++ .../src/reflection/Reflect3.java | 10 ++++++++++ .../src/reflection/Reflect4.java | 10 ++++++++++ .../src/reflection/Reflect5.java | 10 ++++++++++ .../src/reflection/Reflect6.java | 10 ++++++++++ .../src/reflection/Reflect7.java | 10 ++++++++++ .../src/reflection/Reflect8.java | 10 ++++++++++ .../src/reflection/Reflect9.java | 10 ++++++++++ com.ibm.wala.core.testdata/src/slice/A.java | 10 ++++++++++ com.ibm.wala.core.testdata/src/slice/B.java | 10 ++++++++++ .../src/slice/TestThrowCatch.java | 10 ++++++++++ .../src/string/SimpleStringOps.java | 10 ++++++++++ .../com/ibm/wala/core/tests/basic/PathFinderTest.java | 10 ++++++++++ .../com/ibm/wala/core/tests/basic/WelshPowellTest.java | 10 ++++++++++ .../wala/core/tests/callGraph/CHACallGraphTest.java | 10 ++++++++++ .../src/com/ibm/wala/core/tests/ir/AnnotationTest.java | 10 ++++++++++ .../ibm/wala/examples/drivers/JavaViewerDriver.java | 10 ++++++++++ .../src/com/ibm/wala/util/io/FileProviderTest.java | 10 ++++++++++ .../src/com/ibm/wala/classLoader/Language.java | 10 ++++++++++ .../ibm/wala/demandpa/alg/AbstractDemandPointsTo.java | 1 - .../ibm/wala/demandpa/alg/ThisFilteringHeapModel.java | 10 ++++++++++ .../src/com/ibm/wala/ipa/cha/IClassHierarchy.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/CgPanel.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/ChaPanel.java | 10 ++++++++++ .../com/ibm/wala/viz/viewer/DualTreeCellRenderer.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/IrViewer.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/PaPanel.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/SourceViewer.java | 10 ++++++++++ .../src/com/ibm/wala/viz/viewer/WalaViewer.java | 10 ++++++++++ .../com/ibm/wala/cast/java/test/JDTJavaTest.java | 10 ++++++++++ .../wala/cast/java/test/TypeInferenceAssertion.java | 10 ++++++++++ .../source/com/ibm/wala/ide/jdt/Activator.java | 10 ++++++++++ .../source/com/ibm/wala/ide/util/ASTNodeFinder.java | 10 ++++++++++ .../com/ibm/wala/ide/util/JavaEclipseProjectPath.java | 10 ++++++++++ .../source/com/ibm/wala/ide/util/JdtPosition.java | 10 ++++++++++ .../ide/jsdt/tests/AbstractJSProjectScopeTest.java | 10 ++++++++++ .../ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java | 10 ++++++++++ .../ibm/wala/ide/jsdt/tests/WLProjectScopeTest.java | 10 ++++++++++ .../js/client/EclipseJavaScriptAnalysisEngine.java | 10 ++++++++++ .../source/com/ibm/wala/ide/jsdt/Activator.java | 10 ++++++++++ .../wala/ide/util/JavaScriptEclipseProjectPath.java | 10 ++++++++++ .../com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java | 10 ++++++++++ .../source/com/ibm/wala/ide/util/JsdtUtil.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/IArrayLoadInstruction.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/IArrayStoreInstruction.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/IBinaryOpInstruction.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/IComparisonInstruction.java | 10 ++++++++++ .../wala/shrikeBT/IConditionalBranchInstruction.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/IConversionInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IGetInstruction.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/IInstanceofInstruction.java | 10 ++++++++++ .../ibm/wala/shrikeBT/ILoadIndirectInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/ILoadInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IMemoryOperation.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IPutInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IShiftInstruction.java | 10 ++++++++++ .../ibm/wala/shrikeBT/IStoreIndirectInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IStoreInstruction.java | 10 ++++++++++ .../com/ibm/wala/shrikeBT/ITypeTestInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IUnaryOpInstruction.java | 10 ++++++++++ .../src/com/ibm/wala/shrikeBT/IndirectionData.java | 10 ++++++++++ .../src/com/ibm/wala/dataflow/graph/BooleanSolver.java | 4 ++-- .../src/com/ibm/wala/util/debug/LoggingStopwatch.java | 10 ++++++++++ .../src/com/ibm/wala/util/functions/VoidFunction.java | 10 ++++++++++ com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java | 10 ++++++++++ .../wala/util/graph/traverse/DFSAllPathsFinder.java | 10 ++++++++++ .../com/ibm/wala/util/graph/traverse/WelshPowell.java | 10 ++++++++++ 180 files changed, 1774 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java index 5ae68fb9e..a22ce4838 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.translator.polyglot; import com.ibm.wala.cast.java.client.JavaSourceAnalysisEngine; diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java index ec996e55e..e154dfcea 100755 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.translator.polyglot; import com.ibm.wala.cast.tree.CAst; diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java index 7c319ac63..41f195558 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Annotations.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 javaonepointfive; @interface TestAnnotation { diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java index 55a5b670e..1cd765235 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/TypeInferencePrimAndStringOp.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 javaonepointfive; public class TypeInferencePrimAndStringOp { diff --git a/com.ibm.wala.cast.java.test.data/src/p/NonPrimaryTopLevel.java b/com.ibm.wala.cast.java.test.data/src/p/NonPrimaryTopLevel.java index a9d7213ad..bea506ebb 100644 --- a/com.ibm.wala.cast.java.test.data/src/p/NonPrimaryTopLevel.java +++ b/com.ibm.wala.cast.java.test.data/src/p/NonPrimaryTopLevel.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 p; public class NonPrimaryTopLevel { 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 b94259c61..2b716c715 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 @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.examples.ast; import java.util.Map; diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java index b02a76966..6b60b34dc 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.ipa.modref; import java.util.Collection; diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java index 8a0dd8501..993ad558b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.ipa.slicer; import java.util.Collection; diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInstructionFactory.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInstructionFactory.java index 1d30fe6fe..cb1d992f9 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInstructionFactory.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInstructionFactory.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.ssa; import com.ibm.wala.cast.ir.ssa.AstInstructionFactory; diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java index f0f481cb6..6584e38f0 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.ssa; import java.util.Collection; diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java index fae2817fa..c0352d815 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.ssa; import java.util.Collection; diff --git a/com.ibm.wala.cast.js.html.nu_validator/tests/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoNu.java b/com.ibm.wala.cast.js.html.nu_validator/tests/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoNu.java index 9e2a9def6..1f6c38e05 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/tests/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoNu.java +++ b/com.ibm.wala.cast.js.html.nu_validator/tests/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoNu.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import com.ibm.wala.cast.js.html.IHtmlParser; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java index b34cac1f8..33c698e5f 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import org.junit.Before; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java index f11827a1c..89a6146d0 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import org.junit.Before; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java index 3df88afd2..ff84f65ad 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import org.junit.Before; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index dcbdd2fcb..a03c298d2 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import static com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.makeHierarchy; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java index 635c06b52..bfd1a75d2 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhinoJericho.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import java.io.IOException; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java index a2f489180..e229fef87 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/vis/JsViewerDriver.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.vis; import java.io.IOException; diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoLoopUnwindingTranslatorFactory.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoLoopUnwindingTranslatorFactory.java index d9280237e..16966dcef 100755 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoLoopUnwindingTranslatorFactory.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoLoopUnwindingTranslatorFactory.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java index 99e9f963a..57795bb14 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/TypedNodeVisitor.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/TypedNodeVisitor.java index ad3d8f193..a26c53b95 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/TypedNodeVisitor.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/TypedNodeVisitor.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import org.mozilla.javascript.ast.ArrayComprehension; diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java index 8ebda5869..37f078a23 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.rhino; import org.eclipse.core.runtime.Plugin; diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java index 2e116c57d..9a2724dc0 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import java.io.IOException; diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java index ec2dde4ed..adb1fa257 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import java.io.IOException; diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java index 3ae3bec4a..a4d4045c5 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamples.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.test; import java.io.IOException; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSPrimitiveType.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSPrimitiveType.java index 4f27f2ca4..23fd5cded 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSPrimitiveType.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSPrimitiveType.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.analysis.typeInference; import com.ibm.wala.analysis.typeInference.PrimitiveType; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java index 25a3278da..c66591983 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.html; import java.io.PrintStream; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java index fc743b69f..858b46bc1 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.html; import java.io.PrintStream; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java index 405b9b0c2..c3998ee6f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.html; import java.io.PrintStream; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/ITag.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/ITag.java index de05576f8..70d84032c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/ITag.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/ITag.java @@ -1,5 +1,3 @@ -package com.ibm.wala.cast.js.html; - /****************************************************************************** * Copyright (c) 2002 - 2011 IBM Corporation. * All rights reserved. This program and the accompanying materials @@ -10,6 +8,8 @@ package com.ibm.wala.cast.js.html; * Contributors: * IBM Corporation - initial API and implementation *****************************************************************************/ +package com.ibm.wala.cast.js.html; + import java.util.Map; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java index 507e1a2e1..d5095c3a4 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.html; import java.io.IOException; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java index 53dfc4919..a6e8dfef5 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.html; import java.io.IOException; 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 2fc4c0c0a..3a4135965 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 @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.html; import com.ibm.wala.cast.ir.translator.TranslatorToIR; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java index d9b1e25e2..75258a53b 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import java.util.ArrayList; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java index d4742301d..f4fea43ac 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import java.util.Iterator; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java index 29a7eb0b5..7e3c4f33b 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.ipa.callgraph.AnalysisOptions; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java index fef25c85f..2a9cc4976 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java index 57d189463..5b9462baa 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.classLoader.NewSiteReference; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextInterpreter.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextInterpreter.java index 5f4b32c36..27cd87b9d 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextInterpreter.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextInterpreter.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.AstContextInsensitiveSSAContextInterpreter; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java index a7ca70392..ed0d24f5a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.cast.js.types.JavaScriptTypes; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyTargetSelector.java index f7ecfa1fd..15b4e17ef 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyTargetSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.cast.js.ipa.summaries.JavaScriptSummarizedFunction; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java index aa13687fa..2663e97aa 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import java.util.Map; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java index dac95fde6..cab685b70 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import java.io.IOException; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java index 33ffde357..b4b8ebbcd 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import java.util.HashMap; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionBoundContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionBoundContextSelector.java index 511e23eb5..bb0e45171 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionBoundContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionBoundContextSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import com.ibm.wala.analysis.reflection.InstanceKeyWithNode; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionCheckContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionCheckContextSelector.java index 24ab69cd7..21c3c7dab 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionCheckContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/RecursionCheckContextSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph; import java.util.ArrayList; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/LabelPos.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/LabelPos.java index d59798e73..fdd189cf1 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/LabelPos.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/LabelPos.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ipa.callgraph.correlations.extraction; import com.ibm.wala.cast.tree.CAstNode; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSInstructionFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSInstructionFactory.java index 2bdca272a..ba63a0666 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSInstructionFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSInstructionFactory.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ssa; import com.ibm.wala.cast.ir.ssa.AstInstructionFactory; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java index f1647e2af..e230a4f11 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ssa; import java.util.Collection; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java index 68b90a925..55c340b55 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ssa; import java.util.Collection; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java index e985b2988..d13e18598 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ssa; import java.util.Collection; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/PrototypeLookup.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/PrototypeLookup.java index 54de2a4d9..505a44cfd 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/PrototypeLookup.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/PrototypeLookup.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ssa; import com.ibm.wala.ssa.SSAAbstractUnaryInstruction; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/SetPrototype.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/SetPrototype.java index 456860779..c2150896c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/SetPrototype.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/SetPrototype.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.ssa; import com.ibm.wala.ssa.SSAInstruction; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSConstantFoldingRewriter.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSConstantFoldingRewriter.java index eb8afc2e3..7b7f79600 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSConstantFoldingRewriter.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSConstantFoldingRewriter.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import com.ibm.wala.cast.ir.translator.ConstantFoldingRewriter; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptCAstNode.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptCAstNode.java index 6b3f84795..7db4f0b31 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptCAstNode.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptCAstNode.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import com.ibm.wala.cast.tree.CAstNode; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java index e1d43a500..83c05a515 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java index c193d3cda..51c6f2204 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import java.util.Collection; 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 3fe307081..0dd8d9800 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 @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.translator; import java.util.Map; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java index 91414fe41..c2fb4f994 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.util; import java.util.Iterator; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java index 78d6c4b9e..33d9e2985 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.vis; import java.util.ArrayList; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsViewer.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsViewer.java index b21ab6d16..e428b4ae2 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsViewer.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsViewer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.vis; import com.ibm.wala.ipa.callgraph.CallGraph; diff --git a/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstTranslator.java b/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstTranslator.java index a5bbff0af..1a12aeb42 100644 --- a/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstTranslator.java +++ b/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstTranslator.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.test; import java.io.File; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java index 959b7bb96..765616b4c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.callgraph; import com.ibm.wala.ipa.callgraph.Context; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java index 0f7fe6637..bdf52fe45 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.callgraph; import java.util.Iterator; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java index 196de3512..36b06e607 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.callgraph; import java.util.Collections; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java index 6167309f7..dbbd84a29 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.AstCallGraph.AstCGNode; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java index cbc99a242..f1ed0a861 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java index 17b2fe7d3..a0e8dadad 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java index fd845c763..77dfc6b47 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.modref; import java.util.Collection; 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 e16d18a8f..e33aecd2d 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 @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java index 77d5c584b..ebaf873c8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java index be35d594e..c74e8d0cc 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.classLoader.CallSiteReference; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ArrayOpHandler.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ArrayOpHandler.java index 679fea673..a962463e9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ArrayOpHandler.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ArrayOpHandler.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.translator; import com.ibm.wala.cast.ir.translator.AstTranslator.WalkContext; 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 f0dea2d7f..42db23afa 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 @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.translator; import java.util.Map; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ExposedNamesCollector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ExposedNamesCollector.java index ed1d20169..f4394df7b 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ExposedNamesCollector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/ExposedNamesCollector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.translator; import java.util.Map; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java index a29542d0e..e976ff5a3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.translator; import java.io.IOException; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java index a684b2018..d7de02e65 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.loader; import java.io.IOException; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java index eabe004d7..5fc0a580a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstAnnotation.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree; import java.util.Map; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java index 1384c650f..b212664e9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree; public interface CAstSymbol { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java index d37cd061d..8ae1aead8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree.impl; public class CAstSymbolImpl extends CAstSymbolImplBase { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java index 4f157752d..ae9723247 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree.impl; import com.ibm.wala.cast.tree.CAstSymbol; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java index 3ec50432c..b56953576 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree.pattern; import com.ibm.wala.cast.tree.CAstNode; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/AstLoopUnwinder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/AstLoopUnwinder.java index 44ad4fbbe..e61f454da 100755 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/AstLoopUnwinder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/AstLoopUnwinder.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree.rewrite; import java.util.Map; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java index 7a5ada515..766a6a392 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree.rewrite; import java.util.HashMap; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriterFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriterFactory.java index 6de103fcc..6e46171b8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriterFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriterFactory.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.tree.rewrite; import com.ibm.wala.cast.tree.CAst; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/TargetLanguageSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/TargetLanguageSelector.java index 78ee9dd9a..01a4d76aa 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/TargetLanguageSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/TargetLanguageSelector.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util; import com.ibm.wala.util.strings.Atom; diff --git a/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass1.java b/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass1.java index 96eedd4f6..d9a754a0a 100644 --- a/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass1.java +++ b/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass1.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; @RuntimeInvisableAnnotation diff --git a/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass2.java b/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass2.java index 5e6207314..abaa58867 100644 --- a/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass2.java +++ b/com.ibm.wala.core.testdata/src/annotations/AnnotatedClass2.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; @RuntimeInvisableAnnotation diff --git a/com.ibm.wala.core.testdata/src/annotations/DefaultVisableAnnotation.java b/com.ibm.wala.core.testdata/src/annotations/DefaultVisableAnnotation.java index 36485361d..cfcc3fdb9 100644 --- a/com.ibm.wala.core.testdata/src/annotations/DefaultVisableAnnotation.java +++ b/com.ibm.wala.core.testdata/src/annotations/DefaultVisableAnnotation.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; public @interface DefaultVisableAnnotation { diff --git a/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation.java b/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation.java index b81acaff0..e6f9db494 100644 --- a/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation.java +++ b/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; import java.lang.annotation.Retention; diff --git a/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation2.java b/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation2.java index 685089fd1..6b62d5f07 100644 --- a/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation2.java +++ b/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotation2.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; import java.lang.annotation.Retention; diff --git a/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotationForMethod.java b/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotationForMethod.java index 447aeaf80..32829cdd6 100644 --- a/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotationForMethod.java +++ b/com.ibm.wala.core.testdata/src/annotations/RuntimeInvisableAnnotationForMethod.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; import java.lang.annotation.ElementType; diff --git a/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation.java b/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation.java index 4c2dd4199..31459492c 100644 --- a/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation.java +++ b/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; import java.lang.annotation.Retention; diff --git a/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation2.java b/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation2.java index 915623681..3170fc0e1 100644 --- a/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation2.java +++ b/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotation2.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; import java.lang.annotation.Retention; diff --git a/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotationForMethod.java b/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotationForMethod.java index 1241c0cb1..24f017d03 100644 --- a/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotationForMethod.java +++ b/com.ibm.wala.core.testdata/src/annotations/RuntimeVisableAnnotationForMethod.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 annotations; import java.lang.annotation.ElementType; diff --git a/com.ibm.wala.core.testdata/src/cfg/MonitorTest.java b/com.ibm.wala.core.testdata/src/cfg/MonitorTest.java index d5edad190..3f25c3183 100644 --- a/com.ibm.wala.core.testdata/src/cfg/MonitorTest.java +++ b/com.ibm.wala.core.testdata/src/cfg/MonitorTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 cfg; public class MonitorTest { diff --git a/com.ibm.wala.core.testdata/src/classConstant/ClassConstant.java b/com.ibm.wala.core.testdata/src/classConstant/ClassConstant.java index bc5d12c67..3c33897e7 100644 --- a/com.ibm.wala.core.testdata/src/classConstant/ClassConstant.java +++ b/com.ibm.wala.core.testdata/src/classConstant/ClassConstant.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 classConstant; class ClassConstant { diff --git a/com.ibm.wala.core.testdata/src/multiDim/TestMultiDim.java b/com.ibm.wala.core.testdata/src/multiDim/TestMultiDim.java index 6fe61149c..85dfb292b 100644 --- a/com.ibm.wala.core.testdata/src/multiDim/TestMultiDim.java +++ b/com.ibm.wala.core.testdata/src/multiDim/TestMultiDim.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 multiDim; public class TestMultiDim { diff --git a/com.ibm.wala.core.testdata/src/reflection/Helper.java b/com.ibm.wala.core.testdata/src/reflection/Helper.java index e72006987..935d2dd17 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Helper.java +++ b/com.ibm.wala.core.testdata/src/reflection/Helper.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; public class Helper { diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect10.java b/com.ibm.wala.core.testdata/src/reflection/Reflect10.java index 7dfa4535b..2b80fb187 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect10.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect10.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect11.java b/com.ibm.wala.core.testdata/src/reflection/Reflect11.java index bae906052..8b0002835 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect11.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect11.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect12.java b/com.ibm.wala.core.testdata/src/reflection/Reflect12.java index e71e16a46..7a941a8d4 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect12.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect12.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect13.java b/com.ibm.wala.core.testdata/src/reflection/Reflect13.java index 0a5e7caf9..f02ad6e54 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect13.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect13.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect14.java b/com.ibm.wala.core.testdata/src/reflection/Reflect14.java index f9fa3736b..5ec7567ad 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect14.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect14.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect15.java b/com.ibm.wala.core.testdata/src/reflection/Reflect15.java index ffbedf036..cf5a6a26a 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect15.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect15.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.Constructor; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect16.java b/com.ibm.wala.core.testdata/src/reflection/Reflect16.java index 6af939b47..aa8b47cb1 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect16.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect16.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect17.java b/com.ibm.wala.core.testdata/src/reflection/Reflect17.java index 1c296c8e3..523ea35c6 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect17.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect17.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect18.java b/com.ibm.wala.core.testdata/src/reflection/Reflect18.java index 51c71bcb6..dfd62a149 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect18.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect18.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect19.java b/com.ibm.wala.core.testdata/src/reflection/Reflect19.java index 488173342..bee8721cb 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect19.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect19.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.Constructor; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect20.java b/com.ibm.wala.core.testdata/src/reflection/Reflect20.java index d774233a7..d47aed9e5 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect20.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect20.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect21.java b/com.ibm.wala.core.testdata/src/reflection/Reflect21.java index 847c77bd8..8357bcf75 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect21.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect21.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.Constructor; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect22.java b/com.ibm.wala.core.testdata/src/reflection/Reflect22.java index 35ca4a4b5..ed401460d 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect22.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect22.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.Constructor; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect23.java b/com.ibm.wala.core.testdata/src/reflection/Reflect23.java index 9d4c82304..a428880df 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect23.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect23.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect3.java b/com.ibm.wala.core.testdata/src/reflection/Reflect3.java index 00dd21514..84e899d73 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect3.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect3.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.util.Hashtable; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect4.java b/com.ibm.wala.core.testdata/src/reflection/Reflect4.java index 0d2af03d5..d39ae4e80 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect4.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect4.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.io.FilePermission; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect5.java b/com.ibm.wala.core.testdata/src/reflection/Reflect5.java index 0ccbd2fb5..185e060e7 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect5.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect5.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect6.java b/com.ibm.wala.core.testdata/src/reflection/Reflect6.java index 8c6b7d27a..68c880787 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect6.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect6.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect7.java b/com.ibm.wala.core.testdata/src/reflection/Reflect7.java index 1f86889c1..030292e0e 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect7.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect7.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.io.FilePermission; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect8.java b/com.ibm.wala.core.testdata/src/reflection/Reflect8.java index 58485fe4b..e8754bb24 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect8.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect8.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.Constructor; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect9.java b/com.ibm.wala.core.testdata/src/reflection/Reflect9.java index 28a56abd0..1fda5c23a 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect9.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect9.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 reflection; import java.lang.reflect.InvocationTargetException; diff --git a/com.ibm.wala.core.testdata/src/slice/A.java b/com.ibm.wala.core.testdata/src/slice/A.java index b0c65f996..be114ebd1 100644 --- a/com.ibm.wala.core.testdata/src/slice/A.java +++ b/com.ibm.wala.core.testdata/src/slice/A.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 slice; class A { diff --git a/com.ibm.wala.core.testdata/src/slice/B.java b/com.ibm.wala.core.testdata/src/slice/B.java index 396082202..6e0821e00 100644 --- a/com.ibm.wala.core.testdata/src/slice/B.java +++ b/com.ibm.wala.core.testdata/src/slice/B.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 slice; class B extends A { diff --git a/com.ibm.wala.core.testdata/src/slice/TestThrowCatch.java b/com.ibm.wala.core.testdata/src/slice/TestThrowCatch.java index 235be114d..05618b4c7 100644 --- a/com.ibm.wala.core.testdata/src/slice/TestThrowCatch.java +++ b/com.ibm.wala.core.testdata/src/slice/TestThrowCatch.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 slice; public class TestThrowCatch { diff --git a/com.ibm.wala.core.testdata/src/string/SimpleStringOps.java b/com.ibm.wala.core.testdata/src/string/SimpleStringOps.java index fed94f9a7..3f3b4a050 100644 --- a/com.ibm.wala.core.testdata/src/string/SimpleStringOps.java +++ b/com.ibm.wala.core.testdata/src/string/SimpleStringOps.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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 string; public class SimpleStringOps { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java index 3cc19d379..20c3e329f 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.core.tests.basic; import java.util.List; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/WelshPowellTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/WelshPowellTest.java index 170872e20..4c70529ae 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/WelshPowellTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/WelshPowellTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.core.tests.basic; import java.util.Iterator; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java index 3691b4dd9..87595b733 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CHACallGraphTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.core.tests.callGraph; import java.io.IOException; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java index aa9f1fb6f..9ea80fc99 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.core.tests.ir; import java.io.IOException; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/JavaViewerDriver.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/JavaViewerDriver.java index a2ebc9101..e15038dbc 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/JavaViewerDriver.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/JavaViewerDriver.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.examples.drivers; import java.io.File; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java index 79c048228..3a03eaa9b 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/util/io/FileProviderTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util.io; import static org.junit.Assert.assertEquals; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java index 84d2688d4..896f88a52 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.classLoader; import java.util.Collection; diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java index a3ef60364..752f155cb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java @@ -1,4 +1,3 @@ - /******************************************************************************* * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java index 2f3c2fff1..3a47adc05 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.demandpa.alg; import java.util.Iterator; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java index 1730b76ce..e4e9d175e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/IClassHierarchy.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ipa.cha; import java.util.Collection; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java index abf41eb5c..cb3c01ef6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.util.ArrayList; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java index 406768d70..6a39cb66e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.util.Collection; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java index a54e333df..831f17f72 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.awt.Component; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java index fe068cce4..c085c3c74 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.awt.Component; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java index 48d297d10..acc22daf5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.awt.BorderLayout; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java index 184c49e2b..7c1e4ec8d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.awt.BorderLayout; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/SourceViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/SourceViewer.java index 319a6f82c..3745dc366 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/SourceViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/SourceViewer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.awt.BorderLayout; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/WalaViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/WalaViewer.java index 7221d64af..7345208df 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/WalaViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/WalaViewer.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.viz.viewer; import java.awt.event.WindowAdapter; diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java index 9fbe245f6..0e43c9d30 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/JDTJavaTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.test; import java.io.IOException; diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java index 4814bee49..09fffd24b 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.java.test; import com.ibm.wala.cast.java.analysis.typeInference.AstJavaTypeInference; diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java index 4b120ec46..b954afbad 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.jdt; import org.eclipse.ui.plugin.AbstractUIPlugin; diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/ASTNodeFinder.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/ASTNodeFinder.java index 48c744dcc..9a97413d0 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/ASTNodeFinder.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/ASTNodeFinder.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.util; import static com.ibm.wala.ide.util.JdtUtil.getAST; diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JavaEclipseProjectPath.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JavaEclipseProjectPath.java index 6a526c101..3c2a89d9d 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JavaEclipseProjectPath.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JavaEclipseProjectPath.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.util; import java.io.File; diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java index f8e7b5177..0913be3bb 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.util; import java.io.IOException; diff --git a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/AbstractJSProjectScopeTest.java b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/AbstractJSProjectScopeTest.java index f0f3e96e2..9da451418 100644 --- a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/AbstractJSProjectScopeTest.java +++ b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/AbstractJSProjectScopeTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.jsdt.tests; import java.io.IOException; diff --git a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java index 0cd10e63f..3d2b8739e 100644 --- a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java +++ b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/JSProjectScopeTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.jsdt.tests; import com.ibm.wala.ide.tests.util.EclipseTestUtil.ZippedProjectData; diff --git a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/WLProjectScopeTest.java b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/WLProjectScopeTest.java index d53163f69..4e9822636 100644 --- a/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/WLProjectScopeTest.java +++ b/com.ibm.wala.ide.jsdt.tests/src/com/ibm/wala/ide/jsdt/tests/WLProjectScopeTest.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.jsdt.tests; import com.ibm.wala.ide.tests.util.EclipseTestUtil.ZippedProjectData; diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/cast/js/client/EclipseJavaScriptAnalysisEngine.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/cast/js/client/EclipseJavaScriptAnalysisEngine.java index fda304dd7..19e92f97b 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/cast/js/client/EclipseJavaScriptAnalysisEngine.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/cast/js/client/EclipseJavaScriptAnalysisEngine.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.client; import java.io.IOException; diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java index aa8076612..a12ba2a07 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.jsdt; import org.eclipse.ui.plugin.AbstractUIPlugin; diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptEclipseProjectPath.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptEclipseProjectPath.java index 9009a5e14..03bae2118 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptEclipseProjectPath.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptEclipseProjectPath.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.util; import java.io.IOException; diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java index be1862796..e7943c5fc 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.util; import org.eclipse.core.resources.IProject; diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java index 067339d58..5e35c5b61 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.ide.util; import java.io.IOException; diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayLoadInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayLoadInstruction.java index 3e027103a..6773cc67c 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayLoadInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayLoadInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IArrayLoadInstruction extends IInstruction, IMemoryOperation { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayStoreInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayStoreInstruction.java index 1a2e5d1d3..7c4ef341e 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayStoreInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IArrayStoreInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IArrayStoreInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IBinaryOpInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IBinaryOpInstruction.java index de8840208..f6eb0deb5 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IBinaryOpInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IBinaryOpInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IBinaryOpInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IComparisonInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IComparisonInstruction.java index 1b735731c..f28705ad9 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IComparisonInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IComparisonInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IComparisonInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConditionalBranchInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConditionalBranchInstruction.java index ac775204e..132f3dc1c 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConditionalBranchInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConditionalBranchInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IConditionalBranchInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConversionInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConversionInstruction.java index c9680f3f9..41150f3b6 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConversionInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IConversionInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IConversionInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IGetInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IGetInstruction.java index 1edd6b21e..e29eeacde 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IGetInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IGetInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IGetInstruction extends IInstruction, IMemoryOperation { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstanceofInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstanceofInstruction.java index fd7ea4a91..e67d93a6d 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstanceofInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstanceofInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IInstanceofInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadIndirectInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadIndirectInstruction.java index 8595ed716..533362cef 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadIndirectInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadIndirectInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface ILoadIndirectInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadInstruction.java index 367149f81..e0de40b3a 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ILoadInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface ILoadInstruction extends IInstruction, IMemoryOperation { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IMemoryOperation.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IMemoryOperation.java index 3be177bd0..fabb12b4d 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IMemoryOperation.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IMemoryOperation.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IMemoryOperation { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IPutInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IPutInstruction.java index d337c4401..deb91cbef 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IPutInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IPutInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IPutInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IShiftInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IShiftInstruction.java index eb48ee3a5..f8873c31f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IShiftInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IShiftInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IShiftInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreIndirectInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreIndirectInstruction.java index 01721972b..e61054de1 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreIndirectInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreIndirectInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IStoreIndirectInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreInstruction.java index bd778ea0b..ca2dc851a 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IStoreInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IStoreInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ITypeTestInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ITypeTestInstruction.java index eceed214c..8308cdeab 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ITypeTestInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ITypeTestInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface ITypeTestInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IUnaryOpInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IUnaryOpInstruction.java index 5b87ab455..fe25709e3 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IUnaryOpInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IUnaryOpInstruction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IUnaryOpInstruction extends IInstruction { diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IndirectionData.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IndirectionData.java index f2240bc7f..70248364c 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IndirectionData.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IndirectionData.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.shrikeBT; public interface IndirectionData { diff --git a/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BooleanSolver.java b/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BooleanSolver.java index cef7610dd..f397e8043 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BooleanSolver.java +++ b/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BooleanSolver.java @@ -1,5 +1,3 @@ -package com.ibm.wala.dataflow.graph; - /******************************************************************************* * Copyright (c) 2002 - 2006 IBM Corporation. * All rights reserved. This program and the accompanying materials @@ -10,6 +8,8 @@ package com.ibm.wala.dataflow.graph; * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ +package com.ibm.wala.dataflow.graph; + import com.ibm.wala.fixpoint.BooleanVariable; /** diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/debug/LoggingStopwatch.java b/com.ibm.wala.util/src/com/ibm/wala/util/debug/LoggingStopwatch.java index 401f2d0ff..f39ae0c68 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/debug/LoggingStopwatch.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/debug/LoggingStopwatch.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util.debug; /** diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/functions/VoidFunction.java b/com.ibm.wala.util/src/com/ibm/wala/util/functions/VoidFunction.java index f3ff46656..c02e42325 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/functions/VoidFunction.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/functions/VoidFunction.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util.functions; public interface VoidFunction { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java index 732ddeb94..c0eec4eb0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GXL.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util.graph; import java.util.Iterator; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSAllPathsFinder.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSAllPathsFinder.java index c658ec2cf..f7a4514df 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSAllPathsFinder.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSAllPathsFinder.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util.graph.traverse; import java.util.Iterator; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/WelshPowell.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/WelshPowell.java index 9785adf9d..4c9d425a7 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/WelshPowell.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/WelshPowell.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.util.graph.traverse; import java.util.Comparator; From 54593a8f4677222f07471806a859da39b3fdec9d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 22 May 2013 16:04:25 -0700 Subject: [PATCH 105/187] add code for field-based call graph --- .../callgraph/fieldbased/test/CGUtil.java | 148 ++++++++ .../fieldbased/test/FieldBasedCGTests.java | 135 +++++++ .../tests/fieldbased/callbacks.js | 14 + .../tests/fieldbased/callbacks2.js | 9 + .../examples-src/tests/fieldbased/lexical.js | 6 + .../examples-src/tests/fieldbased/new.js | 9 + .../examples-src/tests/fieldbased/oneshot.js | 5 + .../tests/fieldbased/reflective_calls.js | 9 + .../examples-src/tests/fieldbased/simple.js | 17 + com.ibm.wala.cast.js/META-INF/MANIFEST.MF | 3 + .../FieldBasedCallGraphBuilder.java | 242 ++++++++++++ .../JSMethodInstructionVisitor.java | 69 ++++ .../OptimisticCallgraphBuilder.java | 120 ++++++ .../PessimisticCallGraphBuilder.java | 134 +++++++ ...rklistBasedOptimisticCallgraphBuilder.java | 156 ++++++++ .../fieldbased/flowgraph/FlowGraph.java | 111 ++++++ .../flowgraph/FlowGraphBuilder.java | 358 ++++++++++++++++++ .../vertices/AbstractVertexVisitor.java | 55 +++ .../flowgraph/vertices/CallVertex.java | 67 ++++ .../flowgraph/vertices/FuncVertex.java | 47 +++ .../flowgraph/vertices/LexicalVarVertex.java | 42 ++ .../flowgraph/vertices/ParamVertex.java | 58 +++ .../flowgraph/vertices/PropVertex.java | 39 ++ .../flowgraph/vertices/RetVertex.java | 40 ++ .../flowgraph/vertices/UnknownVertex.java | 34 ++ .../flowgraph/vertices/VarVertex.java | 46 +++ .../fieldbased/flowgraph/vertices/Vertex.java | 22 ++ .../flowgraph/vertices/VertexFactory.java | 106 ++++++ .../flowgraph/vertices/VertexVisitor.java | 23 ++ 29 files changed, 2124 insertions(+) create mode 100644 com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/CGUtil.java create mode 100644 com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks2.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/lexical.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/new.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/oneshot.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/reflective_calls.js create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/simple.js create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/JSMethodInstructionVisitor.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/PessimisticCallGraphBuilder.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/WorklistBasedOptimisticCallgraphBuilder.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CallVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/LexicalVarVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/ParamVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/PropVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/RetVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/UnknownVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VarVertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/Vertex.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexFactory.java create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexVisitor.java diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/CGUtil.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/CGUtil.java new file mode 100644 index 000000000..857aaf3c5 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/CGUtil.java @@ -0,0 +1,148 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.rhino.callgraph.fieldbased.test; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import com.ibm.wala.cast.ipa.callgraph.CAstAnalysisScope; +import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; +import com.ibm.wala.cast.js.callgraph.fieldbased.FieldBasedCallGraphBuilder; +import com.ibm.wala.cast.js.callgraph.fieldbased.OptimisticCallgraphBuilder; +import com.ibm.wala.cast.js.callgraph.fieldbased.PessimisticCallGraphBuilder; +import com.ibm.wala.cast.js.callgraph.fieldbased.WorklistBasedOptimisticCallgraphBuilder; +import com.ibm.wala.cast.js.html.JSSourceExtractor; +import com.ibm.wala.cast.js.html.WebPageLoaderFactory; +import com.ibm.wala.cast.js.html.WebUtil; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; +import com.ibm.wala.cast.js.loader.JavaScriptLoader; +import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; +import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; +import com.ibm.wala.cast.js.util.CallGraph2JSON; +import com.ibm.wala.cast.js.util.Util; +import com.ibm.wala.classLoader.SourceModule; +import com.ibm.wala.classLoader.SourceURLModule; +import com.ibm.wala.ipa.callgraph.AnalysisCache; +import com.ibm.wala.ipa.callgraph.Entrypoint; +import com.ibm.wala.ipa.cha.ClassHierarchy; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.NullProgressMonitor; +import com.ibm.wala.util.WalaException; + +/** + * Utility class for building call graphs. + * + * @author mschaefer + * + */ +public class CGUtil { + public static enum BuilderType { PESSIMISTIC, OPTIMISTIC, OPTIMISTIC_WORKLIST }; + + private final JavaScriptTranslatorFactory translatorFactory; + + public CGUtil(JavaScriptTranslatorFactory translatorFactory) { + this.translatorFactory = translatorFactory; + } + + public JSCallGraph buildCG(URL url, BuilderType builderType) throws IOException, WalaException, Error { + JavaScriptLoader.addBootstrapFile(WebUtil.preamble); + SourceModule[] scripts = extractScript(url).toArray(new SourceModule[]{}); + JavaScriptLoaderFactory loaders = makeLoaderFactory(url); + CAstAnalysisScope scope = new CAstAnalysisScope(scripts, loaders, Collections.singleton(JavaScriptLoader.JS)); + IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); + Util.checkForFrontEndErrors(cha); + Iterable roots = JSCallGraphUtil.makeScriptRoots(cha); + FieldBasedCallGraphBuilder builder = null; + + AnalysisCache cache = new AnalysisCache(AstIRFactory.makeDefaultFactory()); + switch(builderType) { + case PESSIMISTIC: + builder = new PessimisticCallGraphBuilder(cha, JSCallGraphUtil.makeOptions(scope, cha, roots), cache); + break; + case OPTIMISTIC: + builder = new OptimisticCallgraphBuilder(cha, JSCallGraphUtil.makeOptions(scope, cha, roots), cache); + break; + case OPTIMISTIC_WORKLIST: + builder = new WorklistBasedOptimisticCallgraphBuilder(cha, JSCallGraphUtil.makeOptions(scope, cha, roots), cache); + break; + } + + try { + return builder.buildCallGraph(new NullProgressMonitor()); + } catch (CancelException e) { + return null; + } + } + + private JavaScriptLoaderFactory makeLoaderFactory(URL url) { + return url.getFile().endsWith(".js") ? new JavaScriptLoaderFactory(translatorFactory) : new WebPageLoaderFactory(translatorFactory); + } + + private Set extractScript(URL url) throws Error { + if(url.getFile().endsWith(".js")) { + return Collections.singleton(new SourceURLModule(url)); + } else { + return WebUtil.extractScriptFromHTML(url).fst; + } + } + + public static void main(String[] args) throws IOException, WalaException, Error { + JSSourceExtractor.DELETE_UPON_EXIT = true; + URL url = new File(args[0]).toURI().toURL(); + System.err.println("Analysing " + url); + Map> edges = CallGraph2JSON.extractEdges(new CGUtil(new CAstRhinoTranslatorFactory()).buildCG(url, BuilderType.OPTIMISTIC_WORKLIST)); + + for(Map.Entry> e : edges.entrySet()) { + String site = e.getKey(); + for(String callee : e.getValue()) + System.out.println(site + " -> " + callee); + } + } + + @SuppressWarnings("unused") + private static void compareCGs(Map> cg1, Map> cg2) { + boolean diff = false; + for(String key : cg1.keySet()) { + Set targets1 = cg1.get(key), targets2 = cg2.get(key); + if(targets2 == null) { + diff = true; + System.err.println("CG2 doesn't have call site" + key); + } else { + for(String target : targets1) + if(!targets2.contains(target)) { + diff = true; + System.err.println("CG2 doesn't have edge " + key + " -> " + target); + } + for(String target : targets2) + if(!targets1.contains(target)) { + diff = true; + System.err.println("CG1 doesn't have edge " + key + " -> " + target); + } + } + } + for(String key : cg2.keySet()) { + if(!cg1.containsKey(key)) { + diff = true; + System.err.println("CG1 doesn't have call site " + key); + } + } + if(!diff) + System.err.println("call graphs are identical"); + } +} diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java new file mode 100644 index 000000000..024545d72 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java @@ -0,0 +1,135 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.rhino.callgraph.fieldbased.test; + +import java.io.IOException; +import java.net.URL; +import java.util.Map; +import java.util.Set; + +import junit.framework.AssertionFailedError; + +import org.junit.Before; +import org.junit.Test; + +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph; +import com.ibm.wala.cast.js.rhino.callgraph.fieldbased.test.CGUtil.BuilderType; +import com.ibm.wala.cast.js.test.TestJSCallGraphShape; +import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.util.CallGraph2JSON; +import com.ibm.wala.util.WalaException; + +public class FieldBasedCGTests extends TestJSCallGraphShape { + protected CGUtil util; + + @Override + @Before + public void setUp() throws Exception { + util = new CGUtil(new CAstRhinoTranslatorFactory()); + } + + private void runTest(String script, Object[][] assertions, BuilderType... builderTypes) throws IOException, WalaException, Error { + for(BuilderType builderType : builderTypes) { + URL url = FieldBasedCGTests.class.getClassLoader().getResource(script); + JSCallGraph cg = util.buildCG(url, builderType); + System.out.println(cg); + try { + verifyGraphAssertions(cg, assertions); + } catch(AssertionFailedError afe) { + throw new AssertionFailedError(builderType + ": " + afe.getMessage()); + } + } + } + + @SuppressWarnings("unused") + private void dumpCG(JSCallGraph cg) { + CallGraph2JSON.IGNORE_HARNESS = false; + Map> edges = CallGraph2JSON.extractEdges(cg); + for(String callsite : edges.keySet()) + for(String callee : edges.get(callsite)) + System.out.println(callsite + " -> " + callee); + } + + private static final Object[][] assertionsForSimpleJS = new Object[][] { + new Object[] { ROOT, new String[] { "suffix:simple.js" } }, + new Object[] { "suffix:simple.js", new String[] { "suffix:foo", "suffix:bar", "suffix:A", "suffix:Function" } }, + new Object[] { "suffix:foo", new String[] { "suffix:bar" } }, + new Object[] { "suffix:aluis", new String[] { "suffix:aluis" } } + }; + + @Test + public void testSimpleJS() throws IOException, WalaException, Error { + runTest("tests/fieldbased/simple.js", assertionsForSimpleJS, BuilderType.PESSIMISTIC, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } + + private static final Object[][] assertionsForOneShot = new Object[][] { + new Object[] { ROOT, new String[] { "suffix:oneshot.js" } }, + new Object[] { "suffix:oneshot.js", new String[] { "suffix:f" } }, + new Object[] { "suffix:f", new String[] { "suffix:g" } } + }; + + @Test + public void testOneshot() throws IOException, WalaException, Error { + runTest("tests/fieldbased/oneshot.js", assertionsForOneShot, BuilderType.PESSIMISTIC, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } + + private static final Object[][] assertionsForCallbacks = new Object[][] { + new Object[] { ROOT, new String[] { "suffix:callbacks.js" } }, + new Object[] { "suffix:callbacks.js", new String[] { "suffix:f" } }, + new Object[] { "suffix:f", new String[] { "suffix:k", "suffix:n" } }, + new Object[] { "suffix:k", new String[] { "suffix:l", "suffix:p" } } + }; + + @Test + public void testCallbacks() throws IOException, WalaException, Error { + runTest("tests/fieldbased/callbacks.js", assertionsForCallbacks, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } + + private static final Object[][] assertionsForLexical = new Object[][] { + new Object[] { "suffix:h", new String[] { "suffix:g" } } + }; + + @Test + public void testLexical() throws IOException, WalaException, Error { + runTest("tests/fieldbased/lexical.js", assertionsForLexical, BuilderType.PESSIMISTIC, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } + + private static final Object[][] assertionsForReflectiveCall = new Object[][] { + new Object[] { "suffix:h", new String[] { "suffix:Function_prototype_call" } }, + new Object[] { "suffix:f", new String[] { "suffix:k" } } + }; + + @Test + public void testReflectiveCall() throws IOException, WalaException, Error { + runTest("tests/fieldbased/reflective_calls.js", assertionsForReflectiveCall, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } + + private static final Object[][] assertionsForNew = new Object[][] { + new Object[] { "suffix:new.js", new String[] { "suffix:g", "suffix:f" } }, + new Object[] { "suffix:g", new String[] { "!suffix:k" } } + }; + + @Test + public void testNew() throws IOException, WalaException, Error { + runTest("tests/fieldbased/new.js", assertionsForNew, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } + + private static final Object[][] assertionsForCallbacks2 = new Object[][] { + new Object[] { "suffix:callbacks2.js", new String[] { "suffix:g" } }, + new Object[] { "suffix:g", new String[] { "suffix:k", "!suffix:l" } } + }; + + @Test + public void testCallbacks2() throws IOException, WalaException, Error { + runTest("tests/fieldbased/callbacks2.js", assertionsForCallbacks2, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); + } +} diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks.js new file mode 100644 index 000000000..5927d20d1 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks.js @@ -0,0 +1,14 @@ +function f(g, h) { + g(h)(); +} + +function k(m) { + return m(); +} + +function l() { + return function n() {}; +} + +f(k, l); +k(function p(){}); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks2.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks2.js new file mode 100644 index 000000000..76a3eae9f --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/callbacks2.js @@ -0,0 +1,9 @@ +function f(x, y) { + return x; +} + +function g(h) { + h(); +} + +g(f(function k(){}, function l(){})); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/lexical.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/lexical.js new file mode 100644 index 000000000..8356184fc --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/lexical.js @@ -0,0 +1,6 @@ +function f() { + function g() {} + function h() { + g(); + } +} \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/new.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/new.js new file mode 100644 index 000000000..2b9980c38 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/new.js @@ -0,0 +1,9 @@ +function f() { + return this; +} + +function g(h) { + h(); +} + +g(new f(function k(){})); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/oneshot.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/oneshot.js new file mode 100644 index 000000000..0d8691e78 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/oneshot.js @@ -0,0 +1,5 @@ +function g() {} + +(function f($) { + $(); +})(g); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/reflective_calls.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/reflective_calls.js new file mode 100644 index 000000000..8df11c059 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/reflective_calls.js @@ -0,0 +1,9 @@ +function f(g) { + g(); +} + +function h() { + f.call(null, k); +} + +function k() {} diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/simple.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/simple.js new file mode 100644 index 000000000..ca6205fcb --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/fieldbased/simple.js @@ -0,0 +1,17 @@ +function A() {} + +function foo() { + return bar() + 19; +} + +function bar() { + return 23; +} + +var baz = function aluis() { + aluis(); +}; + +foo(); +this.bar(); +new A(); \ No newline at end of file diff --git a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF index 2695f013a..8eaedee6a 100644 --- a/com.ibm.wala.cast.js/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js/META-INF/MANIFEST.MF @@ -9,6 +9,9 @@ Bundle-Activator: com.ibm.wala.cast.js.JavaScriptPlugin Bundle-Vendor: IBM Export-Package: com.ibm.wala.cast.js, com.ibm.wala.cast.js.analysis.typeInference, + com.ibm.wala.cast.js.callgraph.fieldbased, + com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph, + com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices, com.ibm.wala.cast.js.cfg, com.ibm.wala.cast.js.client, com.ibm.wala.cast.js.client.impl, diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java new file mode 100644 index 000000000..015e7eee6 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/FieldBasedCallGraphBuilder.java @@ -0,0 +1,242 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +import com.ibm.wala.cast.ipa.callgraph.AstContextInsensitiveSSAContextInterpreter; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.FlowGraph; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.AbstractVertexVisitor; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CallVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VarVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.Vertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VertexFactory; +import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph; +import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptConstructTargetSelector; +import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptEntryPoints; +import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; +import com.ibm.wala.cast.js.types.JavaScriptTypes; +import com.ibm.wala.cast.types.AstMethodReference; +import com.ibm.wala.classLoader.CallSiteReference; +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ipa.callgraph.AnalysisCache; +import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.Context; +import com.ibm.wala.ipa.callgraph.Entrypoint; +import com.ibm.wala.ipa.callgraph.MethodTargetSelector; +import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; +import com.ibm.wala.ipa.callgraph.impl.ContextInsensitiveSelector; +import com.ibm.wala.ipa.callgraph.impl.Everywhere; +import com.ibm.wala.ipa.callgraph.propagation.cfa.DefaultSSAInterpreter; +import com.ibm.wala.ipa.callgraph.propagation.cfa.DelegatingSSAContextInterpreter; +import com.ibm.wala.ipa.callgraph.propagation.cfa.nCFAContextSelector; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.MonitorUtil.IProgressMonitor; +import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.collections.Util; + +/** + * Abstract call graph builder class for building a call graph from a field-based flow graph. + * The algorithm for building the flow graph is left unspecified, and is implemented differently + * by subclasses. + * + * @author mschaefer + * + */ +public abstract class FieldBasedCallGraphBuilder { + // class hierarchy of the program to be analysed + protected final IClassHierarchy cha; + + // standard call graph machinery + protected final AnalysisOptions options; + protected final AnalysisCache cache; + protected final MethodTargetSelector targetSelector; + + private static final boolean LOG_TIMINGS = true; + + public FieldBasedCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache) { + this.cha = cha; + this.options = options; + this.cache = cache; + this.targetSelector = setupMethodTargetSelector(cha, options); + } + + private MethodTargetSelector setupMethodTargetSelector(IClassHierarchy cha, AnalysisOptions options) { + MethodTargetSelector result = new JavaScriptConstructTargetSelector(cha, options.getMethodTargetSelector()); + if (options instanceof JSAnalysisOptions && ((JSAnalysisOptions)options).handleCallApply()) { + // TODO handle Function.prototype.apply + result = new JavaScriptFunctionDotCallTargetSelector(result); + } + return result; + } + + /** + * Build a flow graph for the program to be analysed. + */ + public abstract FlowGraph buildFlowGraph(IProgressMonitor monitor) throws CancelException; + + /** + * Main entry point: builds a flow graph, then extracts a call graph and returns it. + */ + public JSCallGraph buildCallGraph(IProgressMonitor monitor) throws CancelException { + long fgBegin, fgEnd, cgBegin, cgEnd; + + if(LOG_TIMINGS) fgBegin = System.currentTimeMillis(); + + FlowGraph flowGraph = buildFlowGraph(monitor); + + if(LOG_TIMINGS) { + fgEnd = System.currentTimeMillis(); + System.out.println("flow graph construction took " + (fgEnd-fgBegin)/1000.0 + " seconds"); + cgBegin = System.currentTimeMillis(); + } + + JSCallGraph cg = extract(flowGraph, monitor); + + if(LOG_TIMINGS) { + cgEnd = System.currentTimeMillis(); + System.out.println("call graph extraction took " + (cgEnd-cgBegin)/1000.0 + " seconds"); + } + + return cg; + } + + /** + * Extract a call graph from a given flow graph. + */ + @SuppressWarnings("deprecation") + protected JSCallGraph extract(FlowGraph flowgraph, IProgressMonitor monitor) throws CancelException { + // set up call graph + final JSCallGraph cg = new JSCallGraph(cha, options, cache); + cg.init(); + cg.setInterpreter(new DelegatingSSAContextInterpreter(new AstContextInsensitiveSSAContextInterpreter(options, cache), new DefaultSSAInterpreter(options, cache))); + + + // set up call edges from fake root to all script nodes + JavaScriptEntryPoints eps = new JavaScriptEntryPoints(cha, cha.getLoader(JavaScriptTypes.jsLoader)); + AbstractRootMethod fakeRootMethod = (AbstractRootMethod)cg.getFakeRootNode().getMethod(); + CGNode fakeRootNode = cg.findOrCreateNode(fakeRootMethod, Everywhere.EVERYWHERE); + for(Iterator iter = eps.iterator(); iter.hasNext();) { + Entrypoint ep = iter.next(); + CGNode nd = cg.findOrCreateNode(ep.getMethod(), Everywhere.EVERYWHERE); + SSAAbstractInvokeInstruction invk = ep.addCall(fakeRootMethod); + fakeRootNode.addTarget(invk.getCallSite(), nd); + } + // register the fake root as the "true" entrypoint + cg.registerEntrypoint(fakeRootNode); + + // now add genuine call edges + Set> edges = extractCallGraphEdges(flowgraph, monitor); + + + for (Pair edge : edges) { + CallVertex callVertex = edge.fst; + FuncVertex targetVertex = edge.snd; + IClass kaller = callVertex.getCaller().getIClass(); + CGNode caller = cg.findOrCreateNode(kaller.getMethod(AstMethodReference.fnSelector), Everywhere.EVERYWHERE); + CallSiteReference site = callVertex.getSite(); + IMethod target = targetSelector.getCalleeTarget(caller, site, targetVertex.getIClass()); + boolean isFunctionPrototypeCall = target != null + && target.getName().toString().startsWith(JavaScriptFunctionDotCallTargetSelector.SYNTHETIC_CALL_METHOD_PREFIX); + if (isFunctionPrototypeCall) { + handleFunctionPrototypeCallInvocation(flowgraph, monitor, cg, callVertex, caller, site, target); + } else { + addEdgeToJSCallGraph(cg, site, target, caller); + } + } + + return cg; + } + + private void handleFunctionPrototypeCallInvocation(FlowGraph flowgraph, IProgressMonitor monitor, final JSCallGraph cg, + CallVertex callVertex, CGNode caller, CallSiteReference site, + IMethod target) throws CancelException { + // use to get 1-level of call string for Function.prototype.call, to + // preserve the precision of the field-based call graph + final nCFAContextSelector functionPrototypeCallSelector = new nCFAContextSelector(1, new ContextInsensitiveSelector()); + Context calleeContext = functionPrototypeCallSelector.getCalleeTarget(caller, site, target, null); + addCGEdgeWithContext(cg, site, target, caller, calleeContext); + CGNode functionPrototypeCallNode = cg.findOrCreateNode(target, calleeContext); + // need to create nodes for reflective targets of call, and then add them + // as callees of the synthetic method + Collection reflectiveTargets = getReflectiveTargets(flowgraph, callVertex, monitor); + // there should only be one call site in the synthetic method + CallSiteReference reflectiveCallSite = functionPrototypeCallNode.getIR().iterateCallSites().next(); + for (FuncVertex f : reflectiveTargets) { + IMethod reflectiveTgtMethod = targetSelector.getCalleeTarget(functionPrototypeCallNode, reflectiveCallSite, f.getIClass()); + addEdgeToJSCallGraph(cg, reflectiveCallSite, reflectiveTgtMethod, functionPrototypeCallNode); + } + } + + private IMethod addEdgeToJSCallGraph(final JSCallGraph cg, CallSiteReference site, IMethod target, CGNode caller) + throws CancelException { + return addCGEdgeWithContext(cg, site, target, caller, Everywhere.EVERYWHERE); + } + + Everywhere targetContext = Everywhere.EVERYWHERE; + @SuppressWarnings("deprecation") + private IMethod addCGEdgeWithContext(final JSCallGraph cg, CallSiteReference site, IMethod target, CGNode caller, + Context targetContext) throws CancelException { + if(target != null) { + CGNode callee = cg.findOrCreateNode(target, targetContext); + // add nodes first, to be on the safe side + cg.addNode(caller); cg.addNode(callee); + // add callee as successor of caller + cg.addEdge(caller, callee); + // add as site-specific target + caller.addTarget(site, callee); + } + return target; + } + + /** + * Given a callVertex that can invoke Function.prototype.call, get the + * FuncVertex nodes for the reflectively-invoked methods + * @throws CancelException + */ + private Collection getReflectiveTargets(FlowGraph flowGraph, CallVertex callVertex, IProgressMonitor monitor) throws CancelException { + SSAAbstractInvokeInstruction invoke = callVertex.getInstruction(); + VarVertex functionParam = flowGraph.getVertexFactory().makeVarVertex(callVertex.getCaller(), invoke.getUse(1)); + return Util.filterByType(flowGraph.getReachingSet(functionParam, monitor), FuncVertex.class); + } + + /** + * Extract call edges from the flow graph into high-level representation. + */ + protected Set> extractCallGraphEdges(FlowGraph flowgraph, IProgressMonitor monitor) throws CancelException { + VertexFactory factory = flowgraph.getVertexFactory(); + final Set> result = HashSetFactory.make(); + + // find all pairs such that call is reachable from func in the flow graph + for(final CallVertex callVertex : factory.getCallVertices()) { + for(Vertex v : flowgraph.getReachingSet(callVertex, monitor)) { + v.accept(new AbstractVertexVisitor() { + @Override + public Void visitFuncVertex(FuncVertex funcVertex) { + result.add(Pair.make(callVertex, funcVertex)); + return null; + } + }); + } + } + + return result; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/JSMethodInstructionVisitor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/JSMethodInstructionVisitor.java new file mode 100644 index 000000000..be0eac149 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/JSMethodInstructionVisitor.java @@ -0,0 +1,69 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased; + +import com.ibm.wala.cast.ir.ssa.AstGlobalRead; +import com.ibm.wala.cast.js.ssa.JSAbstractInstructionVisitor; +import com.ibm.wala.cast.js.ssa.JavaScriptInvoke; +import com.ibm.wala.cast.js.types.JavaScriptMethods; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ssa.DefUse; +import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.ssa.SymbolTable; + +/** + * A {@link JSAbstractInstructionVisitor} that is used to only visit instructions of a single method. + * + * @author mschaefer + * + */ +public class JSMethodInstructionVisitor extends JSAbstractInstructionVisitor { + + protected final IMethod method; + protected final SymbolTable symtab; + protected final DefUse du; + + public JSMethodInstructionVisitor(IMethod method, SymbolTable symtab, DefUse du) { + this.method = method; + this.symtab = symtab; + this.du = du; + } + + /** + * Determine whether invk corresponds to a function declaration or function expression. + * + * TODO: A bit hackish. Is there a more principled way to do this? + */ + protected boolean isFunctionConstructorInvoke(JavaScriptInvoke invk) { + /* + * Function objects are allocated by explicit constructor invocations like this: + * + * v8 = global:global Function + * v4 = construct v8@2 v6:#L exception: + */ + if(invk.getDeclaredTarget().equals(JavaScriptMethods.ctorReference)) { + int fn = invk.getFunction(); + SSAInstruction fndef = du.getDef(fn); + if(fndef instanceof AstGlobalRead) { + AstGlobalRead agr = (AstGlobalRead)fndef; + if(agr.getGlobalName().equals("global Function")) { + if(invk.getNumberOfParameters() == 0) + return false; + // this may be a genuine use of "new Function()", not a declaration/expression + if(!symtab.isStringConstant(invk.getUse(1))) + return false; + return true; + } + } + } + return false; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java new file mode 100644 index 000000000..88306cda0 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java @@ -0,0 +1,120 @@ +package com.ibm.wala.cast.js.callgraph.fieldbased; + +import java.util.Set; + +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.FlowGraph; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.FlowGraphBuilder; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.CallVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VarVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.Vertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VertexFactory; +import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions; +import com.ibm.wala.cast.js.ssa.JavaScriptInvoke; +import com.ibm.wala.cast.js.types.JavaScriptMethods; +import com.ibm.wala.ipa.callgraph.AnalysisCache; +import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.MonitorUtil; +import com.ibm.wala.util.MonitorUtil.IProgressMonitor; +import com.ibm.wala.util.collections.HashSetFactory; +import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.collections.Util; +import com.ibm.wala.util.intset.OrdinalSet; + +/** + * Optimistic call graph builder that propagates inter-procedural data flow iteratively as + * call edges are discovered. Slower, but potentially more sound than {@link PessimisticCallGraphBuilder}. + * + * @author mschaefer + * + */ +public class OptimisticCallgraphBuilder extends FieldBasedCallGraphBuilder { + /** The maximum number of iterations to perform. */ + public int ITERATION_CUTOFF = Integer.MAX_VALUE; + + private final boolean handleCallApply; + + public OptimisticCallgraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache) { + super(cha, options, cache); + handleCallApply = options instanceof JSAnalysisOptions && ((JSAnalysisOptions)options).handleCallApply(); + } + + @Override + public FlowGraph buildFlowGraph(IProgressMonitor monitor) throws CancelException { + FlowGraphBuilder builder = new FlowGraphBuilder(cha, cache); + FlowGraph flowgraph = builder.buildFlowGraph(); + + // keep track of which call edges we already know about + Set> knownEdges = HashSetFactory.make(); + + // flag for fixpoint iteration + boolean changed = true; + int iter = 0; + + while(iter++ < ITERATION_CUTOFF && changed) { + MonitorUtil.throwExceptionIfCanceled(monitor); + changed = false; + + // extract all call edges from the flow graph + Set> newEdges = this.extractCallGraphEdges(flowgraph, monitor); + + for(Pair edge : newEdges) { + MonitorUtil.throwExceptionIfCanceled(monitor); + + // set changed to true if this is a new edge + boolean newEdge = knownEdges.add(edge); + changed = changed || newEdge; + + if(newEdge) { + // handle it + addEdge(flowgraph, edge.fst, edge.snd, monitor); + + // special handling of invocations of Function.prototype.call + // TODO: since we've just added some edges to the flow graph, its transitive closure will be + // recomputed here, which is slow and unnecessary + if(handleCallApply && edge.snd.getFullName().equals("Lprologue.js/Function_prototype_call")) + addReflectiveCallEdge(flowgraph, edge.fst, monitor); + } + } + } + + return flowgraph; + } + + // add flow corresponding to a new call edge + private void addEdge(FlowGraph flowgraph, CallVertex c, FuncVertex callee, IProgressMonitor monitor) throws CancelException { + VertexFactory factory = flowgraph.getVertexFactory(); + JavaScriptInvoke invk = c.getInstruction(); + FuncVertex caller = c.getCaller(); + + for(int i=1;i 1 || invk.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) + flowgraph.addEdge(factory.makeVarVertex(caller, invk.getUse(i)), factory.makeParamVertex(callee, i-1)); + + // flow from return vertex to result vertex + flowgraph.addEdge(factory.makeRetVertex(callee), factory.makeVarVertex(caller, invk.getDef())); + } + + // add data flow corresponding to a reflective invocation via Function.prototype.call + // NB: for f.call(...), f will _not_ appear as a call target, but the appropriate argument and return data flow will be set up + private void addReflectiveCallEdge(FlowGraph flowgraph, CallVertex c, IProgressMonitor monitor) throws CancelException { + VertexFactory factory = flowgraph.getVertexFactory(); + FuncVertex caller = c.getCaller(); + JavaScriptInvoke invk = c.getInstruction(); + + VarVertex receiverVertex = factory.makeVarVertex(caller, invk.getUse(1)); + OrdinalSet reachingSet = flowgraph.getReachingSet(receiverVertex, monitor); + Set realCallees = Util.filterByType(reachingSet, FuncVertex.class); + for(FuncVertex realCallee: realCallees) { + // flow from arguments to parameters + for(int i=2;i uses = du.getUses(defn);uses.hasNext();) { + SSAInstruction use = uses.next(); + + // check whether this is a local call + if(use instanceof JavaScriptInvoke && ((JavaScriptInvoke)use).getFunction() == defn) { + JavaScriptInvoke use_invk = (JavaScriptInvoke)use; + + // yes, so add edges from arguments to parameters... + for(int i=2;i> extractCallGraphEdges(FlowGraph flowgraph, IProgressMonitor monitor) throws CancelException { + VertexFactory factory = flowgraph.getVertexFactory(); + Set worklist = HashSetFactory.make(); + Map> reachingFunctions = HashMapFactory.make(); + Map reflectiveCalleeVertices = HashMapFactory.make(); + + for(Vertex v : flowgraph) { + if(v instanceof FuncVertex) { + FuncVertex fv = (FuncVertex)v; + worklist.add(fv); + MapUtil.findOrCreateSet(reachingFunctions, fv).add(fv); + } + } + + while(!worklist.isEmpty()) { + MonitorUtil.throwExceptionIfCanceled(monitor); + + Vertex v = worklist.iterator().next(); + worklist.remove(v); + Set vReach = MapUtil.findOrCreateSet(reachingFunctions, v); + for(Vertex w : Iterator2Iterable.make(flowgraph.getSucc(v))) { + MonitorUtil.throwExceptionIfCanceled(monitor); + + Set wReach = MapUtil.findOrCreateSet(reachingFunctions, w); + boolean changed = false; + if(w instanceof CallVertex) { + for(FuncVertex fv : vReach) { + if(wReach.add(fv)) { + changed = true; + addCallEdge(flowgraph, (CallVertex)w, fv, worklist); + + // special handling of invocations of Function.prototype.call + if(handleCallApply && changed && fv.getFullName().equals("Lprologue.js/Function_prototype_call")) { + JavaScriptInvoke invk = ((CallVertex)w).getInstruction(); + VarVertex reflectiveCalleeVertex = factory.makeVarVertex(((CallVertex)w).getCaller(), invk.getUse(1)); + reflectiveCalleeVertices.put(reflectiveCalleeVertex, invk); + for(FuncVertex fw : MapUtil.findOrCreateSet(reachingFunctions, reflectiveCalleeVertex)) + addReflectiveCallEdge(flowgraph, reflectiveCalleeVertex, invk, fw, worklist); + } + } + } + } else if(handleCallApply && reflectiveCalleeVertices.containsKey(w)) { + JavaScriptInvoke invk = reflectiveCalleeVertices.get(w); + for(FuncVertex fv : vReach) { + if(wReach.add(fv)) { + changed = true; + addReflectiveCallEdge(flowgraph, (VarVertex)w, invk, fv, worklist); + } + } + } else { + + changed = wReach.addAll(vReach); + } + if(changed) + worklist.add(w); + } + } + + Set> res = HashSetFactory.make(); + for(Vertex v : reachingFunctions.keySet()) + if(v instanceof CallVertex) + for(FuncVertex fv : reachingFunctions.get(v)) + res.add(Pair.make((CallVertex)v, fv)); + return res; + } + + // add flow corresponding to a new call edge + private void addCallEdge(FlowGraph flowgraph, CallVertex c, FuncVertex callee, Set worklist) throws CancelException { + VertexFactory factory = flowgraph.getVertexFactory(); + FuncVertex caller = c.getCaller(); + JavaScriptInvoke invk = c.getInstruction(); + + for(int i=1;i 1 || invk.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) + addFlowEdge(flowgraph, factory.makeVarVertex(caller, invk.getUse(i)), factory.makeParamVertex(callee, i-1), worklist); + } + + // flow from return vertex to result vertex + addFlowEdge(flowgraph, factory.makeRetVertex(callee), factory.makeVarVertex(caller, invk.getDef()), worklist); + } + + public void addFlowEdge(FlowGraph flowgraph, Vertex from, Vertex to, Set worklist) { + flowgraph.addEdge(from, to); + worklist.add(from); + } + + // add data flow corresponding to a reflective invocation via Function.prototype.call + // NB: for f.call(...), f will _not_ appear as a call target, but the appropriate argument and return data flow will be set up + private void addReflectiveCallEdge(FlowGraph flowgraph, VarVertex reflectiveCallee, JavaScriptInvoke invk, FuncVertex realCallee, Set worklist) throws CancelException { + VertexFactory factory = flowgraph.getVertexFactory(); + FuncVertex caller = reflectiveCallee.getFunction(); + + // flow from arguments to parameters + for(int i=2;i { + // the actual flow graph representation + private final NumberedGraph graph; + + // a factory that allows us to build canonical vertices + private final VertexFactory factory; + + // the transitive closure of the inverse of this.graph, + // but without paths going through the Unknown vertex + private GraphReachability optimistic_closure; + + public FlowGraph() { + this.graph = new SlowSparseNumberedGraph(1); + this.factory = new VertexFactory(); + } + + // (re-)compute optimistic_closure + private void compute_optimistic_closure(IProgressMonitor monitor) throws CancelException { + if(optimistic_closure != null) + return; + + // prune flowgraph by taking out 'unknown' vertex + Graph pruned_flowgraph = GraphSlicer.prune(graph, new Predicate() { + @Override + public boolean test(Vertex t) { + return t.accept(new AbstractVertexVisitor() { + @Override + public Boolean visitVertex(Vertex vertex) { + return true; + } + + @Override + public Boolean visitUnknownVertex(UnknownVertex unknownVertex) { + return false; + } + }); + } + }); + + // compute transitive closure + optimistic_closure = new GraphReachability(new InvertedGraph(pruned_flowgraph), + IndiscriminateFilter.singleton()); + optimistic_closure.solve(monitor); + } + + public VertexFactory getVertexFactory() { + return factory; + } + + /** + * Adds an edge from vertex from to vertex to, adding the vertices + * to the graph if they are not in there yet. + */ + public void addEdge(Vertex from, Vertex to) { + if(!graph.containsNode(from)) + graph.addNode(from); + if(!graph.containsNode(to)) + graph.addNode(to); + + if(!graph.hasEdge(from, to)) { + optimistic_closure = null; + graph.addEdge(from, to); + } + } + + /** + * Computes the set of vertices that may reach dest along paths not containing an + * {@link UnknownVertex}. + */ + public OrdinalSet getReachingSet(Vertex dest, IProgressMonitor monitor) throws CancelException { + if(!graph.containsNode(dest)) + return OrdinalSet.empty(); + + compute_optimistic_closure(monitor); + return optimistic_closure.getReachableSet(dest); + } + + public Iterator getSucc(Vertex v) { + return graph.getSuccNodes(v); + } + + public Iterator iterator() { + return graph.iterator(); + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java new file mode 100644 index 000000000..9ee8456cb --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java @@ -0,0 +1,358 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph; + +import java.util.Iterator; + +import com.ibm.wala.cast.ir.ssa.AstGlobalRead; +import com.ibm.wala.cast.ir.ssa.AstGlobalWrite; +import com.ibm.wala.cast.ir.ssa.AstLexicalAccess.Access; +import com.ibm.wala.cast.ir.ssa.AstLexicalRead; +import com.ibm.wala.cast.ir.ssa.AstLexicalWrite; +import com.ibm.wala.cast.js.callgraph.fieldbased.JSMethodInstructionVisitor; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.FuncVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VarVertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.Vertex; +import com.ibm.wala.cast.js.callgraph.fieldbased.flowgraph.vertices.VertexFactory; +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.types.JavaScriptMethods; +import com.ibm.wala.cast.js.types.JavaScriptTypes; +import com.ibm.wala.cast.loader.AstMethod; +import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; +import com.ibm.wala.cast.types.AstMethodReference; +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ipa.callgraph.AnalysisCache; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ssa.IR; +import com.ibm.wala.ssa.SSAGetCaughtExceptionInstruction; +import com.ibm.wala.ssa.SSAGetInstruction; +import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.ssa.SSAPhiInstruction; +import com.ibm.wala.ssa.SSAPutInstruction; +import com.ibm.wala.ssa.SSAReturnInstruction; +import com.ibm.wala.ssa.SSAThrowInstruction; +import com.ibm.wala.types.TypeReference; +import com.ibm.wala.util.intset.EmptyIntSet; +import com.ibm.wala.util.intset.IntSet; + +/** + * Class for building intra-procedural flow graphs for a given class hierarchy. + * + * @author mschaefer + */ +public class FlowGraphBuilder { + private final IClassHierarchy cha; + private final AnalysisCache cache; + + public FlowGraphBuilder(IClassHierarchy cha, AnalysisCache cache) { + this.cha = cha; + this.cache = cache; + } + + /** + * This is the main entry point of the flow graph builder. + * + *

+ * It creates a new, empty flow graph, adds nodes for a small number of special primitive + * functions such as Object and Function and sets up flow + * edges to make them flow into the corresponding global variables. Then it iterates over + * all functions in the class hierarchy and all their IR instructions, and adds the + * flow edges induced by these instructions. + *

+ * + * @return the completed flow graph + */ + public FlowGraph buildFlowGraph() { + FlowGraph flowgraph = new FlowGraph(); + + addPrimitives(flowgraph); + + for(IClass klass : cha) { + for(IMethod method : klass.getDeclaredMethods()) { + if(method.getDescriptor().equals(AstMethodReference.fnDesc)) { + IR ir = cache.getIR(method); + FlowGraphSSAVisitor visitor = new FlowGraphSSAVisitor(ir, flowgraph); + + // first visit normal instructions + SSAInstruction[] normalInstructions = ir.getInstructions(); + for(int i=0;i iter=ir.iteratePhis();iter.hasNext();) + iter.next().visit(visitor); + + for(Iterator iter=ir.iterateCatchInstructions();iter.hasNext();) + iter.next().visit(visitor); + } + } + } + + return flowgraph; + } + + // primitive functions that are treated specially + private static String[] primitiveFunctions = { "Object", "Function", "Array", "String", "Number", "RegExp" }; + + /** + * Add flows from the special primitive functions to the corresponding global variables. + * + * @param flowgraph the flow graph under construction + */ + private void addPrimitives(FlowGraph flowgraph) { + VertexFactory factory = flowgraph.getVertexFactory(); + for(String pf : primitiveFunctions) { + TypeReference typeref = TypeReference.findOrCreate(JavaScriptTypes.jsLoader, "L" + pf); + IClass klass = cha.lookupClass(typeref); + flowgraph.addEdge(factory.makeFuncVertex(klass), factory.makePropVertex(pf)); + } + } + + /** + * Visitor class that does the heavy lifting (such as it is) of flow graph construction, adding flow graph + * edges for every instruction in the method IR. + * + *

+ * The only slightly tricky thing are assignments to exposed variables inside their defining function. In + * the IR, they initially appear as normal SSA variable assignments, without any indication of their lexical + * nature. The normal call graph construction logic does something convoluted to fix this up later when + * an actual lexical access is encountered. + *

+ * + *

+ * We use a much simpler approach. Whenever we see an assignment vi = e, we ask the + * enclosing function whether vi is an exposed variable. If it is, we determine its + * source-level names x1, x2, ..., xn, and then add edges + * corresponding to lexical writes of vi into all the xj. + *

+ * + * @author mschaefer + */ + private class FlowGraphSSAVisitor extends JSMethodInstructionVisitor { + // whether to handle dynamic property accesses with a constant property name as normal property accesses + public static final boolean HANDLE_DYNAMIC_PROP_ACC = false; + + // index of the instruction currently visited; -1 if the instruction isn't a normal instruction + public int instructionIndex = -1; + + // flow graph being built + private final FlowGraph flowgraph; + + // vertex factory to use for constructing new vertices + private final VertexFactory factory; + + // lexical information about the current function + private final LexicalInformation lexicalInfo; + + // the set of SSA variables in the current function that are accessed by nested functions + private final IntSet exposedVars; + + // the IR of the current function + private final IR ir; + + // the function vertex corresponding to the current function + private final FuncVertex func; + + public FlowGraphSSAVisitor(IR ir, FlowGraph flowgraph) { + super(ir.getMethod(), ir.getSymbolTable(), cache.getDefUse(ir)); + this.ir = ir; + this.flowgraph = flowgraph; + this.factory = flowgraph.getVertexFactory(); + this.func = this.factory.makeFuncVertex(ir.getMethod().getDeclaringClass()); + if(method instanceof AstMethod) { + this.lexicalInfo = ((AstMethod)method).lexicalInfo(); + this.exposedVars = lexicalInfo.getAllExposedUses(); + } else { + this.lexicalInfo = null; + this.exposedVars = EmptyIntSet.instance; + } + } + + // add extra flow from v_def to every lexical variable it may correspond to at source-level + private void handleLexicalDef(int def) { + assert def != -1; + if(instructionIndex != -1 && exposedVars.contains(def)) { + VarVertex v = factory.makeVarVertex(func, def); + for(String localName : ir.getLocalNames(instructionIndex, def)) + flowgraph.addEdge(v, factory.makeLexicalAccessVertex(lexicalInfo.getScopingName(), localName)); + } + } + + @Override + public void visitPhi(SSAPhiInstruction phi) { + int n = phi.getNumberOfUses(); + VarVertex w = factory.makeVarVertex(func, phi.getDef()); + for(int i=0;i implements VertexVisitor { + public T visitVertex(Vertex vertex) { + return null; + } + + public T visitVarVertex(VarVertex varVertex) { + return visitVertex(varVertex); + } + + public T visitPropVertex(PropVertex propVertex) { + return visitVertex(propVertex); + } + + public T visitUnknownVertex(UnknownVertex unknownVertex) { + return visitVertex(unknownVertex); + } + + public T visitFuncVertex(FuncVertex funcVertex) { + return visitVertex(funcVertex); + } + + public T visitParamVertex(ParamVertex paramVertex) { + return visitVertex(paramVertex); + } + + public T visitRetVertex(RetVertex retVertex) { + return visitVertex(retVertex); + } + + public T visitCalleeVertex(CallVertex calleeVertex) { + return visitVertex(calleeVertex); + } + + public T visitLexicalAccessVertex(LexicalVarVertex lexicalAccessVertex) { + return visitVertex(lexicalAccessVertex); + } + +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CallVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CallVertex.java new file mode 100644 index 000000000..57d44a6d7 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/CallVertex.java @@ -0,0 +1,67 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +import com.ibm.wala.cast.js.ssa.JavaScriptInvoke; +import com.ibm.wala.cast.js.types.JavaScriptMethods; +import com.ibm.wala.classLoader.CallSiteReference; + +/** + * A call vertex represents the possible callees of a function call or new expression. + * + * @author mschaefer + * + */ +public class CallVertex extends Vertex { + // method containing the call + private final FuncVertex func; + + // PC of the call site + private final CallSiteReference site; + + // the call instruction itself + private final JavaScriptInvoke invk; + + CallVertex(FuncVertex func, CallSiteReference site, JavaScriptInvoke invk) { + this.func = func; + this.site = site; + this.invk = invk; + } + + public FuncVertex getCaller() { + return func; + } + + public CallSiteReference getSite() { + return site; + } + + public JavaScriptInvoke getInstruction() { + return invk; + } + + /** + * Does this call vertex correspond to a new instruction? + */ + public boolean isNew() { + return site.getDeclaredTarget() == JavaScriptMethods.ctorReference; + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitCalleeVertex(this); + } + + @Override + public String toString() { + return "Callee(" + func + ", " + site + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java new file mode 100644 index 000000000..9dde6db04 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/FuncVertex.java @@ -0,0 +1,47 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +import com.ibm.wala.classLoader.IClass; + +/** + * A function vertex represents a function object (or, more precisely, all function objects + * arising from a single function expression or declaration). + * + * @author mschaefer + */ +public class FuncVertex extends Vertex { + // the IClass representing this function in the class hierarchy + private final IClass klass; + + FuncVertex(IClass method) { + this.klass = method; + } + + public IClass getIClass() { + return klass; + } + + public String getFullName() { + return klass.getName().toString(); + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitFuncVertex(this); + } + + @Override + public String toString() { + String methodName = klass.getName().toString(); + return "Func(" + methodName.substring(methodName.lastIndexOf('/')+1) + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/LexicalVarVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/LexicalVarVertex.java new file mode 100644 index 000000000..74a7c037b --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/LexicalVarVertex.java @@ -0,0 +1,42 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +/** + * A lexical access vertex represents a lexical variable, i.e., a local variable + * that is accessed from within a nested function. It is identified by the name + * of its defining function, and its own name. + * + * @author mschaefer + * + */ +public class LexicalVarVertex extends Vertex { + // name of the function defining this lexical variable + private final String definer; + + // name of the lexical variable itself + private final String name; + + LexicalVarVertex(String definer, String name) { + this.definer = definer; + this.name = name; + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitLexicalAccessVertex(this); + } + + @Override + public String toString() { + return "LexVar(" + definer.substring(definer.lastIndexOf('/')+1) + ", " + name + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/ParamVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/ParamVertex.java new file mode 100644 index 000000000..1c14c050b --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/ParamVertex.java @@ -0,0 +1,58 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + + +/** + * A parameter vertex represents a positional parameter of a function. It doesn't + * necessarily need to correspond to a named parameter. + * + *

+ * Numbering of positional parameters is 1-based, with parameter 0 being the + * this value. + *

+ * + *

+ * A named parameter is an ordinary SSA variable, hence it is represented as + * a {@link VarVertex}. The flow graph builder sets up edges between parameter + * vertices and their corresponding variable vertices for named parameters. + *

+ * + * @author mschaefer + * + */ +public class ParamVertex extends Vertex { + private FuncVertex func; + private int index; + + ParamVertex(FuncVertex func, int index) { + this.func = func; + this.index = index; + } + + public FuncVertex getFunc() { + return func; + } + + public int getIndex() { + return index; + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitParamVertex(this); + } + + @Override + public String toString() { + return "Param(" + func + ", " + index + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/PropVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/PropVertex.java new file mode 100644 index 000000000..4202e8387 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/PropVertex.java @@ -0,0 +1,39 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +/** + * A property vertex represents all properties with a given name. + * + * @author mschaefer + * + */ +public class PropVertex extends Vertex { + private final String propName; + + PropVertex(String propName) { + this.propName = propName; + } + + public String getPropName() { + return propName; + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitPropVertex(this); + } + + @Override + public String toString() { + return "Prop(" + propName + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/RetVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/RetVertex.java new file mode 100644 index 000000000..1d8b1a7a7 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/RetVertex.java @@ -0,0 +1,40 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + + +/** + * A return vertex represents all return values of a given function. + * + * @author mschaefer + * + */ +public class RetVertex extends Vertex { + private final FuncVertex func; + + RetVertex(FuncVertex func) { + this.func = func; + } + + public FuncVertex getFunc() { + return func; + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitRetVertex(this); + } + + @Override + public String toString() { + return "Ret(" + func + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/UnknownVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/UnknownVertex.java new file mode 100644 index 000000000..8d8252b31 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/UnknownVertex.java @@ -0,0 +1,34 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +/** + * The unknown vertex is used to model complicated data flow. For instance, thrown + * exceptions flow into Unknown, and catch blocks read their values from it. + * + * @author mschaefer + * + */ +public class UnknownVertex extends Vertex { + public static final UnknownVertex INSTANCE = new UnknownVertex(); + + private UnknownVertex() {} + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitUnknownVertex(this); + } + + @Override + public String toString() { + return "Unknown"; + } +} \ No newline at end of file diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VarVertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VarVertex.java new file mode 100644 index 000000000..100ce2bb1 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VarVertex.java @@ -0,0 +1,46 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + + +/** + * A variable vertex represents an SSA variable inside a given function. + * + * @author mschaefer + * + */ +public final class VarVertex extends Vertex { + private final FuncVertex func; + private final int valueNumber; + + VarVertex(FuncVertex func, int valueNumber) { + this.func = func; + this.valueNumber = valueNumber; + } + + public FuncVertex getFunction() { + return func; + } + + public int getValueNumber() { + return valueNumber; + } + + @Override + public T accept(VertexVisitor visitor) { + return visitor.visitVarVertex(this); + } + + @Override + public String toString() { + return "Var(" + func + ", " + valueNumber + ")"; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/Vertex.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/Vertex.java new file mode 100644 index 000000000..4ade6d202 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/Vertex.java @@ -0,0 +1,22 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +/** + * Class representing a flow graph vertex. Vertices should never be instantiated + * directly, but rather generated through a {@link VertexFactory}. + * + * @author mschaefer + * + */ +public abstract class Vertex { + public abstract T accept(VertexVisitor visitor); +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexFactory.java new file mode 100644 index 000000000..93581b13f --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexFactory.java @@ -0,0 +1,106 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + +import java.util.Map; + +import com.ibm.wala.cast.js.ssa.JavaScriptInvoke; +import com.ibm.wala.classLoader.CallSiteReference; +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.collections.Pair; + +/** + * A vertex factory is associated with a flow graph. It manages its vertex set, making sure that + * vertices aren't unnecessarily created twice. + * + * @author mschaefer + * + */ +public class VertexFactory { + private final Map, CallVertex> callVertexCache = HashMapFactory.make(); + private final Map funcVertexCache = HashMapFactory.make(); + private final Map, ParamVertex> paramVertexCache = HashMapFactory.make(); + private final Map propVertexCache = HashMapFactory.make(); + private final Map retVertexCache = HashMapFactory.make(); + private final Map, VarVertex> varVertexCache = HashMapFactory.make(); + private final Map, LexicalVarVertex> lexicalAccessVertexCache = HashMapFactory.make(); + + public CallVertex makeCallVertex(FuncVertex func, JavaScriptInvoke invk) { + CallSiteReference site = invk.getCallSite(); + Pair key = Pair.make(func, site); + CallVertex value = callVertexCache.get(key); + if(value == null) + callVertexCache.put(key, value = new CallVertex(func, site, invk)); + return value; + } + + public Iterable getCallVertices() { + return callVertexCache.values(); + } + + public FuncVertex makeFuncVertex(IClass klass) { + FuncVertex value = funcVertexCache.get(klass); + if(value == null) + funcVertexCache.put(klass, value = new FuncVertex(klass)); + return value; + } + + public Iterable getFuncVertices() { + return funcVertexCache.values(); + } + + public ParamVertex makeParamVertex(FuncVertex func, int index) { + Pair key = Pair.make(func, index); + ParamVertex value = paramVertexCache.get(key); + if(value == null) + paramVertexCache.put(key, value = new ParamVertex(func, index)); + return value; + } + + public PropVertex makePropVertex(String name) { + PropVertex value = propVertexCache.get(name); + if(value == null) + propVertexCache.put(name, value = new PropVertex(name)); + return value; + } + + public Iterable getPropVertices() { + return propVertexCache.values(); + } + + public RetVertex makeRetVertex(FuncVertex func) { + RetVertex value = retVertexCache.get(func); + if(value == null) + retVertexCache.put(func, value = new RetVertex(func)); + return value; + } + + public UnknownVertex makeUnknownVertex() { + return UnknownVertex.INSTANCE; + } + + public VarVertex makeVarVertex(FuncVertex func, int valueNumber) { + Pair key = Pair.make(func, valueNumber); + VarVertex value = varVertexCache.get(key); + if(value == null) + varVertexCache.put(key, value = new VarVertex(func, valueNumber)); + return value; + } + + public LexicalVarVertex makeLexicalAccessVertex(String definer, String name) { + Pair key = Pair.make(definer, name); + LexicalVarVertex value = lexicalAccessVertexCache.get(key); + if(value == null) + lexicalAccessVertexCache.put(key, value = new LexicalVarVertex(definer, name)); + return value; + } +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexVisitor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexVisitor.java new file mode 100644 index 000000000..ee70f573e --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/VertexVisitor.java @@ -0,0 +1,23 @@ +/****************************************************************************** + * Copyright (c) 2002 - 2012 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.js.callgraph.fieldbased.flowgraph.vertices; + + +public interface VertexVisitor { + public abstract T visitVarVertex(VarVertex varVertex); + public abstract T visitPropVertex(PropVertex propVertex); + public abstract T visitUnknownVertex(UnknownVertex unknownVertex); + public abstract T visitFuncVertex(FuncVertex funcVertex); + public abstract T visitParamVertex(ParamVertex paramVertex); + public abstract T visitRetVertex(RetVertex retVertex); + public abstract T visitCalleeVertex(CallVertex calleeVertex); + public abstract T visitLexicalAccessVertex(LexicalVarVertex lexicalAccessVertex); +} From faff1a91255a327d0ced0260b1714b683b8b5a4d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 22 May 2013 16:21:33 -0700 Subject: [PATCH 106/187] add copyright headers --- .../fieldbased/OptimisticCallgraphBuilder.java | 10 ++++++++++ .../WorklistBasedOptimisticCallgraphBuilder.java | 10 ++++++++++ .../js/callgraph/fieldbased/flowgraph/FlowGraph.java | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java index 88306cda0..ebd148248 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/OptimisticCallgraphBuilder.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.callgraph.fieldbased; import java.util.Set; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/WorklistBasedOptimisticCallgraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/WorklistBasedOptimisticCallgraphBuilder.java index 134cb67e4..d3b096fb5 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/WorklistBasedOptimisticCallgraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/WorklistBasedOptimisticCallgraphBuilder.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.callgraph.fieldbased; import java.util.Map; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java index 8acbdbf53..393287ffb 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * 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.js.callgraph.fieldbased.flowgraph; import java.util.Iterator; From 7064233320691b9ec7ddca4c4cb287668886d8f9 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 22 May 2013 16:41:27 -0700 Subject: [PATCH 107/187] remove print --- .../js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java index 024545d72..808bda407 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java @@ -41,7 +41,6 @@ public class FieldBasedCGTests extends TestJSCallGraphShape { for(BuilderType builderType : builderTypes) { URL url = FieldBasedCGTests.class.getClassLoader().getResource(script); JSCallGraph cg = util.buildCG(url, builderType); - System.out.println(cg); try { verifyGraphAssertions(cg, assertions); } catch(AssertionFailedError afe) { From dc03348bced3205ee09c7b377580cad64af4e9d5 Mon Sep 17 00:00:00 2001 From: Andreas Sewe Date: Fri, 24 May 2013 10:25:01 +0200 Subject: [PATCH 108/187] Fix thread-safety bug in BytecodeClass.computeMethodMap The map must not be modified after BytecodeClass.methodMap has become non-null. --- .../src/com/ibm/wala/classLoader/BytecodeClass.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index 7a9e6bb9a..5b3d235cb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -554,15 +554,19 @@ public abstract class BytecodeClass implements IClass { synchronized (this) { if (methodMap == null) { IMethod[] methods = computeDeclaredMethods(); + + final Map tmpMethodMap; if (methods.length > 5) { - methodMap = HashMapFactory.make(methods.length); + tmpMethodMap = HashMapFactory.make(methods.length); } else { - methodMap = new SmallMap(); + tmpMethodMap= new SmallMap(); } for (int i = 0; i < methods.length; i++) { IMethod m = methods[i]; - methodMap.put(m.getReference().getSelector(), m); + tmpMethodMap.put(m.getReference().getSelector(), m); } + + methodMap = tmpMethodMap; } } } From e82556450b8a9e0c8a721d00e7d5ed4068033e80 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 24 May 2013 21:23:57 -0700 Subject: [PATCH 109/187] enable maven building of wala.core.testdata, and use project-specific compile settings --- com.ibm.wala.core.testdata/build.xml | 3 +++ com.ibm.wala.core.testdata/pom.xml | 31 ++++++++++++++++++++++++++++ pom.xml | 7 +++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core.testdata/build.xml b/com.ibm.wala.core.testdata/build.xml index f88d677eb..a489bada5 100644 --- a/com.ibm.wala.core.testdata/build.xml +++ b/com.ibm.wala.core.testdata/build.xml @@ -18,7 +18,10 @@ on Mac OS X 10.6 (Java version 1.6.0_22). If you are not using this version of Mac OS X or Java, try changing the value of the property to "${java.home}/../../../Classes" --> + + + diff --git a/com.ibm.wala.core.testdata/pom.xml b/com.ibm.wala.core.testdata/pom.xml index 4eabfb994..c197495c6 100644 --- a/com.ibm.wala.core.testdata/pom.xml +++ b/com.ibm.wala.core.testdata/pom.xml @@ -9,4 +9,35 @@ com.ibm.wala.core.testdata eclipse-plugin + + + + maven-antrun-plugin + 1.7 + + + process-resources + + + + + + + + run + + + + + + com.sun + tools + 1.7 + system + ${java.home}/../lib/tools.jar + + + + + diff --git a/pom.xml b/pom.xml index 7e940677e..8ab63a91d 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,8 @@ targets + com.ibm.wala.core.testdata + com.ibm.wala-feature com.ibm.wala.core com.ibm.wala.shrike @@ -26,8 +28,6 @@ com.ibm.wala.cast com.ibm.wala.cast.java - com.ibm.wala.cast.java.polyglot com.ibm.wala.cast.js com.ibm.wala.cast.js.rhino @@ -68,6 +68,9 @@ 1.6 1.6 + + ${project.basedir}/.settings/org.eclipse.jdt.core.prefs + From 7ca109967d7f3fbd43d58209023063766d3406e0 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 25 May 2013 16:05:25 -0700 Subject: [PATCH 110/187] read J2SE jars from bootclasspath if wala.properties cannot be loaded --- .../ibm/wala/properties/WalaProperties.java | 11 +++++---- .../src/com/ibm/wala/util/PlatformUtil.java | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/properties/WalaProperties.java b/com.ibm.wala.core/src/com/ibm/wala/properties/WalaProperties.java index 6afdba5a9..fdfcf9554 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/properties/WalaProperties.java +++ b/com.ibm.wala.core/src/com/ibm/wala/properties/WalaProperties.java @@ -17,6 +17,7 @@ import java.net.URL; import java.util.Collection; import java.util.Properties; +import com.ibm.wala.util.PlatformUtil; import com.ibm.wala.util.WalaException; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.io.FileProvider; @@ -38,15 +39,17 @@ public final class WalaProperties { /** * Determine the classpath noted in wala.properties for J2SE standard libraries - * @throws IllegalStateException if there's a problem loading the wala properties + * + * If wala.properties cannot be loaded, returns jar files in boot classpath. + * @throws IllegalStateException if jar files cannot be discovered + * @see PlatformUtil#getBootClassPathJars() */ public static String[] getJ2SEJarFiles() { Properties p = null; try { p = WalaProperties.loadProperties(); } catch (WalaException e) { - e.printStackTrace(); - throw new IllegalStateException("problem loading wala.properties"); + return PlatformUtil.getBootClassPathJars(); } String dir = p.getProperty(WalaProperties.J2SE_DIR); @@ -99,7 +102,7 @@ public final class WalaProperties { return result; } catch (Exception e) { - e.printStackTrace(); +// e.printStackTrace(); throw new WalaException("Unable to set up wala properties ", e); } } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/PlatformUtil.java b/com.ibm.wala.util/src/com/ibm/wala/util/PlatformUtil.java index f72157ae4..d950939f6 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/PlatformUtil.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/PlatformUtil.java @@ -10,6 +10,9 @@ *******************************************************************************/ package com.ibm.wala.util; +import java.io.File; +import java.util.ArrayList; + /** * Platform-specific utility functions. */ @@ -47,4 +50,24 @@ public class PlatformUtil { return "IKVM.NET".equals(System.getProperty("java.runtime.name")); } + /** + * get the jars in the boot classpath. + * TODO test on more JVMs + * + * @throws IllegalStateException if boot classpath cannot be found + */ + public static String[] getBootClassPathJars() { + String classpath = System.getProperty("sun.boot.class.path"); + if (classpath == null) { + throw new IllegalStateException("could not find boot classpath"); + } + String[] jars = classpath.split(File.pathSeparator); + ArrayList result = new ArrayList(); + for (String jar : jars) { + if (jar.endsWith(".jar") && (new File(jar)).exists()) { + result.add(jar); + } + } + return result.toArray(new String[result.size()]); + } } From 8f9e988cef94d21b2c272147b96ca32b11e3c6bd Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sat, 25 May 2013 16:14:04 -0700 Subject: [PATCH 111/187] enable running wala.core.tests in maven build --- com.ibm.wala.core.tests/pom.xml | 30 +++++++++++++++++++++++++++++- pom.xml | 4 +++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml index c3f48055f..57393f7ae 100644 --- a/com.ibm.wala.core.tests/pom.xml +++ b/com.ibm.wala.core.tests/pom.xml @@ -8,5 +8,33 @@ 1.3.4-SNAPSHOT com.ibm.wala.core.tests - eclipse-test-plugin + eclipse-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + + + test + + + + + + + + + junit + junit + 4.7 + test + + diff --git a/pom.xml b/pom.xml index 8ab63a91d..53809dbfa 100644 --- a/pom.xml +++ b/pom.xml @@ -19,13 +19,15 @@ targets - com.ibm.wala.core.testdata com.ibm.wala-feature com.ibm.wala.core com.ibm.wala.shrike com.ibm.wala.util + com.ibm.wala.core.testdata + com.ibm.wala.core.tests + com.ibm.wala.cast com.ibm.wala.cast.java com.ibm.wala.cast.java.polyglot From 878cfa615d66fbf6b18d7ec74226fff095aa8444 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 10:07:46 -0700 Subject: [PATCH 112/187] changes to get tests passing on Java 7 --- .../core/tests/demandpa/AbstractPtrTest.java | 6 +++ .../core/tests/demandpa/NoRefinePtrTest.java | 4 ++ .../wala/core/tests/slicer/SlicerTest.java | 20 ++++++++- .../analysis/dataflow/DataflowTest.java | 24 +++++++++-- .../alg/refinepolicy/OnlyArraysPolicy.java | 43 +++++++++++++++++++ 5 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/OnlyArraysPolicy.java diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/AbstractPtrTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/AbstractPtrTest.java index 2f9367ef9..7870dfa9d 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/AbstractPtrTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/AbstractPtrTest.java @@ -48,6 +48,9 @@ import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil; import com.ibm.wala.demandpa.alg.DemandRefinementPointsTo; +import com.ibm.wala.demandpa.alg.refinepolicy.NeverRefineCGPolicy; +import com.ibm.wala.demandpa.alg.refinepolicy.OnlyArraysPolicy; +import com.ibm.wala.demandpa.alg.refinepolicy.SinglePassRefinementPolicy; import com.ibm.wala.demandpa.alg.statemachine.DummyStateMachine; import com.ibm.wala.demandpa.alg.statemachine.StateMachineFactory; import com.ibm.wala.demandpa.flowgraph.IFlowLabel; @@ -243,6 +246,9 @@ public abstract class AbstractPtrTest { DemandRefinementPointsTo fullDemandPointsTo = DemandRefinementPointsTo.makeWithDefaultFlowGraph(cg, builder, mam, cha, options, getStateMachineFactory()); + // always refine array fields; otherwise, can be very sensitive to differences + // in library versions. otherwise, no refinement by default + fullDemandPointsTo.setRefinementPolicyFactory(new SinglePassRefinementPolicy.Factory(new OnlyArraysPolicy(), new NeverRefineCGPolicy())); return fullDemandPointsTo; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/NoRefinePtrTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/NoRefinePtrTest.java index 882f67700..4c401b2d6 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/NoRefinePtrTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/demandpa/NoRefinePtrTest.java @@ -44,6 +44,10 @@ import org.junit.Test; import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.util.CancelException; +/** + * Note that in this test we still do refinement of the array contents + * pseudo-field, to avoid excessive sensitivity to library versions. + */ public class NoRefinePtrTest extends AbstractPtrTest { public NoRefinePtrTest() { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java index 2e243fbeb..71da37b60 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/slicer/SlicerTest.java @@ -257,7 +257,7 @@ public class SlicerTest { TestConstants.SLICE8_MAIN); AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints); - CallGraphBuilder builder = Util.makeVanillaZeroOneContainerCFABuilder(options, new AnalysisCache(), cha, scope); + CallGraphBuilder builder = Util.makeZeroOneCFABuilder(options, new AnalysisCache(), cha, scope); CallGraph cg = builder.makeCallGraph(options, null); CGNode process = findMethod(cg, Descriptor.findOrCreateUTF8("()V"), Atom.findOrCreateUnicodeAtom("process")); @@ -646,7 +646,7 @@ public class SlicerTest { Collection slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL, ControlDependenceOptions.NONE); dumpSlice(slice); - Assert.assertEquals(1, countAllocations(slice)); + Assert.assertEquals(1, countApplicationAllocations(slice)); Assert.assertEquals(1, countThrows(slice)); Assert.assertEquals(1, countGetfields(slice)); } @@ -705,6 +705,22 @@ public class SlicerTest { return count; } + public static int countApplicationAllocations(Collection slice) { + int count = 0; + for (Statement s : slice) { + if (s.getKind().equals(Statement.Kind.NORMAL)) { + NormalStatement ns = (NormalStatement) s; + if (ns.getInstruction() instanceof SSANewInstruction) { + AnalysisScope scope = s.getNode().getClassHierarchy().getScope(); + if (scope.isApplicationLoader(s.getNode().getMethod().getDeclaringClass().getClassLoader())) { + count++; + } + } + } + } + return count; + } + public static int countThrows(Collection slice) { int count = 0; for (Statement s : slice) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/DataflowTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/DataflowTest.java index 71df5a55a..1b0138492 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/DataflowTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/DataflowTest.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.ibm.wala.examples.analysis.dataflow; +import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; @@ -50,9 +51,9 @@ import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.Pair; import com.ibm.wala.util.config.AnalysisScopeReader; +import com.ibm.wala.util.config.FileOfClasses; import com.ibm.wala.util.intset.IntIterator; import com.ibm.wala.util.intset.IntSet; -import com.ibm.wala.util.io.FileProvider; /** * Tests of various flow analysis engines. @@ -63,12 +64,29 @@ public class DataflowTest extends WalaTestCase { private static IClassHierarchy cha; + // more aggressive exclusions to avoid library blowup + // in interprocedural tests + private static final String EXCLUSIONS = "java\\/awt\\/.*\n" + + "javax\\/swing\\/.*\n" + + "sun\\/awt\\/.*\n" + + "sun\\/swing\\/.*\n" + + "com\\/sun\\/.*\n" + + "sun\\/.*\n" + + "org\\/netbeans\\/.*\n" + + "org\\/openide\\/.*\n" + + "com\\/ibm\\/crypto\\/.*\n" + + "com\\/ibm\\/security\\/.*\n" + + "org\\/apache\\/xerces\\/.*\n" + + "java\\/security\\/.*\n" + + ""; + + @BeforeClass public static void beforeClass() throws Exception { - scope = AnalysisScopeReader.readJavaScope(TestConstants.WALA_TESTDATA, - (new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS), DataflowTest.class.getClassLoader()); + scope = AnalysisScopeReader.readJavaScope(TestConstants.WALA_TESTDATA, null, DataflowTest.class.getClassLoader()); + scope.setExclusions(new FileOfClasses(new ByteArrayInputStream(EXCLUSIONS.getBytes("UTF-8")))); try { cha = ClassHierarchy.make(scope); } catch (ClassHierarchyException e) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/OnlyArraysPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/OnlyArraysPolicy.java new file mode 100644 index 000000000..390835479 --- /dev/null +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/OnlyArraysPolicy.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * 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.demandpa.alg.refinepolicy; + +import com.ibm.wala.classLoader.IField; +import com.ibm.wala.demandpa.alg.statemachine.StateMachine.State; +import com.ibm.wala.demandpa.flowgraph.IFlowLabel; +import com.ibm.wala.demandpa.util.ArrayContents; +import com.ibm.wala.ipa.callgraph.propagation.PointerKey; + +/** + * Only refines for the array contents pseudo-field. + * + * @author manu + * + */ +public class OnlyArraysPolicy implements FieldRefinePolicy { + + /* + * @see com.ibm.wala.demandpa.alg.refinepolicy.FieldRefinePolicy#shouldRefine(com.ibm.wala.classLoader.IField, com.ibm.wala.ipa.callgraph.propagation.PointerKey, com.ibm.wala.ipa.callgraph.propagation.PointerKey, com.ibm.wala.demandpa.flowgraph.IFlowLabel, com.ibm.wala.demandpa.alg.statemachine.StateMachine.State) + */ + @Override + public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, State state) { + return field == ArrayContents.v(); + } + + /* + * @see com.ibm.wala.demandpa.alg.refinepolicy.FieldRefinePolicy#nextPass() + */ + @Override + public boolean nextPass() { + return false; + } + +} From 98b6d63cdf80251160c4ba3fc0e0fd0824827f84 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 14:40:14 -0700 Subject: [PATCH 113/187] add surefire plugin version --- pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 53809dbfa..7cb5369a7 100644 --- a/pom.xml +++ b/pom.xml @@ -145,7 +145,12 @@ maven-download-plugin 1.0.0 - + + org.apache.maven.plugins + maven-surefire-plugin + 2.14.1 + + From b23756924e05a8779bf5ba56179769ce06d8d84e Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 14:45:24 -0700 Subject: [PATCH 114/187] pass appropriate VM args when running tests --- com.ibm.wala.core.tests/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml index 57393f7ae..16fe2a76f 100644 --- a/com.ibm.wala.core.tests/pom.xml +++ b/com.ibm.wala.core.tests/pom.xml @@ -20,6 +20,7 @@ test ${project.build.outputDirectory} + -Xmx800M -Dcom.ibm.wala.junit.profile=short -Dcom.ibm.wala.junit.analyzingJar=true -ea -Dcom.ibm.wala.fixedpoint.impl.verbose=true test From 9bc5bcbb3cf1f16cbe2d250956047e2ffab88f5b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 14:45:50 -0700 Subject: [PATCH 115/187] Disable certain tests when analyzed classes are in a jar file. These tests create FileModules for certain class / source files, and hence assume those files are sitting in the filesystem. We should come up with a better fix here. --- .../src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java | 2 ++ .../src/com/ibm/wala/core/tests/cha/SourceMapTest.java | 2 ++ .../src/com/ibm/wala/core/tests/util/WalaTestCase.java | 3 +++ 3 files changed, 7 insertions(+) diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java index 04990e585..51cf8d70d 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java @@ -118,6 +118,7 @@ public class CallGraphTest extends WalaTestCase { } @Test public void testHello() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { + if (analyzingJar()) return; AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.HELLO, CallGraphTestUtil.REGRESSION_EXCLUSIONS); ClassHierarchy cha = ClassHierarchy.make(scope); Iterable entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, @@ -186,6 +187,7 @@ public class CallGraphTest extends WalaTestCase { } @Test public void testHelloAllEntrypoints() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { + if (analyzingJar()) return; AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.HELLO, CallGraphTestUtil.REGRESSION_EXCLUSIONS); ClassHierarchy cha = ClassHierarchy.make(scope); Iterable entrypoints = new AllApplicationEntrypoints(scope, cha); diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java index 4ce8e0eed..356f03d8c 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java @@ -33,6 +33,7 @@ public class SourceMapTest extends WalaTestCase { private final static String CLASS_IN_PRIMORDIAL_JAR = "Lcom/ibm/wala/model/SyntheticFactory"; @Test public void testHello() throws ClassHierarchyException, IOException { + if (analyzingJar()) return; AnalysisScope scope = null; scope = AnalysisScopeReader.readJavaScope(TestConstants.HELLO, null, MY_CLASSLOADER); // TODO: it's annoying to have to build a class hierarchy here. @@ -47,6 +48,7 @@ public class SourceMapTest extends WalaTestCase { } @Test public void testFromJar() throws ClassHierarchyException, IOException { + if (analyzingJar()) return; AnalysisScope scope = null; scope = AnalysisScopeReader.readJavaScope(TestConstants.HELLO, null, MY_CLASSLOADER); // TODO: it's annoying to have to build a class hierarchy here. diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/WalaTestCase.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/WalaTestCase.java index 3120a3e4b..d32e82ea2 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/WalaTestCase.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/util/WalaTestCase.java @@ -34,6 +34,9 @@ public abstract class WalaTestCase { } } + public static boolean analyzingJar() { + return "true".equals(System.getProperty("com.ibm.wala.junit.analyzingJar")); + } /* * @see junit.framework.TestCase#setUp() */ From cfc01b5ab6ef7729f9f16234637b3a481cfc09de Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 14:47:00 -0700 Subject: [PATCH 116/187] fix up wala.core.testdata structure so things work from maven We put all the jar files (the testdata jar, JLex, etc.) in the root directory now, and set up the build.properties so that these jars get copied into the final plugin jar, making the tests work properly from maven. We also still copy the jars into the bin/ directory, so the Eclipse launchers still work. --- .gitignore | 2 +- com.ibm.wala.core.testdata/build.properties | 6 +++++- com.ibm.wala.core.testdata/build.xml | 15 ++++++++------- com.ibm.wala.core.tests/META-INF/MANIFEST.MF | 3 ++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 1d84436da..e96c95664 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ com.ibm.wala.cast.java.test.data/src/JLex/ *~ com.ibm.wala.cast.js.test.data/examples-src/ajaxslt/ com.ibm.wala.core.testdata/@dot/ -com.ibm.wala.core.testdata/lib/ +com.ibm.wala.core.testdata/*.jar com.ibm.wala.core/dat/wala.properties com.ibm.wala.core.tests/dat/wala.examples.properties com.ibm.wala.cast.js.html.nu_validator/lib/ diff --git a/com.ibm.wala.core.testdata/build.properties b/com.ibm.wala.core.testdata/build.properties index 34d2e4d2d..894aadec0 100644 --- a/com.ibm.wala.core.testdata/build.properties +++ b/com.ibm.wala.core.testdata/build.properties @@ -1,4 +1,8 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + JLex.jar,\ + bcel-5.2.jar,\ + java-cup-11a.jar,\ + com.ibm.wala.core.testdata_1.0.0.jar diff --git a/com.ibm.wala.core.testdata/build.xml b/com.ibm.wala.core.testdata/build.xml index a489bada5..511f105a7 100644 --- a/com.ibm.wala.core.testdata/build.xml +++ b/com.ibm.wala.core.testdata/build.xml @@ -36,7 +36,7 @@ - + @@ -44,20 +44,20 @@ - + - + - + - + @@ -66,13 +66,13 @@ - + - + @@ -103,6 +103,7 @@ + diff --git a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF index 313cdfd48..4e4f8cdb8 100644 --- a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF @@ -7,7 +7,8 @@ Bundle-Vendor: %providerName Require-Bundle: com.ibm.wala.shrike, com.ibm.wala.core, org.eclipse.core.runtime, - org.junit;bundle-version="4.3.1" + org.junit;bundle-version="4.3.1", + com.ibm.wala.core.testdata;bundle-version="1.3.4" Bundle-Localization: plugin Export-Package: com.ibm.wala.core.tests.basic, com.ibm.wala.core.tests.callGraph, From 422b9a175311c11eb1d9927bf9cae8d696b3c367 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 15:43:20 -0700 Subject: [PATCH 117/187] attempt to fix Travis build --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index dff5f3a5d..623881f63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,3 @@ language: java +install: true +script: mvn clean verify From 4f9dfafa62293fc037ba9e6928d309cc592affe8 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 15:54:29 -0700 Subject: [PATCH 118/187] more Travis tweaking --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 623881f63..bdca877e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: java install: true -script: mvn clean verify +script: mvn clean verify -B -q From 197fb8bc56d2d18253e2ce0c2f41862c91d26287 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 26 May 2013 16:13:02 -0700 Subject: [PATCH 119/187] disable running tests for now; still debugging --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7cb5369a7..f4cc6f41d 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - com.ibm.wala.core.tests + com.ibm.wala.cast com.ibm.wala.cast.java From 0a7a3092b1f2288b177017a1bbcd78748be730e0 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 09:45:50 -0700 Subject: [PATCH 120/187] trying to get around classloading issues --- com.ibm.wala.core.tests/META-INF/MANIFEST.MF | 1 + com.ibm.wala.core/META-INF/MANIFEST.MF | 1 + 2 files changed, 2 insertions(+) diff --git a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF index 4e4f8cdb8..571635d35 100644 --- a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF @@ -25,3 +25,4 @@ Export-Package: com.ibm.wala.core.tests.basic, Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Bundle-Activator: com.ibm.wala.core.tests.plugin.CoreTestsPlugin +Eclipse-RegisterBuddy: com.ibm.wala.core diff --git a/com.ibm.wala.core/META-INF/MANIFEST.MF b/com.ibm.wala.core/META-INF/MANIFEST.MF index 6febf89c7..adb4d096d 100644 --- a/com.ibm.wala.core/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core/META-INF/MANIFEST.MF @@ -60,3 +60,4 @@ Export-Package: ., com.ibm.wala.viz, com.ibm.wala.viz.viewer Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Eclipse-BuddyPolicy: registered From 89c04ead320e142fb245ee0bc52ba1d9816dea37 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 10:11:18 -0700 Subject: [PATCH 121/187] tweaks to test config --- com.ibm.wala.core.tests/pom.xml | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml index 16fe2a76f..4c84d3a64 100644 --- a/com.ibm.wala.core.tests/pom.xml +++ b/com.ibm.wala.core.tests/pom.xml @@ -8,7 +8,7 @@ 1.3.4-SNAPSHOT com.ibm.wala.core.tests - eclipse-plugin + eclipse-test-plugin @@ -20,7 +20,7 @@ test ${project.build.outputDirectory} - -Xmx800M -Dcom.ibm.wala.junit.profile=short -Dcom.ibm.wala.junit.analyzingJar=true -ea -Dcom.ibm.wala.fixedpoint.impl.verbose=true + -Xmx800M -Dcom.ibm.wala.junit.profile=short -Dcom.ibm.wala.junit.analyzingJar=true -ea test diff --git a/pom.xml b/pom.xml index f4cc6f41d..7cb5369a7 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - + com.ibm.wala.core.tests com.ibm.wala.cast com.ibm.wala.cast.java From 119fd841af7a12841a1c3007d55113bc8b9de14e Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 10:35:55 -0700 Subject: [PATCH 122/187] more manifest hacks. Also, temporary disable CG IO test --- com.ibm.wala.core.testdata/META-INF/MANIFEST.MF | 1 + com.ibm.wala.core.tests/META-INF/MANIFEST.MF | 2 +- .../src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF index 47aa91192..3ff1eac4a 100644 --- a/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.testdata/META-INF/MANIFEST.MF @@ -5,3 +5,4 @@ Bundle-SymbolicName: com.ibm.wala.core.testdata Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Eclipse-BuddyPolicy: registered diff --git a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF index 571635d35..678eaf44b 100644 --- a/com.ibm.wala.core.tests/META-INF/MANIFEST.MF +++ b/com.ibm.wala.core.tests/META-INF/MANIFEST.MF @@ -25,4 +25,4 @@ Export-Package: com.ibm.wala.core.tests.basic, Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Bundle-Activator: com.ibm.wala.core.tests.plugin.CoreTestsPlugin -Eclipse-RegisterBuddy: com.ibm.wala.core +Eclipse-RegisterBuddy: com.ibm.wala.core, com.ibm.wala.core.testdata diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java index 51cf8d70d..59feb724b 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.Set; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import com.ibm.wala.classLoader.IClass; @@ -196,6 +197,7 @@ public class CallGraphTest extends WalaTestCase { doCallGraphs(options, new AnalysisCache(), cha, scope); } + @Ignore @Test public void testIO() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope("primordial.txt", CallGraphTestUtil.REGRESSION_EXCLUSIONS); ClassHierarchy cha = ClassHierarchy.make(scope); From 5de33324fadd0f5ffdc899864466f078c4a7ab38 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 11:06:21 -0700 Subject: [PATCH 123/187] another maven tweak --- com.ibm.wala.core.tests/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml index 4c84d3a64..5a6e76770 100644 --- a/com.ibm.wala.core.tests/pom.xml +++ b/com.ibm.wala.core.tests/pom.xml @@ -8,7 +8,7 @@ 1.3.4-SNAPSHOT com.ibm.wala.core.tests - eclipse-test-plugin + eclipse-plugin From 38d0c3cc1221c5928c3111d88a8c6b54a8c82360 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 11:07:32 -0700 Subject: [PATCH 124/187] re-enable test --- .../src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java index 59feb724b..51cf8d70d 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java @@ -16,7 +16,6 @@ import java.util.Iterator; import java.util.Set; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import com.ibm.wala.classLoader.IClass; @@ -197,7 +196,6 @@ public class CallGraphTest extends WalaTestCase { doCallGraphs(options, new AnalysisCache(), cha, scope); } - @Ignore @Test public void testIO() throws ClassHierarchyException, IllegalArgumentException, CancelException, IOException { AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope("primordial.txt", CallGraphTestUtil.REGRESSION_EXCLUSIONS); ClassHierarchy cha = ClassHierarchy.make(scope); From 7a72cdb02f73bf5d8c86af84dfa80dfa5c44d0f3 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 11:19:53 -0700 Subject: [PATCH 125/187] hopefully this will work on Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bdca877e7..1196afb0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: java -install: true +install: mvn clean verify -DskipTests=true -B -q script: mvn clean verify -B -q From c13dad9057e9ea2553d87bb5232d3bf24036b46b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 11:37:10 -0700 Subject: [PATCH 126/187] try redirecting excessive test output --- com.ibm.wala.core.tests/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/com.ibm.wala.core.tests/pom.xml b/com.ibm.wala.core.tests/pom.xml index 5a6e76770..63c8bccd9 100644 --- a/com.ibm.wala.core.tests/pom.xml +++ b/com.ibm.wala.core.tests/pom.xml @@ -21,6 +21,7 @@ ${project.build.outputDirectory} -Xmx800M -Dcom.ibm.wala.junit.profile=short -Dcom.ibm.wala.junit.analyzingJar=true -ea + true test From 06361377e34dd846811810c3c59bb0f1ba466007 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 27 May 2013 16:34:06 -0700 Subject: [PATCH 127/187] progress on getting polyglot tests to run under maven --- .../META-INF/MANIFEST.MF | 3 +- com.ibm.wala.cast.java.polyglot.test/pom.xml | 43 ++++++++++++++++--- com.ibm.wala.cast.java.test.data/build.xml | 15 ++++--- com.ibm.wala.cast.java.test.data/pom.xml | 33 ++++++++++++++ .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.java.test/pom.xml | 32 +++++++++++++- com.ibm.wala.cast.test/pom.xml | 32 +++++++++++++- pom.xml | 6 ++- 8 files changed, 148 insertions(+), 18 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF index 6b4a7ee31..5f8c7afea 100644 --- a/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.polyglot.test/META-INF/MANIFEST.MF @@ -13,6 +13,7 @@ Require-Bundle: com.ibm.wala.cast;bundle-version="1.0.0", org.eclipse.core.runtime, com.ibm.wala.cast.test;bundle-version="1.0.0", com.ibm.wala.cast.java.polyglot;bundle-version="1.0.0", - org.junit;bundle-version="4.0.0" + org.junit;bundle-version="4.0.0", + com.ibm.wala.cast.java.test.data;bundle-version="1.3.4" Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.java.polyglot.test/pom.xml b/com.ibm.wala.cast.java.polyglot.test/pom.xml index 717105108..2300b2e68 100644 --- a/com.ibm.wala.cast.java.polyglot.test/pom.xml +++ b/com.ibm.wala.cast.java.polyglot.test/pom.xml @@ -2,13 +2,42 @@ 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + com.ibm.wala.cast.java.polyglot.test - 1.0.0 eclipse-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + -Xmx800M -ea + true + ${basedir}/../com.ibm.wala.cast.java.test.data + + + test + + + + + + + + + junit + junit + 4.7 + test + + diff --git a/com.ibm.wala.cast.java.test.data/build.xml b/com.ibm.wala.cast.java.test.data/build.xml index be15e70da..318fd931e 100644 --- a/com.ibm.wala.cast.java.test.data/build.xml +++ b/com.ibm.wala.cast.java.test.data/build.xml @@ -14,12 +14,15 @@ - - - - + + + + + + + diff --git a/com.ibm.wala.cast.java.test.data/pom.xml b/com.ibm.wala.cast.java.test.data/pom.xml index 9b9f9d822..c5cc24789 100644 --- a/com.ibm.wala.cast.java.test.data/pom.xml +++ b/com.ibm.wala.cast.java.test.data/pom.xml @@ -9,4 +9,37 @@ com.ibm.wala.cast.java.test.data eclipse-plugin + + + + + maven-antrun-plugin + 1.7 + + + process-resources + + + + + + + + run + + + + + + com.sun + tools + 1.7 + system + ${java.home}/../lib/tools.jar + + + + + + diff --git a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF index e5c8e8f21..c7c723d1d 100644 --- a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Java AST WALA Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.java.test -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Activator: com.ibm.wala.cast.java.test.TestPlugin Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.core.tests, diff --git a/com.ibm.wala.cast.java.test/pom.xml b/com.ibm.wala.cast.java.test/pom.xml index 8060e2b93..7f2454c3b 100644 --- a/com.ibm.wala.cast.java.test/pom.xml +++ b/com.ibm.wala.cast.java.test/pom.xml @@ -8,5 +8,35 @@ 1.3.4-SNAPSHOT com.ibm.wala.cast.java.test - eclipse-test-plugin + eclipse-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + -Xmx800M -ea + true + + + test + + + + + + + + + junit + junit + 4.7 + test + + diff --git a/com.ibm.wala.cast.test/pom.xml b/com.ibm.wala.cast.test/pom.xml index 6d9346166..2d5cc4b48 100644 --- a/com.ibm.wala.cast.test/pom.xml +++ b/com.ibm.wala.cast.test/pom.xml @@ -8,5 +8,35 @@ 1.3.4-SNAPSHOT com.ibm.wala.cast.test - eclipse-test-plugin + eclipse-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + -Xmx800M -ea + true + + + test + + + + + + + + + junit + junit + 4.7 + test + + diff --git a/pom.xml b/pom.xml index 7cb5369a7..54811fa45 100644 --- a/pom.xml +++ b/pom.xml @@ -26,11 +26,15 @@ com.ibm.wala.util com.ibm.wala.core.testdata - com.ibm.wala.core.tests + com.ibm.wala.cast + com.ibm.wala.cast.test com.ibm.wala.cast.java + com.ibm.wala.cast.java.test + com.ibm.wala.cast.java.test.data com.ibm.wala.cast.java.polyglot + com.ibm.wala.cast.java.polyglot.test com.ibm.wala.cast.js com.ibm.wala.cast.js.rhino From 5926048e88a57c18744862e7f52d9d917bd08b37 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 09:34:42 -0700 Subject: [PATCH 128/187] add bin directory if it doesn't exist --- com.ibm.wala.cast.java.test.data/build.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.java.test.data/build.xml b/com.ibm.wala.cast.java.test.data/build.xml index 318fd931e..ff4149598 100644 --- a/com.ibm.wala.cast.java.test.data/build.xml +++ b/com.ibm.wala.cast.java.test.data/build.xml @@ -61,7 +61,17 @@ property="testdatadir.present"/> - + + + + + + + + + From ed058156986f5b4247b58397b04783e5dc70b61d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 11:52:29 -0700 Subject: [PATCH 129/187] rename test class --- .../test/{FieldBasedCGTests.java => TestFieldBasedCG.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/{FieldBasedCGTests.java => TestFieldBasedCG.java} (97%) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java similarity index 97% rename from com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java rename to com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java index 808bda407..c229cb1aa 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/FieldBasedCGTests.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java @@ -28,7 +28,7 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.util.CallGraph2JSON; import com.ibm.wala.util.WalaException; -public class FieldBasedCGTests extends TestJSCallGraphShape { +public class TestFieldBasedCG extends TestJSCallGraphShape { protected CGUtil util; @Override @@ -39,7 +39,7 @@ public class FieldBasedCGTests extends TestJSCallGraphShape { private void runTest(String script, Object[][] assertions, BuilderType... builderTypes) throws IOException, WalaException, Error { for(BuilderType builderType : builderTypes) { - URL url = FieldBasedCGTests.class.getClassLoader().getResource(script); + URL url = TestFieldBasedCG.class.getClassLoader().getResource(script); JSCallGraph cg = util.buildCG(url, builderType); try { verifyGraphAssertions(cg, assertions); From cc9c8e407bdc34759a8f0c647be816731f524bfb Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 15:31:06 -0700 Subject: [PATCH 130/187] rename to fit Maven conventions --- .../{PolyglotJavaIRTests.launch => PolyglotJavaIRTest.launch} | 4 ++-- .../{PolyglotJavaIRTests.java => PolyglotJavaIRTest.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename com.ibm.wala.cast.java.polyglot.test/launchers/{PolyglotJavaIRTests.launch => PolyglotJavaIRTest.launch} (92%) rename com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/{PolyglotJavaIRTests.java => PolyglotJavaIRTest.java} (94%) diff --git a/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch b/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTest.launch similarity index 92% rename from com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch rename to com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTest.launch index 4bc5c966f..1677f0432 100644 --- a/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTests.launch +++ b/com.ibm.wala.cast.java.polyglot.test/launchers/PolyglotJavaIRTest.launch @@ -2,7 +2,7 @@ - + @@ -12,7 +12,7 @@ - + diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTests.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java similarity index 94% rename from com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTests.java rename to com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java index 2828e2f96..e0950fc3f 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTests.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java @@ -19,9 +19,9 @@ import com.ibm.wala.ipa.callgraph.Entrypoint; import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.cha.IClassHierarchy; -public class PolyglotJavaIRTests extends JavaIRTests { +public class PolyglotJavaIRTest extends JavaIRTests { - public PolyglotJavaIRTests() { + public PolyglotJavaIRTest() { super(null); } From 89803bc90c859e3d5caa4ff54a925ea036fdc4ec Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 15:31:30 -0700 Subject: [PATCH 131/187] use updated API for getting library jars --- .../com/ibm/wala/cast/java/test/IRTests.java | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java index 180e669ea..f5e833d36 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java @@ -16,12 +16,11 @@ package com.ibm.wala.cast.java.test; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; -import java.util.Properties; import java.util.Set; import java.util.jar.JarFile; @@ -68,50 +67,50 @@ public abstract class IRTests { private String testSrcPath = "." + File.separator + "src"; - public static List rtJar; + public static final List rtJar = Arrays.asList(WalaProperties.getJ2SEJarFiles()); protected static List emptyList = Collections.emptyList(); - static { - boolean found = false; - try { - rtJar = new LinkedList(); - - Properties p = WalaProperties.loadProperties(); - javaHomePath = p.getProperty(WalaProperties.J2SE_DIR); - - if (new File(javaHomePath).isDirectory()) { - if ("Mac OS X".equals(System.getProperty("os.name"))) { // nick - /** - * todo: {@link WalaProperties#getJ2SEJarFiles()} - */ - rtJar.add(javaHomePath + "/classes.jar"); - rtJar.add(javaHomePath + "/ui.jar"); - } else { - rtJar.add(javaHomePath + File.separator + "classes.jar"); - rtJar.add(javaHomePath + File.separator + "rt.jar"); - rtJar.add(javaHomePath + File.separator + "core.jar"); - rtJar.add(javaHomePath + File.separator + "vm.jar"); - } - found = true; - } - } catch (Exception e) { - // no properties - } - - if (!found) { - javaHomePath = System.getProperty("java.home"); - if ("Mac OS X".equals(System.getProperty("os.name"))) { // nick - rtJar.add(javaHomePath + "/../Classes/classes.jar"); - rtJar.add(javaHomePath + "/../Classes/ui.jar"); - } else { - rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "rt.jar"); - rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "core.jar"); - rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "vm.jar"); - rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "classes.jar"); - } - } - } +// static { +// boolean found = false; +// try { +// rtJar = new LinkedList(); +// +// Properties p = WalaProperties.loadProperties(); +// javaHomePath = p.getProperty(WalaProperties.J2SE_DIR); +// +// if (new File(javaHomePath).isDirectory()) { +// if ("Mac OS X".equals(System.getProperty("os.name"))) { // nick +// /** +// * todo: {@link WalaProperties#getJ2SEJarFiles()} +// */ +// rtJar.add(javaHomePath + "/classes.jar"); +// rtJar.add(javaHomePath + "/ui.jar"); +// } else { +// rtJar.add(javaHomePath + File.separator + "classes.jar"); +// rtJar.add(javaHomePath + File.separator + "rt.jar"); +// rtJar.add(javaHomePath + File.separator + "core.jar"); +// rtJar.add(javaHomePath + File.separator + "vm.jar"); +// } +// found = true; +// } +// } catch (Exception e) { +// // no properties +// } +// +// if (!found) { +// javaHomePath = System.getProperty("java.home"); +// if ("Mac OS X".equals(System.getProperty("os.name"))) { // nick +// rtJar.add(javaHomePath + "/../Classes/classes.jar"); +// rtJar.add(javaHomePath + "/../Classes/ui.jar"); +// } else { +// rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "rt.jar"); +// rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "core.jar"); +// rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "vm.jar"); +// rtJar.add(javaHomePath + File.separator + "lib" + File.separator + "classes.jar"); +// } +// } +// } public interface IRAssertion { @@ -420,7 +419,6 @@ public abstract class IRTests { * @param srcMethodDescriptor a full method descriptor of the form ldr#type#methName#methSig example: * Source#Simple1#main#([Ljava/lang/String;)V * @param cha - * @return */ public static MethodReference descriptorToMethodRef(String srcMethodDescriptor, IClassHierarchy cha) { String[] ldrTypeMeth = srcMethodDescriptor.split("\\#"); From dee324b609bcde4728fc0e47893ed15784726676 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 15:32:24 -0700 Subject: [PATCH 132/187] add comment --- .../src/com/ibm/wala/cast/java/test/IRTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java index f5e833d36..9675451de 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java @@ -71,6 +71,7 @@ public abstract class IRTests { protected static List emptyList = Collections.emptyList(); + // TODO delete this code; leaving just in case --MS // static { // boolean found = false; // try { From 07c711d5abd98be8395263e14ccc865832351a9b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 15:41:09 -0700 Subject: [PATCH 133/187] re-enable wala core tests --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 54811fa45..a8b344250 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - + com.ibm.wala.core.tests com.ibm.wala.cast com.ibm.wala.cast.test From cd2e3abe890d1d97892f0fb92e47be60029cdd4b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 16:39:33 -0700 Subject: [PATCH 134/187] get JavaScript tests running under Maven --- .../META-INF/MANIFEST.MF | 5 ++- .../fieldbased/test/TestFieldBasedCG.java | 2 + com.ibm.wala.cast.js.rhino.test/pom.xml | 45 ++++++++++++++++--- .../META-INF/MANIFEST.MF | 2 +- .../build.properties | 1 + com.ibm.wala.cast.js.test.data/build.xml | 5 ++- com.ibm.wala.cast.js.test.data/pom.xml | 45 ++++++++++++++++--- .../META-INF/MANIFEST.MF | 5 ++- com.ibm.wala.cast.js.test/build.properties | 3 +- com.ibm.wala.cast.js.test/pom.xml | 45 ++++++++++++++++--- pom.xml | 8 +++- 11 files changed, 135 insertions(+), 31 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF index 48df85e9d..ed19d7cc4 100644 --- a/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js.rhino.test -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: IBM Require-Bundle: com.ibm.wala.cast.js.rhino;bundle-version="1.0.0", com.ibm.wala.cast.js;bundle-version="1.0.0", @@ -11,7 +11,8 @@ Require-Bundle: com.ibm.wala.cast.js.rhino;bundle-version="1.0.0", com.ibm.wala.cast.js.test;bundle-version="1.0.0", com.ibm.wala.cast.test;bundle-version="1.0.0", com.ibm.wala.core.tests;bundle-version="1.1.3", - org.junit4;bundle-version="4.3.1" + org.junit4;bundle-version="4.3.1", + com.ibm.wala.cast.js.test.data;bundle-version="1.3.4" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.js.rhino.test, diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java index c229cb1aa..2701b854c 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java @@ -18,6 +18,7 @@ import java.util.Set; import junit.framework.AssertionFailedError; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; @@ -107,6 +108,7 @@ public class TestFieldBasedCG extends TestJSCallGraphShape { new Object[] { "suffix:f", new String[] { "suffix:k" } } }; + @Ignore("temporarily ignoring until we get a fix") @Test public void testReflectiveCall() throws IOException, WalaException, Error { runTest("tests/fieldbased/reflective_calls.js", assertionsForReflectiveCall, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); diff --git a/com.ibm.wala.cast.js.rhino.test/pom.xml b/com.ibm.wala.cast.js.rhino.test/pom.xml index ca3571a60..df8d77b5d 100644 --- a/com.ibm.wala.cast.js.rhino.test/pom.xml +++ b/com.ibm.wala.cast.js.rhino.test/pom.xml @@ -2,13 +2,44 @@ 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + com.ibm.wala.cast.js.rhino.test - 1.0.0 eclipse-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + -Xmx800M -ea + true + + ${basedir}/../com.ibm.wala.cast.js.test.data/examples-src + + + + test + + + + + + + + + junit + junit + 4.7 + test + + diff --git a/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF index d01eb95d1..b2ae39a6d 100644 --- a/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.test.data/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Eclipse-LazyStart: true Bundle-Name: %pluginName Bundle-SymbolicName: com.ibm.wala.cast.js.test.data;singleton:=true -Bundle-Version: 1.1.3.qualifier +Bundle-Version: 1.3.4.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Bundle-ActivationPolicy: lazy diff --git a/com.ibm.wala.cast.js.test.data/build.properties b/com.ibm.wala.cast.js.test.data/build.properties index e69de29bb..748041422 100644 --- a/com.ibm.wala.cast.js.test.data/build.properties +++ b/com.ibm.wala.cast.js.test.data/build.properties @@ -0,0 +1 @@ +bin.includes = examples-src/ diff --git a/com.ibm.wala.cast.js.test.data/build.xml b/com.ibm.wala.cast.js.test.data/build.xml index c296dfc2c..ee5daa1f8 100755 --- a/com.ibm.wala.cast.js.test.data/build.xml +++ b/com.ibm.wala.cast.js.test.data/build.xml @@ -18,9 +18,12 @@ on Mac OS X 10.6 (Java version 1.6.0_22). If you are not using this version of Mac OS X or Java, try changing the value of the property to "${java.home}/../../../Classes" --> + + + - + diff --git a/com.ibm.wala.cast.js.test.data/pom.xml b/com.ibm.wala.cast.js.test.data/pom.xml index eceef9eec..a265d0398 100644 --- a/com.ibm.wala.cast.js.test.data/pom.xml +++ b/com.ibm.wala.cast.js.test.data/pom.xml @@ -2,13 +2,44 @@ 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + com.ibm.wala.cast.js.test.data - 1.1.3-SNAPSHOT eclipse-plugin + + + + + maven-antrun-plugin + 1.7 + + + process-resources + + + + + + + + run + + + + + + com.sun + tools + 1.7 + system + ${java.home}/../lib/tools.jar + + + + + + diff --git a/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF index 81204bc49..752479b90 100755 --- a/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: WALA JavaScript Test Plug-in Bundle-SymbolicName: com.ibm.wala.cast.js.test;singleton:=true -Bundle-Version: 1.0.0 +Bundle-Version: 1.3.4.qualifier Bundle-ClassPath: test.jar Bundle-Activator: com.ibm.wala.cast.js.test.JavaScriptTestPlugin Bundle-Vendor: IBM @@ -12,7 +12,8 @@ Require-Bundle: com.ibm.wala.cast.js, org.eclipse.core.runtime, com.ibm.wala.core.tests, org.junit4;bundle-version="4.3.1", - com.ibm.wala.cast.test;bundle-version="1.0.0" + com.ibm.wala.cast.test;bundle-version="1.0.0", + com.ibm.wala.cast.js.test.data;bundle-version="1.3.4" Bundle-ActivationPolicy: lazy Export-Package: com.ibm.wala.cast.js.test Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/com.ibm.wala.cast.js.test/build.properties b/com.ibm.wala.cast.js.test/build.properties index 54018edcd..0e78413c5 100755 --- a/com.ibm.wala.cast.js.test/build.properties +++ b/com.ibm.wala.cast.js.test/build.properties @@ -1,5 +1,4 @@ -source.test.jar = harness-src/,\ - examples-src/ +source.test.jar = harness-src/ output.test.jar = bin/ bin.includes = test.jar,\ META-INF/ diff --git a/com.ibm.wala.cast.js.test/pom.xml b/com.ibm.wala.cast.js.test/pom.xml index 077cfbff8..364c49409 100644 --- a/com.ibm.wala.cast.js.test/pom.xml +++ b/com.ibm.wala.cast.js.test/pom.xml @@ -2,13 +2,44 @@ 4.0.0 - - WALA - com.ibm.wala - 0.0.1-SNAPSHOT - - com.ibm.wala + + com.ibm.wala + WALA + 1.3.4-SNAPSHOT + com.ibm.wala.cast.js.test - 1.0.0 eclipse-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + -Xmx800M -ea + true + + ${basedir}/../com.ibm.wala.cast.js.test.data/examples-src + + + + test + + + + + + + + + junit + junit + 4.7 + test + + diff --git a/pom.xml b/pom.xml index a8b344250..4beb5c933 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - com.ibm.wala.core.tests + com.ibm.wala.cast com.ibm.wala.cast.test @@ -34,9 +34,13 @@ com.ibm.wala.cast.java.test com.ibm.wala.cast.java.test.data com.ibm.wala.cast.java.polyglot - com.ibm.wala.cast.java.polyglot.test + com.ibm.wala.cast.js + + com.ibm.wala.cast.js.test + com.ibm.wala.cast.js.test.data com.ibm.wala.cast.js.rhino + com.ibm.wala.cast.js.rhino.test com.ibm.wala.ide-feature com.ibm.wala.ide From 72e2a1b2f97c52cdd5d1f57de4c0b746ccff7038 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 28 May 2013 16:46:23 -0700 Subject: [PATCH 135/187] re-enable Java tests --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4beb5c933..f94504dce 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - + com.ibm.wala.core.tests com.ibm.wala.cast com.ibm.wala.cast.test @@ -34,7 +34,7 @@ com.ibm.wala.cast.java.test com.ibm.wala.cast.java.test.data com.ibm.wala.cast.java.polyglot - + com.ibm.wala.cast.java.polyglot.test com.ibm.wala.cast.js com.ibm.wala.cast.js.test From 61c48fe1bc3dca09a8b7d5b3e042498eefcc527f Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Wed, 29 May 2013 08:41:55 +0800 Subject: [PATCH 136/187] Fixed failing test case for field-based call graph construction: visitJavaScriptPropertyRead/Write need to be able to handle static property writes (weren't those encoded differently before?). --- .../fieldbased/test/TestFieldBasedCG.java | 2 -- .../fieldbased/flowgraph/FlowGraphBuilder.java | 14 ++++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java index 2701b854c..c229cb1aa 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/callgraph/fieldbased/test/TestFieldBasedCG.java @@ -18,7 +18,6 @@ import java.util.Set; import junit.framework.AssertionFailedError; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; @@ -108,7 +107,6 @@ public class TestFieldBasedCG extends TestJSCallGraphShape { new Object[] { "suffix:f", new String[] { "suffix:k" } } }; - @Ignore("temporarily ignoring until we get a fix") @Test public void testReflectiveCall() throws IOException, WalaException, Error { runTest("tests/fieldbased/reflective_calls.js", assertionsForReflectiveCall, BuilderType.OPTIMISTIC, BuilderType.OPTIMISTIC_WORKLIST); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java index 9ee8456cb..78a40cc72 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraphBuilder.java @@ -145,9 +145,6 @@ public class FlowGraphBuilder { * @author mschaefer */ private class FlowGraphSSAVisitor extends JSMethodInstructionVisitor { - // whether to handle dynamic property accesses with a constant property name as normal property accesses - public static final boolean HANDLE_DYNAMIC_PROP_ACC = false; - // index of the instruction currently visited; -1 if the instruction isn't a normal instruction public int instructionIndex = -1; @@ -233,10 +230,13 @@ public class FlowGraphBuilder { @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite pw) { int p = pw.getMemberRef(); - if(HANDLE_DYNAMIC_PROP_ACC && symtab.isConstant(p)) { + if(symtab.isConstant(p)) { String pn = symtab.getValue(p)+""; + if(pn.charAt(0) == '#') + pn = pn.substring(1); + Vertex v = factory.makeVarVertex(func, pw.getValue()), - w = factory.makePropVertex(pn); + w = factory.makePropVertex(pn); flowgraph.addEdge(v, w); } } @@ -270,8 +270,10 @@ public class FlowGraphBuilder { @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead pr) { int p = pr.getMemberRef(); - if(HANDLE_DYNAMIC_PROP_ACC && symtab.isConstant(p)) { + if(symtab.isConstant(p)) { String pn = symtab.getValue(p)+""; + if(pn.charAt(0) == '#') + pn = pn.substring(1); Vertex v = factory.makePropVertex(pn), w = factory.makeVarVertex(func, pr.getDef()); flowgraph.addEdge(v, w); From c0bae5cf8652f76a395820760fb44edc2f8880a6 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 30 May 2013 14:44:00 -0700 Subject: [PATCH 137/187] use maven-dependency plugin to copy dependencies --- com.ibm.wala.cast.js.rhino/pom.xml | 42 +++++++++++++++++------------- com.ibm.wala.cast.js/pom.xml | 41 +++++++++++++++++------------ 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino/pom.xml b/com.ibm.wala.cast.js.rhino/pom.xml index 093baa374..0182c9deb 100644 --- a/com.ibm.wala.cast.js.rhino/pom.xml +++ b/com.ibm.wala.cast.js.rhino/pom.xml @@ -11,24 +11,30 @@ com.ibm.wala.cast.js.rhino eclipse-plugin - - - com.googlecode.maven-download-plugin - maven-download-plugin - - - - wget - - - http://repo1.maven.org/maven2/org/mozilla/rhino/1.7R3/rhino-1.7R3.jar - lib/ - - - - - + + + maven-dependency-plugin + + + + copy + + + + + org.mozilla + rhino + 1.7R3 + jar + false + + + ${basedir}/lib + + + + + - diff --git a/com.ibm.wala.cast.js/pom.xml b/com.ibm.wala.cast.js/pom.xml index d96098106..9cee3cc44 100644 --- a/com.ibm.wala.cast.js/pom.xml +++ b/com.ibm.wala.cast.js/pom.xml @@ -12,22 +12,29 @@ com.ibm.wala.cast.js eclipse-plugin - - - com.googlecode.maven-download-plugin - maven-download-plugin - - - - wget - - - http://repo1.maven.org/maven2/net/htmlparser/jericho/jericho-html/3.2/jericho-html-3.2.jar - lib/ - - - - - + + + maven-dependency-plugin + + + + copy + + + + + net.htmlparser.jericho + jericho-html + 3.2 + jar + false + + + ${basedir}/lib + + + + + From 3a0741571fddda80c5be2af83c3e1ca777775f97 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Mon, 3 Jun 2013 12:18:29 +0800 Subject: [PATCH 138/187] Some cleanup in ForInContextSelector; now renamed to ParameterNameContextSelector. --- .../cast/js/rhino/test/HTMLCGBuilder.java | 6 +- .../wala/cast/js/test/TestForInLoopHack.java | 4 +- .../js/test/TestSimpleCallGraphShape.java | 4 +- ...java => ParameterNameContextSelector.java} | 78 ++++++------------- 4 files changed, 29 insertions(+), 63 deletions(-) rename com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/{ForInContextSelector.java => ParameterNameContextSelector.java} (78%) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 021448038..0143302ce 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -20,7 +20,7 @@ import java.util.Properties; import junit.framework.Assert; import com.ibm.wala.cast.ir.translator.AstTranslator; -import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.ParameterNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; import com.ibm.wala.cast.js.ipa.callgraph.RecursionCheckContextSelector; @@ -95,8 +95,8 @@ public class HTMLCGBuilder { JSCFABuilder builder = null; try { builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url, builderType); - builder.setContextSelector(new ForInContextSelector(2, builder.getContextSelector())); - builder.setContextSelector(new ForInContextSelector(3, builder.getContextSelector())); + builder.setContextSelector(new ParameterNameContextSelector(2, builder.getContextSelector())); + builder.setContextSelector(new ParameterNameContextSelector(3, builder.getContextSelector())); // TODO we need to find a better way to do this ContextSelector delegation; // the code below belongs somewhere else!!! // the bound of 4 is what is needed to pass our current framework tests diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java index adb1fa257..beaea9e19 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java @@ -18,7 +18,7 @@ import org.junit.Ignore; import org.junit.Test; import com.ibm.wala.cast.js.html.JSSourceExtractor; -import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.ParameterNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.ContextSelector; @@ -173,7 +173,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { private void addHackedForInLoopSensitivity(JSCFABuilder builder) { final ContextSelector orig = builder.getContextSelector(); - builder.setContextSelector(new ForInContextSelector(orig)); + builder.setContextSelector(new ParameterNameContextSelector(orig)); } } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 11be6f5ce..7f06df56b 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -19,7 +19,7 @@ import junit.framework.Assert; import org.junit.Test; -import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.ParameterNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.util.Util; @@ -609,7 +609,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { @Test public void testArrayIndexConv2() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "array_index_conv2.js"); - b.setContextSelector(new ForInContextSelector(b.getContextSelector())); + b.setContextSelector(new ParameterNameContextSelector(b.getContextSelector())); CallGraph cg = b.makeCallGraph(b.getOptions()); //JSCallGraphUtil.AVOID_DUMP = false; //JSCallGraphUtil.dumpCG(b.getPointerAnalysis(), cg); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ParameterNameContextSelector.java similarity index 78% rename from com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java rename to com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ParameterNameContextSelector.java index 5f2f16d29..db281882d 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ForInContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ParameterNameContextSelector.java @@ -17,7 +17,8 @@ import java.util.Map; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; -import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction; +import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; +import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.ClosureExtractor; import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; @@ -47,20 +48,22 @@ import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.IntSetUtil; import com.ibm.wala.util.intset.MutableIntSet; -public class ForInContextSelector implements ContextSelector { +/** + * A context selector that applies object sensitivity for the i'th parameter + * if it is used as a property name in a dynamic property access. + * + * Works together with {@link CorrelationFinder} and {@link ClosureExtractor} + * to implement correlation tracking. + * + * @author mschaefer + * + */ +public class ParameterNameContextSelector implements ContextSelector { public final static ContextKey FORIN_KEY = new ContextKey() { }; public final static ContextKey FORIN_PARM_INDEX = new ContextKey() { }; public static final ContextItem FORIN_MARKER = new ContextItem() { }; - public static final String HACK_METHOD_STR = "_forin_body"; - - // if this flag is set to true, functions are given ForInContexts based on their name - // if it is false, any function that uses its first argument as a property name will be given a ForInContext - public static final boolean USE_NAME_TO_SELECT_CONTEXT = false; - - public static boolean USE_CPA_IN_BODIES = false; - public static boolean USE_1LEVEL_IN_BODIES = true; public static boolean DEPENDENT_THRU_READS = true; @@ -100,6 +103,7 @@ public class ForInContextSelector implements ContextSelector { } } + @Override public int hashCode() { return hashCode; } @@ -124,6 +128,7 @@ public class ForInContextSelector implements ContextSelector { super(base, Collections.singletonMap(ContextKey.PARAMETERS[index], obj)); } + @Override public ContextItem get(ContextKey key) { if (FORIN_KEY.equals(key)) { return FORIN_MARKER; @@ -136,7 +141,7 @@ public class ForInContextSelector implements ContextSelector { @Override public String toString() { - return "for in hack filter for " + get(ContextKey.PARAMETERS[index]) + " over " + this.base; + return "parameter name filter for " + get(ContextKey.PARAMETERS[index]) + " over " + this.base; } /** @@ -182,8 +187,8 @@ public class ForInContextSelector implements ContextSelector { } } + private final ContextSelector base; -// private final ContextSelector oneLevel; private final int index; private void collectValues(DefUse du, SSAInstruction inst, MutableIntSet values) { @@ -219,40 +224,18 @@ public class ForInContextSelector implements ContextSelector { return dependentParameters; } - public ForInContextSelector(ContextSelector base) { + public ParameterNameContextSelector(ContextSelector base) { this(2, base); } - public ForInContextSelector(int index, ContextSelector base) { + public ParameterNameContextSelector(int index, ContextSelector base) { this.index = index; this.base = base; -// this.oneLevel = new OneLevelSiteContextSelector(base); } - private final HashMap forInOnFirstArg_cache = HashMapFactory.make(); private final HashMap du_cache = HashMapFactory.make(); private final IRFactory factory = AstIRFactory.makeDefaultFactory(); - // determine whether the method performs a for-in loop over the properties of its index'th argument - @SuppressWarnings("unused") - private boolean forInOnFirstArg(IMethod method) { - MethodReference mref = method.getReference(); - if(method.getNumberOfParameters() < index) - return false; - Boolean b = forInOnFirstArg_cache.get(mref); - if(b != null) - return b; - DefUse du = getDefUse(method); - for(SSAInstruction use : Iterator2Iterable.make(du.getUses(index+1))) { - if(use instanceof EachElementGetInstruction) { - forInOnFirstArg_cache.put(mref, true); - return true; - } - } - forInOnFirstArg_cache.put(mref, false); - return false; - } - private DefUse getDefUse(IMethod method) { MethodReference mref = method.getReference(); DefUse du = du_cache.get(mref); @@ -304,14 +287,7 @@ public class ForInContextSelector implements ContextSelector { public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); - String calleeFullName = callee.getDeclaringClass().getName().toString(); - String calleeShortName = calleeFullName.substring(calleeFullName.lastIndexOf('/')+1); - if(USE_NAME_TO_SELECT_CONTEXT) { - if(calleeShortName.contains(HACK_METHOD_STR) && receiver.length > index) { - // we assume that the argument is only used as a property name, so we can do ToString - return new ForInContext(baseContext, receiver[index]); - } - } else if(receiver.length > index) { + if(receiver.length > index) { Frequency f = usesFirstArgAsPropertyName(callee); if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) { if(receiver[index] == null) { @@ -322,15 +298,8 @@ public class ForInContextSelector implements ContextSelector { } } } - if (USE_CPA_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { - return new SelectiveCPAContext(baseContext, receiver); - } else if (USE_1LEVEL_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { + if (USE_1LEVEL_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { if (! identifyDependentParameters(caller, site).isEmpty()) { -// final Context calleeTarget = oneLevel.getCalleeTarget(caller, site, callee, receiver); -// // RECURSION CHECK: only add one level of caller-site contexts if the caller and callee methods are distinct -// if (!RecursionCheckContextSelector.recursiveContext(calleeTarget, callee)) { -// return calleeTarget; -// } // use a MarkerForInContext to clone based on the InstanceKey used in the caller context // TODO the cast below isn't safe; fix InstanceKey callerIk = ((ForInContext)caller.getContext()).getInstanceKey(); @@ -344,10 +313,7 @@ public class ForInContextSelector implements ContextSelector { public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { - if (USE_CPA_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { - // what about base.getRelevantParameters() here? - return identifyDependentParameters(caller, site); - } else if (caller.getIR().getCalls(site)[0].getNumberOfUses() > index) { + if (caller.getIR().getCalls(site)[0].getNumberOfUses() > index) { return IntSetUtil.make(new int[]{index}).union(base.getRelevantParameters(caller, site)); } else { return base.getRelevantParameters(caller, site); From fcd28ee419ae6c77e6e410f0c5b929ac7447568f Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Mon, 3 Jun 2013 14:13:37 +0800 Subject: [PATCH 139/187] More refactoring of ParameterNameContextSelector, which is now called PropertyNameContextSelector. --- .../cast/js/rhino/test/HTMLCGBuilder.java | 6 +- .../wala/cast/js/test/TestForInLoopHack.java | 4 +- .../js/test/TestSimpleCallGraphShape.java | 4 +- ....java => PropertyNameContextSelector.java} | 145 ++++-------------- .../js/ipa/callgraph/SelectiveCPAContext.java | 72 +++++++++ 5 files changed, 113 insertions(+), 118 deletions(-) rename com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/{ParameterNameContextSelector.java => PropertyNameContextSelector.java} (64%) create mode 100644 com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 0143302ce..7b302ddde 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -20,7 +20,7 @@ import java.util.Properties; import junit.framework.Assert; import com.ibm.wala.cast.ir.translator.AstTranslator; -import com.ibm.wala.cast.js.ipa.callgraph.ParameterNameContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; import com.ibm.wala.cast.js.ipa.callgraph.RecursionCheckContextSelector; @@ -95,8 +95,8 @@ public class HTMLCGBuilder { JSCFABuilder builder = null; try { builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url, builderType); - builder.setContextSelector(new ParameterNameContextSelector(2, builder.getContextSelector())); - builder.setContextSelector(new ParameterNameContextSelector(3, builder.getContextSelector())); + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 3, builder.getContextSelector())); // TODO we need to find a better way to do this ContextSelector delegation; // the code below belongs somewhere else!!! // the bound of 4 is what is needed to pass our current framework tests diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java index beaea9e19..4a54d4809 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHack.java @@ -18,7 +18,7 @@ import org.junit.Ignore; import org.junit.Test; import com.ibm.wala.cast.js.html.JSSourceExtractor; -import com.ibm.wala.cast.js.ipa.callgraph.ParameterNameContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.ContextSelector; @@ -173,7 +173,7 @@ public abstract class TestForInLoopHack extends TestJSCallGraphShape { private void addHackedForInLoopSensitivity(JSCFABuilder builder) { final ContextSelector orig = builder.getContextSelector(); - builder.setContextSelector(new ParameterNameContextSelector(orig)); + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), orig)); } } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 7f06df56b..0c3e67710 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -19,7 +19,7 @@ import junit.framework.Assert; import org.junit.Test; -import com.ibm.wala.cast.js.ipa.callgraph.ParameterNameContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.util.Util; @@ -609,7 +609,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { @Test public void testArrayIndexConv2() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "array_index_conv2.js"); - b.setContextSelector(new ParameterNameContextSelector(b.getContextSelector())); + b.setContextSelector(new PropertyNameContextSelector(b.getAnalysisCache(), b.getContextSelector())); CallGraph cg = b.makeCallGraph(b.getOptions()); //JSCallGraphUtil.AVOID_DUMP = false; //JSCallGraphUtil.dumpCG(b.getPointerAnalysis(), cg); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ParameterNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java similarity index 64% rename from com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ParameterNameContextSelector.java rename to com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index db281882d..f8aa86f68 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ParameterNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -12,10 +12,8 @@ package com.ibm.wala.cast.js.ipa.callgraph; import java.util.Collections; import java.util.HashMap; -import java.util.Map; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; -import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.ClosureExtractor; @@ -23,24 +21,20 @@ import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; -import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; -import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; -import com.ibm.wala.ssa.IR; -import com.ibm.wala.ssa.IRFactory; import com.ibm.wala.ssa.ReflectiveMemberAccess; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; import com.ibm.wala.ssa.SSAGetInstruction; import com.ibm.wala.ssa.SSAInstruction; -import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Iterator2Iterable; @@ -54,85 +48,24 @@ import com.ibm.wala.util.intset.MutableIntSet; * * Works together with {@link CorrelationFinder} and {@link ClosureExtractor} * to implement correlation tracking. - * - * @author mschaefer - * */ -public class ParameterNameContextSelector implements ContextSelector { - public final static ContextKey FORIN_KEY = new ContextKey() { }; - public final static ContextKey FORIN_PARM_INDEX = new ContextKey() { }; - - public static final ContextItem FORIN_MARKER = new ContextItem() { }; - - public static boolean USE_1LEVEL_IN_BODIES = true; +public class PropertyNameContextSelector implements ContextSelector { + public final static ContextKey PROPNAME_KEY = new ContextKey() { }; + public static final ContextItem PROPNAME_MARKER = new ContextItem() { }; - public static boolean DEPENDENT_THRU_READS = true; + public final static ContextKey PROPNAME_PARM_INDEX = new ContextKey() { }; - public static class SelectiveCPAContext implements Context { - protected final Context base; - - private final Map parameterObjs; - - private final int hashCode; - - private static Map makeMap(InstanceKey[] x) { - Map result = new HashMap(); - for(int i = 0; i < x.length; i++) { - if (x[i] != null) { - result.put(ContextKey.PARAMETERS[i], x[i]); - } - } - return result; - } - - public SelectiveCPAContext(Context base, InstanceKey[] x) { - this(base, makeMap(x)); - } - - public SelectiveCPAContext(Context base, Map parameterObjs) { - this.base = base; - this.parameterObjs = parameterObjs; - hashCode = base.hashCode() ^ parameterObjs.hashCode(); - } - - public ContextItem get(ContextKey name) { - if (parameterObjs.containsKey(name)) { - return new FilteredPointerKey.SingleInstanceFilter(parameterObjs.get(name)); - } else { - return base.get(name); - } - } - - @Override - public int hashCode() { - return hashCode; - } - - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } - return other != null && - getClass().equals(other.getClass()) && - base.equals(((SelectiveCPAContext)other).base) && - parameterObjs.equals(((SelectiveCPAContext)other).parameterObjs); - } - - - } - - public class ForInContext extends SelectiveCPAContext { - - ForInContext(Context base, InstanceKey obj) { + /** Context representing a particular name accessed by a correlated read/write pair. */ + public class PropNameContext extends SelectiveCPAContext { + PropNameContext(Context base, InstanceKey obj) { super(base, Collections.singletonMap(ContextKey.PARAMETERS[index], obj)); } @Override public ContextItem get(ContextKey key) { - if (FORIN_KEY.equals(key)) { - return FORIN_MARKER; - } else if(FORIN_PARM_INDEX.equals(key)) { + if (PROPNAME_KEY.equals(key)) { + return PROPNAME_MARKER; + } else if(PROPNAME_PARM_INDEX.equals(key)) { return ContextItem.Value.make(index); } else { return super.get(key); @@ -141,7 +74,7 @@ public class ParameterNameContextSelector implements ContextSelector { @Override public String toString() { - return "parameter name filter for " + get(ContextKey.PARAMETERS[index]) + " over " + this.base; + return "property name context for " + get(ContextKey.PARAMETERS[index]) + " over " + this.base; } /** @@ -154,19 +87,19 @@ public class ParameterNameContextSelector implements ContextSelector { /** * A "dummy" for-in context used for callees of a method analyzed in a real - * {@link ForInContext}. The purpose of this class is to clone callees based + * {@link PropNameContext}. The purpose of this class is to clone callees based * on the same {@link InstanceKey} used for the caller context, but without * returning a {@link SingleInstanceFilter} {@link ContextItem} that filters * possible parameter values. */ - class MarkerForInContext extends ForInContext { + class MarkerForInContext extends PropNameContext { MarkerForInContext(Context base, InstanceKey obj) { super(base, obj); } /** - * Like {@link ForInContext#get(ContextKey)}, but don't return a + * Like {@link PropNameContext#get(ContextKey)}, but don't return a * {@link SingleInstanceFilter} for the distinguishing {@link InstanceKey} */ @Override @@ -179,7 +112,7 @@ public class ParameterNameContextSelector implements ContextSelector { * we need to override this method since * {@link MarkerForInContext#get(ContextKey)} does not return the * {@link SingleInstanceFilter} containing the {@link InstanceKey}. Instead, - * we invoke {@link ForInContext#get(ContextKey)} from the superclass. + * we invoke {@link PropNameContext#get(ContextKey)} from the superclass. */ @Override public InstanceKey getInstanceKey() { @@ -188,6 +121,7 @@ public class ParameterNameContextSelector implements ContextSelector { } + private final AnalysisCache cache; private final ContextSelector base; private final int index; @@ -211,45 +145,32 @@ public class ParameterNameContextSelector implements ContextSelector { MutableIntSet dependentParameters = IntSetUtil.make(); SSAAbstractInvokeInstruction inst = caller.getIR().getCalls(site)[0]; DefUse du = caller.getDU(); + for(int i = 0; i < inst.getNumberOfParameters(); i++) { MutableIntSet values = IntSetUtil.make(); values.add(inst.getUse(i)); - if (DEPENDENT_THRU_READS) { - collectValues(du, du.getDef(inst.getUse(i)), values); - } - if (values.contains(index+1)) { + collectValues(du, du.getDef(inst.getUse(i)), values); + if (values.contains(index+1)) dependentParameters.add(i); - } } + return dependentParameters; } - public ParameterNameContextSelector(ContextSelector base) { - this(2, base); + public PropertyNameContextSelector(AnalysisCache cache, ContextSelector base) { + this(cache, 2, base); } - public ParameterNameContextSelector(int index, ContextSelector base) { + public PropertyNameContextSelector(AnalysisCache cache, int index, ContextSelector base) { + this.cache = cache; this.index = index; this.base = base; } - private final HashMap du_cache = HashMapFactory.make(); - private final IRFactory factory = AstIRFactory.makeDefaultFactory(); - - private DefUse getDefUse(IMethod method) { - MethodReference mref = method.getReference(); - DefUse du = du_cache.get(mref); - if(du == null) { - IR ir = factory.makeIR(method, Everywhere.EVERYWHERE, SSAOptions.defaultOptions()); - du_cache.put(mref, du = new DefUse(ir)); - } - return du; - } - private enum Frequency { NEVER, SOMETIMES, ALWAYS }; private final HashMap usesFirstArgAsPropertyName_cache = HashMapFactory.make(); - // determine whether the method never/sometimes/always uses its first argument as a property name + /** Determine whether the method never/sometimes/always uses its first argument as a property name. */ private Frequency usesFirstArgAsPropertyName(IMethod method) { MethodReference mref = method.getReference(); if(method.getNumberOfParameters() < index) @@ -258,7 +179,7 @@ public class ParameterNameContextSelector implements ContextSelector { if(f != null) return f; boolean usedAsPropertyName = false, usedAsSomethingElse = false; - DefUse du = getDefUse(method); + DefUse du = cache.getDefUse(cache.getIR(method)); for(SSAInstruction use : Iterator2Iterable.make(du.getUses(index+1))) { if(use instanceof ReflectiveMemberAccess) { ReflectiveMemberAccess rma = (ReflectiveMemberAccess)use; @@ -287,22 +208,24 @@ public class ParameterNameContextSelector implements ContextSelector { public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); + if(receiver.length > index) { Frequency f = usesFirstArgAsPropertyName(callee); if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) { if(receiver[index] == null) { IClass undef = caller.getClassHierarchy().lookupClass(JavaScriptTypes.Undefined); - return new ForInContext(baseContext, new ConcreteTypeKey(undef)); + return new PropNameContext(baseContext, new ConcreteTypeKey(undef)); } else { - return new ForInContext(baseContext, receiver[index]); + return new PropNameContext(baseContext, receiver[index]); } } } - if (USE_1LEVEL_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) { - if (! identifyDependentParameters(caller, site).isEmpty()) { + + if (PROPNAME_MARKER.equals(caller.getContext().get(PROPNAME_KEY))) { + if (!identifyDependentParameters(caller, site).isEmpty()) { // use a MarkerForInContext to clone based on the InstanceKey used in the caller context // TODO the cast below isn't safe; fix - InstanceKey callerIk = ((ForInContext)caller.getContext()).getInstanceKey(); + InstanceKey callerIk = ((PropNameContext)caller.getContext()).getInstanceKey(); return new MarkerForInContext(baseContext, callerIk); } else { return baseContext; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java new file mode 100644 index 000000000..65c41bbdb --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java @@ -0,0 +1,72 @@ +package com.ibm.wala.cast.js.ipa.callgraph; + +import java.util.HashMap; +import java.util.Map; + +import com.ibm.wala.ipa.callgraph.Context; +import com.ibm.wala.ipa.callgraph.ContextItem; +import com.ibm.wala.ipa.callgraph.ContextKey; +import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; + +/** + * A selective Cartesian product context that enforces object sensitivity on some set + * of parameter positions. + */ +public class SelectiveCPAContext implements Context { + // base context + protected final Context base; + + // maps parameters to their abstract objects + private final Map parameterObjs; + + // cached hash code + private final int hashCode; + + // helper method for constructing the parameterObjs map + private static Map makeMap(InstanceKey[] x) { + Map result = new HashMap(); + for(int i = 0; i < x.length; i++) { + if (x[i] != null) { + result.put(ContextKey.PARAMETERS[i], x[i]); + } + } + return result; + } + + public SelectiveCPAContext(Context base, InstanceKey[] x) { + this(base, makeMap(x)); + } + + public SelectiveCPAContext(Context base, Map parameterObjs) { + this.base = base; + this.parameterObjs = parameterObjs; + hashCode = base.hashCode() ^ parameterObjs.hashCode(); + } + + public ContextItem get(ContextKey name) { + if (parameterObjs.containsKey(name)) { + return new FilteredPointerKey.SingleInstanceFilter(parameterObjs.get(name)); + } else { + return base.get(name); + } + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + return other != null && + getClass().equals(other.getClass()) && + base.equals(((SelectiveCPAContext)other).base) && + parameterObjs.equals(((SelectiveCPAContext)other).parameterObjs); + } + + +} \ No newline at end of file From 26896049a793ebd785d7727f6fab1e1fa3317359 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 3 Jun 2013 10:44:06 -0700 Subject: [PATCH 140/187] add crashing test case (currently ignored) --- .../examples-src/tests/try-finally-crash.js | 11 +++++++++++ .../wala/cast/js/test/TestSimpleCallGraphShape.java | 11 +++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/try-finally-crash.js diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/try-finally-crash.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/try-finally-crash.js new file mode 100644 index 000000000..470ff8bfc --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/try-finally-crash.js @@ -0,0 +1,11 @@ +var x = function() { + try { + y; + } catch (e) { + for (0; this.p.q; ) {} + } finally { + return; + } +}; + +x(); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 0c3e67710..ff8d35f70 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -17,12 +17,12 @@ import java.util.Set; import junit.framework.Assert; +import org.junit.Ignore; import org.junit.Test; -import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; -import com.ibm.wala.cast.js.util.Util; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException; @@ -648,6 +648,13 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { JSCallGraphBuilderUtil.makeScriptCG("tests", "dead_catch.js"); } + @Ignore("need a bug fix") + @Test + public void testTryFinallyCrash() throws IllegalArgumentException, IOException, CancelException, WalaException { + JSCallGraphBuilderUtil.makeScriptCG("tests", "try-finally-crash.js"); + } + + @Test(expected = CallGraphBuilderCancelException.class) public void testManyStrings() throws IllegalArgumentException, IOException, CancelException, WalaException { SSAPropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "many-strings.js"); From 98e83e5103546d83f2584739b1c44c9859fc60c0 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 3 Jun 2013 14:03:28 -0700 Subject: [PATCH 141/187] another test for Function.prototype.apply handling --- .../examples-src/tests/function_apply3.js | 5 +++++ .../wala/cast/js/test/TestSimpleCallGraphShape.java | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/function_apply3.js diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/function_apply3.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/function_apply3.js new file mode 100644 index 000000000..929f01058 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/function_apply3.js @@ -0,0 +1,5 @@ +function foo() { alert("hello"); } + +var y = Function.prototype.apply; + +y.apply(foo); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index ff8d35f70..3c253a2fc 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -380,7 +380,17 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_apply2.js"); verifyGraphAssertions(CG, assertionsForFunctionApply2); } - + + private static final Object[][] assertionsForFunctionApply3 = new Object[][] { + new Object[] { ROOT, new String[] { "tests/function_apply3.js" } }, + new Object[] { "suffix:apply", new String[] { "suffix:foo" } } }; + + @Test + public void testFunctionDotApply3() throws IOException, IllegalArgumentException, CancelException, WalaException { + CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_apply3.js"); + verifyGraphAssertions(CG, assertionsForFunctionApply3); + } + private static final Object[][] assertionsForWrap1 = new Object[][] { new Object[] { ROOT, new String[] { "tests/wrap1.js" } }, new Object[] { "suffix:wrap1.js", new String[] { "suffix:i_am_reachable" } } }; From 68db1cc2797122ddfa35a6f1f60972651cb727b1 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 3 Jun 2013 16:47:02 -0700 Subject: [PATCH 142/187] avoid recursive apply contexts --- .../ipa/callgraph/JavaScriptFunctionApplyContextSelector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java index ed0d24f5a..49771f54f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java @@ -131,7 +131,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { isNonNullArray = true; } } - if (USE_ONE_LEVEL) + if (USE_ONE_LEVEL && caller.getContext().get(APPLY_NON_NULL_ARGS) == null) baseCtxt = oneLevel.getCalleeTarget(caller, site, callee, receiver); return new ApplyContext(baseCtxt, isNonNullArray); } else if (USE_ONE_LEVEL && tn.equals(CALL_TYPE_NAME)) { From 0c67118fe25d573a7384c20e89093e88968fd55f Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 14:30:52 +0800 Subject: [PATCH 143/187] Temporary commit; things are broken, but I need to switch back to master for a bit. --- .../cast/js/rhino/test/HTMLCGBuilder.java | 10 +---- .../wala/cast/js/test/TestRhinoSourceMap.java | 6 ++- .../cast/js/test/JSCallGraphBuilderUtil.java | 43 ++++++++++++++++--- .../cast/js/test/TestArgumentSensitivity.java | 2 +- .../js/test/TestSimpleCallGraphShape.java | 12 ++++++ .../js/ipa/callgraph/JSCallGraphUtil.java | 15 +++---- .../PropertyNameContextSelector.java | 4 ++ .../correlations/CorrelationFinder.java | 27 ++++++++---- .../extraction/ClosureExtractor.java | 3 +- .../CorrelatedPairExtractorFactory.java | 10 +++++ 10 files changed, 95 insertions(+), 37 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 7b302ddde..bfd67e693 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -75,12 +75,10 @@ public class HTMLCGBuilder { * the HTML page to analyse, can either be a path to a local file or a URL * @param timeout * analysis timeout in seconds, -1 means no timeout - * @param automated_extraction - * whether to automatically extract correlated pairs * @throws IOException * @throws ClassHierarchyException */ - public static CGBuilderResult buildHTMLCG(String src, int timeout, boolean automated_extraction, CGBuilderType builderType) + public static CGBuilderResult buildHTMLCG(String src, int timeout, CGBuilderType builderType) throws ClassHierarchyException, IOException { CGBuilderResult res = new CGBuilderResult(); URL url = null; @@ -90,13 +88,9 @@ public class HTMLCGBuilder { Assert.fail("Could not find page to analyse: " + src); } com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); - if(automated_extraction) - com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setPreprocessor(new CorrelatedPairExtractorFactory(new CAstRhinoTranslatorFactory(), url)); JSCFABuilder builder = null; try { builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url, builderType); - builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); - builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 3, builder.getContextSelector())); // TODO we need to find a better way to do this ContextSelector delegation; // the code below belongs somewhere else!!! // the bound of 4 is what is needed to pass our current framework tests @@ -191,7 +185,7 @@ public class HTMLCGBuilder { JavaScriptFunctionDotCallTargetSelector.WARN_ABOUT_IMPRECISE_CALLGRAPH = false; // build call graph - CGBuilderResult res = buildHTMLCG(src, timeout, true, AstTranslator.NEW_LEXICAL ? CGBuilderType.ONE_CFA_PRECISE_LEXICAL : CGBuilderType.ZERO_ONE_CFA); + CGBuilderResult res = buildHTMLCG(src, timeout, AstTranslator.NEW_LEXICAL ? CGBuilderType.ONE_CFA_PRECISE_LEXICAL : CGBuilderType.ZERO_ONE_CFA); if(res.construction_time == -1) System.out.println("TIMED OUT"); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index a03c298d2..9e3b1893a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -16,6 +16,7 @@ import static com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFa import static com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.makeScriptScope; import java.io.IOException; +import java.net.URL; import java.util.Map; import junit.framework.Assert; @@ -160,8 +161,9 @@ public class TestRhinoSourceMap { sources.put(assertion[0], assertion[1]); } - JavaScriptLoaderFactory loaders = makeLoaders(); - AnalysisScope scope = makeScriptScope("tests", fileName, loaders); + URL script = TestRhinoSourceMap.class.getClassLoader().getResource(fileName); + JavaScriptLoaderFactory loaders = makeLoaders(null); + AnalysisScope scope = makeScriptScope(script, "tests", fileName, loaders); IClassHierarchy cha = makeHierarchy(scope, loaders); for(IClass cls : cha) { if (cls.getName().toString().contains(fileName)) { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 43337a48c..bafb1d553 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -27,9 +27,12 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.CorrelatedPairExtractorFactory; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.loader.CAstAbstractLoader; +import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.SourceFileModule; import com.ibm.wala.classLoader.SourceModule; @@ -52,19 +55,25 @@ import com.ibm.wala.util.WalaException; public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil { public static enum CGBuilderType { - ZERO_ONE_CFA(false, false, true), ZERO_ONE_CFA_NO_CALL_APPLY(false, false, false), ZERO_ONE_CFA_PRECISE_LEXICAL(false, true, - true), ONE_CFA(true, false, true), ONE_CFA_PRECISE_LEXICAL(true, true, true); + ZERO_ONE_CFA(false, false, true, true), + ZERO_ONE_CFA_NO_CALL_APPLY(false, false, false, true), + ZERO_ONE_CFA_PRECISE_LEXICAL(false, true, true, true), + ONE_CFA(true, false, true, true), + ONE_CFA_PRECISE_LEXICAL(true, true, true, true); private final boolean useOneCFA; private final boolean usePreciseLexical; private final boolean handleCallApply; + + private final boolean extractCorrelatedPairs; - private CGBuilderType(boolean useOneCFA, boolean usePreciseLexical, boolean handleCallApply) { + private CGBuilderType(boolean useOneCFA, boolean usePreciseLexical, boolean handleCallApply, boolean extractCorrelatedPairs) { this.useOneCFA = useOneCFA; this.usePreciseLexical = usePreciseLexical; this.handleCallApply = handleCallApply; + this.extractCorrelatedPairs = extractCorrelatedPairs; } public boolean useOneCFA() { @@ -74,26 +83,40 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public boolean usePreciseLexical() { return usePreciseLexical; } + public boolean handleCallApply() { return handleCallApply; } + public boolean extractCorrelatedPairs() { + return extractCorrelatedPairs; + } } public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { - JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(); + URL script = getURLforFile(dir, name); + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; + JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(preprocessor); - AnalysisScope scope = makeScriptScope(dir, name, loaders); + AnalysisScope scope = makeScriptScope(script, dir, name, loaders); return makeCG(loaders, scope, builderType, AstIRFactory.makeDefaultFactory()); } - static AnalysisScope makeScriptScope(String dir, String name, JavaScriptLoaderFactory loaders) throws IOException { + private static URL getURLforFile(String dir, String name) { URL script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + File.separator + name); if (script == null) { script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + "/" + name); } assert script != null : "cannot find " + dir + " and " + name; + return script; + } + + static AnalysisScope makeScriptScope(String dir, String name, JavaScriptLoaderFactory loaders) throws IOException { + return makeScriptScope(getURLforFile(dir, name), dir, name, loaders); + } + + static AnalysisScope makeScriptScope(URL script, String dir, String name, JavaScriptLoaderFactory loaders) throws IOException { AnalysisScope scope; if (script.openConnection() instanceof JarURLConnection) { scope = makeScope(new URL[] { script }, loaders, JavaScriptLoader.JS); @@ -122,7 +145,8 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { - PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(), scripts, builderType, irFactory); + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, scripts) : null; + PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(preprocessor), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); return CG; @@ -136,6 +160,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; IRFactory irFactory = AstIRFactory.makeDefaultFactory(); + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, url) : null; JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; @@ -146,6 +171,8 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J ((CAstAbstractLoader)loaders.getTheLoader()).addMessage(dummy, e.warning); } JSCFABuilder builder = makeCGBuilder(loaders, scripts, builderType, irFactory); + if(builderType.extractCorrelatedPairs) + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); builder.setBaseURL(url); return builder; } @@ -180,6 +207,8 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J AnalysisCache cache = makeCache(irFactory); JSCFABuilder builder = new JSZeroOrOneXCFABuilder(cha, options, cache, null, null, ZeroXInstanceKeys.ALLOCATIONS, builderType.useOneCFA()); + if(builderType.extractCorrelatedPairs()) + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); return builder; } catch (ClassHierarchyException e) { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java index 9a2724dc0..07eb07350 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java @@ -41,7 +41,7 @@ public abstract class TestArgumentSensitivity extends TestJSCallGraphShape { new Object[] { "tests/args.js/a", new String[] { "tests/args.js/y", "tests/args.js/z", "!tests/args.js/wrong" } } }; @Test public void testArgs() throws IOException, IllegalArgumentException, CancelException, ClassHierarchyException, WalaException { - JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(); + JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(null); AnalysisScope scope = JSCallGraphBuilderUtil.makeScriptScope("tests", "args.js", loaders); IClassHierarchy cha = JSCallGraphBuilderUtil.makeHierarchy(scope, loaders); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 3c253a2fc..8715bc855 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -652,6 +652,18 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { //JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); verifyGraphAssertions(CG, assertionsForDeadCode); } + + private static final Object[][] assertionsForExtend = new Object[][] { + new Object[] { ROOT, new String[] { "tests/extend.js" } }, + new Object[] { "tests/extend.js", new String[] { "suffix:foo", "!suffix:bar" } } + }; + + @Test + public void testExtend() throws IOException, WalaException, IllegalArgumentException, CancelException { + JSCFABuilder builder = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "extend.js"); + CallGraph cg = builder.makeCallGraph(builder.getOptions()); + verifyGraphAssertions(cg, assertionsForExtend); + } @Test public void testDeadCatch() throws IllegalArgumentException, IOException, CancelException, WalaException { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index c998c5398..d02ae3ff4 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -63,11 +63,6 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra */ public static JavaScriptTranslatorFactory translatorFactory; - /** - * preprocessor to run generated CAst trees through, null if none - */ - public static CAstRewriterFactory preprocessor; - /** * Set up the translator factory. This method should be called before invoking * {@link #makeLoaders()}. @@ -80,10 +75,6 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra return translatorFactory; } - public static void setPreprocessor(CAstRewriterFactory preprocessor) { - JSCallGraphUtil.preprocessor = preprocessor; - } - public static JSAnalysisOptions makeOptions(AnalysisScope scope, IClassHierarchy cha, Iterable roots) { final JSAnalysisOptions options = new JSAnalysisOptions(scope, /* * AstIRFactory. @@ -101,7 +92,11 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra return options; } - public static JavaScriptLoaderFactory makeLoaders() { + /** + * @param preprocessor CAst rewriter to use for preprocessing JavaScript source files; may be null + * @return + */ + public static JavaScriptLoaderFactory makeLoaders(CAstRewriterFactory preprocessor) { if (translatorFactory == null) { throw new IllegalStateException("com.ibm.wala.cast.js.ipa.callgraph.Util.setTranslatorFactory() must be invoked before makeLoaders()"); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index f8aa86f68..ff0ca7ba3 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.HashMap; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; +import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.ClosureExtractor; @@ -27,14 +28,17 @@ import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; +import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; +import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.ReflectiveMemberAccess; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; import com.ibm.wala.ssa.SSAGetInstruction; import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Iterator2Iterable; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index f69be0d93..81719d3e7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; @@ -78,7 +79,6 @@ public class CorrelationFinder { private final JavaScriptTranslatorFactory translatorFactory; - @SuppressWarnings("unused") public static CorrelationSummary findCorrelatedAccesses(IMethod method, IR ir) { AstMethod astMethod = (AstMethod)method; DefUse du = new DefUse(ir); @@ -229,7 +229,10 @@ public class CorrelationFinder { @SuppressWarnings("unused") private void printCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { - Map summaries = findCorrelatedAccesses(url); + printCorrelatedAccesses(findCorrelatedAccesses(url)); + } + + private void printCorrelatedAccesses(Map summaries) { List> correlations = new ArrayList>(); for(CorrelationSummary summary : summaries.values()) correlations.addAll(summary.pp()); @@ -247,21 +250,25 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); - Set script = null; + Set scripts = null; try { - script = WebUtil.extractScriptFromHTML(url).fst; + scripts = WebUtil.extractScriptFromHTML(url).fst; } catch (Error e) { assert false : e.warning; } - Map summaries = findCorrelatedAccesses(script); + Map summaries = findCorrelatedAccesses(scripts); return summaries; } - public Map findCorrelatedAccesses(Set script) throws IOException, + public Map findCorrelatedAccesses(Collection scripts) throws IOException, + ClassHierarchyException { + return findCorrelatedAccesses(scripts.toArray(new SourceModule[scripts.size()])); + } + + public Map findCorrelatedAccesses(SourceModule[] scripts_array) throws IOException, ClassHierarchyException { - SourceModule[] scripts = script.toArray(new SourceModule[script.size()]); WebPageLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory); - CAstAnalysisScope scope = new CAstAnalysisScope(scripts, loaders, Collections.singleton(JavaScriptLoader.JS)); + CAstAnalysisScope scope = new CAstAnalysisScope(scripts_array, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); try { Util.checkForFrontEndErrors(cha); @@ -274,11 +281,15 @@ public class CorrelationFinder { for(IClass klass : cha) { for(IMethod method : klass.getAllMethods()) { IR ir = factory.makeIR(method, Everywhere.EVERYWHERE, SSAOptions.defaultOptions()); + if(method.toString().endsWith("__WINDOW_MAIN__>")) + System.out.println(ir); CorrelationSummary summary = findCorrelatedAccesses(method, ir); if(!summary.getCorrelations().isEmpty()) correlations.put(method, summary); } } + + printCorrelatedAccesses(correlations); return correlations; } 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 5e7b91890..5f05ea121 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 @@ -50,6 +50,7 @@ import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder; import com.ibm.wala.cast.tree.impl.CAstOperator; import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; +import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; @@ -419,7 +420,7 @@ public class ClosureExtractor extends CAstRewriterExt { boolean extractingEmpty = false; String name = EXTRACTED_FUN_BASENAME + (anonymous_counter++); - + // Create a new entity for the extracted function. ExtractedFunction new_entity = new ExtractedFunction(name, context); context.setExtractedEntity(new_entity); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index b52f97cd3..f1b05e5d9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction; import java.io.IOException; import java.net.URL; +import java.util.Collection; import java.util.Map; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; @@ -23,6 +24,7 @@ import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.ipa.cha.ClassHierarchyException; public class CorrelatedPairExtractorFactory implements CAstRewriterFactory { @@ -32,6 +34,14 @@ public class CorrelatedPairExtractorFactory implements CAstRewriterFactory scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + } + + public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, SourceModule[] scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + } + public CorrelatedPairExtractorFactory(Map summaries) { this.summaries = summaries; } From f2e4fc572ed088e262fb8f32886c1b206478e270 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 15:55:59 +0800 Subject: [PATCH 144/187] Correlation finder now handles both HTML files and raw JS files as input, doesn't use WebPageLoaderFactory to create CAst anymore. --- .../cast/js/rhino/test/HTMLCGBuilder.java | 2 -- .../TestCorrelatedPairExtractionRhino.java | 3 +- .../wala/cast/js/test/TestRhinoSourceMap.java | 3 +- .../examples-src/tests/extend.js | 11 +++++++ .../cast/js/test/JSCallGraphBuilderUtil.java | 8 ++--- .../js/test/TestSimpleCallGraphShape.java | 2 +- .../correlations/CorrelationFinder.java | 31 +++++++++---------- .../CorrelatedPairExtractorFactory.java | 12 +++---- 8 files changed, 38 insertions(+), 34 deletions(-) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index bfd67e693..62e3a0991 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -20,11 +20,9 @@ import java.util.Properties; import junit.framework.Assert; import com.ibm.wala.cast.ir.translator.AstTranslator; -import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; import com.ibm.wala.cast.js.ipa.callgraph.RecursionCheckContextSelector; -import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.CorrelatedPairExtractorFactory; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.CGBuilderType; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index 3f6d96c3a..0017593c2 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -15,7 +15,6 @@ import java.io.IOException; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; -import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; @@ -23,7 +22,7 @@ import com.ibm.wala.classLoader.SourceModule; public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtraction { protected CorrelationFinder makeCorrelationFinder() { - return new CorrelationFinder(new CAstRhinoTranslatorFactory()); + return new CorrelationFinder(); } protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index 9e3b1893a..2db00dfc1 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -161,9 +161,8 @@ public class TestRhinoSourceMap { sources.put(assertion[0], assertion[1]); } - URL script = TestRhinoSourceMap.class.getClassLoader().getResource(fileName); JavaScriptLoaderFactory loaders = makeLoaders(null); - AnalysisScope scope = makeScriptScope(script, "tests", fileName, loaders); + AnalysisScope scope = makeScriptScope("tests", fileName, loaders); IClassHierarchy cha = makeHierarchy(scope, loaders); for(IClass cls : cha) { if (cls.getName().toString().contains(fileName)) { diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js new file mode 100644 index 000000000..feb5ab502 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js @@ -0,0 +1,11 @@ +function extend(dest, src) { + for(var p in src) + dest[p] = src[p]; +} + +var obj = {}; +extend(obj, { + foo: function foo() {}, + bar: function bar() {} +}); +obj.bar(); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index bafb1d553..6d21b74e0 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -95,7 +95,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { URL script = getURLforFile(dir, name); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(script) : null; JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(preprocessor); AnalysisScope scope = makeScriptScope(script, dir, name, loaders); @@ -103,7 +103,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J return makeCG(loaders, scope, builderType, AstIRFactory.makeDefaultFactory()); } - private static URL getURLforFile(String dir, String name) { + public static URL getURLforFile(String dir, String name) { URL script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + File.separator + name); if (script == null) { script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + "/" + name); @@ -145,7 +145,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, scripts) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(scripts) : null; PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(preprocessor), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); @@ -160,7 +160,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; IRFactory irFactory = AstIRFactory.makeDefaultFactory(); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, url) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(url) : null; JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 8715bc855..ac5bc0655 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -655,7 +655,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { private static final Object[][] assertionsForExtend = new Object[][] { new Object[] { ROOT, new String[] { "tests/extend.js" } }, - new Object[] { "tests/extend.js", new String[] { "suffix:foo", "!suffix:bar" } } + new Object[] { "tests/extend.js", new String[] { "suffix:bar", "!suffix:foo" } } }; @Test diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 81719d3e7..3b5fd94a7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -30,10 +30,10 @@ import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; import com.ibm.wala.cast.ir.ssa.AbstractReflectivePut; import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; -import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.loader.JavaScriptLoader; -import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; +import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; @@ -41,6 +41,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.SourceModule; +import com.ibm.wala.classLoader.SourceURLModule; import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.ClassHierarchyException; @@ -77,8 +78,6 @@ public class CorrelationFinder { private final static boolean TRACK_ESCAPES = true; private final static boolean IGNORE_NUMERIC_INDICES = false; - private final JavaScriptTranslatorFactory translatorFactory; - public static CorrelationSummary findCorrelatedAccesses(IMethod method, IR ir) { AstMethod astMethod = (AstMethod)method; DefUse du = new DefUse(ir); @@ -249,12 +248,17 @@ public class CorrelationFinder { } public Map findCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { - JavaScriptLoader.addBootstrapFile(WebUtil.preamble); Set scripts = null; - try { - scripts = WebUtil.extractScriptFromHTML(url).fst; - } catch (Error e) { - assert false : e.warning; + if(url.getPath().endsWith(".js")) { + scripts = Collections.singleton(new SourceURLModule(url)); + } else { + JavaScriptLoader.addBootstrapFile(WebUtil.preamble); + try { + scripts = WebUtil.extractScriptFromHTML(url).fst; + } catch (Error e) { + e.printStackTrace(); + assert false : e.warning; + } } Map summaries = findCorrelatedAccesses(scripts); return summaries; @@ -267,7 +271,7 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(SourceModule[] scripts_array) throws IOException, ClassHierarchyException { - WebPageLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory); + JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(null); CAstAnalysisScope scope = new CAstAnalysisScope(scripts_array, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); try { @@ -281,15 +285,12 @@ public class CorrelationFinder { for(IClass klass : cha) { for(IMethod method : klass.getAllMethods()) { IR ir = factory.makeIR(method, Everywhere.EVERYWHERE, SSAOptions.defaultOptions()); - if(method.toString().endsWith("__WINDOW_MAIN__>")) - System.out.println(ir); CorrelationSummary summary = findCorrelatedAccesses(method, ir); if(!summary.getCorrelations().isEmpty()) correlations.put(method, summary); } } - printCorrelatedAccesses(correlations); return correlations; } @@ -304,8 +305,4 @@ public class CorrelationFinder { return new URL(src); } } - - public CorrelationFinder(JavaScriptTranslatorFactory translatorFactory) { - this.translatorFactory = translatorFactory; - } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index f1b05e5d9..d542f3c1e 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -30,16 +30,16 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; public class CorrelatedPairExtractorFactory implements CAstRewriterFactory { private final Map summaries; - public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, URL entryPoint) throws ClassHierarchyException, IOException { - this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(entryPoint)); + public CorrelatedPairExtractorFactory(URL entryPoint) throws ClassHierarchyException, IOException { + this(new CorrelationFinder().findCorrelatedAccesses(entryPoint)); } - public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, Collection scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + public CorrelatedPairExtractorFactory(Collection scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder().findCorrelatedAccesses(scripts)); } - public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, SourceModule[] scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + public CorrelatedPairExtractorFactory(SourceModule[] scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder().findCorrelatedAccesses(scripts)); } public CorrelatedPairExtractorFactory(Map summaries) { From c4c1c2c02784cf87883f10a74f595fe61d270bff Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 16:32:55 +0800 Subject: [PATCH 145/187] Introducing convenience method for creating a loader factory without a preprocessor. --- .../com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index d02ae3ff4..7f13debc8 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -102,6 +102,10 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra } return new JavaScriptLoaderFactory(translatorFactory, preprocessor); } + + public static JavaScriptLoaderFactory makeLoaders() { + return makeLoaders(null); + } public static IClassHierarchy makeHierarchy(AnalysisScope scope, ClassLoaderFactory loaders) throws ClassHierarchyException { return ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); From 25c92bf3e23cd31c91014038a717953c6ae852cf Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 17:05:39 +0800 Subject: [PATCH 146/187] Forgot to set translator factory; fixed. --- .../js/test/TestCorrelatedPairExtractionRhino.java | 3 ++- .../wala/cast/js/test/JSCallGraphBuilderUtil.java | 6 +++--- .../callgraph/correlations/CorrelationFinder.java | 10 +++++++++- .../extraction/CorrelatedPairExtractorFactory.java | 12 ++++-------- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index 0017593c2..3f6d96c3a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -15,6 +15,7 @@ import java.io.IOException; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; +import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; @@ -22,7 +23,7 @@ import com.ibm.wala.classLoader.SourceModule; public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtraction { protected CorrelationFinder makeCorrelationFinder() { - return new CorrelationFinder(); + return new CorrelationFinder(new CAstRhinoTranslatorFactory()); } protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 6d21b74e0..6e3b5262a 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -95,7 +95,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { URL script = getURLforFile(dir, name); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(script) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(preprocessor); AnalysisScope scope = makeScriptScope(script, dir, name, loaders); @@ -145,7 +145,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(scripts) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, scripts) : null; PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(preprocessor), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); @@ -160,7 +160,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; IRFactory irFactory = AstIRFactory.makeDefaultFactory(); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(url) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, url) : null; JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 3b5fd94a7..05e1d5037 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -34,6 +34,7 @@ import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; +import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; @@ -78,6 +79,12 @@ public class CorrelationFinder { private final static boolean TRACK_ESCAPES = true; private final static boolean IGNORE_NUMERIC_INDICES = false; + private final JavaScriptTranslatorFactory translatorFactory; + + public CorrelationFinder(JavaScriptTranslatorFactory translatorFactory) { + this.translatorFactory = translatorFactory; + } + public static CorrelationSummary findCorrelatedAccesses(IMethod method, IR ir) { AstMethod astMethod = (AstMethod)method; DefUse du = new DefUse(ir); @@ -225,7 +232,7 @@ public class CorrelationFinder { // found no non-numeric definitions return true; } - + @SuppressWarnings("unused") private void printCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { printCorrelatedAccesses(findCorrelatedAccesses(url)); @@ -271,6 +278,7 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(SourceModule[] scripts_array) throws IOException, ClassHierarchyException { + JSCallGraphUtil.setTranslatorFactory(translatorFactory); JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(null); CAstAnalysisScope scope = new CAstAnalysisScope(scripts_array, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index d542f3c1e..f2c233b7d 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -30,16 +30,12 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; public class CorrelatedPairExtractorFactory implements CAstRewriterFactory { private final Map summaries; - public CorrelatedPairExtractorFactory(URL entryPoint) throws ClassHierarchyException, IOException { - this(new CorrelationFinder().findCorrelatedAccesses(entryPoint)); + public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, URL entryPoint) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(entryPoint)); } - public CorrelatedPairExtractorFactory(Collection scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder().findCorrelatedAccesses(scripts)); - } - - public CorrelatedPairExtractorFactory(SourceModule[] scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder().findCorrelatedAccesses(scripts)); + public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, SourceModule[] scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); } public CorrelatedPairExtractorFactory(Map summaries) { From 9367ad57db7505c4939d9016b79382791be814bc Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 17:48:31 +0800 Subject: [PATCH 147/187] Need to use 1-CFA for ajaxslt test (alternatively turn off correlation tracking). --- .../com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java index 83e90bf00..1e2c6e779 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java @@ -32,8 +32,8 @@ public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { @Test public void testAjaxslt() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); - // don't handle call / apply; it makes things blow up - CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ZERO_ONE_CFA_NO_CALL_APPLY); + // need 1-CFA for this; alternatively need to turn off correlation tracking + CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ONE_CFA_PRECISE_LEXICAL); verifyGraphAssertions(CG, assertionsForAjaxslt); } From 78b60e7761e6016d4f373b5d0c8aeccfabdc1fef Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:07:48 -0700 Subject: [PATCH 148/187] update to use htmlparser 1.4 --- com.ibm.wala.cast.js.html.nu_validator/.classpath | 2 +- com.ibm.wala.cast.js.html.nu_validator/build.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.cast.js.html.nu_validator/.classpath b/com.ibm.wala.cast.js.html.nu_validator/.classpath index 9950a85d6..775e230a8 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/.classpath +++ b/com.ibm.wala.cast.js.html.nu_validator/.classpath @@ -2,8 +2,8 @@ - + diff --git a/com.ibm.wala.cast.js.html.nu_validator/build.xml b/com.ibm.wala.cast.js.html.nu_validator/build.xml index c0a54dd5d..6d1ef9396 100755 --- a/com.ibm.wala.cast.js.html.nu_validator/build.xml +++ b/com.ibm.wala.cast.js.html.nu_validator/build.xml @@ -33,15 +33,15 @@ - + - - - + + + From 6d1c0ad30c79c4739c789b7f0e1949aeacc7405b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:16:07 -0700 Subject: [PATCH 149/187] attempt to get maven build for nu_validator going --- .../pom.xml | 65 +++++++++++++------ pom.xml | 6 +- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml index f306175e5..d4083d24f 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/pom.xml +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -1,6 +1,6 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 WALA @@ -9,23 +9,48 @@ com.ibm.wala.cast.js.html.nu_validator eclipse-plugin - - - - com.googlecode.maven-download-plugin - maven-download-plugin - - - - wget - - - http://repo1.maven.org/maven2/nu/validator/htmlparser/htmlparser/1.4/htmlparser-1.4.jar - lib/ - - - - - - + + + + maven-dependency-plugin + + + + copy + + + + + nu.validator.htmlparser + htmlparser + 1.4 + jar + false + + + ${basedir}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + test + test + + ${project.build.outputDirectory} + -Xmx800M -ea + true + + + test + + + + + + diff --git a/pom.xml b/pom.xml index f94504dce..a69fbdb9f 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - com.ibm.wala.core.tests + com.ibm.wala.cast com.ibm.wala.cast.test @@ -34,9 +34,9 @@ com.ibm.wala.cast.java.test com.ibm.wala.cast.java.test.data com.ibm.wala.cast.java.polyglot - com.ibm.wala.cast.java.polyglot.test + com.ibm.wala.cast.js - + com.ibm.wala.cast.js.html.nu_validator com.ibm.wala.cast.js.test com.ibm.wala.cast.js.test.data com.ibm.wala.cast.js.rhino From 52edbd43987064ceb2f7471df0f542010113bebc Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:31:17 -0700 Subject: [PATCH 150/187] fix classpath --- .../META-INF/MANIFEST.MF | 2 ++ com.ibm.wala.cast.js.html.nu_validator/build.properties | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF index 8dd23bd8c..0cea875e5 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.html.nu_validator/META-INF/MANIFEST.MF @@ -13,3 +13,5 @@ Require-Bundle: com.ibm.wala.cast.js;bundle-version="1.0.0", com.ibm.wala.core;bundle-version="1.1.3", org.junit;bundle-version="4.8.1" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-ClassPath: ., + lib/htmlparser-1.4.jar diff --git a/com.ibm.wala.cast.js.html.nu_validator/build.properties b/com.ibm.wala.cast.js.html.nu_validator/build.properties index b107977f4..0821dd2a9 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/build.properties +++ b/com.ibm.wala.cast.js.html.nu_validator/build.properties @@ -1,3 +1,7 @@ -source.. = src/ +source.. = src/,\ + tests/ bin.includes = META-INF/,\ - . + .,\ + lib/htmlparser-1.4.jar +jars.extra.classpath = lib/htmlparser-1.4.jar + \ No newline at end of file From e353938a9368716ff9e7a1518dbb773672c8d22d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:44:39 -0700 Subject: [PATCH 151/187] fix up classpath --- com.ibm.wala.cast.js.html.nu_validator/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml index d4083d24f..3b78a1488 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/pom.xml +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -44,6 +44,10 @@ ${project.build.outputDirectory} -Xmx800M -ea true + + ${basedir}/../com.ibm.wala.cast.js.test.data/examples-src + + test From 591215ebd666f5f9798e7df596e18ddfb00b7ffc Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:45:34 -0700 Subject: [PATCH 152/187] delete files on exit by default --- .../wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java index 1f2fe8455..147d55b91 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java @@ -63,6 +63,6 @@ public abstract class TestSimplePageCallGraphShapeRhino extends TestSimplePageCa } }); JSSourceExtractor.USE_TEMP_NAME = false; - JSSourceExtractor.DELETE_UPON_EXIT = false; +// JSSourceExtractor.DELETE_UPON_EXIT = false; } } From 59981570a3c32dfc8ac265bb1c9bb6adf6ef8509 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:51:37 -0700 Subject: [PATCH 153/187] add junit 4 dependence --- com.ibm.wala.cast.js.html.nu_validator/pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/com.ibm.wala.cast.js.html.nu_validator/pom.xml b/com.ibm.wala.cast.js.html.nu_validator/pom.xml index 3b78a1488..578705717 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/pom.xml +++ b/com.ibm.wala.cast.js.html.nu_validator/pom.xml @@ -57,4 +57,12 @@ + + + junit + junit + 4.7 + test + + From 4908c22c9403e90acff15d7c15d05375dd63376c Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 13:58:30 -0700 Subject: [PATCH 154/187] re-enable other tests --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a69fbdb9f..1779d9f68 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.ibm.wala.util com.ibm.wala.core.testdata - + com.ibm.wala.core.tests com.ibm.wala.cast com.ibm.wala.cast.test @@ -34,7 +34,7 @@ com.ibm.wala.cast.java.test com.ibm.wala.cast.java.test.data com.ibm.wala.cast.java.polyglot - + com.ibm.wala.cast.java.polyglot.test com.ibm.wala.cast.js com.ibm.wala.cast.js.html.nu_validator com.ibm.wala.cast.js.test From 0f334e59e30b525f0cebf70550572a675498830b Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Fri, 7 Jun 2013 08:28:26 +0800 Subject: [PATCH 155/187] Only introduce property name contexts for constant keys. --- .../cast/js/test/TestAjaxsltCallGraphShape.java | 4 ++-- .../ipa/callgraph/PropertyNameContextSelector.java | 13 ++++--------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java index 1e2c6e779..1988921b9 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java @@ -32,8 +32,8 @@ public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { @Test public void testAjaxslt() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); - // need 1-CFA for this; alternatively need to turn off correlation tracking - CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ONE_CFA_PRECISE_LEXICAL); + // need to turn off call/apply handling for this to scale; alternatively use 1-CFA + CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ZERO_ONE_CFA_NO_CALL_APPLY); verifyGraphAssertions(CG, assertionsForAjaxslt); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index ff0ca7ba3..ec5d4d8fa 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -30,6 +30,7 @@ import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; +import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; @@ -213,16 +214,10 @@ public class PropertyNameContextSelector implements ContextSelector { public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); - if(receiver.length > index) { + if(receiver.length > index && receiver[index] instanceof ConstantKey) { Frequency f = usesFirstArgAsPropertyName(callee); - if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) { - if(receiver[index] == null) { - IClass undef = caller.getClassHierarchy().lookupClass(JavaScriptTypes.Undefined); - return new PropNameContext(baseContext, new ConcreteTypeKey(undef)); - } else { - return new PropNameContext(baseContext, receiver[index]); - } - } + if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) + return new PropNameContext(baseContext, receiver[index]); } if (PROPNAME_MARKER.equals(caller.getContext().get(PROPNAME_KEY))) { From 3d974b831381f089962542bcbecb3fe8c68566d1 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 14:30:52 +0800 Subject: [PATCH 156/187] Temporary commit; things are broken, but I need to switch back to master for a bit. --- .../cast/js/rhino/test/HTMLCGBuilder.java | 10 +---- .../wala/cast/js/test/TestRhinoSourceMap.java | 6 ++- .../cast/js/test/JSCallGraphBuilderUtil.java | 43 ++++++++++++++++--- .../cast/js/test/TestArgumentSensitivity.java | 2 +- .../js/test/TestSimpleCallGraphShape.java | 12 ++++++ .../js/ipa/callgraph/JSCallGraphUtil.java | 15 +++---- .../PropertyNameContextSelector.java | 4 ++ .../correlations/CorrelationFinder.java | 27 ++++++++---- .../extraction/ClosureExtractor.java | 3 +- .../CorrelatedPairExtractorFactory.java | 10 +++++ 10 files changed, 95 insertions(+), 37 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 7b302ddde..bfd67e693 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -75,12 +75,10 @@ public class HTMLCGBuilder { * the HTML page to analyse, can either be a path to a local file or a URL * @param timeout * analysis timeout in seconds, -1 means no timeout - * @param automated_extraction - * whether to automatically extract correlated pairs * @throws IOException * @throws ClassHierarchyException */ - public static CGBuilderResult buildHTMLCG(String src, int timeout, boolean automated_extraction, CGBuilderType builderType) + public static CGBuilderResult buildHTMLCG(String src, int timeout, CGBuilderType builderType) throws ClassHierarchyException, IOException { CGBuilderResult res = new CGBuilderResult(); URL url = null; @@ -90,13 +88,9 @@ public class HTMLCGBuilder { Assert.fail("Could not find page to analyse: " + src); } com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); - if(automated_extraction) - com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setPreprocessor(new CorrelatedPairExtractorFactory(new CAstRhinoTranslatorFactory(), url)); JSCFABuilder builder = null; try { builder = JSCallGraphBuilderUtil.makeHTMLCGBuilder(url, builderType); - builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); - builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 3, builder.getContextSelector())); // TODO we need to find a better way to do this ContextSelector delegation; // the code below belongs somewhere else!!! // the bound of 4 is what is needed to pass our current framework tests @@ -191,7 +185,7 @@ public class HTMLCGBuilder { JavaScriptFunctionDotCallTargetSelector.WARN_ABOUT_IMPRECISE_CALLGRAPH = false; // build call graph - CGBuilderResult res = buildHTMLCG(src, timeout, true, AstTranslator.NEW_LEXICAL ? CGBuilderType.ONE_CFA_PRECISE_LEXICAL : CGBuilderType.ZERO_ONE_CFA); + CGBuilderResult res = buildHTMLCG(src, timeout, AstTranslator.NEW_LEXICAL ? CGBuilderType.ONE_CFA_PRECISE_LEXICAL : CGBuilderType.ZERO_ONE_CFA); if(res.construction_time == -1) System.out.println("TIMED OUT"); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index a03c298d2..9e3b1893a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -16,6 +16,7 @@ import static com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFa import static com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.makeScriptScope; import java.io.IOException; +import java.net.URL; import java.util.Map; import junit.framework.Assert; @@ -160,8 +161,9 @@ public class TestRhinoSourceMap { sources.put(assertion[0], assertion[1]); } - JavaScriptLoaderFactory loaders = makeLoaders(); - AnalysisScope scope = makeScriptScope("tests", fileName, loaders); + URL script = TestRhinoSourceMap.class.getClassLoader().getResource(fileName); + JavaScriptLoaderFactory loaders = makeLoaders(null); + AnalysisScope scope = makeScriptScope(script, "tests", fileName, loaders); IClassHierarchy cha = makeHierarchy(scope, loaders); for(IClass cls : cha) { if (cls.getName().toString().contains(fileName)) { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 43337a48c..bafb1d553 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -27,9 +27,12 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; +import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.CorrelatedPairExtractorFactory; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.loader.CAstAbstractLoader; +import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.SourceFileModule; import com.ibm.wala.classLoader.SourceModule; @@ -52,19 +55,25 @@ import com.ibm.wala.util.WalaException; public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil { public static enum CGBuilderType { - ZERO_ONE_CFA(false, false, true), ZERO_ONE_CFA_NO_CALL_APPLY(false, false, false), ZERO_ONE_CFA_PRECISE_LEXICAL(false, true, - true), ONE_CFA(true, false, true), ONE_CFA_PRECISE_LEXICAL(true, true, true); + ZERO_ONE_CFA(false, false, true, true), + ZERO_ONE_CFA_NO_CALL_APPLY(false, false, false, true), + ZERO_ONE_CFA_PRECISE_LEXICAL(false, true, true, true), + ONE_CFA(true, false, true, true), + ONE_CFA_PRECISE_LEXICAL(true, true, true, true); private final boolean useOneCFA; private final boolean usePreciseLexical; private final boolean handleCallApply; + + private final boolean extractCorrelatedPairs; - private CGBuilderType(boolean useOneCFA, boolean usePreciseLexical, boolean handleCallApply) { + private CGBuilderType(boolean useOneCFA, boolean usePreciseLexical, boolean handleCallApply, boolean extractCorrelatedPairs) { this.useOneCFA = useOneCFA; this.usePreciseLexical = usePreciseLexical; this.handleCallApply = handleCallApply; + this.extractCorrelatedPairs = extractCorrelatedPairs; } public boolean useOneCFA() { @@ -74,26 +83,40 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public boolean usePreciseLexical() { return usePreciseLexical; } + public boolean handleCallApply() { return handleCallApply; } + public boolean extractCorrelatedPairs() { + return extractCorrelatedPairs; + } } public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { - JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(); + URL script = getURLforFile(dir, name); + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; + JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(preprocessor); - AnalysisScope scope = makeScriptScope(dir, name, loaders); + AnalysisScope scope = makeScriptScope(script, dir, name, loaders); return makeCG(loaders, scope, builderType, AstIRFactory.makeDefaultFactory()); } - static AnalysisScope makeScriptScope(String dir, String name, JavaScriptLoaderFactory loaders) throws IOException { + private static URL getURLforFile(String dir, String name) { URL script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + File.separator + name); if (script == null) { script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + "/" + name); } assert script != null : "cannot find " + dir + " and " + name; + return script; + } + + static AnalysisScope makeScriptScope(String dir, String name, JavaScriptLoaderFactory loaders) throws IOException { + return makeScriptScope(getURLforFile(dir, name), dir, name, loaders); + } + + static AnalysisScope makeScriptScope(URL script, String dir, String name, JavaScriptLoaderFactory loaders) throws IOException { AnalysisScope scope; if (script.openConnection() instanceof JarURLConnection) { scope = makeScope(new URL[] { script }, loaders, JavaScriptLoader.JS); @@ -122,7 +145,8 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { - PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(), scripts, builderType, irFactory); + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, scripts) : null; + PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(preprocessor), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); return CG; @@ -136,6 +160,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; IRFactory irFactory = AstIRFactory.makeDefaultFactory(); + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, url) : null; JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; @@ -146,6 +171,8 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J ((CAstAbstractLoader)loaders.getTheLoader()).addMessage(dummy, e.warning); } JSCFABuilder builder = makeCGBuilder(loaders, scripts, builderType, irFactory); + if(builderType.extractCorrelatedPairs) + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); builder.setBaseURL(url); return builder; } @@ -180,6 +207,8 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J AnalysisCache cache = makeCache(irFactory); JSCFABuilder builder = new JSZeroOrOneXCFABuilder(cha, options, cache, null, null, ZeroXInstanceKeys.ALLOCATIONS, builderType.useOneCFA()); + if(builderType.extractCorrelatedPairs()) + builder.setContextSelector(new PropertyNameContextSelector(builder.getAnalysisCache(), 2, builder.getContextSelector())); return builder; } catch (ClassHierarchyException e) { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java index 9a2724dc0..07eb07350 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivity.java @@ -41,7 +41,7 @@ public abstract class TestArgumentSensitivity extends TestJSCallGraphShape { new Object[] { "tests/args.js/a", new String[] { "tests/args.js/y", "tests/args.js/z", "!tests/args.js/wrong" } } }; @Test public void testArgs() throws IOException, IllegalArgumentException, CancelException, ClassHierarchyException, WalaException { - JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(); + JavaScriptLoaderFactory loaders = JSCallGraphBuilderUtil.makeLoaders(null); AnalysisScope scope = JSCallGraphBuilderUtil.makeScriptScope("tests", "args.js", loaders); IClassHierarchy cha = JSCallGraphBuilderUtil.makeHierarchy(scope, loaders); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 3c253a2fc..8715bc855 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -652,6 +652,18 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { //JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); verifyGraphAssertions(CG, assertionsForDeadCode); } + + private static final Object[][] assertionsForExtend = new Object[][] { + new Object[] { ROOT, new String[] { "tests/extend.js" } }, + new Object[] { "tests/extend.js", new String[] { "suffix:foo", "!suffix:bar" } } + }; + + @Test + public void testExtend() throws IOException, WalaException, IllegalArgumentException, CancelException { + JSCFABuilder builder = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "extend.js"); + CallGraph cg = builder.makeCallGraph(builder.getOptions()); + verifyGraphAssertions(cg, assertionsForExtend); + } @Test public void testDeadCatch() throws IllegalArgumentException, IOException, CancelException, WalaException { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index c998c5398..d02ae3ff4 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -63,11 +63,6 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra */ public static JavaScriptTranslatorFactory translatorFactory; - /** - * preprocessor to run generated CAst trees through, null if none - */ - public static CAstRewriterFactory preprocessor; - /** * Set up the translator factory. This method should be called before invoking * {@link #makeLoaders()}. @@ -80,10 +75,6 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra return translatorFactory; } - public static void setPreprocessor(CAstRewriterFactory preprocessor) { - JSCallGraphUtil.preprocessor = preprocessor; - } - public static JSAnalysisOptions makeOptions(AnalysisScope scope, IClassHierarchy cha, Iterable roots) { final JSAnalysisOptions options = new JSAnalysisOptions(scope, /* * AstIRFactory. @@ -101,7 +92,11 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra return options; } - public static JavaScriptLoaderFactory makeLoaders() { + /** + * @param preprocessor CAst rewriter to use for preprocessing JavaScript source files; may be null + * @return + */ + public static JavaScriptLoaderFactory makeLoaders(CAstRewriterFactory preprocessor) { if (translatorFactory == null) { throw new IllegalStateException("com.ibm.wala.cast.js.ipa.callgraph.Util.setTranslatorFactory() must be invoked before makeLoaders()"); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index f8aa86f68..ff0ca7ba3 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.HashMap; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; +import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.ClosureExtractor; @@ -27,14 +28,17 @@ import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; +import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; +import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.ReflectiveMemberAccess; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; import com.ibm.wala.ssa.SSAGetInstruction; import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Iterator2Iterable; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index f69be0d93..81719d3e7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; @@ -78,7 +79,6 @@ public class CorrelationFinder { private final JavaScriptTranslatorFactory translatorFactory; - @SuppressWarnings("unused") public static CorrelationSummary findCorrelatedAccesses(IMethod method, IR ir) { AstMethod astMethod = (AstMethod)method; DefUse du = new DefUse(ir); @@ -229,7 +229,10 @@ public class CorrelationFinder { @SuppressWarnings("unused") private void printCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { - Map summaries = findCorrelatedAccesses(url); + printCorrelatedAccesses(findCorrelatedAccesses(url)); + } + + private void printCorrelatedAccesses(Map summaries) { List> correlations = new ArrayList>(); for(CorrelationSummary summary : summaries.values()) correlations.addAll(summary.pp()); @@ -247,21 +250,25 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { JavaScriptLoader.addBootstrapFile(WebUtil.preamble); - Set script = null; + Set scripts = null; try { - script = WebUtil.extractScriptFromHTML(url).fst; + scripts = WebUtil.extractScriptFromHTML(url).fst; } catch (Error e) { assert false : e.warning; } - Map summaries = findCorrelatedAccesses(script); + Map summaries = findCorrelatedAccesses(scripts); return summaries; } - public Map findCorrelatedAccesses(Set script) throws IOException, + public Map findCorrelatedAccesses(Collection scripts) throws IOException, + ClassHierarchyException { + return findCorrelatedAccesses(scripts.toArray(new SourceModule[scripts.size()])); + } + + public Map findCorrelatedAccesses(SourceModule[] scripts_array) throws IOException, ClassHierarchyException { - SourceModule[] scripts = script.toArray(new SourceModule[script.size()]); WebPageLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory); - CAstAnalysisScope scope = new CAstAnalysisScope(scripts, loaders, Collections.singleton(JavaScriptLoader.JS)); + CAstAnalysisScope scope = new CAstAnalysisScope(scripts_array, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); try { Util.checkForFrontEndErrors(cha); @@ -274,11 +281,15 @@ public class CorrelationFinder { for(IClass klass : cha) { for(IMethod method : klass.getAllMethods()) { IR ir = factory.makeIR(method, Everywhere.EVERYWHERE, SSAOptions.defaultOptions()); + if(method.toString().endsWith("__WINDOW_MAIN__>")) + System.out.println(ir); CorrelationSummary summary = findCorrelatedAccesses(method, ir); if(!summary.getCorrelations().isEmpty()) correlations.put(method, summary); } } + + printCorrelatedAccesses(correlations); return correlations; } 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 5e7b91890..5f05ea121 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 @@ -50,6 +50,7 @@ import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder; import com.ibm.wala.cast.tree.impl.CAstOperator; import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; +import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; @@ -419,7 +420,7 @@ public class ClosureExtractor extends CAstRewriterExt { boolean extractingEmpty = false; String name = EXTRACTED_FUN_BASENAME + (anonymous_counter++); - + // Create a new entity for the extracted function. ExtractedFunction new_entity = new ExtractedFunction(name, context); context.setExtractedEntity(new_entity); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index b52f97cd3..f1b05e5d9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction; import java.io.IOException; import java.net.URL; +import java.util.Collection; import java.util.Map; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; @@ -23,6 +24,7 @@ import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.ipa.cha.ClassHierarchyException; public class CorrelatedPairExtractorFactory implements CAstRewriterFactory { @@ -32,6 +34,14 @@ public class CorrelatedPairExtractorFactory implements CAstRewriterFactory scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + } + + public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, SourceModule[] scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + } + public CorrelatedPairExtractorFactory(Map summaries) { this.summaries = summaries; } From 3adaaf50eefc2294bdd74244388628eb76a1cb40 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 15:55:59 +0800 Subject: [PATCH 157/187] Correlation finder now handles both HTML files and raw JS files as input, doesn't use WebPageLoaderFactory to create CAst anymore. --- .../cast/js/rhino/test/HTMLCGBuilder.java | 2 -- .../TestCorrelatedPairExtractionRhino.java | 3 +- .../wala/cast/js/test/TestRhinoSourceMap.java | 3 +- .../examples-src/tests/extend.js | 11 +++++++ .../cast/js/test/JSCallGraphBuilderUtil.java | 8 ++--- .../js/test/TestSimpleCallGraphShape.java | 2 +- .../correlations/CorrelationFinder.java | 31 +++++++++---------- .../CorrelatedPairExtractorFactory.java | 12 +++---- 8 files changed, 38 insertions(+), 34 deletions(-) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index bfd67e693..62e3a0991 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -20,11 +20,9 @@ import java.util.Properties; import junit.framework.Assert; import com.ibm.wala.cast.ir.translator.AstTranslator; -import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; import com.ibm.wala.cast.js.ipa.callgraph.RecursionCheckContextSelector; -import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.CorrelatedPairExtractorFactory; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.CGBuilderType; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index 3f6d96c3a..0017593c2 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -15,7 +15,6 @@ import java.io.IOException; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; -import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; @@ -23,7 +22,7 @@ import com.ibm.wala.classLoader.SourceModule; public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtraction { protected CorrelationFinder makeCorrelationFinder() { - return new CorrelationFinder(new CAstRhinoTranslatorFactory()); + return new CorrelationFinder(); } protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index 9e3b1893a..2db00dfc1 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -161,9 +161,8 @@ public class TestRhinoSourceMap { sources.put(assertion[0], assertion[1]); } - URL script = TestRhinoSourceMap.class.getClassLoader().getResource(fileName); JavaScriptLoaderFactory loaders = makeLoaders(null); - AnalysisScope scope = makeScriptScope(script, "tests", fileName, loaders); + AnalysisScope scope = makeScriptScope("tests", fileName, loaders); IClassHierarchy cha = makeHierarchy(scope, loaders); for(IClass cls : cha) { if (cls.getName().toString().contains(fileName)) { diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js new file mode 100644 index 000000000..feb5ab502 --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/extend.js @@ -0,0 +1,11 @@ +function extend(dest, src) { + for(var p in src) + dest[p] = src[p]; +} + +var obj = {}; +extend(obj, { + foo: function foo() {}, + bar: function bar() {} +}); +obj.bar(); \ No newline at end of file diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index bafb1d553..6d21b74e0 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -95,7 +95,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { URL script = getURLforFile(dir, name); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(script) : null; JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(preprocessor); AnalysisScope scope = makeScriptScope(script, dir, name, loaders); @@ -103,7 +103,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J return makeCG(loaders, scope, builderType, AstIRFactory.makeDefaultFactory()); } - private static URL getURLforFile(String dir, String name) { + public static URL getURLforFile(String dir, String name) { URL script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + File.separator + name); if (script == null) { script = JSCallGraphBuilderUtil.class.getClassLoader().getResource(dir + "/" + name); @@ -145,7 +145,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, scripts) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(scripts) : null; PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(preprocessor), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); @@ -160,7 +160,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; IRFactory irFactory = AstIRFactory.makeDefaultFactory(); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, url) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(url) : null; JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 8715bc855..ac5bc0655 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -655,7 +655,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { private static final Object[][] assertionsForExtend = new Object[][] { new Object[] { ROOT, new String[] { "tests/extend.js" } }, - new Object[] { "tests/extend.js", new String[] { "suffix:foo", "!suffix:bar" } } + new Object[] { "tests/extend.js", new String[] { "suffix:bar", "!suffix:foo" } } }; @Test diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 81719d3e7..3b5fd94a7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -30,10 +30,10 @@ import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; import com.ibm.wala.cast.ir.ssa.AbstractReflectivePut; import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; -import com.ibm.wala.cast.js.html.WebPageLoaderFactory; import com.ibm.wala.cast.js.html.WebUtil; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.loader.JavaScriptLoader; -import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; +import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; @@ -41,6 +41,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.SourceModule; +import com.ibm.wala.classLoader.SourceURLModule; import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.ClassHierarchyException; @@ -77,8 +78,6 @@ public class CorrelationFinder { private final static boolean TRACK_ESCAPES = true; private final static boolean IGNORE_NUMERIC_INDICES = false; - private final JavaScriptTranslatorFactory translatorFactory; - public static CorrelationSummary findCorrelatedAccesses(IMethod method, IR ir) { AstMethod astMethod = (AstMethod)method; DefUse du = new DefUse(ir); @@ -249,12 +248,17 @@ public class CorrelationFinder { } public Map findCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { - JavaScriptLoader.addBootstrapFile(WebUtil.preamble); Set scripts = null; - try { - scripts = WebUtil.extractScriptFromHTML(url).fst; - } catch (Error e) { - assert false : e.warning; + if(url.getPath().endsWith(".js")) { + scripts = Collections.singleton(new SourceURLModule(url)); + } else { + JavaScriptLoader.addBootstrapFile(WebUtil.preamble); + try { + scripts = WebUtil.extractScriptFromHTML(url).fst; + } catch (Error e) { + e.printStackTrace(); + assert false : e.warning; + } } Map summaries = findCorrelatedAccesses(scripts); return summaries; @@ -267,7 +271,7 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(SourceModule[] scripts_array) throws IOException, ClassHierarchyException { - WebPageLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory); + JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(null); CAstAnalysisScope scope = new CAstAnalysisScope(scripts_array, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); try { @@ -281,15 +285,12 @@ public class CorrelationFinder { for(IClass klass : cha) { for(IMethod method : klass.getAllMethods()) { IR ir = factory.makeIR(method, Everywhere.EVERYWHERE, SSAOptions.defaultOptions()); - if(method.toString().endsWith("__WINDOW_MAIN__>")) - System.out.println(ir); CorrelationSummary summary = findCorrelatedAccesses(method, ir); if(!summary.getCorrelations().isEmpty()) correlations.put(method, summary); } } - printCorrelatedAccesses(correlations); return correlations; } @@ -304,8 +305,4 @@ public class CorrelationFinder { return new URL(src); } } - - public CorrelationFinder(JavaScriptTranslatorFactory translatorFactory) { - this.translatorFactory = translatorFactory; - } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index f1b05e5d9..d542f3c1e 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -30,16 +30,16 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; public class CorrelatedPairExtractorFactory implements CAstRewriterFactory { private final Map summaries; - public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, URL entryPoint) throws ClassHierarchyException, IOException { - this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(entryPoint)); + public CorrelatedPairExtractorFactory(URL entryPoint) throws ClassHierarchyException, IOException { + this(new CorrelationFinder().findCorrelatedAccesses(entryPoint)); } - public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, Collection scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + public CorrelatedPairExtractorFactory(Collection scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder().findCorrelatedAccesses(scripts)); } - public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, SourceModule[] scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); + public CorrelatedPairExtractorFactory(SourceModule[] scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder().findCorrelatedAccesses(scripts)); } public CorrelatedPairExtractorFactory(Map summaries) { From 79caece0c1abcdce0789f82a013756dad8c50e28 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 16:32:55 +0800 Subject: [PATCH 158/187] Introducing convenience method for creating a loader factory without a preprocessor. --- .../com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index d02ae3ff4..7f13debc8 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -102,6 +102,10 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra } return new JavaScriptLoaderFactory(translatorFactory, preprocessor); } + + public static JavaScriptLoaderFactory makeLoaders() { + return makeLoaders(null); + } public static IClassHierarchy makeHierarchy(AnalysisScope scope, ClassLoaderFactory loaders) throws ClassHierarchyException { return ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); From ef0cf8589d5d620dc9b16922eb7ceb483ff68621 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 17:05:39 +0800 Subject: [PATCH 159/187] Forgot to set translator factory; fixed. --- .../js/test/TestCorrelatedPairExtractionRhino.java | 3 ++- .../wala/cast/js/test/JSCallGraphBuilderUtil.java | 6 +++--- .../callgraph/correlations/CorrelationFinder.java | 10 +++++++++- .../extraction/CorrelatedPairExtractorFactory.java | 12 ++++-------- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index 0017593c2..3f6d96c3a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -15,6 +15,7 @@ import java.io.IOException; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; +import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.RhinoToAstTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; @@ -22,7 +23,7 @@ import com.ibm.wala.classLoader.SourceModule; public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtraction { protected CorrelationFinder makeCorrelationFinder() { - return new CorrelationFinder(); + return new CorrelationFinder(new CAstRhinoTranslatorFactory()); } protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 6d21b74e0..6e3b5262a 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -95,7 +95,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { URL script = getURLforFile(dir, name); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(script) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(preprocessor); AnalysisScope scope = makeScriptScope(script, dir, name, loaders); @@ -145,7 +145,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J public static CallGraph makeScriptCG(SourceModule[] scripts, CGBuilderType builderType, IRFactory irFactory) throws IOException, IllegalArgumentException, CancelException, WalaException { - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(scripts) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, scripts) : null; PropagationCallGraphBuilder b = makeCGBuilder(makeLoaders(preprocessor), scripts, builderType, irFactory); CallGraph CG = b.makeCallGraph(b.getOptions()); // dumpCG(b.getPointerAnalysis(), CG); @@ -160,7 +160,7 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J JavaScriptLoader.addBootstrapFile(WebUtil.preamble); SourceModule[] scripts; IRFactory irFactory = AstIRFactory.makeDefaultFactory(); - CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(url) : null; + CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, url) : null; JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(translatorFactory, preprocessor); try { Set script = WebUtil.extractScriptFromHTML(url).fst; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 3b5fd94a7..05e1d5037 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -34,6 +34,7 @@ import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; +import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory; import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; @@ -78,6 +79,12 @@ public class CorrelationFinder { private final static boolean TRACK_ESCAPES = true; private final static boolean IGNORE_NUMERIC_INDICES = false; + private final JavaScriptTranslatorFactory translatorFactory; + + public CorrelationFinder(JavaScriptTranslatorFactory translatorFactory) { + this.translatorFactory = translatorFactory; + } + public static CorrelationSummary findCorrelatedAccesses(IMethod method, IR ir) { AstMethod astMethod = (AstMethod)method; DefUse du = new DefUse(ir); @@ -225,7 +232,7 @@ public class CorrelationFinder { // found no non-numeric definitions return true; } - + @SuppressWarnings("unused") private void printCorrelatedAccesses(URL url) throws IOException, ClassHierarchyException { printCorrelatedAccesses(findCorrelatedAccesses(url)); @@ -271,6 +278,7 @@ public class CorrelationFinder { public Map findCorrelatedAccesses(SourceModule[] scripts_array) throws IOException, ClassHierarchyException { + JSCallGraphUtil.setTranslatorFactory(translatorFactory); JavaScriptLoaderFactory loaders = JSCallGraphUtil.makeLoaders(null); CAstAnalysisScope scope = new CAstAnalysisScope(scripts_array, loaders, Collections.singleton(JavaScriptLoader.JS)); IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index d542f3c1e..f2c233b7d 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -30,16 +30,12 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException; public class CorrelatedPairExtractorFactory implements CAstRewriterFactory { private final Map summaries; - public CorrelatedPairExtractorFactory(URL entryPoint) throws ClassHierarchyException, IOException { - this(new CorrelationFinder().findCorrelatedAccesses(entryPoint)); + public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, URL entryPoint) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(entryPoint)); } - public CorrelatedPairExtractorFactory(Collection scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder().findCorrelatedAccesses(scripts)); - } - - public CorrelatedPairExtractorFactory(SourceModule[] scripts) throws ClassHierarchyException, IOException { - this(new CorrelationFinder().findCorrelatedAccesses(scripts)); + public CorrelatedPairExtractorFactory(JavaScriptTranslatorFactory translatorFactory, SourceModule[] scripts) throws ClassHierarchyException, IOException { + this(new CorrelationFinder(translatorFactory).findCorrelatedAccesses(scripts)); } public CorrelatedPairExtractorFactory(Map summaries) { From 188a7c79a64fc0076374241bc8bcf2a255d8870a Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 6 Jun 2013 17:48:31 +0800 Subject: [PATCH 160/187] Need to use 1-CFA for ajaxslt test (alternatively turn off correlation tracking). --- .../com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java index 83e90bf00..1e2c6e779 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java @@ -32,8 +32,8 @@ public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { @Test public void testAjaxslt() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); - // don't handle call / apply; it makes things blow up - CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ZERO_ONE_CFA_NO_CALL_APPLY); + // need 1-CFA for this; alternatively need to turn off correlation tracking + CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ONE_CFA_PRECISE_LEXICAL); verifyGraphAssertions(CG, assertionsForAjaxslt); } From 79b12e332e44d3215af213bec8c8bfc58576b506 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Fri, 7 Jun 2013 08:28:26 +0800 Subject: [PATCH 161/187] Only introduce property name contexts for constant keys. --- .../cast/js/test/TestAjaxsltCallGraphShape.java | 4 ++-- .../ipa/callgraph/PropertyNameContextSelector.java | 13 ++++--------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java index 1e2c6e779..1988921b9 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShape.java @@ -32,8 +32,8 @@ public abstract class TestAjaxsltCallGraphShape extends TestJSCallGraphShape { @Test public void testAjaxslt() throws IOException, IllegalArgumentException, CancelException, WalaException { URL url = getClass().getClassLoader().getResource("ajaxslt/test/xslt.html"); - // need 1-CFA for this; alternatively need to turn off correlation tracking - CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ONE_CFA_PRECISE_LEXICAL); + // need to turn off call/apply handling for this to scale; alternatively use 1-CFA + CallGraph CG = JSCallGraphBuilderUtil.makeHTMLCG(url, CGBuilderType.ZERO_ONE_CFA_NO_CALL_APPLY); verifyGraphAssertions(CG, assertionsForAjaxslt); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index ff0ca7ba3..ec5d4d8fa 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -30,6 +30,7 @@ import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; +import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; @@ -213,16 +214,10 @@ public class PropertyNameContextSelector implements ContextSelector { public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); - if(receiver.length > index) { + if(receiver.length > index && receiver[index] instanceof ConstantKey) { Frequency f = usesFirstArgAsPropertyName(callee); - if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) { - if(receiver[index] == null) { - IClass undef = caller.getClassHierarchy().lookupClass(JavaScriptTypes.Undefined); - return new PropNameContext(baseContext, new ConcreteTypeKey(undef)); - } else { - return new PropNameContext(baseContext, receiver[index]); - } - } + if(f == Frequency.ALWAYS|| f == Frequency.SOMETIMES) + return new PropNameContext(baseContext, receiver[index]); } if (PROPNAME_MARKER.equals(caller.getContext().get(PROPNAME_KEY))) { From d4b252ad515ffd64fc40b04fee60f62ff07f9518 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 15:59:20 -0700 Subject: [PATCH 162/187] kill NEW_LEXICAL flag --- .../cast/js/rhino/test/HTMLCGBuilder.java | 11 +-- .../ipa/callgraph/JSZeroOrOneXCFABuilder.java | 11 --- .../JavaScriptConstructorContextSelector.java | 8 +-- .../cast/js/translator/JSAstTranslator.java | 2 +- .../AstSSAPropagationCallGraphBuilder.java | 29 -------- .../callgraph/ScopeMappingInstanceKeys.java | 68 ++++--------------- .../cast/ir/translator/AstTranslator.java | 6 -- 7 files changed, 21 insertions(+), 114 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 62e3a0991..7bb6413c0 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -19,9 +19,13 @@ import java.util.Properties; import junit.framework.Assert; +<<<<<<< HEAD import com.ibm.wala.cast.ir.translator.AstTranslator; +======= +>>>>>>> kill NEW_LEXICAL flag import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; +import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.RecursionCheckContextSelector; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.CGBuilderType; @@ -92,10 +96,7 @@ public class HTMLCGBuilder { // TODO we need to find a better way to do this ContextSelector delegation; // the code below belongs somewhere else!!! // the bound of 4 is what is needed to pass our current framework tests - if (AstTranslator.NEW_LEXICAL) { -// builder.setContextSelector(new RecursionBoundContextSelector(builder.getContextSelector(), 4)); - builder.setContextSelector(new RecursionCheckContextSelector(builder.getContextSelector())); - } + builder.setContextSelector(new RecursionCheckContextSelector(builder.getContextSelector())); ProgressMaster master = ProgressMaster.make(new NullProgressMonitor()); if (timeout > 0) { master.setMillisPerWorkItem(timeout * 1000); @@ -183,7 +184,7 @@ public class HTMLCGBuilder { JavaScriptFunctionDotCallTargetSelector.WARN_ABOUT_IMPRECISE_CALLGRAPH = false; // build call graph - CGBuilderResult res = buildHTMLCG(src, timeout, AstTranslator.NEW_LEXICAL ? CGBuilderType.ONE_CFA_PRECISE_LEXICAL : CGBuilderType.ZERO_ONE_CFA); + CGBuilderResult res = buildHTMLCG(src, timeout, CGBuilderType.ONE_CFA_PRECISE_LEXICAL); if(res.construction_time == -1) System.out.println("TIMED OUT"); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java index 7fe3e84a4..3052e2480 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java @@ -39,10 +39,6 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder { ContextSelector appContextSelector, SSAContextInterpreter appContextInterpreter, int instancePolicy, boolean doOneCFA) { super(cha, options, cache); - if (!AstTranslator.NEW_LEXICAL && options.usePreciseLexical()) { - throw new IllegalArgumentException("usePreciseLexical only valid with new lexical scoping handling"); - } - SSAContextInterpreter contextInterpreter = setupSSAContextInterpreter(cha, options, cache, appContextInterpreter); setupMethodTargetSelector(cha, options); @@ -63,10 +59,6 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder { // _necessary_ for correctness (we rely on it when handling lexical scoping) contextSelector = new JavaScriptConstructorContextSelector(contextSelector, options.usePreciseLexical()); - if (!AstTranslator.NEW_LEXICAL) { - contextSelector = new ScopeMappingKeysContextSelector(contextSelector); - } - if (options.usePreciseLexical()) { contextSelector = new OneLevelForLexicalAccessFunctions(contextSelector); } @@ -77,9 +69,6 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder { if (options.handleCallApply()) { contextSelector = new JavaScriptFunctionApplyContextSelector(contextSelector); } - if (!AstTranslator.NEW_LEXICAL) { - contextSelector = new LexicalScopingResolverContexts(this, contextSelector); - } if (doOneCFA) { contextSelector = new nCFAContextSelector(1, contextSelector); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java index 2a9cc4976..0203c2bb0 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java @@ -11,15 +11,12 @@ package com.ibm.wala.cast.js.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts; -import com.ibm.wala.cast.ipa.callgraph.ScopeMappingKeysContextSelector.ScopeMappingContext; -import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptConstructTargetSelector.JavaScriptConstructor; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextSelector; -import com.ibm.wala.ipa.callgraph.DelegatingContext; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.cfa.OneLevelSiteContextSelector; import com.ibm.wala.ipa.callgraph.propagation.cfa.nCFAContextSelector; @@ -52,10 +49,7 @@ public class JavaScriptConstructorContextSelector implements ContextSelector { public Context getCalleeTarget(final CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee instanceof JavaScriptConstructor) { final Context oneLevelCallStringContext = oneLevelCallStrings.getCalleeTarget(caller, site, callee, receiver); - final Context callerContext = caller.getContext(); - if (!AstTranslator.NEW_LEXICAL && callerContext instanceof ScopeMappingContext) { - return new DelegatingContext(callerContext, oneLevelCallStringContext); - } else if (AstTranslator.NEW_LEXICAL && usePreciseLexical && LexicalScopingResolverContexts.hasExposedUses(caller, site)) { + if (usePreciseLexical && LexicalScopingResolverContexts.hasExposedUses(caller, site)) { // use a caller-site context, to enable lexical scoping lookups (via caller CGNode) return oneLevelCallerSite.getCalleeTarget(caller, site, callee, receiver); } else { 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 6b3465599..a1cc57e56 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 @@ -66,7 +66,7 @@ public class JSAstTranslator extends AstTranslator { } protected boolean useLocalValuesForLexicalVars() { - return !AstTranslator.NEW_LEXICAL; + return false; } protected TypeReference defaultCatchType() { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index 15d366332..4f264f5f5 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -605,39 +605,11 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa if (AstTranslator.DEBUG_LEXICAL) System.err.println(("looking up lexical parent " + definer)); - boolean foundOnStack = false; - if (r != null && !AstTranslator.NEW_LEXICAL) { - if (!funargsOnly) { - if (r.isReadOnly(accesses[i].getName())) { - assert isLoad; - foundOnStack = true; - Set vals = r.getReadOnlyValues(accesses[i].getName()); - for (LocalPointerKey val : vals) { - action(val, vn); - } - } else { - Iterator> sites = r.getLexicalSites(accesses[i].getName()); - while (sites.hasNext()) { - Pair x = sites.next(); - PointerKey V = isLoad ? getLocalReadKey(x.snd, x.fst, name, definer) : getLocalWriteKey(x.snd, x.fst, name, - definer); - - if (V != null) { - foundOnStack = true; - action(V, vn); - } - } - } - } - } - - if (!foundOnStack) { Set creators = getLexicalDefiners(node, Pair.make(name, definer)); for (CGNode n : creators) { PointerKey funargKey = handleRootLexicalReference(name, definer, n); action(funargKey, vn); } - } } } @@ -695,7 +667,6 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return Collections.singleton(getBuilder().getCallGraph().getFakeRootNode()); } else if (getBuilder().sameMethod(opNode, definer.snd)) { // lexical access to a variable declared in opNode itself - assert AstTranslator.NEW_LEXICAL; return Collections.singleton(opNode); } else { final Set result = HashSetFactory.make(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index 28fbfdb82..166d88b46 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -96,68 +96,26 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { * @return */ public Iterator getFunargNodes(Pair name) { - if (AstTranslator.NEW_LEXICAL) { - Collection constructorCallers = getConstructorCallers(this, name); - assert constructorCallers != null && !constructorCallers.isEmpty() : "no callers for constructor"; - Iterator result = EmptyIterator.instance(); - for (CGNode callerOfConstructor : constructorCallers) { - if (callerOfConstructor.getMethod().getReference().getDeclaringClass().getName().toString().equals(name.snd)){ - result = new CompoundIterator(result, new NonNullSingletonIterator(callerOfConstructor)); - } else { - PointerKey funcKey = builder.getPointerKeyForLocal(callerOfConstructor, 1); - OrdinalSet funcPtrs = builder.getPointerAnalysis().getPointsToSet(funcKey); - for (InstanceKey funcPtr : funcPtrs) { - if (funcPtr instanceof ScopeMappingInstanceKey) { - result = new CompoundIterator(result, ((ScopeMappingInstanceKey) funcPtr).getFunargNodes(name)); - } + Collection constructorCallers = getConstructorCallers(this, name); + assert constructorCallers != null && !constructorCallers.isEmpty() : "no callers for constructor"; + Iterator result = EmptyIterator.instance(); + for (CGNode callerOfConstructor : constructorCallers) { + if (callerOfConstructor.getMethod().getReference().getDeclaringClass().getName().toString().equals(name.snd)) { + result = new CompoundIterator(result, new NonNullSingletonIterator(callerOfConstructor)); + } else { + PointerKey funcKey = builder.getPointerKeyForLocal(callerOfConstructor, 1); + OrdinalSet funcPtrs = builder.getPointerAnalysis().getPointsToSet(funcKey); + for (InstanceKey funcPtr : funcPtrs) { + if (funcPtr instanceof ScopeMappingInstanceKey) { + result = new CompoundIterator(result, ((ScopeMappingInstanceKey) funcPtr).getFunargNodes(name)); } -// Iterator result = EmptyIterator.instance(); -// for (InstanceKey x : funcPtrs) { -// if (x instanceof ScopeMappingInstanceKey) { -// result = new CompoundIterator(result, ((ScopeMappingInstanceKey) x).getFunargNodes(name)); -// } -// } -// return result; - } - } - return result; - } else { - Iterator result = EmptyIterator.instance(); - - LexicalScopingResolver r = (LexicalScopingResolver) creator.getContext().get(LexicalScopingResolverContexts.RESOLVER); - if (r != null) { - CGNode def = r.getOriginalDefiner(name); - if (def != null) { - result = new NonNullSingletonIterator(def); } } - - // with multiple levels of nested functions, the creator itself may have - // been invoked by a function represented by a SMIK. E.g., see - // wrap3.js; the constructor of set() is invoked by wrapper(), and - // the wrapper() function object is a SMIK. In such cases, we need to - // recurse to find all the relevant CGNodes. - ContextItem nested = creator.getContext().get(ScopeMappingKeysContextSelector.scopeKey); - if (nested != null) { - result = new CompoundIterator(result, ((ScopeMappingInstanceKey) nested).getFunargNodes(name)); - } - - // TODO what does this code do??? commenting out does not cause any - // regression failures --MS - PointerKey funcKey = builder.getPointerKeyForLocal(creator, 1); - OrdinalSet funcPtrs = builder.getPointerAnalysis().getPointsToSet(funcKey); - for (InstanceKey x : funcPtrs) { - if (x instanceof ScopeMappingInstanceKey) { - result = new CompoundIterator(result, ((ScopeMappingInstanceKey) x).getFunargNodes(name)); - } - } - - return result; } + return result; } - public int hashCode() { return base.hashCode() * creator.hashCode(); } 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 e2b6de222..78b7e4481 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 @@ -94,12 +94,6 @@ import com.ibm.wala.util.warnings.Warning; */ public abstract class AstTranslator extends CAstVisitor implements ArrayOpHandler, TranslatorToIR { - /** - * set to true to use new handling of lexical scoping - */ - public static final boolean NEW_LEXICAL = true; - - /** * does the language care about using type-appropriate default values? For * Java, the answer is yes (ints should get a default value of 0, null for From 472a98d7cfb5465d084b84b4a2ab095d3986f746 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 16:05:48 -0700 Subject: [PATCH 163/187] delete some code --- .../ipa/callgraph/JSZeroOrOneXCFABuilder.java | 3 - .../AstSSAPropagationCallGraphBuilder.java | 2 - .../LexicalScopingSSAContextInterpreter.java | 61 ----------- .../ScopeMappingKeysContextSelector.java | 100 ------------------ 4 files changed, 166 deletions(-) delete mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java delete mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java index 3052e2480..a45699626 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java @@ -10,10 +10,7 @@ *****************************************************************************/ package com.ibm.wala.cast.js.ipa.callgraph; -import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts; import com.ibm.wala.cast.ipa.callgraph.OneLevelForLexicalAccessFunctions; -import com.ibm.wala.cast.ipa.callgraph.ScopeMappingKeysContextSelector; -import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.ContextSelector; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index 4f264f5f5..c94b1c8a3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -124,8 +124,6 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa SSAContextInterpreter c = new DefaultSSAInterpreter(options, getAnalysisCache()); c = new DelegatingSSAContextInterpreter(new AstContextInsensitiveSSAContextInterpreter(options, getAnalysisCache()), c); - c = new DelegatingSSAContextInterpreter(new LexicalScopingSSAContextInterpreter(options, getAnalysisCache()), c); - c = new DelegatingSSAContextInterpreter(ReflectionContextInterpreter.createReflectionContextInterpreter(cha, options, getAnalysisCache()), c); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java deleted file mode 100644 index dbbd84a29..000000000 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingSSAContextInterpreter.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * 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.ipa.callgraph; - -import com.ibm.wala.cast.ipa.callgraph.AstCallGraph.AstCGNode; -import com.ibm.wala.cast.ipa.callgraph.ScopeMappingKeysContextSelector.ScopeMappingContext; -import com.ibm.wala.cast.loader.AstMethod; -import com.ibm.wala.classLoader.IMethod; -import com.ibm.wala.ipa.callgraph.AnalysisCache; -import com.ibm.wala.ipa.callgraph.AnalysisOptions; -import com.ibm.wala.ipa.callgraph.CGNode; -import com.ibm.wala.ipa.callgraph.Context; -import com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter; -import com.ibm.wala.ssa.DefUse; -import com.ibm.wala.ssa.IR; - -public class LexicalScopingSSAContextInterpreter extends AstContextInsensitiveSSAContextInterpreter implements SSAContextInterpreter { - - public LexicalScopingSSAContextInterpreter(AnalysisOptions options, AnalysisCache cache) { - super(options, cache); - } - - public boolean understands(IMethod method, Context context) { - assert !(context instanceof ScopeMappingContext) || method instanceof AstMethod; - return method instanceof AstMethod - && ( (context instanceof ScopeMappingContext) - || - !((AstMethod)method).lexicalInfo().getAllExposedUses().isEmpty() ); - } - - public IR getIR(CGNode node) { - if (node instanceof AstCGNode) { - IR ir = ((AstCGNode)node).getLexicallyMutatedIR(); - if (ir != null) { - return ir; - } - } - - return super.getIR(node); - } - - public DefUse getDU(CGNode node) { - if (node instanceof AstCGNode) { - DefUse du = ((AstCGNode)node).getLexicallyMutatedDU(); - if (du != null) { - return du; - } - } - - return super.getDU(node); - } - -} diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java deleted file mode 100644 index a0e8dadad..000000000 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingKeysContextSelector.java +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************* - * 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.ipa.callgraph; - -import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey; -import com.ibm.wala.classLoader.CallSiteReference; -import com.ibm.wala.classLoader.IMethod; -import com.ibm.wala.ipa.callgraph.CGNode; -import com.ibm.wala.ipa.callgraph.Context; -import com.ibm.wala.ipa.callgraph.ContextItem; -import com.ibm.wala.ipa.callgraph.ContextKey; -import com.ibm.wala.ipa.callgraph.ContextSelector; -import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; -import com.ibm.wala.ipa.summaries.SummarizedMethod; -import com.ibm.wala.util.intset.IntSet; -import com.ibm.wala.util.intset.IntSetUtil; - -public class ScopeMappingKeysContextSelector implements ContextSelector { - - public static final ContextKey scopeKey = new ContextKey() { - public String toString() { - return "SCOPE KEY"; - } - }; - - public static class ScopeMappingContext implements Context { - private final Context base; - private final ScopeMappingInstanceKey key; - - private ScopeMappingContext(Context base, ScopeMappingInstanceKey key) { - this.base = base; - this.key = key; - } - - public ContextItem get(ContextKey name) { - if (scopeKey.equals(name)) { - return key; - } else { - return base.get(name); - } - } - - private int hashcode = -1; - - public int hashCode() { - if (hashcode == -1) { - hashcode = base.hashCode() * key.hashCode(); - } - return hashcode; - } - - public String toString() { - return "context for " + key; - } - - public boolean equals(Object o) { - return (o instanceof ScopeMappingContext) && key.equals(((ScopeMappingContext) o).key) - && base.equals(((ScopeMappingContext) o).base); - } - } - - private final ContextSelector base; - - public ScopeMappingKeysContextSelector(ContextSelector base) { - this.base = base; - } - - public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { - Context bc = base.getCalleeTarget(caller, site, callee, receiver); - if (callee instanceof SummarizedMethod) { - final String calleeName = callee.getReference().toString(); - if (calleeName.equals("< JavaScriptLoader, LArray, ctor()LRoot; >") - || calleeName.equals("< JavaScriptLoader, LObject, ctor()LRoot; >")) { - return bc; - } - } - if (receiver[0] instanceof ScopeMappingInstanceKey) { - final ScopeMappingInstanceKey smik = (ScopeMappingInstanceKey) receiver[0]; - final ScopeMappingContext scopeMappingContext = new ScopeMappingContext(bc, smik); - return scopeMappingContext; - } else { - return bc; - } - } - - private static final IntSet thisParameter = IntSetUtil.make(new int[] { 0 }); - - public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { - return thisParameter; - } - -} From 321695617c3d340cfa5e703655270ba1ea53152c Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 16:18:16 -0700 Subject: [PATCH 164/187] delete more code --- .../JavaScriptConstructorContextSelector.java | 4 +- .../wala/cast/ipa/callgraph/AstCallGraph.java | 27 - .../AstSSAPropagationCallGraphBuilder.java | 167 +---- .../LexicalScopingResolverContexts.java | 613 ------------------ .../callgraph/ScopeMappingInstanceKeys.java | 3 - .../cast/ir/translator/AstTranslator.java | 16 + 6 files changed, 19 insertions(+), 811 deletions(-) delete mode 100644 com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java index 0203c2bb0..669249837 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java @@ -10,7 +10,7 @@ *******************************************************************************/ package com.ibm.wala.cast.js.ipa.callgraph; -import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts; +import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptConstructTargetSelector.JavaScriptConstructor; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IMethod; @@ -49,7 +49,7 @@ public class JavaScriptConstructorContextSelector implements ContextSelector { public Context getCalleeTarget(final CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee instanceof JavaScriptConstructor) { final Context oneLevelCallStringContext = oneLevelCallStrings.getCalleeTarget(caller, site, callee, receiver); - if (usePreciseLexical && LexicalScopingResolverContexts.hasExposedUses(caller, site)) { + if (usePreciseLexical && AstLexicalInformation.hasExposedUses(caller, site)) { // use a caller-site context, to enable lexical scoping lookups (via caller CGNode) return oneLevelCallerSite.getCalleeTarget(caller, site, callee, receiver); } else { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java index 12cc37510..72f0a44dc 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java @@ -82,8 +82,6 @@ public class AstCallGraph extends ExplicitCallGraph { public class AstCGNode extends ExplicitNode { private Set> callbacks; - private boolean lexicalScopingChanges = false; - private IR cachedIR; private DefUse cachedDU; @@ -145,35 +143,10 @@ public class AstCallGraph extends ExplicitCallGraph { } } - public void setLexicallyMutatedIR(IR ir) { - lexicalScopingChanges = true; - cachedIR = ir; - cachedDU = null; - } - public void clearMutatedCache(CallSiteReference cs) { targets.remove(cs.getProgramCounter()); } - public IR getLexicallyMutatedIR() { - if (lexicalScopingChanges) { - return cachedIR; - } else { - return null; - } - } - - public DefUse getLexicallyMutatedDU() { - if (lexicalScopingChanges) { - if (cachedDU == null) { - cachedDU = new DefUse(cachedIR); - } - return cachedDU; - } else { - return null; - } - } - public boolean addTarget(CallSiteReference site, CGNode node) { if (super.addTarget(site, node)) { if (((AstCGNode) node).callbacks != null) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index c94b1c8a3..2fb7e16cd 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -17,7 +17,6 @@ import java.util.Set; import com.ibm.wala.analysis.reflection.ReflectionContextInterpreter; import com.ibm.wala.cast.ipa.callgraph.AstCallGraph.AstCGNode; -import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts.LexicalScopingResolver; import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey; import com.ibm.wala.cast.ir.ssa.AbstractLexicalInvoke; import com.ibm.wala.cast.ir.ssa.AstAssertInstruction; @@ -33,11 +32,9 @@ import com.ibm.wala.cast.ir.ssa.AstLexicalRead; import com.ibm.wala.cast.ir.ssa.AstLexicalWrite; import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction; import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction; -import com.ibm.wala.cast.ir.ssa.SSAConversion; import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; -import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.fixpoint.AbstractOperator; import com.ibm.wala.fixpoint.IntSetVariable; @@ -46,7 +43,6 @@ import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; -import com.ibm.wala.ipa.callgraph.impl.Everywhere; import com.ibm.wala.ipa.callgraph.impl.ExplicitCallGraph; import com.ibm.wala.ipa.callgraph.propagation.AbstractFieldPointerKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; @@ -66,7 +62,6 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.DefUse; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; -import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.ssa.SSAPutInstruction; import com.ibm.wala.ssa.SymbolTable; import com.ibm.wala.util.collections.HashSetFactory; @@ -304,25 +299,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa // } } - /** - * Not sure what this method is doing; keeping to play it safe --MS - */ - @SuppressWarnings("unused") - private boolean checkLexicalInstruction(AstLexicalAccess instruction) { - LexicalScopingResolver r = (LexicalScopingResolver) node.getContext().get(LexicalScopingResolverContexts.RESOLVER); - if (r == null) { - return false; - } else { - for (Access a : instruction.getAccesses()) { - Pair name = a.getName(); - if ((r.isReadOnly(name) ? r.getReadOnlyValues(name) : r.getLexicalSites(name)) == null) { - return false; - } - } - } - return true; - } public void visitAstLexicalRead(AstLexicalRead instruction) { visitLexical(instruction, new LexicalOperator((AstCGNode) node, instruction.getAccesses(), true) { @@ -594,7 +571,6 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa * . */ private void doLexicalPointerKeys(boolean funargsOnly) { - LexicalScopingResolver r = (LexicalScopingResolver) node.getContext().get(LexicalScopingResolverContexts.RESOLVER); for (int i = 0; i < accesses.length; i++) { final String name = accesses[i].variableName; final String definer = accesses[i].variableDefiner; @@ -801,148 +777,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } - /** - * if n is the root method, return the result of - * {@link #handleRootLexicalReference(String, String, CGNode)}. Otherwise, - * if (name,definer) is exposed from the lexical scope for n, get the - * corresponding value number at the call site and return the PointerKey - * corresponding to that local. possibly adds a use of the value number to - * the {@link AbstractLexicalInvoke} instruction at the call site (since we - * now know the name is accessed by some transitive callee), thereby - * requiring marking of the IR as mutated. - */ - private PointerKey getLocalReadKey(CGNode n, CallSiteReference callSite, String name, String definer) { - AstIR ir = (AstIR) n.getIR(); - int pc = callSite.getProgramCounter(); - LexicalInformation L = ((AstIR) n.getIR()).lexicalInfo(); - - AbstractLexicalInvoke I = (AbstractLexicalInvoke) ir.getInstructions()[pc]; - - // find existing explicit lexical use - for (int i = I.getNumberOfParameters(); i <= I.getLastLexicalUse(); i++) { - Access A = I.getLexicalUse(i); - if (A.variableName.equals(name) && isEqual(A.variableDefiner, definer)) { - return getBuilder().getPointerKeyForLocal(n, A.valueNumber); - } - } - - // make new lexical use - int values[] = L.getExposedUses(pc); - Pair names[] = L.getExposedNames(); - if (names != null && names.length > 0) { - for (int i = 0; i < names.length; i++) { - if (name.equals(names[i].fst) && isEqual(definer, names[i].snd)) { - if (values[i] == -1) - return null; - - I.addLexicalUse(new Access(name, definer, values[i])); - - if (SSAConversion.DEBUG_UNDO) - System.err.println(("copy use #" + (-i - 1) + " to use #" + (I.getNumberOfUses() - 1) + " at inst " + pc)); - - SSAConversion.copyUse(ir, pc, -i - 1, pc, I.getNumberOfUses() - 1); - - ((AstCallGraph.AstCGNode) n).setLexicallyMutatedIR(ir); - - return getBuilder().getPointerKeyForLocal(n, values[i]); - } - } - } - - return null; - - } - - private PointerKey getLocalWriteKey(CGNode n, CallSiteReference callSite, String name, String definer) { - AstMethod AstM = (AstMethod) n.getMethod(); - ; - AstIR ir = (AstIR) n.getIR(); - LexicalInformation L = ir.lexicalInfo(); - - int pc = callSite.getProgramCounter(); - AbstractLexicalInvoke I = (AbstractLexicalInvoke) ir.getInstructions()[pc]; - - // find existing explicit lexical def - for (int i = 2; i < I.getNumberOfDefs(); i++) { - Access A = I.getLexicalDef(i); - if (A.variableName.equals(name) && isEqual(A.variableDefiner, definer)) { - return getBuilder().getPointerKeyForLocal(n, A.valueNumber); - } - } - - // make new lexical def - int values[] = L.getExposedUses(pc); - Pair names[] = L.getExposedNames(); - if (names != null && names.length > 0) { - for (int i = 0; i < names.length; i++) { - if (name.equals(names[i].fst) && isEqual(definer, names[i].snd)) { - if (values[i] == -1) - return null; - - // find calls that may be altered, and clear their caches - DefUse newDU = getAnalysisCache().getSSACache().findOrCreateDU(ir, n.getContext()); - Iterator insts = newDU.getUses(values[i]); - while (insts.hasNext()) { - SSAInstruction inst = insts.next(); - if (inst instanceof SSAAbstractInvokeInstruction) { - // System.err.println("clearing for " + inst); - CallSiteReference cs = ((SSAAbstractInvokeInstruction) inst).getCallSite(); - ((AstCallGraph.AstCGNode) n).clearMutatedCache(cs); - } - } - - // if values[i] was altered by copy propagation, we must undo - // that to ensure we do not bash the wrong value number in the - // the next steps. - SSAConversion.undoCopyPropagation(ir, pc, -i - 1); - - // possibly new instruction due to renames, so get it again - I = (AbstractLexicalInvoke) ir.getInstructions()[pc]; - - // we assume that the callee might not necessarily write, - // so the call becomes like a phi node. hence it needs a - // read of the old value - ensureRead: { - for (int l = 0; l < I.getNumberOfUses(); l++) { - if (I.isLexicalUse(l)) { - Access r = I.getLexicalUse(l); - if (name.equals(r.variableName)) { - if (definer == null ? r.variableDefiner == null : definer.equals(r.variableDefiner)) { - break ensureRead; - } - } - } - } - I.addLexicalUse(new Access(name, definer, values[i])); - } - - // add new lexical definition - I.addLexicalDef(new Access(name, definer, values[i])); - - if (SSAConversion.DEBUG_UNDO) - System.err.println("new def of " + values[i] + " at inst " + pc + ": " + I); - - // new def has broken SSA form for values[i], so fix for that value - MutableIntSet vs = IntSetUtil.make(); - vs.add(values[i]); - SSAConversion.convert(AstM, ir, getOptions().getSSAOptions()); - - // force analysis to be redone - // TODO: only values[i] uses need to be re-done. - ir.lexicalInfo().handleAlteration(); - ((AstCallGraph.AstCGNode) n).setLexicallyMutatedIR(ir); - getAnalysisCache().getSSACache().invalidate(AstM, n.getContext()); - getAnalysisCache().getSSACache().invalidate(AstM, Everywhere.EVERYWHERE); - getBuilder().markChanged(n); - - // get SSA-renamed def from call site instruction - return getLocalWriteKey(n, callSite, name, definer); - } - } - } - - return null; - } + // ///////////////////////////////////////////////////////////////////////// // diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java deleted file mode 100644 index 36b06e607..000000000 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java +++ /dev/null @@ -1,613 +0,0 @@ -/******************************************************************************* - * 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.ipa.callgraph; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import com.ibm.wala.cast.loader.AstMethod; -import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; -import com.ibm.wala.classLoader.CallSiteReference; -import com.ibm.wala.classLoader.IMethod; -import com.ibm.wala.ipa.callgraph.CGNode; -import com.ibm.wala.ipa.callgraph.Context; -import com.ibm.wala.ipa.callgraph.ContextItem; -import com.ibm.wala.ipa.callgraph.ContextKey; -import com.ibm.wala.ipa.callgraph.ContextSelector; -import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; -import com.ibm.wala.ipa.callgraph.propagation.LocalPointerKey; -import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder; -import com.ibm.wala.ipa.summaries.SummarizedMethod; -import com.ibm.wala.util.collections.CompoundIterator; -import com.ibm.wala.util.collections.EmptyIterator; -import com.ibm.wala.util.collections.HashMapFactory; -import com.ibm.wala.util.collections.HashSetFactory; -import com.ibm.wala.util.collections.IteratorPlusOne; -import com.ibm.wala.util.collections.MapUtil; -import com.ibm.wala.util.collections.NonNullSingletonIterator; -import com.ibm.wala.util.collections.Pair; -import com.ibm.wala.util.intset.IntSet; - -public final class LexicalScopingResolverContexts implements ContextSelector { - - public static final ContextKey RESOLVER = new ContextKey() { - public final String toString() { - return "Resolver Key"; - } - }; - - private static final boolean USE_CGNODE_RESOLVER = true; - - /** - * used to resolve lexical accesses during call graph construction - */ - interface LexicalScopingResolver extends ContextItem { - - /** - * return resolver for parent lexical scope - */ - LexicalScopingResolver getParent(); - - /** - * return true if name may only be read in nested lexical scopes, otherwise - * false - */ - boolean isReadOnly(Pair name); - - /** - * if {@link #isReadOnly(Pair)} returns true for name, get the - * {@link LocalPointerKey} corresponding to name from the {@link CGNode} - * that defines it - */ - Set getReadOnlyValues(Pair name); - - /** - * get the site-node pairs (s,n) in the scope-resolver chain such that n has - * a definition of the name and s is the call site in n possibly exposing - * the name to an invoked nested function - */ - Iterator> getLexicalSites(Pair name); - - /** - * resolvers for child lexical scopes. updates are performed via mutations - * of the returned map. - */ - Map children(); - - /** - * get the CGNode in the scope-resolver chain that defines name, or - * null if so such node exists (happens when accesses occurs - * after exit of defining function) - */ - CGNode getOriginalDefiner(Pair name); - } - - /** - * find or create an appropriate {@link LexicalScopingResolver} for the caller - * and callSite. Note that {@link #hasExposedUses(CGNode, CallSiteReference)} - * must be true for caller and callSite. We try to re-use a previously-created - * context whenever possible. - */ - private LexicalScopingResolver findChild(CGNode caller, CallSiteReference callSite) { - LexicalScopingResolver parent = (LexicalScopingResolver) caller.getContext().get(RESOLVER); - if (parent == null) { - parent = globalResolver; - } - - Map readOnlyNames = HashMapFactory.make(); - Set> readWriteNames = HashSetFactory.make(); - - LexicalInformation LI = ((AstMethod) caller.getMethod()).lexicalInfo(); - int[] exposedUses = LI.getExposedUses(callSite.getProgramCounter()); - if (exposedUses.length > 0) { - Pair exposedNames[] = LI.getExposedNames(); - for (int i = 0; i < exposedUses.length; i++) { - if (exposedUses[i] != -1) { - if (!parent.isReadOnly(exposedNames[i])) { - if (LI.isReadOnly(exposedNames[i].snd)) { - readOnlyNames.put(exposedNames[i].snd, new LocalPointerKey(caller, exposedUses[i])); - } else { - readWriteNames.add(exposedNames[i]); - } - } - } - } - - if (USE_CGNODE_RESOLVER) { - CGNodeResolver result = (CGNodeResolver) parent.children().get(caller); - if (result == null) { - result = new CGNodeResolver(parent, caller); - parent.children().put(caller, result); - } - for (String readOnlyName : readOnlyNames.keySet()) { - result.addReadOnlyName(readOnlyName, readOnlyNames.get(readOnlyName)); - } - for (Pair readWriteName : readWriteNames) { - result.addReadWriteName(readWriteName, callSite); - } - return result; - } else { - Object key; - if (!readWriteNames.isEmpty()) { - key = Pair.make(caller, callSite); - } else { - key = readOnlyNames.keySet(); - } - - if (parent.children().containsKey(key)) { - return parent.children().get(key); - } - - if (!readWriteNames.isEmpty()) { - SiteResolver result = new SiteResolver(parent, caller, readOnlyNames, callSite, readWriteNames); - parent.children().put(key, result); - return result; - } else { - ReadOnlyResolver result = new ReadOnlyResolver(parent, caller, readOnlyNames); - parent.children().put(key, result); - return result; - } - } - } - - return parent; - } - - LexicalScopingResolver globalResolver = new LexicalScopingResolver() { - - public boolean isReadOnly(Pair name) { - return false; - } - - public Set getReadOnlyValues(Pair name) { - throw new UnsupportedOperationException("not expecting read only global"); - } - - public Iterator> getLexicalSites(Pair name) { - if (name.snd == null) { - return new NonNullSingletonIterator>(Pair.make((CallSiteReference) null, builder - .getCallGraph().getFakeRootNode())); - } else { - return EmptyIterator.instance(); - } - } - - private Map children; - - public Map children() { - if (children == null) { - children = HashMapFactory.make(); - } - return children; - } - - public LexicalScopingResolver getParent() { - return null; - } - - public CGNode getOriginalDefiner(Pair name) { - if (name.snd == null) { - return builder.getCallGraph().getFakeRootNode(); - } else { - return null; - } - } - - public String toString() { - return "GLOBAL_RESOLVER"; - } - }; - - /** - * single {@link LexicalScopingResolver} for a CGNode, handling read-only and - * read-write names - */ - class CGNodeResolver implements LexicalScopingResolver { - - private final LexicalScopingResolver parent; - private Map children; - /** - * definer name for corresponding scope - */ - private final String myDefiner; - private final CGNode myNode; - - /** - * maps a read-only name defined in this scope to the local pointer keys by - * which it is referenced at call sites encountered thus far - */ - private Map> myReadOnlyDefs = null; - - /** - * maps a name defined in this scope that may be defined in a nested scope - * to the set of call sites at which it is exposed for nested writes - */ - private Map, Set>> myDefs = null; - - public CGNodeResolver(LexicalScopingResolver parent, CGNode myNode) { - super(); - this.parent = parent; - this.myDefiner = ((AstMethod) myNode.getMethod()).lexicalInfo().getScopingName(); - this.myNode = myNode; - } - - public void addReadWriteName(Pair readWriteName, CallSiteReference callSite) { - if (myDefs == null) { - myDefs = HashMapFactory.make(); - } - MapUtil.findOrCreateSet(myDefs, readWriteName).add(Pair.make(callSite, myNode)); - } - - public void addReadOnlyName(String readOnlyName, LocalPointerKey localPointerKey) { - if (myReadOnlyDefs == null) { - myReadOnlyDefs = HashMapFactory.make(); - } - MapUtil.findOrCreateSet(myReadOnlyDefs, readOnlyName).add(localPointerKey); - } - - public LexicalScopingResolver getParent() { - return parent; - } - - public boolean isReadOnly(Pair name) { - if (myDefiner.equals(name.fst)) { - return myReadOnlyDefs != null && myReadOnlyDefs.containsKey(name.snd); - } else { - return parent.isReadOnly(name); - } - } - - public Set getReadOnlyValues(Pair name) { - if (myDefiner.equals(name.fst)) { - return myReadOnlyDefs.get(name.snd); - } else { - return parent.getReadOnlyValues(name); - } - } - - public Iterator> getLexicalSites(Pair name) { - if (myDefs == null || myDefs.containsKey(name)) { - if (myDefiner.equals(name.snd)) { - // no need to recurse to parent - return myDefs.get(name).iterator(); - } else { - return new CompoundIterator>(parent.getLexicalSites(name), myDefs.get(name).iterator()); - } - } else { - return parent.getLexicalSites(name); - } - } - - public Map children() { - if (children == null) { - children = HashMapFactory.make(); - } - return children; - } - - public CGNode getOriginalDefiner(Pair name) { - if (myDefiner.equals(name.snd)) { - return myNode; - } else { - return parent.getOriginalDefiner(name); - } - } - - // @Override - // public String toString() { - // StringBuilder result = new StringBuilder(); - // result.append("CGNodeResolver[myDefiner="); - // result.append(myDefiner); - // result.append(",\n parent="); - // result.append(parent); - // result.append("]"); - // return result.toString(); - // } - - } - - /** - * {@link LexicalScopingResolver} for case where all exposed names from the - * corresponding scope are read-only - */ - class ReadOnlyResolver implements LexicalScopingResolver { - final protected LexicalScopingResolver parent; - protected Map children; - /** - * definer name for corresponding scope - */ - final protected String myDefiner; - final protected Map myReadOnlyDefs; - final protected CGNode myNode; - - private ReadOnlyResolver(LexicalScopingResolver parent, CGNode caller, Map readOnlyDefs) { - this.myDefiner = ((AstMethod) caller.getMethod()).lexicalInfo().getScopingName(); - this.parent = parent; - this.myReadOnlyDefs = readOnlyDefs; - this.myNode = caller; - } - - public boolean isReadOnly(Pair name) { - if (myDefiner.equals(name.fst)) { - return myReadOnlyDefs.containsKey(name.snd); - } else { - return parent.isReadOnly(name); - } - } - - public Set getReadOnlyValues(Pair name) { - if (myDefiner.equals(name.fst)) { - return Collections.singleton(myReadOnlyDefs.get(name.snd)); - } else { - return parent.getReadOnlyValues(name); - } - } - - public Map children() { - if (children == null) { - children = HashMapFactory.make(); - } - return children; - } - - public Iterator> getLexicalSites(Pair name) { - return parent.getLexicalSites(name); - } - - public LexicalScopingResolver getParent() { - return parent; - } - - public CGNode getOriginalDefiner(Pair name) { - if (myDefiner.equals(name.snd)) { - return myNode; - } else { - return parent.getOriginalDefiner(name); - } - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(); - result.append("ReadOnlyResolver[myDefiner="); - result.append(myDefiner); - // result.append(", myNode="); - // result.append(myNode); - result.append(",\n myReadOnlyDefs="); - result.append(myReadOnlyDefs); - result.append(",\n parent="); - result.append(parent); - result.append("]"); - return result.toString(); - } - - } - - /** - * {@link LexicalScopingResolver} handling case where some exposed names may - * be written in enclosed scopes - */ - class SiteResolver extends ReadOnlyResolver implements LexicalScopingResolver { - /** - * names defined in the corresponding scope that may be written in a nested - * scope - */ - private final Set> myDefs; - private final CallSiteReference mySite; - - private SiteResolver(LexicalScopingResolver parent, CGNode caller, Map readOnlyDefs, - CallSiteReference site, Set> defs) { - super(parent, caller, readOnlyDefs); - this.mySite = site; - this.myDefs = defs; - } - - public Iterator> getLexicalSites(Pair name) { - if (myDefs.contains(name)) { - if (myDefiner.equals(name.snd)) { - return new NonNullSingletonIterator>(Pair.make(mySite, myNode)); - } else { - return IteratorPlusOne.make(parent.getLexicalSites(name), Pair.make(mySite, myNode)); - } - } else { - return parent.getLexicalSites(name); - } - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(); - result.append("SiteResolver[myDefiner="); - result.append(myDefiner); - // result.append(", myNode="); - // result.append(myNode); - result.append(",\n mySite="); - result.append(mySite); - result.append(",\n myReadOnlyDefs="); - result.append(myReadOnlyDefs); - result.append(",\n myDefs="); - result.append(myDefs); - result.append(",\n parent="); - result.append(parent); - result.append("]"); - return result.toString(); - } - - } - - private class LexicalScopingResolverContext implements Context { - private final LexicalScopingResolver governingCallSites; - private final Context base; - - public int hashCode() { - return base.hashCode() * (governingCallSites == null ? 1077651 : governingCallSites.hashCode()); - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (getClass().equals(o.getClass())) { - LexicalScopingResolverContext c = (LexicalScopingResolverContext) o; - return (base == null ? c.base == null : base.equals(c.base)) && (governingCallSites == c.governingCallSites); - } else { - return false; - } - } - - public ContextItem get(ContextKey name) { - return name.equals(RESOLVER) ? governingCallSites : base != null ? base.get(name) : null; - } - - private LexicalScopingResolverContext(LexicalScopingResolver governingCallSites, Context base) { - this.base = base; - this.governingCallSites = governingCallSites; - } - - private LexicalScopingResolverContext(CGNode source, CallSiteReference callSite, Context base) { - this.base = base; - this.governingCallSites = findChild(source, callSite); - } - - @Override - public String toString() { - return "LexicalScopingResolverContext [governingCallSites=" + governingCallSites + ", base=" + base + "]"; - } - - } - - private final ContextSelector base; - - private final PropagationCallGraphBuilder builder; - - public LexicalScopingResolverContexts(PropagationCallGraphBuilder builder, ContextSelector base) { - this.base = base; - this.builder = builder; - } - - private static class RecursionKey { - private final IMethod caller; - private final CallSiteReference site; - private final IMethod target; - - public RecursionKey(IMethod caller, CallSiteReference site, IMethod target) { - super(); - this.caller = caller; - this.site = site; - this.target = target; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + caller.hashCode(); - result = prime * result + site.hashCode(); - result = prime * result + target.hashCode(); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - RecursionKey other = (RecursionKey) obj; - if (!caller.equals(other.caller)) - return false; - if (!site.equals(other.site)) - return false; - if (!target.equals(other.target)) - return false; - return true; - } - - } - - /** - * cache for recursion checks - */ - private final Map> key2Contexts = HashMapFactory.make(); - - private Context checkForRecursion(RecursionKey key, LexicalScopingResolver srcResolver) { - List calleeContexts = key2Contexts.get(key); - if (calleeContexts != null) { - // globalResolver better be at the top of any parent chain - while (srcResolver != globalResolver) { - for (LexicalScopingResolverContext c : calleeContexts) { - if (c.governingCallSites == srcResolver) { - return c; - } - } - srcResolver = srcResolver.getParent(); - } - } - return null; - } - - public static boolean hasExposedUses(CGNode caller, CallSiteReference site) { - int uses[] = ((AstMethod) caller.getMethod()).lexicalInfo().getExposedUses(site.getProgramCounter()); - if (uses != null && uses.length > 0) { - for (int use : uses) { - if (use > 0) { - return true; - } - } - } - - return false; - } - - public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { - Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); - if (callee instanceof SummarizedMethod) { - final String calleeName = callee.getReference().toString(); - // TODO create a sub-class in the cast.js projects so we're not checking strings here - if (calleeName.equals("< JavaScriptLoader, LArray, ctor()LRoot; >") || calleeName.equals("< JavaScriptLoader, LObject, ctor()LRoot; >")) { - return baseContext; - } - } - LexicalScopingResolver resolver = (LexicalScopingResolver) caller.getContext().get(RESOLVER); - - final RecursionKey key = new RecursionKey(caller.getMethod(), site, callee); - if (resolver != null) { - Context recursiveParent = checkForRecursion(key, resolver); - if (recursiveParent != null) { - return recursiveParent; - } - } - - if (caller.getMethod() instanceof AstMethod && hasExposedUses(caller, site)) { - LexicalScopingResolverContext result = new LexicalScopingResolverContext(caller, site, baseContext); - MapUtil.findOrCreateList(key2Contexts, key).add(result); - return result; - } - - else if (resolver != null) { - LexicalScopingResolverContext result = new LexicalScopingResolverContext(resolver, baseContext); - MapUtil.findOrCreateList(key2Contexts, key).add(result); - return result; - } - - else { - return baseContext; - } - } - - public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { - return base.getRelevantParameters(caller, site); - } -} \ No newline at end of file diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index 166d88b46..c6269491a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -13,14 +13,11 @@ package com.ibm.wala.cast.ipa.callgraph; import java.util.Collection; import java.util.Iterator; -import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts.LexicalScopingResolver; -import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.classLoader.ProgramCounter; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; -import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; 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 78b7e4481..36dc6f8bd 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 @@ -35,6 +35,7 @@ import com.ibm.wala.cast.ir.ssa.AstLexicalWrite; import com.ibm.wala.cast.ir.ssa.EachElementGetInstruction; import com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction; import com.ibm.wala.cast.ir.ssa.SSAConversion; +import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.DebuggingInformation; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; import com.ibm.wala.cast.loader.CAstAbstractLoader; @@ -56,9 +57,11 @@ import com.ibm.wala.cast.types.AstTypeReference; import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.IBasicBlock; +import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.ModuleEntry; +import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.shrikeBT.BinaryOpInstruction; import com.ibm.wala.shrikeBT.ConditionalBranchInstruction; import com.ibm.wala.shrikeBT.IBinaryOpInstruction; @@ -2706,6 +2709,19 @@ public abstract class AstTranslator extends CAstVisitor 0) { + for (int use : uses) { + if (use > 0) { + return true; + } + } + } + + return false; + } }; /** From d2933d49b2de5db08e4dd845888534992e5abc29 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 6 Jun 2013 16:36:59 -0700 Subject: [PATCH 165/187] delete a little more code and javadoc --- .../AstSSAPropagationCallGraphBuilder.java | 20 +++++++------------ .../cast/ir/translator/AstTranslator.java | 7 ------- .../com/ibm/wala/cast/loader/AstMethod.java | 6 ------ 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index 2fb7e16cd..4b92d66b5 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -559,14 +559,8 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa * perform the necessary {@link #action(PointerKey, int)}s for the * accesses. For each access, we determine the possible {@link CGNode}s * corresponding to its definer (see - * {@link AstConstraintVisitor#getLexicalDefiners(CGNode, String)). For - * each such definer node D, we traverse the current call graph backwards, - * stopping at either D or the root. For each call edge encountered during - * the traversal, check if the caller has a local value number for the - * access's name at the relevant call sites (can be functions nested in D - * if {@link AstTranslator#useLocalValuesForLexicalVars()} is set). If so, - * perform the action. Note that if the root node is reached, we have an - * upward funarg; see + * {@link AstConstraintVisitor#getLexicalDefiners(CGNode, String)). Handle + * using * {@link AstConstraintVisitor#handleRootLexicalReference(String, String, CGNode)} * . */ @@ -579,11 +573,11 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa if (AstTranslator.DEBUG_LEXICAL) System.err.println(("looking up lexical parent " + definer)); - Set creators = getLexicalDefiners(node, Pair.make(name, definer)); - for (CGNode n : creators) { - PointerKey funargKey = handleRootLexicalReference(name, definer, n); - action(funargKey, vn); - } + Set creators = getLexicalDefiners(node, Pair.make(name, definer)); + for (CGNode n : creators) { + PointerKey funargKey = handleRootLexicalReference(name, definer, n); + action(funargKey, vn); + } } } 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 36dc6f8bd..3e8ab99e6 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 @@ -2695,13 +2695,6 @@ public abstract class AstTranslator extends CAstVisitor Date: Thu, 6 Jun 2013 20:03:39 -0700 Subject: [PATCH 166/187] fix compile error --- .../com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 7bb6413c0..678c3f488 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -19,13 +19,8 @@ import java.util.Properties; import junit.framework.Assert; -<<<<<<< HEAD -import com.ibm.wala.cast.ir.translator.AstTranslator; -======= ->>>>>>> kill NEW_LEXICAL flag import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptFunctionDotCallTargetSelector; -import com.ibm.wala.cast.js.ipa.callgraph.PropertyNameContextSelector; import com.ibm.wala.cast.js.ipa.callgraph.RecursionCheckContextSelector; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.CGBuilderType; From f268ca91fd853a629af4339a0d7eaa4e0579ecbd Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 7 Jun 2013 09:48:00 -0700 Subject: [PATCH 167/187] remove precise lexical config options; we want this to just be on --- .../cast/js/rhino/test/HTMLCGBuilder.java | 2 +- .../cast/js/test/JSCallGraphBuilderUtil.java | 20 +++++------------- .../js/ipa/callgraph/JSAnalysisOptions.java | 21 ------------------- .../ipa/callgraph/JSZeroOrOneXCFABuilder.java | 8 ++----- .../JavaScriptConstructorContextSelector.java | 9 ++++---- .../OneLevelForLexicalAccessFunctions.java | 9 ++++++-- 6 files changed, 19 insertions(+), 50 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java index 678c3f488..c8cf6ea3b 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/HTMLCGBuilder.java @@ -179,7 +179,7 @@ public class HTMLCGBuilder { JavaScriptFunctionDotCallTargetSelector.WARN_ABOUT_IMPRECISE_CALLGRAPH = false; // build call graph - CGBuilderResult res = buildHTMLCG(src, timeout, CGBuilderType.ONE_CFA_PRECISE_LEXICAL); + CGBuilderResult res = buildHTMLCG(src, timeout, CGBuilderType.ONE_CFA); if(res.construction_time == -1) System.out.println("TIMED OUT"); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index 6e3b5262a..eeff153e5 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -55,23 +55,18 @@ import com.ibm.wala.util.WalaException; public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil { public static enum CGBuilderType { - ZERO_ONE_CFA(false, false, true, true), - ZERO_ONE_CFA_NO_CALL_APPLY(false, false, false, true), - ZERO_ONE_CFA_PRECISE_LEXICAL(false, true, true, true), - ONE_CFA(true, false, true, true), - ONE_CFA_PRECISE_LEXICAL(true, true, true, true); - + ZERO_ONE_CFA(false, true, true), + ZERO_ONE_CFA_NO_CALL_APPLY(false, false, true), + ONE_CFA(true, true, true); + private final boolean useOneCFA; - private final boolean usePreciseLexical; - private final boolean handleCallApply; private final boolean extractCorrelatedPairs; - private CGBuilderType(boolean useOneCFA, boolean usePreciseLexical, boolean handleCallApply, boolean extractCorrelatedPairs) { + private CGBuilderType(boolean useOneCFA, boolean handleCallApply, boolean extractCorrelatedPairs) { this.useOneCFA = useOneCFA; - this.usePreciseLexical = usePreciseLexical; this.handleCallApply = handleCallApply; this.extractCorrelatedPairs = extractCorrelatedPairs; } @@ -80,10 +75,6 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J return useOneCFA; } - public boolean usePreciseLexical() { - return usePreciseLexical; - } - public boolean handleCallApply() { return handleCallApply; } @@ -203,7 +194,6 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J Iterable roots = makeScriptRoots(cha); JSAnalysisOptions options = makeOptions(scope, cha, roots); options.setHandleCallApply(builderType.handleCallApply()); - options.setUsePreciseLexical(builderType.usePreciseLexical()); AnalysisCache cache = makeCache(irFactory); JSCFABuilder builder = new JSZeroOrOneXCFABuilder(cha, options, cache, null, null, ZeroXInstanceKeys.ALLOCATIONS, builderType.useOneCFA()); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java index 7e3c4f33b..6673ef261 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java @@ -12,9 +12,7 @@ package com.ibm.wala.cast.js.ipa.callgraph; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisScope; -import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.Entrypoint; -import com.ibm.wala.ipa.callgraph.propagation.cfa.CallerSiteContext; /** * call graph construction options specific to JavaScript. @@ -29,18 +27,6 @@ public class JSAnalysisOptions extends AnalysisOptions { private boolean useLoadFileTargetSelector = true; - /** - * should the analysis employ additional context sensitivity for more precise handling of lexical accesses? if true, then: - * - *
    - *
  1. Employ a {@link CallerSiteContext} for calls to constructors of functions that may perform a lexical access.
  2. - *
  3. Employ a {@link CallerSiteContext} for calls to functions that may perform a lexical access.
  4. - *
- * - * The above helps to avoid conflation of lexical variables associated with distinct {@link CGNode}s. - */ - private boolean usePreciseLexical = false; - public JSAnalysisOptions(AnalysisScope scope, Iterable e) { super(scope, e); } @@ -64,11 +50,4 @@ public class JSAnalysisOptions extends AnalysisOptions { this.useLoadFileTargetSelector = useIt; } - public boolean usePreciseLexical() { - return usePreciseLexical; - } - - public void setUsePreciseLexical(boolean usePreciseLexical) { - this.usePreciseLexical = usePreciseLexical; - } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java index a45699626..f50564d82 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java @@ -54,11 +54,9 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder { // JavaScriptConstructorContextSelector ensures at least a 0-1-CFA (i.e., // Andersen's-style) heap abstraction. This level of heap abstraction is // _necessary_ for correctness (we rely on it when handling lexical scoping) - contextSelector = new JavaScriptConstructorContextSelector(contextSelector, options.usePreciseLexical()); + contextSelector = new JavaScriptConstructorContextSelector(contextSelector); - if (options.usePreciseLexical()) { - contextSelector = new OneLevelForLexicalAccessFunctions(contextSelector); - } + contextSelector = new OneLevelForLexicalAccessFunctions(contextSelector); if (USE_OBJECT_SENSITIVITY) { contextSelector = new ObjectSensitivityContextSelector(contextSelector); @@ -108,8 +106,6 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder { * @param xmlFiles * set of Strings that are names of XML files holding bypass logic * specifications. - * @param dmd - * deployment descriptor abstraction * @return a 0-1-Opt-CFA Call Graph Builder. */ public static JSCFABuilder make(JSAnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, ClassLoader cl, diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java index 669249837..a53f303c7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java @@ -33,23 +33,22 @@ public class JavaScriptConstructorContextSelector implements ContextSelector { private final OneLevelSiteContextSelector oneLevelCallerSite; - private final boolean usePreciseLexical; - - public JavaScriptConstructorContextSelector(ContextSelector base, boolean usePreciseLexical) { + public JavaScriptConstructorContextSelector(ContextSelector base) { this.base = base; this.oneLevelCallStrings = new nCFAContextSelector(1, base); this.oneLevelCallerSite = new OneLevelSiteContextSelector(base); - this.usePreciseLexical = usePreciseLexical; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return base.getRelevantParameters(caller, site); } + @Override public Context getCalleeTarget(final CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee instanceof JavaScriptConstructor) { final Context oneLevelCallStringContext = oneLevelCallStrings.getCalleeTarget(caller, site, callee, receiver); - if (usePreciseLexical && AstLexicalInformation.hasExposedUses(caller, site)) { + if (AstLexicalInformation.hasExposedUses(caller, site)) { // use a caller-site context, to enable lexical scoping lookups (via caller CGNode) return oneLevelCallerSite.getCalleeTarget(caller, site, callee, receiver); } else { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java index f1ed0a861..aca24852e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/OneLevelForLexicalAccessFunctions.java @@ -21,9 +21,12 @@ import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.IntSetUtil; /** - * adds one-level of {@link ArgumentInstanceContext} on the function argument + * Adds one-level of {@link ArgumentInstanceContext} on the function argument * for functions that perform lexical accesses (i.e., those functions - * represented by a {@link ScopeMappingInstanceKey}) + * represented by a {@link ScopeMappingInstanceKey}). In essence, this + * guarantees that when a function is cloned according to some + * {@link ContextSelector}, its nested functions that may do lexical accesses if + * its variables have corresponding clones. */ public class OneLevelForLexicalAccessFunctions implements ContextSelector { @@ -33,6 +36,7 @@ public class OneLevelForLexicalAccessFunctions implements ContextSelector { this.baseSelector = baseSelector; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { final Context base = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (receiver != null && receiver[0] != null && receiver[0] instanceof ScopeMappingInstanceKey) { @@ -43,6 +47,7 @@ public class OneLevelForLexicalAccessFunctions implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return IntSetUtil.make(new int[] { 0 }).union(baseSelector.getRelevantParameters(caller, site)); } From 162a001ce6eb1ec34f7434e47a6ebc20e4044629 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 7 Jun 2013 09:58:25 -0700 Subject: [PATCH 168/187] remove more code for older lexical access scheme --- .../translator/JavaCAst2IRTranslator.java | 4 - .../cast/js/translator/JSAstTranslator.java | 4 - .../cast/ir/translator/AstTranslator.java | 211 ++++-------------- 3 files changed, 40 insertions(+), 179 deletions(-) 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 ce1bdf46e..26c30d542 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 @@ -90,10 +90,6 @@ public class JavaCAst2IRTranslator extends AstTranslator { return false; } - protected boolean useLocalValuesForLexicalVars() { - return false; - } - protected void doThrow(WalkContext context, int exception) { context.cfg().addInstruction(insts.ThrowInstruction(exception)); } 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 a1cc57e56..d22747ffe 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 @@ -64,10 +64,6 @@ public class JSAstTranslator extends AstTranslator { protected boolean treatGlobalsAsLexicallyScoped() { return false; } - - protected boolean useLocalValuesForLexicalVars() { - return false; - } protected TypeReference defaultCatchType() { return JavaScriptTypes.Root; 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 3e8ab99e6..3ce431333 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 @@ -28,7 +28,6 @@ import com.ibm.wala.cast.ir.ssa.AstEchoInstruction; import com.ibm.wala.cast.ir.ssa.AstGlobalRead; import com.ibm.wala.cast.ir.ssa.AstGlobalWrite; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; -import com.ibm.wala.cast.ir.ssa.AstLexicalAccess; 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; @@ -110,15 +109,6 @@ public abstract class AstTranslator extends CAstVisitor exposedNames = entity2ExposedNames.get(entity); - if (exposedNames != null) { - 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); - context.cfg().addInstruction(new AstLexicalWrite(A)); - } + // perform a lexical write to copy the value stored in the local + // associated with each parameter to the lexical name + final CAstEntity entity = context.top(); + Set exposedNames = entity2ExposedNames.get(entity); + if (exposedNames != null) { + 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); + context.cfg().addInstruction(new AstLexicalWrite(A)); } } } @@ -287,12 +270,10 @@ public abstract class AstTranslator extends CAstVisitor exposed = entity2ExposedNames.get(entity); - if (exposed != null && exposed.contains(name)) { - return doLexReadHelper(context, name); - } + CAstEntity entity = context.top(); + Set exposed = entity2ExposedNames.get(entity); + if (exposed != null && exposed.contains(name)) { + return doLexReadHelper(context, name); } return context.currentScope().lookup(name).valueNumber(); } @@ -303,14 +284,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); - return; - } + CAstEntity entity = context.top(); + Set exposed = entity2ExposedNames.get(entity); + if (exposed != null && exposed.contains(nm)) { + // use a lexical write + doLexicallyScopedWrite(context, nm, rval); + return; } int lval = context.currentScope().lookup(nm).valueNumber(); if (lval != rval) { @@ -342,53 +321,13 @@ public abstract class AstTranslator extends CAstVisitor>>>>>> .r4421 - final String entityName = context.getEntityName(E); - if (useLocalValuesForLexicalVars()) { - // lexically-scoped variables can be given a single vn in a method -//<<<<<<< .mine -// Access A = new Access(name, context.getEntityName(E), vn); -//======= -//>>>>>>> .r4421 - -//<<<<<<< .mine - // (context.top() is current entity) - // record the name as exposed for the current entity, since if the name is - // updated via a call to a nested function, SSA for the current entity may - // need to be updated with the new definition -// addExposedName(context.top(), E, name, vn, false, context); -//======= - markExposedInEnclosingEntities(context, name, definingScope, E, entityName, false); -//>>>>>>> .r4421 - -//<<<<<<< .mine - // record the access; later, the Accesses in the instruction - // defining vn will be adjusted based on this information; see - // patchLexicalAccesses() -// addAccess(context, context.top(), A); -//======= - return S.valueNumber(); -//>>>>>>> .r4421 - - } else { - // lexically-scoped variables should be read from their scope each time - int result = context.currentScope().allocateTempValue(); -//<<<<<<< .mine -// Access A = new Access(name, context.getEntityName(E), result); -//======= - Access A = new Access(name, entityName, result); -//>>>>>>> .r4421 - context.cfg().addInstruction(new AstLexicalRead(A)); - markExposedInEnclosingEntities(context, name, definingScope, E, entityName, false); - return result; - } + int result = context.currentScope().allocateTempValue(); + Access A = new Access(name, entityName, result); + context.cfg().addInstruction(new AstLexicalRead(A)); + markExposedInEnclosingEntities(context, name, definingScope, E, entityName, false); + return result; } /** @@ -435,53 +374,24 @@ public abstract class AstTranslator extends CAstVisitor accesses) { - Access[] AC = accesses == null || accesses.isEmpty() ? (Access[]) null : (Access[]) accesses.toArray(new Access[accesses.size()]); - for (int i = 0; i < instrs.length; i++) { - if (instrs[i] instanceof AstLexicalAccess && ((AstLexicalAccess) instrs[i]).getAccessCount() == 0) { - // should just be AstLexicalRead for now; may add support for - // AstLexicalWrite later - assert instrs[i] instanceof AstLexicalRead; - assert useLocalValuesForLexicalVars(); - if (AC != null) { - ((AstLexicalAccess) instrs[i]).setAccesses(AC); - } else { - instrs[i] = null; - } - } - } - } - private Position getPosition(CAstSourcePositionMap map, CAstNode n) { if (map.getPosition(n) != null) { return map.getPosition(n); @@ -3047,7 +2917,6 @@ public abstract class AstTranslator extends CAstVisitor Date: Mon, 10 Jun 2013 09:02:12 -0400 Subject: [PATCH 169/187] tests --- .../js/test/TestSimpleCallGraphShape.java | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 11be6f5ce..1fbab47e5 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -17,12 +17,12 @@ import java.util.Set; import junit.framework.Assert; +import org.junit.Ignore; import org.junit.Test; -import com.ibm.wala.cast.js.ipa.callgraph.ForInContextSelector; +import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; -import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException; @@ -380,7 +380,17 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_apply2.js"); verifyGraphAssertions(CG, assertionsForFunctionApply2); } - + + private static final Object[][] assertionsForFunctionApply3 = new Object[][] { + new Object[] { ROOT, new String[] { "tests/function_apply3.js" } }, + new Object[] { "suffix:apply", new String[] { "suffix:foo" } } }; + + @Test + public void testFunctionDotApply3() throws IOException, IllegalArgumentException, CancelException, WalaException { + CallGraph CG = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_apply3.js"); + verifyGraphAssertions(CG, assertionsForFunctionApply3); + } + private static final Object[][] assertionsForWrap1 = new Object[][] { new Object[] { ROOT, new String[] { "tests/wrap1.js" } }, new Object[] { "suffix:wrap1.js", new String[] { "suffix:i_am_reachable" } } }; @@ -609,7 +619,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { @Test public void testArrayIndexConv2() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder b = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "array_index_conv2.js"); - b.setContextSelector(new ForInContextSelector(b.getContextSelector())); + b.setContextSelector(new PropertyNameContextSelector(b.getAnalysisCache(), b.getContextSelector())); CallGraph cg = b.makeCallGraph(b.getOptions()); //JSCallGraphUtil.AVOID_DUMP = false; //JSCallGraphUtil.dumpCG(b.getPointerAnalysis(), cg); @@ -642,32 +652,64 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { //JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); verifyGraphAssertions(CG, assertionsForDeadCode); } + + private static final Object[][] assertionsForExtend = new Object[][] { + new Object[] { ROOT, new String[] { "tests/extend.js" } }, + new Object[] { "tests/extend.js", new String[] { "suffix:bar", "!suffix:foo" } } + }; + + @Test + public void testExtend() throws IOException, WalaException, IllegalArgumentException, CancelException { + JSCFABuilder builder = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "extend.js"); + CallGraph cg = builder.makeCallGraph(builder.getOptions()); + verifyGraphAssertions(cg, assertionsForExtend); + } @Test public void testDeadCatch() throws IllegalArgumentException, IOException, CancelException, WalaException { JSCallGraphBuilderUtil.makeScriptCG("tests", "dead_catch.js"); } + @Ignore("need a bug fix") + @Test + public void testTryFinallyCrash() throws IllegalArgumentException, IOException, CancelException, WalaException { + JSCallGraphBuilderUtil.makeScriptCG("tests", "try-finally-crash.js"); + } + + @Test(expected = CallGraphBuilderCancelException.class) public void testManyStrings() throws IllegalArgumentException, IOException, CancelException, WalaException { SSAPropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "many-strings.js"); B.getOptions().setTraceStringConstants(true); final long startTime = System.currentTimeMillis(); CallGraph CG = B.makeCallGraph(B.getOptions(), new IProgressMonitor() { + @Override public void beginTask(String task, int totalWork) { } + @Override public boolean isCanceled() { return System.currentTimeMillis() > (startTime + 10000L); } + @Override public void done() { } + @Override public void worked(int units) { } }); - JSCallGraphUtil.AVOID_DUMP = false; - JSCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); + CAstCallGraphUtil.AVOID_DUMP = false; + CAstCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); } + @Test + public void testTutorialExample() throws IllegalArgumentException, IOException, CancelException, WalaException { + PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "tutorial-example.js"); + CallGraph CG = B.makeCallGraph(B.getOptions()); + CAstCallGraphUtil.AVOID_DUMP = false; + CAstCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); + // verifyGraphAssertions(CG, assertionsForDateProperty); + } + protected IVector>> computeIkIdToVns(PointerAnalysis pa) { // Created by reversing the points to mapping for local pointer keys. From 3a69d480383a1a87b049ef451568f3020621eb67 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 2 May 2013 10:49:57 -0700 Subject: [PATCH 170/187] javadoc --- .../com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index eeff153e5..c119e4768 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -84,6 +84,9 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J } } + /** + * create a CG builder for script. Note that the script at dir/name is loaded via the classloader, not from the filesystem. + */ public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { URL script = getURLforFile(dir, name); CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; From 9452bc563dc79c10e2fcc6dd03877be70e34ad7c Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 2 May 2013 10:50:20 -0700 Subject: [PATCH 171/187] add method to construct a class hierarchy for a set of JS files --- .../com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index 7f13debc8..1ce3abbf0 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -19,6 +19,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil; import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; @@ -107,6 +108,11 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra return makeLoaders(null); } + public static IClassHierarchy makeHierarchyForScripts(String... scriptFiles) throws IOException, ClassHierarchyException { + JavaScriptLoaderFactory loaders = makeLoaders(); + AnalysisScope scope = CAstCallGraphUtil.makeScope(scriptFiles, loaders, JavaScriptLoader.JS); + return makeHierarchy(scope, loaders); + } public static IClassHierarchy makeHierarchy(AnalysisScope scope, ClassLoaderFactory loaders) throws ClassHierarchyException { return ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); } From 21d392e2bd533b182f0b19d0ca3b7c0c3f6ff5f0 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 2 May 2013 10:50:42 -0700 Subject: [PATCH 172/187] example driver to print IR for all methods in a script --- .../ibm/wala/cast/js/rhino/test/PrintIRs.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java new file mode 100644 index 000000000..1df4ad646 --- /dev/null +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2008 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.js.rhino.test; + +import java.io.IOException; +import java.util.Collection; + +import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; +import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.loader.AstMethod; +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.ipa.callgraph.impl.Everywhere; +import com.ibm.wala.ipa.cha.ClassHierarchyException; +import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ssa.IR; +import com.ibm.wala.ssa.IRFactory; +import com.ibm.wala.ssa.SSAOptions; + +public class PrintIRs { + + /** + * prints the IR of each function in the script + * @throws IOException + * @throws ClassHierarchyException + */ + public static void printIRs(String filename) throws IOException, ClassHierarchyException { + JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); + IClassHierarchy cha = JSCallGraphUtil.makeHierarchyForScripts(filename); + IRFactory factory = AstIRFactory.makeDefaultFactory(); + SSAOptions options = new SSAOptions(); + for (IClass klass : cha) { + Collection allMethods = klass.getAllMethods(); + for (IMethod m : allMethods) { + IR ir = factory.makeIR(m, Everywhere.EVERYWHERE, options); + System.out.println(ir); + if (m instanceof AstMethod) { + System.out.println(((AstMethod)m).getSourcePosition()); + } + } + } + } + + /** + * + * @param args + * @throws IOException + * @throws ClassHierarchyException + */ + public static void main(String[] args) throws ClassHierarchyException, IOException { + printIRs(args[0]); + + } + +} From 68211df807436bc5841f8924d8c2b220613875c9 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 30 May 2013 10:56:44 -0700 Subject: [PATCH 173/187] remove unused dump() method --- .../com/ibm/wala/cast/js/html/CompositeFileMapping.java | 6 ------ .../com/ibm/wala/cast/js/html/DomLessSourceExtractor.java | 3 ++- .../source/com/ibm/wala/cast/js/html/EmptyFileMapping.java | 5 ----- .../source/com/ibm/wala/cast/js/html/FileMapping.java | 4 ---- .../com/ibm/wala/cast/js/html/NestedRangeMapping.java | 6 ------ .../source/com/ibm/wala/cast/js/html/RangeFileMapping.java | 5 ----- 6 files changed, 2 insertions(+), 27 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java index c66591983..e9d0b2343 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java @@ -42,12 +42,6 @@ public class CompositeFileMapping implements FileMapping { return null; } - @Override - public void dump(PrintStream ps) { - // TODO Auto-generated method stub - - } - public String toString() { return mappings.toString(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index fedeb48d4..900ff7668 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -252,6 +252,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { */ private File tempFile; + @Override public Set extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error { @@ -304,7 +305,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { Set res = domLessScopeGenerator.extractSources(entrypointUrl , htmlParser , urlResolver); MappedSourceModule entry = res.iterator().next(); System.out.println(entry); - entry.getMapping().dump(System.out); + System.out.println(entry.getMapping()); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java index 858b46bc1..b7f990962 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java @@ -21,9 +21,4 @@ public class EmptyFileMapping implements FileMapping { return null; } - @Override - public void dump(PrintStream ps) { - ps.println("empty mapping"); - } - } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java index c3998ee6f..3b15fd6ad 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java @@ -10,8 +10,6 @@ *******************************************************************************/ package com.ibm.wala.cast.js.html; -import java.io.PrintStream; - import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public interface FileMapping { @@ -22,6 +20,4 @@ public interface FileMapping { */ public abstract IncludedPosition getIncludedPosition(Position line); - public abstract void dump(PrintStream ps); - } \ No newline at end of file diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java index d5095c3a4..e0acb8f70 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java @@ -79,12 +79,6 @@ public class NestedRangeMapping implements FileMapping { } } - @Override - public void dump(PrintStream ps) { - // TODO Auto-generated method stub - - } - public String toString() { return range + "(" + innerMapping + ")"; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java index a6e8dfef5..21da01a9a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java @@ -130,10 +130,5 @@ public class RangeFileMapping implements FileMapping { } } - @Override - public void dump(PrintStream ps) { - // TODO Auto-generated method stub - - } } From 6e562ac27eca939cc8a6ae3343205c422e823314 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 30 May 2013 14:41:35 -0700 Subject: [PATCH 174/187] fix warnings --- .../com/ibm/wala/cast/js/html/CompositeFileMapping.java | 2 +- .../source/com/ibm/wala/cast/js/html/EmptyFileMapping.java | 2 -- .../source/com/ibm/wala/cast/js/html/NestedRangeMapping.java | 2 +- .../source/com/ibm/wala/cast/js/html/RangeFileMapping.java | 4 +++- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java index e9d0b2343..e49626ba9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java @@ -10,7 +10,6 @@ *******************************************************************************/ package com.ibm.wala.cast.js.html; -import java.io.PrintStream; import java.util.ArrayList; import java.util.List; @@ -42,6 +41,7 @@ public class CompositeFileMapping implements FileMapping { return null; } + @Override public String toString() { return mappings.toString(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java index b7f990962..eb6e6b888 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java @@ -10,8 +10,6 @@ *******************************************************************************/ package com.ibm.wala.cast.js.html; -import java.io.PrintStream; - import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public class EmptyFileMapping implements FileMapping { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java index e0acb8f70..f8d3c6811 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java @@ -12,7 +12,6 @@ package com.ibm.wala.cast.js.html; import java.io.IOException; import java.io.InputStream; -import java.io.PrintStream; import java.net.URL; import com.ibm.wala.cast.js.html.RangeFileMapping.Range; @@ -79,6 +78,7 @@ public class NestedRangeMapping implements FileMapping { } } + @Override public String toString() { return range + "(" + innerMapping + ")"; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java index 21da01a9a..525e5b6fa 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java @@ -12,7 +12,6 @@ package com.ibm.wala.cast.js.html; import java.io.IOException; import java.io.InputStream; -import java.io.PrintStream; import java.net.URL; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; @@ -58,6 +57,7 @@ public class RangeFileMapping implements FileMapping { return rangeEndingLine; } + @Override public String toString() { return "{"+rangeStart+"->"+rangeEnd+"}"; } @@ -74,6 +74,7 @@ public class RangeFileMapping implements FileMapping { includedURL = url; } + @Override public String toString() { return range + ":" + includePosition; } @@ -119,6 +120,7 @@ public class RangeFileMapping implements FileMapping { public Position getIncludePosition() { return includePosition; } + @Override public String toString() { return "[include:"+includePosition+"]"+super.toString(); } From 547f0d276a4cca9786737f6f396a0fb7b2d8977b Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 30 May 2013 14:41:49 -0700 Subject: [PATCH 175/187] more sample code --- .../ibm/wala/cast/js/rhino/test/PrintIRs.java | 98 ++++++++++++++++--- 1 file changed, 83 insertions(+), 15 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java index 1df4ad646..5b9c2a656 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java @@ -10,54 +10,122 @@ *******************************************************************************/ package com.ibm.wala.cast.js.rhino.test; +import java.io.File; import java.io.IOException; -import java.util.Collection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Collections; +import java.util.Set; +import com.ibm.wala.cast.ipa.callgraph.CAstAnalysisScope; import com.ibm.wala.cast.ir.ssa.AstIRFactory; +import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; +import com.ibm.wala.cast.js.html.MappedSourceModule; +import com.ibm.wala.cast.js.html.WebPageLoaderFactory; +import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; +import com.ibm.wala.cast.js.loader.JavaScriptLoader; +import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; +import com.ibm.wala.cast.js.util.Util; import com.ibm.wala.cast.loader.AstMethod; +import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.ipa.callgraph.impl.Everywhere; +import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.IRFactory; import com.ibm.wala.ssa.SSAOptions; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.Predicate; +import com.ibm.wala.util.WalaException; +import com.ibm.wala.util.collections.Pair; public class PrintIRs { /** - * prints the IR of each function in the script - * @throws IOException - * @throws ClassHierarchyException + * prints the IR of each function in the script + * + * @throws IOException + * @throws ClassHierarchyException */ - public static void printIRs(String filename) throws IOException, ClassHierarchyException { + public static void printIRsForJS(String filename) throws IOException, ClassHierarchyException { + // use Rhino to parse JavaScript JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); + // build a class hierarchy, for access to code info IClassHierarchy cha = JSCallGraphUtil.makeHierarchyForScripts(filename); + printIRsForCHA(cha, new Predicate() { + + @Override + public boolean test(String t) { + return t.startsWith("Lprologue.js"); + } + }); + } + + protected static void printIRsForCHA(IClassHierarchy cha, Predicate exclude) { + // for constructing IRs IRFactory factory = AstIRFactory.makeDefaultFactory(); - SSAOptions options = new SSAOptions(); for (IClass klass : cha) { - Collection allMethods = klass.getAllMethods(); - for (IMethod m : allMethods) { - IR ir = factory.makeIR(m, Everywhere.EVERYWHERE, options); + // ignore models of built-in JavaScript methods + String name = klass.getName().toString(); + if (exclude.test(name)) continue; + // get the IMethod representing the code + IMethod m = klass.getMethod(AstMethodReference.fnSelector); + if (m != null) { + IR ir = factory.makeIR(m, Everywhere.EVERYWHERE, new SSAOptions()); System.out.println(ir); if (m instanceof AstMethod) { - System.out.println(((AstMethod)m).getSourcePosition()); + AstMethod astMethod = (AstMethod) m; + System.out.println(astMethod.getSourcePosition()); } + System.out.println("===================================================\n"); } } } - + + private static void printIRsForHTML(String filename) throws IllegalArgumentException, MalformedURLException, IOException, + CancelException, WalaException, Error { + // use Rhino to parse JavaScript + JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); + // add model for DOM APIs + JavaScriptLoader.addBootstrapFile(WebUtil.preamble); + URL url = (new File(filename)).toURI().toURL(); + Pair, File> p = WebUtil.extractScriptFromHTML(url); + SourceModule[] scripts = p.fst.toArray(new SourceModule[] {}); + JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(JSCallGraphUtil.getTranslatorFactory()); + CAstAnalysisScope scope = new CAstAnalysisScope(scripts, loaders, Collections.singleton(JavaScriptLoader.JS)); + IClassHierarchy cha = ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); + Util.checkForFrontEndErrors(cha); + printIRsForCHA(cha, new Predicate() { + + @Override + public boolean test(String t) { + return t.startsWith("Lprologue.js") || t.startsWith("Lpreamble.js"); + } + }); + } + /** * * @param args - * @throws IOException - * @throws ClassHierarchyException + * @throws IOException + * @throws WalaException + * @throws CancelException + * @throws IllegalArgumentException + * @throws Error */ - public static void main(String[] args) throws ClassHierarchyException, IOException { - printIRs(args[0]); + public static void main(String[] args) throws IOException, IllegalArgumentException, CancelException, WalaException, Error { + String filename = args[0]; + if (filename.endsWith(".js")) { + printIRsForJS(filename); + } else if (filename.endsWith(".html")) { + printIRsForHTML(filename); + } } From e41dc42276c421a36e5b817b4f2cf45213b0be94 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 30 May 2013 14:42:03 -0700 Subject: [PATCH 176/187] javadoc --- .../com/ibm/wala/cast/js/html/IncludedPosition.java | 9 +++++++++ .../source/com/ibm/wala/cast/js/html/SourceRegion.java | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java index 53732d407..80ce86ee9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java @@ -12,8 +12,17 @@ package com.ibm.wala.cast.js.html; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; +/** + * A {@link Position} for source code that has been included in some enclosing + * file, e.g., JavaScript code included in an HTML file via a script node. + */ public interface IncludedPosition extends Position { + /** + * get the position of the containing script within the enclosing file. E.g., + * for a position in JavaScript code included in an HTML file, returns the + * position of the relevant <script> tag in the HTML + */ Position getIncludePosition(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java index 6e8be4f8c..408d3e04d 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java @@ -15,9 +15,18 @@ import java.net.URL; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; +/** + * Represents a region of source code, with source locations. Regions can be + * added to other {@link SourceRegion}s, with nested source location information + * maintained. + */ public class SourceRegion { private final StringBuilder source = new StringBuilder(); + + /** + * source location information + */ private FileMapping fileMapping; private int currentLine = 1; From 918f887d3a4318f5800e5a3e3c387558c18b338a Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 10 Jun 2013 14:24:03 -0700 Subject: [PATCH 177/187] update copyright header --- .../harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java index 5b9c2a656..df4f6c61a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/rhino/test/PrintIRs.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 IBM Corporation. + * 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 From 05a9961108fa3fa2ce3a5c96238a85aef752b8ea Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 10 Jun 2013 14:37:19 -0700 Subject: [PATCH 178/187] add missing @Override annotations; no semantic change --- .../cast/java/polyglot/test/Activator.java | 2 + .../wala/cast/java/test/PolyglotJLexTest.java | 1 + .../cast/java/test/PolyglotJavaIRTest.java | 1 + .../java/test/PolyglotSyncDuplicatorTest.java | 4 + .../translator/polyglot/AscriptionGoal.java | 1 + .../cast/java/translator/polyglot/IRGoal.java | 1 + .../polyglot/JavaIRTranslatorExtension.java | 4 + .../translator/polyglot/ModuleSource.java | 3 + .../polyglot/PolyglotClassLoaderFactory.java | 1 + .../polyglot/PolyglotIdentityMapper.java | 3 + .../polyglot/PolyglotJava2CAstTranslator.java | 184 ++++++++++ .../PolyglotJavaSourceAnalysisEngine.java | 1 + .../polyglot/PolyglotSourceLoaderImpl.java | 1 + .../PolyglotSourceModuleTranslator.java | 1 + .../polyglot/PolyglotTypeDictionary.java | 5 + .../PolyglotUnwoundIRTranslatorExtension.java | 4 +- .../src/AnonymousClass.java | 15 +- .../src/FunkySupers.java | 3 +- .../src/Inheritance1.java | 2 + .../src/InnerClassLexicalReads.java | 3 +- .../src/InterfaceTest1.java | 1 + .../src/MiniaturSliceBug.java | 4 + .../src/SimpleCalls.java | 3 +- .../src/Thread1.java | 1 + .../src/foo/SimpleNames.java | 3 +- .../world/ConstructorsAndInitializers.java | 3 +- .../src/foo/bar/hello/world/InnerClasses.java | 9 +- .../foo/bar/hello/world/MethodMadness.java | 3 +- .../AnonGeneNullarySimple.java | 3 +- .../javaonepointfive/AnonymousGenerics.java | 12 +- .../src/javaonepointfive/Cocovariant.java | 2 + .../CustomGenericsAndFields.java | 9 +- .../GenericMemberClasses.java | 9 +- .../MoreOverriddenGenerics.java | 6 +- .../javaonepointfive/NotSoSimpleEnums.java | 12 +- .../OverridesOnePointFour.java | 3 +- .../javaonepointfive/VarargsCovariant.java | 3 +- .../javaonepointfive/VarargsOverriding.java | 3 +- .../com/ibm/wala/cast/java/test/IRTests.java | 3 + .../com/ibm/wala/cast/java/test/JLexTest.java | 2 + .../ibm/wala/cast/java/test/JavaIRTests.java | 12 + .../ibm/wala/cast/java/test/TestPlugin.java | 6 +- .../ibm/wala/cast/java/JavaSourcePlugin.java | 6 +- .../typeInference/AstJavaTypeInference.java | 9 + .../java/client/JavaSourceAnalysisEngine.java | 6 + .../ast/SynchronizedBlockDuplicator.java | 8 + ...AstJavaSSAPropagationCallGraphBuilder.java | 15 + .../JavaScopeMappingInstanceKeys.java | 1 + .../callgraph/JavaSourceAnalysisScope.java | 1 + .../cast/java/ipa/modref/AstJavaModRef.java | 5 + .../cast/java/ipa/slicer/AstJavaSlicer.java | 4 + .../java/loader/JavaSourceLoaderImpl.java | 44 +++ .../AstJavaAbstractInstructionVisitor.java | 2 + .../java/ssa/AstJavaInvokeInstruction.java | 3 + .../ssa/AstJavaNewEnclosingInstruction.java | 5 + .../java/ssa/EnclosingObjectReference.java | 10 + .../translator/JavaCAst2IRTranslator.java | 26 ++ .../java/translator/JavaProcedureEntity.java | 1 + .../cast/java/types/JavaPrimitiveTypeMap.java | 2 + .../ibm/wala/cast/java/types/JavaType.java | 1 + .../nu_validator/NuValidatorHtmlParser.java | 20 + .../test/TestAjaxsltCallGraphShapeRhino.java | 1 + .../js/test/TestArgumentSensitivityRhino.java | 3 +- .../TestCorrelatedPairExtractionRhino.java | 6 +- .../js/test/TestForInBodyExtractionRhino.java | 3 +- .../cast/js/test/TestForInLoopHackRhino.java | 3 +- .../cast/js/test/TestJQueryExamplesRhino.java | 3 +- .../TestMediawikiCallGraphShapeRhino.java | 1 + .../wala/cast/js/test/TestRhinoSourceMap.java | 1 - .../test/TestSimpleCallGraphShapeRhino.java | 1 + .../TestSimplePageCallGraphShapeRhino.java | 9 +- .../js/translator/CAstRhinoTranslator.java | 3 +- .../CAstRhinoTranslatorFactory.java | 3 +- .../js/translator/RhinoToAstTranslator.java | 19 + .../com/ibm/wala/js/rhino/Activator.java | 6 +- .../com/ibm/wala/cast/js/test/CAstDumper.java | 3 +- .../cast/js/test/TestJSCallGraphShape.java | 1 + .../js/test/TestSimpleCallGraphShape.java | 5 + .../js/test/TestSimplePageCallGraphShape.java | 2 + .../ibm/wala/cast/js/JavaScriptPlugin.java | 6 +- .../typeInference/JSTypeInference.java | 10 + .../fieldbased/flowgraph/FlowGraph.java | 1 + .../vertices/AbstractVertexVisitor.java | 24 +- .../ibm/wala/cast/js/cfg/JSInducedCFG.java | 16 + .../js/client/JavaScriptAnalysisEngine.java | 6 + .../cast/js/html/DomLessSourceExtractor.java | 4 + .../cast/js/html/IdentityUrlResolver.java | 2 + .../cast/js/html/MappedSourceFileModule.java | 1 + .../ibm/wala/cast/js/html/UnicodeReader.java | 2 + .../com/ibm/wala/cast/js/html/WebUtil.java | 1 + .../js/html/jericho/JerichoHtmlParser.java | 3 +- .../wala/cast/js/html/jericho/JerichoTag.java | 15 +- .../ipa/callgraph/ArgumentSpecialization.java | 8 + .../js/ipa/callgraph/GlobalObjectKey.java | 2 + .../cast/js/ipa/callgraph/JSCFABuilder.java | 1 + .../cast/js/ipa/callgraph/JSCallGraph.java | 4 + .../JSSSAPropagationCallGraphBuilder.java | 42 +++ .../callgraph/JSSyntheticParameterKey.java | 3 + .../JavaScriptConstructTargetSelector.java | 2 + .../JavaScriptConstructorInstanceKeys.java | 5 + .../ipa/callgraph/JavaScriptEntryPoints.java | 1 + ...avaScriptFunctionApplyContextSelector.java | 3 + ...vaScriptFunctionDotCallTargetSelector.java | 1 + .../JavaScriptScopeMappingInstanceKeys.java | 1 + .../ipa/callgraph/LoadFileTargetSelector.java | 1 + .../ObjectSensitivityContextSelector.java | 2 + .../PropertyNameContextSelector.java | 9 +- .../js/ipa/callgraph/SelectiveCPAContext.java | 1 + .../ipa/callgraph/TransitivePrototypeKey.java | 3 + .../correlations/CorrelationFinder.java | 1 + .../extraction/ClosureExtractor.java | 6 +- .../CorrelatedPairExtractorFactory.java | 2 +- .../extraction/ExtractedFunction.java | 45 ++- .../correlations/extraction/NodePos.java | 3 +- .../JavaScriptSummarizedFunction.java | 2 + .../js/ipa/summaries/JavaScriptSummary.java | 2 + .../cast/js/loader/JSCallSiteReference.java | 3 + .../wala/cast/js/loader/JavaScriptLoader.java | 119 ++++++ .../js/loader/JavaScriptLoaderFactory.java | 2 + .../js/ssa/JSAbstractInstructionVisitor.java | 7 + .../cast/js/ssa/JavaScriptCheckReference.java | 3 + .../cast/js/ssa/JavaScriptInstanceOf.java | 5 + .../wala/cast/js/ssa/JavaScriptInvoke.java | 7 + .../cast/js/ssa/JavaScriptPropertyRead.java | 4 + .../cast/js/ssa/JavaScriptPropertyWrite.java | 5 + .../js/ssa/JavaScriptTypeOfInstruction.java | 4 + .../cast/js/ssa/JavaScriptWithRegion.java | 2 + .../cast/js/translator/JSAstTranslator.java | 26 ++ ...aScriptLoopUnwindingTranslatorFactory.java | 4 +- .../JavaScriptTranslatorToCAst.java | 15 + .../js/translator/PropertyReadExpander.java | 13 + .../cast/js/translator/RangePosition.java | 9 + .../com/ibm/wala/cast/js/vis/JsPaPanel.java | 3 +- .../ibm/wala/cast/test/TestCAstPattern.java | 1 + .../typeInference/AstTypeInference.java | 10 + .../callgraph/ArgumentInstanceContext.java | 1 + .../wala/cast/ipa/callgraph/AstCallGraph.java | 4 + ...ntextInsensitiveSSAContextInterpreter.java | 2 + .../ipa/callgraph/AstGlobalPointerKey.java | 3 + .../AstSSAPropagationCallGraphBuilder.java | 75 ++++ .../cast/ipa/callgraph/CAstAnalysisScope.java | 10 + .../ipa/callgraph/CrossLanguageCallGraph.java | 8 + .../CrossLanguageClassTargetSelector.java | 1 + .../CrossLanguageContextSelector.java | 2 + .../callgraph/CrossLanguageInstanceKeys.java | 5 + .../CrossLanguageMethodTargetSelector.java | 1 + ...anguageSSAPropagationCallGraphBuilder.java | 7 + .../callgraph/DelegatingAstPointerKeys.java | 10 + .../MiscellaneousHacksContextSelector.java | 2 + .../callgraph/ObjectPropertyCatalogKey.java | 3 + .../callgraph/ReflectedFieldPointerKey.java | 7 + .../callgraph/ScopeMappingInstanceKeys.java | 11 + .../cast/ipa/callgraph/ScriptEntryPoints.java | 5 + .../StandardFunctionTargetSelector.java | 1 + .../ipa/cha/CrossLanguageClassHierarchy.java | 30 ++ .../wala/cast/ipa/lexical/LexicalModRef.java | 2 + .../ibm/wala/cast/ipa/modref/AstModRef.java | 19 + .../ibm/wala/cast/ir/cfg/AstInducedCFG.java | 20 + .../ibm/wala/cast/ir/cfg/DelegatingCFG.java | 13 + .../cast/ir/ssa/AbstractLexicalInvoke.java | 6 + .../cast/ir/ssa/AbstractReflectiveGet.java | 6 + .../cast/ir/ssa/AbstractReflectivePut.java | 4 + .../wala/cast/ir/ssa/AssignInstruction.java | 3 + .../ir/ssa/AstAbstractInstructionVisitor.java | 9 + .../cast/ir/ssa/AstAssertInstruction.java | 8 + .../ibm/wala/cast/ir/ssa/AstConstants.java | 2 + .../wala/cast/ir/ssa/AstEchoInstruction.java | 10 + .../ibm/wala/cast/ir/ssa/AstGlobalRead.java | 5 + .../ibm/wala/cast/ir/ssa/AstGlobalWrite.java | 5 + .../ibm/wala/cast/ir/ssa/AstIRFactory.java | 6 + .../cast/ir/ssa/AstIsDefinedInstruction.java | 12 + .../wala/cast/ir/ssa/AstLexicalAccess.java | 6 + .../ibm/wala/cast/ir/ssa/AstLexicalRead.java | 7 + .../ibm/wala/cast/ir/ssa/AstLexicalWrite.java | 7 + .../ir/ssa/EachElementGetInstruction.java | 4 + .../ir/ssa/EachElementHasNextInstruction.java | 4 + ...xedParametersLexicalInvokeInstruction.java | 3 + .../MultiReturnValueInvokeInstruction.java | 2 + .../ibm/wala/cast/ir/ssa/SSAConversion.java | 32 ++ .../cast/ir/ssa/analysis/LiveAnalysis.java | 19 + .../ir/translator/AbstractClassEntity.java | 5 + .../ir/translator/AbstractCodeEntity.java | 5 + .../ir/translator/AbstractDataEntity.java | 7 + .../cast/ir/translator/AbstractEntity.java | 5 + .../ir/translator/AbstractFieldEntity.java | 5 + .../ir/translator/AbstractGlobalEntity.java | 5 + .../ir/translator/AbstractScriptEntity.java | 7 + .../cast/ir/translator/AstTranslator.java | 342 ++++++++++++++++++ .../ir/translator/ExposedNamesCollector.java | 2 + .../cast/ir/translator/TranslatorToCAst.java | 14 + .../com/ibm/wala/cast/loader/AstClass.java | 26 ++ .../cast/loader/AstDynamicPropertyClass.java | 14 + .../com/ibm/wala/cast/loader/AstField.java | 13 + .../wala/cast/loader/AstFunctionClass.java | 27 ++ .../com/ibm/wala/cast/loader/AstMethod.java | 25 ++ .../wala/cast/loader/CAstAbstractLoader.java | 13 + .../cast/loader/CAstAbstractModuleLoader.java | 1 + .../cast/loader/SingleClassLoaderFactory.java | 1 + .../com/ibm/wala/cast/plugin/AstPlugin.java | 6 +- .../com/ibm/wala/cast/tree/AstPlugin.java | 6 +- .../wala/cast/tree/CAstControlFlowMap.java | 7 + .../wala/cast/tree/CAstMemberReference.java | 5 + .../com/ibm/wala/cast/tree/CAstQualifier.java | 2 + .../com/ibm/wala/cast/tree/CAstSymbol.java | 1 + .../java/com/ibm/wala/cast/tree/CAstType.java | 2 + .../wala/cast/tree/CAstTypeDictionary.java | 1 + .../tree/impl/AbstractSourcePosition.java | 4 + .../tree/impl/CAstControlFlowRecorder.java | 8 + .../com/ibm/wala/cast/tree/impl/CAstImpl.java | 30 ++ .../tree/impl/CAstNodeTypeMapRecorder.java | 2 + .../ibm/wala/cast/tree/impl/CAstOperator.java | 5 + .../tree/impl/CAstSourcePositionRecorder.java | 29 +- .../wala/cast/tree/impl/CAstSymbolImpl.java | 1 + .../cast/tree/impl/CAstSymbolImplBase.java | 6 + .../tree/impl/CAstTypeDictionaryImpl.java | 3 + .../wala/cast/tree/impl/CAstValueImpl.java | 6 + .../wala/cast/tree/impl/DelegatingEntity.java | 16 + .../cast/tree/impl/LineNumberPosition.java | 9 + .../com/ibm/wala/cast/tree/pattern/Alt.java | 1 + .../ibm/wala/cast/tree/pattern/AnyNode.java | 3 +- .../wala/cast/tree/pattern/NodeOfKind.java | 3 +- .../cast/tree/rewrite/AstLoopUnwinder.java | 8 + .../cast/tree/rewrite/CAstBasicRewriter.java | 5 + .../wala/cast/tree/rewrite/CAstCloner.java | 1 + .../wala/cast/tree/rewrite/CAstRewriter.java | 17 + .../tree/visit/DelegatingCAstVisitor.java | 129 +++++++ .../com/ibm/wala/cast/util/CAstFunctions.java | 6 + .../com/ibm/wala/cast/util/CAstPattern.java | 3 + .../com/ibm/wala/cast/util/SourceBuffer.java | 25 +- .../src/demandpa/ArraySet.java | 1 + .../src/demandpa/DummyHashMap.java | 2 + .../src/demandpa/DummyLinkedList.java | 1 + .../src/multiTypes/Foo.java | 1 + .../src/recurse/NList.java | 13 + .../src/reflection/Reflect5.java | 3 +- .../src/reflection/Reflect6.java | 3 +- com.ibm.wala.core.testdata/src/slice/B.java | 1 + .../core/tests/basic/FloydWarshallTest.java | 10 + .../core/tests/basic/GraphDataflowTest.java | 10 + .../wala/core/tests/basic/PathFinderTest.java | 1 + .../core/tests/callGraph/CallGraphTest.java | 18 + .../tests/callGraph/PiNodeCallGraphTest.java | 1 - .../ContextInsensitiveReachingDefs.java | 5 + .../ContextSensitiveReachingDefs.java | 15 + .../dataflow/IntraprocReachingDefs.java | 5 + .../wala/examples/drivers/PDFCallGraph.java | 1 + .../com/ibm/wala/examples/drivers/PDFSDG.java | 2 + .../ibm/wala/examples/drivers/PDFSlice.java | 2 + .../examples/drivers/PDFTypeHierarchy.java | 1 + .../analysis/pointers/BasicHeapGraph.java | 43 +++ .../ibm/wala/analysis/pointers/HeapGraph.java | 3 + .../ClassFactoryContextInterpreter.java | 10 + .../ClassFactoryContextSelector.java | 2 + .../ClassNewInstanceContextInterpreter.java | 10 + .../ClassNewInstanceContextSelector.java | 2 + .../analysis/reflection/CloneInterpreter.java | 10 + .../reflection/FactoryBypassInterpreter.java | 13 + .../reflection/FactoryContextSelector.java | 2 + .../reflection/GetClassContextInterpeter.java | 10 + .../reflection/GetClassContextSelector.java | 2 + .../IllegalArgumentExceptionContext.java | 1 + .../JavaLangClassContextInterpreter.java | 10 + .../JavaLangClassContextSelector.java | 2 + .../analysis/reflection/JavaTypeContext.java | 1 + .../ReflectionContextInterpreter.java | 10 + .../reflection/ReflectionContextSelector.java | 2 + .../ReflectiveInvocationInterpreter.java | 10 + .../ReflectiveInvocationSelector.java | 2 + .../stackMachine/AbstractIntStackMachine.java | 10 + .../analysis/typeInference/TypeInference.java | 5 + .../analysis/typeInference/TypeVariable.java | 1 + .../src/com/ibm/wala/cfg/AbstractCFG.java | 30 ++ .../src/com/ibm/wala/cfg/InducedCFG.java | 11 + .../src/com/ibm/wala/cfg/ShrikeCFG.java | 11 + .../wala/cfg/cdg/ControlDependenceGraph.java | 12 + .../AbstractNestedJarFileModule.java | 11 + .../wala/classLoader/AbstractURLModule.java | 6 + .../com/ibm/wala/classLoader/ArrayClass.java | 28 ++ .../ibm/wala/classLoader/BytecodeClass.java | 21 ++ .../ibm/wala/classLoader/ClassFileModule.java | 3 + .../classLoader/ClassLoaderFactoryImpl.java | 1 + .../ibm/wala/classLoader/ClassLoaderImpl.java | 15 + .../ibm/wala/classLoader/CompoundModule.java | 10 + .../wala/classLoader/DirectoryTreeModule.java | 1 + .../com/ibm/wala/classLoader/FieldImpl.java | 12 + .../com/ibm/wala/classLoader/FileModule.java | 5 + .../src/com/ibm/wala/classLoader/IField.java | 1 + .../com/ibm/wala/classLoader/JVMClass.java | 6 + .../ibm/wala/classLoader/JarFileEntry.java | 7 + .../ibm/wala/classLoader/JarFileModule.java | 1 + .../ibm/wala/classLoader/JavaLanguage.java | 60 +++ .../ibm/wala/classLoader/LanguageImpl.java | 3 + .../ibm/wala/classLoader/ShrikeBTMethod.java | 25 ++ .../ibm/wala/classLoader/ShrikeCTMethod.java | 6 + .../com/ibm/wala/classLoader/ShrikeClass.java | 1 + .../ibm/wala/classLoader/ShrikeIRFactory.java | 2 + .../wala/classLoader/SourceFileModule.java | 5 + .../ibm/wala/classLoader/SourceURLModule.java | 3 + .../ibm/wala/classLoader/SyntheticClass.java | 11 + .../ibm/wala/classLoader/SyntheticMethod.java | 28 ++ .../wala/client/AbstractAnalysisEngine.java | 6 + .../wala/client/AbstractEngineStopwatch.java | 4 + .../dataflow/IFDS/BackwardsSupergraph.java | 41 +++ .../wala/dataflow/IFDS/ICFGSupergraph.java | 39 ++ .../dataflow/IFDS/IdentityFlowFunction.java | 2 + .../dataflow/IFDS/IdentityFlowFunctions.java | 5 + .../wala/dataflow/IFDS/KillEverything.java | 1 + .../PartiallyBalancedTabulationProblem.java | 1 + .../dataflow/IFDS/SingletonFlowFunction.java | 2 + .../wala/dataflow/IFDS/TabulationSolver.java | 17 + .../wala/dataflow/IFDS/UnorderedDomain.java | 1 + .../dataflow/IFDS/VectorGenFlowFunction.java | 2 + .../dataflow/IFDS/VectorKillFlowFunction.java | 2 + .../demandpa/alg/AbstractDemandPointsTo.java | 3 + .../alg/ContextSensitiveStateMachine.java | 22 ++ .../alg/DemandRefinementPointsTo.java | 24 ++ .../wala/demandpa/alg/IntraProcFilter.java | 3 + .../demandpa/alg/SimpleDemandPointsTo.java | 1 + .../demandpa/alg/ThisFilteringHeapModel.java | 14 + .../AbstractRefinementPolicy.java | 5 + .../refinepolicy/AlwaysRefineCGPolicy.java | 2 + .../AlwaysRefineFieldsPolicy.java | 2 + .../DelegatingFieldRefinePolicy.java | 2 + .../refinepolicy/ManualCGRefinePolicy.java | 2 + .../alg/refinepolicy/ManualFieldPolicy.java | 2 + .../refinepolicy/ManualRefinementPolicy.java | 1 + .../alg/refinepolicy/NeverRefineCGPolicy.java | 2 + .../refinepolicy/NeverRefineFieldsPolicy.java | 2 + .../SinglePassRefinementPolicy.java | 1 + .../TunedFieldRefinementPolicy.java | 2 + .../refinepolicy/TunedRefinementPolicy.java | 1 + .../alg/statemachine/DummyStateMachine.java | 3 + .../flowgraph/AbstractDemandFlowGraph.java | 4 + .../demandpa/flowgraph/AbstractFlowGraph.java | 12 + .../flowgraph/AbstractFlowLabelVisitor.java | 16 + .../demandpa/flowgraph/AssignBarLabel.java | 4 + .../flowgraph/AssignGlobalBarLabel.java | 3 + .../demandpa/flowgraph/AssignGlobalLabel.java | 3 + .../wala/demandpa/flowgraph/AssignLabel.java | 4 + .../flowgraph/DemandPointerFlowGraph.java | 1 + .../flowgraph/DemandValueFlowGraph.java | 1 + .../demandpa/flowgraph/GetFieldBarLabel.java | 3 + .../demandpa/flowgraph/GetFieldLabel.java | 3 + .../demandpa/flowgraph/MatchBarLabel.java | 3 + .../wala/demandpa/flowgraph/MatchLabel.java | 3 + .../wala/demandpa/flowgraph/NewBarLabel.java | 3 + .../ibm/wala/demandpa/flowgraph/NewLabel.java | 3 + .../demandpa/flowgraph/ParamBarLabel.java | 3 + .../wala/demandpa/flowgraph/ParamLabel.java | 3 + .../demandpa/flowgraph/PutFieldBarLabel.java | 3 + .../demandpa/flowgraph/PutFieldLabel.java | 3 + .../demandpa/flowgraph/ReturnBarLabel.java | 3 + .../wala/demandpa/flowgraph/ReturnLabel.java | 3 + .../ibm/wala/demandpa/util/ArrayContents.java | 12 + .../demandpa/util/PABasedMemoryAccessMap.java | 7 + .../util/PointerParamValueNumIterator.java | 3 + .../demandpa/util/SimpleMemoryAccessMap.java | 7 + .../ibm/wala/escape/FILiveObjectAnalysis.java | 3 + .../wala/escape/LocalLiveRangeAnalysis.java | 1 + .../ibm/wala/escape/TrivialMethodEscape.java | 2 + .../wala/ipa/callgraph/DelegatingContext.java | 1 + .../wala/ipa/callgraph/cha/CHACallGraph.java | 24 ++ ...ntextInsensitiveCHAContextInterpreter.java | 2 + .../callgraph/impl/AbstractRootMethod.java | 9 + .../ipa/callgraph/impl/BasicCallGraph.java | 8 + .../ClassHierarchyClassTargetSelector.java | 1 + .../ClassHierarchyMethodTargetSelector.java | 1 + .../callgraph/impl/ComposedEntrypoints.java | 1 + .../impl/ContextInsensitiveSelector.java | 2 + .../impl/DefaultContextSelector.java | 2 + .../impl/DelegatingContextSelector.java | 2 + .../wala/ipa/callgraph/impl/Everywhere.java | 1 + .../ipa/callgraph/impl/ExplicitCallGraph.java | 22 ++ .../ipa/callgraph/impl/FakeRootClass.java | 29 ++ .../ipa/callgraph/impl/PartialCallGraph.java | 17 + .../com/ibm/wala/ipa/callgraph/impl/Util.java | 5 + .../propagation/AbstractFieldPointerKey.java | 1 + .../propagation/AbstractPointerAnalysis.java | 3 + .../propagation/AbstractPointsToSolver.java | 1 + .../propagation/AbstractTypeInNode.java | 2 + .../callgraph/propagation/AllocationSite.java | 4 + .../propagation/AllocationSiteInNode.java | 1 + .../AllocationSiteInNodeFactory.java | 5 + .../propagation/ArrayContentsKey.java | 1 + .../callgraph/propagation/AssignOperator.java | 1 + .../propagation/ClassBasedInstanceKeys.java | 5 + .../propagation/CloneContextSelector.java | 2 + .../propagation/ConcreteTypeKey.java | 4 + .../callgraph/propagation/ConstantKey.java | 2 + .../propagation/FilteredPointerKey.java | 13 + .../InstanceFieldKeyWithFilter.java | 1 + .../LocalPointerKeyWithFilter.java | 1 + .../propagation/PointerAnalysisImpl.java | 19 + .../propagation/PointerKeyComparator.java | 1 + .../callgraph/propagation/PointsToMap.java | 1 + .../propagation/PointsToSetVariable.java | 1 + .../PropagationCallGraphBuilder.java | 16 + .../propagation/PropagationGraph.java | 34 ++ .../propagation/PropagationSystem.java | 1 + .../propagation/ReceiverInstanceContext.java | 1 + .../ReceiverTypeContextSelector.java | 2 + .../propagation/ReturnValueKeyWithFilter.java | 1 + .../SSAPropagationCallGraphBuilder.java | 8 + .../SmushedAllocationSiteInNode.java | 3 + .../SmushedAllocationSiteInstanceKeys.java | 5 + .../propagation/StringConstantCharArray.java | 2 + .../TargetMethodContextSelector.java | 3 + .../propagation/cfa/CallStringContext.java | 1 + .../cfa/CallStringContextSelector.java | 3 + .../propagation/cfa/CallerContext.java | 1 + .../cfa/ContextInsensitiveSSAInterpreter.java | 4 + .../cfa/DefaultPointerKeyFactory.java | 7 + .../cfa/DefaultSSAInterpreter.java | 4 + .../cfa/DelegatingSSAContextInterpreter.java | 4 + .../cfa/OneLevelSiteContextSelector.java | 2 + .../propagation/cfa/ZeroXInstanceKeys.java | 5 + .../propagation/rta/BasicRTABuilder.java | 1 + .../rta/ContextInsensitiveRTAInterpreter.java | 5 +- .../rta/DefaultRTAInterpreter.java | 6 + .../rta/DelegatingRTAContextInterpreter.java | 6 + .../propagation/rta/TypeBasedHeapModel.java | 14 + .../rta/TypeBasedPointerAnalysis.java | 5 + .../ipa/cfg/AbstractInterproceduralCFG.java | 26 ++ .../ibm/wala/ipa/cfg/BasicBlockInContext.java | 12 + .../ibm/wala/ipa/cfg/ExceptionPrunedCFG.java | 2 + .../src/com/ibm/wala/ipa/cfg/PrunedCFG.java | 39 ++ .../com/ibm/wala/ipa/cha/ClassHierarchy.java | 31 ++ .../modref/DelegatingExtendedHeapModel.java | 15 + .../src/com/ibm/wala/ipa/modref/GenReach.java | 5 + .../src/com/ibm/wala/ipa/modref/ModRef.java | 2 + .../ipa/slicer/ExceptionalReturnCaller.java | 1 + .../ibm/wala/ipa/slicer/HeapReachingDefs.java | 19 + .../wala/ipa/slicer/NormalReturnCaller.java | 1 + .../src/com/ibm/wala/ipa/slicer/PDG.java | 24 ++ .../com/ibm/wala/ipa/slicer/ParamCallee.java | 1 + .../com/ibm/wala/ipa/slicer/ParamCaller.java | 1 + .../ipa/slicer/ReachabilityFunctions.java | 6 + .../src/com/ibm/wala/ipa/slicer/SDG.java | 16 + .../ibm/wala/ipa/slicer/SDGSupergraph.java | 39 ++ .../ibm/wala/ipa/slicer/SliceFunctions.java | 6 + .../src/com/ibm/wala/ipa/slicer/Slicer.java | 6 + .../com/ibm/wala/ipa/slicer/thin/CISDG.java | 26 ++ .../summaries/BypassClassTargetSelector.java | 1 + .../summaries/BypassMethodTargetSelector.java | 1 + .../ipa/summaries/BypassSyntheticClass.java | 18 + .../summaries/BypassSyntheticClassLoader.java | 15 + .../ipa/summaries/SyntheticIRFactory.java | 2 + .../com/ibm/wala/ssa/CompoundPiPolicy.java | 2 + .../src/com/ibm/wala/ssa/ConstantValue.java | 2 + .../src/com/ibm/wala/ssa/DefUse.java | 3 + .../com/ibm/wala/ssa/DefaultIRFactory.java | 2 + .../src/com/ibm/wala/ssa/IR.java | 12 + .../src/com/ibm/wala/ssa/ISSABasicBlock.java | 3 + .../com/ibm/wala/ssa/InstanceOfPiPolicy.java | 2 + .../com/ibm/wala/ssa/NullTestPiPolicy.java | 2 + .../src/com/ibm/wala/ssa/PhiValue.java | 2 + .../src/com/ibm/wala/ssa/SSABuilder.java | 4 + .../src/com/ibm/wala/ssa/SSACFG.java | 60 +++ .../src/com/ibm/wala/ssa/SSAInstruction.java | 23 ++ .../ibm/wala/ssa/SSASwitchInstruction.java | 2 + .../ibm/wala/ssa/ShrikeIndirectionData.java | 5 + .../analysis/ExplodedControlFlowGraph.java | 49 +++ .../ibm/wala/util/scope/JUnitEntryPoints.java | 2 + .../com/ibm/wala/util/warnings/Warning.java | 1 + .../src/com/ibm/wala/viz/PDFViewUtil.java | 2 + .../src/com/ibm/wala/viz/viewer/CgPanel.java | 3 + .../src/com/ibm/wala/viz/viewer/ChaPanel.java | 3 + .../wala/viz/viewer/DualTreeCellRenderer.java | 1 + .../wala/viz/viewer/IrAndSourceViewer.java | 1 + .../src/com/ibm/wala/viz/viewer/IrViewer.java | 1 + .../src/com/ibm/wala/viz/viewer/PaPanel.java | 3 + .../wala/cast/java/jdt/test/Activator.java | 2 + .../java/test/TypeInferenceAssertion.java | 1 + .../jdt/FakeExceptionTypeBinding.java | 58 +++ .../translator/jdt/JDTClassLoaderFactory.java | 1 + .../jdt/JDTJava2CAstTranslator.java | 103 +++++- .../translator/jdt/JDTSourceLoaderImpl.java | 1 + .../jdt/JDTSourceModuleTranslator.java | 2 + .../translator/jdt/JDTTypeDictionary.java | 10 + .../wala/ide/AbstractJavaAnalysisAction.java | 3 + .../com/ibm/wala/ide/jdt/Activator.java | 6 +- .../com/ibm/wala/ide/util/JdtPosition.java | 10 + .../com/ibm/wala/ide/jsdt/Activator.java | 6 +- .../wala/ide/util/JavaScriptHeadlessUtil.java | 3 +- .../com/ibm/wala/ide/util/JsdtUtil.java | 4 + .../com/ibm/wala/eclipse/headless/Main.java | 2 + .../examples/drivers/SWTTypeHierarchy.java | 1 + .../src/com/ibm/wala/ide/test/Activator.java | 2 + .../wala/ide/tests/util/EclipseTestUtil.java | 1 + .../client/EclipseProjectAnalysisEngine.java | 1 + .../EclipseProjectSourceAnalysisEngine.java | 2 + .../com/ibm/wala/ide/ui/SWTTreeViewer.java | 8 + .../ibm/wala/ide/ui/ViewIFDSLocalAction.java | 2 + .../ibm/wala/ide/util/EclipseProjectPath.java | 1 + .../com/ibm/wala/ide/util/HeadlessUtil.java | 1 + .../ide/util/ProgressMonitorDelegate.java | 4 + .../wala/shrike/copywriter/CopyWriter.java | 1 + .../wala/shrikeBT/ArrayLengthInstruction.java | 1 + .../wala/shrikeBT/ArrayLoadInstruction.java | 3 + .../wala/shrikeBT/ArrayStoreInstruction.java | 2 + .../wala/shrikeBT/BinaryOpInstruction.java | 5 + .../wala/shrikeBT/CheckCastInstruction.java | 3 + .../wala/shrikeBT/ComparisonInstruction.java | 3 + .../ConditionalBranchInstruction.java | 4 + .../wala/shrikeBT/ConstantInstruction.java | 1 + .../wala/shrikeBT/ConversionInstruction.java | 4 + .../com/ibm/wala/shrikeBT/DupInstruction.java | 1 + .../com/ibm/wala/shrikeBT/GetInstruction.java | 6 + .../ibm/wala/shrikeBT/GotoInstruction.java | 1 + .../com/ibm/wala/shrikeBT/IInstruction.java | 1 + .../ibm/wala/shrikeBT/IInvokeInstruction.java | 1 + .../wala/shrikeBT/InstanceofInstruction.java | 3 + .../com/ibm/wala/shrikeBT/Instruction.java | 7 + .../ibm/wala/shrikeBT/InvokeInstruction.java | 5 + .../ibm/wala/shrikeBT/LoadInstruction.java | 4 + .../ibm/wala/shrikeBT/MonitorInstruction.java | 1 + .../com/ibm/wala/shrikeBT/NewInstruction.java | 1 + .../com/ibm/wala/shrikeBT/PopInstruction.java | 1 + .../com/ibm/wala/shrikeBT/PutInstruction.java | 5 + .../ibm/wala/shrikeBT/ReturnInstruction.java | 1 + .../ibm/wala/shrikeBT/ShiftInstruction.java | 4 + .../ibm/wala/shrikeBT/StoreInstruction.java | 3 + .../ibm/wala/shrikeBT/SwapInstruction.java | 1 + .../ibm/wala/shrikeBT/SwitchInstruction.java | 1 + .../ibm/wala/shrikeBT/ThrowInstruction.java | 1 + .../ibm/wala/shrikeBT/UnaryOpInstruction.java | 3 + .../analysis/ClassHierarchyStore.java | 4 + .../shrikeBT/info/InstructionTypeCounter.java | 1 + .../wala/shrikeBT/info/LocalAllocator.java | 1 + .../shrikeBT/info/ThisAssignmentChecker.java | 1 + .../shrikeCT/tools/AddSerialVersion.java | 2 + .../tools/OfflineInstrumenterBase.java | 1 + .../wala/dataflow/graph/BasicFramework.java | 2 + .../impl/AbstractFixedPointSolver.java | 2 + .../impl/DefaultFixedPointSolver.java | 1 + .../impl/DefaultFixedPointSystem.java | 13 + .../fixedpoint/impl/GeneralStatement.java | 4 + .../fixedpoint/impl/NullaryStatement.java | 4 + .../ibm/wala/fixpoint/AbstractVariable.java | 2 + .../ibm/wala/fixpoint/BitVectorVariable.java | 1 + .../ibm/wala/fixpoint/BooleanVariable.java | 1 + .../com/ibm/wala/fixpoint/IntSetVariable.java | 1 + .../com/ibm/wala/fixpoint/UnaryStatement.java | 4 + .../src/com/ibm/wala/util/ProgressMaster.java | 4 + .../util/collections/AbstractMultiMap.java | 10 + .../wala/util/collections/ArrayIterator.java | 3 + .../ibm/wala/util/collections/ArraySet.java | 3 + .../ibm/wala/util/collections/BimodalMap.java | 12 + .../util/collections/CollectionFilter.java | 1 + .../util/collections/ComposedIterator.java | 3 + .../util/collections/CompoundIntIterator.java | 2 + .../util/collections/CompoundIterator.java | 3 + .../util/collections/EmptyIntIterator.java | 2 + .../wala/util/collections/EmptyIterator.java | 3 + .../wala/util/collections/FilterIterator.java | 3 + .../wala/util/collections/Filtersection.java | 1 + .../util/collections/HashCodeComparator.java | 1 + .../wala/util/collections/ImmutableStack.java | 3 +- .../collections/IndiscriminateFilter.java | 1 + .../wala/util/collections/IntMapIterator.java | 3 + .../util/collections/Iterator2Collection.java | 13 + .../util/collections/Iterator2Iterable.java | 1 + .../wala/util/collections/Iterator2List.java | 10 + .../util/collections/IteratorPlusOne.java | 3 + .../util/collections/IteratorPlusTwo.java | 3 + .../wala/util/collections/MapIterator.java | 3 + .../ibm/wala/util/collections/MultiMap.java | 1 + .../collections/NonNullSingletonIterator.java | 3 + .../util/collections/ObjectArrayMapping.java | 7 + .../ibm/wala/util/collections/OrFilter.java | 1 + .../com/ibm/wala/util/collections/Pair.java | 3 + .../util/collections/ReverseIterator.java | 3 + .../wala/util/collections/SimpleVector.java | 5 + .../ibm/wala/util/collections/SmallMap.java | 12 + .../wala/util/collections/SparseVector.java | 8 + .../util/collections/ToStringComparator.java | 1 + .../wala/util/collections/TwoLevelVector.java | 8 + .../ibm/wala/util/graph/AbstractGraph.java | 16 + .../util/graph/AbstractNumberedGraph.java | 8 + .../util/graph/EdgeFilteredNumberedGraph.java | 12 + .../wala/util/graph/GraphReachability.java | 5 + .../com/ibm/wala/util/graph/GraphSlicer.java | 32 ++ .../com/ibm/wala/util/graph/NodeManager.java | 1 + .../util/graph/dominators/Dominators.java | 13 + .../util/graph/impl/BasicNodeManager.java | 5 + .../graph/impl/BasicOrderedMultiGraph.java | 18 + .../wala/util/graph/impl/DelegatingGraph.java | 16 + .../impl/DelegatingNumberedEdgeManager.java | 15 + .../impl/DelegatingNumberedNodeManager.java | 12 + .../util/graph/impl/InvertingEdgeManager.java | 10 + .../impl/InvertingNumberedEdgeManager.java | 12 + .../wala/util/graph/impl/NodeWithNumber.java | 2 + .../graph/impl/NodeWithNumberedEdges.java | 7 + .../util/graph/impl/NumberedNodeIterator.java | 3 + .../graph/impl/SlowNumberedNodeManager.java | 9 + .../graph/impl/SparseNumberedEdgeManager.java | 16 + .../graph/labeled/AbstractLabeledGraph.java | 10 + .../labeled/AbstractNumberedLabeledGraph.java | 11 + .../SparseNumberedLabeledEdgeManager.java | 25 ++ .../wala/util/graph/traverse/BFSIterator.java | 3 + .../util/graph/traverse/BFSPathFinder.java | 3 + .../graph/traverse/BoundedBFSIterator.java | 3 + .../com/ibm/wala/util/graph/traverse/DFS.java | 1 + .../traverse/DFSDiscoverTimeIterator.java | 3 + .../graph/traverse/DFSFinishTimeIterator.java | 3 + .../util/graph/traverse/FloydWarshall.java | 6 +- .../wala/util/graph/traverse/SCCIterator.java | 3 + .../ibm/wala/util/heapTrace/HeapTracer.java | 6 +- .../util/intset/BasicNaturalRelation.java | 13 + .../util/intset/BimodalMutableIntSet.java | 19 + .../intset/BimodalMutableIntSetFactory.java | 4 + .../src/com/ibm/wala/util/intset/BitSet.java | 3 + .../ibm/wala/util/intset/BitVectorIntSet.java | 21 ++ .../util/intset/BitVectorIntSetFactory.java | 4 + .../util/intset/DebuggingMutableIntSet.java | 23 ++ .../intset/DebuggingMutableIntSetFactory.java | 4 + .../wala/util/intset/MultiModalIntVector.java | 3 + .../ibm/wala/util/intset/MutableMapping.java | 7 + .../intset/MutableSharedBitVectorIntSet.java | 19 + .../MutableSharedBitVectorIntSetFactory.java | 4 + .../wala/util/intset/MutableSparseIntSet.java | 27 +- .../intset/MutableSparseIntSetFactory.java | 4 + .../util/intset/MutableSparseLongSet.java | 5 + .../intset/MutableSparseLongSetFactory.java | 4 + .../util/intset/OffsetOrdinalSetMapping.java | 7 + .../com/ibm/wala/util/intset/OrdinalSet.java | 4 + .../util/intset/SemiSparseMutableIntSet.java | 21 ++ .../SemiSparseMutableIntSetFactory.java | 4 + .../ibm/wala/util/intset/SimpleIntVector.java | 3 + .../ibm/wala/util/intset/SparseIntSet.java | 15 + .../ibm/wala/util/intset/SparseIntVector.java | 3 + .../ibm/wala/util/intset/SparseLongSet.java | 14 + .../wala/util/intset/TwoLevelIntVector.java | 3 + .../src/com/ibm/wala/viz/NodeDecorator.java | 1 + 634 files changed, 4999 insertions(+), 150 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java index bb5cadf97..448f86ed0 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java @@ -31,6 +31,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -41,6 +42,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java index a4e80d1c1..21b34b0ac 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java @@ -23,6 +23,7 @@ public class PolyglotJLexTest extends JLexTest { @Override protected JavaSourceAnalysisEngine getAnalysisEngine(final String[] mainClassDescriptors, Collection sources, List libs) { JavaSourceAnalysisEngine engine = new PolyglotJavaSourceAnalysisEngine() { + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, new String[] { "LJLex/Main" }); } diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java index e0950fc3f..47918b1a2 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java @@ -28,6 +28,7 @@ public class PolyglotJavaIRTest extends JavaIRTests { @Override protected AbstractAnalysisEngine getAnalysisEngine(final String[] mainClassDescriptors, Collection sources, List libs) { JavaSourceAnalysisEngine engine = new PolyglotJavaSourceAnalysisEngine() { + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, mainClassDescriptors); } diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java index 58dc1e851..08a0224a2 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java @@ -26,15 +26,19 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; public class PolyglotSyncDuplicatorTest extends SyncDuplicatorTest { + @Override protected JavaSourceAnalysisEngine getAnalysisEngine(final String[] mainClassDescriptors, Collection sources, List libs) { JavaSourceAnalysisEngine engine = new PolyglotJavaSourceAnalysisEngine() { + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, mainClassDescriptors); } + @Override public IRTranslatorExtension getTranslatorExtension() { JavaIRTranslatorExtension ext = new JavaIRTranslatorExtension(); ext.setCAstRewriterFactory(new CAstRewriterFactory() { + @Override public CAstRewriter createCAstRewriter(CAst ast) { return new SynchronizedBlockDuplicator(ast, true, testMethod); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java index ac69460cc..5402aa51a 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java @@ -32,6 +32,7 @@ public class AscriptionGoal extends VisitorGoal { public AscriptionGoal(Job job) { super(job, new AscriptionVisitor(job, job.extensionInfo().typeSystem(), job.extensionInfo().nodeFactory()) { + @Override public Expr ascribe(Expr e, Type toType) throws SemanticException { if (e instanceof ArrayInit && e.type().isNull()) { return e.type(toType); diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java index e33f9951f..8cd6b8b01 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java @@ -66,6 +66,7 @@ public class IRGoal extends SourceGoal_c /* PORT1.7 removed 'implements EndGoal' return true; } + @Override public String name() { return ""; } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java index babbf3938..b4cc2173f 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java @@ -52,11 +52,13 @@ public class JavaIRTranslatorExtension extends JLExtensionInfo implements IRTran }; } + @Override public void setSourceLoader(PolyglotSourceLoaderImpl sourceLoader) { fSourceLoader= sourceLoader; fMapper= new PolyglotIdentityMapper(sourceLoader.getReference()); } + @Override public PolyglotIdentityMapper getIdentityMapper() { return fMapper; } @@ -65,10 +67,12 @@ public class JavaIRTranslatorExtension extends JLExtensionInfo implements IRTran rewriterFactory = factory; } + @Override public CAstRewriterFactory getCAstRewriterFactory() { return rewriterFactory; } + @Override public boolean getReplicateForDoLoops() { return false; } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java index 1be479632..249835130 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java @@ -37,14 +37,17 @@ public class ModuleSource extends FileSource { public ModuleSource(final SourceModule module) throws IOException { super(new Resource() { + @Override public File file() { return new File(module.getURL().getFile()); } + @Override public InputStream getInputStream() throws IOException { return module.getInputStream(); } + @Override public String name() { String fullPath = module.getURL().getFile(); int idx= fullPath.lastIndexOf(File.separatorChar); diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java index 06a24357b..9e1bae855 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java @@ -43,6 +43,7 @@ public class PolyglotClassLoaderFactory extends ClassLoaderFactoryImpl { return fExtensionMap.get(clr); } + @Override protected IClassLoader makeNewClassLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, IClassLoader parent, AnalysisScope scope) throws IOException { if (classLoaderReference.equals(JavaSourceAnalysisScope.SOURCE)) { diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java index 1e6786234..88f244263 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java @@ -62,6 +62,7 @@ public class PolyglotIdentityMapper implements IdentityMapper> getAllScopedEntities() { return Collections.singletonMap(null, fTopLevelDecls); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("CompilationUnitEntity asked for AST-related entities, but it has no AST."); return null; } + @Override public CAstNode getAST() { return null; } @@ -1405,29 +1469,35 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public CAstControlFlowMap getControlFlow() { Assertions.UNREACHABLE("CompilationUnitEntity.getControlFlow()"); return null; } + @Override public CAstSourcePositionMap getSourceMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getSourceMap()"); return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return null; } + @Override public CAstNodeTypeMap getNodeTypeMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getNodeTypeMap()"); return null; } + @Override public Collection getQualifiers() { return Collections.EMPTY_LIST; } + @Override public CAstType getType() { Assertions.UNREACHABLE("CompilationUnitEntity.getType()"); return null; @@ -1450,6 +1520,7 @@ public class PolyglotJava2CAstTranslator { fType = type; } + @Override public String getName() { // TODO Will the IdentityMapper do the right thing for anonymous classes? // If so, we can delete most of the following logic... @@ -1459,6 +1530,7 @@ public class PolyglotJava2CAstTranslator { return fIdentityMapper.getTypeRef(fType).getName().toString(); } + @Override public Collection getSupertypes() { if (fSuperTypes == null) { buildSuperTypes(); @@ -1495,10 +1567,12 @@ public class PolyglotJava2CAstTranslator { } } + @Override public Collection getQualifiers() { return mapFlagsToQualifiers(fType.flags()); } + @Override public boolean isInterface() { if (fType == fSystem.Object()) { return false; // fSystem.Object() MUST be a class, as far as WALA is concerned @@ -1514,10 +1588,12 @@ public class PolyglotJava2CAstTranslator { fEntities = new LinkedHashMap>(entities); } + @Override public Map> getAllScopedEntities() { return Collections.unmodifiableMap(fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { if (fEntities.containsKey(construct)) { return (fEntities.get(construct)).iterator(); @@ -1526,6 +1602,7 @@ public class PolyglotJava2CAstTranslator { } } + @Override public String getSignature() { return Util.methodEntityToSelector(this).toString(); } @@ -1555,30 +1632,37 @@ public class PolyglotJava2CAstTranslator { sourcePosition = makePosition(p); } + @Override public int getKind() { return TYPE_ENTITY; } + @Override public String getName() { return fName; // unqualified? } + @Override public String getSignature() { return "L" + fName.replace('.', '/') + ";"; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public CAstNode getAST() { // This entity has no AST nodes, really. return null; @@ -1589,42 +1673,51 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public Map> getAllScopedEntities() { return Collections.singletonMap(null, fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("Non-AST-bearing entity (ClassEntity) asked for scoped entities related to a given AST node"); return null; } + @Override public CAstControlFlowMap getControlFlow() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap getSourceMap() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return sourcePosition; } + @Override public CAstNodeTypeMap getNodeTypeMap() { // This entity has no AST nodes, really. return new CAstNodeTypeMap() { + @Override public CAstType getNodeType(CAstNode node) { throw new UnsupportedOperationException(); } + @Override public Collection getMappedNodes() { throw new UnsupportedOperationException(); } }; } + @Override public Collection getQualifiers() { if (fCT == fTypeSystem.Object()) { // pretend the root of the hierarchy is always a class return mapFlagsToQualifiers(fCT.flags().clear(Flags.INTERFACE)); @@ -1632,6 +1725,7 @@ public class PolyglotJava2CAstTranslator { return mapFlagsToQualifiers(fCT.flags()); } + @Override public CAstType getType() { return new PolyglotJavaType(fCT, getTypeDict(), fTypeSystem); } @@ -1680,14 +1774,17 @@ public class PolyglotJava2CAstTranslator { } } + @Override public String toString() { return fPd.toString(); } + @Override public int getKind() { return CAstEntity.FUNCTION_ENTITY; } + @Override public String getName() { if (fPd instanceof ConstructorInstance) { return MethodReference.initAtom.toString(); @@ -1701,10 +1798,12 @@ public class PolyglotJava2CAstTranslator { } } + @Override public String[] getArgumentNames() { return argumentNames; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } @@ -1727,45 +1826,55 @@ public class PolyglotJava2CAstTranslator { return false; } + @Override public int getArgumentCount() { return isStatic() ? formalTypes().size() : formalTypes().size() + 1; } + @Override public CAstNode getAST() { return fPdast; } + @Override public CAstControlFlowMap getControlFlow() { return fMc.cfg(); } + @Override public CAstSourcePositionMap getSourceMap() { return fMc.pos(); } + @Override public CAstSourcePositionMap.Position getPosition() { return getSourceMap().getPosition(fPdast); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return fMc.getNodeTypeMap(); } + @Override public Collection getQualifiers() { return mapFlagsToQualifiers(getFlags()); } + @Override public CAstType getType() { return new CAstType.Method() { private Collection fExceptionTypes = null; private List fParameterTypes = null; + @Override public CAstType getReturnType() { return fMc.getTypeDictionary().getCAstTypeFor( (fPd instanceof MethodInstance) ? ((MethodInstance) fPd).returnType() : fSystem.Void()); } + @Override public List getArgumentTypes() { if (fParameterTypes == null) { final List formalTypes = formalTypes(); @@ -1778,16 +1887,19 @@ public class PolyglotJava2CAstTranslator { return fParameterTypes; } + @Override public String getName() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getName() called???"); return "?"; } + @Override public Collection getSupertypes() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getSupertypes() called???"); return null; } + @Override public Collection/* */ getExceptionTypes() { if (fExceptionTypes == null) { fExceptionTypes = new LinkedHashSet(); @@ -1807,10 +1919,12 @@ public class PolyglotJava2CAstTranslator { return fExceptionTypes; } + @Override public int getArgumentCount() { return formalTypes().size(); } + @Override public CAstType getDeclaringType() { return getTypeDict().getCAstTypeFor(declaringType); } @@ -1834,38 +1948,47 @@ public class PolyglotJava2CAstTranslator { fContext = context; } + @Override public int getKind() { return CAstEntity.FIELD_ENTITY; } + @Override public String getName() { return fFI.name().toString(); } + @Override public String getSignature() { return fFI.name() + fIdentityMapper.typeToTypeID(fFI.type()); } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public Iterator getScopedEntities(CAstNode construct) { return EmptyIterator.instance(); } + @Override public Map> getAllScopedEntities() { return Collections.emptyMap(); } + @Override public CAstNode getAST() { // No AST for a field decl; initializers folded into // constructor processing... @@ -1877,32 +2000,38 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public CAstControlFlowMap getControlFlow() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap getSourceMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return makePosition(fFI.position()); } + @Override public CAstNodeTypeMap getNodeTypeMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public Collection getQualifiers() { return mapFlagsToQualifiers(fFI.flags()); } + @Override public CAstType getType() { return fContext.getTypeDictionary().getCAstTypeFor(fFI.type()); } @@ -1933,38 +2062,47 @@ public class PolyglotJava2CAstTranslator { super(parent); } + @Override public Collection> getCatchTargets(Type label) { return parent.getCatchTargets(label); } + @Override public Node getFinally() { return parent.getFinally(); } + @Override public CodeInstance getEnclosingMethod() { return parent.getEnclosingMethod(); } + @Override public Type getEnclosingType() { return parent.getEnclosingType(); } + @Override public CAstTypeDictionary getTypeDictionary() { return parent.getTypeDictionary(); } + @Override public List getStaticInitializers() { return parent.getStaticInitializers(); } + @Override public List getInitializers() { return parent.getInitializers(); } + @Override public Map getLabelMap() { return parent.getLabelMap(); } + @Override public boolean needLVal() { return parent.needLVal(); } @@ -1986,6 +2124,7 @@ public class PolyglotJava2CAstTranslator { fChildren = entities; } + @Override public void addScopedEntity(CAstNode node, CAstEntity e) { Assertions.productionAssertion(node == null); fChildren.add(e); @@ -1995,18 +2134,22 @@ public class PolyglotJava2CAstTranslator { // return null; // fChildren; // } + @Override public Type getEnclosingType() { return type; } + @Override public List getInitializers() { return fInitializers; } + @Override public List getStaticInitializers() { return fStaticInitializers; } + @Override public CAstControlFlowRecorder cfg() { Assertions.UNREACHABLE("ClassContext.cfg()"); return null; @@ -2017,11 +2160,13 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public Node getFinally() { Assertions.UNREACHABLE("ClassContext.getFinally()"); return null; } + @Override public CodeInstance getEnclosingMethod() { // No one outside a method defining a local class can see it, // so it clearly can't escape through to the method's enclosing @@ -2030,28 +2175,33 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public CAstSourcePositionRecorder pos() { // No AST, so no AST map Assertions.UNREACHABLE("ClassContext.pos()"); return null; } + @Override public Node getContinueFor(String label) { Assertions.UNREACHABLE("ClassContext.getContinueFor() with label " + label + " in " + type); return null; } + @Override public Node getBreakFor(String label) { System.err.println("Cannot find break target for " + label + " in " + type); Assertions.UNREACHABLE("ClassContext.getBreakFor()"); return null; } + @Override public Map getLabelMap() { Assertions.UNREACHABLE("ClassContext.getLabelMap()"); return null; } + @Override public boolean needLVal() { Assertions.UNREACHABLE("ClassContext.needLVal()"); return false; @@ -2074,31 +2224,38 @@ public class PolyglotJava2CAstTranslator { fEntities = entities; } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { return fNodeTypeMap; } + @Override public CAstSourcePositionRecorder pos() { return fSourceMap; } + @Override public CAstControlFlowRecorder cfg() { return fCFG; } + @Override public void addScopedEntity(CAstNode node, CAstEntity entity) { if (! fEntities.containsKey(node)) { fEntities.put(node, new HashSet(1)); } fEntities.get(node).add(entity); } + @Override public Map> getScopedEntities() { return fEntities; } + @Override public Map getLabelMap() { return labelMap; } + @Override public boolean needLVal() { return false; } @@ -2112,11 +2269,13 @@ public class PolyglotJava2CAstTranslator { fPI = pi; } + @Override public Collection> getCatchTargets(Type label) { Collection> result = Collections.singleton(Pair.make(fREType, CAstControlFlowMap.EXCEPTION_TO_EXIT)); return result; } + @Override public CodeInstance getEnclosingMethod() { return fPI; } @@ -2143,6 +2302,7 @@ public class PolyglotJava2CAstTranslator { } } + @Override public Collection> getCatchTargets(Type label) { // Look for all matching targets for this thrown type: // if supertpe match, then return only matches at this catch @@ -2168,10 +2328,12 @@ public class PolyglotJava2CAstTranslator { return catchNodes; } + @Override public List getStaticInitializers() { return null; } + @Override public List getInitializers() { return null; } @@ -2184,45 +2346,54 @@ public class PolyglotJava2CAstTranslator { fTypeDict = typeDict; } + @Override public Collection> getCatchTargets(Type label) { Assertions.UNREACHABLE("RootContext.getCatchTargets()"); return null; } + @Override public Node getFinally() { Assertions.UNREACHABLE("RootContext.getFinally()"); return null; } + @Override public CodeInstance getEnclosingMethod() { Assertions.UNREACHABLE("RootContext.getEnclosingMethod()"); return null; } + @Override public Type getEnclosingType() { Assertions.UNREACHABLE("RootContext.getEnclosingType()"); return null; } + @Override public CAstTypeDictionary getTypeDictionary() { return fTypeDict; } + @Override public List getStaticInitializers() { Assertions.UNREACHABLE("RootContext.getStaticInitializers()"); return null; } + @Override public List getInitializers() { Assertions.UNREACHABLE("RootContext.getInitializers()"); return null; } + @Override public Map getLabelMap() { Assertions.UNREACHABLE("RootContext.getLabelMap()"); return null; } + @Override public boolean needLVal() { Assertions.UNREACHABLE("ClassContext.needLVal()"); return false; @@ -2240,14 +2411,17 @@ public class PolyglotJava2CAstTranslator { this.breakTo = breakTo; } + @Override public Node getBreakFor(String label) { return (label == null || label.equals(this.label)) ? breakTo : super.getBreakFor(label); } + @Override public List getStaticInitializers() { return null; } + @Override public List getInitializers() { return null; } @@ -2261,6 +2435,7 @@ public class PolyglotJava2CAstTranslator { this.continueTo = continueTo; } + @Override public Node getContinueFor(String label) { return (label == null || label.equals(this.label)) ? continueTo : super.getContinueFor(label); } @@ -2272,6 +2447,7 @@ public class PolyglotJava2CAstTranslator { super(parent); } + @Override public boolean needLVal() { return true; } @@ -2297,30 +2473,37 @@ public class PolyglotJava2CAstTranslator { this.p = p; } + @Override public int getFirstLine() { return p.line(); } + @Override public int getLastLine() { return p.endLine(); } + @Override public int getFirstCol() { return p.column(); } + @Override public int getLastCol() { return p.endColumn(); } + @Override public int getFirstOffset() { return p.offset(); } + @Override public int getLastOffset() { return p.endOffset(); } + @Override public URL getURL() { try { String path = p.path(); @@ -2331,6 +2514,7 @@ public class PolyglotJava2CAstTranslator { } } + @Override public InputStream getInputStream() throws IOException { return getURL().openConnection().getInputStream(); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java index a22ce4838..b2285b679 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java @@ -20,6 +20,7 @@ public class PolyglotJavaSourceAnalysisEngine extends JavaSourceAnalysisEngine { return new JavaIRTranslatorExtension(); } + @Override protected ClassLoaderFactory getClassLoaderFactory(SetOfClasses exclusions) { return new PolyglotClassLoaderFactory(exclusions, getTranslatorExtension()); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java index df8a49022..7eb3a2bc2 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java @@ -36,6 +36,7 @@ public class PolyglotSourceLoaderImpl extends JavaSourceLoaderImpl { return fExtInfo; } + @Override protected SourceModuleTranslator getTranslator() { return new PolyglotSourceModuleTranslator(cha.getScope(), fExtInfo, this, JavaSourceAnalysisScope.SOURCE); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java index f59a6aff2..39da5ee70 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java @@ -108,6 +108,7 @@ public class PolyglotSourceModuleTranslator implements SourceModuleTranslator { fSourcePath = "."; } + @Override public void loadAllSources(Set modules) { Options opts= fExtInfo.getOptions(); opts.assertions = true; diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java index 6ab77ec71..a381be5e9 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java @@ -42,18 +42,22 @@ public class PolyglotTypeDictionary extends CAstTypeDictionaryImpl { fEltCAstType = getCAstTypeFor(fEltPolyglotType); } + @Override public int getNumDimensions() { return 1; // always 1 for Java } + @Override public CAstType getElementType() { return fEltCAstType; } + @Override public String getName() { return "[" + fEltCAstType.getName(); } + @Override public Collection getSupertypes() { if (fEltPolyglotType.isPrimitive()) return Collections.singleton(getCAstTypeFor(fTypeSystem.Object())); @@ -81,6 +85,7 @@ public class PolyglotTypeDictionary extends CAstTypeDictionaryImpl { fTranslator = translator; } + @Override public CAstType getCAstTypeFor(Object astType) { CAstType type = super.getCAstTypeFor(astType); // Handle the case where we haven't seen an AST decl for some type before diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java index e154dfcea..00f942de5 100755 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java @@ -24,9 +24,11 @@ public class PolyglotUnwoundIRTranslatorExtension this.unrollDepth = unrollDepth; } + @Override public CAstRewriterFactory,AstLoopUnwinder.UnwindKey> getCAstRewriterFactory() { return new CAstRewriterFactory,AstLoopUnwinder.UnwindKey>() { - public AstLoopUnwinder createCAstRewriter(CAst ast) { + @Override + public AstLoopUnwinder createCAstRewriter(CAst ast) { return new AstLoopUnwinder(ast, true, unrollDepth); } }; diff --git a/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java b/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java index 33ce01281..5537eac96 100644 --- a/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java +++ b/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java @@ -19,8 +19,10 @@ public class AnonymousClass { Foo f= new Foo() { int value = 3; - public int getValue() { return value; } - public int getValueBase() { return value - base.intValue(); } + @Override + public int getValue() { return value; } + @Override + public int getValueBase() { return value - base.intValue(); } }; System.out.println(f.getValue()); @@ -35,19 +37,22 @@ public class AnonymousClass { abstract class FooImpl implements Foo { int y; - public abstract int getValue(); + @Override + public abstract int getValue(); FooImpl(int _y) { y = _y; } - public int getValueBase() { + @Override + public int getValueBase() { return y + getValue() - base.intValue(); } } Foo f= new FooImpl(-4) { - public int getValue() { return 7; } + @Override + public int getValue() { return 7; } }; System.out.println(f.getValue()); diff --git a/com.ibm.wala.cast.java.test.data/src/FunkySupers.java b/com.ibm.wala.cast.java.test.data/src/FunkySupers.java index ff61a6417..d0ac75bda 100644 --- a/com.ibm.wala.cast.java.test.data/src/FunkySupers.java +++ b/com.ibm.wala.cast.java.test.data/src/FunkySupers.java @@ -21,7 +21,8 @@ public class FunkySupers { } class SubFunkySupers extends FunkySupers { - int funky(FunkySupers fs) { + @Override + int funky(FunkySupers fs) { SubFunkySupers.super.funky(fs); SubFunkySupers.this.funky(fs); SubFunkySupers.this.y = 7; diff --git a/com.ibm.wala.cast.java.test.data/src/Inheritance1.java b/com.ibm.wala.cast.java.test.data/src/Inheritance1.java index b36a90a97..a362c4adb 100644 --- a/com.ibm.wala.cast.java.test.data/src/Inheritance1.java +++ b/com.ibm.wala.cast.java.test.data/src/Inheritance1.java @@ -29,9 +29,11 @@ class Base { } } class Derived extends Base { + @Override public void foo() { super.foo(); } + @Override public String bar(int x) { return Integer.toHexString(x); } diff --git a/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java b/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java index 287d8b391..c09350e78 100644 --- a/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java +++ b/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java @@ -31,7 +31,8 @@ public class InnerClassLexicalReads { * 0 v2:com.ibm.wala.ssa.SymbolTable$1@16b18b6 = lexical:y@LInnerClassLexicalReads/makeIntConstant(I)LIntConstant; * 1 return v2:com.ibm.wala.ssa.SymbolTable$1@16b18b6[11:4] -> [11:13] */ - public int getConstant() { + @Override + public int getConstant() { return y; } }; diff --git a/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java b/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java index 59ab4f912..3a4f77c8e 100644 --- a/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java +++ b/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java @@ -25,6 +25,7 @@ class FooIT1 implements IFoo { public FooIT1(char ch) { fValue= ch; } + @Override public char getValue() { return fValue; } diff --git a/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java b/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java index 2528e7cae..14df1b48f 100644 --- a/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java +++ b/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java @@ -29,6 +29,7 @@ abstract class PrimitiveWrapper { * {@inheritDoc} * @see java.lang.Object#equals(java.lang.Object) */ + @Override abstract public boolean equals(Object o); } @@ -47,6 +48,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#intValue() */ + @Override public int intValue() { return val; } @@ -55,6 +57,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#setIntValue(int) */ + @Override public void setIntValue(int i) { this.val = i; } @@ -63,6 +66,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#equals(java.lang.Object) */ + @Override public boolean equals(Object o) { return o instanceof IntWrapper && ((IntWrapper)o).val==val; } diff --git a/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java b/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java index 1320f5522..62c1bf9d5 100644 --- a/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java +++ b/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java @@ -13,7 +13,8 @@ interface ISimpleCalls { public void helloWorld(); } public class SimpleCalls implements ISimpleCalls { - public void helloWorld() { + @Override + public void helloWorld() { System.out.println("hello world!"); } public int anotherCall() { diff --git a/com.ibm.wala.cast.java.test.data/src/Thread1.java b/com.ibm.wala.cast.java.test.data/src/Thread1.java index e7c54f474..d78ceff23 100644 --- a/com.ibm.wala.cast.java.test.data/src/Thread1.java +++ b/com.ibm.wala.cast.java.test.data/src/Thread1.java @@ -13,6 +13,7 @@ class R implements Runnable { R(int i) { this.i = i; } + @Override public void run() { return; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java b/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java index 2648ef81a..811e6a9ad 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java @@ -55,7 +55,8 @@ public class SimpleNames { final int i = 5; new Object() { - public int hashCode() { + @Override + public int hashCode() { f = 5; // SimpleNames.this = 5 s = 6; // SimpleNames.s = 6 diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java index 169d8157d..abd51274c 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java @@ -76,7 +76,8 @@ public class ConstructorsAndInitializers extends Super { iX = 55 + 12; } - public String toString() { + @Override + public String toString() { return s + " -- from an anon class in " + iX + "," + sX + ": " + ConstructorsAndInitializers.this.s; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java index 55be101b4..eeac7e75b 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java @@ -45,7 +45,8 @@ public class InnerClasses extends Temp { Object supportLocalBusiness() { final int x = 54; class FooBar { - public int hashCode() { return x; } + @Override + public int hashCode() { return x; } } return new FooBar(); } @@ -53,7 +54,8 @@ public class InnerClasses extends Temp { static Object anonymousCoward() { final int x = 5; return new Object() { - public int hashCode() { return x; } + @Override + public int hashCode() { return x; } }; } @@ -64,7 +66,8 @@ public class InnerClasses extends Temp { System.out.println(anonymousCoward().hashCode()); final String xx = "crazy"; Outie outie = new Outie("weird") { - public String toString() { + @Override + public String toString() { return "bogus" + x + xx + xxxx; } }; diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java index 961a7a66e..7b625209c 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java @@ -95,7 +95,8 @@ public class MethodMadness { return 13 + x; } - protected int protectedInteger() { + @Override + protected int protectedInteger() { return 233 + x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java index 2395285ec..5e6a9b195 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java @@ -44,7 +44,8 @@ public class AnonGeneNullarySimple { } static class StrTripler implements Ops { - public String nullary() { + @Override + public String nullary() { String x = "talk about it "; return x+x+x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java index 1ab55e264..b3ec5adb1 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java @@ -48,10 +48,12 @@ public class AnonymousGenerics { // if has type parameters, find overriding method and // get erasures for all of those types and make a new method // that calls this one (with casts). no worries about return values. - public String unary(String x) { + @Override + public String unary(String x) { return x + x + x; } - public String nullary() { + @Override + public String nullary() { String x = "talk about it "; return x+x+x; } @@ -63,10 +65,12 @@ public class AnonymousGenerics { private void doit() { Ops strQuadrupler = new Ops() { - public String unary(String x) { + @Override + public String unary(String x) { return x+x+x+x; } - public String nullary() { + @Override + public String nullary() { String x = "time to make a move to the global economy "; return x+x+x+x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java index d7b3ef5d0..8c2821a1e 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java @@ -42,9 +42,11 @@ public class Cocovariant { A foo(String x) { return null; } } static class B extends A { + @Override B foo(String x) { return null; } } static class C extends B { + @Override C foo(String x) { return null; } } public static void main(String[] args) { diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java index 5b722006b..cc3e98188 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java @@ -51,14 +51,16 @@ interface IGeneric { class ConcreteGeneric implements IGeneric { Q x; - public Q bar(Q a, Q b) { + @Override + public Q bar(Q a, Q b) { x = a; if (b.hashCode() == a.hashCode() || b.toString().equals(a.toString())) return a; return b; } - public Q foo() { + @Override + public Q foo() { return x; } } @@ -68,7 +70,8 @@ class ConcreteGeneric2 extends ConcreteGeneric { public void setFoo(Q a) { y = a; } - public Q foo() { + @Override + public Q foo() { return y; } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java index 522dd137e..e60e74b35 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java @@ -45,16 +45,19 @@ public class GenericMemberClasses { T x = null; private int localChangeID; - public boolean hasNext() { + @Override + public boolean hasNext() { return ( localChangeID == 5 ); } - public T next() { + @Override + public T next() { localChangeID = 5; return x; } - public void remove() { + @Override + public void remove() { } } public static void main(String args[]) { diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java index 40f70a9a1..6b1d1cc0e 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java @@ -47,13 +47,15 @@ public class MoreOverriddenGenerics { } class Sub extends Super { - public Number get() { + @Override + public Number get() { return super.get(); } } class SubSub extends Sub { - public Long get() { + @Override + public Long get() { return new Long(6); } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java index 8560f6473..74b9dc2aa 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java @@ -39,10 +39,14 @@ package javaonepointfive; public class NotSoSimpleEnums { public enum Direction { - NORTH("nord") { public Direction getOpposite() { return SOUTH; }}, - EAST("est") { public Direction getOpposite() { return WEST; }}, - SOUTH("sud") { public Direction getOpposite() { return NORTH; }}, - WEST("ouest") { public Direction getOpposite() { return EAST; }}; + NORTH("nord") { @Override + public Direction getOpposite() { return SOUTH; }}, + EAST("est") { @Override + public Direction getOpposite() { return WEST; }}, + SOUTH("sud") { @Override + public Direction getOpposite() { return NORTH; }}, + WEST("ouest") { @Override + public Direction getOpposite() { return EAST; }}; public abstract Direction getOpposite(); diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java index 31a276436..c82132bfc 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java @@ -43,7 +43,8 @@ public class OverridesOnePointFour { } static class Sub implements Super { - public Long get() { + @Override + public Long get() { return new Long(6); } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java index d85780e6b..2d4ad92ad 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java @@ -46,7 +46,8 @@ public class VarargsCovariant { } static class B extends A { - B hello(int... x) { + @Override + B hello(int... x) { System.out.println("b hello"); return this; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java index 93b1a0345..a20275740 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java @@ -69,7 +69,8 @@ class VarityTestSuper { } class VarityTestSub extends VarityTestSuper { - void bar(String... args) {} + @Override + void bar(String... args) {} } public class VarargsOverriding { diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java index 9675451de..9254c228b 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java @@ -159,6 +159,7 @@ public abstract class IRTests { return ea; } + @Override public void check(CallGraph callGraph) { MethodReference srcMethod = descriptorToMethodRef(this.srcDescriptor, callGraph.getClassHierarchy()); Set srcNodes = callGraph.getNodes(srcMethod); @@ -213,6 +214,7 @@ public abstract class IRTests { this.definingLineNumber = definingLineNumber; } + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef(method, cg.getClassHierarchy()); @@ -278,6 +280,7 @@ public abstract class IRTests { public final Set classAnnotations = HashSetFactory.make(); public final Set methodAnnotations = HashSetFactory.make(); + @Override public void check(CallGraph cg) { classes: for(ClassAnnotation ca : classAnnotations) { IClass cls = cg.getClassHierarchy().lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, ca.className)); diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java index acc86e89d..a991121a2 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java @@ -18,6 +18,7 @@ public abstract class JLexTest extends IRTests { super(null); } + @Override protected String singleJavaInputForTest() { return "JLex"; } @@ -26,6 +27,7 @@ public abstract class JLexTest extends IRTests { runTest(singleTestSrc(), rtJar, new String[] { "LJLex/Main" }, emptyList, false); } + @Override protected String singleJavaPkgInputForTest(String pkgName) { return ""; } diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java index 48a4f8596..281f41e9d 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java @@ -84,6 +84,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); @@ -115,6 +116,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = "IFoo"; @@ -132,6 +134,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = "FooIT1"; @@ -157,6 +160,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = "Derived"; @@ -186,6 +190,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#Array1#foo#()V", cg.getClassHierarchy()); @@ -215,6 +220,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#ArrayLiteral1#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); @@ -236,6 +242,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#ArrayLiteral2#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); @@ -297,6 +304,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#QualifiedStatic#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); @@ -319,6 +327,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest() + "$WhatsIt"; @@ -349,6 +358,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); @@ -465,6 +475,7 @@ public abstract class JavaIRTests extends IRTests { * Classes local to method are enclosed in the class the methods belong * to. */ + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); final String localClassStr = "Foo"; @@ -501,6 +512,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java index 24447a842..ed104b052 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java @@ -31,14 +31,16 @@ public class TestPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java index 3ea8ff0d7..6087c80aa 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java @@ -31,14 +31,16 @@ public class JavaSourcePlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java index 12114eb4b..b9d111b53 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java @@ -36,6 +36,7 @@ public class AstJavaTypeInference extends AstTypeInference { protected IClass stringClass; protected class AstJavaTypeOperatorFactory extends AstTypeOperatorFactory implements AstJavaInstructionVisitor { + @Override public void visitBinaryOp(SSABinaryOpInstruction instruction) { if (doPrimitives) { IBinaryOpInstruction.IOperator op = instruction.getOperator(); @@ -48,6 +49,7 @@ public class AstJavaTypeInference extends AstTypeInference { } } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { TypeReference type = inst.getEnclosingType(); IClass klass = cha.lookupClass(type); @@ -58,6 +60,7 @@ public class AstJavaTypeInference extends AstTypeInference { } } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { TypeReference type = instruction.getDeclaredResultType(); if (type.isReferenceType()) { @@ -81,6 +84,7 @@ public class AstJavaTypeInference extends AstTypeInference { public class AstJavaTypeVarFactory extends TypeVarFactory { + @Override public IVariable makeVariable(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { @@ -105,10 +109,12 @@ public class AstJavaTypeInference extends AstTypeInference { return stringClass; } + @Override protected void initialize() { init(ir, new AstJavaTypeVarFactory(), new AstJavaTypeOperatorFactory()); } + @Override public TypeAbstraction getConstantPrimitiveType(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isBooleanConstant(valueNumber)) { @@ -123,6 +129,7 @@ public class AstJavaTypeInference extends AstTypeInference { private PrimAndStringOp() { } + @Override public byte evaluate(TypeVariable lhs, TypeVariable[] rhs) { TypeAbstraction meet = null; @@ -164,6 +171,7 @@ public class AstJavaTypeInference extends AstTypeInference { * * @see com.ibm.wala.dataflow.Operator#hashCode() */ + @Override public int hashCode() { return 71292; } @@ -173,6 +181,7 @@ public class AstJavaTypeInference extends AstTypeInference { * * @see com.ibm.wala.dataflow.Operator#equals(java.lang.Object) */ + @Override public boolean equals(Object o) { return o != null && o.getClass().equals(getClass()); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java index 3e89a8f60..6c9b3637a 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java @@ -86,6 +86,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { systemEntries.add(M); } + @Override protected void addApplicationModulesToScope() { ClassLoaderReference app = scope.getApplicationLoader(); for (Module M : userEntries) { @@ -99,6 +100,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { } } + @Override public void buildAnalysisScope() throws IOException { scope = makeSourceAnalysisScope(); @@ -120,6 +122,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { protected abstract ClassLoaderFactory getClassLoaderFactory(SetOfClasses exclusions); + @Override public IClassHierarchy buildClassHierarchy() { IClassHierarchy cha = null; ClassLoaderFactory factory = getClassLoaderFactory(scope.getExclusions()); @@ -134,6 +137,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { return cha; } + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha); } @@ -143,11 +147,13 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { return new AnalysisCache(AstIRFactory.makeDefaultFactory()); } + @Override public AnalysisOptions getDefaultOptions(Iterable entrypoints) { AnalysisOptions options = new AnalysisOptions(getScope(), entrypoints); SSAOptions ssaOptions = new SSAOptions(); ssaOptions.setDefaultValues(new SSAOptions.DefaultValues() { + @Override public int getDefaultValue(SymbolTable symtab, int valueNumber) { return symtab.getDefaultValue(valueNumber); } 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 2b716c715..c5d6bc663 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 @@ -61,19 +61,23 @@ public class SynchronizedBlockDuplicator extends this.testDirection = testDirection; } + @Override public int hashCode() { return (testDirection ? 1 : -1) * System.identityHashCode(syncNode) * (rest == null ? 1 : rest.hashCode()); } + @Override public UnwindKey parent() { return rest; } + @Override public boolean equals(Object o) { return (o instanceof UnwindKey) && ((UnwindKey) o).testDirection == testDirection && ((UnwindKey) o).syncNode == syncNode && (rest == null ? ((UnwindKey) o).rest == null : rest.equals(((UnwindKey) o).rest)); } + @Override public String toString() { return "#" + testDirection + ((rest == null) ? "" : rest.toString()); } @@ -101,6 +105,7 @@ public class SynchronizedBlockDuplicator extends */ private static class RootContext implements RewriteContext { + @Override public UnwindKey key() { return null; } @@ -131,6 +136,7 @@ public class SynchronizedBlockDuplicator extends this.parent = parent; } + @Override public UnwindKey key() { return new UnwindKey(testDirection, syncNode, parent.key()); } @@ -150,6 +156,7 @@ public class SynchronizedBlockDuplicator extends } } + @Override protected CAstNode flowOutTo(Map nodeMap, CAstNode oldSource, Object label, CAstNode oldTarget, CAstControlFlowMap orig, CAstSourcePositionMap src) { assert oldTarget == CAstControlFlowMap.EXCEPTION_TO_EXIT; @@ -196,6 +203,7 @@ public class SynchronizedBlockDuplicator extends return null; } + @Override protected CAstNode copyNodes(CAstNode n, final CAstControlFlowMap cfg, RewriteContext c, Map, CAstNode> nodeMap) { String varName; // don't copy operators or constants (presumably since they are immutable?) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java index 30beb2b12..73c46148b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java @@ -51,6 +51,7 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall // // /////////////////////////////////////////////////////////////////////////// + @Override protected boolean useObjectCatalog() { return false; } @@ -69,10 +70,12 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall this.outer = outer; } + @Override public int hashCode() { return getInstanceKey().hashCode() * outer.hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof EnclosingObjectReferenceKey) && ((EnclosingObjectReferenceKey) o).outer.equals(outer) && ((EnclosingObjectReferenceKey) o).getInstanceKey().equals(getInstanceKey()); @@ -109,15 +112,18 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall super(vn); } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { Assertions.UNREACHABLE(); } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { bingo = true; } } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new AstJavaInterestingVisitor(vn); } @@ -166,10 +172,12 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall } else { system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { IntSetVariable tv = (IntSetVariable) rhs; if (tv.getValue() != null) { tv.getValue().foreach(new IntSetAction() { + @Override public void act(int ptr) { InstanceKey iKey = system.getInstanceKey(ptr); PointerKey enclosing = new EnclosingObjectReferenceKey(iKey, cls); @@ -180,14 +188,17 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "enclosing objects of " + objKey; } @@ -195,6 +206,7 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall } } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { PointerKey lvalKey = getPointerKeyForLocal(inst.getDef()); PointerKey objKey = getPointerKeyForLocal(1); @@ -202,6 +214,7 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall handleEnclosingObject(lvalKey, cls, objKey); } + @Override public void visitNew(SSANewInstruction instruction) { super.visitNew(instruction); InstanceKey iKey = getInstanceKeyForAllocation(instruction.getNewSite()); @@ -272,11 +285,13 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall } } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { visitInvokeInternal(instruction, new DefaultInvariantComputer()); } } + @Override protected ConstraintVisitor makeVisitor(CGNode node) { return new AstJavaConstraintVisitor(this, node); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java index e3ced01c7..89aae96b1 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java @@ -72,6 +72,7 @@ public class JavaScopeMappingInstanceKeys extends ScopeMappingInstanceKeys { return cls instanceof JavaClass; } + @Override protected boolean needsScopeMappingKey(InstanceKey base) { boolean result = getParents(base).length > 0; if (AstTranslator.DEBUG_LEXICAL) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java index 51c519ac5..5d0c405ab 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java @@ -49,6 +49,7 @@ public class JavaSourceAnalysisScope extends AnalysisScope { return SOURCE; } + @Override public void addToScope(ClassLoaderReference loader, Module m) { if (m instanceof SourceDirectoryTreeModule && loader.equals(ClassLoaderReference.Application)) { super.addToScope(SOURCE, m); diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java index 6b60b34dc..c40954bf7 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java @@ -32,16 +32,19 @@ public class AstJavaModRef extends AstModRef { super(n, result, pa, h); } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { } } + @Override protected RefVisitor makeRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { return new AstJavaRefVisitor(n, result, pa, h); } @@ -56,10 +59,12 @@ public class AstJavaModRef extends AstModRef { } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java index 993ad558b..8bb064124 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java @@ -77,6 +77,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherAssertions(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return o instanceof AstAssertInstruction; } @@ -85,6 +86,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherMonitors(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return o instanceof SSAMonitorInstruction; } @@ -93,6 +95,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherWrites(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return (o instanceof SSAPutInstruction) || (o instanceof SSAArrayStoreInstruction); } @@ -101,6 +104,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherReads(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return (o instanceof SSAGetInstruction) || (o instanceof SSAArrayLoadInstruction); } 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 9684f85fd..cfd0a461d 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 @@ -108,14 +108,17 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { this.annotations = annotations; } + @Override public Collection getAnnotations() { return annotations; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public IClass getSuperclass() { boolean excludedSupertype=false; for (Iterator iter = superTypeNames.iterator(); iter.hasNext();) { @@ -143,6 +146,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return null; } + @Override public Collection getDirectInterfaces() { List result = new ArrayList(); for (Iterator iter = superTypeNames.iterator(); iter.hasNext();) { @@ -177,6 +181,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return enclosingClass; } + @Override public String toString() { StringBuffer sb = new StringBuffer(""; } @@ -324,20 +332,24 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { super(methodEntity, owner); } + @Override public String getLocalVariableName(int bcIndex, int localNumber) { Assertions.UNREACHABLE("AbstractJavaMethod.getLocalVariableName() called"); return null; } + @Override public boolean hasLocalVariableTable() { Assertions.UNREACHABLE("AbstractJavaMethod.hasLocalVariableTable() called"); return false; } + @Override public LexicalParent[] getParents() { return new LexicalParent[0]; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -355,18 +367,22 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { super(methodEntity, owner, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String getLocalVariableName(int bcIndex, int localNumber) { return null; } + @Override public boolean hasLocalVariableTable() { return false; } + @Override public LexicalParent[] getParents() { if (AstTranslator.DEBUG_LEXICAL) { System.err.println(("resolving parents of " + this)); @@ -409,10 +425,12 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { final int hack = i; result[i] = new LexicalParent() { + @Override public String getName() { return parents[hack]; } + @Override public AstMethod getMethod() { return (AstMethod) cls.getMethod(sel); } @@ -467,12 +485,14 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return cha; } + @Override protected void loadAllSources(Set modules) { getTranslator().loadAllSources(modules); } protected abstract SourceModuleTranslator getTranslator(); + @Override public void init(List modules) throws IOException { super.init(modules); fTypeMap = null; @@ -513,97 +533,120 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return javaClass; } + @Override public String toString() { return "Java Source Loader (classes " + loadedClasses.values() + ")"; } public static class InstructionFactory extends JavaInstructionFactory implements AstJavaInstructionFactory { + @Override public com.ibm.wala.cast.java.ssa.EnclosingObjectReference EnclosingObjectReference(int lval, TypeReference type) { return new EnclosingObjectReference(lval, type); } + @Override public AstJavaNewEnclosingInstruction JavaNewEnclosingInstruction(int result, NewSiteReference site, int enclosing) { return new AstJavaNewEnclosingInstruction(result, site, enclosing); } + @Override public AstJavaInvokeInstruction JavaInvokeInstruction(int result, int[] params, int exception, CallSiteReference site) { return new AstJavaInvokeInstruction(result, params, exception, site); } + @Override public AstJavaInvokeInstruction JavaInvokeInstruction(int[] params, int exception, CallSiteReference site) { return new AstJavaInvokeInstruction(params, exception, site); } + @Override public AstJavaInvokeInstruction JavaInvokeInstruction(int[] results, int[] params, int exception, CallSiteReference site, Access[] lexicalReads, Access[] lexicalWrites) { return new AstJavaInvokeInstruction(results, params, exception, site, lexicalReads, lexicalWrites); } + @Override public AstAssertInstruction AssertInstruction(int value, boolean fromSpecification) { return new AstAssertInstruction(value, fromSpecification); } + @Override public com.ibm.wala.cast.ir.ssa.AssignInstruction AssignInstruction(int result, int val) { return new AssignInstruction(result, val); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementGetInstruction EachElementGetInstruction(int value, int objectRef) { throw new UnsupportedOperationException(); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction EachElementHasNextInstruction(int value, int objectRef) { throw new UnsupportedOperationException(); } + @Override public AstEchoInstruction EchoInstruction(int[] rvals) { throw new UnsupportedOperationException(); } + @Override public AstGlobalRead GlobalRead(int lhs, FieldReference global) { throw new UnsupportedOperationException(); } + @Override public AstGlobalWrite GlobalWrite(FieldReference global, int rhs) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal, FieldReference fieldRef) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, FieldReference fieldRef) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval) { throw new UnsupportedOperationException(); } + @Override public AstLexicalRead LexicalRead(Access[] accesses) { return new AstLexicalRead(accesses); } + @Override public AstLexicalRead LexicalRead(Access access) { return new AstLexicalRead(access); } + @Override public AstLexicalRead LexicalRead(int lhs, String definer, String globalName) { return new AstLexicalRead(lhs, definer, globalName); } + @Override public AstLexicalWrite LexicalWrite(Access[] accesses) { return new AstLexicalWrite(accesses); } + @Override public AstLexicalWrite LexicalWrite(Access access) { return new AstLexicalWrite(access); } + @Override public AstLexicalWrite LexicalWrite(String definer, String globalName, int rhs) { return new AstLexicalWrite(definer, globalName, rhs); } @@ -615,6 +658,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { private static final InstructionFactory insts = new InstructionFactory(); + @Override public InstructionFactory getInstructionFactory() { return insts; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java index 78d4a8aad..22db21621 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java @@ -17,10 +17,12 @@ public class AstJavaAbstractInstructionVisitor implements AstJavaInstructionVisitor { + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java index d8a7fea7c..df128d6c9 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java @@ -51,6 +51,7 @@ public class AstJavaInvokeInstruction extends FixedParametersLexicalInvokeInstru super(results, params, exception, site, lexicalReads, lexicalWrites); } + @Override protected SSAInstruction copyInstruction(SSAInstructionFactory insts, int results[], int[] params, int exception, Access[] lexicalReads, Access[] lexicalWrites) { return ((AstJavaInstructionFactory) insts).JavaInvokeInstruction(results, params, exception, getCallSite(), lexicalReads, @@ -60,6 +61,7 @@ public class AstJavaInvokeInstruction extends FixedParametersLexicalInvokeInstru /** * @see com.ibm.domo.ssa.SSAInstruction#visit(IVisitor) */ + @Override public void visit(IVisitor v) { ((AstJavaInstructionVisitor) v).visitJavaInvoke(this); } @@ -69,6 +71,7 @@ public class AstJavaInvokeInstruction extends FixedParametersLexicalInvokeInstru * * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return JavaLanguage.getNullPointerException(); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java index 6584e38f0..e741ecf35 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java @@ -24,10 +24,12 @@ public class AstJavaNewEnclosingInstruction extends SSANewInstruction { int enclosing; + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return enclosing; @@ -42,14 +44,17 @@ public class AstJavaNewEnclosingInstruction extends SSANewInstruction { return this.enclosing; } + @Override public String toString() { return super.toString() + " ENCLOSING v" + enclosing; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstJavaInstructionFactory)insts).JavaNewEnclosingInstruction(defs==null? getDef(0): defs[0], getNewSite(), uses==null? enclosing: uses[0]); } + @Override public Collection getExceptionTypes() { return JavaLanguage.getNewScalarExceptions(); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java index c0352d815..c4feba6a1 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java @@ -35,20 +35,24 @@ public class EnclosingObjectReference extends SSAInstruction { this.type = type; } + @Override public boolean hasDef() { return true; } + @Override public int getDef() { return lval; } + @Override public int getDef(int i) { assert i == 0; return lval; } + @Override public int getNumberOfDefs() { return 1; } @@ -57,26 +61,32 @@ public class EnclosingObjectReference extends SSAInstruction { return type; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstJavaInstructionFactory) insts).EnclosingObjectReference(defs == null ? lval : defs[0], type); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, lval) + " = enclosing " + type.getName(); } + @Override public void visit(IVisitor v) { ((AstJavaInstructionVisitor) v).visitEnclosingObjectReference(this); } + @Override public int hashCode() { return lval * type.hashCode(); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } + @Override public boolean isFallThrough() { return true; } 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 26c30d542..b6c8dddaa 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 @@ -64,6 +64,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { return (JavaSourceLoaderImpl) loader; } + @Override protected boolean useDefaultInitValues() { return true; } @@ -71,35 +72,42 @@ public class JavaCAst2IRTranslator extends AstTranslator { // Java does not have standalone global variables, and let's not // adopt the nasty JavaScript practice of creating globals without // explicit definitions + @Override protected boolean hasImplicitGlobals() { return false; } + @Override protected TypeReference defaultCatchType() { return TypeReference.JavaLangThrowable; } + @Override protected TypeReference makeType(CAstType type) { return TypeReference.findOrCreate(loader.getReference(), TypeName.string2TypeName(type.getName())); } // Java globals are disguised as fields (statics), so we should never // ask this question when parsing Java code + @Override protected boolean treatGlobalsAsLexicallyScoped() { Assertions.UNREACHABLE(); return false; } + @Override protected void doThrow(WalkContext context, int exception) { context.cfg().addInstruction(insts.ThrowInstruction(exception)); } + @Override public void doArrayRead(WalkContext context, int result, int arrayValue, CAstNode arrayRefNode, int[] dimValues) { TypeReference arrayTypeRef = (TypeReference) arrayRefNode.getChild(1).getValue(); context.cfg().addInstruction(insts.ArrayLoadInstruction(result, arrayValue, dimValues[0], arrayTypeRef)); processExceptions(arrayRefNode, context); } + @Override public void doArrayWrite(WalkContext context, int arrayValue, CAstNode arrayRefNode, int[] dimValues, int rval) { TypeReference arrayTypeRef = arrayRefNode.getKind() == CAstNode.ARRAY_LITERAL ? ((TypeReference) arrayRefNode.getChild(0) .getChild(0).getValue()).getArrayElementType() : (TypeReference) arrayRefNode.getChild(1).getValue(); @@ -109,6 +117,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { processExceptions(arrayRefNode, context); } + @Override protected void doFieldRead(WalkContext context, int result, int receiver, CAstNode elt, CAstNode parent) { // elt is a constant CAstNode whose value is a FieldReference. FieldReference fieldRef = (FieldReference) elt.getValue(); @@ -122,6 +131,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected void doFieldWrite(WalkContext context, int receiver, CAstNode elt, CAstNode parent, int rval) { FieldReference fieldRef = (FieldReference) elt.getValue(); @@ -134,11 +144,13 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected void doMaterializeFunction(CAstNode n, WalkContext context, int result, int exception, CAstEntity fn) { // Not possible in Java (no free-standing functions) Assertions.UNREACHABLE("Real functions in Java??? I don't think so!"); } + @Override protected void doNewObject(WalkContext context, CAstNode newNode, int result, Object type, int[] arguments) { TypeReference typeRef = (TypeReference) type; @@ -169,6 +181,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected void doCall(WalkContext context, CAstNode call, int result, int exception, CAstNode name, int receiver, int[] arguments) { assert name.getKind() == CAstNode.CONSTANT; CallSiteReference dummySiteRef = (CallSiteReference) name.getValue(); @@ -193,10 +206,12 @@ public class JavaCAst2IRTranslator extends AstTranslator { Assertions.UNREACHABLE("doGlobalRead() called for Java code???"); } + @Override protected void doGlobalWrite(WalkContext context, String name, int rval) { Assertions.UNREACHABLE("doGlobalWrite() called for Java code???"); } + @Override protected void defineField(CAstEntity topEntity, WalkContext definingContext, CAstEntity n) { assert topEntity.getKind() == CAstEntity.TYPE_ENTITY; assert n.getKind() == CAstEntity.FIELD_ENTITY; @@ -214,6 +229,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { // handles abstract method declarations, which do not get defineFunction // called for them + @Override protected void declareFunction(CAstEntity N, WalkContext definingContext) { CAstType.Method methodType = (Method) N.getType(); CAstType owningType = methodType.getDeclaringType(); @@ -226,6 +242,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { ((JavaSourceLoaderImpl) loader).defineAbstractFunction(N, owner); } + @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { @@ -247,11 +264,13 @@ public class JavaCAst2IRTranslator extends AstTranslator { debugInfo); } + @Override protected void doPrimitive(int resultVal, WalkContext context, CAstNode primitiveCall) { // For now, no-op (no primitives in normal Java code) Assertions.UNREACHABLE("doPrimitive() called for Java code???"); } + @Override protected String composeEntityName(WalkContext parent, CAstEntity f) { switch (f.getKind()) { case CAstEntity.TYPE_ENTITY: { @@ -295,6 +314,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected boolean defineType(CAstEntity type, WalkContext wc) { CAstEntity parentType = getEnclosingType(type); // ((JavaSourceLoaderImpl)loader).defineType(type, @@ -302,6 +322,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { return ((JavaSourceLoaderImpl) loader).defineType(type, type.getType().getName(), parentType) != null; } + @Override protected void leaveThis(CAstNode n, WalkContext c, CAstVisitor visitor) { if (n.getChildCount() == 0) { super.leaveThis(n, c, visitor); @@ -312,12 +333,14 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected boolean visitCast(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.currentScope().allocateTempValue(); context.setValue(n, result); return false; } + @Override protected void leaveCast(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.getValue(n); CAstType toType = (CAstType) n.getChild(0).getValue(); @@ -347,12 +370,14 @@ processExceptions(n, context); } } + @Override protected boolean visitInstanceOf(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.currentScope().allocateTempValue(); context.setValue(n, result); return false; } + @Override protected void leaveInstanceOf(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.getValue(n); CAstType type = (CAstType) n.getChild(0).getValue(); @@ -365,6 +390,7 @@ processExceptions(n, context); ref)); } + @Override protected boolean doVisit(CAstNode n, WalkContext wc, CAstVisitor visitor) { if (n.getKind() == CAstNode.MONITOR_ENTER) { visitor.visit(n.getChild(0), wc, visitor); diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java index 8cd51be5a..2b098003b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java @@ -14,6 +14,7 @@ import com.ibm.wala.cast.tree.CAstEntity; public interface JavaProcedureEntity extends CAstEntity { + @Override public String getSignature(); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java index 37a4ecc2e..6f58b85ef 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java @@ -33,6 +33,7 @@ public class JavaPrimitiveTypeMap { fShortName = shortName; } + @Override public String getName() { return fShortName; } @@ -41,6 +42,7 @@ public class JavaPrimitiveTypeMap { return fLongName; } + @Override public Collection getSupertypes() { return Collections.EMPTY_LIST; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java index f29341b6d..0eb72eafd 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java @@ -16,5 +16,6 @@ package com.ibm.wala.cast.java.types; import com.ibm.wala.cast.tree.CAstType; public interface JavaType extends CAstType.Class { + @Override boolean isInterface(); } diff --git a/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java b/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java index 2a5aef99f..ee5ab89fa 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java +++ b/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java @@ -40,6 +40,7 @@ import com.ibm.wala.util.collections.Pair; public class NuValidatorHtmlParser implements IHtmlParser { + @Override public void parse(final URL url, final InputStream reader, final IHtmlCallback handler, final String fileName) { URL xx = null; try { @@ -65,18 +66,22 @@ public class NuValidatorHtmlParser implements IHtmlParser { return r.getLineNumber(); } + @Override public void setDocumentLocator(Locator locator) { this.locator = locator; } + @Override public void startElement(String uri, final String localName, String qName, final Attributes atts) throws SAXException { final Position line = new LineNumberPosition(url, localFileName, locator.getLineNumber()); tags.push(new ITag() { + @Override public String getName() { return localName; } + @Override public Pair getAttributeByName(String name) { if (atts.getValue(name) != null) { return Pair.make(atts.getValue(name), line); @@ -85,6 +90,7 @@ public class NuValidatorHtmlParser implements IHtmlParser { } } + @Override public Map> getAllAttributes() { return new AbstractMap>() { private Set>> es = null; @@ -97,10 +103,12 @@ public class NuValidatorHtmlParser implements IHtmlParser { final int index = i; es.add(new Map.Entry>() { + @Override public String getKey() { return atts.getLocalName(index).toLowerCase(); } + @Override public Pair getValue() { if (atts.getValue(index) != null) { return Pair.make(atts.getValue(index), line); @@ -109,6 +117,7 @@ public class NuValidatorHtmlParser implements IHtmlParser { } } + @Override public Pair setValue(Pair value) { throw new UnsupportedOperationException(); } @@ -120,10 +129,12 @@ public class NuValidatorHtmlParser implements IHtmlParser { }; } + @Override public Position getElementPosition() { return line; } + @Override public Position getContentPosition() { return line; } @@ -132,38 +143,47 @@ public class NuValidatorHtmlParser implements IHtmlParser { handler.handleStartTag(tags.peek()); } + @Override public void endElement(String uri, String localName, String qName) throws SAXException { handler.handleEndTag(tags.pop()); } + @Override public void characters(char[] ch, int start, int length) throws SAXException { handler.handleText(new LineNumberPosition(url, localFileName, locator.getLineNumber() - countLines(ch, start, length)), new String(ch, start, length)); } + @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { handler.handleText(new LineNumberPosition(url, localFileName, locator.getLineNumber()), new String(ch, start, length)); } + @Override public void startDocument() throws SAXException { // do nothing } + @Override public void endDocument() throws SAXException { // do nothing } + @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // do nothing } + @Override public void endPrefixMapping(String prefix) throws SAXException { // do nothing } + @Override public void processingInstruction(String target, String data) throws SAXException { // do nothing } + @Override public void skippedEntity(String name) throws SAXException { // do nothing } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java index 0e52c9ccf..37ce27f09 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java @@ -20,6 +20,7 @@ public class TestAjaxsltCallGraphShapeRhino extends TestAjaxsltCallGraphShape { justThisTest(TestAjaxsltCallGraphShapeRhino.class); } + @Override @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java index 33c698e5f..88078e56e 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java @@ -17,7 +17,8 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; public class TestArgumentSensitivityRhino extends TestArgumentSensitivity { - @Before + @Override + @Before public void setUp() { JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index 3f6d96c3a..438b13fde 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -22,11 +22,13 @@ import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.classLoader.SourceModule; public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtraction { - protected CorrelationFinder makeCorrelationFinder() { + @Override + protected CorrelationFinder makeCorrelationFinder() { return new CorrelationFinder(new CAstRhinoTranslatorFactory()); } - protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { + @Override + protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); CAstEntity entity = null; try { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java index 1726083d3..56075fdb7 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java @@ -20,7 +20,8 @@ import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.classLoader.SourceModule; public class TestForInBodyExtractionRhino extends TestForInBodyExtraction { - protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { + @Override + protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); CAstEntity entity = null; try { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java index 89a6146d0..e311a0268 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java @@ -16,7 +16,8 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; public class TestForInLoopHackRhino extends TestForInLoopHack { - @Before + @Override + @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java index ff84f65ad..6234ee49e 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java @@ -21,7 +21,8 @@ public class TestJQueryExamplesRhino extends TestJQueryExamples { justThisTest(TestJQueryExamplesRhino.class); } - @Before + @Override + @Before public void setUp() { JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java index fb9d14596..c6037220a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java @@ -20,6 +20,7 @@ public class TestMediawikiCallGraphShapeRhino extends TestMediawikiCallGraphShap justThisTest(TestMediawikiCallGraphShapeRhino.class); } + @Override @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index 2db00dfc1..2d5c95eef 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -16,7 +16,6 @@ import static com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFa import static com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.makeScriptScope; import java.io.IOException; -import java.net.URL; import java.util.Map; import junit.framework.Assert; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java index 323fa5eb8..9d55622c8 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java @@ -29,6 +29,7 @@ public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { justThisTest(TestSimpleCallGraphShapeRhino.class); } + @Override @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java index 147d55b91..ed9f0917c 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java @@ -52,13 +52,16 @@ public abstract class TestSimplePageCallGraphShapeRhino extends TestSimplePageCa justThisTest(TestSimplePageCallGraphShapeRhino.class); } - protected abstract IHtmlParser getParser(); + @Override + protected abstract IHtmlParser getParser(); - @Before + @Override + @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); WebUtil.setFactory(new IHtmlParserFactory() { - public IHtmlParser getParser() { + @Override + public IHtmlParser getParser() { return TestSimplePageCallGraphShapeRhino.this.getParser(); } }); diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java index 7bdb5294f..30cf60b93 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java @@ -15,7 +15,6 @@ import java.util.LinkedList; import java.util.List; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; -import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; @@ -34,6 +33,7 @@ public class CAstRhinoTranslator implements TranslatorToCAst { this.replicateForDoLoops = replicateForDoLoops; } + @Override public , K extends CopyKey> void addRewriter(CAstRewriterFactory factory, boolean prepend) { if(prepend) rewriters.add(0, factory); @@ -41,6 +41,7 @@ public class CAstRhinoTranslator implements TranslatorToCAst { rewriters.add(factory); } + @Override public CAstEntity translateToCAst() throws IOException, Error { String N; if (M instanceof SourceFileModule) { diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java index 57795bb14..9af82b065 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java @@ -16,7 +16,8 @@ import com.ibm.wala.classLoader.SourceModule; public class CAstRhinoTranslatorFactory implements JavaScriptTranslatorFactory { - public TranslatorToCAst make(CAst ast, SourceModule M) { + @Override + public TranslatorToCAst make(CAst ast, SourceModule M) { return new CAstRhinoTranslator(M, false); } } 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 e7026392a..af41d49c9 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 @@ -415,35 +415,43 @@ public class RhinoToAstTranslator { return ""; } + @Override public String getName() { return name; } + @Override public String getSignature() { Assertions.UNREACHABLE(); return null; } + @Override public int getKind() { return kind; } + @Override public String[] getArgumentNames() { return arguments; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return arguments.length; } + @Override public Map> getAllScopedEntities() { return Collections.unmodifiableMap(subs); } + @Override public Iterator getScopedEntities(CAstNode construct) { if (subs.containsKey(construct)) return subs.get(construct).iterator(); @@ -451,35 +459,43 @@ public class RhinoToAstTranslator { return EmptyIterator.instance(); } + @Override public CAstNode getAST() { return ast; } + @Override public CAstControlFlowMap getControlFlow() { return map; } + @Override public CAstSourcePositionMap getSourceMap() { return pos; } + @Override public CAstSourcePositionMap.Position getPosition() { return entityPosition; } + @Override public CAstNodeTypeMap getNodeTypeMap() { return null; } + @Override public Collection getAnnotations() { return null; } + @Override public Collection getQualifiers() { Assertions.UNREACHABLE("JuliansUnnamedCAstEntity$2.getQualifiers()"); return null; } + @Override public CAstType getType() { Assertions.UNREACHABLE("JuliansUnnamedCAstEntity$2.getType()"); return null; @@ -2263,6 +2279,7 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { class CAstErrorReporter implements ErrorReporter { private Warning w = null; + @Override public void error(final String arg0, final String arg1, final int arg2, final String arg3, int arg4) { w = new Warning(Warning.SEVERE) { @Override @@ -2272,11 +2289,13 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { }; } + @Override public EvaluatorException runtimeError(String arg0, String arg1, int arg2, String arg3, int arg4) { error(arg0, arg1, arg2, arg3, arg4); return null; } + @Override public void warning(String arg0, String arg1, int arg2, String arg3, int arg4) { // ignore warnings } diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java index 37f078a23..b6ccfccb2 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java @@ -34,7 +34,8 @@ public class Activator extends Plugin { * (non-Javadoc) * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -43,7 +44,8 @@ public class Activator extends Plugin { * (non-Javadoc) * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java index d20389728..349b43a77 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java @@ -100,7 +100,8 @@ public class CAstDumper { m.put(scopedEntity, e.getKey()); } Collections.sort(scopedEntities, new Comparator() { - public int compare(CAstEntity o1, CAstEntity o2) { + @Override + public int compare(CAstEntity o1, CAstEntity o2) { return o1.getName().compareTo(o2.getName()); } }); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java index c19414167..064812678 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java @@ -17,6 +17,7 @@ import com.ibm.wala.ipa.callgraph.CallGraph; public abstract class TestJSCallGraphShape extends TestCallGraphShape { + @Override protected Collection getNodes(CallGraph CG, String functionIdentifier) { return JSCallGraphBuilderUtil.getNodes(CG, functionIdentifier); } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index ac5bc0655..552a4dba3 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -683,13 +683,17 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { B.getOptions().setTraceStringConstants(true); final long startTime = System.currentTimeMillis(); CallGraph CG = B.makeCallGraph(B.getOptions(), new IProgressMonitor() { + @Override public void beginTask(String task, int totalWork) { } + @Override public boolean isCanceled() { return System.currentTimeMillis() > (startTime + 10000L); } + @Override public void done() { } + @Override public void worked(int units) { } }); @@ -720,6 +724,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { if (pointsToSet == null || pointsToSet.getBackingSet() == null) continue; pointsToSet.getBackingSet().foreach(new IntSetAction() { + @Override public void act(int ikId) { Set> s = ret.get(ikId); if (s == null) { diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java index 3e8c25d7e..8b2bf58b8 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java @@ -32,9 +32,11 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape protected abstract IHtmlParser getParser(); + @Override @Before public void setUp() { WebUtil.setFactory(new IHtmlParserFactory() { + @Override public IHtmlParser getParser() { return getParser(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java index 0dd6d0e41..febd89ea8 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java @@ -36,14 +36,16 @@ public class JavaScriptPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; resourceBundle = null; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java index 3bb968ead..6fd54b9c7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java @@ -37,30 +37,38 @@ public class JSTypeInference extends AstTypeInference { super(ir, cha, new PointType(cha.lookupClass(JavaScriptTypes.Boolean)), true); } + @Override protected void initialize() { class JSTypeOperatorFactory extends AstTypeOperatorFactory implements com.ibm.wala.cast.js.ssa.JSInstructionVisitor { + @Override public void visitJavaScriptInvoke(JavaScriptInvoke inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.String))); } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf inst) { result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.Boolean))); } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -81,6 +89,7 @@ public class JSTypeInference extends AstTypeInference { return new PointType(cha.lookupClass(typeRef)); } + @Override public IVariable makeVariable(int vn) { if (ir.getSymbolTable().isStringConstant(vn)) { return new TypeVariable(make(JavaScriptTypes.String)); @@ -100,6 +109,7 @@ public class JSTypeInference extends AstTypeInference { init(ir, new JSTypeVarFactory(), new JSTypeOperatorFactory()); } + @Override public TypeAbstraction getConstantType(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java index 393287ffb..5cd6cbe95 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java @@ -115,6 +115,7 @@ public class FlowGraph implements Iterable { return graph.getSuccNodes(v); } + @Override public Iterator iterator() { return graph.iterator(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java index 8bdbf4385..46140b1bb 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java @@ -20,35 +20,43 @@ public class AbstractVertexVisitor implements VertexVisitor { return null; } - public T visitVarVertex(VarVertex varVertex) { + @Override + public T visitVarVertex(VarVertex varVertex) { return visitVertex(varVertex); } - public T visitPropVertex(PropVertex propVertex) { + @Override + public T visitPropVertex(PropVertex propVertex) { return visitVertex(propVertex); } - public T visitUnknownVertex(UnknownVertex unknownVertex) { + @Override + public T visitUnknownVertex(UnknownVertex unknownVertex) { return visitVertex(unknownVertex); } - public T visitFuncVertex(FuncVertex funcVertex) { + @Override + public T visitFuncVertex(FuncVertex funcVertex) { return visitVertex(funcVertex); } - public T visitParamVertex(ParamVertex paramVertex) { + @Override + public T visitParamVertex(ParamVertex paramVertex) { return visitVertex(paramVertex); } - public T visitRetVertex(RetVertex retVertex) { + @Override + public T visitRetVertex(RetVertex retVertex) { return visitVertex(retVertex); } - public T visitCalleeVertex(CallVertex calleeVertex) { + @Override + public T visitCalleeVertex(CallVertex calleeVertex) { return visitVertex(calleeVertex); } - public T visitLexicalAccessVertex(LexicalVarVertex lexicalAccessVertex) { + @Override + public T visitLexicalAccessVertex(LexicalVarVertex lexicalAccessVertex) { return visitVertex(lexicalAccessVertex); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java index 0ff1d75ea..2b5451efb 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java @@ -37,27 +37,34 @@ public class JSInducedCFG extends AstInducedCFG { super(r); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke inst) { breakBasicBlock(); } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { breakBasicBlock(); } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -77,24 +84,31 @@ public class JSInducedCFG extends AstInducedCFG { super(r); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke inst) { } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -107,10 +121,12 @@ public class JSInducedCFG extends AstInducedCFG { } } + @Override protected BranchVisitor makeBranchVisitor(boolean[] r) { return new JSBranchVisitor(r); } + @Override protected PEIVisitor makePEIVisitor(boolean[] r) { return new JSPEIVisitor(r); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java index 72259e869..80425faad 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java @@ -45,6 +45,7 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { public JavaScriptAnalysisEngine() { } + @Override public void buildAnalysisScope() { try { loaderFactory = new JavaScriptLoaderFactory(translatorFactory); @@ -57,6 +58,7 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { } } + @Override public IClassHierarchy buildClassHierarchy() { try { return ClassHierarchy.make(getScope(), loaderFactory, JavaScriptLoader.JS); @@ -70,14 +72,17 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { this.translatorFactory = factory; } + @Override public void setJ2SELibraries(JarFile[] libs) { Assertions.UNREACHABLE("Illegal to call setJ2SELibraries"); } + @Override public void setJ2SELibraries(Module[] libs) { Assertions.UNREACHABLE("Illegal to call setJ2SELibraries"); } + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return new JavaScriptEntryPoints(cha, cha.getLoader(JavaScriptTypes.jsLoader)); } @@ -87,6 +92,7 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { return new AnalysisCache(AstIRFactory.makeDefaultFactory()); } + @Override public AnalysisOptions getDefaultOptions(Iterable roots) { final AnalysisOptions options = new AnalysisOptions(scope, roots); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index 900ff7668..4ee690d1b 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -67,6 +67,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { return governingTag.getElementPosition(); } + @Override public void handleEndTag(ITag tag) { if (tag.getName().equalsIgnoreCase("script")) { assert currentScriptTag != null; @@ -74,6 +75,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } } + @Override public void handleText(Position p, String text) { if (currentScriptTag != null) { if (text.startsWith("> getAllAttributes() { + @Override + public Map> getAllAttributes() { if (allAttributes == null) { allAttributes = makeAllAttributes(); } return allAttributes; } - public Pair getAttributeByName(String name) { + @Override + public Pair getAttributeByName(String name) { if (allAttributes == null) { allAttributes = makeAllAttributes(); } @@ -128,7 +130,8 @@ public class JerichoTag implements ITag { return sourceFile; } - public String getName() { + @Override + public String getName() { return innerElement.getName(); } @@ -137,11 +140,13 @@ public class JerichoTag implements ITag { return innerElement.toString(); } - public Position getElementPosition() { + @Override + public Position getElementPosition() { return getPosition(innerElement); } - public Position getContentPosition() { + @Override + public Position getContentPosition() { return getPosition(innerElement.getContent()); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java index 75258a53b..f1ccbeb48 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java @@ -70,6 +70,7 @@ public class ArgumentSpecialization { } } + @Override public DefUse getDU(CGNode node) { if (node.getMethod() instanceof Retranslatable) { return getAnalysisCache().getSSACache().findOrCreateDU(node.getMethod(), node.getContext(), options.getSSAOptions()); @@ -84,15 +85,18 @@ public class ArgumentSpecialization { private final int argumentCount; public static ContextKey ARGUMENT_COUNT = new ContextKey() { + @Override public String toString() { return "argument count key"; } }; + @Override public int hashCode() { return base.hashCode() + (argumentCount * 4073); } + @Override public boolean equals(Object o) { return o.getClass() == this.getClass() && @@ -105,10 +109,12 @@ public class ArgumentSpecialization { this.base = base; } + @Override public ContextItem get(ContextKey name) { return (name == ARGUMENT_COUNT)? ContextItem.Value.make(argumentCount): base.get(name); } + @Override public String toString() { return base.toString() + "(nargs:" + argumentCount + ")"; } @@ -121,6 +127,7 @@ public class ArgumentSpecialization { this.base = base; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); if (caller.getMethod() instanceof Retranslatable) { @@ -141,6 +148,7 @@ public class ArgumentSpecialization { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return base.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java index f4fea43ac..37ed56413 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java @@ -33,10 +33,12 @@ public class GlobalObjectKey implements InstanceKey { this.concreteType = concreteType; } + @Override public IClass getConcreteType() { return concreteType; } + @Override public String toString() { return "JS Global Object"; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java index 0224c774f..33a4f2f8e 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java @@ -105,6 +105,7 @@ public abstract class JSCFABuilder extends JSSSAPropagationCallGraphBuilder { * All values used as property names get implicitly converted to strings in JavaScript. * @see com.ibm.wala.cast.ipa.callgraph.DelegatingAstPointerKeys#getFieldNameType(com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override protected IClass getFieldNameType(InstanceKey F) { return F.getConcreteType().getClassHierarchy().lookupClass(JavaScriptTypes.String); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java index d30bd1a93..fc2e27407 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java @@ -50,10 +50,12 @@ public class JSCallGraph extends AstCallGraph { super(fakeRoot, cha.lookupClass(JavaScriptTypes.FakeRoot), cha, options, cache); } + @Override public InducedCFG makeControlFlowGraph(SSAInstruction[] instructions) { return new JSInducedCFG(instructions, this, Everywhere.EVERYWHERE); } + @Override public SSANewInstruction addAllocation(TypeReference T) { if (cha.isSubclassOf(cha.lookupClass(T), cha.lookupClass(JavaScriptTypes.Root))) { int instance = nextLocal++; @@ -66,6 +68,7 @@ public class JSCallGraph extends AstCallGraph { } } + @Override public SSAAbstractInvokeInstruction addDirectCall(int function, int[] params, CallSiteReference site) { CallSiteReference newSite = new JSCallSiteReference(statements.size()); @@ -81,6 +84,7 @@ public class JSCallGraph extends AstCallGraph { return null; } + @Override protected CGNode makeFakeRootNode() throws com.ibm.wala.util.CancelException { return findOrCreateNode(new JSFakeRoot(cha, options, getAnalysisCache()), Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index cc331aab0..83fedd8e1 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -141,6 +141,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(cha, options, cache, pointerKeyFactory); } + @Override protected boolean isConstantRef(SymbolTable symbolTable, int valueNumber) { if (valueNumber == -1) { return false; @@ -154,10 +155,12 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph // // /////////////////////////////////////////////////////////////////////////// + @Override protected boolean useObjectCatalog() { return true; } + @Override protected boolean isUncataloguedField(IClass type, String fieldName) { if (!type.getReference().equals(JavaScriptTypes.Object)) { return true; @@ -181,6 +184,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph assert f != null : "couldn't resolve " + varName; return getPointerKeyForInstanceField(globalObject, f); } + @Override protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new JSCallGraph(cha, options, getAnalysisCache()); } @@ -204,6 +208,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph return ti; } + @Override protected void addAssignmentsForCatchPointerKey(PointerKey exceptionVar, Set catchClasses, PointerKey e) { system.newConstraint(exceptionVar, assignOperator, e); } @@ -213,34 +218,42 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(vn); } + @Override public void visitBinaryOp(final SSABinaryOpInstruction instruction) { bingo = true; } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { bingo = true; } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { bingo = true; } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { bingo = true; } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { bingo = true; } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { bingo = true; } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -256,6 +269,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new JSInterestingVisitor(vn); } @@ -280,30 +294,37 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(analysis, lpk); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction instruction) { } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -338,13 +359,16 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph }; + @Override protected ImplicitPointsToSetVisitor makeImplicitPointsToVisitor(LocalPointerKey lpk) { return new JSImplicitPointsToSetVisitor(this, lpk); } }; + @Override protected PropagationSystem makeSystem(AnalysisOptions options) { return new PropagationSystem(callGraph, pointerKeyFactory, instanceKeyFactory) { + @Override public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) { return new JSPointerAnalysisImpl(builder, cg, pointsToMap, instanceKeys, pointerKeyFactory, instanceKeyFactory); } @@ -357,6 +381,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph // // /////////////////////////////////////////////////////////////////////////// + @Override protected JSConstraintVisitor makeVisitor(CGNode node) { if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) { final IMethod method = node.getMethod(); @@ -387,10 +412,12 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(builder, node); } + @Override protected JSSSAPropagationCallGraphBuilder getBuilder() { return (JSSSAPropagationCallGraphBuilder) builder; } + @Override public void visitUnaryOp(SSAUnaryOpInstruction inst) { if (inst.getOpcode() == IUnaryOpInstruction.Operator.NEG) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); @@ -411,19 +438,23 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph system.newConstraint(lk, key); } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf inst) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction instruction) { addLvalTypeKeyConstraint(instruction, JavaScriptTypes.String); } @@ -476,10 +507,12 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } + @Override public void visitBinaryOp(final SSABinaryOpInstruction instruction) { handleBinaryOp(instruction, node, symbolTable, du); } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) { Position instructionPosition = getInstructionPosition(instruction); @@ -503,6 +536,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph return null; } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) { Position instructionPosition = getInstructionPosition(instruction); @@ -513,6 +547,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph newFieldWrite(node, instruction.getUse(0), instruction.getUse(1), instruction.getUse(2)); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { if (instruction.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) { handleJavascriptDispatch(instruction); @@ -675,14 +710,17 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph return instruction; } + @Override public String toString() { return "BinOp: " + getInstruction(); } + @Override public int hashCode() { return 17 * getInstruction().getUse(0) * getInstruction().getUse(1); } + @Override public boolean equals(Object o) { if (o instanceof BinaryOperator) { BinaryOperator op = (BinaryOperator) o; @@ -704,6 +742,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } else { final Set temp = HashSetFactory.make(); v.getValue().foreach(new IntSetAction() { + @Override public void act(int keyIndex) { temp.add(system.getInstanceKey(keyIndex)); } @@ -728,6 +767,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } } + @Override public byte evaluate(PointsToSetVariable lhs, final PointsToSetVariable[] rhs) { boolean doDefault = false; byte changed = NOT_CHANGED; @@ -823,11 +863,13 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { // TODO Auto-generated method stub } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { // TODO Auto-generated method stub diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java index 378b5d7c4..73dfb74a1 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java @@ -23,16 +23,19 @@ public class JSSyntheticParameterKey extends NodeKey { this.param = param; } + @Override public boolean equals(Object o) { return (o instanceof JSSyntheticParameterKey) && ((JSSyntheticParameterKey)o).param == param && internalEquals(o); } + @Override public int hashCode() { return param*getNode().hashCode(); } + @Override public String toString() { return "p" + param + ":" + getNode().getMethod().getName(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java index b99f679a6..e48211396 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java @@ -67,6 +67,7 @@ public class JavaScriptConstructTargetSelector implements MethodTargetSelector { this(ref, summary, declaringClass, ""); } + @Override public String toString() { return ""; } @@ -552,6 +553,7 @@ public class JavaScriptConstructTargetSelector implements MethodTargetSelector { } } + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { if (site.getDeclaredTarget().equals(JavaScriptMethods.ctorReference)) { assert cha.isSubclassOf(receiver, cha.lookupClass(JavaScriptTypes.Root)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java index 5b9462baa..6520fb6d9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java @@ -26,6 +26,7 @@ public class JavaScriptConstructorInstanceKeys implements InstanceKeyFactory { this.base = base; } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { if (node.getMethod() instanceof JavaScriptConstructTargetSelector.JavaScriptConstructor) { InstanceKey bk = base.getInstanceKeyForAllocation(node, allocation); @@ -35,18 +36,22 @@ public class JavaScriptConstructorInstanceKeys implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return base.getInstanceKeyForClassObject(type); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { return base.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return base.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return base.getInstanceKeyForPEI(node, instr, type); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java index 140f2b45f..5dc7d697c 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java @@ -20,6 +20,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; public class JavaScriptEntryPoints extends ScriptEntryPoints { + @Override protected CallSiteReference makeScriptSite(IMethod m, int pc) { return new JSCallSiteReference(pc); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java index 49771f54f..e472f49a4 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java @@ -52,6 +52,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { this.oneLevel = new OneLevelSiteContextSelector(base); } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { // 0 for function (synthetic apply), 1 for this (function being invoked), 2 // for this arg of function being invoked, @@ -77,6 +78,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { this.isNonNullArray = ContextItem.Value.make(isNonNullArray); } + @Override public ContextItem get(ContextKey name) { if (APPLY_NON_NULL_ARGS.equals(name)) { return isNonNullArray; @@ -117,6 +119,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { IClass declaringClass = callee.getDeclaringClass(); IMethod method = declaringClass.getMethod(AstMethodReference.fnSelector); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java index 2663e97aa..58dc7c970 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java @@ -74,6 +74,7 @@ public class JavaScriptFunctionDotCallTargetSelector implements MethodTargetSele * .wala.ipa.callgraph.CGNode, com.ibm.wala.classLoader.CallSiteReference, * com.ibm.wala.classLoader.IClass) */ + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { IMethod method = receiver.getMethod(AstMethodReference.fnSelector); if (method != null) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java index 1de58778a..afb7473e7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java @@ -56,6 +56,7 @@ public class JavaScriptScopeMappingInstanceKeys extends ScopeMappingInstanceKeys return function==null? new LexicalParent[0]: function.getParents(); } + @Override protected boolean needsScopeMappingKey(InstanceKey base) { return cha.isSubclassOf(base.getConcreteType(), codeBody) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java index cab685b70..25180c415 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java @@ -48,6 +48,7 @@ public class LoadFileTargetSelector implements MethodTargetSelector { private final HashSet loadedFiles = HashSetFactory.make(); + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { IMethod target = base.getCalleeTarget(caller, site, receiver); if (target != null && target.getReference().equals(loadFileFunRef)) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java index b4b8ebbcd..4b0e41fdc 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java @@ -62,6 +62,7 @@ public class ObjectSensitivityContextSelector implements ContextSelector { return false; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] arguments) { Context baseContext = base.getCalleeTarget(caller, site, callee, arguments); if(returnsThis(callee)) { @@ -72,6 +73,7 @@ public class ObjectSensitivityContextSelector implements ContextSelector { return baseContext; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (caller.getIR().getCalls(site)[0].getNumberOfUses() > 1) { return IntSetUtil.make(new int[]{1}).union(base.getRelevantParameters(caller, site)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index ec5d4d8fa..c14306c5e 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -14,13 +14,10 @@ import java.util.Collections; import java.util.HashMap; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; -import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.ClosureExtractor; -import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.classLoader.CallSiteReference; -import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.CGNode; @@ -28,18 +25,14 @@ import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; -import com.ibm.wala.ipa.callgraph.impl.Everywhere; -import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; -import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.ReflectiveMemberAccess; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; import com.ibm.wala.ssa.SSAGetInstruction; import com.ibm.wala.ssa.SSAInstruction; -import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Iterator2Iterable; @@ -211,6 +204,7 @@ public class PropertyNameContextSelector implements ContextSelector { return f; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); @@ -234,6 +228,7 @@ public class PropertyNameContextSelector implements ContextSelector { } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (caller.getIR().getCalls(site)[0].getNumberOfUses() > index) { return IntSetUtil.make(new int[]{index}).union(base.getRelevantParameters(caller, site)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java index 65c41bbdb..993f500f3 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java @@ -44,6 +44,7 @@ public class SelectiveCPAContext implements Context { hashCode = base.hashCode() ^ parameterObjs.hashCode(); } + @Override public ContextItem get(ContextKey name) { if (parameterObjs.containsKey(name)) { return new FilteredPointerKey.SingleInstanceFilter(parameterObjs.get(name)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java index d5a85293c..f4ce25f44 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java @@ -23,15 +23,18 @@ public class TransitivePrototypeKey extends AbstractFieldPointerKey { super(object); } + @Override public boolean equals(Object x) { return (x instanceof TransitivePrototypeKey) && ((TransitivePrototypeKey)x).getInstanceKey().equals(getInstanceKey()); } + @Override public int hashCode() { return getInstanceKey().hashCode(); } + @Override public String toString() { return ""; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 05e1d5037..228b8bb1f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -244,6 +244,7 @@ public class CorrelationFinder { correlations.addAll(summary.pp()); Collections.sort(correlations, new Comparator>() { + @Override @SuppressWarnings("unchecked") public int compare(Pair o1, Pair o2) { return o1.fst.compareTo(o2.fst); 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 5f05ea121..a9ecde373 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 @@ -50,7 +50,6 @@ import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder; import com.ibm.wala.cast.tree.impl.CAstOperator; import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; -import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; @@ -534,10 +533,15 @@ public class ClosureExtractor extends CAstRewriterExt { theChildren.putAll(copyChildren(root.getChild(i), nodes, entity.getAllScopedEntities())); Rewrite rw = new Rewrite() { + @Override public CAstNode newRoot() { return newRoot; } + @Override public CAstControlFlowMap newCfg() { return theCfg; } + @Override public CAstSourcePositionMap newPos() { return theSource; } + @Override public CAstNodeTypeMap newTypes() { return theTypes; } + @Override public Map> newChildren() { return theChildren; } }; new_entity.setRewrite(rw); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index f2c233b7d..1b2bf4131 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -13,7 +13,6 @@ package com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction; import java.io.IOException; import java.net.URL; -import java.util.Collection; import java.util.Map; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; @@ -42,6 +41,7 @@ public class CorrelatedPairExtractorFactory implements CAstRewriterFactory> getAllScopedEntities() { + @Override + public Map> getAllScopedEntities() { if(scopedEntities == null) { scopedEntities = HashMapFactory.make(); // first, add all existing entities inside the body of this for loop @@ -126,7 +133,8 @@ class ExtractedFunction implements CAstEntity { return scopedEntities; } - public Iterator getScopedEntities(CAstNode construct) { + @Override + public Iterator getScopedEntities(CAstNode construct) { if(getAllScopedEntities().containsKey(construct)) { return getAllScopedEntities().get(construct).iterator(); } else { @@ -134,31 +142,38 @@ class ExtractedFunction implements CAstEntity { } } - public CAstNode getAST() { + @Override + public CAstNode getAST() { return root; } - public CAstControlFlowMap getControlFlow() { + @Override + public CAstControlFlowMap getControlFlow() { return cfg; } - public CAstSourcePositionMap getSourceMap() { + @Override + public CAstSourcePositionMap getSourceMap() { return posmap; } - public Position getPosition() { + @Override + public Position getPosition() { return getSourceMap().getPosition(root); } - public CAstNodeTypeMap getNodeTypeMap() { + @Override + public CAstNodeTypeMap getNodeTypeMap() { return types; } - public Collection getQualifiers() { + @Override + public Collection getQualifiers() { return null; } - public CAstType getType() { + @Override + public CAstType getType() { return null; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java index a0a5408a8..ff4888ee2 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java @@ -26,7 +26,8 @@ import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; public abstract class NodePos implements CAstRewriter.RewriteContext { public abstract A accept(PosSwitch ps); - public NoKey key() { + @Override + public NoKey key() { return null; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java index a7e2ad784..cd4ca9365 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java @@ -25,10 +25,12 @@ public class JavaScriptSummarizedFunction extends SummarizedMethod { super(ref, summary, declaringClass); } + @Override public boolean equals(Object o) { return this == o; } + @Override public InducedCFG makeControlFlowGraph(SSAInstruction[] instructions) { return new JSInducedCFG(instructions, this, Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java index b7a1acc02..635f56ac6 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java @@ -33,10 +33,12 @@ public class JavaScriptSummary extends MethodSummary { } + @Override public int getNumberOfParameters() { return declaredParameters; } + @Override public TypeReference getParameterType(int i) { return JavaScriptTypes.Root; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java index debf4d214..ff978cd13 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java @@ -23,6 +23,7 @@ public class JSCallSiteReference extends CallSiteReference { public static enum Dispatch implements IInvokeInstruction.IDispatch { JS_CALL; + @Override public boolean hasImplicitThis() { return false; } @@ -36,10 +37,12 @@ public class JSCallSiteReference extends CallSiteReference { this(AstMethodReference.fnReference(JavaScriptTypes.CodeBody), pc); } + @Override public IInvokeInstruction.IDispatch getInvocationCode() { return Dispatch.JS_CALL; } + @Override public String toString() { return "JSCall@" + getProgramCounter(); } 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 76e1760f4..9e00784e2 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 @@ -127,18 +127,22 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { JSPrimitiveType.init(); } + @Override public Atom getName() { return Atom.findOrCreateUnicodeAtom("JavaScript"); } + @Override public TypeReference getRootType() { return JavaScriptTypes.Root; } + @Override public TypeReference getThrowableType() { return JavaScriptTypes.Root; } + @Override public TypeReference getConstantType(Object o) { if (o == null) { return JavaScriptTypes.Null; @@ -161,14 +165,17 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } } + @Override public boolean isNullType(TypeReference type) { return type.equals(JavaScriptTypes.Undefined) || type.equals(JavaScriptTypes.Null); } + @Override public TypeReference[] getArrayInterfaces() { return new TypeReference[0]; } + @Override public TypeName lookupPrimitiveType(String name) { if ("Boolean".equals(name)) { return JavaScriptTypes.Boolean.getName(); @@ -184,61 +191,75 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } } + @Override public Collection inferInvokeExceptions(MethodReference target, IClassHierarchy cha) throws InvalidClassFileException { return Collections.singleton(JavaScriptTypes.Root); } + @Override public Object getMetadataToken(Object value) { assert false; return null; } + @Override public TypeReference getPointerType(TypeReference pointee) throws UnsupportedOperationException { throw new UnsupportedOperationException("JavaScript does not permit explicit pointers"); } + @Override public JSInstructionFactory instructionFactory() { return new JSInstructionFactory() { + @Override public JavaScriptCheckReference CheckReference(int ref) { return new JavaScriptCheckReference(ref); } + @Override public SSAGetInstruction GetInstruction(int result, int ref, String field) { return GetInstruction(result, ref, FieldReference.findOrCreate(JavaScriptTypes.Root, Atom.findOrCreateUnicodeAtom(field), JavaScriptTypes.Root)); } + @Override public JavaScriptInstanceOf InstanceOf(int result, int objVal, int typeVal) { return new JavaScriptInstanceOf(result, objVal, typeVal); } + @Override public JavaScriptInvoke Invoke(int function, int[] results, int[] params, int exception, CallSiteReference site) { return new JavaScriptInvoke(function, results, params, exception, site); } + @Override public JavaScriptInvoke Invoke(int function, int[] results, int[] params, int exception, CallSiteReference site, Access[] lexicalReads, Access[] lexicalWrites) { return new JavaScriptInvoke(function, results, params, exception, site, lexicalReads, lexicalWrites); } + @Override public JavaScriptInvoke Invoke(int function, int result, int[] params, int exception, CallSiteReference site) { return new JavaScriptInvoke(function, result, params, exception, site); } + @Override public JavaScriptInvoke Invoke(int function, int[] params, int exception, CallSiteReference site) { return new JavaScriptInvoke(function, params, exception, site); } + @Override public JavaScriptPropertyRead PropertyRead(int result, int objectRef, int memberRef) { return new JavaScriptPropertyRead(result, objectRef, memberRef); } + @Override public JavaScriptPropertyWrite PropertyWrite(int objectRef, int memberRef, int value) { return new JavaScriptPropertyWrite(objectRef, memberRef, value); } + @Override public SSAPutInstruction PutInstruction(int ref, int value, String field) { try { byte[] utf8 = field.getBytes("UTF-8"); @@ -250,101 +271,126 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } } + @Override public JavaScriptTypeOfInstruction TypeOfInstruction(int lval, int object) { return new JavaScriptTypeOfInstruction(lval, object); } + @Override public JavaScriptWithRegion WithRegion(int expr, boolean isEnter) { return new JavaScriptWithRegion(expr, isEnter); } + @Override public AstAssertInstruction AssertInstruction(int value, boolean fromSpecification) { return new AstAssertInstruction(value, fromSpecification); } + @Override public com.ibm.wala.cast.ir.ssa.AssignInstruction AssignInstruction(int result, int val) { return new AssignInstruction(result, val); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementGetInstruction EachElementGetInstruction(int value, int objectRef) { return new EachElementGetInstruction(value, objectRef); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction EachElementHasNextInstruction(int value, int objectRef) { return new EachElementHasNextInstruction(value, objectRef); } + @Override public AstEchoInstruction EchoInstruction(int[] rvals) { return new AstEchoInstruction(rvals); } + @Override public AstGlobalRead GlobalRead(int lhs, FieldReference global) { return new AstGlobalRead(lhs, global); } + @Override public AstGlobalWrite GlobalWrite(FieldReference global, int rhs) { return new AstGlobalWrite(global, rhs); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal, FieldReference fieldRef) { return new AstIsDefinedInstruction(lval, rval, fieldVal, fieldRef); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, FieldReference fieldRef) { return new AstIsDefinedInstruction(lval, rval, fieldRef); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal) { return new AstIsDefinedInstruction(lval, rval, fieldVal); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval) { return new AstIsDefinedInstruction(lval, rval); } + @Override public AstLexicalRead LexicalRead(Access[] accesses) { return new AstLexicalRead(accesses); } + @Override public AstLexicalRead LexicalRead(Access access) { return new AstLexicalRead(access); } + @Override public AstLexicalRead LexicalRead(int lhs, String definer, String globalName) { return new AstLexicalRead(lhs, definer, globalName); } + @Override public AstLexicalWrite LexicalWrite(Access[] accesses) { return new AstLexicalWrite(accesses); } + @Override public AstLexicalWrite LexicalWrite(Access access) { return new AstLexicalWrite(access); } + @Override public AstLexicalWrite LexicalWrite(String definer, String globalName, int rhs) { return new AstLexicalWrite(definer, globalName, rhs); } + @Override public SSAArrayLengthInstruction ArrayLengthInstruction(int result, int arrayref) { throw new UnsupportedOperationException(); } + @Override public SSAArrayLoadInstruction ArrayLoadInstruction(int result, int arrayref, int index, TypeReference declaredType) { throw new UnsupportedOperationException(); } + @Override public SSAArrayStoreInstruction ArrayStoreInstruction(int arrayref, int index, int value, TypeReference declaredType) { throw new UnsupportedOperationException(); } + @Override public SSABinaryOpInstruction BinaryOpInstruction(IOperator operator, boolean overflow, boolean unsigned, int result, int val1, int val2, boolean mayBeInteger) { return new SSABinaryOpInstruction(operator, result, val1, val2, mayBeInteger) { + @Override public boolean isPEI() { return false; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return insts.BinaryOpInstruction(getOperator(), false, false, defs == null || defs.length == 0 ? getDef(0) : defs[0], uses == null ? getUse(0) : uses[0], uses == null ? getUse(1) : uses[1], mayBeIntegerOp()); @@ -352,33 +398,40 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { }; } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference[] types, boolean isPEI) { throw new UnsupportedOperationException(); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int[] typeValues, boolean isPEI) { throw new UnsupportedOperationException(); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int typeValue, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new int[]{ typeValue }, true); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference type, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new TypeReference[]{ type }, true); } + @Override public SSAComparisonInstruction ComparisonInstruction(Operator operator, int result, int val1, int val2) { return new SSAComparisonInstruction(operator, result, val1, val2); } + @Override public SSAConditionalBranchInstruction ConditionalBranchInstruction( com.ibm.wala.shrikeBT.IConditionalBranchInstruction.IOperator operator, TypeReference type, int val1, int val2) { return new SSAConditionalBranchInstruction(operator, type, val1, val2); } + @Override public SSAConversionInstruction ConversionInstruction(int result, int val, TypeReference fromType, TypeReference toType, boolean overflow) { assert !overflow; @@ -394,127 +447,158 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { }; } + @Override public SSAGetCaughtExceptionInstruction GetCaughtExceptionInstruction(int bbNumber, int exceptionValueNumber) { return new SSAGetCaughtExceptionInstruction(bbNumber, exceptionValueNumber); } + @Override public SSAGetInstruction GetInstruction(int result, FieldReference field) { throw new UnsupportedOperationException(); } + @Override public SSAGetInstruction GetInstruction(int result, int ref, FieldReference field) { return new SSAGetInstruction(result, ref, field) { + @Override public boolean isPEI() { return false; } }; } + @Override public SSAGotoInstruction GotoInstruction() { return new SSAGotoInstruction(); } + @Override public SSAInstanceofInstruction InstanceofInstruction(int result, int ref, TypeReference checkedType) { throw new UnsupportedOperationException(); } + @Override public SSAInvokeInstruction InvokeInstruction(int result, int[] params, int exception, CallSiteReference site) { throw new UnsupportedOperationException(); } + @Override public SSAInvokeInstruction InvokeInstruction(int[] params, int exception, CallSiteReference site) { throw new UnsupportedOperationException(); } + @Override public SSALoadMetadataInstruction LoadMetadataInstruction(int lval, TypeReference entityType, Object token) { throw new UnsupportedOperationException(); } + @Override public SSAMonitorInstruction MonitorInstruction(int ref, boolean isEnter) { throw new UnsupportedOperationException(); } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site) { return new SSANewInstruction(result, site) { + @Override public boolean isPEI() { return true; } + @Override public Collection getExceptionTypes() { return Collections.singleton(JavaScriptTypes.TypeError); } }; } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site, int[] params) { throw new UnsupportedOperationException(); } + @Override public SSAPhiInstruction PhiInstruction(int result, int[] params) { return new SSAPhiInstruction(result, params); } + @Override public SSAPiInstruction PiInstruction(int result, int val, int piBlock, int successorBlock, SSAInstruction cause) { return new SSAPiInstruction(result, val, piBlock, successorBlock, cause); } + @Override public SSAPutInstruction PutInstruction(int ref, int value, FieldReference field) { return new SSAPutInstruction(ref, value, field) { + @Override public boolean isPEI() { return false; } }; } + @Override public SSAPutInstruction PutInstruction(int value, FieldReference field) { throw new UnsupportedOperationException(); } + @Override public SSAReturnInstruction ReturnInstruction() { return new SSAReturnInstruction(); } + @Override public SSAReturnInstruction ReturnInstruction(int result, boolean isPrimitive) { return new SSAReturnInstruction(result, isPrimitive); } + @Override public SSASwitchInstruction SwitchInstruction(int val, int defaultLabel, int[] casesAndLabels) { return new SSASwitchInstruction(val, defaultLabel, casesAndLabels); } + @Override public SSAThrowInstruction ThrowInstruction(int exception) { return new SSAThrowInstruction(exception) { + @Override public boolean isPEI() { return true; } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } }; } + @Override public SSAUnaryOpInstruction UnaryOpInstruction(com.ibm.wala.shrikeBT.IUnaryOpInstruction.IOperator operator, int result, int val) { return new SSAUnaryOpInstruction(operator, result, val); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, int indexVal, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, FieldReference field, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSALoadIndirectInstruction LoadIndirectInstruction(int lval, TypeReference t, int addressVal) { throw new UnsupportedOperationException(); } + @Override public SSAStoreIndirectInstruction StoreIndirectInstruction(int addressVal, int rval, TypeReference t) { throw new UnsupportedOperationException(); } @@ -532,50 +616,62 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { }; } + @Override public boolean isDoubleType(TypeReference type) { return type == JavaScriptTypes.Number || type == JavaScriptTypes.NumberObject; } + @Override public boolean isFloatType(TypeReference type) { return false; } + @Override public boolean isIntType(TypeReference type) { return false; } + @Override public boolean isLongType(TypeReference type) { return false; } + @Override public boolean isMetadataType(TypeReference type) { return false; } + @Override public boolean isStringType(TypeReference type) { return type == JavaScriptTypes.String || type == JavaScriptTypes.StringObject; } + @Override public boolean isVoidType(TypeReference type) { return false; } + @Override public TypeReference getMetadataType() { return null; } + @Override public TypeReference getStringType() { return JavaScriptTypes.String; } + @Override public PrimitiveType getPrimitive(TypeReference reference) { return JSPrimitiveType.getPrimitive(reference); } + @Override public boolean isBooleanType(TypeReference type) { return JavaScriptTypes.Boolean.equals(type); } + @Override public boolean isCharType(TypeReference type) { return false; } @@ -610,10 +706,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { superClass = superRef == null ? null : loader.lookupClass(superRef.getName()); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String toString() { return "JS:" + getReference().toString(); } @@ -642,18 +740,22 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { types.put(JavaScriptTypes.Root.getName(), this); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String toString() { return "JS Root:" + getReference().toString(); } + @Override public Collection getDirectInterfaces() { return Collections.emptySet(); } + @Override public IClass getSuperclass() { return null; } @@ -676,6 +778,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { this.entity = entity; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -715,27 +818,33 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } + @Override public CAstEntity getEntity() { return entity; } + @Override public void retranslate(AstTranslator xlator) { xlator.translate(entity, translationContext); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String toString() { return ""; } + @Override public TypeReference[] getDeclaredExceptions() { return null; } + @Override public LexicalParent[] getParents() { if (lexicalInfo() == null) return new LexicalParent[0]; @@ -751,10 +860,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { final int hack = i; final AstMethod method = (AstMethod) lookupClass(parents[i], cha).getMethod(AstMethodReference.fnSelector); result[i] = new LexicalParent() { + @Override public String getName() { return parents[hack]; } + @Override public AstMethod getMethod() { return method; } @@ -768,10 +879,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { return result; } + @Override public String getLocalVariableName(int bcIndex, int localNumber) { return null; } + @Override public boolean hasLocalVariableTable() { return false; } @@ -786,6 +899,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { return -1; } + @Override public TypeReference getParameterType(int i) { if (i == 0) { return getDeclaringClass().getReference(); @@ -864,14 +978,17 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { final JavaScriptClass STRING_OBJECT = new JavaScriptClass(this, JavaScriptTypes.StringObject, JavaScriptTypes.Object, null); + @Override public Language getLanguage() { return JS; } + @Override public ClassLoaderReference getReference() { return JavaScriptTypes.jsLoader; } + @Override public SSAInstructionFactory getInstructionFactory() { return JS.instructionFactory(); } @@ -905,12 +1022,14 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { * adds the {@link #bootstrapFileNames bootstrap files} to the list of modules * and then invokes the superclass method */ + @Override public void init(List modules) { List all = new LinkedList(); for (final String fn : bootstrapFileNames) { all.add(new SourceURLModule(getClass().getClassLoader().getResource(fn)) { + @Override public String getName() { return fn; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java index 91242a302..bfac347ba 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java @@ -34,10 +34,12 @@ public class JavaScriptLoaderFactory extends SingleClassLoaderFactory { this.preprocessor = preprocessor; } + @Override protected IClassLoader makeTheLoader(IClassHierarchy cha) { return new JavaScriptLoader( cha, translatorFactory, preprocessor ); } + @Override public ClassLoaderReference getTheReference() { return JavaScriptTypes.jsLoader; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java index 2b4c7bc12..6c5a51270 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java @@ -17,30 +17,37 @@ public class JSAbstractInstructionVisitor implements JSInstructionVisitor { + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction instruction) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java index e230a4f11..c0636941a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java @@ -60,14 +60,17 @@ public class JavaScriptCheckReference extends SSAInstruction { ((JSInstructionVisitor)v).visitCheckRef(this); } + @Override public boolean isPEI() { return true; } + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return ref; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java index 55c340b55..9f46f455b 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java @@ -45,6 +45,7 @@ public class JavaScriptInstanceOf extends SSAInstruction { return Collections.singleton(JavaScriptTypes.TypeError); } + @Override public boolean isPEI() { return true; } @@ -69,19 +70,23 @@ public class JavaScriptInstanceOf extends SSAInstruction { ((JSInstructionVisitor)v).visitJavaScriptInstanceOf(this); } + @Override public int getNumberOfDefs() { return 1; } + @Override public int getDef(int i) { assert i == 0; return result; } + @Override public int getNumberOfUses() { return 2; } + @Override public int getUse(int i) { switch (i) { case 0: return objVal; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java index 5a63aa0a1..b0f308627 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java @@ -50,6 +50,7 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { this(function, null, params, exception, site); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { int fn = function; int newParams[] = params; @@ -96,6 +97,7 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { return ((JSInstructionFactory)insts).Invoke(fn, newLvals, newParams, newExp, site, reads, writes); } + @Override public String toString(SymbolTable symbolTable) { StringBuffer s = new StringBuffer(); if (getNumberOfReturnValues() > 0) { @@ -152,11 +154,13 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { /** * @see com.ibm.domo.ssa.Instruction#visit(Visitor) */ + @Override public void visit(IVisitor v) { assert v instanceof JSInstructionVisitor; ((JSInstructionVisitor) v).visitJavaScriptInvoke(this); } + @Override public int getNumberOfParameters() { if (params == null) { return 1; @@ -168,6 +172,7 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { /** * @see com.ibm.domo.ssa.Instruction#getUse(int) */ + @Override public int getUse(int j) { if (j == 0) return function; @@ -186,10 +191,12 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { * (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return Util.typeErrorExceptions(); } + @Override public int hashCode() { return site.hashCode() * function * 7529; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java index 0a37fac4e..159d44e66 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java @@ -22,6 +22,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { super(result, objectRef, memberRef); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((JSInstructionFactory)insts).PropertyRead( @@ -33,6 +34,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { /* (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#isPEI() */ + @Override public boolean isPEI() { return true; } @@ -40,6 +42,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { /* (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return Util.typeErrorExceptions(); } @@ -48,6 +51,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { /* (non-Javadoc) * @see com.ibm.domo.ssa.SSAInstruction#visit(com.ibm.domo.ssa.SSAInstruction.Visitor) */ + @Override public void visit(IVisitor v) { assert v instanceof JSInstructionVisitor; ((JSInstructionVisitor)v).visitJavaScriptPropertyRead(this); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java index 86323b260..8b89d9f91 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java @@ -24,11 +24,13 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { super(objectRef, memberRef, value); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((JSInstructionFactory)insts).PropertyWrite(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()); } @@ -36,6 +38,7 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { /** * @see com.ibm.domo.ssa.Instruction#visit(Visitor) */ + @Override public void visit(IVisitor v) { assert v instanceof JSInstructionVisitor; ((JSInstructionVisitor) v).visitJavaScriptPropertyWrite(this); @@ -45,6 +48,7 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { * (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#isPEI() */ + @Override public boolean isPEI() { return true; } @@ -53,6 +57,7 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { * (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return Util.typeErrorExceptions(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java index 5855a3acf..12425daf5 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java @@ -24,18 +24,22 @@ public class JavaScriptTypeOfInstruction extends SSAAbstractUnaryInstruction { super(lval, object); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((JSInstructionFactory)insts).TypeOfInstruction((defs != null ? defs[0] : getDef(0)), (uses != null ? uses[0] : getUse(0))); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef(0)) + " = typeof(" + getValueString(symbolTable, getUse(0)) + ")"; } + @Override public void visit(IVisitor v) { ((JSInstructionVisitor) v).visitTypeOf(this); } + @Override public Collection getExceptionTypes() { return Util.noExceptions(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java index d13e18598..51f9dba9f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java @@ -56,10 +56,12 @@ public class JavaScriptWithRegion extends SSAInstruction { ((JSInstructionVisitor)v).visitWithRegion(this); } + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return expr; 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 d22747ffe..34c0df3fd 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 @@ -53,22 +53,27 @@ public class JSAstTranslator extends AstTranslator { return JavaScriptLoader.bootstrapFileNames.contains( context.getModule().getName() ); } + @Override protected boolean useDefaultInitValues() { return false; } + @Override protected boolean hasImplicitGlobals() { return true; } + @Override protected boolean treatGlobalsAsLexicallyScoped() { return false; } + @Override protected TypeReference defaultCatchType() { return JavaScriptTypes.Root; } + @Override protected TypeReference makeType(CAstType type) { Assertions.UNREACHABLE("JavaScript does not use CAstType"); return null; @@ -90,6 +95,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().newBlock(true); } + @Override protected int doLexicallyScopedRead(CAstNode n, WalkContext context, String name) { int readVn = super.doLexicallyScopedRead(n, context, name); // should get an exception if name is undefined @@ -97,6 +103,7 @@ public class JSAstTranslator extends AstTranslator { return readVn; } + @Override protected int doGlobalRead(CAstNode n, WalkContext context, String name) { int readVn = super.doGlobalRead(n, context, name); // add a check if name is undefined, unless we're reading the value 'undefined' @@ -106,15 +113,18 @@ public class JSAstTranslator extends AstTranslator { return readVn; } + @Override protected boolean defineType(CAstEntity type, WalkContext wc) { Assertions.UNREACHABLE("JavaScript doesn't have types. I suggest you look elsewhere for your amusement."); return false; } + @Override protected void defineField(CAstEntity topEntity, WalkContext wc, CAstEntity n) { Assertions.UNREACHABLE("JavaScript doesn't have fields"); } + @Override protected String composeEntityName(WalkContext parent, CAstEntity f) { if (f.getKind() == CAstEntity.SCRIPT_ENTITY) return f.getName(); @@ -122,6 +132,7 @@ public class JSAstTranslator extends AstTranslator { return parent.getName() + "/" + f.getName(); } + @Override protected void declareFunction(CAstEntity N, WalkContext context) { String fnName = composeEntityName(context, N); if (N.getKind() == CAstEntity.SCRIPT_ENTITY) { @@ -133,6 +144,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { @@ -147,10 +159,12 @@ public class JSAstTranslator extends AstTranslator { debugInfo); } + @Override protected void doThrow(WalkContext context, int exception) { context.cfg().addInstruction(insts.ThrowInstruction(exception)); } + @Override protected void doCall(WalkContext context, CAstNode call, int result, int exception, CAstNode name, int receiver, int[] arguments) { MethodReference ref = name.getValue().equals("ctor") ? JavaScriptMethods.ctorReference @@ -173,6 +187,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addPreEdgeToExit(call, true); } + @Override protected void doNewObject(WalkContext context, CAstNode newNode, int result, Object type, int[] arguments) { assert arguments == null; TypeReference typeRef = TypeReference.findOrCreate(JavaScriptTypes.jsLoader, TypeName.string2TypeName("L" + type)); @@ -181,6 +196,7 @@ public class JSAstTranslator extends AstTranslator { insts.NewInstruction(result, NewSiteReference.make(context.cfg().getCurrentInstruction(), typeRef))); } + @Override 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 @@ -190,14 +206,17 @@ public class JSAstTranslator extends AstTranslator { JavaScriptMethods.ctorReference, context.cfg().getCurrentInstruction()))); } + @Override public void doArrayRead(WalkContext context, int result, int arrayValue, CAstNode arrayRef, int[] dimValues) { Assertions.UNREACHABLE("JSAstTranslator.doArrayRead() called!"); } + @Override public void doArrayWrite(WalkContext context, int arrayValue, CAstNode arrayRef, int[] dimValues, int rval) { Assertions.UNREACHABLE("JSAstTranslator.doArrayWrite() called!"); } + @Override protected void doFieldRead(WalkContext context, int result, int receiver, CAstNode elt, CAstNode readNode) { this.visit(elt, context, this); int x = context.currentScope().allocateTempValue(); @@ -228,6 +247,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected void doFieldWrite(WalkContext context, int receiver, CAstNode elt, CAstNode parent, int rval) { this.visit(elt, context, this); if (elt.getKind() == CAstNode.CONSTANT && elt.getValue() instanceof String) { @@ -262,6 +282,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(resultVal, rval, "class")); } + @Override protected void doPrimitive(int resultVal, WalkContext context, CAstNode primitiveCall) { try { String name = (String) primitiveCall.getChild(0).getValue(); @@ -327,6 +348,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected void doIsFieldDefined(WalkContext context, int result, int ref, CAstNode f) { if (f.getKind() == CAstNode.CONSTANT && f.getValue() instanceof String) { String field = (String) f.getValue(); @@ -342,6 +364,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected boolean visitInstanceOf(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -349,6 +372,7 @@ public class JSAstTranslator extends AstTranslator { return false; } + @Override protected void leaveInstanceOf(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.getValue(n); @@ -362,6 +386,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addInstruction(new JavaScriptInstanceOf(result, value, type)); } + @Override protected void doPrologue(WalkContext context) { super.doPrologue(context); @@ -372,6 +397,7 @@ public class JSAstTranslator extends AstTranslator { //context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(1, tempVal, "arguments")); } + @Override protected boolean doVisit(CAstNode n, WalkContext cntxt, CAstVisitor visitor) { WalkContext context = (WalkContext) cntxt; switch (n.getKind()) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java index 83c05a515..64db4fdc0 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java @@ -35,6 +35,7 @@ public abstract class JavaScriptLoopUnwindingTranslatorFactory protected abstract TranslatorToCAst translateInternal(CAst Ast, SourceModule M, String N); + @Override public TranslatorToCAst make(CAst ast, final SourceModule M) { String N; if (M instanceof SourceFileModule) { @@ -45,7 +46,8 @@ public abstract class JavaScriptLoopUnwindingTranslatorFactory TranslatorToCAst xlator = translateInternal(ast, M, N); xlator.addRewriter(new CAstRewriterFactory,AstLoopUnwinder.UnwindKey>() { - public CAstRewriter, UnwindKey> createCAstRewriter(CAst ast) { + @Override + public CAstRewriter, UnwindKey> createCAstRewriter(CAst ast) { return new AstLoopUnwinder(ast, true, unwindFactor); } }, false); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java index 51c6f2204..be32d130c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java @@ -55,22 +55,27 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { public static class RootContext, T> extends TranslatorToCAst.RootContext implements WalkContext { + @Override public String script() { return null; } + @Override public T top() { Assertions.UNREACHABLE(); return null; } + @Override public void addNameDecl(CAstNode v) { Assertions.UNREACHABLE(); } + @Override public Collection getNameDecls() { Assertions.UNREACHABLE(); return null; } + @Override public CAstNode getCatchTarget() { Assertions.UNREACHABLE(); return null; @@ -99,22 +104,27 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { super(parent); } + @Override public String script() { return parent.script(); } + @Override public T top() { return parent.top(); } + @Override public void addNameDecl(CAstNode n) { parent.addNameDecl(n); } + @Override public Collection getNameDecls() { return parent.getNameDecls(); } + @Override public CAstNode getCatchTarget() { return parent.getCatchTarget(); } @@ -188,6 +198,7 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { this.script = script; } + @Override public String script() { return script; } } @@ -199,6 +210,7 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { this.catchNode = catchNode; } + @Override public CAstNode getCatchTarget() { return catchNode; } } @@ -265,6 +277,7 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { this.operationIndex = operationIndex; } + @Override public int setOperation(T node) { if (baseFor.contains( node )) { foundBase = true; @@ -274,10 +287,12 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { } } + @Override public boolean foundMemberOperation(T node) { return foundBase; } + @Override public void copyOperation(T from, T to) { if (baseFor.contains(from)) baseFor.add(to); } 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 0dd8d9800..62148d431 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 @@ -31,8 +31,10 @@ public class PropertyReadExpander extends CAstRewriter { EVERYWHERE, EXTRA { + @Override public ExpanderKey parent() { return EVERYWHERE; } }; + @Override public ExpanderKey parent() { return null; } } @@ -42,6 +44,7 @@ public class PropertyReadExpander extends CAstRewriter { + @Override public ExpanderKey key() { return ExpanderKey.EVERYWHERE; } @@ -72,10 +75,12 @@ public class PropertyReadExpander extends CAstRewriter, CAstNode> nodeMap) { int kind = root.getKind(); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java index ce6d25412..8a11e6eec 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java @@ -32,6 +32,7 @@ public class RangePosition extends AbstractSourcePosition implements Position { this.endOffset = endOffset; } + @Override public int compareTo(Object o) { Position other = (Position) o; if (startOffset != other.getFirstOffset()) { @@ -41,34 +42,42 @@ public class RangePosition extends AbstractSourcePosition implements Position { } } + @Override public int getFirstLine() { return line; } + @Override public int getLastLine() { return -1; } + @Override public int getFirstCol() { return -1; } + @Override public int getLastCol() { return -1; } + @Override public int getFirstOffset() { return startOffset; } + @Override public int getLastOffset() { return endOffset; } + @Override public URL getURL() { return url; } + @Override public InputStream getInputStream() throws IOException { return url.openStream(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java index 33d9e2985..3cd7aeba6 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java @@ -63,7 +63,8 @@ public class JsPaPanel extends PaPanel { } } - protected List getPointerKeysUnderInstanceKey(InstanceKey ik) { + @Override + protected List getPointerKeysUnderInstanceKey(InstanceKey ik) { List ret = new ArrayList(); ret.addAll(super.getPointerKeysUnderInstanceKey(ik)); int ikIndex = pa.getInstanceKeyMapping().getMappedIndex(ik); diff --git a/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java b/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java index bae4db4ca..e8d3b3439 100644 --- a/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java +++ b/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java @@ -36,6 +36,7 @@ public class TestCAstPattern extends WalaTestCase { private static class TestingCAstImpl extends CAstImpl { private final Map testNameMap = new HashMap(); + @Override @SuppressWarnings("unchecked") public CAstNode makeNode(int kind, CAstNode children[]) { if (kind == NAME_ASSERTION_SINGLE || kind == NAME_ASSERTION_MULTI) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java index 175a0f766..8f0917ae9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java @@ -31,36 +31,45 @@ public abstract class AstTypeInference extends TypeInference { private final TypeAbstraction booleanType; protected class AstTypeOperatorFactory extends TypeOperatorFactory implements AstInstructionVisitor { + @Override public void visitAstLexicalRead(AstLexicalRead inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitAstLexicalWrite(AstLexicalWrite inst) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { if (doPrimitives) { result = new DeclaredTypeOperator(booleanType); } } + @Override public void visitEcho(AstEchoInstruction inst) { } @@ -71,6 +80,7 @@ public abstract class AstTypeInference extends TypeInference { this.booleanType = booleanType; } + @Override protected void initialize() { init(ir, new TypeVarFactory(), new AstTypeOperatorFactory()); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java index 765616b4c..6aaf8d47c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java @@ -30,6 +30,7 @@ public class ArgumentInstanceContext implements Context { this.instanceKey = instanceKey; } + @Override public ContextItem get(ContextKey name) { /*if(name == ContextKey.RECEIVER && index == 1) return instanceKey;*/ diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java index 72f0a44dc..21a9ca451 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java @@ -54,6 +54,7 @@ public class AstCallGraph extends ExplicitCallGraph { super(rootMethod, cha, options, cache); } + @Override public InducedCFG makeControlFlowGraph(SSAInstruction[] statements) { return new AstInducedCFG(statements, this, Everywhere.EVERYWHERE); } @@ -147,6 +148,7 @@ public class AstCallGraph extends ExplicitCallGraph { targets.remove(cs.getProgramCounter()); } + @Override public boolean addTarget(CallSiteReference site, CGNode node) { if (super.addTarget(site, node)) { if (((AstCGNode) node).callbacks != null) { @@ -160,10 +162,12 @@ public class AstCallGraph extends ExplicitCallGraph { } } + @Override protected ExplicitNode makeNode(IMethod method, Context context) { return new AstCGNode(method, context); } + @Override protected CGNode makeFakeRootNode() throws CancelException { return findOrCreateNode(new AstFakeRoot(FakeRootMethod.rootMethod, cha, options, getAnalysisCache()), Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java index 8e9c003ac..60a52bb7a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java @@ -41,6 +41,7 @@ public class AstContextInsensitiveSSAContextInterpreter extends ContextInsensiti return method instanceof AstMethod; } + @Override public Iterator iterateNewSites(CGNode N) { IR ir = getIR(N); if (ir == null) { @@ -50,6 +51,7 @@ public class AstContextInsensitiveSSAContextInterpreter extends ContextInsensiti } } + @Override public Iterator iterateCallSites(CGNode N) { IR ir = getIR(N); if (ir == null) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java index 51fbdff25..415ef3cce 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java @@ -22,15 +22,18 @@ public class AstGlobalPointerKey extends AbstractPointerKey { this.globalName = globalName; } + @Override public boolean equals(Object x) { return (x instanceof AstGlobalPointerKey) && ((AstGlobalPointerKey)x).globalName.equals(globalName); } + @Override public int hashCode() { return globalName.hashCode(); } + @Override public String toString() { return "[global: " + globalName + "]"; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index 4b92d66b5..153d8bcf9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -141,6 +141,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(builder, cg, pointsToMap, instanceKeys, pointerKeys, iKeyFactory); } + @Override protected ImplicitPointsToSetVisitor makeImplicitPointsToVisitor(LocalPointerKey lpk) { return new AstImplicitPointsToSetVisitor(this, lpk); } @@ -150,38 +151,47 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(analysis, lpk); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { pointsToSet = analysis.computeImplicitPointsToSetAtGet(node, instruction.getDeclaredField(), -1, true); } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } @@ -194,6 +204,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa // // ///////////////////////////////////////////////////////////////////////// + @Override protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new AstCallGraph(cha, options, getAnalysisCache()); } @@ -204,43 +215,53 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(vn); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { bingo = true; } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { bingo = true; } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { bingo = true; } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { bingo = true; } + @Override public void visitAssert(AstAssertInstruction instruction) { bingo = true; } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { bingo = true; } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new AstInterestingVisitor(vn); } @@ -274,6 +295,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(builder, node); } + @Override protected AstSSAPropagationCallGraphBuilder getBuilder() { return (AstSSAPropagationCallGraphBuilder) builder; } @@ -301,8 +323,10 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { visitLexical(instruction, new LexicalOperator((AstCGNode) node, instruction.getAccesses(), true) { + @Override protected void action(PointerKey lexicalKey, int vn) { PointerKey lval = getPointerKeyForLocal(vn); if (lexicalKey instanceof LocalPointerKey) { @@ -328,8 +352,10 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa }); } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { visitLexical(instruction, new LexicalOperator((AstCGNode) node, instruction.getAccesses(), false) { + @Override protected void action(PointerKey lexicalKey, int vn) { PointerKey rval = getPointerKeyForLocal(vn); if (contentsAreInvariant(symbolTable, du, vn)) { @@ -346,14 +372,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa }); } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { visitGetInternal(instruction.getDef(), -1, true, instruction.getDeclaredField()); } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { visitPutInternal(instruction.getVal(), -1, true, instruction.getDeclaredField()); } + @Override public void visitPut(SSAPutInstruction inst) { super.visitPut(inst); @@ -394,10 +423,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } else { final String hack = fieldName; system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable objects = (IntSetVariable) rhs; if (objects.getValue() != null) { objects.getValue().foreach(new IntSetAction() { + @Override public void act(int optr) { InstanceKey object = system.getInstanceKey(optr); if (!getBuilder().isUncataloguedField(object.getConcreteType(), hack)) { @@ -412,14 +443,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "field name record: " + objKey; } @@ -427,14 +461,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { int lval = inst.getDef(0); final PointerKey lk = getPointerKeyForLocal(lval); @@ -452,10 +489,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa else { system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable objects = (IntSetVariable) rhs; if (objects.getValue() != null) { objects.getValue().foreach(new IntSetAction() { + @Override public void act(int optr) { InstanceKey object = system.getInstanceKey(optr); PointerKey objCatalog = getPointerKeyForObjectCatalog(object); @@ -468,14 +507,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "get catalog op" + rk; } @@ -483,14 +525,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } + @Override protected void visitInvokeInternal(final SSAAbstractInvokeInstruction instruction, InvariantComputer invs) { super.visitInvokeInternal(instruction, invs); if (instruction instanceof AbstractLexicalInvoke) { @@ -581,6 +626,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { doLexicalPointerKeys(true); return NOT_CHANGED; @@ -588,10 +634,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa abstract protected void action(PointerKey lexicalKey, int vn); + @Override public String toString() { return "lexical op"; } + @Override public boolean equals(Object o) { if (!(o instanceof LexicalOperator)) { return false; @@ -625,6 +673,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public int hashCode() { return node.hashCode() * accesses[0].hashCode() * accesses.length; } @@ -658,6 +707,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa PointsToSetVariable FV = system.findOrCreatePointsToSet(F); if (FV.getValue() != null) { FV.getValue().foreach(new IntSetAction() { + @Override public void act(int ptr) { InstanceKey iKey = system.getInstanceKey(ptr); if (iKey instanceof ScopeMappingInstanceKey) { @@ -745,6 +795,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return definingNode; } + @Override public boolean equals(Object x) { return (x instanceof UpwardFunargPointerKey) && super.equals(x) @@ -752,10 +803,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa .equals(((UpwardFunargPointerKey) x).getDefiningNode())); } + @Override public int hashCode() { return super.hashCode() * ((definingNode == null) ? 17 : definingNode.hashCode()); } + @Override public String toString() { return "[upward:" + getName() + ":" + definingNode + "]"; } @@ -894,11 +947,13 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa private final MutableIntSet doneReceiver = IntSetUtil.make(); private final MutableIntSet doneField = IntSetUtil.make(); + @Override public byte evaluate(PointsToSetVariable lhs, final PointsToSetVariable[] rhs) { final IntSetVariable receivers = (IntSetVariable) rhs[0]; final IntSetVariable fields = (IntSetVariable) rhs[1]; if (receivers.getValue() != null && fields.getValue() != null) { receivers.getValue().foreach(new IntSetAction() { + @Override public void act(final int rptr) { final InstanceKey receiver = system.getInstanceKey(rptr); @@ -910,6 +965,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } fields.getValue().foreach(new IntSetAction() { + @Override public void act(int fptr) { if (!doneField.contains(fptr) || !doneReceiver.contains(rptr)) { InstanceKey field = system.getInstanceKey(fptr); @@ -932,14 +988,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public String toString() { return "field op"; } + @Override public boolean equals(Object o) { return o == this; } + @Override public int hashCode() { return System.identityHashCode(this); } @@ -949,10 +1008,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa protected void newFieldOperationOnlyFieldConstant(final boolean isLoadOperation, final ReflectedFieldAction action, final PointerKey objKey, final InstanceKey[] fieldsKeys) { system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable objects = (IntSetVariable) rhs; if (objects.getValue() != null) { objects.getValue().foreach(new IntSetAction() { + @Override public void act(int optr) { InstanceKey object = system.getInstanceKey(optr); PointerKey objCatalog = getPointerKeyForObjectCatalog(object); @@ -982,14 +1043,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "field op" + objKey; } @@ -1008,10 +1072,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable fields = (IntSetVariable) rhs; if (fields.getValue() != null) { fields.getValue().foreach(new IntSetAction() { + @Override public void act(int fptr) { InstanceKey field = system.getInstanceKey(fptr); for (int o = 0; o < objKeys.length; o++) { @@ -1029,14 +1095,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "field op" + fieldKey; } @@ -1090,6 +1159,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa this.rhsFixedValues = rhsFixedValues; } + @Override public void dump(AbstractFieldPointerKey fieldKey, boolean constObj, boolean constProp) { System.err.println(("writing fixed rvals to " + fieldKey + " " + constObj + ", " + constProp)); for (int i = 0; i < rhsFixedValues.length; i++) { @@ -1097,6 +1167,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public void action(AbstractFieldPointerKey fieldKey) { if (!representsNullType(fieldKey.getInstanceKey())) { for (int i = 0; i < rhsFixedValues.length; i++) { @@ -1122,10 +1193,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa this.rhs = rhs; } + @Override public void dump(AbstractFieldPointerKey fieldKey, boolean constObj, boolean constProp) { System.err.println(("write " + rhs + " to " + fieldKey + " " + constObj + ", " + constProp)); } + @Override public void action(AbstractFieldPointerKey fieldKey) { if (!representsNullType(fieldKey.getInstanceKey())) { system.newConstraint(fieldKey, assignOperator, rhs); @@ -1147,10 +1220,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa protected void newFieldRead(CGNode opNode, int objVn, int fieldsVn, final PointerKey lhs) { newFieldOperation(opNode, objVn, fieldsVn, true, new ReflectedFieldAction() { + @Override public void dump(AbstractFieldPointerKey fieldKey, boolean constObj, boolean constProp) { System.err.println(("read " + lhs + " from " + fieldKey + " " + constObj + ", " + constProp)); } + @Override public void action(AbstractFieldPointerKey fieldKey) { if (!representsNullType(fieldKey.getInstanceKey())) { system.newConstraint(lhs, assignOperator, fieldKey); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java index b0381ac4d..c27441e1d 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java @@ -62,6 +62,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getPrimordialLoader() { Assertions.UNREACHABLE(); return null; @@ -72,6 +73,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getExtensionLoader() { Assertions.UNREACHABLE(); return null; @@ -82,6 +84,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getApplicationLoader() { Assertions.UNREACHABLE(); return null; @@ -90,6 +93,7 @@ public class CAstAnalysisScope extends AnalysisScope { /** * @return Returns the arrayClassLoader. */ + @Override public ArrayClassLoader getArrayClassLoader() { Assertions.UNREACHABLE(); return null; @@ -100,6 +104,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getSyntheticLoader() { Assertions.UNREACHABLE(); return null; @@ -111,6 +116,7 @@ public class CAstAnalysisScope extends AnalysisScope { * @param loader * @param file */ + @Override public void addClassFileToScope(ClassLoaderReference loader, File file) { Assertions.UNREACHABLE(); } @@ -118,6 +124,7 @@ public class CAstAnalysisScope extends AnalysisScope { /** * @return the ClassLoaderReference specified by name. */ + @Override public ClassLoaderReference getLoader(Atom name) { assert name.equals(theLoader.getName()); return theLoader; @@ -125,6 +132,7 @@ public class CAstAnalysisScope extends AnalysisScope { /** */ + @Override public Collection getLoaders() { return Collections.singleton(theLoader); } @@ -132,10 +140,12 @@ public class CAstAnalysisScope extends AnalysisScope { /** * @return the number of loaders. */ + @Override public int getNumberOfLoaders() { return 1; } + @Override public String toString() { return super.toString() + "\n" + theLoader + ": " + getModules(theLoader); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java index baea5d530..75550b238 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java @@ -107,6 +107,7 @@ public class CrossLanguageCallGraph extends AstCallGraph { return root.addPhi(values); } + @Override public int addGetInstance(FieldReference ref, int object) { TypeReference type = ref.getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -114,6 +115,7 @@ public class CrossLanguageCallGraph extends AstCallGraph { return root.addGetInstance(ref, object); } + @Override public int addGetStatic(FieldReference ref) { TypeReference type = ref.getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -121,18 +123,21 @@ public class CrossLanguageCallGraph extends AstCallGraph { return root.addGetStatic(ref); } + @Override public int addCheckcast(TypeReference[] type, int rv, boolean isPEI) { Atom language = type[0].getClassLoader().getLanguage(); AbstractRootMethod root = getLanguageRoot(language); return root.addCheckcast(type, rv, isPEI); } + @Override public SSANewInstruction addAllocation(TypeReference type) { Atom language = type.getClassLoader().getLanguage(); AbstractRootMethod root = getLanguageRoot(language); return root.addAllocation(type); } + @Override public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) { TypeReference type = site.getDeclaredTarget().getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -144,12 +149,14 @@ public class CrossLanguageCallGraph extends AstCallGraph { return super.addInvocation(params, site); } + @Override public AstLexicalRead addGlobalRead(TypeReference type, String name) { Atom language = type.getClassLoader().getLanguage(); AbstractRootMethod root = getLanguageRoot(language); return ((AstFakeRoot) root).addGlobalRead(type, name); } + @Override public SSAAbstractInvokeInstruction addDirectCall(int functionVn, int[] argVns, CallSiteReference callSite) { TypeReference type = callSite.getDeclaredTarget().getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -162,6 +169,7 @@ public class CrossLanguageCallGraph extends AstCallGraph { return languageRootNodes.iterator(); } + @Override protected CGNode makeFakeRootNode() throws CancelException { return findOrCreateNode(new CrossLanguageFakeRoot(cha, options, getAnalysisCache()), Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java index 53a84a5b2..bc87d4484 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java @@ -46,6 +46,7 @@ public class CrossLanguageClassTargetSelector implements ClassTargetSelector { return (ClassTargetSelector)languageSelectors.get(getLanguage(site)); } + @Override public IClass getAllocatedTarget(CGNode caller, NewSiteReference site) { return getSelector(site).getAllocatedTarget(caller, site); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java index 5f1f470bd..b301c6bb9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java @@ -53,10 +53,12 @@ public class CrossLanguageContextSelector implements ContextSelector { return (ContextSelector)languageSelectors.get(getLanguage(site)); } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return getSelector(site).getCalleeTarget(caller, site, callee, receiver); } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return getSelector(site).getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java index e2f60c7dc..80b8fd4a4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java @@ -57,23 +57,28 @@ public class CrossLanguageInstanceKeys implements InstanceKeyFactory { } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return getSelector(allocation).getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return getSelector(allocation).getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return getSelector(type).getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { assert getSelector(type) != null : "no instance keys for " + type; return getSelector(type).getInstanceKeyForPEI(node, instr, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return getSelector(type).getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java index 948dd1e05..c03f533ec 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java @@ -57,6 +57,7 @@ public class CrossLanguageMethodTargetSelector return (MethodTargetSelector)languageSelectors.get(getLanguage(site)); } + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { assert getSelector(site) != null: "no selector for " + getLanguage(site) + " method " + site; return getSelector(site).getCalleeTarget(caller, site, receiver); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java index bdf52fe45..35ad73e05 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java @@ -54,6 +54,7 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA interesting = makeInterestingVisitorSelector(); } + @Override protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new CrossLanguageCallGraph(makeRootNodeSelector(), cha, options, getAnalysisCache()); } @@ -62,16 +63,20 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA return node.getMethod().getReference().getDeclaringClass().getClassLoader().getLanguage(); } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return interesting.get(getLanguage(node), new Integer(vn)); } + @Override protected ConstraintVisitor makeVisitor(ExplicitCallGraph.ExplicitNode node) { return visitors.get(getLanguage(node), node); } + @Override protected PropagationSystem makeSystem(AnalysisOptions options) { return new PropagationSystem(callGraph, pointerKeyFactory, instanceKeyFactory) { + @Override public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) { assert builder == CrossLanguageSSAPropagationCallGraphBuilder.this; return new CrossLanguagePointerAnalysisImpl(CrossLanguageSSAPropagationCallGraphBuilder.this, cg, pointsToMap, @@ -90,11 +95,13 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA this.implicitVisitors = builder.makeImplicitVisitorSelector(this); } + @Override protected ImplicitPointsToSetVisitor makeImplicitPointsToVisitor(LocalPointerKey lpk) { return implicitVisitors.get(getLanguage(lpk.getNode()), lpk); } } + @Override protected void customInit() { for (Iterator roots = ((CrossLanguageCallGraph) callGraph).getLanguageRoots(); roots.hasNext();) { markDiscovered((CGNode) roots.next()); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java index a31d5b7c1..c69a3c21e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java @@ -34,38 +34,47 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { this.base = base; } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { return base.getPointerKeyForLocal(node, valueNumber); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { return base.getFilteredPointerKeyForLocal(node, valueNumber, filter); } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return base.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return base.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return base.getPointerKeyForStaticField(f); } + @Override public PointerKey getPointerKeyForObjectCatalog(InstanceKey I) { return new ObjectPropertyCatalogKey(I); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField f) { return base.getPointerKeyForInstanceField(I, f); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return base.getPointerKeyForArrayContents(I); } + @Override public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { List result = new LinkedList(); @@ -106,6 +115,7 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { return null; } + @Override public Iterator getPointerKeysForReflectedFieldRead(InstanceKey I, InstanceKey F) { if (F instanceof ConstantKey) { PointerKey ifk = getInstanceFieldPointerKeyForConstant(I, (ConstantKey) F); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java index 9036635de..a21cce624 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java @@ -108,6 +108,7 @@ public class MiscellaneousHacksContextSelector implements ContextSelector { System.err.println(("hacking context selector for methods " + methodsToSpecialize)); } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (methodsToSpecialize.contains(site.getDeclaredTarget()) || methodsToSpecialize.contains(callee.getReference())) { return specialPolicy.getCalleeTarget(caller, site, callee, receiver); @@ -116,6 +117,7 @@ public class MiscellaneousHacksContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return specialPolicy.getRelevantParameters(caller, site).union(basePolicy.getRelevantParameters(caller, site)); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java index 55c55fbaf..b40ecea23 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java @@ -24,15 +24,18 @@ public class ObjectPropertyCatalogKey extends AbstractPointerKey { this.object = object; } + @Override public boolean equals(Object x) { return (x instanceof ObjectPropertyCatalogKey) && ((ObjectPropertyCatalogKey)x).object.equals(object); } + @Override public int hashCode() { return object.hashCode(); } + @Override public String toString() { return "[" + getName() + "]"; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java index bfb1631c8..c7ca06d63 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java @@ -22,9 +22,11 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { public abstract Object getFieldIdentifier(); private static final Object arrayStateKey = new Object() { + @Override public String toString() { return "ArrayStateKey"; } }; + @Override public boolean equals(Object obj) { if (obj == this) { return true; @@ -39,14 +41,17 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { } } + @Override public int hashCode() { return getFieldIdentifier().hashCode() ^ getInstanceKey().hashCode(); } + @Override public String toString() { return "[" + getInstanceKey() + "; " + getFieldIdentifier() + "]"; } public static ReflectedFieldPointerKey literal(final String lit, InstanceKey instance) { return new ReflectedFieldPointerKey(instance) { + @Override public Object getFieldIdentifier() { return lit; } @@ -55,6 +60,7 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { public static ReflectedFieldPointerKey mapped(final InstanceKey mapFrom, InstanceKey instance) { return new ReflectedFieldPointerKey(instance) { + @Override public Object getFieldIdentifier() { return mapFrom; } @@ -63,6 +69,7 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { public static ReflectedFieldPointerKey index(InstanceKey instance) { return new ReflectedFieldPointerKey(instance) { + @Override public Object getFieldIdentifier() { return arrayStateKey; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index c6269491a..6a1251b23 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -81,6 +81,7 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { this.base = base; } + @Override public IClass getConcreteType() { return base.getConcreteType(); } @@ -113,15 +114,18 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { } + @Override public int hashCode() { return base.hashCode() * creator.hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof ScopeMappingInstanceKey) && ((ScopeMappingInstanceKey) o).base.equals(base) && ((ScopeMappingInstanceKey) o).creator.equals(creator); } + @Override public String toString() { return "SMIK:" + base + "@creator:" + creator; } @@ -134,10 +138,12 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { return creator; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new FilterIterator>( base.getCreationSites(CG), new Filter>() { + @Override public boolean accepts(Pair o) { return o.fst.equals(creator); } @@ -145,6 +151,7 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode creatorNode, NewSiteReference allocationSite) { InstanceKey base = basic.getInstanceKeyForAllocation(creatorNode, allocationSite); if (base != null && needsScopeMappingKey(base)) { @@ -159,18 +166,22 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { */ protected abstract Collection getConstructorCallers(ScopeMappingInstanceKey smik, Pair name); + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return basic.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return basic.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return basic.getInstanceKeyForPEI(node, instr, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return basic.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java index 0b1574e56..f90dc04e8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java @@ -35,10 +35,12 @@ public abstract class ScriptEntryPoints implements Iterable { super(scriptCodeBody); } + @Override public CallSiteReference makeSite(int programCounter) { return makeScriptSite(getMethod(), programCounter); } + @Override public TypeReference[] getParameterTypes(int i) { assert i == 0; if (getMethod().isStatic()) { @@ -48,11 +50,13 @@ public abstract class ScriptEntryPoints implements Iterable { } } + @Override public int getNumberOfParameters() { return getMethod().isStatic()? 0: 1; } + @Override public SSAAbstractInvokeInstruction addCall(AbstractRootMethod m){ CallSiteReference site = makeSite(0); @@ -81,6 +85,7 @@ public abstract class ScriptEntryPoints implements Iterable { return true; } + @Override public Iterator iterator() { Set ES = HashSetFactory.make(); Iterator classes = scriptType.getClassLoader().iterateAllClasses(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java index 363f2896f..9f9f40a2e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java @@ -31,6 +31,7 @@ public class StandardFunctionTargetSelector implements MethodTargetSelector { this.base = base; } + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { ClassLoaderReference loader = (site.isStatic() || receiver==null)? diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java index 4956956de..9be0ef27f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java @@ -60,10 +60,12 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { private final Map hierarchies; + @Override public ClassLoaderFactory getFactory() { return loaderFactory; } + @Override public AnalysisScope getScope() { return analysisScope; } @@ -96,6 +98,7 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return getHierarchy(ref.getDeclaringClass()); } + @Override public IClassLoader[] getLoaders() { Set loaders = HashSetFactory.make(); for (Iterator ldrs = analysisScope.getLoaders().iterator(); ldrs.hasNext();) { @@ -105,14 +108,17 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return (IClassLoader[]) loaders.toArray(new IClassLoader[loaders.size()]); } + @Override public IClassLoader getLoader(ClassLoaderReference loaderRef) { return getHierarchy(loaderRef).getLoader(loaderRef); } + @Override public boolean addClass(IClass klass) { return getHierarchy(klass).addClass(klass); } + @Override public int getNumberOfClasses() { int total = 0; for (Iterator ldrs = analysisScope.getLoaders().iterator(); ldrs.hasNext();) { @@ -122,43 +128,53 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return total; } + @Override public boolean isRootClass(IClass c) { return getHierarchy(c).isRootClass(c); } + @Override public IClass getRootClass() { Assertions.UNREACHABLE(); return null; } + @Override public int getNumber(IClass c) { return getHierarchy(c).getNumber(c); } + @Override public Set getPossibleTargets(MethodReference ref) { return getHierarchy(ref).getPossibleTargets(ref); } + @Override public Set getPossibleTargets(IClass receiverClass, MethodReference ref) { return getHierarchy(ref).getPossibleTargets(receiverClass, ref); } + @Override public IMethod resolveMethod(MethodReference m) { return getHierarchy(m).resolveMethod(m); } + @Override public IField resolveField(FieldReference f) { return getHierarchy(f).resolveField(f); } + @Override public IField resolveField(IClass klass, FieldReference f) { return getHierarchy(klass).resolveField(klass, f); } + @Override public IMethod resolveMethod(IClass receiver, Selector selector) { return getHierarchy(receiver).resolveMethod(receiver, selector); } + @Override public IClass lookupClass(TypeReference A) { return getHierarchy(A).lookupClass(A); } @@ -167,56 +183,70 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { // return getHierarchy(c).isSyntheticClass(c); // } + @Override public boolean isInterface(TypeReference type) { return getHierarchy(type).isInterface(type); } + @Override public IClass getLeastCommonSuperclass(IClass A, IClass B) { return getHierarchy(A).getLeastCommonSuperclass(A, B); } + @Override public TypeReference getLeastCommonSuperclass(TypeReference A, TypeReference B) { return getHierarchy(A).getLeastCommonSuperclass(A, B); } + @Override public boolean isSubclassOf(IClass c, IClass T) { return getHierarchy(c).isSubclassOf(c, T); } + @Override public boolean implementsInterface(IClass c, IClass i) { return getHierarchy(c).implementsInterface(c, i); } + @Override public Collection computeSubClasses(TypeReference type) { return getHierarchy(type).computeSubClasses(type); } + @Override public Collection getJavaLangRuntimeExceptionTypes() { return getHierarchy(TypeReference.JavaLangRuntimeException).getJavaLangErrorTypes(); } + @Override public Collection getJavaLangErrorTypes() { return getHierarchy(TypeReference.JavaLangError).getJavaLangErrorTypes(); } + @Override public Set getImplementors(TypeReference type) { return getHierarchy(type).getImplementors(type); } + @Override public int getNumberOfImmediateSubclasses(IClass klass) { return getHierarchy(klass).getNumberOfImmediateSubclasses(klass); } + @Override public Collection getImmediateSubclasses(IClass klass) { return getHierarchy(klass).getImmediateSubclasses(klass); } + @Override public boolean isAssignableFrom(IClass c1, IClass c2) { return getHierarchy(c1).isAssignableFrom(c1, c2); } + @Override public Iterator iterator() { return new ComposedIterator(analysisScope.getLoaders().iterator()) { + @Override public Iterator makeInner(ClassLoaderReference o) { IClassLoader ldr = getLoader(o); return ldr.iterateAllClasses(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java index dc02115a3..3a5c10056 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java @@ -58,6 +58,7 @@ public class LexicalModRef { Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + @Override public Collection> apply(CGNode n) { return scanNodeForLexReads(n); } @@ -74,6 +75,7 @@ public class LexicalModRef { Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + @Override public Collection> apply(CGNode n) { return scanNodeForLexWrites(n); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java index 77dfc6b47..c1dc97d24 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java @@ -39,43 +39,53 @@ public class AstModRef extends ModRef { super(n, result, pa, h); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } } + @Override protected RefVisitor makeRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { return new AstRefVisitor(n, result, pa, h); } @@ -89,38 +99,47 @@ public class AstModRef extends ModRef { super(n, result, h, pa, true); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java index 8f84f280d..e8ff6ebe9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java @@ -37,34 +37,43 @@ public class AstInducedCFG extends InducedCFG { super(r); } + @Override public void visitAstLexicalRead(AstLexicalRead inst) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite inst) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } @@ -76,38 +85,49 @@ public class AstInducedCFG extends InducedCFG { super(r); } + @Override public void visitAstLexicalRead(AstLexicalRead inst) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite inst) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } } + @Override protected BranchVisitor makeBranchVisitor(boolean[] r) { return new AstBranchVisitor(r); } + @Override protected PEIVisitor makePEIVisitor(boolean[] r) { return new AstPEIVisitor(r); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java index a704c2acd..77bd61ce3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java @@ -29,54 +29,67 @@ public class DelegatingCFG> extends AbstractNumbered this.parent = parent; } + @Override protected NumberedNodeManager getNodeManager() { return parent; } + @Override protected NumberedEdgeManager getEdgeManager() { return parent; } + @Override public T entry() { return parent.entry(); } + @Override public T exit() { return parent.exit(); } + @Override public BitVector getCatchBlocks() { return parent.getCatchBlocks(); } + @Override public T getBlockForInstruction(int index) { return parent.getBlockForInstruction(index); } + @Override public I[] getInstructions() { return parent.getInstructions(); } + @Override public int getProgramCounter(int index) { return parent.getProgramCounter(index); } + @Override public IMethod getMethod() { return parent.getMethod(); } + @Override public List getExceptionalSuccessors(T b) { return parent.getExceptionalSuccessors(b); } + @Override public Collection getNormalSuccessors(T b) { return parent.getNormalSuccessors(b); } + @Override public Collection getExceptionalPredecessors(T b) { return parent.getExceptionalPredecessors(b); } + @Override public Collection getNormalPredecessors(T b) { return parent.getNormalPredecessors(b); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java index d757cd8a1..28f575973 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java @@ -45,6 +45,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru this.lexicalWrites = lexicalWrites; } + @Override public int getNumberOfUses() { if (lexicalReads == null) return getNumberOfParameters(); @@ -76,6 +77,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru } } + @Override public int getUse(int j) { assert j >= getNumberOfParameters(); assert lexicalReads != null; @@ -83,6 +85,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru return lexicalReads[j - getNumberOfParameters()].valueNumber; } + @Override public int getNumberOfDefs() { if (lexicalWrites == null) return super.getNumberOfDefs(); @@ -90,6 +93,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru return super.getNumberOfDefs() + lexicalWrites.length; } + @Override public int getDef(int j) { if (j < super.getNumberOfDefs()) return super.getDef(j); @@ -132,10 +136,12 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru return lexicalWrites[i - super.getNumberOfDefs()]; } + @Override public int hashCode() { return site.hashCode() * 7529; } + @Override public String toString(SymbolTable symbolTable) { StringBuffer s = new StringBuffer(super.toString(symbolTable)); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java index fcf756105..301a789d8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java @@ -28,6 +28,7 @@ public abstract class AbstractReflectiveGet extends ReflectiveMemberAccess { this.result = result; } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, result) + " = " + super.toString(symbolTable); } @@ -35,14 +36,17 @@ public abstract class AbstractReflectiveGet extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getDef() */ + @Override public boolean hasDef() { return true; } + @Override public int getDef() { return result; } + @Override public int getDef(int i) { return result; } @@ -50,10 +54,12 @@ public abstract class AbstractReflectiveGet extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getNumberOfUses() */ + @Override public int getNumberOfUses() { return 2; } + @Override public int getNumberOfDefs() { return 1; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java index e2afea811..2699a6d57 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java @@ -28,6 +28,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { this.value = value; } + @Override public String toString(SymbolTable symbolTable) { return super.toString(symbolTable) + " = " + getValueString(symbolTable, value); } @@ -35,6 +36,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getDef() */ + @Override public int getDef() { return -1; } @@ -42,6 +44,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getNumberOfUses() */ + @Override public int getNumberOfUses() { return 3; } @@ -50,6 +53,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { return getUse(2); } + @Override public int getUse(int index) { if (index == 2) return value; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java index 76cc1d1f3..5c635cfdd 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java @@ -40,6 +40,7 @@ public class AssignInstruction extends SSAUnaryOpInstruction { /* * @see com.ibm.wala.ssa.SSAInstruction#copyForSSA(int[], int[]) */ + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory) insts) .AssignInstruction(defs == null ? getDef(0) : defs[0], uses == null ? getUse(0) : uses[0]); @@ -48,6 +49,7 @@ public class AssignInstruction extends SSAUnaryOpInstruction { /* * @see com.ibm.wala.ssa.SSAInstruction#toString(com.ibm.wala.ssa.SymbolTable, com.ibm.wala.ssa.ValueDecorator) */ + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, result) + " := " + getValueString(symbolTable, val); } @@ -55,6 +57,7 @@ public class AssignInstruction extends SSAUnaryOpInstruction { /* * @see com.ibm.wala.ssa.SSAInstruction#visit(com.ibm.wala.ssa.SSAInstruction.Visitor) */ + @Override public void visit(IVisitor v) { ((AstPreInstructionVisitor) v).visitAssign(this); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java index c189d7ed3..9fd7b7b00 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java @@ -17,38 +17,47 @@ public abstract class AstAbstractInstructionVisitor implements AstInstructionVisitor { + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java index 68029ea3e..9fe8c773f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java @@ -37,35 +37,43 @@ public class AstAssertInstruction extends SSAInstruction { this.fromSpecification = fromSpecification; } + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return value; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).AssertInstruction(uses == null ? value : uses[0], fromSpecification); } + @Override public String toString(SymbolTable symbolTable) { return "assert " + getValueString(symbolTable, value) + " (fromSpec: " + fromSpecification + ")"; } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitAssert(this); } + @Override public int hashCode() { return 2177 * value; } + @Override public Collection getExceptionTypes() { return null; } + @Override public boolean isFallThrough() { return true; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java index ec76537a3..ff47576d5 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java @@ -18,6 +18,7 @@ public interface AstConstants { public enum BinaryOp implements IBinaryOpInstruction.IOperator { CONCAT, EQ, NE, LT, GE, GT, LE, STRICT_EQ, STRICT_NE; + @Override public String toString() { return super.toString().toLowerCase(); } @@ -26,6 +27,7 @@ public interface AstConstants { public enum UnaryOp implements IUnaryOpInstruction.IOperator { MINUS, BITNOT, PLUS; + @Override public String toString() { return super.toString().toLowerCase(); } 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 e33aecd2d..5109ddbc6 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 @@ -26,27 +26,33 @@ public class AstEchoInstruction extends SSAInstruction { this.rvals = rvals; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).EchoInstruction(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 i = 0;i < rvals.length; i++) { @@ -56,6 +62,7 @@ public class AstEchoInstruction extends SSAInstruction { return v; } + @Override public String toString(SymbolTable symbolTable) { StringBuffer result = new StringBuffer("echo/print "); for(int i = 0; i < rvals.length; i++) { @@ -65,14 +72,17 @@ public class AstEchoInstruction extends SSAInstruction { return result.toString(); } + @Override public void visit(IVisitor v) { ((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/AstGlobalRead.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalRead.java index ace71ce68..333e4787e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalRead.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalRead.java @@ -30,23 +30,28 @@ public class AstGlobalRead extends SSAGetInstruction { super(lhs, global); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).GlobalRead((defs==null)? getDef(): defs[0], getDeclaredField()); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef()) + " = global:" + getGlobalName(); } + @Override public void visit(IVisitor v) { if (v instanceof AstInstructionVisitor) ((AstInstructionVisitor)v).visitAstGlobalRead(this); } + @Override public boolean isFallThrough() { return true; } + @Override public Collection getExceptionTypes() { return null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java index 85d9dc773..5bf5130d4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java @@ -30,23 +30,28 @@ public class AstGlobalWrite extends SSAPutInstruction { super(rhs, global); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).GlobalWrite(getDeclaredField(), (uses==null)? getVal(): uses[0]); } + @Override public String toString(SymbolTable symbolTable) { return "global:" + getGlobalName() + " = " + getValueString(symbolTable,getVal()); } + @Override public void visit(IVisitor v) { if (v instanceof AstInstructionVisitor) ((AstInstructionVisitor)v).visitAstGlobalWrite(this); } + @Override public boolean isFallThrough() { return true; } + @Override public Collection getExceptionTypes() { return null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java index 852c6d675..0a572764e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java @@ -50,6 +50,7 @@ public class AstIRFactory implements IRFactory { this.astFactory = astFactory; } + @Override public IR makeIR(IMethod method, Context context, SSAOptions options) { if (method instanceof AstMethod) { return astFactory.makeIR(method, context, options); @@ -58,6 +59,7 @@ public class AstIRFactory implements IRFactory { } } + @Override public ControlFlowGraph makeCFG(IMethod method, Context context) { if (method instanceof AstMethod) { return astFactory.makeCFG(method, context); @@ -96,10 +98,12 @@ public class AstIRFactory implements IRFactory { } } + @Override protected SSA2LocalMap getLocalMap() { return localMap; } + @Override protected String instructionPosition(int instructionIndex) { Position pos = ((AstMethod) getMethod()).getSourcePosition(instructionIndex); if (pos == null) { @@ -130,6 +134,7 @@ public class AstIRFactory implements IRFactory { } } + @Override public IR makeIR(final IMethod method, final Context context, final SSAOptions options) { assert method instanceof AstMethod : method.toString(); @@ -148,6 +153,7 @@ public class AstIRFactory implements IRFactory { return new AstDefaultIRFactory(); } + @Override public boolean contextIsIrrelevant(IMethod method) { return true; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java index ebaf873c8..c74257fc2 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java @@ -77,6 +77,7 @@ public class AstIsDefinedInstruction extends SSAInstruction { this.fieldRef = null; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { assert fieldVal == -1 || fieldRef == null; @@ -84,6 +85,7 @@ public class AstIsDefinedInstruction extends SSAInstruction { (uses == null || fieldVal == -1) ? fieldVal : uses[1], fieldRef); } + @Override public String toString(SymbolTable symbolTable) { if (fieldVal == -1 && fieldRef == null) { return getValueString(symbolTable, lval) + " = isDefined(" + getValueString(symbolTable, rval) + ")"; @@ -99,36 +101,44 @@ public class AstIsDefinedInstruction extends SSAInstruction { } } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitIsDefined(this); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } + @Override public boolean hasDef() { return true; } + @Override public int getDef() { return lval; } + @Override public int getDef(int i) { assert i == 0; return lval; } + @Override public int getNumberOfDefs() { return 1; } + @Override public int getNumberOfUses() { return (fieldVal == -1) ? 1 : 2; } + @Override public int getUse(int j) { if (j == 0) { return rval; @@ -140,10 +150,12 @@ public class AstIsDefinedInstruction extends SSAInstruction { } } + @Override public boolean isFallThrough() { return true; } + @Override public int hashCode() { return 3077 * fieldVal * rval; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java index 29f5cb31a..45aa60bcc 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java @@ -54,10 +54,12 @@ public abstract class AstLexicalAccess extends SSAInstruction { return Pair.make(variableName, variableDefiner); } + @Override public int hashCode() { return variableName.hashCode() * valueNumber; } + @Override public boolean equals(Object other) { return (other instanceof Access) && variableName.equals( ((Access)other).variableName ) && @@ -67,6 +69,7 @@ public abstract class AstLexicalAccess extends SSAInstruction { variableDefiner.equals(((Access)other).variableDefiner) ); } + @Override public String toString() { return "Access(" + variableName + "@" + variableDefiner + ":" + valueNumber + ")"; } @@ -94,14 +97,17 @@ public abstract class AstLexicalAccess extends SSAInstruction { return accesses.length; } + @Override public boolean isFallThrough() { return true; } + @Override public Collection getExceptionTypes() { return null; } + @Override public int hashCode() { int v = 1; for(int i = 0; i < accesses.length; i++) diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java index 60175fcfd..010e91e23 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java @@ -36,6 +36,7 @@ public class AstLexicalRead extends AstLexicalAccess { this(new Access(globalName, definer, lhs)); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { if (defs == null) { return new AstLexicalRead(getAccesses()); @@ -50,22 +51,27 @@ public class AstLexicalRead extends AstLexicalAccess { } } + @Override public int getNumberOfDefs() { return getAccessCount(); } + @Override public int getDef(int i) { return getAccess(i).valueNumber; } + @Override public int getNumberOfUses() { return 0; } + @Override public int getUse(int i) { throw new UnsupportedOperationException(); } + @Override public String toString(SymbolTable symbolTable) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < getAccessCount(); i++) { @@ -82,6 +88,7 @@ public class AstLexicalRead extends AstLexicalAccess { return sb.toString(); } + @Override public void visit(IVisitor v) { assert v instanceof AstInstructionVisitor; ((AstInstructionVisitor) v).visitAstLexicalRead(this); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java index 9324b5ac0..0fc1241a2 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java @@ -36,6 +36,7 @@ public class AstLexicalWrite extends AstLexicalAccess { super(accesses); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { if (uses == null) { return new AstLexicalWrite(getAccesses()); @@ -50,22 +51,27 @@ public class AstLexicalWrite extends AstLexicalAccess { } } + @Override public int getNumberOfUses() { return getAccessCount(); } + @Override public int getUse(int i) { return getAccess(i).valueNumber; } + @Override public int getNumberOfDefs() { return 0; } + @Override public int getDef(int i) { throw new UnsupportedOperationException(); } + @Override public String toString(SymbolTable symbolTable) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < getAccessCount(); i++) { @@ -83,6 +89,7 @@ public class AstLexicalWrite extends AstLexicalAccess { return sb.toString(); } + @Override public void visit(IVisitor v) { assert v instanceof AstInstructionVisitor; ((AstInstructionVisitor) v).visitAstLexicalWrite(this); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java index c51a19d8f..1e8bd2d10 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java @@ -35,18 +35,22 @@ public class EachElementGetInstruction extends SSAAbstractUnaryInstruction { super(lValue, objectRef); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).EachElementGetInstruction((defs == null) ? getDef(0) : defs[0], (uses == null) ? getUse(0) : uses[0]); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef(0)) + " = a property name of " + getValueString(symbolTable, getUse(0)); } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitEachElementGet(this); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java index 8bf5d9463..70ff36363 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java @@ -35,18 +35,22 @@ public class EachElementHasNextInstruction extends SSAAbstractUnaryInstruction { super(lValue, objectRef); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).EachElementHasNextInstruction((defs == null) ? getDef(0) : defs[0], (uses == null) ? getUse(0) : uses[0]); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef(0)) + " = has next property: " + getValueString(symbolTable, getUse(0)); } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitEachElementHasNext(this); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java index ccf036fcd..052776045 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java @@ -59,6 +59,7 @@ public abstract class FixedParametersLexicalInvokeInstruction protected abstract SSAInstruction copyInstruction(SSAInstructionFactory insts, int result[], int[] params, int exception, Access[] lexicalReads, Access[] lexicalWrites); + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { int newParams[] = params; Access[] reads = lexicalReads; @@ -104,6 +105,7 @@ public abstract class FixedParametersLexicalInvokeInstruction return copyInstruction(insts, newLvals, newParams, newExp, reads, writes); } + @Override public int getNumberOfParameters() { if (params == null) { return 0; @@ -115,6 +117,7 @@ public abstract class FixedParametersLexicalInvokeInstruction /** * @see com.ibm.wala.ssa.Instruction#getUse(int) */ + @Override public int getUse(int j) { if (j < getNumberOfParameters()) return params[j]; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java index c74e8d0cc..1688ff92d 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java @@ -23,10 +23,12 @@ abstract class MultiReturnValueInvokeInstruction this.results = results; } + @Override public int getNumberOfReturnValues() { return results==null? 0: results.length; } + @Override public int getReturnValue(int i) { return results[i]; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java index 8f2931575..47e628b02 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java @@ -81,10 +81,12 @@ public class SSAConversion extends AbstractSSAConversion { this.instructionIndex = instructionIndex; } + @Override public int hashCode() { return useNumber * instructionIndex; } + @Override public boolean equals(Object o) { return (o instanceof UseRecord) && instructionIndex == ((UseRecord) o).instructionIndex && useNumber == ((UseRecord) o).useNumber; @@ -104,10 +106,12 @@ public class SSAConversion extends AbstractSSAConversion { this.useNumber = useNumber; } + @Override public int hashCode() { return phiNumber * BBnumber * useNumber; } + @Override public boolean equals(Object o) { return (o instanceof PhiUseRecord) && BBnumber == ((PhiUseRecord) o).BBnumber && phiNumber == ((PhiUseRecord) o).phiNumber && useNumber == ((PhiUseRecord) o).useNumber; @@ -123,10 +127,12 @@ public class SSAConversion extends AbstractSSAConversion { private final Set childRecords = HashSetFactory.make(1); + @Override public int hashCode() { return instructionIndex; } + @Override public boolean equals(Object o) { return (o instanceof CopyPropagationRecord) && instructionIndex == ((CopyPropagationRecord) o).instructionIndex; } @@ -232,6 +238,7 @@ public class SSAConversion extends AbstractSSAConversion { // private class SSAInformation implements com.ibm.wala.ssa.IR.SSA2LocalMap { + @Override public String[] getLocalNames(int pc, int vn) { int v = skip(vn) || vn >= valueMap.length ? vn : valueMap[vn]; String[][] namesData = debugInfo.getSourceNamesForValues(); @@ -279,34 +286,42 @@ public class SSAConversion extends AbstractSSAConversion { // implementation of AbstractSSAConversion hooks // + @Override protected int getNumberOfDefs(SSAInstruction inst) { return inst.getNumberOfDefs(); } + @Override protected int getDef(SSAInstruction inst, int index) { return inst.getDef(index); } + @Override protected int getNumberOfUses(SSAInstruction inst) { return inst.getNumberOfUses(); } + @Override protected int getUse(SSAInstruction inst, int index) { return inst.getUse(index); } + @Override protected boolean isAssignInstruction(SSAInstruction inst) { return inst instanceof AssignInstruction; } + @Override protected int getMaxValueNumber() { return symtab.getMaxValueNumber(); } + @Override protected boolean skip(int vn) { return false; } + @Override protected boolean isLive(SSACFG.BasicBlock Y, int V) { return (liveness.isLiveEntry(Y, V)); } @@ -315,6 +330,7 @@ public class SSAConversion extends AbstractSSAConversion { BB.addPhiForLocal(phiCounts[BB.getGraphNodeId()], phi); } + @Override protected void placeNewPhiAt(int value, SSACFG.BasicBlock Y) { int[] params = new int[CFG.getPredNodeCount(Y)]; for (int i = 0; i < params.length; i++) @@ -328,18 +344,22 @@ public class SSAConversion extends AbstractSSAConversion { addPhi(Y, phi); } + @Override protected SSAPhiInstruction getPhi(SSACFG.BasicBlock B, int index) { return B.getPhiForLocal(index); } + @Override protected void setPhi(SSACFG.BasicBlock B, int index, SSAPhiInstruction inst) { B.addPhiForLocal(index, inst); } + @Override protected SSAPhiInstruction repairPhiDefs(SSAPhiInstruction phi, int[] newDefs) { return (SSAPhiInstruction) phi.copyForSSA(CFG.getMethod().getDeclaringClass().getClassLoader().getInstructionFactory(), newDefs, null); } + @Override protected void repairPhiUse(SSACFG.BasicBlock BB, int phiIndex, int rvalIndex, int newRval) { SSAPhiInstruction phi = getPhi(BB, phiIndex); @@ -357,6 +377,7 @@ public class SSAConversion extends AbstractSSAConversion { phi.setValues(newUses); } + @Override protected void pushAssignment(SSAInstruction inst, int index, int newRhs) { int lhs = getDef(inst, 0); int rhs = getUse(inst, 0); @@ -370,6 +391,7 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected void repairInstructionUses(SSAInstruction inst, int index, int[] newUses) { for (int j = 0; j < getNumberOfUses(inst); j++) { if (topR(getUse(inst, j)) != null) { @@ -398,18 +420,22 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected void repairInstructionDefs(SSAInstruction inst, int index, int[] newDefs, int[] newUses) { instructions[index] = inst.copyForSSA(CFG.getMethod().getDeclaringClass().getClassLoader().getInstructionFactory(), newDefs, newUses); } + @Override protected void popAssignment(SSAInstruction inst, int index) { instructions[index] = null; } + @Override protected boolean isConstant(int valueNumber) { return symtab.isConstant(valueNumber); } + @Override protected boolean skipRepair(SSAInstruction inst, int index) { if (!super.skipRepair(inst, index)) { return false; @@ -475,6 +501,7 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected int getNextNewValueNumber() { while (symtab.isConstant(nextSSAValue) || skip(nextSSAValue)) ++nextSSAValue; @@ -499,6 +526,7 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected void initializeVariables() { for (int V = 1; V <= getMaxValueNumber(); V++) { if (!skip(V)) { @@ -516,6 +544,7 @@ public class SSAConversion extends AbstractSSAConversion { } + @Override protected void repairExit() { int[] exitLives = lexicalInfo.getExitExposedUses(); if (exitLives != null) { @@ -532,6 +561,7 @@ public class SSAConversion extends AbstractSSAConversion { // Global control. // + @Override protected void fail(int v) { System.err.println("during SSA conversion of the following IR:"); System.err.println(ir); @@ -542,6 +572,7 @@ public class SSAConversion extends AbstractSSAConversion { return computedLocalMap; } + @Override public void perform() { super.perform(); @@ -603,6 +634,7 @@ public class SSAConversion extends AbstractSSAConversion { SSAConversion ssa = new SSAConversion(M, ir, options) { final int limit = ir.getSymbolTable().getMaxValueNumber(); + @Override protected boolean skip(int i) { return (i >= 0) && (i <= limit) && (!values.contains(i)); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java index 17fe6ba00..235f95d32 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java @@ -86,14 +86,17 @@ public class LiveAnalysis { * Gen/kill operator specific to exit basic blocks */ final class ExitBlockGenKillOperator extends UnaryOperator { + @Override public String toString() { return "ExitGenKill"; } + @Override public boolean equals(Object o) { return o == this; } + @Override public int hashCode() { return 37721; } @@ -101,6 +104,7 @@ public class LiveAnalysis { /** * Evaluate the transfer between two nodes in the flow graph within an exit block. */ + @Override public byte evaluate(BitVectorVariable lhs, BitVectorVariable rhs) { boolean changed = lhs.getValue() == null ? !considerLiveAtExit.isZero() : !lhs.getValue().sameValue(liveAtExit); @@ -120,14 +124,17 @@ public class LiveAnalysis { this.block = block; } + @Override public String toString() { return "GenKill:" + block; } + @Override public boolean equals(Object o) { return (o instanceof BlockValueGenKillOperator) && ((BlockValueGenKillOperator) o).block.equals(block); } + @Override public int hashCode() { return block.hashCode() * 17; } @@ -156,6 +163,7 @@ public class LiveAnalysis { /** * Evaluate the transfer between two nodes in the flow graph within one basic block. */ + @Override public byte evaluate(BitVectorVariable lhs, BitVectorVariable rhs) { // Calculate here the result of the transfer BitVectorIntSet bits = new BitVectorIntSet(); @@ -204,17 +212,21 @@ public class LiveAnalysis { final BitVectorSolver S = new BitVectorSolver(new IKilldallFramework() { private final Graph G = GraphInverter.invert(cfg); + @Override public Graph getFlowGraph() { return G; } + @Override public ITransferFunctionProvider getTransferFunctionProvider() { return new ITransferFunctionProvider() { + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public boolean hasEdgeTransferFunctions() { return false; } @@ -222,6 +234,7 @@ public class LiveAnalysis { /** * Create the specialized operator for regular and exit basic blocks. */ + @Override public UnaryOperator getNodeTransferFunction(ISSABasicBlock node) { if (node.isExitBlock()) { return new ExitBlockGenKillOperator(); @@ -230,6 +243,7 @@ public class LiveAnalysis { } } + @Override public UnaryOperator getEdgeTransferFunction(ISSABasicBlock s, ISSABasicBlock d) { Assertions.UNREACHABLE(); return null; @@ -238,6 +252,7 @@ public class LiveAnalysis { /** * Live analysis uses 'union' as 'meet operator' */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } @@ -259,6 +274,7 @@ public class LiveAnalysis { */ return new Result() { + @Override public String toString() { StringBuffer s = new StringBuffer(); for (int i = 0; i < cfg.getNumberOfNodes(); i++) { @@ -270,10 +286,12 @@ public class LiveAnalysis { return s.toString(); } + @Override public boolean isLiveEntry(ISSABasicBlock bb, int valueNumber) { return S.getOut(bb).get(valueNumber); } + @Override public boolean isLiveExit(ISSABasicBlock bb, int valueNumber) { return S.getIn(bb).get(valueNumber); } @@ -285,6 +303,7 @@ public class LiveAnalysis { * @see * how the 'in' and 'out' variable sets work */ + @Override public BitVector getLiveBefore(int instr) { ISSABasicBlock bb = cfg.getBlockForInstruction(instr); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java index c4782e5a7..46faaf4d0 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java @@ -15,22 +15,27 @@ public class AbstractClassEntity extends AbstractDataEntity { this.type = type; } + @Override public String toString() { return "class " + type.getName(); } + @Override public int getKind() { return TYPE_ENTITY; } + @Override public String getName() { return type.getName(); } + @Override public CAstType getType() { return type; } + @Override public Collection getQualifiers() { return type.getQualifiers(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java index 61f296f5b..81f086265 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java @@ -28,22 +28,27 @@ public abstract class AbstractCodeEntity extends AbstractEntity { this.type = type; } + @Override public CAstNode getAST() { return Ast; } + @Override public CAstType getType() { return type; } + @Override public CAstControlFlowMap getControlFlow() { return cfg; } + @Override public CAstSourcePositionMap getSourceMap() { return src; } + @Override public CAstNodeTypeMap getNodeTypeMap() { return types; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java index 0ffeabe7a..78b53c112 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java @@ -9,30 +9,37 @@ import com.ibm.wala.cast.tree.CAstNodeTypeMap; import com.ibm.wala.cast.tree.CAstSourcePositionMap; abstract class AbstractDataEntity extends AbstractEntity { + @Override public CAstNode getAST() { return null; } + @Override public CAstControlFlowMap getControlFlow() { return null; } + @Override public CAstSourcePositionMap getSourceMap() { return null; } + @Override public CAstNodeTypeMap getNodeTypeMap() { return null; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java index f0c9c99e9..c2604e809 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java @@ -21,16 +21,19 @@ public abstract class AbstractEntity implements CAstEntity { private final Map> scopedEntities = HashMapFactory.make(); + @Override public Map> getAllScopedEntities() { return scopedEntities; } + @Override public String getSignature() { Assertions.UNREACHABLE(); return null; } + @Override public Collection getAnnotations() { return null; } @@ -39,10 +42,12 @@ public abstract class AbstractEntity implements CAstEntity { sourcePosition = pos; } + @Override public Position getPosition() { return sourcePosition; } + @Override public Iterator getScopedEntities(CAstNode construct) { if (scopedEntities.containsKey(construct)) { return scopedEntities.get(construct).iterator(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java index 0f1f1f11e..90cc2d8e4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java @@ -32,23 +32,28 @@ class AbstractFieldEntity extends AbstractDataEntity { } } + @Override public String toString() { return "field " + name + " of " + declaringClass.getName(); } + @Override public int getKind() { return FIELD_ENTITY; } + @Override public String getName() { return name; } + @Override public CAstType getType() { Assertions.UNREACHABLE(); return null; } + @Override public Collection getQualifiers() { return modifiers; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java index d5002e32c..9578f64a8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java @@ -26,6 +26,7 @@ public class AbstractGlobalEntity extends AbstractDataEntity { } } + @Override public String toString() { if (type == null) { return "global " + name; @@ -34,18 +35,22 @@ public class AbstractGlobalEntity extends AbstractDataEntity { } } + @Override public int getKind() { return GLOBAL_ENTITY; } + @Override public String getName() { return name; } + @Override public CAstType getType() { return type; } + @Override public Collection getQualifiers() { return modifiers; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java index ecb6ff5de..301973d57 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java @@ -23,6 +23,7 @@ public class AbstractScriptEntity extends AbstractCodeEntity { this(new File(file), type); } + @Override public int getKind() { return SCRIPT_ENTITY; } @@ -31,26 +32,32 @@ public class AbstractScriptEntity extends AbstractCodeEntity { return file; } + @Override public String getName() { return "script " + file.getName(); } + @Override public String toString() { return "script " + file.getName(); } + @Override public String[] getArgumentNames() { return new String[] { "script object" }; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 1; } + @Override public Collection getQualifiers() { return Collections.emptySet(); } 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 3ce431333..6c8a29b34 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 @@ -158,11 +158,13 @@ public abstract class AstTranslator extends CAstVisitor instructions = new ArrayList(); + @Override public int getNumber() { return getGraphNodeId(); } + @Override public int getGraphNodeId() { return number; } + @Override public void setGraphNodeId(int number) { this.number = number; } + @Override public int getFirstInstructionIndex() { return firstIndex; } @@ -554,6 +563,7 @@ public abstract class AstTranslator extends CAstVisitor -1) && (instructions.get(0) instanceof SSAGetCaughtExceptionInstruction); } + @Override public IMethod getMethod() { return null; } + @Override public Iterator iterator() { return instructions.iterator(); } @@ -624,10 +640,12 @@ public abstract class AstTranslator extends CAstVisitor, CAstNode> nodeMap, CAstNode oldSource, Object label, CAstNode oldTarget, CAstControlFlowMap orig, CAstSourcePositionMap src) { if (exception && !isExceptionLabel(label)) { @@ -734,10 +753,12 @@ public abstract class AstTranslator extends CAstVisitor>make() : null; if (hasDeadBlocks) { transferEdges(liveBlocks, icfg, new EdgeOperation() { + @Override public void act(PreBasicBlock src, PreBasicBlock dst) { if (! normalEdges.containsKey(src)) { normalEdges.put(src, HashSetFactory.make()); @@ -1116,6 +1139,7 @@ public abstract class AstTranslator extends CAstVisitormake()); @@ -1167,10 +1191,12 @@ public abstract class AstTranslator extends CAstVisitor getAllNames() { return values.keySet().iterator(); } + @Override public int allocateTempValue() { return getUnderlyingSymtab().newSymbol(); } + @Override public int getConstantValue(Object o) { if (o instanceof Integer) { return getUnderlyingSymtab().getConstant(((Integer) o).intValue()); @@ -1446,14 +1494,17 @@ public abstract class AstTranslator extends CAstVisitor getAllNames() { return globalSymbols.keySet().iterator(); } + @Override public int allocateTempValue() { throw new UnsupportedOperationException(); } + @Override public int getConstantValue(Object c) { throw new UnsupportedOperationException(); } + @Override public boolean isConstant(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public Object getConstantObject(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public ScopeType type() { return ScopeType.GLOBAL; } + @Override public boolean contains(String name) { return hasImplicitGlobals() || globalSymbols.containsKey(mapName(name)); } + @Override public boolean isCaseInsensitive(String name) { return caseInsensitiveNames.containsKey(name.toLowerCase()); } + @Override public Symbol lookup(final String name) { if (!globalSymbols.containsKey(mapName(name))) { if (hasImplicitGlobals()) { declare(new CAstSymbol() { + @Override public String name() { return name; } + @Override public boolean isFinal() { return false; } + @Override public boolean isCaseInsensitive() { return false; } + @Override public boolean isInternalName() { return false; } + @Override public Object defaultInitValue() { return null; } @@ -1851,29 +1963,35 @@ public abstract class AstTranslator extends CAstVisitor getAllNames() { return typeSymbols.keySet().iterator(); } + @Override public int allocateTempValue() { throw new UnsupportedOperationException(); } + @Override public int getConstantValue(Object c) { throw new UnsupportedOperationException(); } + @Override public boolean isConstant(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public Object getConstantObject(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public ScopeType type() { return ScopeType.TYPE; } + @Override public boolean contains(String name) { return typeSymbols.containsKey(mapName(name)); } + @Override public boolean isCaseInsensitive(String name) { return caseInsensitiveNames.containsKey(name.toLowerCase()); } + @Override public Symbol lookup(String nm) { if (typeSymbols.containsKey(mapName(nm))) return typeSymbols.get(mapName(nm)); @@ -1951,29 +2083,35 @@ public abstract class AstTranslator extends CAstVisitor getAccesses(CAstEntity e) { return parent.getAccesses(e); } + @Override public ModuleEntry getModule() { return parent.getModule(); } + @Override public String getName() { return parent.getName(); } + @Override public String file() { return parent.file(); } + @Override public CAstEntity top() { return parent.top(); } + @Override public CAstSourcePositionMap getSourceMap() { return parent.getSourceMap(); } + @Override public CAstControlFlowMap getControlFlow() { return parent.getControlFlow(); } + @Override public Scope currentScope() { return parent.currentScope(); } + @Override public Set entityScopes() { return parent.entityScopes(); } + @Override public IncipientCFG cfg() { return parent.cfg(); } + @Override public UnwindState getUnwindState() { return parent.getUnwindState(); } + @Override public void setCatchType(IBasicBlock bb, TypeReference catchType) { parent.setCatchType(bb, catchType); } + @Override public void setCatchType(CAstNode catchNode, TypeReference catchType) { parent.setCatchType(catchNode, catchType); } + @Override public Map getCatchTypes() { return parent.getCatchTypes(); } + @Override public void addEntityName(CAstEntity e, String name) { parent.addEntityName(e, name); } + @Override public String getEntityName(CAstEntity e) { return parent.getEntityName(e); } + @Override public boolean hasValue(CAstNode n) { return parent.hasValue(n); } + @Override public int setValue(CAstNode n, int v) { return parent.setValue(n, v); } + @Override public int getValue(CAstNode n) { return parent.getValue(n); } + @Override public Set, Integer>> exposeNameSet(CAstEntity entity, boolean writeSet) { return parent.exposeNameSet(entity, writeSet); } + @Override public Scope getGlobalScope() { return parent.getGlobalScope(); } @@ -2127,6 +2287,7 @@ public abstract class AstTranslator extends CAstVisitor getAccesses(CAstEntity e) { if (e == topNode) { if (accesses == null) { @@ -2233,30 +2399,37 @@ public abstract class AstTranslator extends CAstVisitor entityScopes() { return allEntityScopes; } + @Override public UnwindState getUnwindState() { return null; } + @Override public void setCatchType(CAstNode catchNode, TypeReference catchType) { setCatchType(cfg.getBlock(catchNode), catchType); } + @Override public void setCatchType(IBasicBlock bb, TypeReference catchType) { if (! catchTypes.containsKey(bb)) { catchTypes.put(bb, new TypeReference[] { catchType }); @@ -2277,19 +2450,23 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return catchTypes; } + @Override public boolean hasValue(CAstNode n) { return results.containsKey(n); } + @Override public final int setValue(CAstNode n, int v) { results.put(n, new Integer(v)); return v; } + @Override public final int getValue(CAstNode n) { if (results.containsKey(n)) return results.get(n).intValue(); @@ -2309,16 +2486,19 @@ public abstract class AstTranslator extends CAstVisitor[] getExposedNames() { return exposedNames; } + @Override public String[] getScopingParents() { return scopingParents; } + @Override public boolean isReadOnly(String name) { return readOnlyNames != null && readOnlyNames.contains(name); } + @Override public String getScopingName() { return functionLexicalName; } @@ -2799,14 +2987,17 @@ public abstract class AstTranslator extends CAstVisitor visitor) { if (DEBUG_TOP) System.err.println(("translating " + n.getName())); return false; } + @Override protected boolean visitFileEntity(CAstEntity n, WalkContext context, WalkContext fileContext, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFileEntity(CAstEntity n, WalkContext context, WalkContext fileContext, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitFieldEntity(CAstEntity n, WalkContext context, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFieldEntity(CAstEntity n, WalkContext context, CAstVisitor visitor) { // Define a new field in the enclosing type, if the language we're // processing allows such. @@ -2842,23 +3038,28 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveGlobalEntity(CAstEntity n, WalkContext context, 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())); } + @Override protected boolean visitTypeEntity(CAstEntity n, WalkContext context, WalkContext typeContext, CAstVisitor visitor) { return !defineType(n, (WalkContext) context); } + @Override protected void leaveTypeEntity(CAstEntity n, WalkContext context, WalkContext typeContext, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitFunctionEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { if (n.getAST() == null) // presumably abstract declareFunction(n, (WalkContext) context); @@ -2867,21 +3068,25 @@ public abstract class AstTranslator extends CAstVisitor visitor) { if (n.getAST() != null) // non-abstract closeFunctionEntity(n, (WalkContext) context, (WalkContext) codeContext); } + @Override protected boolean visitMacroEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { return true; } + @Override protected boolean visitScriptEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { declareFunction(n, (WalkContext) codeContext); initFunctionEntity(n, (WalkContext) context, (WalkContext) codeContext); return false; } + @Override protected void leaveScriptEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { closeFunctionEntity(n, (WalkContext) context, (WalkContext) codeContext); } @@ -2928,10 +3133,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { // here, n represents the "finally" block of the unwind return new UnwindContext(n, (WalkContext) context, visitor); @@ -2947,19 +3154,23 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFunctionExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { int result = processFunctionExpr(n, c); c.setValue(n, result); } + @Override protected boolean visitFunctionStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFunctionStmt(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = processFunctionExpr(n, context); CAstEntity fn = (CAstEntity) n.getChild(0).getValue(); @@ -2977,29 +3188,36 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveLocalScope(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(0))); } + @Override protected boolean visitBlockExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(n.getChildCount() - 1))); } + @Override protected boolean visitBlockStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitLoop(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; // loop test block @@ -3034,16 +3252,20 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveLoop(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitGetCaughtException(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveGetCaughtException(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; String nm = (String) n.getChild(0).getValue(); @@ -3053,22 +3275,27 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveThis(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, 1); } + @Override protected boolean visitSuper(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveSuper(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, 1); } + @Override protected boolean visitCall(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3076,6 +3303,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3089,10 +3317,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveVar(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; String nm = (String) n.getChild(0).getValue(); @@ -3108,15 +3338,18 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveConstant(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; c.setValue(n, context.currentScope().getConstantValue(n.getValue())); } + @Override protected boolean visitBinaryExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3146,6 +3379,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3165,6 +3399,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3172,6 +3407,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3179,6 +3415,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3186,6 +3423,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3193,10 +3431,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayRef(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int arrayValue = c.getValue(n.getChild(0)); @@ -3205,11 +3445,13 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } // TODO: should we handle exploded declaration nodes here instead? + @Override protected void leaveDeclStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { CAstSymbol s = (CAstSymbol) n.getChild(0).getValue(); String nm = s.name(); @@ -3230,10 +3472,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveReturn(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (n.getChildCount() > 0) { @@ -3247,10 +3491,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveIfgoto(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (n.getChildCount() == 1) { @@ -3270,10 +3516,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveGoto(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (!context.cfg().isDeadBlock(context.cfg().getCurrentBlock())) { @@ -3288,6 +3536,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (!context.getControlFlow().getSourceNodes(n).isEmpty()) { @@ -3297,6 +3546,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } @@ -3344,29 +3594,37 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfStmtTrueClause(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfExprCondition(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfExprTrueClause(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitIfStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { processIf(n, false, c, visitor); return true; } + @Override protected boolean visitIfExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3375,10 +3633,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveNew(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; @@ -3397,10 +3657,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveObjectLiteralFieldInit(CAstNode n, int i, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (n.getChild(i).getKind() == CAstNode.EMPTY) { @@ -3409,27 +3671,33 @@ public abstract class AstTranslator extends CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(0))); } + @Override protected boolean visitArrayLiteral(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayLiteralObject(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(0))); } + @Override protected void leaveArrayLiteralInitElement(CAstNode n, int i, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; arrayOpHandler.doArrayWrite(context, c.getValue(n.getChild(0)), n, new int[] { context.currentScope().getConstantValue(new Integer(i - 1)) }, c.getValue(n.getChild(i))); } + @Override protected void leaveArrayLiteral(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitObjectRef(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3437,6 +3705,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3444,10 +3713,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override public void leaveAssign(CAstNode n, WalkContext c, CAstVisitor visitor) { if (n.getKind() == CAstNode.ASSIGN) { c.setValue(n, c.getValue(n.getChild(1))); @@ -3483,10 +3754,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayRefAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int rval = c.getValue(v); @@ -3494,10 +3767,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int temp = context.currentScope().allocateTempValue(); @@ -3508,10 +3783,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveObjectRefAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int rval = c.getValue(v); @@ -3522,10 +3799,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveObjectRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int temp = context.currentScope().allocateTempValue(); @@ -3535,22 +3814,27 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockExprAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(n.getChildCount() - 1))); } + @Override protected boolean visitBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { /* empty */ c.setValue(n, c.getValue(n.getChild(n.getChildCount() - 1))); } + @Override protected boolean visitVarAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } @@ -3569,6 +3853,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int rval = c.getValue(v); @@ -3578,10 +3863,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveVarAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; String nm = (String) n.getChild(0).getValue(); @@ -3745,6 +4032,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (isSimpleSwitch(n, context, visitor)) { @@ -3756,16 +4044,20 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveSwitch(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitThrow(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveThrow(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; doThrow(context, c.getValue(n.getChild(0))); @@ -3784,6 +4076,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; @@ -3814,13 +4107,16 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitUnwind(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveUnwind(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } @@ -3838,6 +4134,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { final WalkContext context = (WalkContext) c; boolean addSkipCatchGoto = false; @@ -3877,25 +4174,31 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveTry(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitEmpty(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveEmpty(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; c.setValue(n, context.currentScope().getConstantValue(null)); } + @Override protected boolean visitPrimitive(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leavePrimitive(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3904,18 +4207,22 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveVoid(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, -1); } + @Override protected boolean visitAssert(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveAssert(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; boolean fromSpec = true; @@ -3928,16 +4235,19 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveEachElementGet(CAstNode n, WalkContext c, CAstVisitor visitor) { int result = ((WalkContext) c).currentScope().allocateTempValue(); c.setValue(n, result); ((WalkContext) c).cfg().addInstruction(new EachElementGetInstruction(result, c.getValue(n.getChild(0)))); } + @Override protected boolean visitEachElementHasNext(CAstNode n, WalkContext c, CAstVisitor visitor) { return false; } @@ -3949,10 +4259,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveTypeLiteralExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext wc = (WalkContext) c; assert n.getChild(0).getKind() == CAstNode.CONSTANT; @@ -3966,10 +4278,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveIsDefinedExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext wc = (WalkContext) c; int ref = c.getValue(n.getChild(0)); @@ -3982,10 +4296,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveEcho(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext wc = (WalkContext) c; @@ -4006,6 +4322,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext wc = (WalkContext) c; @@ -4037,6 +4354,7 @@ public abstract class AstTranslator extends CAstVisitor, CAstNode> nodeMap) { if (isMacroExpansion && root.getKind() == CAstNode.MACRO_VAR) { int arg = ((Number) root.getChild(0).getValue()).intValue(); @@ -4054,10 +4372,12 @@ public abstract class AstTranslator extends CAstVisitor entityScopes() { return Collections.singleton(globalScope); } + @Override public CAstSourcePositionMap getSourceMap() { return N.getSourceMap(); } + @Override public CAstControlFlowMap getControlFlow() { return N.getControlFlow(); } + @Override public IncipientCFG cfg() { return null; } + @Override public UnwindState getUnwindState() { return null; } + @Override public String getName() { return null; } + @Override public void setCatchType(IBasicBlock bb, TypeReference catchType) { } + @Override public void setCatchType(CAstNode castNode, TypeReference catchType) { } + @Override public Map getCatchTypes() { return null; } + @Override public void addEntityName(CAstEntity e, String name) { entityNames.put(e, name); } + @Override public String getEntityName(CAstEntity e) { if (e == null) { return null; @@ -4150,31 +4485,37 @@ public abstract class AstTranslator extends CAstVisitor, Integer>> exposeNameSet(CAstEntity entity, boolean writeSet) { assert false; return null; } + @Override public Set getAccesses(CAstEntity e) { assert false; return null; } + @Override public Scope getGlobalScope(){ return globalScope; } @@ -4184,6 +4525,7 @@ public abstract class AstTranslator extends CAstVisitor, T> implements WalkContext { + @Override public Map> getScopedEntities() { assert false; return Collections.emptyMap(); } + @Override public void addScopedEntity(CAstNode newNode, CAstEntity visit) { assert false; } + @Override public CAstControlFlowRecorder cfg() { assert false; return null; } + @Override public CAstSourcePositionRecorder pos() { assert false; return null; } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { assert false; return null; } + @Override public T getContinueFor(String label) { assert false; return null; } + @Override public T getBreakFor(String label) { assert false; return null; @@ -128,30 +135,37 @@ public interface TranslatorToCAst { this.parent = parent; } + @Override public CAstControlFlowRecorder cfg() { return parent.cfg(); } + @Override public CAstSourcePositionRecorder pos() { return parent.pos(); } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { return parent.getNodeTypeMap(); } + @Override public T getContinueFor(String label) { return parent.getContinueFor(label); } + @Override public T getBreakFor(String label) { return parent.getBreakFor(label); } + @Override public void addScopedEntity(CAstNode newNode, CAstEntity visit) { parent.addScopedEntity(newNode, visit); } + @Override public Map> getScopedEntities() { return parent.getScopedEntities(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java index cf2bad852..dc09677e0 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java @@ -56,30 +56,37 @@ abstract public class AstClass implements IClass, ClassConstants { this.typeReference = TypeReference.findOrCreate(loader.getReference(), typeName); } + @Override public boolean isInterface() { return (modifiers & ACC_INTERFACE) != 0; } + @Override public boolean isAbstract() { return (modifiers & ACC_ABSTRACT) != 0; } + @Override public boolean isPublic() { return (modifiers & ACC_PUBLIC) != 0; } + @Override public boolean isPrivate() { return (modifiers & ACC_PRIVATE) != 0; } + @Override public boolean isReferenceType() { return true; } + @Override public boolean isArrayClass() { return false; } + @Override public int getModifiers() { return modifiers; } @@ -92,26 +99,32 @@ abstract public class AstClass implements IClass, ClassConstants { return sourcePosition.getURL(); } + @Override public String getSourceFileName() { return sourcePosition.getURL().getFile(); } + @Override public InputStream getSource() { return null; } + @Override public TypeName getName() { return typeName; } + @Override public TypeReference getReference() { return typeReference; } + @Override public IClassLoader getClassLoader() { return loader; } + @Override public abstract IClass getSuperclass(); private Collection gatherInterfaces() { @@ -123,16 +136,20 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public abstract Collection getDirectInterfaces(); + @Override public Collection getAllImplementedInterfaces() { return gatherInterfaces(); } + @Override public IMethod getClassInitializer() { return getMethod(MethodReference.clinitSelector); } + @Override public IMethod getMethod(Selector selector) { if (declaredMethods.containsKey(selector)) { return declaredMethods.get(selector); @@ -143,6 +160,7 @@ abstract public class AstClass implements IClass, ClassConstants { } } + @Override public IField getField(Atom name) { if (declaredFields.containsKey(name)) { return declaredFields.get(name); @@ -153,14 +171,17 @@ abstract public class AstClass implements IClass, ClassConstants { } } + @Override public IField getField(Atom name, TypeName type) { // assume that for AST classes, you can't have multiple fields with the same name return getField(name); } + @Override public Collection getDeclaredMethods() { return declaredMethods.values(); } + @Override public Collection getDeclaredInstanceFields() { Set result = HashSetFactory.make(); for (Iterator FS = declaredFields.values().iterator(); FS.hasNext();) { @@ -173,6 +194,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getDeclaredStaticFields() { Set result = HashSetFactory.make(); for (Iterator FS = declaredFields.values().iterator(); FS.hasNext();) { @@ -185,6 +207,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllInstanceFields() { Collection result = HashSetFactory.make(); result.addAll(getDeclaredInstanceFields()); @@ -195,6 +218,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllStaticFields() { Collection result = HashSetFactory.make(); result.addAll(getDeclaredStaticFields()); @@ -205,6 +229,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllFields() { Collection result = HashSetFactory.make(); result.addAll(getAllInstanceFields()); @@ -212,6 +237,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllMethods() { Collection result = HashSetFactory.make(); for (Iterator ms = getDeclaredMethods().iterator(); ms.hasNext();) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java index 91093f3cb..1b3b5c1aa 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java @@ -37,6 +37,7 @@ public abstract class AstDynamicPropertyClass extends AstClass { this.defaultDescriptor = defaultDescriptor; } + @Override public IField getField(final Atom name) { if (declaredFields.containsKey(name)) { return declaredFields.get(name); @@ -45,54 +46,67 @@ public abstract class AstDynamicPropertyClass extends AstClass { } else { final boolean isStatic = isStaticField(name); declaredFields.put(name, new IField() { + @Override public String toString() { return ""; } + @Override public IClass getDeclaringClass() { return AstDynamicPropertyClass.this; } + @Override public Atom getName() { return name; } + @Override public TypeReference getFieldTypeReference() { return defaultDescriptor; } + @Override public FieldReference getReference() { return FieldReference.findOrCreate(AstDynamicPropertyClass.this.getReference(), name, defaultDescriptor); } + @Override public boolean isFinal() { return false; } + @Override public boolean isPrivate() { return false; } + @Override public boolean isProtected() { return false; } + @Override public boolean isPublic() { return false; } + @Override public boolean isVolatile() { return false; } + @Override public boolean isStatic() { return isStatic; } + @Override public IClassHierarchy getClassHierarchy() { return AstDynamicPropertyClass.this.getClassHierarchy(); } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java index 65fd4a827..ce723f35e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java @@ -43,54 +43,67 @@ public class AstField implements IField { } + @Override public Collection getAnnotations() { return annotations; } + @Override public IClass getDeclaringClass() { return declaringClass; } + @Override public String toString() { return "field " + ref.getName(); } + @Override public Atom getName() { return ref.getName(); } + @Override public TypeReference getFieldTypeReference() { return ref.getFieldType(); } + @Override public FieldReference getReference() { return ref; } + @Override public boolean isStatic() { return qualifiers.contains(CAstQualifier.STATIC); } + @Override public boolean isFinal() { return qualifiers.contains(CAstQualifier.CONST) || qualifiers.contains(CAstQualifier.FINAL); } + @Override public boolean isPrivate() { return qualifiers.contains(CAstQualifier.PRIVATE); } + @Override public boolean isProtected() { return qualifiers.contains(CAstQualifier.PROTECTED); } + @Override public boolean isPublic() { return qualifiers.contains(CAstQualifier.PUBLIC); } + @Override public boolean isVolatile() { return qualifiers.contains(CAstQualifier.VOLATILE); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java index 713651a9a..8cbbf15aa 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java @@ -53,6 +53,7 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { sourcePosition); } + @Override public String toString() { try { return "function " + functionBody.getReference().getDeclaringClass().getName(); @@ -61,22 +62,27 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { } } + @Override public IClassLoader getClassLoader() { return loader; } + @Override public boolean isInterface() { return false; } + @Override public boolean isAbstract() { return functionBody == null; } + @Override public boolean isPublic() { return true; } + @Override public boolean isPrivate() { return false; } @@ -85,18 +91,22 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { return false; } + @Override public int getModifiers() { return ACC_PUBLIC; } + @Override public IClass getSuperclass() { return loader.lookupClass(superReference.getName()); } + @Override public Collection getDirectInterfaces() { return Collections.emptySet(); } + @Override public Collection getAllImplementedInterfaces() { return Collections.emptySet(); } @@ -105,6 +115,7 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { return Collections.emptySet(); } + @Override public IMethod getMethod(Selector selector) { if (selector.equals(AstMethodReference.fnSelector)) { return functionBody; @@ -113,15 +124,18 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { } } + @Override public IField getField(Atom name) { return loader.lookupClass(superReference.getName()).getField(name); } + @Override public IField getField(Atom name, TypeName type) { // assume that for AST classes, you can't have multiple fields with the same name return loader.lookupClass(superReference.getName()).getField(name); } + @Override public TypeReference getReference() { return reference; } @@ -134,22 +148,27 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { return sourcePosition.getURL(); } + @Override public String getSourceFileName() { return sourcePosition.getURL().getFile(); } + @Override public InputStream getSource() { return null; } + @Override public IMethod getClassInitializer() { return null; } + @Override public boolean isArrayClass() { return false; } + @Override public Collection getDeclaredMethods() { if (functionBody != null) { return Collections.singleton(functionBody); @@ -158,34 +177,42 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { } } + @Override public Collection getDeclaredInstanceFields() { return Collections.emptySet(); } + @Override public Collection getDeclaredStaticFields() { return Collections.emptySet(); } + @Override public Collection getAllInstanceFields() { return Collections.emptySet(); } + @Override public Collection getAllStaticFields() { return Collections.emptySet(); } + @Override public Collection getAllFields() { return Collections.emptySet(); } + @Override public Collection getAllMethods() { return Collections.singleton(functionBody); } + @Override public TypeName getName() { return reference.getName(); } + @Override public boolean isReferenceType() { return true; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java index 65dd81776..96930b887 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java @@ -173,6 +173,7 @@ public abstract class AstMethod implements IMethod { return debugInfo; } + @Override public Collection getAnnotations() { return annotations; } @@ -186,10 +187,12 @@ public abstract class AstMethod implements IMethod { public abstract AstMethod getMethod(); + @Override public int hashCode() { return getName().hashCode() * getMethod().hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof LexicalParent) && getName().equals(((LexicalParent) o).getName()) && getMethod().equals(((LexicalParent) o).getMethod()); @@ -198,78 +201,97 @@ public abstract class AstMethod implements IMethod { public abstract LexicalParent[] getParents(); + @Override public IClass getDeclaringClass() { return cls; } + @Override public String getSignature() { return ref.getSignature(); } + @Override public Selector getSelector() { return ref.getSelector(); } + @Override public boolean isClinit() { return getSelector().equals(MethodReference.clinitSelector); } + @Override public boolean isInit() { return getSelector().getName().equals(MethodReference.initAtom); } + @Override public Atom getName() { return ref.getName(); } + @Override public Descriptor getDescriptor() { return ref.getDescriptor(); } + @Override public MethodReference getReference() { return ref; } + @Override public TypeReference getReturnType() { return ref.getReturnType(); } + @Override public boolean isStatic() { return qualifiers.contains(CAstQualifier.STATIC); } + @Override public boolean isSynchronized() { return qualifiers.contains(CAstQualifier.SYNCHRONIZED); } + @Override public boolean isNative() { return qualifiers.contains(CAstQualifier.NATIVE); } + @Override public boolean isSynthetic() { return false; } + @Override public boolean isAbstract() { return qualifiers.contains(CAstQualifier.ABSTRACT); } + @Override public boolean isPrivate() { return qualifiers.contains(CAstQualifier.PRIVATE); } + @Override public boolean isProtected() { return qualifiers.contains(CAstQualifier.PROTECTED); } + @Override public boolean isPublic() { return qualifiers.contains(CAstQualifier.PUBLIC); } + @Override public boolean isFinal() { return qualifiers.contains(CAstQualifier.FINAL); } + @Override public boolean isBridge() { return qualifiers.contains(CAstQualifier.VOLATILE); } @@ -278,6 +300,7 @@ public abstract class AstMethod implements IMethod { return cfg; } + @Override public boolean hasExceptionHandler() { return hasCatchBlock; } @@ -286,10 +309,12 @@ public abstract class AstMethod implements IMethod { return hasMonitorOp; } + @Override public int getNumberOfParameters() { return symtab.getParameterValueNumbers().length; } + @Override public int getLineNumber(int instructionIndex) { Position pos = debugInfo.getInstructionPosition(instructionIndex); if (pos == null) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java index d7de02e65..1c80e6fb3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java @@ -75,6 +75,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { private Iterator getMessages(final byte severity) { return new MapIterator>, ModuleEntry>(new FilterIterator>>(errors.entrySet().iterator(), new Filter>>() { + @Override public boolean accepts(Entry> o) { for(Warning w : o.getValue()) { if (w.getLevel() == severity) { @@ -84,6 +85,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { return false; } }), new Function>, ModuleEntry>() { + @Override public ModuleEntry apply(Entry> object) { return object.getKey(); } @@ -112,22 +114,27 @@ public abstract class CAstAbstractLoader implements IClassLoader { return (IClass) types.get(TypeName.string2TypeName(className)); } + @Override public IClass lookupClass(TypeName className) { return (IClass) types.get(className); } + @Override public Iterator iterateAllClasses() { return types.values().iterator(); } + @Override public int getNumberOfClasses() { return types.size(); } + @Override public Atom getName() { return getReference().getName(); } + @Override public int getNumberOfMethods() { int i = 0; for (Iterator cls = types.values().iterator(); cls.hasNext();) { @@ -142,6 +149,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { return i; } + @Override public String getSourceFileName(IMethod method, int bcOffset) { if (!(method instanceof AstMethod)){ return null; @@ -153,10 +161,12 @@ public abstract class CAstAbstractLoader implements IClassLoader { return pos.getURL().getFile(); } + @Override public String getSourceFileName(IClass klass) { return ((AstClass)klass).getSourcePosition().getURL().getFile(); } + @Override public InputStream getSource(IClass klass) { try { return ((AstClass)klass).getSourcePosition().getInputStream(); @@ -165,6 +175,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { } } + @Override public InputStream getSource(IMethod method, int bcOffset) { try { return ((AstMethod)method).getSourcePosition(bcOffset).getInputStream(); @@ -173,11 +184,13 @@ public abstract class CAstAbstractLoader implements IClassLoader { } } + @Override public IClassLoader getParent() { assert parent != null; return parent; } + @Override public void removeAll(Collection toRemove) { Set keys = HashSetFactory.make(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java index 72bfe78e9..68d0f23cc 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java @@ -91,6 +91,7 @@ public abstract class CAstAbstractModuleLoader extends CAstAbstractLoader { } + @Override public void init(final List modules) { final CAst ast = new CAstImpl(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java index 04a3dfb62..052eea4d6 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java @@ -28,6 +28,7 @@ public abstract class SingleClassLoaderFactory implements ClassLoaderFactory { */ private IClassLoader THE_LOADER = null; + @Override public IClassLoader getLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, AnalysisScope scope) { if (THE_LOADER == null) { THE_LOADER = makeTheLoader(cha); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java index 8dacb26f3..0cc43fd3a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java @@ -31,14 +31,16 @@ public class AstPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java index 2e032360e..03b34d7ba 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java @@ -31,14 +31,16 @@ public class AstPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java index a5475112f..fb4919e8e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java @@ -39,31 +39,38 @@ public interface CAstControlFlowMap { * uncaught exception. */ public static final CAstNode EXCEPTION_TO_EXIT = new CAstNode() { + @Override public int getKind() { return CAstNode.CONSTANT; } + @Override public Object getValue() { return this; } + @Override public CAstNode getChild(int n) { Assertions.UNREACHABLE(); return null; } + @Override public int getChildCount() { return 0; } + @Override public String toString() { return "EXCEPTION_TO_EXIT"; } + @Override public int hashCode() { return getKind() * toString().hashCode(); } + @Override public boolean equals(Object o) { return o == this; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java index 3ea0d471b..986cede81 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java @@ -14,22 +14,27 @@ public interface CAstMemberReference extends CAstReference { public static final CAstMemberReference FUNCTION = new CAstMemberReference() { + @Override public String member() { return "the function body"; } + @Override public CAstType type() { return null; } + @Override public String toString() { return "Any::FUNCTION CALL"; } + @Override public int hashCode() { return toString().hashCode(); } + @Override public boolean equals(Object o) { return o == this; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java index d7aff3a11..3fd850bb4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java @@ -73,6 +73,7 @@ public class CAstQualifier { return fName; } + @Override public boolean equals(Object o) { if (!(o instanceof CAstQualifier)) return false; @@ -80,6 +81,7 @@ public class CAstQualifier { return other.fName.equals(fName) && (fBit == other.fBit); } + @Override public int hashCode() { int result = 37; result = result * 13 + fName.hashCode(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java index b212664e9..1f711ae53 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.tree; public interface CAstSymbol { public static Object NULL_DEFAULT_VALUE = new Object() { + @Override public String toString() { return "NULL DEFAULT VALUE"; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java index 783d1b165..8fccb0d86 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java @@ -64,10 +64,12 @@ public interface CAstType { public static final CAstType DYNAMIC = new CAstType() { + @Override public String getName() { return "DYNAMIC"; } + @Override public Collection/**/ getSupertypes() { return Collections.EMPTY_SET; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java index e784f49ca..a744d931a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java @@ -21,6 +21,7 @@ public interface CAstTypeDictionary/**/ extends Iterable { CAstReference resolveReference(CAstReference ref); + @Override Iterator iterator(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java index 9361ab196..350523a44 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java @@ -16,6 +16,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public abstract class AbstractSourcePosition implements Position { + @Override public boolean equals(Object o){ if (o instanceof Position) { Position p = (Position)o; @@ -33,10 +34,12 @@ public abstract class AbstractSourcePosition implements Position { } } + @Override public int hashCode() { return getFirstLine()*getLastLine()*getFirstCol()*getLastCol(); } + @Override public int compareTo(Object o) { if (o instanceof Position) { Position p = (Position)o; @@ -54,6 +57,7 @@ public abstract class AbstractSourcePosition implements Position { } } + @Override public String toString() { URL x = getURL(); String xf = x.toString(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java index 6414f7872..be9787708 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java @@ -67,6 +67,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { this.label = label; } + @Override public int hashCode() { if (label != null) return from.hashCode() * label.hashCode(); @@ -74,11 +75,13 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { return from.hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof Key) && from == ((Key) o).from && ((label == null) ? ((Key) o).label == null : label.equals(((Key) o).label)); } + @Override public String toString() { return ""; } @@ -89,6 +92,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { map(EXCEPTION_TO_EXIT, EXCEPTION_TO_EXIT); } + @Override public CAstNode getTarget(CAstNode from, Object label) { assert CAstToNode.get(from) != null; Key key = new Key(label, CAstToNode.get(from)); @@ -100,6 +104,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { return null; } + @Override public Collection getTargetLabels(CAstNode from) { if (labelMap.containsKey(CAstToNode.get(from))) { return labelMap.get(CAstToNode.get(from)); @@ -108,6 +113,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { } } + @Override public Collection getSourceNodes(CAstNode to) { if (sourceMap.containsKey(CAstToNode.get(to))) { return (Set) sourceMap.get(CAstToNode.get(to)); @@ -116,6 +122,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { } } + @Override public Collection getMappedNodes() { Collection nodes = cachedMappedNodes; if (nodes == null) { @@ -192,6 +199,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { return nodeToCAst.containsKey(node); } + @Override public String toString() { StringBuffer sb = new StringBuffer("control flow map\n"); for (Iterator keys = table.keySet().iterator(); keys.hasNext();) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java index 775138f95..13da32d82 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java @@ -27,6 +27,7 @@ import com.ibm.wala.cast.util.CAstPrinter; public class CAstImpl implements CAst { private int nextID = 0; + @Override public String makeUnique() { return "id" + (nextID++); } @@ -45,14 +46,17 @@ public class CAstImpl implements CAst { + "]"; } + @Override public int getKind() { return kind; } + @Override public Object getValue() { return null; } + @Override public CAstNode getChild(int n) { try { return cs[n]; @@ -61,14 +65,17 @@ public class CAstImpl implements CAst { } } + @Override public int getChildCount() { return cs.length; } + @Override public String toString() { return System.identityHashCode(this) + ":" + CAstPrinter.print(this); } + @Override public int hashCode() { int code = getKind() * (getChildCount() + 13); for (int i = 0; i < getChildCount(); i++) { @@ -79,10 +86,12 @@ public class CAstImpl implements CAst { } } + @Override public CAstNode makeNode(final int kind, final CAstNode[] cs) { return new CAstNodeImpl(kind, cs); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode[] cs) { CAstNode[] children = new CAstNode[cs.length + 1]; children[0] = c1; @@ -90,30 +99,37 @@ public class CAstImpl implements CAst { return makeNode(kind, children); } + @Override public CAstNode makeNode(int kind) { return makeNode(kind, new CAstNode[0]); } + @Override public CAstNode makeNode(int kind, CAstNode c1) { return makeNode(kind, new CAstNode[] { c1 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2) { return makeNode(kind, new CAstNode[] { c1, c2 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3) { return makeNode(kind, new CAstNode[] { c1, c2, c3 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3, CAstNode c4) { return makeNode(kind, new CAstNode[] { c1, c2, c3, c4 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3, CAstNode c4, CAstNode c5) { return makeNode(kind, new CAstNode[] { c1, c2, c3, c4, c5 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3, CAstNode c4, CAstNode c5, CAstNode c6) { return makeNode(kind, new CAstNode[] { c1, c2, c3, c4, c5, c6 }); } @@ -125,59 +141,73 @@ public class CAstImpl implements CAst { this.value = value; } + @Override public int getKind() { return CAstNode.CONSTANT; } + @Override public Object getValue() { return value; } + @Override public CAstNode getChild(int n) { throw new NoSuchElementException(); } + @Override public int getChildCount() { return 0; } + @Override public String toString() { return "CAstValue: " + value; } + @Override public int hashCode() { return getKind() * toString().hashCode(); } } + @Override public CAstNode makeConstant(final Object value) { return new CAstValueImpl(value); } + @Override public CAstNode makeConstant(boolean value) { return makeConstant(value ? Boolean.TRUE : Boolean.FALSE); } + @Override public CAstNode makeConstant(char value) { return makeConstant(new Character(value)); } + @Override public CAstNode makeConstant(short value) { return makeConstant(new Short(value)); } + @Override public CAstNode makeConstant(int value) { return makeConstant(new Integer(value)); } + @Override public CAstNode makeConstant(long value) { return makeConstant(new Long(value)); } + @Override public CAstNode makeConstant(float value) { return makeConstant(new Float(value)); } + @Override public CAstNode makeConstant(double value) { return makeConstant(new Double(value)); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java index 8bbc2ffb6..b15d2e275 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java @@ -26,6 +26,7 @@ public class CAstNodeTypeMapRecorder { private static final long serialVersionUID= 7812144102027916961L; + @Override public CAstType getNodeType(CAstNode node) { return (CAstType) get(node); } @@ -34,6 +35,7 @@ public class CAstNodeTypeMapRecorder put(node, type); } + @Override public Collection getMappedNodes() { return keySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java index 07f48dc85..dc527f283 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java @@ -29,22 +29,27 @@ public class CAstOperator implements CAstNode { this.op = op; } + @Override public String toString() { return "OP:" + op; } + @Override public int getKind() { return CAstNode.OPERATOR; } + @Override public Object getValue() { return op; } + @Override public CAstNode getChild(int n) { throw new NoSuchElementException(); } + @Override public int getChildCount() { return 0; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java index 2d8de6884..4df9dd6ef 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java @@ -25,10 +25,12 @@ public class CAstSourcePositionRecorder implements CAstSourcePositionMap { private final HashMap positions = HashMapFactory.make(); + @Override public Position getPosition(CAstNode n) { return positions.get(n); } + @Override public Iterator getMappedNodes() { return positions.keySet().iterator(); } @@ -59,17 +61,26 @@ public class CAstSourcePositionRecorder implements CAstSourcePositionMap { { setPosition(n, new AbstractSourcePosition() { - public int getFirstLine() { return fl; } - public int getLastLine() { return ll; } - public int getFirstCol() { return fc; } - public int getLastCol() { return lc; } - public int getFirstOffset() { return -1; } - public int getLastOffset() { return -1; } - public URL getURL() { return url; } - public InputStream getInputStream() throws IOException { + @Override + public int getFirstLine() { return fl; } + @Override + public int getLastLine() { return ll; } + @Override + public int getFirstCol() { return fc; } + @Override + public int getLastCol() { return lc; } + @Override + public int getFirstOffset() { return -1; } + @Override + public int getLastOffset() { return -1; } + @Override + public URL getURL() { return url; } + @Override + public InputStream getInputStream() throws IOException { return file.openConnection().getInputStream(); } - public String toString() { + @Override + public String toString() { return "["+fl+":"+fc+"]->["+ll+":"+lc+"]"; } }); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java index 8ae1aead8..a3e064d68 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java @@ -35,5 +35,6 @@ public class CAstSymbolImpl extends CAstSymbolImplBase { super(_name, _isFinal, _isCaseInsensitive, _defaultInitValue); } + @Override public boolean isInternalName() { return false; } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java index ae9723247..2ec09d10a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java @@ -45,24 +45,30 @@ public abstract class CAstSymbolImplBase implements CAstSymbol { this._defaultInitValue= defaultInitValue; } + @Override public String name() { return _name; } + @Override public boolean isFinal() { return _isFinal; } + @Override public boolean isCaseInsensitive() { return _isCaseInsensitive; } + @Override public Object defaultInitValue() { return _defaultInitValue; } + @Override public abstract boolean isInternalName(); + @Override public String toString() { return _name; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java index 87af3307f..1a583e291 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java @@ -24,6 +24,7 @@ import com.ibm.wala.util.collections.HashMapFactory; public class CAstTypeDictionaryImpl implements CAstTypeDictionary { protected final Map fMap = HashMapFactory.make(); + @Override public CAstType getCAstTypeFor(Object/*ASTType*/ astType) { return (CAstType) fMap.get(astType); } @@ -33,10 +34,12 @@ public class CAstTypeDictionaryImpl implements CAstTypeDictionary { fMap.put(astType, castType); } + @Override public Iterator iterator() { return fMap.values().iterator(); } + @Override public CAstReference resolveReference(CAstReference ref) { return ref; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java index 96dc8d7f2..2cd6f59f8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java @@ -30,6 +30,7 @@ public class CAstValueImpl extends CAstImpl { super(kind, cs); } + @Override public int hashCode() { int value = 1237 * kind; for(int i = 0; i < cs.length; i++) @@ -38,6 +39,7 @@ public class CAstValueImpl extends CAstImpl { return value; } + @Override public boolean equals(Object o) { if (! (o instanceof CAstNode)) return false; if (kind != ((CAstNode)o).getKind()) return false; @@ -50,6 +52,7 @@ public class CAstValueImpl extends CAstImpl { } } + @Override public CAstNode makeNode(final int kind, final CAstNode[] cs) { return new CAstNodeValueImpl(kind, cs); } @@ -60,10 +63,12 @@ public class CAstValueImpl extends CAstImpl { super(value); } + @Override public int hashCode() { return value.hashCode(); } + @Override public boolean equals(Object o) { if (o instanceof CAstNode) { return value==null? @@ -75,6 +80,7 @@ public class CAstValueImpl extends CAstImpl { } } + @Override public CAstNode makeConstant(final Object value) { return new CAstValueValueImpl(value); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java index 047b88a30..98914fc74 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java @@ -30,66 +30,82 @@ public class DelegatingEntity implements CAstEntity { this.base = base; } + @Override public int getKind() { return base.getKind(); } + @Override public String getName() { return base.getName(); } + @Override public String getSignature() { return base.getSignature(); } + @Override public String[] getArgumentNames() { return base.getArgumentNames(); } + @Override public CAstNode[] getArgumentDefaults() { return base.getArgumentDefaults(); } + @Override public int getArgumentCount() { return base.getArgumentCount(); } + @Override public Map> getAllScopedEntities() { return base.getAllScopedEntities(); } + @Override public Iterator getScopedEntities(CAstNode construct) { return base.getScopedEntities(construct); } + @Override public CAstNode getAST() { return base.getAST(); } + @Override public CAstControlFlowMap getControlFlow() { return base.getControlFlow(); } + @Override public CAstSourcePositionMap getSourceMap() { return base.getSourceMap(); } + @Override public CAstSourcePositionMap.Position getPosition() { return base.getPosition(); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return base.getNodeTypeMap(); } + @Override public Collection getQualifiers() { return base.getQualifiers(); } + @Override public CAstType getType() { return base.getType(); } + @Override public Collection getAnnotations() { return base.getAnnotations(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java index f6a122162..d2c7b6efe 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java @@ -25,24 +25,33 @@ public class LineNumberPosition extends AbstractSourcePosition { this.lineNumber = lineNumber; } + @Override public int getFirstLine() { return lineNumber; } + @Override public int getLastLine() { return lineNumber; } + @Override public int getFirstCol() { return -1; } + @Override public int getLastCol() { return -1; } + @Override public int getFirstOffset() { return -1; } + @Override public int getLastOffset() { return -1; } + @Override public URL getURL() { return url; } + @Override public InputStream getInputStream() throws IOException { return localFile.openConnection().getInputStream(); } + @Override public String toString() { String nm = url.getFile(); nm = nm.substring(nm.lastIndexOf('/') + 1); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java index b56953576..5b7712c1a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java @@ -26,6 +26,7 @@ public class Alt implements NodePattern { this.right = right; } + @Override public boolean matches(CAstNode node) { return left.matches(node) || right.matches(node); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java index e6f97eb7c..f71498196 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java @@ -20,7 +20,8 @@ import com.ibm.wala.cast.tree.CAstNode; * */ public class AnyNode implements NodePattern { - public boolean matches(CAstNode node) { + @Override + public boolean matches(CAstNode node) { return true; } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java index 5bd0daa38..b3850255f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java @@ -34,7 +34,8 @@ public class NodeOfKind implements NodePattern { /* (non-Javadoc) * @see pattern.NodePattern#matches(com.ibm.wala.cast.tree.CAstNode) */ - public boolean matches(CAstNode node) { + @Override + public boolean matches(CAstNode node) { if(node == null || node.getKind() != kind || node.getChildCount() != children.length) return false; for(int i=0;i { + @Override public UnwindKey key() { return null; } @@ -85,12 +90,14 @@ public class AstLoopUnwinder this.parent = parent; } + @Override public UnwindKey key() { return new UnwindKey(iteration, parent.key()); } } + @Override protected CAstNode flowOutTo(Map nodeMap, CAstNode oldSource, Object label, @@ -102,6 +109,7 @@ public class AstLoopUnwinder return oldTarget; } + @Override protected CAstNode copyNodes(CAstNode n, final CAstControlFlowMap cfg, RewriteContext c, Map,CAstNode> nodeMap) { if (n instanceof CAstOperator) { return n; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java index 766a6a392..5e2cb509b 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java @@ -38,6 +38,7 @@ public abstract class CAstBasicRewriter return nodeMap; } + @Override public NoKey key() { return null; } @@ -52,14 +53,17 @@ public abstract class CAstBasicRewriter Assertions.UNREACHABLE(); } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public NoKey parent() { return null; } @@ -69,6 +73,7 @@ public abstract class CAstBasicRewriter super(Ast, recursive, new NonCopyingContext()); } + @Override protected abstract CAstNode copyNodes(CAstNode root, final CAstControlFlowMap cfg, NonCopyingContext context, Map, CAstNode> nodeMap); } \ No newline at end of file diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java index f06925bc8..0ae4b02b5 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java @@ -32,6 +32,7 @@ public class CAstCloner extends CAstBasicRewriter { this(Ast, false); } + @Override protected CAstNode copyNodes(CAstNode root, final CAstControlFlowMap cfg, NonCopyingContext c, Map, CAstNode> nodeMap) { return copyNodesHackForEclipse(root, cfg, c, nodeMap); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java index b46efe23f..485e4fa37 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java @@ -59,8 +59,10 @@ public abstract class CAstRewriter, K e */ public interface CopyKey { + @Override int hashCode(); + @Override boolean equals(Object o); /** @@ -356,28 +358,33 @@ public abstract class CAstRewriter, K e private Map> theChildren = null; + @Override public CAstNode newRoot() { return newRoot; } + @Override public CAstControlFlowMap newCfg() { if (theCfg == null) theCfg = copyFlow(nodes, cfg, newPos()); return theCfg; } + @Override public CAstSourcePositionMap newPos() { if (theSource == null) theSource = copySource(nodes, pos); return theSource; } + @Override public CAstNodeTypeMap newTypes() { if (theTypes == null) theTypes = copyTypes(nodes, types); return theTypes; } + @Override public Map> newChildren() { if (theChildren == null) theChildren = copyChildren(root, nodes, children); @@ -397,10 +404,12 @@ public abstract class CAstRewriter, K e root.getAllScopedEntities()); return new DelegatingEntity(root) { + @Override public String toString() { return root.toString() + " (clone)"; } + @Override public Iterator getScopedEntities(CAstNode construct) { Map> newChildren = getAllScopedEntities(); if (newChildren.containsKey(construct)) { @@ -410,22 +419,27 @@ public abstract class CAstRewriter, K e } } + @Override public Map> getAllScopedEntities() { return rewrite.newChildren(); } + @Override public CAstNode getAST() { return rewrite.newRoot(); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return rewrite.newTypes(); } + @Override public CAstSourcePositionMap getSourceMap() { return rewrite.newPos(); } + @Override public CAstControlFlowMap getControlFlow() { return rewrite.newCfg(); } @@ -446,10 +460,12 @@ public abstract class CAstRewriter, K e } return new DelegatingEntity(root) { + @Override public String toString() { return root.toString() + " (clone)"; } + @Override public Iterator getScopedEntities(CAstNode construct) { if (newChildren.containsKey(construct)) { return newChildren.get(construct).iterator(); @@ -458,6 +474,7 @@ public abstract class CAstRewriter, K e } } + @Override public Map> getAllScopedEntities() { return newChildren; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java index 47383c62b..53e19926a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java @@ -26,6 +26,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which this file was visited * @param n the file entity */ + @Override protected C makeFileContext(C context, CAstEntity n) { return delegate.makeFileContext(context, n); } @@ -34,6 +35,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which this type was visited * @param n the type entity */ + @Override protected C makeTypeContext(C context, CAstEntity n) { return delegate.makeTypeContext(context, n); } @@ -42,6 +44,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which the code was visited * @param n the code entity */ + @Override protected C makeCodeContext(C context, CAstEntity n) { return delegate.makeCodeContext(context, n); } @@ -51,6 +54,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which the local scope was visited * @param n the local scope node */ + @Override protected C makeLocalContext(C context, CAstNode n) { return delegate.makeLocalContext(context, n); } @@ -59,6 +63,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which the unwind was visited * @param n the unwind node */ + @Override protected C makeUnwindContext(C context, CAstNode n, CAstVisitor visitor) { return delegate.makeUnwindContext(context, n, visitor); } @@ -68,6 +73,7 @@ public abstract class DelegatingCAstVisitor exten * @param entity the child entity * @return the parent entity for the given entity */ + @Override protected CAstEntity getParent(CAstEntity entity) { return delegate.getParent(entity); } @@ -77,6 +83,7 @@ public abstract class DelegatingCAstVisitor exten * @param entity the child entity * @param parent the parent entity */ + @Override protected void setParent(CAstEntity entity, CAstEntity parent) { delegate.setParent(entity, parent); } @@ -101,6 +108,7 @@ public abstract class DelegatingCAstVisitor exten * Should invoke super.doVisitEntity() for unprocessed entities. * @return true if entity was handled */ + @Override protected boolean doVisitEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.doVisitEntity(n, context, visitor); } @@ -111,6 +119,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean enterEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.enterEntity(n, context, visitor); } @@ -119,6 +128,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the entity to process * @param context a visitor-specific context */ + @Override protected void postProcessEntity(CAstEntity n, C context, CAstVisitor visitor) { delegate.postProcessEntity(n, context, visitor); } @@ -129,6 +139,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @return true if no further processing is needed */ + @Override public boolean visitEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.visitEntity(n, context, visitor); } @@ -137,6 +148,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the entity to process * @param context a visitor-specific context */ + @Override public void leaveEntity(CAstEntity n, C context, CAstVisitor visitor) { delegate.leaveEntity(n, context, visitor); } @@ -148,6 +160,7 @@ public abstract class DelegatingCAstVisitor exten * @param fileContext a visitor-specific context for this file * @return true if no further processing is needed */ + @Override protected boolean visitFileEntity(CAstEntity n, C context, C fileContext, CAstVisitor visitor) { return delegate.visitFileEntity(n, context, fileContext, visitor); } @@ -157,6 +170,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param fileContext a visitor-specific context for this file */ + @Override protected void leaveFileEntity(CAstEntity n, C context, C fileContext, CAstVisitor visitor) { delegate.leaveFileEntity(n, context, fileContext, visitor); } @@ -166,6 +180,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitFieldEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.visitFieldEntity(n, context, visitor); } @@ -174,6 +189,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the entity to process * @param context a visitor-specific context */ + @Override protected void leaveFieldEntity(CAstEntity n, C context, CAstVisitor visitor) { delegate.leaveFieldEntity(n, context, visitor); } @@ -184,6 +200,7 @@ public abstract class DelegatingCAstVisitor exten * @param typeContext a visitor-specific context for this type * @return true if no further processing is needed */ + @Override protected boolean visitTypeEntity(CAstEntity n, C context, C typeContext, CAstVisitor visitor) { return delegate.visitTypeEntity(n, context, typeContext, visitor); } @@ -193,6 +210,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param typeContext a visitor-specific context for this type */ + @Override protected void leaveTypeEntity(CAstEntity n, C context, C typeContext, CAstVisitor visitor) { delegate.leaveTypeEntity(n, context, typeContext, visitor); } @@ -203,6 +221,7 @@ public abstract class DelegatingCAstVisitor exten * @param codeContext a visitor-specific context for this function * @return true if no further processing is needed */ + @Override protected boolean visitFunctionEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { return delegate.visitFunctionEntity(n, context, codeContext, visitor); } @@ -212,6 +231,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param codeContext a visitor-specific context for this function */ + @Override protected void leaveFunctionEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { delegate.leaveFunctionEntity(n, context, codeContext, visitor); } @@ -222,6 +242,7 @@ public abstract class DelegatingCAstVisitor exten * @param codeContext a visitor-specific context for this script * @return true if no further processing is needed */ + @Override protected boolean visitScriptEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { return delegate.visitScriptEntity(n, context, codeContext, visitor); } @@ -231,6 +252,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param codeContext a visitor-specific context for this script */ + @Override protected void leaveScriptEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { delegate.leaveScriptEntity(n, context, codeContext, visitor); } @@ -241,6 +263,7 @@ public abstract class DelegatingCAstVisitor exten * Should invoke super.doVisit() for unprocessed nodes. * @return true if node was handled */ + @Override protected boolean doVisit(CAstNode n, C context, CAstVisitor visitor) { return delegate.doVisit(n, context, visitor); } @@ -251,6 +274,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean enterNode(CAstNode n, C c, CAstVisitor visitor) { return delegate.enterNode(n, c, visitor); } @@ -259,6 +283,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void postProcessNode(CAstNode n, C c, CAstVisitor visitor) { delegate.postProcessNode(n, c, visitor); } @@ -269,6 +294,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override public boolean visitNode(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitNode(n, c, visitor); } @@ -277,6 +303,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override public void leaveNode(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveNode(n, c, visitor); } @@ -287,6 +314,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitFunctionExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitFunctionExpr(n, c, visitor); } @@ -295,6 +323,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveFunctionExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveFunctionExpr(n, c, visitor); } @@ -304,6 +333,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitFunctionStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitFunctionStmt(n, c, visitor); } @@ -312,6 +342,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveFunctionStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveFunctionStmt(n, c, visitor); } @@ -321,6 +352,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitLocalScope(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitLocalScope(n, c, visitor); } @@ -329,6 +361,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLocalScope(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLocalScope(n, c, visitor); } @@ -338,6 +371,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitBlockExpr(n, c, visitor); } @@ -346,6 +380,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveBlockExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveBlockExpr(n, c, visitor); } @@ -355,6 +390,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitBlockStmt(n, c, visitor); } @@ -363,6 +399,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveBlockStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveBlockStmt(n, c, visitor); } @@ -372,6 +409,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitLoop(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitLoop(n, c, visitor); } @@ -380,6 +418,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLoopHeader(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLoopHeader(n, c, visitor); } @@ -388,6 +427,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLoop(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLoop(n, c, visitor); } @@ -397,6 +437,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitGetCaughtException(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitGetCaughtException(n, c, visitor); } @@ -405,6 +446,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveGetCaughtException(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveGetCaughtException(n, c, visitor); } @@ -414,6 +456,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitThis(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitThis(n, c, visitor); } @@ -422,6 +465,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveThis(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveThis(n, c, visitor); } @@ -431,6 +475,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitSuper(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitSuper(n, c, visitor); } @@ -439,6 +484,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveSuper(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveSuper(n, c, visitor); } @@ -448,6 +494,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitCall(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitCall(n, c, visitor); } @@ -456,6 +503,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveCall(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveCall(n, c, visitor); } @@ -465,6 +513,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVar(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitVar(n, c, visitor); } @@ -473,6 +522,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveVar(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveVar(n, c, visitor); } @@ -482,6 +532,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitConstant(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitConstant(n, c, visitor); } @@ -490,6 +541,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveConstant(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveConstant(n, c, visitor); } @@ -499,6 +551,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBinaryExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitBinaryExpr(n, c, visitor); } @@ -507,6 +560,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveBinaryExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveBinaryExpr(n, c, visitor); } @@ -516,6 +570,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitUnaryExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitUnaryExpr(n, c, visitor); } @@ -524,6 +579,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveUnaryExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveUnaryExpr(n, c, visitor); } @@ -533,6 +589,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayLength(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitArrayLength(n, c, visitor); } @@ -541,6 +598,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayLength(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayLength(n, c, visitor); } @@ -550,6 +608,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayRef(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitArrayRef(n, c, visitor); } @@ -558,6 +617,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayRef(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayRef(n, c, visitor); } @@ -567,6 +627,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitDeclStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitDeclStmt(n, c, visitor); } @@ -575,6 +636,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveDeclStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveDeclStmt(n, c, visitor); } @@ -584,6 +646,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitReturn(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitReturn(n, c, visitor); } @@ -592,6 +655,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveReturn(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveReturn(n, c, visitor); } @@ -601,6 +665,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitIfgoto(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitIfgoto(n, c, visitor); } @@ -609,6 +674,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfgoto(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfgoto(n, c, visitor); } @@ -618,6 +684,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitGoto(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitGoto(n, c, visitor); } @@ -626,6 +693,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveGoto(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveGoto(n, c, visitor); } @@ -635,6 +703,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitLabelStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitLabelStmt(n, c, visitor); } @@ -643,6 +712,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLabelStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLabelStmt(n, c, visitor); } @@ -652,6 +722,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitIfStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitIfStmt(n, c, visitor); } @@ -660,6 +731,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfStmtCondition(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfStmtCondition(n, c, visitor); } @@ -668,6 +740,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfStmtTrueClause(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfStmtTrueClause(n, c, visitor); } @@ -676,6 +749,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfStmt(n, c, visitor); } @@ -685,6 +759,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitIfExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitIfExpr(n, c, visitor); } @@ -693,6 +768,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfExprCondition(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfExprCondition(n, c, visitor); } @@ -701,6 +777,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfExprTrueClause(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfExprTrueClause(n, c, visitor); } @@ -709,6 +786,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfExpr(n, c, visitor); } @@ -718,6 +796,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitNew(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitNew(n, c, visitor); } @@ -726,6 +805,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveNew(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveNew(n, c, visitor); } @@ -735,6 +815,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectLiteral(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitObjectLiteral(n, c, visitor); } @@ -744,6 +825,7 @@ public abstract class DelegatingCAstVisitor exten * @param i the field position that was initialized * @param c a visitor-specific context */ + @Override protected void leaveObjectLiteralFieldInit(CAstNode n, int i, C c, CAstVisitor visitor) { delegate.leaveObjectLiteralFieldInit(n, i, c, visitor); } @@ -752,6 +834,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveObjectLiteral(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveObjectLiteral(n, c, visitor); } @@ -761,6 +844,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayLiteral(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitArrayLiteral(n, c, visitor); } @@ -769,6 +853,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayLiteralObject(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayLiteralObject(n, c, visitor); } @@ -778,6 +863,7 @@ public abstract class DelegatingCAstVisitor exten * @param i the index that was initialized * @param c a visitor-specific context */ + @Override protected void leaveArrayLiteralInitElement(CAstNode n, int i, C c, CAstVisitor visitor) { delegate.leaveArrayLiteralInitElement(n, i, c, visitor); } @@ -786,6 +872,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayLiteral(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayLiteral(n, c, visitor); } @@ -795,6 +882,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectRef(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitObjectRef(n, c, visitor); } @@ -803,6 +891,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveObjectRef(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveObjectRef(n, c, visitor); } @@ -812,6 +901,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override public boolean visitAssign(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitAssign(n, c, visitor); } @@ -820,6 +910,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override public void leaveAssign(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveAssign(n, c, visitor); } @@ -831,6 +922,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitArrayRefAssign(n, v, a, c, visitor); } @@ -841,6 +933,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveArrayRefAssign(n, v, a, c, visitor); } @@ -853,6 +946,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitArrayRefAssignOp(n, v, a, pre, c, visitor); } @@ -864,6 +958,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveArrayRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveArrayRefAssignOp(n, v, a, pre, c, visitor); } @@ -875,6 +970,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitObjectRefAssign(n, v, a, c, visitor); } @@ -885,6 +981,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveObjectRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveObjectRefAssign(n, v, a, c, visitor); } @@ -897,6 +994,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitObjectRefAssignOp(n, v, a, pre, c, visitor); } @@ -908,6 +1006,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveObjectRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveObjectRefAssignOp(n, v, a, pre, c, visitor); } @@ -919,6 +1018,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockExprAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitBlockExprAssign(n, v, a, c, visitor); } @@ -929,6 +1029,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveBlockExprAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveBlockExprAssign(n, v, a, c, visitor); } @@ -941,6 +1042,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitBlockExprAssignOp(n, v, a, pre, c, visitor); } @@ -952,6 +1054,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveBlockExprAssignOp(n, v, a, pre, c, visitor); } @@ -963,6 +1066,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVarAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitVarAssign(n, v, a, c, visitor); } @@ -973,6 +1077,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveVarAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveVarAssign(n, v, a, c, visitor); } @@ -985,6 +1090,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVarAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitVarAssignOp(n, v, a, pre, c, visitor); } @@ -996,6 +1102,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveVarAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveVarAssignOp(n, v, a, pre, c, visitor); } @@ -1005,6 +1112,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitSwitch(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitSwitch(n, c, visitor); } @@ -1013,6 +1121,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveSwitchValue(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveSwitchValue(n, c, visitor); } @@ -1021,6 +1130,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveSwitch(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveSwitch(n, c, visitor); } @@ -1030,6 +1140,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitThrow(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitThrow(n, c, visitor); } @@ -1038,6 +1149,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveThrow(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveThrow(n, c, visitor); } @@ -1047,6 +1159,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitCatch(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitCatch(n, c, visitor); } @@ -1055,6 +1168,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveCatch(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveCatch(n, c, visitor); } @@ -1064,6 +1178,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitUnwind(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitUnwind(n, c, visitor); } @@ -1072,6 +1187,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveUnwind(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveUnwind(n, c, visitor); } @@ -1081,6 +1197,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitTry(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitTry(n, c, visitor); } @@ -1089,6 +1206,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveTryBlock(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveTryBlock(n, c, visitor); } @@ -1097,6 +1215,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveTry(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveTry(n, c, visitor); } @@ -1106,6 +1225,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitEmpty(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitEmpty(n, c, visitor); } @@ -1114,6 +1234,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveEmpty(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveEmpty(n, c, visitor); } @@ -1123,6 +1244,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitPrimitive(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitPrimitive(n, c, visitor); } @@ -1131,6 +1253,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leavePrimitive(CAstNode n, C c, CAstVisitor visitor) { delegate.leavePrimitive(n, c, visitor); } @@ -1140,6 +1263,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVoid(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitVoid(n, c, visitor); } @@ -1148,6 +1272,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveVoid(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveVoid(n, c, visitor); } @@ -1157,6 +1282,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitCast(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitCast(n, c, visitor); } @@ -1165,6 +1291,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveCast(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveCast(n, c, visitor); } @@ -1174,6 +1301,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitInstanceOf(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitInstanceOf(n, c, visitor); } @@ -1182,6 +1310,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveInstanceOf(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveInstanceOf(n, c, visitor); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java index e0187eb13..a189bebb6 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java @@ -41,26 +41,32 @@ public class CAstFunctions { private final Map> pendingChildren = HashMapFactory.make(); + @Override protected Iterator getPendingChildren(CAstNode n) { return pendingChildren.get(n); } + @Override protected void setPendingChildren(CAstNode v, Iterator iterator) { pendingChildren.put(v, iterator); } + @Override protected Iterator getConnected(final CAstNode n) { return new Iterator() { private int i = 0; + @Override public boolean hasNext() { return i < ((CAstNode) n).getChildCount(); } + @Override public CAstNode next() { return ((CAstNode) n).getChild(i++); } + @Override public void remove() { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java index 143531b2f..9c722ae0c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java @@ -137,6 +137,7 @@ public class CAstPattern { this.children = null; } + @Override public String toString() { StringBuffer sb = new StringBuffer(); @@ -392,9 +393,11 @@ public class CAstPattern { }; v.visit(e.getAST(), new Context() { + @Override public CAstEntity top() { return e; } + @Override public CAstSourcePositionMap getSourceMap() { return e.getSourceMap(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java index 11ca8d2c1..a312451d9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java @@ -55,6 +55,7 @@ public class SourceBuffer { } } + @Override public String toString() { StringBuffer result = new StringBuffer(); for(int i = 0; i < lines.length; i++) { @@ -94,14 +95,22 @@ public class SourceBuffer { final Position hack = range; range = new AbstractSourcePosition() { - public int getFirstLine() { return hack.getFirstLine(); } - public int getLastLine() { return hack.getFirstLine(); } - public int getFirstCol() { return hack.getFirstCol(); } - public int getLastCol() { return hack.getFirstCol(); } - public int getFirstOffset() { return hack.getFirstOffset(); } - public int getLastOffset() { return hack.getFirstOffset(); } - public URL getURL() { return hack.getURL(); } - public InputStream getInputStream() throws IOException { + @Override + public int getFirstLine() { return hack.getFirstLine(); } + @Override + public int getLastLine() { return hack.getFirstLine(); } + @Override + public int getFirstCol() { return hack.getFirstCol(); } + @Override + public int getLastCol() { return hack.getFirstCol(); } + @Override + public int getFirstOffset() { return hack.getFirstOffset(); } + @Override + public int getLastOffset() { return hack.getFirstOffset(); } + @Override + public URL getURL() { return hack.getURL(); } + @Override + public InputStream getInputStream() throws IOException { return hack.getInputStream(); } }; diff --git a/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java b/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java index 889fdab53..014ad5eef 100644 --- a/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java +++ b/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java @@ -57,6 +57,7 @@ class ArraySet { } class ArraySetIter implements Iter { + @Override public Object next() { return elems[0]; } diff --git a/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java b/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java index 8420393e6..87c6589a0 100644 --- a/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java +++ b/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java @@ -28,6 +28,7 @@ public class DummyHashMap { public Iter keyIter() { return new Iter() { + @Override public Object next() { return keys[0]; } @@ -37,6 +38,7 @@ public class DummyHashMap { public Iter valuesIter() { return new Iter() { + @Override public Object next() { return values[0]; } diff --git a/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java b/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java index bf1e6ad66..c08077a10 100644 --- a/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java +++ b/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java @@ -45,6 +45,7 @@ public class DummyLinkedList { public Iter iterator() { return new Iter() { + @Override public Object next() { // just return some arbitrary element, from the point of view of flow-insensitive points-to analysis Element tmp = head; diff --git a/com.ibm.wala.core.testdata/src/multiTypes/Foo.java b/com.ibm.wala.core.testdata/src/multiTypes/Foo.java index 8085fc90a..bfba119b7 100644 --- a/com.ibm.wala.core.testdata/src/multiTypes/Foo.java +++ b/com.ibm.wala.core.testdata/src/multiTypes/Foo.java @@ -25,6 +25,7 @@ public class Foo { @SuppressWarnings("unused") private static class B extends A { + @Override public void bar() { } } diff --git a/com.ibm.wala.core.testdata/src/recurse/NList.java b/com.ibm.wala.core.testdata/src/recurse/NList.java index 427e0dde1..cc2c4091c 100644 --- a/com.ibm.wala.core.testdata/src/recurse/NList.java +++ b/com.ibm.wala.core.testdata/src/recurse/NList.java @@ -40,6 +40,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#size() */ + @Override public int size() { // TODO Auto-generated method stub return 0; @@ -48,6 +49,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#isEmpty() */ + @Override public boolean isEmpty() { // TODO Auto-generated method stub return false; @@ -56,6 +58,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#contains(java.lang.Object) */ + @Override public boolean contains(Object o) { // TODO Auto-generated method stub return false; @@ -64,6 +67,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#iterator() */ + @Override public Iterator iterator() { // TODO Auto-generated method stub return null; @@ -72,6 +76,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#toArray() */ + @Override public Object[] toArray() { // TODO Auto-generated method stub return null; @@ -81,6 +86,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#add(java.lang.Object) */ + @Override public boolean add(Object o) { // TODO Auto-generated method stub return false; @@ -89,6 +95,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#remove(java.lang.Object) */ + @Override public boolean remove(Object o) { // TODO Auto-generated method stub return false; @@ -97,6 +104,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#containsAll(java.util.Collection) */ + @Override public boolean containsAll(Collection c) { // TODO Auto-generated method stub return false; @@ -105,6 +113,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#addAll(java.util.Collection) */ + @Override public boolean addAll(Collection c) { // TODO Auto-generated method stub return false; @@ -113,6 +122,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#removeAll(java.util.Collection) */ + @Override public boolean removeAll(Collection c) { // TODO Auto-generated method stub return false; @@ -121,6 +131,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#retainAll(java.util.Collection) */ + @Override public boolean retainAll(Collection c) { // TODO Auto-generated method stub return false; @@ -129,12 +140,14 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#clear() */ + @Override public void clear() { // TODO Auto-generated method stub } + @Override public Object[] toArray(Object[] a) { // TODO Auto-generated method stub return null; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect5.java b/com.ibm.wala.core.testdata/src/reflection/Reflect5.java index 185e060e7..66605ef13 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect5.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect5.java @@ -22,7 +22,8 @@ public class Reflect5 { public static class A { private A() { } - public String toString() { + @Override + public String toString() { return "Instance of A"; } } diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect6.java b/com.ibm.wala.core.testdata/src/reflection/Reflect6.java index 68c880787..5c1737660 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect6.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect6.java @@ -22,7 +22,8 @@ public class Reflect6 { public static class A { private A(int i) { } - public String toString() { + @Override + public String toString() { return "Instance of A"; } } diff --git a/com.ibm.wala.core.testdata/src/slice/B.java b/com.ibm.wala.core.testdata/src/slice/B.java index 6e0821e00..f52ce1528 100644 --- a/com.ibm.wala.core.testdata/src/slice/B.java +++ b/com.ibm.wala.core.testdata/src/slice/B.java @@ -11,6 +11,7 @@ package slice; class B extends A { + @Override Object foo() { return new Float(4); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java index eafa6e85e..8c45a5379 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java @@ -37,6 +37,7 @@ public class FloydWarshallTest { private final MutableIntSet preds = IntSetUtil.make(); private final MutableIntSet succs = IntSetUtil.make(); + @Override public int getGraphNodeId() { return number; } @@ -45,38 +46,47 @@ public class FloydWarshallTest { this.number = number; } + @Override public void setGraphNodeId(int number) { throw new UnsupportedOperationException(); } + @Override public IntSet getSuccNumbers() { return succs; } + @Override public IntSet getPredNumbers() { return preds; } + @Override public void addSucc(int n) { succs.add(n); } + @Override public void addPred(int n) { preds.add(n); } + @Override public void removeAllIncidentEdges() { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges() { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges() { throw new UnsupportedOperationException(); } + @Override public String toString() { return "["+number+"]"; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java index a3425ac98..7485da720 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java @@ -130,23 +130,28 @@ public class GraphDataflowTest extends WalaTestCase { final OrdinalSetMapping values = new MutableMapping(nodes); ITransferFunctionProvider functions = new ITransferFunctionProvider() { + @Override public UnaryOperator getNodeTransferFunction(String node) { return new BitVectorUnionConstant(values.getMappedIndex(node)); } + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public UnaryOperator getEdgeTransferFunction(String from, String to) { Assertions.UNREACHABLE(); return null; } + @Override public boolean hasEdgeTransferFunctions() { return false; } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } @@ -163,14 +168,17 @@ public class GraphDataflowTest extends WalaTestCase { final OrdinalSetMapping values = new MutableMapping(nodes); ITransferFunctionProvider functions = new ITransferFunctionProvider() { + @Override public UnaryOperator getNodeTransferFunction(String node) { return new BitVectorUnionConstant(values.getMappedIndex(node)); } + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public UnaryOperator getEdgeTransferFunction(String from, String to) { if (from == nodes[1] && to == nodes[3]) return new BitVectorFilter(zero()); @@ -181,10 +189,12 @@ public class GraphDataflowTest extends WalaTestCase { } } + @Override public boolean hasEdgeTransferFunctions() { return true; } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java index 20c3e329f..da36b9085 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java @@ -43,6 +43,7 @@ public class PathFinderTest { private static DFSAllPathsFinder makeFinder(Graph g, String start, final String end) { return new DFSAllPathsFinder(g, start, new Filter() { + @Override public boolean accepts(String o) { return end.equals(o); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java index 51cf8d70d..60da43bbc 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java @@ -219,6 +219,7 @@ public class CallGraphTest extends WalaTestCase { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -275,6 +276,7 @@ public class CallGraphTest extends WalaTestCase { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -458,6 +460,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#iterateNodes() */ + @Override public Iterator iterator() { return nodes.iterator(); } @@ -465,6 +468,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(java.lang.Object) */ + @Override public boolean containsNode(MethodReference N) { return nodes.contains(N); } @@ -472,6 +476,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return nodes.size(); } @@ -479,6 +484,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(java.lang.Object) */ + @Override public Iterator getPredNodes(MethodReference N) { Set pred = HashSetFactory.make(10); MethodReference methodReference = N; @@ -492,6 +498,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(java.lang.Object) */ + @Override public int getPredNodeCount(MethodReference N) { int count = 0; for (Iterator ps = getPredNodes(N); ps.hasNext(); count++, ps.next()) @@ -502,6 +509,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(java.lang.Object) */ + @Override public Iterator getSuccNodes(MethodReference N) { Set succ = HashSetFactory.make(10); MethodReference methodReference = N; @@ -515,6 +523,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(java.lang.Object) */ + @Override public int getSuccNodeCount(MethodReference N) { int count = 0; for (Iterator ps = getSuccNodes(N); ps.hasNext(); count++, ps.next()) @@ -525,6 +534,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(java.lang.Object) */ + @Override public void addNode(MethodReference n) { Assertions.UNREACHABLE(); } @@ -532,6 +542,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#removeNode(java.lang.Object) */ + @Override public void removeNode(MethodReference n) { Assertions.UNREACHABLE(); } @@ -539,10 +550,12 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(java.lang.Object, java.lang.Object) */ + @Override public void addEdge(MethodReference src, MethodReference dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(MethodReference src, MethodReference dst) { Assertions.UNREACHABLE(); } @@ -550,6 +563,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#removeAllIncidentEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(MethodReference node) { Assertions.UNREACHABLE(); } @@ -557,22 +571,26 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.Graph#removeNodeAndEdges(java.lang.Object) */ + @Override public void removeNodeAndEdges(MethodReference N) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(MethodReference node) { // TODO Auto-generated method stubMethodReference Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(MethodReference node) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(MethodReference src, MethodReference dst) { for (Iterator succNodes = getSuccNodes(src); succNodes.hasNext();) { if (dst.equals(succNodes.next())) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java index ef0309ebe..ed061d25c 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java @@ -38,7 +38,6 @@ import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.HashSetFactory; -import com.ibm.wala.util.collections.Iterator2List; import com.ibm.wala.util.strings.Atom; /** diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java index 4b43a4edf..83615e658 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java @@ -113,10 +113,12 @@ public class ContextInsensitiveReachingDefs { /** * our meet operator is set union */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(BasicBlockInContext node) { IExplodedBasicBlock ebb = node.getDelegate(); SSAInstruction instruction = ebb.getInstruction(); @@ -141,10 +143,12 @@ public class ContextInsensitiveReachingDefs { * here we need an edge transfer function for call-to-return edges (see * {@link #getEdgeTransferFunction(BasicBlockInContext, BasicBlockInContext)}) */ + @Override public boolean hasEdgeTransferFunctions() { return true; } + @Override public boolean hasNodeTransferFunctions() { return true; } @@ -153,6 +157,7 @@ public class ContextInsensitiveReachingDefs { * for direct call-to-return edges at a call site, the edge transfer function will kill all facts, since we only want to * consider facts that arise from going through the callee */ + @Override public UnaryOperator getEdgeTransferFunction(BasicBlockInContext src, BasicBlockInContext dst) { if (isCallToReturnEdge(src, dst)) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java index f9404e12f..572971cc2 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java @@ -75,6 +75,7 @@ public class ContextSensitiveReachingDefs { private class ReachingDefsDomain extends MutableMapping> implements TabulationDomain, BasicBlockInContext> { + @Override public boolean hasPriorityOver(PathEdge> p1, PathEdge> p2) { // don't worry about worklist priorities @@ -96,6 +97,7 @@ public class ContextSensitiveReachingDefs { * * @see ReachingDefsProblem */ + @Override public IFlowFunction getUnbalancedReturnFlowFunction(BasicBlockInContext src, BasicBlockInContext dest) { return IdentityFlowFunction.identity(); @@ -104,6 +106,7 @@ public class ContextSensitiveReachingDefs { /** * flow function from caller to callee; just the identity function */ + @Override public IUnaryFlowFunction getCallFlowFunction(BasicBlockInContext src, BasicBlockInContext dest, BasicBlockInContext ret) { return IdentityFlowFunction.identity(); @@ -112,6 +115,7 @@ public class ContextSensitiveReachingDefs { /** * flow function from call node to return node when there are no targets for the call site; not a case we are expecting */ + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(BasicBlockInContext src, BasicBlockInContext dest) { // if we're missing callees, just keep what information we have @@ -122,6 +126,7 @@ public class ContextSensitiveReachingDefs { * flow function from call node to return node at a call site when callees exist. We kill everything; surviving facts should * flow out of the callee */ + @Override public IUnaryFlowFunction getCallToReturnFlowFunction(BasicBlockInContext src, BasicBlockInContext dest) { return KillEverything.singleton(); @@ -130,6 +135,7 @@ public class ContextSensitiveReachingDefs { /** * flow function for normal intraprocedural edges */ + @Override public IUnaryFlowFunction getNormalFlowFunction(final BasicBlockInContext src, BasicBlockInContext dest) { final IExplodedBasicBlock ebb = src.getDelegate(); @@ -139,6 +145,7 @@ public class ContextSensitiveReachingDefs { if (putInstr.isStatic()) { return new IUnaryFlowFunction() { + @Override public IntSet getTargets(int d1) { // first, gen this statement int factNum = domain.getMappedIndex(Pair.make(src.getNode(), ebb.getFirstInstructionIndex())); @@ -159,6 +166,7 @@ public class ContextSensitiveReachingDefs { return result; } + @Override public String toString() { return "Reaching Defs Normal Flow"; } @@ -172,6 +180,7 @@ public class ContextSensitiveReachingDefs { /** * standard flow function from callee to caller; just identity */ + @Override public IFlowFunction getReturnFlowFunction(BasicBlockInContext call, BasicBlockInContext src, BasicBlockInContext dest) { return IdentityFlowFunction.identity(); @@ -202,6 +211,7 @@ public class ContextSensitiveReachingDefs { /** * we use the entry block of the CGNode as the fake entry when propagating from callee to caller with unbalanced parens */ + @Override public BasicBlockInContext getFakeEntry(BasicBlockInContext node) { final CGNode cgNode = node.getNode(); return getFakeEntry(cgNode); @@ -240,10 +250,12 @@ public class ContextSensitiveReachingDefs { return result; } + @Override public IPartiallyBalancedFlowFunctions> getFunctionMap() { return flowFunctions; } + @Override public TabulationDomain, BasicBlockInContext> getDomain() { return domain; } @@ -251,14 +263,17 @@ public class ContextSensitiveReachingDefs { /** * we don't need a merge function; the default unioning of tabulation works fine */ + @Override public IMergeFunction getMergeFunction() { return null; } + @Override public ISupergraph, CGNode> getSupergraph() { return supergraph; } + @Override public Collection>> initialSeeds() { return initialSeeds; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java index 8289746db..eca082f23 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java @@ -103,6 +103,7 @@ public class IntraprocReachingDefs { private class TransferFunctions implements ITransferFunctionProvider { + @Override public UnaryOperator getEdgeTransferFunction(IExplodedBasicBlock src, IExplodedBasicBlock dst) { throw new UnsupportedOperationException(); } @@ -110,10 +111,12 @@ public class IntraprocReachingDefs { /** * our meet operator is set union */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(IExplodedBasicBlock node) { SSAInstruction instruction = node.getInstruction(); int instructionIndex = node.getFirstInstructionIndex(); @@ -132,11 +135,13 @@ public class IntraprocReachingDefs { } } + @Override public boolean hasEdgeTransferFunctions() { // we only need transfer functions on nodes return false; } + @Override public boolean hasNodeTransferFunctions() { return true; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java index 8c7ea772a..05f6fef93 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java @@ -196,6 +196,7 @@ public class PDFCallGraph { */ private static class ApplicationLoaderFilter implements Filter { + @Override public boolean accepts(CGNode o) { if (o instanceof CGNode) { CGNode n = (CGNode) o; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java index 48de77f93..cddb80c79 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java @@ -162,6 +162,7 @@ public class PDFSDG { private static Graph pruneSDG(final SDG sdg) { Filter f = new Filter() { + @Override public boolean accepts(Statement o) { Statement s = (Statement) o; if (s.getNode().equals(sdg.getCallGraph().getFakeRootNode())) { @@ -178,6 +179,7 @@ public class PDFSDG { private static NodeDecorator makeNodeDecorator() { return new NodeDecorator() { + @Override public String getLabel(Object o) throws WalaException { Statement s = (Statement) o; switch (s.getKind()) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java index c73e11cb3..0344a2b13 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java @@ -245,6 +245,7 @@ public class PDFSlice { */ public static Graph pruneSDG(SDG sdg, final Collection slice) { Filter f = new Filter() { + @Override public boolean accepts(Statement o) { return slice.contains(o); } @@ -257,6 +258,7 @@ public class PDFSlice { */ public static NodeDecorator makeNodeDecorator() { return new NodeDecorator() { + @Override public String getLabel(Object o) throws WalaException { Statement s = (Statement) o; switch (s.getKind()) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java index bbcb500ed..681042bd1 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java @@ -103,6 +103,7 @@ public class PDFTypeHierarchy { */ public static Graph pruneForAppLoader(Graph g) throws WalaException { Filter f = new Filter() { + @Override public boolean accepts(IClass c) { return (c.getClassLoader().getReference().equals(ClassLoaderReference.Application)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java index 8dfdd02d8..4f2fa9cd5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java @@ -76,22 +76,27 @@ public class BasicHeapGraph extends HeapGraph { final OrdinalSetMapping pointerKeys = getPointerKeys(); final NumberedNodeManager nodeMgr = new NumberedNodeManager() { + @Override public Iterator iterator() { return new CompoundIterator(pointerKeys.iterator(), P.getInstanceKeyMapping().iterator()); } + @Override public int getNumberOfNodes() { return pointerKeys.getSize() + P.getInstanceKeyMapping().getSize(); } + @Override public void addNode(Object n) { Assertions.UNREACHABLE(); } + @Override public void removeNode(Object n) { Assertions.UNREACHABLE(); } + @Override public int getNumber(Object N) { if (N instanceof PointerKey) { return pointerKeys.getMappedIndex((PointerKey) N); @@ -104,6 +109,7 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public Object getNode(int number) { if (number > pointerKeys.getMaximumIndex()) { return P.getInstanceKeyMapping().getMappedObject(number - pointerKeys.getSize()); @@ -112,14 +118,17 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public int getMaxNumber() { return getNumberOfNodes() - 1; } + @Override public boolean containsNode(Object n) { return getNumber(n) != -1; } + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } @@ -127,6 +136,7 @@ public class BasicHeapGraph extends HeapGraph { final IBinaryNaturalRelation pred = computePredecessors(nodeMgr); final IntFunction toNode = new IntFunction() { + @Override public Object apply(int i) { return nodeMgr.getNode(i); } @@ -134,6 +144,7 @@ public class BasicHeapGraph extends HeapGraph { this.G = new AbstractNumberedGraph() { private final NumberedEdgeManager edgeMgr = new NumberedEdgeManager() { + @Override public Iterator getPredNodes(Object N) { int n = nodeMgr.getNumber(N); IntSet p = pred.getRelated(n); @@ -144,6 +155,7 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public IntSet getPredNodeNumbers(Object N) { int n = nodeMgr.getNumber(N); IntSet p = pred.getRelated(n); @@ -154,11 +166,13 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public int getPredNodeCount(Object N) { int n = nodeMgr.getNumber(N); return pred.getRelatedCount(n); } + @Override public Iterator getSuccNodes(Object N) { int[] succ = computeSuccNodeNumbers(N, nodeMgr); if (succ == null) { @@ -168,6 +182,7 @@ public class BasicHeapGraph extends HeapGraph { return new IntMapIterator(s.intIterator(), toNode); } + @Override public IntSet getSuccNodeNumbers(Object N) { int[] succ = computeSuccNodeNumbers(N, nodeMgr); if (succ == null) { @@ -177,31 +192,38 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public int getSuccNodeCount(Object N) { int[] succ = computeSuccNodeNumbers(N, nodeMgr); return succ == null ? 0 : succ.length; } + @Override public void addEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(Object src, Object dst) { Assertions.UNREACHABLE(); return false; @@ -354,6 +376,7 @@ public class BasicHeapGraph extends HeapGraph { * sorts local pointers by node, then value number */ private final class LocalPointerComparator implements Comparator { + @Override public int compare(Object arg1, Object arg2) { LocalPointerKey o1 = (LocalPointerKey) arg1; LocalPointerKey o2 = (LocalPointerKey) arg2; @@ -368,6 +391,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(Object N) { return G.getNumber(N); } @@ -375,6 +399,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNode(int) */ + @Override public Object getNode(int number) { return G.getNode(number); } @@ -382,6 +407,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getMaxNumber() */ + @Override public int getMaxNumber() { return G.getMaxNumber(); } @@ -389,6 +415,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#iterateNodes() */ + @Override public Iterator iterator() { return G.iterator(); } @@ -396,6 +423,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return G.getNumberOfNodes(); } @@ -403,6 +431,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getPredNodes(Object N) { return G.getPredNodes(N); } @@ -410,6 +439,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(Object N) { return G.getPredNodeCount(N); } @@ -417,6 +447,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getSuccNodes(Object N) { return G.getSuccNodes(N); } @@ -424,6 +455,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(Object N) { return G.getSuccNodeCount(N); } @@ -431,6 +463,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(Object n) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -438,23 +471,28 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(Object n) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void addEdge(Object from, Object to) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Object from, Object to) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(Object from, Object to) throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public void removeAllIncidentEdges(Object node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -462,6 +500,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(Object N) { return G.containsNode(N); } @@ -492,19 +531,23 @@ public class BasicHeapGraph extends HeapGraph { return result.toString(); } + @Override public void removeIncomingEdges(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public IntSet getSuccNodeNumbers(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java index 9b3b242ce..16c3c3c3d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java @@ -46,12 +46,14 @@ public abstract class HeapGraph implements NumberedGraph { this.pa = pa; } + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } public Collection getReachableInstances(Set roots) { Filter f = new Filter() { + @Override public boolean accepts(Object o) { return (o instanceof InstanceKey); } @@ -59,6 +61,7 @@ public abstract class HeapGraph implements NumberedGraph { return DFS.getReachableNodes(this, roots, f); } + @Override public void removeNodeAndEdges(Object N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java index 49ea6f3e3..7694616d1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java @@ -44,6 +44,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { private static final boolean DEBUG = false; + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -56,6 +57,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; @@ -64,6 +66,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#understands(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -77,6 +80,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateNewSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -93,6 +97,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateCallSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return EmptyIterator.instance(); @@ -123,22 +128,27 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { return new SyntheticIR(method, context, new InducedCFG(instrs, method, context), instrs, SSAOptions.defaultOptions(), null); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java index dc6df81f0..f9a3f2034 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java @@ -84,6 +84,7 @@ class ClassFactoryContextSelector implements ContextSelector { * com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, * InstanceKey[]) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (isClassFactory(callee.getReference())) { IR ir = caller.getIR(); @@ -110,6 +111,7 @@ class ClassFactoryContextSelector implements ContextSelector { private static final IntSet firstParameter = IntSetUtil.make(new int[]{1}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (isClassFactory(site.getDeclaredTarget())) { SSAAbstractInvokeInstruction[] invokeInstructions = caller.getIR().getCalls(site); diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java index ddfce7790..903cf5689 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java @@ -63,6 +63,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp this.cha = cha; } + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -75,11 +76,13 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; } + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -90,6 +93,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return node.getMethod().getReference().equals(CLASS_NEW_INSTANCE_REF); } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -103,6 +107,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return EmptyIterator.instance(); } + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return EmptyIterator.instance(); @@ -151,22 +156,27 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return null; } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java index f2f84eeb8..0440987c3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java @@ -36,6 +36,7 @@ class ClassNewInstanceContextSelector implements ContextSelector { * representing the type of the IClass. (This corresponds to the case where we know the exact type that will be * allocated by the Class.newInstance() call.) Otherwise, return null. */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(ClassNewInstanceContextInterpreter.CLASS_NEW_INSTANCE_REF) && isTypeConstant(receiver[0])) { IClass c = (IClass) ((ConstantKey) receiver[0]).getValue(); @@ -58,6 +59,7 @@ class ClassNewInstanceContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java index c2c122c2a..ce981a62b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java @@ -99,6 +99,7 @@ public class CloneInterpreter implements SSAContextInterpreter { private final SSAInstructionFactory insts = Language.JAVA.instructionFactory(); + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -113,11 +114,13 @@ public class CloneInterpreter implements SSAContextInterpreter { return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; } + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -125,6 +128,7 @@ public class CloneInterpreter implements SSAContextInterpreter { return (node.getMethod().getReference().equals(CLONE) && ContextUtil.getConcreteClassFromContext(node.getContext()) != null); } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -134,6 +138,7 @@ public class CloneInterpreter implements SSAContextInterpreter { return new NonNullSingletonIterator(NewSiteReference.make(NEW_PC, cls.getReference())); } + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return new NonNullSingletonIterator(ARRAYCOPY_SITE); @@ -215,15 +220,18 @@ public class CloneInterpreter implements SSAContextInterpreter { * @see com.ibm.wala.ipa.callgraph.propagation.cfa.CFAContextInterpreter#recordFactoryType(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.IClass) */ + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { SSAInstruction[] statements = getIR(node).getInstructions(); return CodeScanner.getFieldsRead(statements).iterator(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { SSAInstruction[] statements = getIR(node).getInstructions(); return CodeScanner.getFieldsWritten(statements).iterator(); @@ -249,10 +257,12 @@ public class CloneInterpreter implements SSAContextInterpreter { return CodeScanner.iterateCastTypes(statements); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java index 3abd8382b..e5319f9cc 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java @@ -82,6 +82,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { this.cache = cache; } + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -115,6 +116,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getNumberOfStatements(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public int getNumberOfStatements(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -127,6 +129,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { * @see com.ibm.wala.ipa.callgraph.rta.RTAContextInterpreter#understands(com.ibm.wala.classLoader.IMethod, * com.ibm.wala.ipa.callgraph.Context) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -141,6 +144,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -162,18 +166,22 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { return m.getInvokeStatements().iterator(); } + @Override public Iterator iterateCallSites(CGNode node) { final Iterator I = getInvokeStatements(node); return new Iterator() { + @Override public boolean hasNext() { return I.hasNext(); } + @Override public CallSiteReference next() { SSAInvokeInstruction s = (SSAInvokeInstruction) I.next(); return s.getCallSite(); } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -205,6 +213,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#recordFactoryType(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.IClass) */ + @Override public boolean recordFactoryType(CGNode node, IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -215,6 +224,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { return recordType(node.getMethod().getClassHierarchy(), node.getContext(), klass.getReference()); } + @Override public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -229,6 +239,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { } } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -312,10 +323,12 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getCFG(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java index 0d2f04599..a02807a76 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java @@ -33,6 +33,7 @@ class FactoryContextSelector implements ContextSelector { /* * @see com.ibm.wala.ipa.callgraph.ContextSelector#getCalleeTarget(com.ibm.wala.ipa.callgraph.CGNode, com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee == null) { throw new IllegalArgumentException("callee is null"); @@ -46,6 +47,7 @@ class FactoryContextSelector implements ContextSelector { return null; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return EmptyIntSet.instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java index b03758c46..fe56373ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java @@ -41,6 +41,7 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { private static final boolean DEBUG = false; + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -53,11 +54,13 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; } + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -68,10 +71,12 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { return node.getMethod().getReference().equals(GetClassContextSelector.GET_CLASS); } + @Override public Iterator iterateNewSites(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateCallSites(CGNode node) { return EmptyIterator.instance(); } @@ -101,22 +106,27 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { return new SyntheticIR(method, context, new InducedCFG(instrs, method, context), instrs, SSAOptions.defaultOptions(), null); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java index 694e00542..558777805 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java @@ -39,6 +39,7 @@ class GetClassContextSelector implements ContextSelector { * com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, * com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(GET_CLASS)) { return new JavaTypeContext(new PointType(receiver[0].getConcreteType())); @@ -48,6 +49,7 @@ class GetClassContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java index 6049a6ff3..292c5469c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java @@ -17,6 +17,7 @@ import com.ibm.wala.ipa.callgraph.ContextKey; public class IllegalArgumentExceptionContext implements Context { + @Override public ContextItem get(ContextKey name) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java index 70481fb3b..d06fc05d7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java @@ -90,6 +90,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getIR(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -148,6 +149,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getNumberOfStatements(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; @@ -156,6 +158,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#understands(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -169,6 +172,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { || mRef.equals(GET_DECLARED_METHODS); } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -182,6 +186,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { return EmptyIterator.instance(); } + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return EmptyIterator.instance(); @@ -404,22 +409,27 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { } } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java index e81d61a80..a03fa0217 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java @@ -48,6 +48,7 @@ class JavaLangClassContextSelector implements ContextSelector { * If the {@link CallSiteReference} invokes a method we understand and c is a type constant, return a {@link JavaTypeContext} * representing the type named by s, if we can resolve it in the {@link IClassHierarchy}. */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver != null && receiver.length > 0 && mayUnderstand(caller, site, callee, receiver[0])) { return new JavaTypeContext(new PointType(getTypeConstant(receiver[0]))); @@ -87,6 +88,7 @@ class JavaLangClassContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java index 93cae38b1..b7b861b1c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java @@ -32,6 +32,7 @@ public class JavaTypeContext implements Context { this.type = type; } + @Override public ContextItem get(ContextKey name) { if (name == ContextKey.RECEIVER) { return type; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java index 86b972a07..dda789e34 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java @@ -42,50 +42,60 @@ public class ReflectionContextInterpreter { // start with a dummy interpreter that understands nothing SSAContextInterpreter result = new SSAContextInterpreter() { + @Override public boolean understands(CGNode node) { return false; } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // TODO Auto-generated method stub return false; } + @Override public Iterator iterateNewSites(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public Iterator iterateFieldsWritten(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public Iterator iterateFieldsRead(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public Iterator iterateCallSites(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public int getNumberOfStatements(CGNode node) { // TODO Auto-generated method stub return 0; } + @Override public IR getIR(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public DefUse getDU(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public ControlFlowGraph getCFG(CGNode n) { // TODO Auto-generated method stub return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java index c9f856e80..5b64a80ee 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java @@ -34,9 +34,11 @@ public class ReflectionContextSelector { // start with a dummy ContextSelector result = new ContextSelector() { + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return null; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return EmptyIntSet.instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java index 0568d7bfc..1371e6934 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java @@ -55,6 +55,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getIR(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -73,6 +74,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getNumberOfStatements(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; @@ -81,6 +83,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#understands(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -98,6 +101,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateNewSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -109,6 +113,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateCallSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return getIR(node).iterateCallSites(); @@ -202,22 +207,27 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret return new SyntheticIR(method, context, new InducedCFG(instrs, method, context), instrs, SSAOptions.defaultOptions(), constants); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java index dc3426cee..72aedf89f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java @@ -47,6 +47,7 @@ class ReflectiveInvocationSelector implements ContextSelector { *
  • Otherwise, return a new {@link ReceiverInstanceContext} for receiver. * */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver == null || receiver.length == 0 || !mayUnderstand(caller, site, callee, receiver[0])) { return null; @@ -126,6 +127,7 @@ class ReflectiveInvocationSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java index 316ac6cc1..1e5700fe1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java @@ -100,14 +100,17 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { protected void init(Meeter meeter, final FlowProvider flow) { final MeetOperator meet = new MeetOperator(meeter); ITransferFunctionProvider xferFunctions = new ITransferFunctionProvider() { + @Override public boolean hasNodeTransferFunctions() { return flow.needsNodeFlow(); } + @Override public boolean hasEdgeTransferFunctions() { return flow.needsEdgeFlow(); } + @Override public UnaryOperator getNodeTransferFunction(final BasicBlock node) { return new UnaryOperator() { @Override @@ -142,6 +145,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { }; } + @Override public UnaryOperator getEdgeTransferFunction(final BasicBlock from, final BasicBlock to) { return new UnaryOperator() { @Override @@ -176,6 +180,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { }; } + @Override public AbstractMeetOperator getMeetOperator() { return meet; } @@ -717,6 +722,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { return result; } + @Override public void copyState(MachineState other) { if (other.stack == null) { stack = null; @@ -834,14 +840,17 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { this.edgeVisitor = ev; } + @Override public boolean needsNodeFlow() { return true; } + @Override public boolean needsEdgeFlow() { return false; } + @Override public MachineState flow(MachineState entry, BasicBlock basicBlock) { workingState = entry.duplicate(); currentBlock = basicBlock; @@ -861,6 +870,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { return workingState; } + @Override public MachineState flow(MachineState entry, BasicBlock from, BasicBlock to) { workingState = entry.duplicate(); currentBlock = from; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java index 47e9c39ca..7c551947c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java @@ -505,6 +505,7 @@ public class TypeInference extends SSAInference implements FixedPo protected AbstractOperator result = null; + @Override public AbstractOperator get(SSAInstruction instruction) { instruction.visit(this); AbstractOperator temp = result; @@ -705,15 +706,18 @@ public class TypeInference extends SSAInference implements FixedPo } } + @Override public void visitAddressOf(SSAAddressOfInstruction instruction) { TypeReference type = language.getPointerType(instruction.getType()); result = getPointerTypeOperator(type); } + @Override public void visitLoadIndirect(SSALoadIndirectInstruction instruction) { result = getPointerTypeOperator(instruction.getLoadedType()); } + @Override public void visitStoreIndirect(SSAStoreIndirectInstruction instruction) { Assertions.UNREACHABLE(); } @@ -721,6 +725,7 @@ public class TypeInference extends SSAInference implements FixedPo public class TypeVarFactory implements VariableFactory { + @Override public IVariable makeVariable(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (doPrimitives) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java index 2a32b021c..0571f737c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java @@ -28,6 +28,7 @@ public class TypeVariable extends AbstractVariable { this.type = type; } + @Override public void copyState(TypeVariable other) throws IllegalArgumentException { if (other == null) { throw new IllegalArgumentException("v == null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java b/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java index 1c91efa72..113a5abf5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java @@ -121,6 +121,7 @@ public abstract class AbstractCFG> implements Contro /** * Return the entry basic block for the CFG. */ + @Override public T entry() { return getNode(0); } @@ -128,10 +129,12 @@ public abstract class AbstractCFG> implements Contro /** * Return the exit basic block for the CFG. */ + @Override public T exit() { return exit; } + @Override public int getPredNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -218,6 +221,7 @@ public abstract class AbstractCFG> implements Contro return getNumberOfExceptionalOut(getNumber(N)); } + @Override public Iterator getPredNodes(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -261,6 +265,7 @@ public abstract class AbstractCFG> implements Contro } } + @Override public int getSuccNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -299,6 +304,7 @@ public abstract class AbstractCFG> implements Contro return Iterator2Collection.toSet(getSuccNodes(N)).size(); } + @Override public Iterator getSuccNodes(T N) { int number = getNumber(N); if (normalToExit.get(number) && exceptionalToExit.get(number)) { @@ -392,38 +398,47 @@ public abstract class AbstractCFG> implements Contro /** * @param n */ + @Override public void addNode(T n) { nodeManager.addNode(n); } + @Override public int getMaxNumber() { return nodeManager.getMaxNumber(); } + @Override public T getNode(int number) { return nodeManager.getNode(number); } + @Override public int getNumber(T N) { return nodeManager.getNumber(N); } + @Override public int getNumberOfNodes() { return nodeManager.getNumberOfNodes(); } + @Override public Iterator iterator() { return nodeManager.iterator(); } + @Override public void addEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE("Don't call me .. use addNormalEdge or addExceptionalEdge"); } + @Override public void removeEdge(T src, T dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public boolean hasEdge(T src, T dst) { if (dst == null) { throw new IllegalArgumentException("dst is null"); @@ -507,6 +522,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.Graph#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(T N) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -514,6 +530,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -521,6 +538,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T N) { return nodeManager.containsNode(N); } @@ -557,10 +575,12 @@ public abstract class AbstractCFG> implements Contro /** * Returns the catchBlocks. */ + @Override public BitVector getCatchBlocks() { return catchBlocks; } + @Override public IMethod getMethod() { return method; } @@ -568,6 +588,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -575,6 +596,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalSuccessors(com.ibm.wala.cfg.T) */ + @Override public List getExceptionalSuccessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -589,6 +611,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalSuccessors(com.ibm.wala.cfg.T) */ + @Override public Collection getNormalSuccessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -599,14 +622,17 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } + @Override public void removeIncomingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -622,6 +648,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalPredecessors(com.ibm.wala.cfg.T) */ + @Override public Collection getExceptionalPredecessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -632,6 +659,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalPredecessors(com.ibm.wala.cfg.T) */ + @Override public Collection getNormalPredecessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -639,6 +667,7 @@ public abstract class AbstractCFG> implements Contro return Iterator2Collection.toSet(iterateNormalPredecessors(b)); } + @Override public IntSet getPredNodeNumbers(T node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -647,6 +676,7 @@ public abstract class AbstractCFG> implements Contro /* * TODO: optimize this. */ + @Override public IntSet getSuccNodeNumbers(T node) { int number = getNumber(node); IntSet s = normalEdgeManager.getSuccNodeNumbers(node); diff --git a/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java index 9dfac2f80..26d7c8a86 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java @@ -111,6 +111,7 @@ public class InducedCFG extends AbstractCFG iterator() { return new ArrayIterator(getInstructions(), getFirstInstructionIndex(), getLastInstructionIndex()); } @@ -580,6 +590,7 @@ public class InducedCFG extends AbstractCFG { return (o instanceof ShrikeCFG) && getMethod().equals(((ShrikeCFG) o).getMethod()); } + @Override public IInstruction[] getInstructions() { try { return method.getInstructions(); @@ -216,6 +217,7 @@ public class ShrikeCFG extends AbstractCFG { /** * Return an instruction's basic block in the CFG given the index of the instruction in the CFG's instruction array. */ + @Override public BasicBlock getBlockForInstruction(int index) { return getNode(instruction2Block[index]); } @@ -231,6 +233,7 @@ public class ShrikeCFG extends AbstractCFG { this.startIndex = startIndex; } + @Override public boolean isCatchBlock() { return ShrikeCFG.this.isCatchBlock(getNumber()); } @@ -421,6 +424,7 @@ public class ShrikeCFG extends AbstractCFG { addExceptionalEdge(this, b); } + @Override public int getLastInstructionIndex() { if (this == entry() || this == exit()) { // these are the special end blocks @@ -439,6 +443,7 @@ public class ShrikeCFG extends AbstractCFG { } } + @Override public int getFirstInstructionIndex() { return startIndex; } @@ -451,6 +456,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#isExitBlock() */ + @Override public boolean isExitBlock() { return this == ShrikeCFG.this.exit(); } @@ -458,6 +464,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#isEntryBlock() */ + @Override public boolean isEntryBlock() { return this == ShrikeCFG.this.entry(); } @@ -465,6 +472,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#getMethod() */ + @Override public IMethod getMethod() { return ShrikeCFG.this.getMethod(); } @@ -483,10 +491,12 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#getNumber() */ + @Override public int getNumber() { return getGraphNodeId(); } + @Override public Iterator iterator() { return new ArrayIterator(getInstructions(), getFirstInstructionIndex(), getLastInstructionIndex()); } @@ -517,6 +527,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.ControlFlowGraph#getProgramCounter(int) */ + @Override public int getProgramCounter(int index) { try { return method.getBytecodeIndex(index); diff --git a/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java b/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java index ead3feea4..dc749fbbe 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java @@ -114,6 +114,7 @@ public class ControlDependenceGraph> extends Abstrac } } + @Override public Iterator getPredNodes(T N) { if (backwardEdges.containsKey(N)) return backwardEdges.get(N).iterator(); @@ -121,6 +122,7 @@ public class ControlDependenceGraph> extends Abstrac return EmptyIterator.instance(); } + @Override public IntSet getPredNodeNumbers(T node) { MutableIntSet x = IntSetUtil.make(); if (backwardEdges.containsKey(node)) { @@ -131,6 +133,7 @@ public class ControlDependenceGraph> extends Abstrac return x; } + @Override public int getPredNodeCount(T N) { if (backwardEdges.containsKey(N)) return ((Set) backwardEdges.get(N)).size(); @@ -138,6 +141,7 @@ public class ControlDependenceGraph> extends Abstrac return 0; } + @Override public Iterator getSuccNodes(T N) { if (forwardEdges.containsKey(N)) return forwardEdges.get(N).iterator(); @@ -145,6 +149,7 @@ public class ControlDependenceGraph> extends Abstrac return EmptyIterator.instance(); } + @Override public IntSet getSuccNodeNumbers(T node) { MutableIntSet x = IntSetUtil.make(); if (forwardEdges.containsKey(node)) { @@ -155,6 +160,7 @@ public class ControlDependenceGraph> extends Abstrac return x; } + @Override public int getSuccNodeCount(T N) { if (forwardEdges.containsKey(N)) return ((Set) forwardEdges.get(N)).size(); @@ -162,26 +168,32 @@ public class ControlDependenceGraph> extends Abstrac return 0; } + @Override public boolean hasEdge(T src, T dst) { return forwardEdges.containsKey(src) && ((Set) forwardEdges.get(src)).contains(dst); } + @Override public void addEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeAllIncidentEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(T node) { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java index 762c72420..24647c1f9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java @@ -92,6 +92,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.Module#getEntries() */ + @Override public Iterator getEntries() { populateCache(); final Iterator it = cache.keySet().iterator(); @@ -109,16 +110,19 @@ public abstract class AbstractNestedJarFileModule implements Module { } } + @Override public boolean hasNext() { return next != null; } + @Override public ModuleEntry next() { ModuleEntry result = new Entry(next); advance(); return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -139,6 +143,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#getName() */ + @Override public String getName() { return name; } @@ -146,6 +151,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() */ + @Override public boolean isClassFile() { return FileSuffixes.isClassFile(getName()); } @@ -153,6 +159,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() */ + @Override public InputStream getInputStream() { return AbstractNestedJarFileModule.this.getInputStream(name); } @@ -160,6 +167,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() */ + @Override public boolean isModuleFile() { return false; } @@ -167,6 +175,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#asModule() */ + @Override public Module asModule() { Assertions.UNREACHABLE(); return null; @@ -180,6 +189,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() */ + @Override public String getClassName() { return FileSuffixes.stripSuffix(getName()); } @@ -187,6 +197,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() */ + @Override public boolean isSourceFile() { return FileSuffixes.isSourceFile(getName()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java index 315ec5516..5fe20aadf 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java @@ -34,6 +34,7 @@ public abstract class AbstractURLModule implements Module, ModuleEntry { return url; } + @Override public String getName() { try { URLConnection con = url.openConnection(); @@ -47,6 +48,7 @@ public abstract class AbstractURLModule implements Module, ModuleEntry { } } + @Override public InputStream getInputStream() { try { return url.openConnection().getInputStream(); @@ -56,19 +58,23 @@ public abstract class AbstractURLModule implements Module, ModuleEntry { } } + @Override public boolean isModuleFile() { return false; } + @Override public Module asModule() throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public String getClassName() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Iterator getEntries() { return new NonNullSingletonIterator(this); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java index cd8ad5b72..95c977025 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java @@ -65,6 +65,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getClassLoader() */ + @Override public IClassLoader getClassLoader() { return loader; } @@ -72,6 +73,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getName() */ + @Override public TypeName getName() { return getReference().getName(); } @@ -79,6 +81,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isInterface() */ + @Override public boolean isInterface() { return false; } @@ -86,6 +89,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isAbstract() */ + @Override public boolean isAbstract() { return false; } @@ -93,6 +97,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getModifiers() */ + @Override public int getModifiers() { return ACC_PUBLIC | ACC_FINAL; } @@ -104,6 +109,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getSuperclass() */ + @Override public IClass getSuperclass() { IClass elt = getElementClass(); assert getReference().getArrayElementType().isPrimitiveType() || elt != null; @@ -126,14 +132,17 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IMethod getMethod(Selector sig) { return cha.lookupClass(getClassLoader().getLanguage().getRootType()).getMethod(sig); } + @Override public IField getField(Atom name) { return getSuperclass().getField(name); } + @Override public IField getField(Atom name, TypeName typeName) { return getSuperclass().getField(name, typeName); } @@ -141,6 +150,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() { return Collections.emptySet(); } @@ -152,6 +162,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getReference() */ + @Override public TypeReference getReference() { return type; } @@ -159,6 +170,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getSourceFileName() */ + @Override public String getSourceFileName() { return null; } @@ -166,6 +178,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() { return null; } @@ -173,6 +186,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isArrayClass() */ + @Override public boolean isArrayClass() { return true; } @@ -201,6 +215,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredFields() */ + @Override public Collection getDeclaredInstanceFields() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -208,6 +223,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ + @Override public Collection getDeclaredStaticFields() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -216,6 +232,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllImplementedInterfaces() */ + @Override public Collection getAllImplementedInterfaces() { HashSet result = HashSetFactory.make(2); for (TypeReference ref : getClassLoader().getLanguage().getArrayInterfaces()) { @@ -238,6 +255,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isReferenceType() */ + @Override public boolean isReferenceType() { return true; } @@ -279,6 +297,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() throws UnimplementedError { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -298,6 +317,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { Assertions.UNREACHABLE(); return null; @@ -306,6 +326,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields() { Assertions.UNREACHABLE(); return null; @@ -314,6 +335,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { return loader.lookupClass(getClassLoader().getLanguage().getRootType().getName()).getAllMethods(); } @@ -321,27 +343,33 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { Assertions.UNREACHABLE(); return null; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public boolean isPublic() { return true; } + @Override public boolean isPrivate() { return false; } + @Override public InputStream getSource() { return null; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index 5b3d235cb..e085210e0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -144,20 +144,24 @@ public abstract class BytecodeClass implements IClass { } } + @Override public IClassLoader getClassLoader() { return loader; } protected abstract IMethod[] computeDeclaredMethods() throws InvalidClassFileException; + @Override public TypeReference getReference() { return typeReference; } + @Override public String getSourceFileName() { return loader.getSourceFileName(this); } + @Override public InputStream getSource() { return loader.getSource(this); } @@ -172,22 +176,27 @@ public abstract class BytecodeClass implements IClass { return getReference().toString(); } + @Override public boolean isArrayClass() { return false; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public TypeName getName() { return getReference().getName(); } + @Override public boolean isReferenceType() { return getReference().isReferenceType(); } + @Override public IField getField(Atom name) { if (fieldMap.containsKey(name)) { return fieldMap.get(name); @@ -222,6 +231,7 @@ public abstract class BytecodeClass implements IClass { } + @Override public IField getField(Atom name, TypeName type) { boolean unresolved = false; try { @@ -276,6 +286,7 @@ public abstract class BytecodeClass implements IClass { superClass = loader.lookupClass(TypeName.findOrCreate(superName)); } + @Override public IClass getSuperclass() { if (!superclassComputed) { computeSuperclass(); @@ -289,6 +300,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { Collection result = new LinkedList(); result.addAll(getAllInstanceFields()); @@ -299,6 +311,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getAllImplementedInterfaces() */ + @Override public Collection getAllImplementedInterfaces() { if (allInterfaces != null) { return allInterfaces; @@ -312,6 +325,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredFields() */ + @Override public Collection getDeclaredInstanceFields() { return Collections.unmodifiableList(Arrays.asList(instanceFields)); } @@ -319,6 +333,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredFields() */ + @Override public Collection getDeclaredStaticFields() { return Collections.unmodifiableList(Arrays.asList(staticFields)); } @@ -326,6 +341,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() { return array2IClassSet(interfaceNames); } @@ -333,6 +349,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { Collection result = new LinkedList(getDeclaredInstanceFields()); IClass s = getSuperclass(); @@ -346,6 +363,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields() { Collection result = new LinkedList(getDeclaredStaticFields()); IClass s = getSuperclass(); @@ -359,6 +377,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { Collection result = new LinkedList(); Iterator declaredMethods = getDeclaredMethods().iterator(); @@ -384,6 +403,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() { try { computeMethodMapIfNeeded(); @@ -397,6 +417,7 @@ public abstract class BytecodeClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.types.Selector) */ + @Override public IMethod getMethod(Selector selector) { try { computeMethodMapIfNeeded(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java index 901fcf3fe..8f06a70da 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java @@ -37,14 +37,17 @@ public class ClassFileModule extends FileModule { return "ClassFileModule:" + getFile(); } + @Override public boolean isClassFile() { return true; } + @Override public String getClassName() { return className; } + @Override public boolean isSourceFile() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java index 8e01d26a3..23804672c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java @@ -53,6 +53,7 @@ public class ClassLoaderFactoryImpl implements ClassLoaderFactory { * @param classLoaderReference * identifier for the desired class loader */ + @Override public IClassLoader getLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, AnalysisScope scope) throws IOException { if (classLoaderReference == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java index c0715a634..a26566cd1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java @@ -431,6 +431,7 @@ public class ClassLoaderImpl implements IClassLoader { * * @throws IllegalArgumentException if modules is null */ + @Override public void init(List modules) throws IOException { if (modules == null) { @@ -529,10 +530,12 @@ public class ClassLoaderImpl implements IClassLoader { } } + @Override public ClassLoaderReference getReference() { return loader; } + @Override public Iterator iterateAllClasses() { return getAllClasses().iterator(); } @@ -540,6 +543,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#lookupClass(com.ibm.wala.types.TypeName) */ + @Override public IClass lookupClass(TypeName className) { if (className == null) { throw new IllegalArgumentException("className is null"); @@ -569,14 +573,17 @@ public class ClassLoaderImpl implements IClassLoader { /** * Method getParent. */ + @Override public IClassLoader getParent() { return parent; } + @Override public Atom getName() { return loader.getName(); } + @Override public Language getLanguage() { return Language.JAVA; } @@ -589,6 +596,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getNumberOfClasses() */ + @Override public int getNumberOfClasses() { return getAllClasses().size(); } @@ -596,6 +604,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getNumberOfMethods() */ + @Override public int getNumberOfMethods() { int result = 0; for (Iterator it = iterateAllClasses(); it.hasNext();) { @@ -608,6 +617,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getSourceFileName(com.ibm.wala.classLoader.IClass) */ + @Override public String getSourceFileName(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -616,14 +626,17 @@ public class ClassLoaderImpl implements IClassLoader { return e == null ? null : e.getName(); } + @Override public InputStream getSource(IMethod method, int offset) { return getSource(method.getDeclaringClass()); } + @Override public String getSourceFileName(IMethod method, int offset) { return getSourceFileName(method.getDeclaringClass()); } + @Override public InputStream getSource(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -635,6 +648,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#removeAll(java.util.Collection) */ + @Override public void removeAll(Collection toRemove) { if (toRemove == null) { throw new IllegalArgumentException("toRemove is null"); @@ -649,6 +663,7 @@ public class ClassLoaderImpl implements IClassLoader { } } + @Override public SSAInstructionFactory getInstructionFactory() { return getLanguage().instructionFactory(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java index 1a238737f..e745548d8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java @@ -37,38 +37,47 @@ public class CompoundModule implements ModuleEntry, Module, SourceModule { return stuff; } + @Override public Iterator getEntries() { return new NonNullSingletonIterator(this); } + @Override public boolean isModuleFile() { return false; } + @Override public Module asModule() { throw new UnsupportedOperationException(); } + @Override public String getClassName() { throw new UnsupportedOperationException(); } + @Override public String getName() { return name.toString(); } + @Override public URL getURL() { return name; } + @Override public boolean isClassFile() { return false; } + @Override public boolean isSourceFile() { return true; } + @Override public InputStream getInputStream() { return new InputStream() { private int index = 0; @@ -146,6 +155,7 @@ public class CompoundModule implements ModuleEntry, Module, SourceModule { } } + @Override public Reader getInputReader() { return new Reader(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java index a96e60e7d..e6e25d06e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java @@ -66,6 +66,7 @@ public abstract class DirectoryTreeModule implements Module { return result; } + @Override public Iterator getEntries() { return getEntriesRecursive(root).iterator(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java index 141233efe..7077fde69 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java @@ -50,6 +50,7 @@ public final class FieldImpl implements IField { /* * @see com.ibm.wala.classLoader.IMember#getDeclaringClass() */ + @Override public IClass getDeclaringClass() { return declaringClass; } @@ -79,6 +80,7 @@ public final class FieldImpl implements IField { return fr.toString(); } + @Override public FieldReference getReference() { return FieldReference.findOrCreate(getDeclaringClass().getReference(), getName(), getFieldTypeReference()); } @@ -86,6 +88,7 @@ public final class FieldImpl implements IField { /* * @see com.ibm.wala.classLoader.IMember#getName() */ + @Override public Atom getName() { return fieldRef.getName(); } @@ -93,38 +96,47 @@ public final class FieldImpl implements IField { /* * @see com.ibm.wala.classLoader.IField#getFieldTypeReference() */ + @Override public TypeReference getFieldTypeReference() { return fieldRef.getFieldType(); } + @Override public boolean isStatic() { return ((accessFlags & ClassConstants.ACC_STATIC) != 0); } + @Override public boolean isFinal() { return ((accessFlags & ClassConstants.ACC_FINAL) != 0); } + @Override public boolean isPrivate() { return ((accessFlags & ClassConstants.ACC_PRIVATE) != 0); } + @Override public boolean isProtected() { return ((accessFlags & ClassConstants.ACC_PROTECTED) != 0); } + @Override public boolean isPublic() { return ((accessFlags & ClassConstants.ACC_PUBLIC) != 0); } + @Override public boolean isVolatile() { return ((accessFlags & ClassConstants.ACC_VOLATILE) != 0); } + @Override public IClassHierarchy getClassHierarchy() { return declaringClass.getClassHierarchy(); } + @Override public Collection getAnnotations() { return annotations == null ? null : Collections.unmodifiableCollection(annotations); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java index 39996da22..eeb3a3097 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java @@ -44,6 +44,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.Module#getEntries() */ + @Override public Iterator getEntries() { return new NonNullSingletonIterator(this); } @@ -69,6 +70,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getName() */ + @Override public String getName() { return file.getName(); } @@ -76,6 +78,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() */ + @Override public InputStream getInputStream() { try { if (!file.exists()) { @@ -92,6 +95,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() */ + @Override public boolean isModuleFile() { return false; } @@ -103,6 +107,7 @@ public abstract class FileModule implements Module, ModuleEntry { return file; } + @Override public Module asModule() throws UnimplementedError { Assertions.UNREACHABLE("implement me"); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java index e04c7730c..6b135df89 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java @@ -35,6 +35,7 @@ public interface IField extends IMember { public boolean isPrivate(); public boolean isProtected(); public boolean isPublic(); + @Override public boolean isStatic(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java index a3ab48f99..899584c89 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java @@ -32,20 +32,24 @@ public abstract class JVMClass extends BytecodeClass */ protected int modifiers; + @Override public int getModifiers() { return modifiers; } + @Override public boolean isPublic() { boolean result = ((modifiers & Constants.ACC_PUBLIC) != 0); return result; } + @Override public boolean isPrivate() { boolean result = ((modifiers & Constants.ACC_PRIVATE) != 0); return result; } + @Override public boolean isInterface() { boolean result = ((modifiers & Constants.ACC_INTERFACE) != 0); return result; @@ -55,6 +59,7 @@ public abstract class JVMClass extends BytecodeClass /* * @see com.ibm.wala.classLoader.IClass#isAbstract() */ + @Override public boolean isAbstract() { boolean result = ((modifiers & Constants.ACC_ABSTRACT) != 0); return result; @@ -63,6 +68,7 @@ public abstract class JVMClass extends BytecodeClass /** * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() { try { computeMethodMapIfNeeded(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java index 0161d1a80..14453d33d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java @@ -37,6 +37,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getName() */ + @Override public String getName() { return entryName; } @@ -44,6 +45,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() */ + @Override public boolean isClassFile() { return FileSuffixes.isClassFile(getName()); } @@ -51,6 +53,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() */ + @Override public InputStream getInputStream() { try { return jarFile.getInputStream(jarFile.getEntry(entryName)); @@ -79,6 +82,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() */ + @Override public boolean isModuleFile() { return FileSuffixes.isJarFile(getName()) || FileSuffixes.isWarFile(getName()); } @@ -86,6 +90,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#asModule() */ + @Override public Module asModule() { return new NestedJarFileModule(jarFileModule, jarFile.getEntry(entryName)); } @@ -106,6 +111,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() */ + @Override public String getClassName() { return FileSuffixes.stripSuffix(getName()); } @@ -113,6 +119,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() */ + @Override public boolean isSourceFile() { return FileSuffixes.isSourceFile(getName()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java index dc7dd536b..509d7ac69 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java @@ -60,6 +60,7 @@ public class JarFileModule implements Module { /* * @see com.ibm.wala.classLoader.Module#getEntries() */ + @Override public Iterator getEntries() { HashSet result = HashSetFactory.make(); for (Enumeration e = file.entries(); e.hasMoreElements();) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java index 699785859..19ae7f94a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java @@ -74,6 +74,7 @@ import com.ibm.wala.util.warnings.Warnings; public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Constants { public static class JavaInstructionFactory implements SSAInstructionFactory { + @Override public SSAArrayLengthInstruction ArrayLengthInstruction(int result, int arrayref) { return new SSAArrayLengthInstruction(result, arrayref) { @Override @@ -83,6 +84,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAArrayLoadInstruction ArrayLoadInstruction(int result, int arrayref, int index, TypeReference declaredType) { return new SSAArrayLoadInstruction(result, arrayref, index, declaredType) { @Override @@ -92,6 +94,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAArrayStoreInstruction ArrayStoreInstruction(int arrayref, int index, int value, TypeReference declaredType) { return new SSAArrayStoreInstruction(arrayref, index, value, declaredType) { @Override @@ -105,6 +108,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSABinaryOpInstruction BinaryOpInstruction(IBinaryOpInstruction.IOperator operator, boolean overflow, boolean unsigned, int result, int val1, int val2, boolean mayBeInteger) { assert !overflow; @@ -128,10 +132,12 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int[] typeValues, boolean isPEI) { throw new UnsupportedOperationException(); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference[] types, boolean isPEI) { assert types.length == 1; assert isPEI; @@ -143,25 +149,30 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int typeValue, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new int[]{ typeValue }, true); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference type, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new TypeReference[]{ type }, true); } + @Override public SSAComparisonInstruction ComparisonInstruction(IComparisonInstruction.Operator operator, int result, int val1, int val2) { return new SSAComparisonInstruction(operator, result, val1, val2); } + @Override public SSAConditionalBranchInstruction ConditionalBranchInstruction(IConditionalBranchInstruction.IOperator operator, TypeReference type, int val1, int val2) { return new SSAConditionalBranchInstruction(operator, type, val1, val2); } + @Override public SSAConversionInstruction ConversionInstruction(int result, int val, TypeReference fromType, TypeReference toType, boolean overflow) { assert !overflow; @@ -177,15 +188,18 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAGetCaughtExceptionInstruction GetCaughtExceptionInstruction(int bbNumber, int exceptionValueNumber) { return new SSAGetCaughtExceptionInstruction(bbNumber, exceptionValueNumber); } + @Override public SSAGetInstruction GetInstruction(int result, FieldReference field) { return new SSAGetInstruction(result, field) { }; } + @Override public SSAGetInstruction GetInstruction(int result, int ref, FieldReference field) { return new SSAGetInstruction(result, ref, field) { @Override @@ -195,14 +209,17 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAGotoInstruction GotoInstruction() { return new SSAGotoInstruction(); } + @Override public SSAInstanceofInstruction InstanceofInstruction(int result, int ref, TypeReference checkedType) { return new SSAInstanceofInstruction(result, ref, checkedType); } + @Override public SSAInvokeInstruction InvokeInstruction(int result, int[] params, int exception, CallSiteReference site) { return new SSAInvokeInstruction(result, params, exception, site) { @Override @@ -216,6 +233,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAInvokeInstruction InvokeInstruction(int[] params, int exception, CallSiteReference site) { return new SSAInvokeInstruction(params, exception, site) { @Override @@ -229,6 +247,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAMonitorInstruction MonitorInstruction(int ref, boolean isEnter) { return new SSAMonitorInstruction(ref, isEnter) { @Override @@ -238,6 +257,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site) { return new SSANewInstruction(result, site) { @Override @@ -251,11 +271,13 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAPhiInstruction PhiInstruction(int result, int[] params) throws IllegalArgumentException { return new SSAPhiInstruction(result, params) { }; } + @Override public SSAPutInstruction PutInstruction(int ref, int value, FieldReference field) { return new SSAPutInstruction(ref, value, field) { @Override @@ -265,23 +287,28 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAPutInstruction PutInstruction(int value, FieldReference field) { return new SSAPutInstruction(value, field) { }; } + @Override public SSAReturnInstruction ReturnInstruction() { return new SSAReturnInstruction(); } + @Override public SSAReturnInstruction ReturnInstruction(int result, boolean isPrimitive) { return new SSAReturnInstruction(result, isPrimitive); } + @Override public SSASwitchInstruction SwitchInstruction(int val, int defaultLabel, int[] casesAndLabels) { return new SSASwitchInstruction(val, defaultLabel, casesAndLabels); } + @Override public SSAThrowInstruction ThrowInstruction(int exception) { return new SSAThrowInstruction(exception) { @Override @@ -291,10 +318,12 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAUnaryOpInstruction UnaryOpInstruction(IUnaryOpInstruction.IOperator operator, int result, int val) { return new SSAUnaryOpInstruction(operator, result, val); } + @Override public SSALoadMetadataInstruction LoadMetadataInstruction(int lval, TypeReference entityType, Object token) { return new SSALoadMetadataInstruction(lval, entityType, token) { @Override @@ -304,6 +333,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site, int[] params) { return new SSANewInstruction(result, site, params) { @Override @@ -313,26 +343,32 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAPiInstruction PiInstruction(int result, int val, int piBlock, int successorBlock, SSAInstruction cause) { return new SSAPiInstruction(result, val, piBlock, successorBlock, cause); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, int indexVal, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, FieldReference field, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSALoadIndirectInstruction LoadIndirectInstruction(int lval, TypeReference t, int addressVal) { throw new UnsupportedOperationException(); } + @Override public SSAStoreIndirectInstruction StoreIndirectInstruction(int addressVal, int rval, TypeReference pointeeType) { throw new UnsupportedOperationException(); } @@ -406,18 +442,22 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons return exceptionInInitializerError; } + @Override public Atom getName() { return ClassLoaderReference.Java; } + @Override public TypeReference getRootType() { return TypeReference.JavaLangObject; } + @Override public TypeReference getThrowableType() { return TypeReference.JavaLangThrowable; } + @Override public TypeReference getConstantType(Object o) { if (o == null) { // TODO: do we really want null here instead of TypeReference.Null? @@ -446,14 +486,17 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons } } + @Override public boolean isNullType(TypeReference type) { return type == null || type == TypeReference.Null; } + @Override public TypeReference[] getArrayInterfaces() { return new TypeReference[] { TypeReference.JavaIoSerializable, TypeReference.JavaLangCloneable }; } + @Override public TypeName lookupPrimitiveType(String name) { throw new UnsupportedOperationException(); } @@ -464,6 +507,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons * @throws IllegalArgumentException if target is null * @throws IllegalArgumentException if cha is null */ + @Override public Collection inferInvokeExceptions(MethodReference target, IClassHierarchy cha) throws InvalidClassFileException { @@ -509,6 +553,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons * * @throws IllegalArgumentException if pei is null */ + @Override public Collection getImplicitExceptionTypes(IInstruction pei) { if (pei == null) { throw new IllegalArgumentException("pei is null"); @@ -575,48 +620,59 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons } } + @Override public SSAInstructionFactory instructionFactory() { return javaShrikeFactory; } private final static SSAInstructionFactory javaShrikeFactory = new JavaInstructionFactory(); + @Override public boolean isDoubleType(TypeReference type) { return type == TypeReference.Double; } + @Override public boolean isFloatType(TypeReference type) { return type == TypeReference.Float; } + @Override public boolean isIntType(TypeReference type) { return type == TypeReference.Int; } + @Override public boolean isLongType(TypeReference type) { return type == TypeReference.Long; } + @Override public boolean isVoidType(TypeReference type) { return type == TypeReference.Void; } + @Override public boolean isMetadataType(TypeReference type) { return type == TypeReference.JavaLangClass; } + @Override public boolean isStringType(TypeReference type) { return type == TypeReference.JavaLangString; } + @Override public boolean isBooleanType(TypeReference type) { return type == TypeReference.Boolean; } + @Override public boolean isCharType(TypeReference type) { return type == TypeReference.Char; } + @Override public Object getMetadataToken(Object value) { if (value instanceof ClassToken) { return ShrikeUtil.makeTypeReference(ClassLoaderReference.Primordial, ((ClassToken) value).getTypeName()); @@ -626,14 +682,17 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons } } + @Override public TypeReference getPointerType(TypeReference pointee) throws UnsupportedOperationException { throw new UnsupportedOperationException("Java does not permit explicit pointers"); } + @Override public TypeReference getMetadataType() { return TypeReference.JavaLangClass; } + @Override public TypeReference getStringType() { return TypeReference.JavaLangString; } @@ -642,6 +701,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons JavaPrimitiveType.init(); } + @Override @SuppressWarnings("static-access") public PrimitiveType getPrimitive(TypeReference reference) { return JavaPrimitiveType.getPrimitive(reference); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java index 267a2c2be..d6d05a31b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java @@ -30,14 +30,17 @@ public abstract class LanguageImpl implements Language { base.registerDerivedLanguage(this); } + @Override public Language getBaseLanguage() { return baseLang; } + @Override public Set getDerivedLanguages() { return derivedLangs; } + @Override public void registerDerivedLanguage(Language l) { derivedLangs.add(l); if (baseLang != null) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java index bc6947b6c..cd511571e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java @@ -326,6 +326,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { } } + @Override public MethodReference getReference() { if (methodReference == null) { methodReference = computeMethodReference(); @@ -333,56 +334,69 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { return methodReference; } + @Override public boolean isClinit() { return getReference().getSelector().equals(MethodReference.clinitSelector); } + @Override public boolean isInit() { return getReference().getName().equals(MethodReference.initAtom); } protected abstract int getModifiers(); + @Override public boolean isNative() { return ((getModifiers() & Constants.ACC_NATIVE) != 0); } + @Override public boolean isAbstract() { return ((getModifiers() & Constants.ACC_ABSTRACT) != 0); } + @Override public boolean isPrivate() { return ((getModifiers() & Constants.ACC_PRIVATE) != 0); } + @Override public boolean isProtected() { return ((getModifiers() & Constants.ACC_PROTECTED) != 0); } + @Override public boolean isPublic() { return ((getModifiers() & Constants.ACC_PUBLIC) != 0); } + @Override public boolean isFinal() { return ((getModifiers() & Constants.ACC_FINAL) != 0); } + @Override public boolean isBridge() { return ((getModifiers() & Constants.ACC_VOLATILE) != 0); } + @Override public boolean isSynchronized() { return ((getModifiers() & Constants.ACC_SYNCHRONIZED) != 0); } + @Override public boolean isStatic() { return ((getModifiers() & Constants.ACC_STATIC) != 0); } + @Override public boolean isSynthetic() { return false; } + @Override public IClass getDeclaringClass() { return declaringClass; } @@ -530,10 +544,12 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { // TODO: ShrikeBT should have a getMaxStack method on Decoder, I think. public abstract int getMaxStackHeight(); + @Override public Atom getName() { return getReference().getName(); } + @Override public Descriptor getDescriptor() { return getReference().getDescriptor(); } @@ -675,6 +691,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /** * By convention, for a non-static method, getParameterType(0) is the this pointer */ + @Override public TypeReference getParameterType(int i) { if (!isStatic()) { if (i == 0) { @@ -692,6 +709,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { * * @return int */ + @Override public int getNumberOfParameters() { if (isStatic() || isClinit()) { return getReference().getNumberOfParameters(); @@ -703,6 +721,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#hasExceptionHandler() */ + @Override public abstract boolean hasExceptionHandler(); /** @@ -712,6 +731,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { * * @see com.ibm.wala.classLoader.IMethod#getDeclaredExceptions() */ + @Override public TypeReference[] getDeclaredExceptions() throws InvalidClassFileException { return (getBCInfo().exceptionTypes == null) ? new TypeReference[0] : getBCInfo().exceptionTypes; } @@ -744,6 +764,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getLineNumber(int) */ + @Override public int getLineNumber(int bcIndex) { try { return (getBCInfo().lineNumberMap == null) ? -1 : getBCInfo().lineNumberMap[bcIndex]; @@ -779,6 +800,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getSignature() */ + @Override public String getSignature() { return getReference().getSignature(); } @@ -786,6 +808,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getSelector() */ + @Override public Selector getSelector() { return getReference().getSelector(); } @@ -793,6 +816,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getLocalVariableName(int, int) */ + @Override public abstract String getLocalVariableName(int bcIndex, int localNumber); /* @@ -800,6 +824,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { * * @see com.ibm.wala.classLoader.IMethod#hasLocalVariableTable() */ + @Override public abstract boolean hasLocalVariableTable(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java index 18fc1b5cd..67d166db7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java @@ -308,10 +308,12 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet } } + @Override public TypeReference getReturnType() { return getReference().getReturnType(); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -355,6 +357,7 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet return Annotation.getAnnotationsFromReader(r, getDeclaringClass().getClassLoader().getReference()); } + @Override public Collection getAnnotations() { Collection result = HashSetFactory.make(); try { @@ -370,16 +373,19 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet private final int[] NOTHING = new int[0]; + @Override public int[] indirectlyReadLocals(int instructionIndex) { return NOTHING; } + @Override public int[] indirectlyWrittenLocals(int instructionIndex) { return NOTHING; } }; + @Override public IndirectionData getIndirectionData() { return NO_INDIRECTIONS; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java index a5eac76ca..ac8fc4d53 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java @@ -228,6 +228,7 @@ public final class ShrikeClass extends JVMClass { return getAnnotations(false); } + @Override public Collection getAnnotations() { Collection result = HashSetFactory.make(); try { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java index 2fb4a807a..37764809e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java @@ -36,6 +36,7 @@ public class ShrikeIRFactory implements IRFactory { return ShrikeCFG.make(method); } + @Override public IR makeIR(final IBytecodeMethod method, Context C, final SSAOptions options) throws IllegalArgumentException { if (method == null) { @@ -113,6 +114,7 @@ public class ShrikeIRFactory implements IRFactory { }; } + @Override public boolean contextIsIrrelevant(IBytecodeMethod method) { // this factory always returns the same IR for a method return true; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java index 75ccd1103..9ba078b4e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java @@ -46,6 +46,7 @@ public class SourceFileModule extends FileModule implements Module, ModuleEntry, /* * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() */ + @Override public boolean isClassFile() { return false; } @@ -53,6 +54,7 @@ public class SourceFileModule extends FileModule implements Module, ModuleEntry, /* * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() */ + @Override public String getClassName() { return FileSuffixes.stripSuffix(fileName).replace(File.separator.charAt(0), '/'); } @@ -60,14 +62,17 @@ public class SourceFileModule extends FileModule implements Module, ModuleEntry, /* * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() */ + @Override public boolean isSourceFile() { return true; } + @Override public Reader getInputReader() { return new InputStreamReader(getInputStream()); } + @Override public URL getURL() { try { return getFile().toURI().toURL(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java index e30faea0c..2a8b2004d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java @@ -20,14 +20,17 @@ public class SourceURLModule extends AbstractURLModule implements SourceModule { super(url); } + @Override public boolean isClassFile() { return false; } + @Override public boolean isSourceFile() { return true; } + @Override public Reader getInputReader() { return new InputStreamReader(getInputStream()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java index d38d18ed4..155cb3914 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java @@ -75,6 +75,7 @@ public abstract class SyntheticClass implements IClass { * Subclasses may override as necessary. * @see com.ibm.wala.classLoader.IClass#getClassLoader() */ + @Override public IClassLoader getClassLoader() { return cha.getLoader(ClassLoaderReference.Primordial); } @@ -82,6 +83,7 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#isInterface() */ + @Override public boolean isInterface() { return false; } @@ -89,6 +91,7 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#isAbstract() */ + @Override public boolean isAbstract() { return false; } @@ -96,6 +99,7 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getReference() */ + @Override public TypeReference getReference() { return T; } @@ -103,10 +107,12 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getSourceFileName() */ + @Override public String getSourceFileName() { return null; } + @Override public InputStream getSource() { return null; } @@ -114,14 +120,17 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#isArrayClass() */ + @Override public boolean isArrayClass() { return false; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public TypeName getName() { return getReference().getName(); } @@ -129,10 +138,12 @@ public abstract class SyntheticClass implements IClass { /** * we assume synthetic classes do not need to have multiple fields with the same name. */ + @Override public IField getField(Atom name, TypeName typeName) { return getField(name); } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java index d3a3d25e4..23eba9bcb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java @@ -74,6 +74,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isClinit() */ + @Override public boolean isClinit() { return method.getSelector().equals(MethodReference.clinitSelector); } @@ -81,6 +82,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isInit() */ + @Override public boolean isInit() { return method.getSelector().equals(MethodReference.initSelector); } @@ -88,6 +90,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isStatic() */ + @Override public boolean isStatic() { return isStatic; } @@ -95,6 +98,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isNative() */ + @Override public boolean isNative() { return false; } @@ -102,6 +106,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isAbstract() */ + @Override public boolean isAbstract() { return false; } @@ -109,14 +114,17 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isPrivate() */ + @Override public boolean isPrivate() { return false; } + @Override public boolean isProtected() { return false; } + @Override public boolean isPublic() { return false; } @@ -124,6 +132,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isFinal() */ + @Override public boolean isFinal() { return false; } @@ -131,6 +140,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isBridge() */ + @Override public boolean isBridge() { return false; } @@ -138,6 +148,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isAbstract() */ + @Override public boolean isSynchronized() { return false; } @@ -145,6 +156,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isSynthetic() */ + @Override public boolean isSynthetic() { return true; } @@ -152,6 +164,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#getReference() */ + @Override public MethodReference getReference() { return method; } @@ -189,6 +202,7 @@ public class SyntheticMethod implements IMethod { throw new UnsupportedOperationException(); } + @Override public IClass getDeclaringClass() { return declaringClass; } @@ -234,6 +248,7 @@ public class SyntheticMethod implements IMethod { return true; } + @Override public boolean hasExceptionHandler() { return false; } @@ -273,6 +288,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getParameterType(int) */ + @Override public TypeReference getParameterType(int i) { if (isStatic()) { return method.getParameterType(i); @@ -289,6 +305,7 @@ public class SyntheticMethod implements IMethod { * * @see com.ibm.wala.classLoader.IMethod#getNumberOfParameters() */ + @Override public int getNumberOfParameters() { int n = method.getNumberOfParameters(); return isStatic() ? n : n + 1; @@ -297,6 +314,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getDeclaredExceptions() */ + @Override public TypeReference[] getDeclaredExceptions() throws InvalidClassFileException { if (resolvedMethod == null) { return null; @@ -305,10 +323,12 @@ public class SyntheticMethod implements IMethod { } } + @Override public Atom getName() { return method.getSelector().getName(); } + @Override public Descriptor getDescriptor() { return method.getSelector().getDescriptor(); } @@ -316,6 +336,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getLineNumber(int) */ + @Override public int getLineNumber(int bcIndex) { return -1; } @@ -327,6 +348,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getSignature() */ + @Override public String getSignature() { return getReference().getSignature(); } @@ -334,6 +356,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getSelector() */ + @Override public Selector getSelector() { return getReference().getSelector(); } @@ -341,6 +364,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getLocalVariableName(int, int) */ + @Override public String getLocalVariableName(int bcIndex, int localNumber) { // no information is available return null; @@ -349,6 +373,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#hasLocalVariableTable() */ + @Override public boolean hasLocalVariableTable() { return false; } @@ -360,14 +385,17 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getReturnType() */ + @Override public TypeReference getReturnType() { return getReference().getReturnType(); } + @Override public IClassHierarchy getClassHierarchy() { return getDeclaringClass().getClassHierarchy(); } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java index d4d848d8d..6005d94ee 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java @@ -121,6 +121,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { private HeapGraph heapGraph; private EntrypointBuilder entrypointBuilder = new EntrypointBuilder() { + @Override public Iterable createEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return makeDefaultEntrypoints(scope, cha); } @@ -141,6 +142,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { return builder; } + @Override public void setModuleFiles(Collection moduleFiles) { this.moduleFiles = moduleFiles; } @@ -218,6 +220,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { } } + @Override public void setJ2SELibraries(JarFile[] libs) { if (libs == null) { throw new IllegalArgumentException("libs is null"); @@ -228,6 +231,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { } } + @Override public void setJ2SELibraries(Module[] libs) { if (libs == null) { throw new IllegalArgumentException("libs is null"); @@ -238,6 +242,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { } } + @Override public void setClosedWorld(boolean b) { this.closedWorld = b; } @@ -269,6 +274,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { this.exclusionsFile = exclusionsFile; } + @Override public AnalysisOptions getDefaultOptions(Iterable entrypoints) { return new AnalysisOptions(getScope(), entrypoints); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java index b245ed7e7..133bb5a7c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java +++ b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java @@ -36,6 +36,7 @@ public abstract class AbstractEngineStopwatch implements EngineStopwatch { } } + @Override public final String report() { StringBuffer result = new StringBuffer(); long total = 0; @@ -50,6 +51,7 @@ public abstract class AbstractEngineStopwatch implements EngineStopwatch { /** * */ + @Override public void start(byte category) { stopwatch[category].start(); } @@ -57,10 +59,12 @@ public abstract class AbstractEngineStopwatch implements EngineStopwatch { /** * */ + @Override public void stop(byte category) { stopwatch[category].stop(); } + @Override public StopwatchGC getTimer(byte category) { return stopwatch[category]; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java index 010774a66..231e06271 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java @@ -60,6 +60,7 @@ public class BackwardsSupergraph implements ISupergraph { * * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getProcedureGraph() */ + @Override public Graph getProcedureGraph() { return delegate.getProcedureGraph(); } @@ -67,6 +68,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isCall(java.lang.Object) */ + @Override public boolean isCall(T n) { return delegate.isReturn(n); } @@ -78,6 +80,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.Filter#accepts(java.lang.Object) */ + @Override @SuppressWarnings("unchecked") public boolean accepts(Object o) { return delegate.isExit((T) o); @@ -89,6 +92,7 @@ public class BackwardsSupergraph implements ISupergraph { * * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCalledNodes(java.lang.Object) */ + @Override public Iterator getCalledNodes(T ret) { if (DEBUG_LEVEL > 1) { System.err.println(getClass() + " getCalledNodes " + ret); @@ -103,9 +107,11 @@ public class BackwardsSupergraph implements ISupergraph { * * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCalledNodes(java.lang.Object) */ + @Override public Iterator getNormalSuccessors(final T ret) { Iterator allPreds = delegate.getPredNodes(ret); Filter sameProc = new Filter() { + @Override public boolean accepts(T o) { // throw out the exit node, which can be a predecessor due to tail recursion. return getProcOf(ret).equals(getProcOf(o)) && !delegate.isExit(o); @@ -113,6 +119,7 @@ public class BackwardsSupergraph implements ISupergraph { }; Iterator sameProcPreds = new FilterIterator(allPreds, sameProc); Filter notCall = new Filter() { + @Override public boolean accepts(T o) { return !delegate.isCall(o); } @@ -123,6 +130,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getReturnSites(java.lang.Object) */ + @Override public Iterator getReturnSites(T c, P callee) { return delegate.getCallSites(c, callee); } @@ -130,6 +138,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isExit(java.lang.Object) */ + @Override public boolean isExit(T n) { return delegate.isEntry(n); } @@ -137,6 +146,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getProcOf(java.lang.Object) */ + @Override public P getProcOf(T n) { return delegate.getProcOf(n); } @@ -144,11 +154,13 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.Graph#removeNodeAndEdges(java.lang.Object) */ + @Override public void removeNodeAndEdges(Object N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Iterator iterator() { return delegate.iterator(); } @@ -156,6 +168,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } @@ -163,6 +176,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(java.lang.Object) */ + @Override public void addNode(Object n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -170,6 +184,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#removeNode(java.lang.Object) */ + @Override public void removeNode(Object n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -178,6 +193,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(java.lang.Object) */ + @Override public boolean containsNode(T N) { return delegate.containsNode(N); } @@ -185,6 +201,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(java.lang.Object) */ + @Override public Iterator getPredNodes(T N) { return delegate.getSuccNodes(N); } @@ -192,6 +209,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(java.lang.Object) */ + @Override public int getPredNodeCount(T N) { return delegate.getSuccNodeCount(N); } @@ -199,10 +217,12 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(java.lang.Object) */ + @Override public Iterator getSuccNodes(T N) { return delegate.getPredNodes(N); } + @Override public boolean hasEdge(T src, T dst) { return delegate.hasEdge(dst, src); } @@ -210,6 +230,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(java.lang.Object) */ + @Override public int getSuccNodeCount(T N) { return delegate.getPredNodeCount(N); } @@ -217,10 +238,12 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(java.lang.Object, java.lang.Object) */ + @Override public void addEdge(Object src, Object dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(Object src, Object dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -228,6 +251,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(Object node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -235,6 +259,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getEntriesForProcedure(java.lang.Object) */ + @Override public T[] getEntriesForProcedure(P object) { return delegate.getExitsForProcedure(object); } @@ -242,6 +267,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getEntriesForProcedure(java.lang.Object) */ + @Override public T[] getExitsForProcedure(P object) { return delegate.getEntriesForProcedure(object); } @@ -249,6 +275,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isReturn(java.lang.Object) */ + @Override public boolean isReturn(T n) throws UnimplementedError { return delegate.isCall(n); } @@ -256,6 +283,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCallSites(java.lang.Object) */ + @Override public Iterator getCallSites(T r, P callee) { return delegate.getReturnSites(r, callee); } @@ -263,6 +291,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isEntry(java.lang.Object) */ + @Override public boolean isEntry(T n) { return delegate.isExit(n); } @@ -270,6 +299,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#classifyEdge(java.lang.Object, java.lang.Object) */ + @Override public byte classifyEdge(T src, T dest) { byte d = delegate.classifyEdge(dest, src); switch (d) { @@ -292,11 +322,13 @@ public class BackwardsSupergraph implements ISupergraph { return "Backwards of delegate\n" + delegate; } + @Override public void removeIncomingEdges(Object node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(T node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -304,6 +336,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getNumberOfBlocks(java.lang.Object) */ + @Override public int getNumberOfBlocks(P procedure) { return delegate.getNumberOfBlocks(procedure); } @@ -311,6 +344,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlockNumber(java.lang.Object) */ + @Override public int getLocalBlockNumber(T n) { return delegate.getLocalBlockNumber(n); } @@ -318,31 +352,38 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlock(java.lang.Object, int) */ + @Override public T getLocalBlock(P procedure, int i) { return delegate.getLocalBlock(procedure, i); } + @Override public int getNumber(T N) { return delegate.getNumber(N); } + @Override public T getNode(int number) { return delegate.getNode(number); } + @Override public int getMaxNumber() { return delegate.getMaxNumber(); } + @Override public Iterator iterateNodes(IntSet s) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getSuccNodeNumbers(T node) { return delegate.getPredNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java index 83806fe66..72e24408f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java @@ -59,6 +59,7 @@ public class ICFGSupergraph implements ISupergraph getProcedureGraph() { return icfg.getCallGraph(); } @@ -79,6 +80,7 @@ public class ICFGSupergraph implements ISupergraph src, BasicBlockInContext dest) { if (isCall(src)) { if (isEntry(dest)) { @@ -97,12 +99,15 @@ public class ICFGSupergraph implements ISupergraph> getCallSites(BasicBlockInContext r, CGNode callee) { return icfg.getCallSites(r, callee); } + @Override public Iterator> getCalledNodes(BasicBlockInContext call) { final Filter> isEntryFilter = new Filter>() { + @Override public boolean accepts(BasicBlockInContext o) { return o.isEntryBlock(); } @@ -110,21 +115,25 @@ public class ICFGSupergraph implements ISupergraph>(getSuccNodes(call), isEntryFilter); } + @Override @SuppressWarnings("unchecked") public BasicBlockInContext[] getEntriesForProcedure(CGNode procedure) { return new BasicBlockInContext[] { icfg.getEntry(procedure) }; } + @Override @SuppressWarnings("unchecked") public BasicBlockInContext[] getExitsForProcedure(CGNode procedure) { return new BasicBlockInContext[] { icfg.getExit(procedure) }; } + @Override public BasicBlockInContext getLocalBlock(CGNode procedure, int i) { IExplodedBasicBlock b = icfg.getCFG(procedure).getNode(i); return new BasicBlockInContext(procedure, b); } + @Override public int getLocalBlockNumber(BasicBlockInContext n) { return n.getDelegate().getNumber(); } @@ -135,135 +144,165 @@ public class ICFGSupergraph implements ISupergraph> getNormalSuccessors(BasicBlockInContext call) { return EmptyIterator.instance(); } + @Override public int getNumberOfBlocks(CGNode procedure) { Assertions.UNREACHABLE(); return 0; } + @Override public CGNode getProcOf(BasicBlockInContext n) { return icfg.getCGNode(n); } + @Override public Iterator> getReturnSites(BasicBlockInContext call, CGNode callee) { return icfg.getReturnSites(call); } + @Override public boolean isCall(BasicBlockInContext n) { return n.getDelegate().getInstruction() instanceof SSAAbstractInvokeInstruction; } + @Override public boolean isEntry(BasicBlockInContext n) { return n.getDelegate().isEntryBlock(); } + @Override public boolean isExit(BasicBlockInContext n) { return n.getDelegate().isExitBlock(); } + @Override public boolean isReturn(BasicBlockInContext n) { return icfg.isReturn(n); } + @Override public void removeNodeAndEdges(BasicBlockInContext N) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void addNode(BasicBlockInContext n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(BasicBlockInContext N) { return icfg.containsNode(N); } + @Override public int getNumberOfNodes() { return icfg.getNumberOfNodes(); } + @Override public Iterator> iterator() { return icfg.iterator(); } + @Override public void removeNode(BasicBlockInContext n) { Assertions.UNREACHABLE(); } + @Override public void addEdge(BasicBlockInContext src, BasicBlockInContext dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(BasicBlockInContext N) { return icfg.getPredNodeCount(N); } + @Override public Iterator> getPredNodes(BasicBlockInContext N) { return icfg.getPredNodes(N); } + @Override public int getSuccNodeCount(BasicBlockInContext N) { return icfg.getSuccNodeCount(N); } + @Override public Iterator> getSuccNodes(BasicBlockInContext N) { return icfg.getSuccNodes(N); } + @Override public boolean hasEdge(BasicBlockInContext src, BasicBlockInContext dst) { return icfg.hasEdge(src, dst); } + @Override public void removeAllIncidentEdges(BasicBlockInContext node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeEdge(BasicBlockInContext src, BasicBlockInContext dst) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(BasicBlockInContext node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(BasicBlockInContext node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public int getMaxNumber() { return icfg.getMaxNumber(); } + @Override public BasicBlockInContext getNode(int number) { return icfg.getNode(number); } + @Override public int getNumber(BasicBlockInContext N) { return icfg.getNumber(N); } + @Override public Iterator> iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(BasicBlockInContext node) { return icfg.getPredNodeNumbers(node); } + @Override public IntSet getSuccNodeNumbers(BasicBlockInContext node) { return icfg.getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java index 24639e6eb..5d8bb6cfd 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java @@ -19,10 +19,12 @@ public class IdentityFlowFunction implements IReversibleFlowFunction { private final static IdentityFlowFunction singleton = new IdentityFlowFunction(); + @Override public SparseIntSet getTargets(int i) { return SparseIntSet.singleton(i); } + @Override public SparseIntSet getSources(int i) { return SparseIntSet.singleton(i); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java index 902ead9d4..df6856827 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java @@ -28,6 +28,7 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getNormalFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getNormalFlowFunction(T src, T dest) { return IdentityFlowFunction.identity(); } @@ -35,6 +36,7 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getReturnFlowFunction(java.lang.Object, java.lang.Object, java.lang.Object) */ + @Override public IFlowFunction getReturnFlowFunction(T call, T src, T dest) { return IdentityFlowFunction.identity(); } @@ -49,6 +51,7 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getCallToReturnFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getCallToReturnFlowFunction(T src, T dest) { return IdentityFlowFunction.identity(); } @@ -56,10 +59,12 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getCallNoneToReturnFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(T src, T dest) { return IdentityFlowFunction.identity(); } + @Override public IUnaryFlowFunction getCallFlowFunction(T src, T dest, T ret) { return IdentityFlowFunction.identity(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java index 766f89a88..d4087f109 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java @@ -29,6 +29,7 @@ public class KillEverything implements IUnaryFlowFunction { private KillEverything() { } + @Override public SparseIntSet getTargets(int d1) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java index 339c56092..0a0ddcc43 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java @@ -20,6 +20,7 @@ package com.ibm.wala.dataflow.IFDS; */ public interface PartiallyBalancedTabulationProblem extends TabulationProblem { + @Override public IPartiallyBalancedFlowFunctions getFunctionMap(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java index 836d61637..0a602b2bf 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java @@ -25,6 +25,7 @@ public class SingletonFlowFunction implements IReversibleFlowFunction { this.dest = dest; } + @Override public SparseIntSet getTargets(int i) { if (i == 0) { return SparseIntSet.add(zeroSet,dest); @@ -33,6 +34,7 @@ public class SingletonFlowFunction implements IReversibleFlowFunction { } } + @Override public SparseIntSet getSources(int i) { if (i == dest || i == 0) { return zeroSet; diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java index 6c600b6a5..2128af135 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java @@ -342,6 +342,7 @@ public class TabulationSolver { } if (D3 != null) { D3.foreach(new IntSetAction() { + @Override public void act(int d3) { propagate(edge.entry, edge.d1, m, d3); } @@ -432,6 +433,7 @@ public class TabulationSolver { System.err.println("D5 " + D5); } IntSetAction action = new IntSetAction() { + @Override public void act(final int d4) { propToReturnSite(c, entries, retSite, d4, D5); } @@ -456,6 +458,7 @@ public class TabulationSolver { private void propagateToReturnSiteWithBinaryFlowFunction(final PathEdge edge, final T c, final IntSet D4, final T[] entries, final T retSite, final IFlowFunction retf) { D4.foreach(new IntSetAction() { + @Override public void act(final int d4) { final IntSet D5 = computeBinaryFlow(d4, edge.d2, (IBinaryReturnFlowFunction) retf); propToReturnSite(c, entries, retSite, d4, D5); @@ -477,6 +480,7 @@ public class TabulationSolver { private void propToReturnSite(final T c, final T[] entries, final T retSite, final int d4, final IntSet D5) { if (D5 != null) { D5.foreach(new IntSetAction() { + @Override public void act(final int d5) { // [26 - 28] // note that we've modified the algorithm here to account @@ -497,6 +501,7 @@ public class TabulationSolver { } if (D3 != null) { D3.foreach(new IntSetAction() { + @Override public void act(int d3) { // set curPathEdge to be consistent with its setting in processCall() when applying a summary edge curPathEdge = PathEdge.createPathEdge(s_p, d3, c, d4); @@ -562,6 +567,7 @@ public class TabulationSolver { } if (D3 != null) { D3.foreach(new IntSetAction() { + @Override public void act(int d3) { propagate(edge.entry, edge.d1, m, d3); } @@ -587,6 +593,7 @@ public class TabulationSolver { } if (reached != null) { reached.foreach(new IntSetAction() { + @Override public void act(int x) { assert x >= 0; assert edge.d1 >= 0; @@ -639,6 +646,7 @@ public class TabulationSolver { final int s_p_num = supergraph.getLocalBlockNumber(calleeEntry); reached.foreach(new IntSetAction() { + @Override public void act(final int d1) { // we get reuse if we _don't_ propagate a new fact to the callee entry final boolean gotReuse = !propagate(calleeEntry, d1, calleeEntry, d1); @@ -668,6 +676,7 @@ public class TabulationSolver { if (supergraph.hasEdge(exit, returnSite)) { final IFlowFunction retf = flowFunctionMap.getReturnFlowFunction(edge.target, exit, returnSite); reachedBySummary.foreach(new IntSetAction() { + @Override public void act(int d2) { assert curSummaryEdge == null : "curSummaryEdge should be null here"; curSummaryEdge = PathEdge.createPathEdge(calleeEntry, d1, exit, d2); @@ -675,6 +684,7 @@ public class TabulationSolver { final IntSet D5 = computeBinaryFlow(edge.d2, d2, (IBinaryReturnFlowFunction) retf); if (D5 != null) { D5.foreach(new IntSetAction() { + @Override public void act(int d5) { propagate(edge.entry, edge.d1, returnSite, d5); } @@ -684,6 +694,7 @@ public class TabulationSolver { final IntSet D5 = computeFlow(d2, (IUnaryFlowFunction) retf); if (D5 != null) { D5.foreach(new IntSetAction() { + @Override public void act(int d5) { propagate(edge.entry, edge.d1, returnSite, d5); } @@ -906,6 +917,7 @@ public class TabulationSolver { * * @return IntSet representing the bitvector */ + @Override public IntSet getResult(T node) { return TabulationSolver.this.getResult(node); } @@ -917,6 +929,7 @@ public class TabulationSolver { TreeMap> map = new TreeMap>(ToStringComparator.instance()); Comparator c = new Comparator() { + @Override public int compare(Object o1, Object o2) { if (!(o1 instanceof IBasicBlock)) { return -1; @@ -951,6 +964,7 @@ public class TabulationSolver { /* * @see com.ibm.wala.dataflow.IFDS.TabulationResult#getProblem() */ + @Override public TabulationProblem getProblem() { return problem; } @@ -958,6 +972,7 @@ public class TabulationSolver { /* * @see com.ibm.wala.dataflow.IFDS.TabulationResult#getSupergraphNodesReached() */ + @Override public Collection getSupergraphNodesReached() { Collection result = HashSetFactory.make(); for (Entry e : pathEdges.entrySet()) { @@ -978,6 +993,7 @@ public class TabulationSolver { * @param n2 * @return set of d2 s.t. (n1,d1) -> (n2,d2) is recorded as a summary edge, or null if none found */ + @Override public IntSet getSummaryTargets(T n1, int d1, T n2) { LocalSummaryEdges summaries = summaryEdges.get(supergraph.getProcOf(n1)); if (summaries == null) { @@ -988,6 +1004,7 @@ public class TabulationSolver { return summaries.getSummaryEdges(num1, num2, d1); } + @Override public Collection> getSeeds() { return TabulationSolver.this.getSeeds(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java index 310e8dd16..f52eac1ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java @@ -20,6 +20,7 @@ public class UnorderedDomain extends MutableMapping implements Tabulati /* * @see com.ibm.wala.dataflow.IFDS.TabulationDomain#isWeakerThan(int, int) */ + @Override public boolean hasPriorityOver(PathEdge p1, PathEdge p2) { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java index b3ecb23be..4335f702e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java @@ -30,10 +30,12 @@ public class VectorGenFlowFunction implements IReversibleFlowFunction { assert gen.contains(0); } + @Override public IntSet getTargets(int i) { return (i == 0) ? gen : gen.contains(i) ? null : SparseIntSet.singleton(i); } + @Override public IntSet getSources(int i) { return (gen.contains(i)) ? SparseIntSet.singleton(0) : SparseIntSet.singleton(i); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java index 7977ba86a..92204c7ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java @@ -30,10 +30,12 @@ public class VectorKillFlowFunction implements IReversibleFlowFunction { this.kill = kill; } + @Override public IntSet getTargets(int i) { return (kill.contains(i)) ? null : SparseIntSet.singleton(i); } + @Override public IntSet getSources(int i) { return (kill.contains(i)) ? null : SparseIntSet.singleton(i); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java index 752f155cb..ab31e4b69 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java @@ -84,6 +84,7 @@ public abstract class AbstractDemandPointsTo implements IDemandPointerAnalysis { this.options = options; } + @Override public HeapModel getHeapModel() { return heapModel; } @@ -106,10 +107,12 @@ public abstract class AbstractDemandPointsTo implements IDemandPointerAnalysis { return numNodesTraversed; } + @Override public CallGraph getBaseCallGraph() { return cg; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java index 200a93353..770414571 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java @@ -81,6 +81,7 @@ public class ContextSensitiveStateMachine implements StateMachine { */ private final CallStack emptyStack = CallStack.emptyCallStack(); + @Override public CallStack getStartState() { return emptyStack; } @@ -97,46 +98,57 @@ public class ContextSensitiveStateMachine implements StateMachine { this.prevStack = prevStack; } + @Override public void visitAssign(AssignLabel label, Object dst) { nextState = prevStack; } + @Override public void visitAssignBar(AssignBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitAssignGlobal(AssignGlobalLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitAssignGlobalBar(AssignGlobalBarLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitGetField(GetFieldLabel label, Object dst) { nextState = prevStack; } + @Override public void visitGetFieldBar(GetFieldBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitMatch(MatchLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitMatchBar(MatchBarLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitNew(NewLabel label, Object dst) { nextState = prevStack; } + @Override public void visitNewBar(NewBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitParam(ParamLabel label, Object dst) { handleMethodExit(label.getCallSite()); } @@ -153,6 +165,7 @@ public class ContextSensitiveStateMachine implements StateMachine { } } + @Override public void visitParamBar(ParamBarLabel label, Object dst) { // method entry handleMethodEntry(label.getCallSite()); @@ -188,18 +201,22 @@ public class ContextSensitiveStateMachine implements StateMachine { } } + @Override public void visitPutField(PutFieldLabel label, Object dst) { nextState = prevStack; } + @Override public void visitPutFieldBar(PutFieldBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitReturn(ReturnLabel label, Object dst) { handleMethodEntry(label.getCallSite()); } + @Override public void visitReturnBar(ReturnBarLabel label, Object dst) { handleMethodExit(label.getCallSite()); } @@ -209,6 +226,7 @@ public class ContextSensitiveStateMachine implements StateMachine { /* * @see com.ibm.wala.demandpa.alg.statemachine.StateMachine#transition(com.ibm.wala.demandpa.alg.statemachine.StateMachine.State, java.lang.Object) */ + @Override public State transition(State prevState, IFlowLabel label) throws IllegalArgumentException, IllegalArgumentException { if (prevState == null) { throw new IllegalArgumentException("prevState == null"); @@ -252,6 +270,7 @@ public class ContextSensitiveStateMachine implements StateMachine { this(new BasicRecursionHandler()); } + @Override public StateMachine make() { return new ContextSensitiveStateMachine(prototype.makeNew()); } @@ -278,14 +297,17 @@ public class ContextSensitiveStateMachine implements StateMachine { private final HashSet recursiveCallSites = HashSetFactory.make(); + @Override public boolean isRecursive(CallerSiteContext callSite) { return recursiveCallSites.contains(callSite); } + @Override public void makeRecursive(Collection callSites) { recursiveCallSites.addAll(callSites); } + @Override public RecursionHandler makeNew() { return new BasicRecursionHandler(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java index b4e868da1..aa79d68a6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java @@ -289,6 +289,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { Collection finalP2Set = Iterator2Collection.toSet(new MapIterator, T>(p2SetWithStates.iterator(), new Function, T>() { + @Override public T apply(WithState object) { return object.getWrapped(); } @@ -515,6 +516,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { * @return the points-to set of pk, or null if the points-to set can't be computed in the allocated * budget */ + @Override public Collection getPointsTo(PointerKey pk) { return getPointsTo(pk, Predicate. falsePred()).snd; } @@ -910,6 +912,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final MutableIntSet tmp = intSetFactory.make(); vals.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKeyAndState ikAndState = ikAndStates.getMappedObject(x); if (cha.isAssignableFrom(concreteType, ikAndState.getInstanceKey().getConcreteType())) { @@ -923,6 +926,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final MutableIntSet tmp = intSetFactory.make(); vals.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKeyAndState ikAndState = ikAndStates.getMappedObject(x); for (IClass t : ((MultipleClassesFilter) typeFilter).getConcreteTypes()) { @@ -939,6 +943,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final MutableIntSet tmp = intSetFactory.make(); vals.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKeyAndState ikAndState = ikAndStates.getMappedObject(x); if (ikAndState.getInstanceKey().equals(theOnlyInstanceKey)) { @@ -980,6 +985,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { State curState = curPkAndState.getState(); doTransition(curState, label, new Function() { + @Override public Object apply(State nextState) { PointerKeyAndState succPkAndState = new PointerKeyAndState(succPk, nextState); handleCopy(curPkAndState, succPkAndState, label); @@ -1149,6 +1155,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey ret = heapModel.getPointerKeyForReturnValue(targetForCall); doTransition(receiverState, returnLabel, new Function() { + @Override public Object apply(State retState) { repropCallArg(defAndState, new PointerKeyAndState(ret, retState), returnLabel.bar()); return null; @@ -1161,6 +1168,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey excRet = heapModel.getPointerKeyForExceptionalReturnValue(targetForCall); doTransition(receiverState, returnLabel, new Function() { + @Override public Object apply(State excRetState) { repropCallArg(exc, new PointerKeyAndState(excRet, excRetState), returnLabel.bar()); return null; @@ -1173,6 +1181,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final ParamBarLabel paramBarLabel = ParamBarLabel.make(new CallerSiteContext(caller, call)); doTransition(receiverState, paramBarLabel, new Function() { + @Override public Object apply(State formalState) { repropCallArg( new PointerKeyAndState(heapModel.getPointerKeyForLocal(targetForCall, formalNum), formalState), @@ -1243,6 +1252,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } doTransition(curState, label, new Function() { + @Override public Object apply(State newState) { InstanceKeyAndState ikAndState = new InstanceKeyAndState(ik, newState); int n = ikAndStates.add(ikAndState); @@ -1339,6 +1349,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } } + @Override public Object apply(State callerState) { // hack to get some actual parameter from call site // TODO do this better @@ -1627,6 +1638,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } } + @Override public Object apply(State callerState) { // if (DEBUG) { // System.err.println("caller " + caller); @@ -1765,6 +1777,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey predPk = (PointerKey) readIter.next(); doTransition(curState, AssignGlobalBarLabel.v(), new Function() { + @Override public Object apply(State predPkState) { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, AssignGlobalBarLabel.v()); @@ -1796,6 +1809,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey predPk = readIter.next(); doTransition(curState, MatchBarLabel.v(), new Function() { + @Override public Object apply(State predPkState) { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, MatchBarLabel.v()); @@ -1834,6 +1848,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey predPk = (PointerKey) dst; doTransition(curState, label.bar(), new Function() { + @Override public Object apply(State predPkState) { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, label.bar()); @@ -1851,6 +1866,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { void handle(PointerKeyAndState src, final PointerKey dst, final IFlowLabel label) { assert src == curPkAndState; doTransition(curState, label, new Function() { + @Override public Object apply(State dstState) { PointerKeyAndState dstAndState = new PointerKeyAndState(dst, dstState); handleTrackedPred(trackedSet, dstAndState, label); @@ -2112,6 +2128,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { assert g.containsNode(actualPk); assert g.containsNode(localPk); doTransition(curState, paramLabel, new Function() { + @Override public Object apply(State nextState) { propagate(new PointerKeyAndState(actualPk, nextState)); return null; @@ -2121,6 +2138,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } } + @Override public Object apply(State callerState) { // hack to get some actual parameter from call site // TODO do this better @@ -2164,6 +2182,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { assert g.containsNode(retVal); doTransition(curState, ReturnLabel.make(callSiteAndCGNode), new Function() { + @Override public Object apply(State nextState) { propagate(new PointerKeyAndState(retVal, nextState)); return null; @@ -2185,6 +2204,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { assert g.containsNode(retVal); doTransition(curState, ReturnLabel.make(callSiteAndCGNode), new Function() { + @Override public Object apply(State nextState) { propagate(new PointerKeyAndState(retVal, nextState)); return null; @@ -2287,6 +2307,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } doTransition(curState, label, new Function() { + @Override public Object apply(State newState) { // just check if ik violates the pred if (!pred.test(ik)) { @@ -2341,6 +2362,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey writtenPk = writesToInstanceField.next(); doTransition(curState, MatchLabel.v(), new Function() { + @Override public Object apply(State nextState) { h.propagate(new PointerKeyAndState(writtenPk, nextState)); return null; @@ -2398,6 +2420,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey writtenPk = (PointerKey) writesToStaticField.next(); doTransition(curState, label, new Function() { + @Override public Object apply(State nextState) { h.propagate(new PointerKeyAndState(writtenPk, nextState)); return null; @@ -2413,6 +2436,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey succPk = (PointerKey) dst; doTransition(curState, label, new Function() { + @Override public Object apply(State nextState) { h.propagate(new PointerKeyAndState(succPk, nextState)); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java index b242de4d6..2ffd80b75 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java @@ -58,6 +58,7 @@ public class IntraProcFilter implements StateMachine { private static final State DUMMY = new State() { }; + @Override public State getStartState() { return DUMMY; } @@ -87,6 +88,7 @@ public class IntraProcFilter implements StateMachine { } + @Override public State transition(State prevState, IFlowLabel label) throws IllegalArgumentException { if (label == null) { throw new IllegalArgumentException("label == null"); @@ -102,6 +104,7 @@ public class IntraProcFilter implements StateMachine { public static class Factory implements StateMachineFactory { + @Override public StateMachine make() { return new IntraProcFilter(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java index 6d245a4a3..12eddfb51 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java @@ -69,6 +69,7 @@ public class SimpleDemandPointsTo extends AbstractDemandPointsTo { super(cg, model, fam, cha, options); } + @Override @SuppressWarnings("unchecked") public Collection getPointsTo(PointerKey pk) throws IllegalArgumentException, UnimplementedError { diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java index 3a47adc05..673d2d377 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java @@ -42,46 +42,57 @@ class ThisFilteringHeapModel implements HeapModel { private final IClassHierarchy cha; + @Override public IClassHierarchy getClassHierarchy() { return delegate.getClassHierarchy(); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, TypeFilter filter) { return delegate.getFilteredPointerKeyForLocal(node, valueNumber, filter); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return delegate.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return delegate.getInstanceKeyForClassObject(type); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return delegate.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return delegate.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return delegate.getInstanceKeyForPEI(node, instr, type); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return delegate.getPointerKeyForArrayContents(I); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return delegate.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { return delegate.getPointerKeyForInstanceField(I, field); } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { if (!node.getMethod().isStatic() && valueNumber == 1) { return delegate.getFilteredPointerKeyForLocal(node, valueNumber, getFilter(node)); @@ -119,14 +130,17 @@ class ThisFilteringHeapModel implements HeapModel { return C; } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return delegate.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return delegate.getPointerKeyForStaticField(f); } + @Override public Iterator iteratePointerKeys() { return delegate.iteratePointerKeys(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java index 2d69ee655..36936b043 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java @@ -55,22 +55,27 @@ public abstract class AbstractRefinementPolicy implements RefinementPolicy { this(fieldRefinePolicy, cgRefinePolicy, DEFAULT_NUM_PASSES, DEFAULT_BUDGET_PER_PASS); } + @Override public int getBudgetForPass(int passNum) { return budgetPerPass[passNum]; } + @Override public CallGraphRefinePolicy getCallGraphRefinePolicy() { return cgRefinePolicy; } + @Override public FieldRefinePolicy getFieldRefinePolicy() { return fieldRefinePolicy; } + @Override public int getNumPasses() { return numPasses; } + @Override public boolean nextPass() { // don't short-circuit since nextPass() can have side-effects boolean fieldNextPass = fieldRefinePolicy.nextPass(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java index 05faaa6c0..580dd66f8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java @@ -44,10 +44,12 @@ import com.ibm.wala.ipa.callgraph.propagation.cfa.CallerSiteContext; */ public class AlwaysRefineCGPolicy implements CallGraphRefinePolicy { + @Override public boolean shouldRefine(CallerSiteContext callSiteAndCGNode) { return true; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java index 43efd3747..5acf41006 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java @@ -52,10 +52,12 @@ import com.ibm.wala.ipa.callgraph.propagation.PointerKey; */ public class AlwaysRefineFieldsPolicy implements FieldRefinePolicy { + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { return true; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java index db88c03a4..42be600ed 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java @@ -35,6 +35,7 @@ public class DelegatingFieldRefinePolicy implements FieldRefinePolicy { B = b; } + @Override public boolean nextPass() { // careful not to short-circuit here, since nextPass() can have side-effects boolean AnextPass = A.nextPass(); @@ -48,6 +49,7 @@ public class DelegatingFieldRefinePolicy implements FieldRefinePolicy { * if A.shouldRefine(field) is true, * B.shouldRefine(field) is not called. */ + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { // make code explicit to avoid subtle reliance on short-circuiting boolean AshouldRefine = A.shouldRefine(field, basePtr, val, label, state); diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java index bb6e79014..4ace6d1d6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java @@ -47,6 +47,7 @@ import com.ibm.wala.types.MethodReference; */ public class ManualCGRefinePolicy implements CallGraphRefinePolicy { + @Override public boolean shouldRefine(CallerSiteContext callSiteAndCGNode) throws IllegalArgumentException { if (callSiteAndCGNode == null) { throw new IllegalArgumentException("callSiteAndCGNode == null"); @@ -58,6 +59,7 @@ public class ManualCGRefinePolicy implements CallGraphRefinePolicy { return true; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java index 63f7aeb14..e72b8bf84 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java @@ -67,6 +67,7 @@ public class ManualFieldPolicy implements FieldRefinePolicy { final private IClass[] encounteredClasses = new IClass[NUM_DECISIONS_TO_TRACK]; + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { if (field == null) { throw new IllegalArgumentException("null field"); @@ -132,6 +133,7 @@ public class ManualFieldPolicy implements FieldRefinePolicy { this.refinePattern = refinePattern; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java index 970b00a04..cba42952d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java @@ -58,6 +58,7 @@ public class ManualRefinementPolicy extends AbstractRefinementPolicy { this.cha = cha; } + @Override public RefinementPolicy make() { return new ManualRefinementPolicy(cha); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java index 6dd2909a4..a254796c2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java @@ -41,10 +41,12 @@ import com.ibm.wala.ipa.callgraph.propagation.cfa.CallerSiteContext; public class NeverRefineCGPolicy implements CallGraphRefinePolicy { + @Override public boolean shouldRefine(CallerSiteContext callSiteAndCGNode) { return false; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java index 59fadf137..0604e9b7c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java @@ -44,10 +44,12 @@ import com.ibm.wala.ipa.callgraph.propagation.PointerKey; public class NeverRefineFieldsPolicy implements FieldRefinePolicy { + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { return false; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java index 04f4fc7ee..7ddc7b467 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java @@ -73,6 +73,7 @@ public class SinglePassRefinementPolicy extends AbstractRefinementPolicy { } + @Override public RefinementPolicy make() { return new SinglePassRefinementPolicy(fieldRefinePolicy, cgRefinePolicy, budget); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java index 58119d9ef..fb03684aa 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java @@ -33,6 +33,7 @@ public class TunedFieldRefinementPolicy implements FieldRefinePolicy { private IClass firstSkippedClass = null; + @Override public boolean nextPass() { if (firstSkippedClass != null) { typesToRefine.add(firstSkippedClass); @@ -46,6 +47,7 @@ public class TunedFieldRefinementPolicy implements FieldRefinePolicy { } } + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { if (field == null) { throw new IllegalArgumentException("null field"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java index d40b4e39a..ec1dd4c0b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java @@ -60,6 +60,7 @@ public class TunedRefinementPolicy extends AbstractRefinementPolicy { this.cha = cha; } + @Override public RefinementPolicy make() { return new TunedRefinementPolicy(cha); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java index 15d776027..f268bfc7e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java @@ -48,6 +48,7 @@ public class DummyStateMachine implements StateMachine { public static class Factory implements StateMachineFactory { + @Override public StateMachine make() { return new DummyStateMachine(); } @@ -66,10 +67,12 @@ public class DummyStateMachine implements StateMachine { * * @see statemachine.StateMachine#transition(int, java.lang.Object) */ + @Override public State transition(State prevState, T label) { return DUMMY; } + @Override public State getStartState() { return DUMMY; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java index d39d2465d..a5416d4d7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java @@ -88,6 +88,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { /* * @see com.ibm.wala.demandpa.flowgraph.IFlowGraph#addSubgraphForNode(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public void addSubgraphForNode(CGNode node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node == null"); @@ -108,6 +109,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { /* * @see com.ibm.wala.demandpa.flowgraph.IFlowGraph#hasSubgraphForNode(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean hasSubgraphForNode(CGNode node) { return cgNodesVisited.contains(cg.getNumber(node)); } @@ -352,6 +354,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { final Map> callerCache = HashMapFactory.make(); + @Override public Set getPotentialCallers(PointerKey formalPk) { CGNode callee = null; if (formalPk instanceof LocalPointerKey) { @@ -376,6 +379,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { return ret; } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site, LocalPointerKey actualPk) { return cg.getPossibleTargets(node, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java index 84c081578..d37bd23f0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java @@ -96,14 +96,17 @@ import com.ibm.wala.util.graph.labeled.SlowSparseNumberedLabeledGraph; public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph implements IFlowGraph { private final static IFlowLabel defaultLabel = new IFlowLabel() { + @Override public IFlowLabel bar() { return defaultLabel; } + @Override public boolean isBarred() { return false; } + @Override public void visit(IFlowLabelVisitor v, Object dst) { } @@ -153,6 +156,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph succLabelIter = getSuccLabels(node); succLabelIter.hasNext();) { final IFlowLabel label = succLabelIter.next(); @@ -166,6 +170,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph predLabelIter = getPredLabels(node); predLabelIter.hasNext();) { final IFlowLabel label = predLabelIter.next(); @@ -210,10 +215,12 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getInstrsPassingParam(LocalPointerKey pk) { Set instrs = callParams.get(pk); if (instrs == null) { @@ -223,10 +230,12 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getWritesToStaticField(StaticFieldKey sfk) throws IllegalArgumentException { if (sfk == null) { throw new IllegalArgumentException("sfk == null"); @@ -238,6 +247,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getReadsOfStaticField(StaticFieldKey sfk) throws IllegalArgumentException { if (sfk == null) { throw new IllegalArgumentException("sfk == null"); @@ -249,6 +259,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getWritesToInstanceField(PointerKey pk, IField f) { // TODO: cache this!! if (f == ArrayContents.v()) { @@ -309,6 +320,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getReadsOfInstanceField(PointerKey pk, IField f) { // TODO: cache this!! if (f == ArrayContents.v()) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java index 2bf727da7..0f3fccdea 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java @@ -48,65 +48,81 @@ import com.ibm.wala.demandpa.flowgraph.IFlowLabel.IFlowLabelVisitor; */ public class AbstractFlowLabelVisitor implements IFlowLabelVisitor { + @Override public void visitParam(ParamLabel label, Object dst) { } + @Override public void visitReturn(ReturnLabel label, Object dst) { } + @Override public void visitAssign(AssignLabel label, Object dst) { } + @Override public void visitAssignGlobal(AssignGlobalLabel label, Object dst) { } + @Override public void visitGetField(GetFieldLabel label, Object dst) { } + @Override public void visitMatch(MatchLabel label, Object dst) { } + @Override public void visitNew(NewLabel label, Object dst) { } + @Override public void visitPutField(PutFieldLabel label, Object dst) { } + @Override public void visitAssignGlobalBar(AssignGlobalBarLabel label, Object dst) { } + @Override public void visitAssignBar(AssignBarLabel label, Object dst) { } + @Override public void visitGetFieldBar(GetFieldBarLabel label, Object dst) { } + @Override public void visitMatchBar(MatchBarLabel label, Object dst) { } + @Override public void visitNewBar(NewBarLabel label, Object dst) { } + @Override public void visitPutFieldBar(PutFieldBarLabel label, Object dst) { } + @Override public void visitReturnBar(ReturnBarLabel label, Object dst) { } + @Override public void visitParamBar(ParamBarLabel label, Object dst) { } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java index 60de67fd3..dc0a1acc0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java @@ -65,6 +65,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { * (non-Javadoc) * @see demandGraph.IFlowLabel#bar() */ + @Override public AssignLabel bar() { return (this == noFilter) ? AssignLabel.noFilter() : AssignLabel.make(filter); } @@ -73,6 +74,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { * (non-Javadoc) * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -80,6 +82,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { v.visitAssignBar(this, dst); } + @Override public boolean isBarred() { return true; } @@ -109,6 +112,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { return true; } + @Override public TypeFilter getFilter() { return filter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java index 3baaa6005..b5894878e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java @@ -57,6 +57,7 @@ public class AssignGlobalBarLabel implements IFlowLabel { * * @see demandGraph.IFlowLabel#bar() */ + @Override public AssignGlobalLabel bar() { return AssignGlobalLabel.v(); } @@ -67,6 +68,7 @@ public class AssignGlobalBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -74,6 +76,7 @@ public class AssignGlobalBarLabel implements IFlowLabel { v.visitAssignGlobalBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java index 942971535..f96df15e7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java @@ -47,6 +47,7 @@ public class AssignGlobalLabel implements IFlowLabel { return theInstance; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -54,10 +55,12 @@ public class AssignGlobalLabel implements IFlowLabel { v.visitAssignGlobal(this, dst); } + @Override public AssignGlobalBarLabel bar() { return AssignGlobalBarLabel.v(); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java index 9a8e12eff..4ab9d4db1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java @@ -82,6 +82,7 @@ public class AssignLabel implements IFlowLabelWithFilter { return new AssignLabel(filter); } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -89,6 +90,7 @@ public class AssignLabel implements IFlowLabelWithFilter { v.visitAssign(this, dst); } + @Override public AssignBarLabel bar() { return this == noFilter ? AssignBarLabel.noFilter() : AssignBarLabel.make(filter); } @@ -98,10 +100,12 @@ public class AssignLabel implements IFlowLabelWithFilter { return "assign"; } + @Override public boolean isBarred() { return false; } + @Override public TypeFilter getFilter() { return filter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java index 556eee4f0..f5ace68e0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java @@ -477,6 +477,7 @@ public class DemandPointerFlowGraph extends AbstractDemandFlowGraph implements I /** * The calling loop must call this in each iteration! */ + @Override public void setBasicBlock(ISSABasicBlock block) { basicBlock = block; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java index a7f6475cf..1113dd36b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java @@ -444,6 +444,7 @@ public class DemandValueFlowGraph extends AbstractDemandFlowGraph { /** * The calling loop must call this in each iteration! */ + @Override public void setBasicBlock(ISSABasicBlock block) { basicBlock = block; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java index 8acfe1397..536ba189f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java @@ -65,6 +65,7 @@ public class GetFieldBarLabel implements IFlowLabel { * * @see demandGraph.IFlowLabel#bar() */ + @Override public GetFieldLabel bar() { return GetFieldLabel.make(field); } @@ -75,6 +76,7 @@ public class GetFieldBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -107,6 +109,7 @@ public class GetFieldBarLabel implements IFlowLabel { return true; } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java index bccddfcfb..f110db428 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java @@ -81,6 +81,7 @@ public class GetFieldLabel implements IFlowLabel { return true; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -93,10 +94,12 @@ public class GetFieldLabel implements IFlowLabel { return "getfield[" + field + "]"; } + @Override public GetFieldBarLabel bar() { return GetFieldBarLabel.make(field); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java index 9b0a45b19..fa75bd414 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java @@ -55,6 +55,7 @@ public class MatchBarLabel implements IFlowLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public MatchLabel bar() { return MatchLabel.v(); } @@ -63,6 +64,7 @@ public class MatchBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -70,6 +72,7 @@ public class MatchBarLabel implements IFlowLabel { v.visitMatchBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java index d4da54995..0d8c26ee1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java @@ -48,6 +48,7 @@ public class MatchLabel implements IFlowLabel { return theInstance; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -60,10 +61,12 @@ public class MatchLabel implements IFlowLabel { return "match"; } + @Override public MatchBarLabel bar() { return MatchBarLabel.v(); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java index d56e45926..507ea2af9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java @@ -55,6 +55,7 @@ public class NewBarLabel implements IFlowLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public NewLabel bar() { return NewLabel.v(); } @@ -63,6 +64,7 @@ public class NewBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -70,6 +72,7 @@ public class NewBarLabel implements IFlowLabel { v.visitNewBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java index a1209ec91..e7e4ca898 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java @@ -48,6 +48,7 @@ public class NewLabel implements IFlowLabel { return theInstance; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -60,10 +61,12 @@ public class NewLabel implements IFlowLabel { return "new"; } + @Override public NewBarLabel bar() { return NewBarLabel.v(); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java index eaabf93c2..9c0e1e7a4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java @@ -54,6 +54,7 @@ public class ParamBarLabel extends CallLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public ParamLabel bar() { return ParamLabel.make(callSite); } @@ -62,6 +63,7 @@ public class ParamBarLabel extends CallLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -69,6 +71,7 @@ public class ParamBarLabel extends CallLabel { v.visitParamBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java index 085b0655c..c8bf1a222 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java @@ -49,6 +49,7 @@ public class ParamLabel extends CallLabel { return new ParamLabel(callSite); } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -61,10 +62,12 @@ public class ParamLabel extends CallLabel { return "param[" + callSite + "]"; } + @Override public ParamBarLabel bar() { return ParamBarLabel.make(callSite); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java index e920d1986..8eda14875 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java @@ -88,6 +88,7 @@ public class PutFieldBarLabel implements IFlowLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public PutFieldLabel bar() { return PutFieldLabel.make(field); } @@ -96,6 +97,7 @@ public class PutFieldBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -103,6 +105,7 @@ public class PutFieldBarLabel implements IFlowLabel { v.visitPutFieldBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java index fe634f986..bad59690d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java @@ -81,6 +81,7 @@ public class PutFieldLabel implements IFlowLabel { return true; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -93,10 +94,12 @@ public class PutFieldLabel implements IFlowLabel { return "putfield[" + field + "]"; } + @Override public PutFieldBarLabel bar() { return PutFieldBarLabel.make(field); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java index 04f17a178..1dfc83f10 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java @@ -54,6 +54,7 @@ public class ReturnBarLabel extends CallLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public ReturnLabel bar() { return ReturnLabel.make(callSite); } @@ -62,6 +63,7 @@ public class ReturnBarLabel extends CallLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -69,6 +71,7 @@ public class ReturnBarLabel extends CallLabel { v.visitReturnBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java index 70ca370b9..061d82231 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java @@ -49,6 +49,7 @@ public class ReturnLabel extends CallLabel { return new ReturnLabel(callSite); } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -61,10 +62,12 @@ public class ReturnLabel extends CallLabel { return "return[" + callSite + "]"; } + @Override public ReturnBarLabel bar() { return ReturnBarLabel.make(callSite); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java index 17e4c55bb..fd3290f58 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java @@ -68,40 +68,48 @@ public class ArrayContents implements IField { private ArrayContents() { } + @Override public TypeReference getFieldTypeReference() throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public boolean isFinal() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isPrivate() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isProtected() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isPublic() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isStatic() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public IClass getDeclaringClass() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Atom getName() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -112,19 +120,23 @@ public class ArrayContents implements IField { return "arr"; } + @Override public boolean isVolatile() { return false; } + @Override public ClassHierarchy getClassHierarchy() throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public FieldReference getReference() { return null; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java index 78ec0af5b..a47276ad2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java @@ -70,6 +70,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { invRef = MapUtil.inverseMap(ref); } + @Override public Collection getArrayReads(PointerKey arrayRef) { Collection memAccesses = new ArrayList(); if (DEBUG) { @@ -82,6 +83,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getArrayWrites(PointerKey arrayRef) { Collection memAccesses = new ArrayList(); if (DEBUG) { @@ -97,6 +99,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getFieldReads(PointerKey baseRef, IField field) { Collection memAccesses = new ArrayList(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { @@ -106,6 +109,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getFieldWrites(PointerKey baseRef, IField field) { Collection memAccesses = new ArrayList(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { @@ -115,12 +119,14 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getStaticFieldReads(IField field) { Collection result = new ArrayList(); convertStmtsToMemoryAccess(invRef.get(heapModel.getPointerKeyForStaticField(field)), result); return result; } + @Override public Collection getStaticFieldWrites(IField field) { Collection result = new ArrayList(); convertStmtsToMemoryAccess(invMod.get(heapModel.getPointerKeyForStaticField(field)), result); @@ -146,6 +152,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { } } + @Override public HeapModel getHeapModel() { return heapModel; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java index 43d74a3c1..c7b392274 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java @@ -92,6 +92,7 @@ public class PointerParamValueNumIterator implements Iterator { /* * @see java.util.Iterator#hasNext() */ + @Override public boolean hasNext() { return paramInd <= numParams; } @@ -99,6 +100,7 @@ public class PointerParamValueNumIterator implements Iterator { /* * @see java.util.Iterator#next() */ + @Override public Integer next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -111,6 +113,7 @@ public class PointerParamValueNumIterator implements Iterator { /* * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java index 239240c2c..4169e7da1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java @@ -343,6 +343,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getFieldReads(com.ibm.wala.classLoader.IField) */ + @Override public Collection getFieldReads(PointerKey pk, IField field) { Collection result = readMap.get(field); if (result == null) { @@ -355,6 +356,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getFieldWrites(com.ibm.wala.classLoader.IField) */ + @Override public Collection getFieldWrites(PointerKey pk, IField field) { Collection result = writeMap.get(field); if (result == null) { @@ -367,6 +369,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getArrayReads() */ + @Override public Collection getArrayReads(PointerKey pk) { return arrayReads; } @@ -374,6 +377,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getArrayWrites() */ + @Override public Collection getArrayWrites(PointerKey pk) { return arrayWrites; } @@ -422,14 +426,17 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { return result.toString(); } + @Override public Collection getStaticFieldReads(IField field) { return getFieldReads(null, field); } + @Override public Collection getStaticFieldWrites(IField field) { return getFieldWrites(null, field); } + @Override public HeapModel getHeapModel() { // NOTE: this memory access map actually makes no use of the heap model return heapModel; diff --git a/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java index 64e008714..836cffaad 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java @@ -75,6 +75,7 @@ public class FILiveObjectAnalysis implements ILiveObjectAnalysis { this.expensiveIntraproceduralAnalysis = expensiveIntraproceduralAnalysis; } + @Override public boolean mayBeLive(CGNode allocMethod, int allocPC, CGNode m, int instructionIndex) throws IllegalArgumentException, WalaException { if (allocMethod == null) { @@ -88,6 +89,7 @@ public class FILiveObjectAnalysis implements ILiveObjectAnalysis { /** * @param instructionIndex index of an SSA instruction */ + @Override public boolean mayBeLive(InstanceKey ik, CGNode m, int instructionIndex) { if (liveEverywhere.contains(ik)) { return true; @@ -186,6 +188,7 @@ public class FILiveObjectAnalysis implements ILiveObjectAnalysis { return DFS.getReachableNodes(callGraph, localRootNodes); } + @Override public boolean mayBeLive(InstanceKey ik, CGNode m, IntSet instructionIndices) { if (instructionIndices == null) { throw new IllegalArgumentException("instructionIndices is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java index cbe434910..528da2427 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java @@ -58,6 +58,7 @@ public class LocalLiveRangeAnalysis { // a filter which accepts everything but the block which defs v Filter notDef = new Filter() { + @Override public boolean accepts(Object o) { return (defBlock == null || !defBlock.equals(o)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java b/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java index 65b6a9484..878312be8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java +++ b/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java @@ -56,6 +56,7 @@ public class TrivialMethodEscape implements IMethodEscapeAnalysis, INodeEscapeAn this.cg = cg; } + @Override public boolean mayEscape(MethodReference allocMethod, int allocPC, MethodReference m) throws WalaException { if (allocMethod == null) { @@ -75,6 +76,7 @@ public class TrivialMethodEscape implements IMethodEscapeAnalysis, INodeEscapeAn return mayEscape(allocN, allocPC, nodes); } + @Override public boolean mayEscape(CGNode allocNode, int allocPC, CGNode node) throws WalaException { return mayEscape(Collections.singleton(allocNode), allocPC, Collections.singleton(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java index 4baff8f3c..e42cbf50e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java @@ -31,6 +31,7 @@ public class DelegatingContext implements Context { } } + @Override public ContextItem get(ContextKey name) { ContextItem result = A.get(name); if (result == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java index e2c1ef269..5fe066d76 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java @@ -61,21 +61,25 @@ public class CHACallGraph extends BasicCallGraph { super(method, C); } + @Override public IR getIR() { assert false; return null; } + @Override public DefUse getDU() { assert false; return null; } + @Override public Iterator iterateNewSites() { assert false; return null; } + @Override public Iterator iterateCallSites() { return getInterpreter(this).iterateCallSites(this); } @@ -116,6 +120,7 @@ public class CHACallGraph extends BasicCallGraph { isInitialized = true; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -133,18 +138,21 @@ public class CHACallGraph extends BasicCallGraph { } } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site) { return Iterator2Collection.toSet( new MapIterator( new FilterIterator( getPossibleTargets(site), new Filter() { + @Override public boolean accepts(IMethod o) { return !o.isAbstract(); } } ), new Function() { + @Override public CGNode apply(IMethod object) { try { return findOrCreateNode(object, Everywhere.EVERYWHERE); @@ -156,14 +164,17 @@ public class CHACallGraph extends BasicCallGraph { })); } + @Override public int getNumberOfTargets(CGNode node, CallSiteReference site) { return IteratorUtil.count(getPossibleTargets(site)); } + @Override public Iterator getPossibleSites(final CGNode src, final CGNode target) { return new FilterIterator(getInterpreter(src).iterateCallSites(src), new Filter() { + @Override public boolean accepts(CallSiteReference o) { return getPossibleTargets(src, o).contains(target); } @@ -267,14 +278,17 @@ public class CHACallGraph extends BasicCallGraph { } } + @Override public Iterator getPredNodes(CGNode n) { return getPreds(n).iterator(); } + @Override public int getPredNodeCount(CGNode n) { return getPreds(n).size(); } + @Override public Iterator getSuccNodes(final CGNode n) { return new FilterIterator(new ComposedIterator(n.iterateCallSites()) { @Override @@ -284,6 +298,7 @@ public class CHACallGraph extends BasicCallGraph { }, new Filter() { private final MutableIntSet nodes = IntSetUtil.make(); + @Override public boolean accepts(CGNode o) { if (nodes.contains(o.getGraphNodeId())) { return false; @@ -295,34 +310,42 @@ public class CHACallGraph extends BasicCallGraph { }); } + @Override public int getSuccNodeCount(CGNode N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public void addEdge(CGNode src, CGNode dst) { assert false; } + @Override public void removeEdge(CGNode src, CGNode dst) throws UnsupportedOperationException { assert false; } + @Override public void removeAllIncidentEdges(CGNode node) throws UnsupportedOperationException { assert false; } + @Override public void removeIncomingEdges(CGNode node) throws UnsupportedOperationException { assert false; } + @Override public void removeOutgoingEdges(CGNode node) throws UnsupportedOperationException { assert false; } + @Override public boolean hasEdge(CGNode src, CGNode dst) { return getPossibleSites(src, dst).hasNext(); } + @Override public IntSet getSuccNodeNumbers(CGNode node) { MutableIntSet result = IntSetUtil.make(); for(Iterator ss = getSuccNodes(node); ss.hasNext(); ) { @@ -331,6 +354,7 @@ public class CHACallGraph extends BasicCallGraph { return result; } + @Override public IntSet getPredNodeNumbers(CGNode node) { MutableIntSet result = IntSetUtil.make(); for(Iterator ss = getPredNodes(node); ss.hasNext(); ) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java index fe2321fbd..e31818ba3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java @@ -20,10 +20,12 @@ import com.ibm.wala.util.debug.Assertions; public class ContextInsensitiveCHAContextInterpreter implements CHAContextInterpreter { + @Override public boolean understands(CGNode node) { return true; } + @Override public Iterator iterateCallSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java index d52ee64a7..08626f004 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java @@ -341,6 +341,7 @@ public abstract class AbstractRootMethod extends SyntheticMethod { public RTAContextInterpreter getInterpreter() { return new RTAContextInterpreter() { + @Override public Iterator iterateNewSites(CGNode node) { ArrayList result = new ArrayList(); SSAInstruction[] statements = getStatements(options.getSSAOptions()); @@ -364,37 +365,45 @@ public abstract class AbstractRootMethod extends SyntheticMethod { return result.iterator(); } + @Override public Iterator iterateCallSites(CGNode node) { final Iterator I = getInvokeStatements(); return new Iterator() { + @Override public boolean hasNext() { return I.hasNext(); } + @Override public CallSiteReference next() { SSAInvokeInstruction s = (SSAInvokeInstruction) I.next(); return s.getCallSite(); } + @Override public void remove() { Assertions.UNREACHABLE(); } }; } + @Override public boolean understands(CGNode node) { return node.getMethod().getDeclaringClass().getReference().equals(FakeRootClass.FAKE_ROOT_CLASS); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java index fadca3c22..cfdb6bd6a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java @@ -140,6 +140,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im return (NodeImpl) nodes.get(K); } + @Override public CGNode getFakeRootNode() { return fakeRoot; } @@ -158,6 +159,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im /** * Note: not all successors of the root node are entrypoints */ + @Override public Collection getEntrypointNodes() { return entrypointNodes; } @@ -186,6 +188,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im assert C != null; } + @Override public IMethod getMethod() { return method; } @@ -210,12 +213,15 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im return "Node: " + method.toString() + " Context: " + context.toString(); } + @Override public Context getContext() { return context; } + @Override public abstract boolean addTarget(CallSiteReference reference, CGNode target); + @Override public IClassHierarchy getClassHierarchy() { return method.getClassHierarchy(); } @@ -252,6 +258,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im /** * @return NodeImpl, or null if none found */ + @Override public CGNode getNode(IMethod method, Context C) { Key key = new Key(method, C); return getNode(key); @@ -288,6 +295,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im } + @Override public Set getNodes(MethodReference m) { IMethod im = getClassHierarchy().resolveMethod(m); if (im == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java index 1628b87cd..031375a6b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java @@ -30,6 +30,7 @@ public class ClassHierarchyClassTargetSelector implements ClassTargetSelector { this.cha = cha; } + @Override public IClass getAllocatedTarget(CGNode caller, NewSiteReference site) { if (site == null) { throw new IllegalArgumentException("site is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java index 9bbb497f7..77f980aa4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java @@ -46,6 +46,7 @@ public class ClassHierarchyMethodTargetSelector implements MethodTargetSelector * * @throws IllegalArgumentException if call is null */ + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference call, IClass receiver) { if (call == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java index 51c52fb93..68882d2e5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java @@ -39,6 +39,7 @@ public class ComposedEntrypoints implements Iterable { } } + @Override public Iterator iterator() { return entrypoints.iterator(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java index e0e9ebc46..2c0ce65de 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java @@ -25,10 +25,12 @@ import com.ibm.wala.util.intset.IntSet; */ public class ContextInsensitiveSelector implements ContextSelector { + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return Everywhere.EVERYWHERE; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return EmptyIntSet.instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java index ca321ea66..4ebecd88a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java @@ -39,6 +39,7 @@ public class DefaultContextSelector implements ContextSelector { delegate = new DelegatingContextSelector(new CloneContextSelector(cha), s); } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (caller == null) { throw new IllegalArgumentException("null caller"); @@ -46,6 +47,7 @@ public class DefaultContextSelector implements ContextSelector { return delegate.getCalleeTarget(caller, site, callee, receiver); } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return delegate.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java index 0ba236096..342f2c5d0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java @@ -39,6 +39,7 @@ public class DelegatingContextSelector implements ContextSelector { } } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (DEBUG) { System.err.println(("getCalleeTarget " + caller + " " + site + " " + callee)); @@ -59,6 +60,7 @@ public class DelegatingContextSelector implements ContextSelector { return C; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return A.getRelevantParameters(caller, site).union(B.getRelevantParameters(caller, site)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java index ee67917f2..2a7080c3f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java @@ -27,6 +27,7 @@ public class Everywhere implements Context { /** * This context gives no information. */ + @Override public ContextItem get(ContextKey name) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java index 93d388234..04541eaff 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java @@ -188,6 +188,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp protected Iterator getPossibleSites(final CGNode to) { final int n = getCallGraph().getNumber(to); return new FilterIterator(iterateCallSites(), new Filter() { + @Override public boolean accepts(Object o) { IntSet s = getPossibleTargetNumbers((CallSiteReference) o); return s == null ? false : s.contains(n); @@ -297,6 +298,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp allTargets.clear(); } + @Override public IR getIR() { if (getMethod().isSynthetic()) { // disable local cache in this case, as context interpreters @@ -311,6 +313,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return ir; } + @Override public DefUse getDU() { if (getMethod().isSynthetic()) { // disable local cache in this case, as context interpreters @@ -329,10 +332,12 @@ public class ExplicitCallGraph extends BasicCallGraph imp return ExplicitCallGraph.this; } + @Override public Iterator iterateCallSites() { return getCallGraph().getInterpreter(this).iterateCallSites(this); } + @Override public Iterator iterateNewSites() { return getCallGraph().getInterpreter(this).iterateNewSites(this); } @@ -345,6 +350,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp /* * @see com.ibm.wala.ipa.callgraph.CallGraph#getClassHierarchy() */ + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -352,6 +358,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp protected class ExplicitEdgeManager implements NumberedEdgeManager { final IntFunction toNode = new IntFunction() { + @Override public CGNode apply(int i) { CGNode result = getNode(i); // if (Assertions.verifyAssertions && result == null) { @@ -367,17 +374,20 @@ public class ExplicitCallGraph extends BasicCallGraph imp final IBinaryNaturalRelation predecessors = new BasicNaturalRelation(new byte[] { BasicNaturalRelation.SIMPLE_SPACE_STINGY }, BasicNaturalRelation.SIMPLE); + @Override public IntSet getSuccNodeNumbers(CGNode node) { ExplicitNode n = (ExplicitNode) node; return n.getAllTargetNumbers(); } + @Override public IntSet getPredNodeNumbers(CGNode node) { ExplicitNode n = (ExplicitNode) node; int y = getNumber(n); return predecessors.getRelated(y); } + @Override public Iterator getPredNodes(CGNode N) { IntSet s = getPredNodeNumbers(N); if (s == null) { @@ -387,22 +397,26 @@ public class ExplicitCallGraph extends BasicCallGraph imp } } + @Override public int getPredNodeCount(CGNode N) { ExplicitNode n = (ExplicitNode) N; int y = getNumber(n); return predecessors.getRelatedCount(y); } + @Override public Iterator getSuccNodes(CGNode N) { ExplicitNode n = (ExplicitNode) N; return new IntMapIterator(n.getAllTargetNumbers().intIterator(), toNode); } + @Override public int getSuccNodeCount(CGNode N) { ExplicitNode n = (ExplicitNode) N; return n.getAllTargetNumbers().size(); } + @Override public void addEdge(CGNode src, CGNode dst) { // we assume that this is called from ExplicitNode.addTarget(). // so we only have to track the inverse edge. @@ -411,6 +425,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp predecessors.add(y, x); } + @Override public void removeEdge(CGNode src, CGNode dst) { int x = getNumber(src); int y = getNumber(dst); @@ -422,20 +437,24 @@ public class ExplicitCallGraph extends BasicCallGraph imp predecessors.add(y, x); } + @Override public void removeAllIncidentEdges(CGNode node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(CGNode node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(CGNode node) { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(CGNode src, CGNode dst) { int x = getNumber(src); int y = getNumber(dst); @@ -455,6 +474,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return new ExplicitEdgeManager(); } + @Override public int getNumberOfTargets(CGNode node, CallSiteReference site) { if (!containsNode(node)) { throw new IllegalArgumentException("node not in callgraph " + node); @@ -464,6 +484,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return n.getNumberOfTargets(site); } + @Override public Iterator getPossibleSites(CGNode src, CGNode target) { if (!containsNode(src)) { throw new IllegalArgumentException("node not in callgraph " + src); @@ -476,6 +497,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return n.getPossibleSites(target); } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site) { if (!containsNode(node)) { throw new IllegalArgumentException("node not in callgraph " + node); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java index aa1e82e76..4b2438734 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java @@ -62,50 +62,62 @@ public class FakeRootClass extends SyntheticClass { } fakeRootStaticFields.put(name, new IField() { + @Override public IClassHierarchy getClassHierarchy() { return FakeRootClass.this.getClassHierarchy(); } + @Override public TypeReference getFieldTypeReference() { return fieldType; } + @Override public IClass getDeclaringClass() { return FakeRootClass.this; } + @Override public Atom getName() { return name; } + @Override public boolean isStatic() { return true; } + @Override public boolean isVolatile() { return false; } + @Override public FieldReference getReference() { return FieldReference.findOrCreate(FAKE_ROOT_CLASS, name, fieldType); } + @Override public boolean isFinal() { return false; } + @Override public boolean isPrivate() { return true; } + @Override public boolean isProtected() { return false; } + @Override public boolean isPublic() { return false; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } @@ -115,6 +127,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getModifiers() */ + @Override public int getModifiers() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -122,6 +135,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getSuperclass() */ + @Override public IClass getSuperclass() throws UnsupportedOperationException { return getClassHierarchy().getRootClass(); } @@ -129,6 +143,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllImplementedInterfaces() */ + @Override public Collection getAllImplementedInterfaces() throws UnsupportedOperationException { return Collections.emptySet(); } @@ -143,6 +158,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IMethod getMethod(Selector selector) throws UnsupportedOperationException { for (IMethod m : methods) { if (m.getSelector().equals(selector)) { @@ -155,6 +171,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IField getField(Atom name) { if (fakeRootStaticFields != null) { return fakeRootStaticFields.get(name); @@ -166,6 +183,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -174,6 +192,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() throws UnsupportedOperationException { return Collections.unmodifiableCollection(methods); } @@ -181,6 +200,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredInstanceFields() */ + @Override public Collection getDeclaredInstanceFields() throws UnsupportedOperationException { return Collections.emptySet(); } @@ -188,6 +208,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ + @Override public Collection getDeclaredStaticFields() { if (fakeRootStaticFields != null) { return fakeRootStaticFields.values(); @@ -199,6 +220,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#isReferenceType() */ + @Override public boolean isReferenceType() { return getReference().isReferenceType(); } @@ -206,6 +228,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -213,6 +236,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { return Collections.emptySet(); } @@ -220,6 +244,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields() { return getDeclaredStaticFields(); } @@ -227,6 +252,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { throw new UnsupportedOperationException(); } @@ -234,14 +260,17 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { return getDeclaredStaticFields(); } + @Override public boolean isPublic() { return false; } + @Override public boolean isPrivate() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java index 4895c03c2..8a5dac1d4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java @@ -54,6 +54,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra */ public static PartialCallGraph make(final CallGraph cg, final Collection partialRoots, final Collection nodes) { Graph partialGraph = GraphSlicer.prune(cg, new Filter() { + @Override public boolean accepts(CGNode o) { return nodes.contains(o); } @@ -70,6 +71,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra public static PartialCallGraph make(CallGraph cg, Collection partialRoots) { final Set nodes = DFS.getReachableNodes(cg, partialRoots); Graph partialGraph = GraphSlicer.prune(cg, new Filter() { + @Override public boolean accepts(CGNode o) { return nodes.contains(o); } @@ -78,14 +80,17 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return new PartialCallGraph(cg, partialRoots, partialGraph); } + @Override public CGNode getFakeRootNode() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Collection getEntrypointNodes() { return partialRoots; } + @Override public CGNode getNode(IMethod method, Context C) { CGNode x = cg.getNode(method, C); if (x == null) { @@ -94,6 +99,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return (containsNode(x) ? x : null); } + @Override public Set getNodes(MethodReference m) { Set result = HashSetFactory.make(); for (Iterator xs = cg.getNodes(m).iterator(); xs.hasNext();) { @@ -106,31 +112,38 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return result; } + @Override public IClassHierarchy getClassHierarchy() { return cg.getClassHierarchy(); } + @Override public Iterator iterateNodes(IntSet nodes) { return new FilterIterator(cg.iterateNodes(nodes), new Filter() { + @Override public boolean accepts(Object o) { return containsNode((CGNode) o); } }); } + @Override public int getMaxNumber() { return cg.getMaxNumber(); } + @Override public CGNode getNode(int index) { CGNode n = cg.getNode(index); return (containsNode(n) ? n : null); } + @Override public int getNumber(CGNode n) { return (containsNode(n) ? cg.getNumber(n) : -1); } + @Override public IntSet getSuccNodeNumbers(CGNode node) { assert containsNode(node); MutableIntSet x = IntSetUtil.make(); @@ -144,6 +157,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return x; } + @Override public IntSet getPredNodeNumbers(CGNode node) { assert containsNode(node); MutableIntSet x = IntSetUtil.make(); @@ -157,14 +171,17 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return x; } + @Override public int getNumberOfTargets(CGNode node, CallSiteReference site) { return (containsNode(node) ? getPossibleTargets(node, site).size() : -1); } + @Override public Iterator getPossibleSites(CGNode src, CGNode target) { return ((containsNode(src) && containsNode(target)) ? cg.getPossibleSites(src, target) : null); } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site) { if (!containsNode(node)) { return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java index cc717bcef..aa7ff380d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java @@ -133,6 +133,7 @@ public class Util { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -183,19 +184,23 @@ public class Util { } return new Iterable() { + @Override public Iterator iterator() { final Atom mainMethod = Atom.findOrCreateAsciiAtom("main"); return new Iterator() { private int index = 0; + @Override public void remove() { Assertions.UNREACHABLE(); } + @Override public boolean hasNext() { return index < classNames.length; } + @Override public Entrypoint next() { TypeReference T = TypeReference.findOrCreate(loaderRef, TypeName.string2TypeName(classNames[index++])); MethodReference mainRef = MethodReference.findOrCreate(T, mainMethod, Descriptor diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java index a0c609367..7103fc6d2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java @@ -24,6 +24,7 @@ public abstract class AbstractFieldPointerKey extends AbstractPointerKey impleme this.instance = container; } + @Override public InstanceKey getInstanceKey() { return instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java index 00383947b..86751d018 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java @@ -43,6 +43,7 @@ public abstract class AbstractPointerAnalysis implements PointerAnalysis { this.instanceKeys = instanceKeys; } + @Override public HeapGraph getHeapGraph() { if (heapGraph == null) { heapGraph = new BasicHeapGraph(this, cg); @@ -54,10 +55,12 @@ public abstract class AbstractPointerAnalysis implements PointerAnalysis { return cg; } + @Override public Collection getInstanceKeys() { return Collections.unmodifiableCollection(instanceKeys.getObjects()); } + @Override public OrdinalSetMapping getInstanceKeyMapping() { return instanceKeys; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java index 33d27dc7a..3f073467a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java @@ -40,6 +40,7 @@ public abstract class AbstractPointsToSolver implements IPointsToSolver { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointsToSolver#solve() */ + @Override public abstract void solve(IProgressMonitor monitor) throws IllegalArgumentException, CancelException; protected PropagationCallGraphBuilder getBuilder() { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java index 708287e02..c94e32261 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java @@ -46,6 +46,7 @@ public abstract class AbstractTypeInNode implements InstanceKeyWithNode { /** * @return the concrete type allocated */ + @Override public IClass getConcreteType() { return type; } @@ -53,6 +54,7 @@ public abstract class AbstractTypeInNode implements InstanceKeyWithNode { /** * @return the call graph node which contains this allocation */ + @Override public CGNode getNode() { return node; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java index d9e9a0f42..9cfdc5e51 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java @@ -55,6 +55,7 @@ public class AllocationSite implements InstanceKey { return method; } + @Override public IClass getConcreteType() { return concreteType; } @@ -90,17 +91,20 @@ public class AllocationSite implements InstanceKey { return true; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new MapIterator>( new FilterIterator( CG.getNodes(method.getReference()).iterator(), new Filter() { + @Override public boolean accepts(CGNode o) { return o.getMethod().equals(method); } } ), new Function>() { + @Override public Pair apply(CGNode object) { return Pair.make(object, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java index d03bf247a..093904782 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java @@ -48,6 +48,7 @@ public abstract class AllocationSiteInNode extends AbstractTypeInNode { return site; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new NonNullSingletonIterator>(Pair.make(getNode(), getSite())); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java index 58946c82f..f7b3bb207 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java @@ -59,6 +59,7 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { this.classBased = new ClassBasedInstanceKeys(options, cha); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { IClass type = options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -94,6 +95,7 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { ArrayClass type = (ArrayClass) options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -104,6 +106,7 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (options.getUseConstantSpecificKeys()) { return new ConstantKey(S, cha.lookupClass(type)); @@ -112,10 +115,12 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter pei, TypeReference type) { return classBased.getInstanceKeyForPEI(node, pei, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return classBased.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java index b7a008054..bca3e385e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java @@ -43,6 +43,7 @@ public final class ArrayContentsKey extends AbstractFieldPointerKey implements F /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKey#getTypeFilter() */ + @Override public TypeFilter getTypeFilter() { return new SingleClassFilter(((ArrayClass) instance.getConcreteType()).getElementClass()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java index 1abe64319..2def3ae28 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java @@ -63,6 +63,7 @@ class AssignOperator extends UnaryOperator implements IPoin /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return false; } 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 5df7c76c6..7bdb5cf06 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 @@ -40,6 +40,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { this.options = options; } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { if (allocation == null) { throw new IllegalArgumentException("allocation is null"); @@ -64,6 +65,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { * [[Object; e.g., the [[Object; instances in [[[Object; dim == 1 represents the second dimension, e.g., the [Object * instances in [[[Object; */ + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { if (DEBUG) { System.err.println(("getInstanceKeyForMultiNewArray " + allocation + " " + dim)); @@ -98,6 +100,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (type == null || cha.lookupClass(type) == null) { return null; @@ -113,6 +116,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { /** * @return a set of ConcreteTypeKeys that represent the exceptions the PEI may throw. */ + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter peiLoc, TypeReference type) { IClass klass = cha.lookupClass(type); if (klass == null) { @@ -121,6 +125,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { return new ConcreteTypeKey(cha.lookupClass(type)); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { IClass klass = cha.lookupClass(type); if (klass == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java index 55e5709a0..fbf77931f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java @@ -35,6 +35,7 @@ public class CloneContextSelector implements ContextSelector { this.cha = cha; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver == null) { return null; @@ -46,6 +47,7 @@ public class CloneContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { IMethod declaredTarget = cha.resolveMethod(site.getDeclaredTarget()); if (declaredTarget != null && declaredTarget.getReference().equals(CloneInterpreter.CLONE)) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java index f55e77299..9cfaff4f8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java @@ -72,6 +72,7 @@ public final class ConcreteTypeKey implements InstanceKey { /* * @see com.ibm.wala.ipa.callgraph.propagation.InstanceKey#getConcreteType() */ + @Override public IClass getConcreteType() { return type; } @@ -102,6 +103,7 @@ public final class ConcreteTypeKey implements InstanceKey { return result; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new ComposedIterator>(CG.iterator()) { @Override @@ -110,12 +112,14 @@ public final class ConcreteTypeKey implements InstanceKey { new FilterIterator( outer.iterateNewSites(), new Filter() { + @Override public boolean accepts(NewSiteReference o) { return o.getDeclaredType().equals(type.getReference()); } } ), new Function>() { + @Override public Pair apply(NewSiteReference object) { return Pair.make(outer, object); } 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 53e46eca9..17226c3c0 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 @@ -58,6 +58,7 @@ public final class ConstantKey implements InstanceKey { /* * @see com.ibm.wala.ipa.callgraph.propagation.InstanceKey#getConcreteType() */ + @Override public IClass getConcreteType() { return valueClass; } @@ -66,6 +67,7 @@ public final class ConstantKey implements InstanceKey { return value; } + @Override public Iterator> getCreationSites(CallGraph CG) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java index f9b0ac47d..ef512862a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java @@ -59,11 +59,13 @@ public interface FilteredPointerKey extends PointerKey { return (o instanceof SingleClassFilter) && ((SingleClassFilter) o).getConcreteType().equals(concreteType); } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = system.getInstanceKeysForClass(concreteType); return (f == null) ? false : L.addAllInIntersection(R, f); } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = system.getInstanceKeysForClass(concreteType); @@ -73,6 +75,7 @@ public interface FilteredPointerKey extends PointerKey { return (f == null) ? L.addAll(R) : L.addAll(IntSetUtil.diff(R.getValue(), f)); } + @Override public boolean isRootFilter() { return concreteType.equals(concreteType.getClassHierarchy().getRootClass()); } @@ -132,11 +135,13 @@ public interface FilteredPointerKey extends PointerKey { return f; } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = bits(system); return (f == null) ? false : L.addAllInIntersection(R, f); } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = bits(system); @@ -146,6 +151,7 @@ public interface FilteredPointerKey extends PointerKey { return (f == null) ? L.addAll(R) : L.addAll(IntSetUtil.diff(R.getValue(), f)); } + @Override public boolean isRootFilter() { return concreteType.length == 1 && concreteType[0].getClassHierarchy().getRootClass().equals(concreteType[0]); } @@ -177,6 +183,7 @@ public interface FilteredPointerKey extends PointerKey { return (o instanceof SingleInstanceFilter) && ((SingleInstanceFilter) o).getInstance().equals(concreteType); } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { int idx = system.findOrCreateIndexForInstanceKey(concreteType); if (R.contains(idx)) { @@ -189,6 +196,7 @@ public interface FilteredPointerKey extends PointerKey { return false; } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { int idx = system.findOrCreateIndexForInstanceKey(concreteType); if (!R.contains(idx) || L.contains(idx)) { @@ -200,6 +208,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean isRootFilter() { return false; } @@ -246,6 +255,7 @@ public interface FilteredPointerKey extends PointerKey { this.system = system; } + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); IClass C = I.getConcreteType(); @@ -258,6 +268,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { if (R.getValue() == null) { return false; @@ -268,6 +279,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { if (R.getValue() == null) { return false; @@ -278,6 +290,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean isRootFilter() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java index 62d1e18f1..672c4a93b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java @@ -43,6 +43,7 @@ public class InstanceFieldKeyWithFilter extends InstanceFieldKey implements Filt /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKey#getTypeFilter() */ + @Override public TypeFilter getTypeFilter() { return new SingleClassFilter(filter); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java index d0f66ac48..a2f52b298 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java @@ -26,6 +26,7 @@ public class LocalPointerKeyWithFilter extends LocalPointerKey implements Filter } + @Override public TypeFilter getTypeFilter() { return typeFilter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java index 1bf0a6a4b..5243eee3f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java @@ -107,6 +107,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis#getPointsToSet(com.ibm.wala.ipa.callgraph.propagation.PointerKey) */ + @Override @SuppressWarnings("unchecked") public OrdinalSet getPointsToSet(PointerKey key) { if (pointsToMap.isImplicit(key)) { @@ -141,6 +142,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /** * did the pointer analysis use a type filter for a given points-to set? (this is ugly). */ + @Override public boolean isFiltered(PointerKey key) { if (pointsToMap.isImplicit(key)) { return false; @@ -447,32 +449,39 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis#getHeapModel() */ + @Override public HeapModel getHeapModel() { return H; } private class HModel implements HeapModel { + @Override public Iterator iteratePointerKeys() { return pointsToMap.iterateKeys(); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return iKeyFactory.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return iKeyFactory.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { return iKeyFactory.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter peiLoc, TypeReference type) { return iKeyFactory.getInstanceKeyForPEI(node, peiLoc, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return iKeyFactory.getInstanceKeyForClassObject(type); } @@ -480,10 +489,12 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForLocal(com.ibm.detox.ipa.callgraph.CGNode, int) */ + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { return pointerKeys.getPointerKeyForLocal(node, valueNumber); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { return pointerKeys.getFilteredPointerKeyForLocal(node, valueNumber, filter); } @@ -491,6 +502,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForReturnValue(com.ibm.detox.ipa.callgraph.CGNode) */ + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return pointerKeys.getPointerKeyForReturnValue(node); } @@ -500,6 +512,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForExceptionalReturnValue(com.ibm.detox.ipa.callgraph * .CGNode) */ + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return pointerKeys.getPointerKeyForExceptionalReturnValue(node); } @@ -508,6 +521,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * @see * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForStaticField(com.ibm.wala.classLoader.FieldReference) */ + @Override public PointerKey getPointerKeyForStaticField(IField f) { return pointerKeys.getPointerKeyForStaticField(f); } @@ -517,6 +531,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForInstance(com.ibm.wala.ipa.callgraph.propagation. * InstanceKey, com.ibm.wala.classLoader.FieldReference) */ + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { assert field != null; return pointerKeys.getPointerKeyForInstanceField(I, field); @@ -527,10 +542,12 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForArrayContents(com.ibm.wala.ipa.callgraph.propagation * .InstanceKey) */ + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return pointerKeys.getPointerKeyForArrayContents(I); } + @Override public IClassHierarchy getClassHierarchy() { return getCallGraph().getClassHierarchy(); } @@ -539,10 +556,12 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis#iteratePointerKeys() */ + @Override public Iterable getPointerKeys() { return Iterator2Iterable.make(pointsToMap.iterateKeys()); } + @Override public IClassHierarchy getClassHierarchy() { return builder.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java index 0ae185f0a..7ce61bc0c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java @@ -180,6 +180,7 @@ public class PointerKeyComparator implements Comparator { return -1; } + @Override public int compare(Object key1, Object key2) { if (key1 == key2) return 0; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java index cc4b03dca..7ae2de21c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java @@ -202,6 +202,7 @@ public class PointsToMap { */ public Iterator getTransitiveRoots() { return new FilterIterator(iterateKeys(), new Filter() { + @Override public boolean accepts(Object o) { return isTransitiveRoot((PointerKey) o); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java index f016a093d..3f690bb81 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java @@ -122,6 +122,7 @@ public class PointsToSetVariable extends IntSetVariable { } b.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKey ik = instanceKeys.getMappedObject(x); IClass concreteType = ik.getConcreteType(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java index 372c3a108..13c3abf28 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java @@ -216,6 +216,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.CallGraphBuilder#makeCallGraph(com.ibm.wala.ipa.callgraph.AnalysisOptions) */ + @Override public CallGraph makeCallGraph(AnalysisOptions options, IProgressMonitor monitor) throws IllegalArgumentException, CallGraphBuilderCancelException { if (options == null) { @@ -507,6 +508,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey#getTypeFilter() */ + @Override public TypeFilter getTypeFilter() { return new SingleClassFilter(type); } @@ -622,6 +624,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return false; } @@ -671,6 +674,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.detox.ipa.callgraph.CallGraphBuilder#getPointerAnalysis() */ + @Override public PointerAnalysis getPointerAnalysis() { return system.extractPointerAnalysis(this); } @@ -821,6 +825,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!I.getConcreteType().isArrayClass()) { @@ -869,6 +874,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -944,6 +950,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { return 9859 + super.hashCode(); } + @Override public boolean isComplex() { return true; } @@ -1003,6 +1010,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { } final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!representsNullType(I)) { @@ -1062,6 +1070,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1089,6 +1098,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1116,6 +1126,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { } final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!representsNullType(I)) { @@ -1218,6 +1229,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { IntSet value = ref.getValue(); final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!representsNullType(I)) { @@ -1256,6 +1268,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1290,6 +1303,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { IntSet value = arrayref.getValue(); final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!I.getConcreteType().isArrayClass()) { @@ -1346,6 +1360,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1455,6 +1470,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { boolean b = false; } + @Override public AnalysisCache getAnalysisCache() { return analysisCache; }; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java index 95032499f..73e8bb919 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java @@ -273,9 +273,11 @@ public class PropagationGraph implements IFixedPointSystem implicitUnaryCount--; } + @Override @SuppressWarnings("unchecked") public Iterator getStatements() { Iterator it = new FilterIterator(delegateGraph.iterator(), new Filter() { + @Override public boolean accepts(Object x) { return x instanceof AbstractStatement; } @@ -300,10 +302,12 @@ public class PropagationGraph implements IFixedPointSystem this.defs = defs.intIterator(); } + @Override public boolean hasNext() { return defs.hasNext(); } + @Override public AbstractStatement next() { int l = defs.next(); PointsToSetVariable lhs = (PointsToSetVariable) delegateGraph.getNode(l); @@ -315,6 +319,7 @@ public class PropagationGraph implements IFixedPointSystem return temp; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -338,10 +343,12 @@ public class PropagationGraph implements IFixedPointSystem this.uses = uses.intIterator(); } + @Override public boolean hasNext() { return uses.hasNext(); } + @Override public AbstractStatement next() { int r = uses.next(); PointsToSetVariable rhs = (PointsToSetVariable) delegateGraph.getNode(r); @@ -352,6 +359,7 @@ public class PropagationGraph implements IFixedPointSystem return temp; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -389,10 +397,12 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public boolean hasNext() { return innerDelegate != null; } + @Override public AbstractStatement next() { IntPair p = (IntPair) innerDelegate.next(); int lhs = p.getX(); @@ -405,6 +415,7 @@ public class PropagationGraph implements IFixedPointSystem return result; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -412,6 +423,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void removeStatement(IFixedPointStatement eq) throws IllegalArgumentException { if (eq == null) { throw new IllegalArgumentException("eq == null"); @@ -424,6 +436,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void reorder() { VariableGraphView graph = new VariableGraphView(); @@ -507,10 +520,12 @@ public class PropagationGraph implements IFixedPointSystem return new Iterator() { Iterator inner; + @Override public boolean hasNext() { return eqs.hasNext() || (inner != null); } + @Override public PointsToSetVariable next() { if (inner != null) { PointsToSetVariable result = (PointsToSetVariable)inner.next(); @@ -529,6 +544,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -566,10 +582,12 @@ public class PropagationGraph implements IFixedPointSystem advance(); } + @Override public boolean hasNext() { return nextResult != null; } + @Override public PointsToSetVariable next() { PointsToSetVariable result = nextResult; advance(); @@ -584,6 +602,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -645,6 +664,7 @@ public class PropagationGraph implements IFixedPointSystem } + @Override @SuppressWarnings("unchecked") public Iterator getStatementsThatUse(PointsToSetVariable v) { if (v == null) { @@ -670,6 +690,7 @@ public class PropagationGraph implements IFixedPointSystem return list.iterator(); } + @Override @SuppressWarnings("unchecked") public Iterator getStatementsThatDef(PointsToSetVariable v) { if (v == null) { @@ -703,6 +724,7 @@ public class PropagationGraph implements IFixedPointSystem * @throws IllegalArgumentException if v is null * */ + @Override public int getNumberOfStatementsThatUse(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); @@ -723,6 +745,7 @@ public class PropagationGraph implements IFixedPointSystem return result; } + @Override public int getNumberOfStatementsThatDef(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); @@ -743,9 +766,11 @@ public class PropagationGraph implements IFixedPointSystem return result; } + @Override @SuppressWarnings("unchecked") public Iterator getVariables() { Iterator it = new FilterIterator(delegateGraph.iterator(), new Filter() { + @Override public boolean accepts(Object x) { return x instanceof IVariable; } @@ -778,6 +803,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public boolean containsStatement(IFixedPointStatement eq) throws IllegalArgumentException { if (eq == null) { throw new IllegalArgumentException("eq == null"); @@ -811,10 +837,12 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public boolean containsVariable(PointsToSetVariable v) { return delegateGraph.containsNode(v); } + @Override public void addStatement(IFixedPointStatement statement) throws IllegalArgumentException, UnimplementedError { if (statement == null) { throw new IllegalArgumentException("statement == null"); @@ -936,10 +964,12 @@ public class PropagationGraph implements IFixedPointSystem advance(); } + @Override public boolean hasNext() { return nextResult != null; } + @Override public PointsToSetVariable next() { PointsToSetVariable result = nextResult; advance(); @@ -956,6 +986,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -989,10 +1020,12 @@ public class PropagationGraph implements IFixedPointSystem advance(); } + @Override public boolean hasNext() { return nextResult != null; } + @Override public PointsToSetVariable next() { PointsToSetVariable result = nextResult; advance(); @@ -1009,6 +1042,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java index 80bb74d37..e46c52f38 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java @@ -646,6 +646,7 @@ public class PropagationSystem extends DefaultFixedPointSolver pks = new ArrayList(params.size()); params.foreach(new IntSetAction() { + @Override public void act(int x) { if (!contentsAreInvariant(symbolTable, du, instruction.getUse(x))) { pks.add(getBuilder().getPointerKeyForLocal(node, instruction.getUse(x))); @@ -1357,6 +1359,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap * @return if non-null, then result[i] holds the set of instance keys which may be passed as the ith parameter. (which must be * invariant) */ + @Override public InstanceKey[][] computeInvariantParameters(SSAAbstractInvokeInstruction call) { InstanceKey[][] constParams = null; for (int i = 0; i < call.getNumberOfUses(); i++) { @@ -1810,6 +1813,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1846,6 +1850,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap IntSet s = system.findOrCreatePointsToSet(var).getValue(); if (s != null && !s.isEmpty()) { s.foreach(new IntSetAction() { + @Override public void act(int x) { keys[p] = system.getInstanceKey(x); rec(pi + 1); @@ -1878,6 +1883,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap } final Set targets = HashSetFactory.make(); VoidFunction f = new VoidFunction() { + @Override public void apply(InstanceKey[] v) { IClass recv = null; if (site.isDispatch()) { @@ -2243,6 +2249,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap /* * @see com.ibm.wala.ipa.callgraph.propagation.HeapModel#iteratePointerKeys() */ + @Override public Iterator iteratePointerKeys() { return system.iteratePointerKeys(); } @@ -2266,6 +2273,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap return types; } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return getInstanceKeyForPEI(node, instr, type, instanceKeyFactory); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java index 83c6d5ec8..f8bca489b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java @@ -54,16 +54,19 @@ public class SmushedAllocationSiteInNode extends AbstractTypeInNode { return "SMUSHED " + getNode() + " : " + getConcreteType(); } + @Override public Iterator> getCreationSites(CallGraph CG) { return new MapIterator>( new FilterIterator( getNode().iterateNewSites(), new Filter() { + @Override public boolean accepts(NewSiteReference o) { return o.getDeclaredType().equals(getConcreteType().getReference()); } }), new Function>() { + @Override public Pair apply(NewSiteReference object) { return Pair.make(getNode(), object); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java index ad9bc9751..99df2b486 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java @@ -48,6 +48,7 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { this.classBased = new ClassBasedInstanceKeys(options, cha); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { IClass type = options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -68,6 +69,7 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { ArrayClass type = (ArrayClass) options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -78,6 +80,7 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (options.getUseConstantSpecificKeys()) return new ConstantKey(S, cha.lookupClass(type)); @@ -85,10 +88,12 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { return new ConcreteTypeKey(cha.lookupClass(type)); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter pei, TypeReference type) { return classBased.getInstanceKeyForPEI(node, pei, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return classBased.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java index c153b792d..0c0ca06b2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java @@ -64,6 +64,7 @@ public class StringConstantCharArray implements InstanceKey { return true; } + @Override public IClass getConcreteType() { return constant.getConcreteType().getClassHierarchy().lookupClass(TypeReference.CharArray); } @@ -73,6 +74,7 @@ public class StringConstantCharArray implements InstanceKey { return "StringConstantCharArray:" + constant; } + @Override public Iterator> getCreationSites(CallGraph CG) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java index 2a0e7c472..fcfe60ed2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java @@ -34,6 +34,7 @@ public class TargetMethodContextSelector implements ContextSelector { this.selector = selector; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] R) { if (R == null || R[0] == null) { throw new IllegalArgumentException("R is null"); @@ -47,6 +48,7 @@ public class TargetMethodContextSelector implements ContextSelector { return M; } + @Override public ContextItem get(ContextKey name) { if (name.equals(ContextKey.PARAMETERS[0])) { return new FilteredPointerKey.TargetMethodFilter(M); @@ -77,6 +79,7 @@ public class TargetMethodContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return thisParameter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java index 1e41e38f8..c3e64ea62 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java @@ -39,6 +39,7 @@ public class CallStringContext implements Context { return "CallStringContext: " + cs.toString(); } + @Override public ContextItem get(ContextKey name) { if (CallStringContextSelector.CALL_STRING.equals(name)) { return cs; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java index e776d2b98..c32da64f2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java @@ -56,6 +56,7 @@ public abstract class CallStringContextSelector implements ContextSelector { return cs.hashCode() * base.hashCode(); } + @Override public ContextItem get(ContextKey name) { if (CALL_STRING.equals(name)) { return cs; @@ -97,6 +98,7 @@ public abstract class CallStringContextSelector implements ContextSelector { /* * @see com.ibm.wala.ipa.callgraph.ContextSelector#getCalleeTarget(com.ibm.wala.ipa.callgraph.CGNode, com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); CallString cs = getCallString(caller, site, callee); @@ -109,6 +111,7 @@ public abstract class CallStringContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return base.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java index c6e928d5b..91fba9bfb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java @@ -32,6 +32,7 @@ public class CallerContext implements Context { this.caller = caller; } + @Override public ContextItem get(ContextKey name) { if (name == null) { throw new IllegalArgumentException("name is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java index 6a12e650f..e92e86e0c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java @@ -36,6 +36,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter this.options = options; } + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -45,6 +46,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter return getAnalysisCache().getSSACache().findOrCreateIR(node.getMethod(), Everywhere.EVERYWHERE, options.getSSAOptions()); } + @Override public int getNumberOfStatements(CGNode node) { IR ir = getIR(node); return (ir == null) ? -1 : ir.getInstructions().length; @@ -55,6 +57,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter return false; } + @Override public ControlFlowGraph getCFG(CGNode N) { IR ir = getIR(N); if (ir == null) { @@ -64,6 +67,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter } } + @Override public DefUse getDU(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java index 2d06e1f25..5a2e5cf7e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java @@ -31,6 +31,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { public DefaultPointerKeyFactory() { } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { if (valueNumber <= 0) { throw new IllegalArgumentException("illegal value number: " + valueNumber + " in " + node); @@ -38,6 +39,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new LocalPointerKey(node, valueNumber); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { if (filter == null) { throw new IllegalArgumentException("null filter"); @@ -47,14 +49,17 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new LocalPointerKeyWithFilter(node, valueNumber, filter); } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return new ReturnValueKey(node); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return new ExceptionReturnValueKey(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { if (f == null) { throw new IllegalArgumentException("null f"); @@ -62,6 +67,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new StaticFieldKey(f); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { if (field == null) { throw new IllegalArgumentException("field is null"); @@ -69,6 +75,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new InstanceFieldKey(I, field); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return new ArrayContentsKey(I); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java index 80cc3c7b3..cd1b84605 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java @@ -51,10 +51,12 @@ public class DefaultSSAInterpreter extends DefaultRTAInterpreter implements SSAC } + @Override public IR getIR(CGNode node) { return getCFAInterpreter(node).getIR(node); } + @Override public int getNumberOfStatements(CGNode node) { return getCFAInterpreter(node).getNumberOfStatements(node); } @@ -75,10 +77,12 @@ public class DefaultSSAInterpreter extends DefaultRTAInterpreter implements SSAC return false; } + @Override public ControlFlowGraph getCFG(CGNode N) { return getCFAInterpreter(N).getCFG(N); } + @Override public DefUse getDU(CGNode node) { return getCFAInterpreter(node).getDU(node); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java index 4caaf7beb..6b737b1c3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java @@ -44,6 +44,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr } } + @Override public IR getIR(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -54,6 +55,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr return B.getIR(node); } + @Override public int getNumberOfStatements(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -79,6 +81,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr return result; } + @Override public ControlFlowGraph getCFG(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -89,6 +92,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr return B.getCFG(node); } + @Override public DefUse getDU(CGNode node) { if (A != null) { if (A.understands(node)) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java index 69edb36f3..4dd136be3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java @@ -37,6 +37,7 @@ public class OneLevelSiteContextSelector implements ContextSelector { this.baseSelector = baseSelector; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (baseContext.equals(Everywhere.EVERYWHERE)) { @@ -46,6 +47,7 @@ public class OneLevelSiteContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return baseSelector.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java index 982ff75e8..03c9ed271 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java @@ -181,6 +181,7 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { return (policy & CONSTANT_SPECIFIC) > 0; } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { if (allocation == null) { throw new IllegalArgumentException("allocation is null"); @@ -246,6 +247,7 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { return count; } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { if (allocationPolicy()) { return siteBased.getInstanceKeyForMultiNewArray(node, allocation, dim); @@ -254,6 +256,7 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (type == null) { throw new IllegalArgumentException("null type"); @@ -273,10 +276,12 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { * @see com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory#getInstanceKeyForPEI(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.ProgramCounter, com.ibm.wala.types.TypeReference) */ + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter pei, TypeReference type) { return classBased.getInstanceKeyForPEI(node, pei, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return classBased.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java index 5f24d36f8..daa08fa9d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java @@ -149,6 +149,7 @@ public class BasicRTABuilder extends AbstractRTABuilder { System.err.println(("filtered value: " + value)); } IntSetAction action = new IntSetAction() { + @Override public void act(int ptr) { if (DEBUG) { System.err.println((" dispatch to ptr " + ptr)); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java index 901c6743f..c4727faef 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java @@ -13,7 +13,6 @@ package com.ibm.wala.ipa.callgraph.propagation.rta; import java.util.Iterator; -import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.CodeScanner; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; @@ -40,6 +39,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv return analysisCache; } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -53,6 +53,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv } } + @Override public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -66,6 +67,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv } } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -79,6 +81,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv } } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java index f9344d3cc..bf78234cb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java @@ -52,6 +52,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { } } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -59,6 +60,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateNewSites(node); } + @Override public Iterator iterateCallSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -66,6 +68,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateCallSites(node); } + @Override public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -73,6 +76,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateFieldsRead(node); } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -80,10 +84,12 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateFieldsWritten(node); } + @Override public boolean understands(CGNode node) { return true; } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java index 118ef6329..2ee25879b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java @@ -35,6 +35,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { } } + @Override public boolean understands(CGNode node) { if (A != null) { return A.understands(node) || B.understands(node); @@ -43,6 +44,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { } } + @Override public Iterator iterateNewSites(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -53,6 +55,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateNewSites(node); } + @Override public Iterator iterateCallSites(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -63,6 +66,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateCallSites(node); } + @Override public Iterator iterateFieldsRead(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -73,6 +77,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateFieldsRead(node); } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -83,6 +88,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateFieldsWritten(node); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { boolean result = false; if (A != null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java index a9dbdb57d..a2844d8e8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java @@ -174,6 +174,7 @@ public class TypeBasedHeapModel implements HeapModel { return result; } + @Override @SuppressWarnings("unchecked") public Iterator iteratePointerKeys() { initAllPKeys(); @@ -185,18 +186,22 @@ public class TypeBasedHeapModel implements HeapModel { }).iterator(); } + @Override public IClassHierarchy getClassHierarchy() { return iKeyFactory.getClassHierarchy(); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) throws UnimplementedError { return iKeyFactory.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) throws UnimplementedError { return iKeyFactory.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return iKeyFactory.getInstanceKeyForConstant(type, S); } @@ -206,11 +211,13 @@ public class TypeBasedHeapModel implements HeapModel { return null; } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -222,6 +229,7 @@ public class TypeBasedHeapModel implements HeapModel { * * @see com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForLocal(com.ibm.wala.ipa.callgraph.CGNode, int) */ + @Override public FilteredPointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { initPKeysForNode(node); PointerKey p = pointerKeys.getPointerKeyForLocal(node, valueNumber); @@ -250,28 +258,34 @@ public class TypeBasedHeapModel implements HeapModel { } } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return pointerKeys.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return pointerKeys.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return pointerKeys.getPointerKeyForStaticField(f); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { return pointerKeys.getPointerKeyForInstanceField(I, field); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return pointerKeys.getPointerKeyForArrayContents(I); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java index e0da1ed9c..8e8a3b5ec 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java @@ -83,6 +83,7 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis { return new TypeBasedPointerAnalysis(options, klasses, cg); } + @Override public OrdinalSet getPointsToSet(PointerKey key) throws IllegalArgumentException { if (key == null) { throw new IllegalArgumentException("key == null"); @@ -169,18 +170,22 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis { } } + @Override public HeapModel getHeapModel() { return heapModel; } + @Override public Collection getPointerKeys() { return Iterator2Collection.toSet(heapModel.iteratePointerKeys()); } + @Override public boolean isFiltered(PointerKey pk) { return false; } + @Override public IClassHierarchy getClassHierarchy() { return heapModel.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java index fb33cbe30..c16e6bd25 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java @@ -390,6 +390,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.Graph#removeNodeAndEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(BasicBlockInContext N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -397,6 +398,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#iterateNodes() */ + @Override public Iterator> iterator() { if (WARN_ON_EAGER_CONSTRUCTION) { System.err.println("WARNING: forcing full ICFG construction by calling iterator()"); @@ -411,6 +413,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { if (WARN_ON_EAGER_CONSTRUCTION) { System.err.println("WARNING: forcing full ICFG construction by calling getNumberOfNodes()"); @@ -537,6 +540,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(BasicBlockInContext n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -544,6 +548,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(BasicBlockInContext n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -551,6 +556,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator> getPredNodes(BasicBlockInContext N) { initForPred(N); return g.getPredNodes(N); @@ -595,6 +601,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(BasicBlockInContext N) { initForPred(N); return g.getPredNodeCount(N); @@ -603,6 +610,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator> getSuccNodes(BasicBlockInContext N) { initForSucc(N); return g.getSuccNodes(N); @@ -611,6 +619,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(BasicBlockInContext N) { initForSucc(N); return g.getSuccNodeCount(N); @@ -619,10 +628,12 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, com.ibm.wala.util.graph.Node) */ + @Override public void addEdge(BasicBlockInContext src, BasicBlockInContext dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(BasicBlockInContext src, BasicBlockInContext dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -630,6 +641,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(BasicBlockInContext node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -642,6 +654,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.Graph#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(BasicBlockInContext N) { return g.containsNode(N); } @@ -709,14 +722,17 @@ public abstract class AbstractInterproceduralCFG imple return site; } + @Override public void removeIncomingEdges(BasicBlockInContext node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(BasicBlockInContext node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public boolean hasEdge(BasicBlockInContext src, BasicBlockInContext dst) { if (!addedSuccs.contains(getNumber(src))) { if (!src.getNode().equals(dst.getNode())) { @@ -747,15 +763,18 @@ public abstract class AbstractInterproceduralCFG imple return g.hasEdge(src, dst); } + @Override public int getNumber(BasicBlockInContext N) { addNodeForBasicBlockIfNeeded(N); return g.getNumber(N); } + @Override public BasicBlockInContext getNode(int number) throws UnimplementedError { return g.getNode(number); } + @Override public int getMaxNumber() { if (WARN_ON_EAGER_CONSTRUCTION) { System.err.println("WARNING: forcing full ICFG construction by calling getMaxNumber()"); @@ -767,16 +786,19 @@ public abstract class AbstractInterproceduralCFG imple return g.getMaxNumber(); } + @Override public Iterator> iterateNodes(IntSet s) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getSuccNodeNumbers(BasicBlockInContext node) { initForSucc(node); return g.getSuccNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(BasicBlockInContext node) { initForPred(node); return g.getPredNodeNumbers(node); @@ -812,6 +834,7 @@ public abstract class AbstractInterproceduralCFG imple // a successor node is a return site if it is in the same // procedure, and is not the entry() node. Filter isReturn = new Filter() { + @Override public boolean accepts(Object o) { BasicBlockInContext other = (BasicBlockInContext) o; return !other.isEntryBlock() && node.equals(other.getNode()); @@ -833,6 +856,7 @@ public abstract class AbstractInterproceduralCFG imple final CGNode node = returnBlock.getNode(); Filter dispatchFilter = new Filter() { + @Override public boolean accepts(T callBlock) { BasicBlockInContext bb = new BasicBlockInContext(node, callBlock); if (!hasCall(bb, cfg)) { @@ -848,6 +872,7 @@ public abstract class AbstractInterproceduralCFG imple it = new FilterIterator(it, dispatchFilter); Function> toContext = new Function>() { + @Override public BasicBlockInContext apply(T object) { T b = object; return new BasicBlockInContext(node, b); @@ -858,6 +883,7 @@ public abstract class AbstractInterproceduralCFG imple } private final Filter> isCall = new Filter>() { + @Override public boolean accepts(BasicBlockInContext o) { return hasCall(o); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java index d58d94a40..787cb7d46 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java @@ -40,6 +40,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getFirstInstructionIndex() */ + @Override public int getFirstInstructionIndex() { return delegate.getFirstInstructionIndex(); } @@ -47,6 +48,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getLastInstructionIndex() */ + @Override public int getLastInstructionIndex() { return delegate.getLastInstructionIndex(); } @@ -54,6 +56,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#iterateAllInstructions() */ + @Override public Iterator iterator() { return delegate.iterator(); } @@ -61,6 +64,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getMethod() */ + @Override public IMethod getMethod() { return delegate.getMethod(); } @@ -68,6 +72,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getNumber() */ + @Override public int getNumber() { return delegate.getNumber(); } @@ -75,6 +80,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#isCatchBlock() */ + @Override public boolean isCatchBlock() { return delegate.isCatchBlock(); } @@ -82,6 +88,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#isEntryBlock() */ + @Override public boolean isEntryBlock() { return delegate.isEntryBlock(); } @@ -89,6 +96,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#isExitBlock() */ + @Override public boolean isExitBlock() { return delegate.isExitBlock(); } @@ -137,18 +145,22 @@ public final class BasicBlockInContext extends NodeWit return delegate.toString(); } + @Override public Iterator getCaughtExceptionTypes() { return delegate.getCaughtExceptionTypes(); } + @Override public SSAInstruction getLastInstruction() { return delegate.getLastInstruction(); } + @Override public Iterator iteratePhis() { return delegate.iteratePhis(); } + @Override public Iterator iteratePis() { return delegate.iteratePis(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java index 6af6a3c33..d56bd172a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java @@ -25,10 +25,12 @@ public class ExceptionPrunedCFG { this.cfg = cfg; } + @Override public boolean hasNormalEdge(T src, T dst) { return cfg.getNormalSuccessors(src).contains(dst); } + @Override public boolean hasExceptionalEdge(T src, T dst) { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java index 4cd6d34d4..5a33e751a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java @@ -70,6 +70,7 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getExceptionalSuccessors(final T N) { return new FilterIterator(cfg.getExceptionalSuccessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasExceptionalEdge(N, o); } @@ -78,6 +79,7 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getNormalSuccessors(final T N) { return new FilterIterator(cfg.getNormalSuccessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasNormalEdge(N, o); } @@ -86,6 +88,7 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getExceptionalPredecessors(final T N) { return new FilterIterator(cfg.getExceptionalPredecessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasExceptionalEdge(o, N); } @@ -94,24 +97,29 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getNormalPredecessors(final T N) { return new FilterIterator(cfg.getNormalPredecessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasNormalEdge(o, N); } }); } + @Override public Iterator getSuccNodes(final T N) { return new FilterIterator(cfg.getSuccNodes(N), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && (filter.hasNormalEdge(N, o) || filter.hasExceptionalEdge(N, o)); } }); } + @Override public int getSuccNodeCount(T N) { return Iterator2Collection.toSet(getSuccNodes(N)).size(); } + @Override public IntSet getSuccNodeNumbers(T N) { MutableIntSet bits = IntSetUtil.make(); for (Iterator EE = getSuccNodes(N); EE.hasNext();) { @@ -121,18 +129,22 @@ public class PrunedCFG> extends AbstractNumberedGrap return bits; } + @Override public Iterator getPredNodes(final T N) { return new FilterIterator(cfg.getPredNodes(N), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && (filter.hasNormalEdge(o, N) || filter.hasExceptionalEdge(o, N)); } }); } + @Override public int getPredNodeCount(T N) { return Iterator2Collection.toSet(getPredNodes(N)).size(); } + @Override public IntSet getPredNodeNumbers(T N) { MutableIntSet bits = IntSetUtil.make(); for (Iterator EE = getPredNodes(N); EE.hasNext();) { @@ -142,6 +154,7 @@ public class PrunedCFG> extends AbstractNumberedGrap return bits; } + @Override public boolean hasEdge(T src, T dst) { for (Iterator EE = getSuccNodes(src); EE.hasNext();) { if (EE.next().equals(dst)) { @@ -152,22 +165,27 @@ public class PrunedCFG> extends AbstractNumberedGrap return false; } + @Override public void addEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeAllIncidentEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(T node) { throw new UnsupportedOperationException(); } @@ -183,6 +201,7 @@ public class PrunedCFG> extends AbstractNumberedGrap this.subset = subset; } + @Override public int getNumber(T N) { if (subset.contains(N)) return nodes.getNumber(N); @@ -190,6 +209,7 @@ public class PrunedCFG> extends AbstractNumberedGrap return -1; } + @Override public T getNode(int number) { T N = nodes.getNode(number); if (subset.contains(N)) @@ -198,6 +218,7 @@ public class PrunedCFG> extends AbstractNumberedGrap throw new NoSuchElementException(); } + @Override public int getMaxNumber() { int max = -1; for (Iterator NS = nodes.iterator(); NS.hasNext();) { @@ -212,32 +233,39 @@ public class PrunedCFG> extends AbstractNumberedGrap private Iterator filterNodes(Iterator nodeIterator) { return new FilterIterator(nodeIterator, new Filter() { + @Override public boolean accepts(Object o) { return subset.contains(o); } }); } + @Override public Iterator iterateNodes(IntSet s) { return filterNodes(nodes.iterateNodes(s)); } + @Override public Iterator iterator() { return filterNodes(nodes.iterator()); } + @Override public int getNumberOfNodes() { return subset.size(); } + @Override public void addNode(T n) { throw new UnsupportedOperationException(); } + @Override public void removeNode(T n) { throw new UnsupportedOperationException(); } + @Override public boolean containsNode(T N) { return subset.contains(N); } @@ -283,6 +311,7 @@ public class PrunedCFG> extends AbstractNumberedGrap return edges; } + @Override public List getExceptionalSuccessors(final T N) { ArrayList result = new ArrayList(); for (Iterator it = edges.getExceptionalSuccessors(N); it.hasNext();) { @@ -291,42 +320,52 @@ public class PrunedCFG> extends AbstractNumberedGrap return result; } + @Override public Collection getNormalSuccessors(final T N) { return Iterator2Collection.toSet(edges.getNormalSuccessors(N)); } + @Override public Collection getExceptionalPredecessors(final T N) { return Iterator2Collection.toSet(edges.getExceptionalPredecessors(N)); } + @Override public Collection getNormalPredecessors(final T N) { return Iterator2Collection.toSet(edges.getNormalPredecessors(N)); } + @Override public T entry() { return cfg.entry(); } + @Override public T exit() { return cfg.exit(); } + @Override public T getBlockForInstruction(int index) { return cfg.getBlockForInstruction(index); } + @Override public I[] getInstructions() { return cfg.getInstructions(); } + @Override public int getProgramCounter(int index) { return cfg.getProgramCounter(index); } + @Override public IMethod getMethod() { return cfg.getMethod(); } + @Override public BitVector getCatchBlocks() { BitVector result = new BitVector(); BitVector blocks = cfg.getCatchBlocks(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java index 231e6e773..7da559fa6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java @@ -290,6 +290,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return true if the add succeeded; false if it failed for some reason * @throws IllegalArgumentException if klass is null */ + @Override public boolean addClass(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -389,6 +390,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the set of IMethods that this call can resolve to. * @throws IllegalArgumentException if ref is null */ + @Override public Set getPossibleTargets(MethodReference ref) { if (ref == null) { throw new IllegalArgumentException("ref is null"); @@ -437,6 +439,7 @@ public class ClassHierarchy implements IClassHierarchy { * @param ref method reference * @return the set of IMethods that this call can resolve to. */ + @Override public Set getPossibleTargets(IClass declaredClass, MethodReference ref) { if (ref.getName().equals(MethodReference.initAtom)) { @@ -504,6 +507,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return IMethod, or null if no appropriate receiver is found. * @throws IllegalArgumentException if m is null */ + @Override public IMethod resolveMethod(MethodReference m) { if (m == null) { throw new IllegalArgumentException("m is null"); @@ -520,6 +524,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the canonical IField that represents a given field , or null if none found * @throws IllegalArgumentException if f is null */ + @Override public IField resolveField(FieldReference f) { if (f == null) { throw new IllegalArgumentException("f is null"); @@ -536,6 +541,7 @@ public class ClassHierarchy implements IClassHierarchy { * @throws IllegalArgumentException if f is null * @throws IllegalArgumentException if klass is null */ + @Override public IField resolveField(IClass klass, FieldReference f) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -554,6 +560,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return Method resolved method abstraction * @throws IllegalArgumentException if receiverClass is null */ + @Override public IMethod resolveMethod(IClass receiverClass, Selector selector) { if (receiverClass == null) { throw new IllegalArgumentException("receiverClass is null"); @@ -723,6 +730,7 @@ public class ClassHierarchy implements IClassHierarchy { } + @Override public ClassLoaderFactory getFactory() { return factory; } @@ -730,6 +738,7 @@ public class ClassHierarchy implements IClassHierarchy { /** * @throws IllegalArgumentException if A is null */ + @Override public IClass getLeastCommonSuperclass(IClass a, IClass b) { assert (a.getClassLoader().getLanguage().equals(b.getClassLoader().getLanguage())); Language lang = a.getClassLoader().getLanguage(); @@ -791,6 +800,7 @@ public class ClassHierarchy implements IClassHierarchy { * @see com.ibm.wala.ipa.cha.IClassHierarchy#getLeastCommonSuperclass(com.ibm.wala.types.TypeReference, * com.ibm.wala.types.TypeReference) */ + @Override public TypeReference getLeastCommonSuperclass(TypeReference a, TypeReference b) { if (a == null) { throw new IllegalArgumentException("a is null"); @@ -818,6 +828,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the {@link IClass} for a if found; null if can't find the class. * @throws IllegalArgumentException if A is null */ + @Override public IClass lookupClass(TypeReference a) { if (a == null) { throw new IllegalArgumentException("a is null"); @@ -878,6 +889,7 @@ public class ClassHierarchy implements IClassHierarchy { * * @throws IllegalArgumentException if c is null */ + @Override public boolean isSubclassOf(IClass c, IClass t) { if (c == null) { throw new IllegalArgumentException("c is null"); @@ -943,6 +955,7 @@ public class ClassHierarchy implements IClassHierarchy { * * @return true iff i is an interface and c is a class that implements i, or c is an interface that extends i. */ + @Override public boolean implementsInterface(IClass c, IClass i) { if (i == null) { throw new IllegalArgumentException("Cannot ask implementsInterface with i == null"); @@ -970,6 +983,7 @@ public class ClassHierarchy implements IClassHierarchy { /** * Return set of all subclasses of type in the Class Hierarchy TODO: Tune this implementation. Consider caching if necessary. */ + @Override public Collection computeSubClasses(TypeReference type) { IClass t = lookupClass(type); if (t == null) { @@ -996,6 +1010,7 @@ public class ClassHierarchy implements IClassHierarchy { * * kind of ugly. a better scheme? */ + @Override public Collection getJavaLangErrorTypes() { if (subTypeRefsOfError == null) { computeSubClasses(TypeReference.JavaLangError); @@ -1013,6 +1028,7 @@ public class ClassHierarchy implements IClassHierarchy { * * kind of ugly. a better scheme? */ + @Override public Collection getJavaLangRuntimeExceptionTypes() { if (runtimeExceptionTypeRefs == null) { computeSubClasses(TypeReference.JavaLangRuntimeException); @@ -1045,6 +1061,7 @@ public class ClassHierarchy implements IClassHierarchy { return result; } + @Override public boolean isInterface(TypeReference type) { IClass T = lookupClass(type); assert T != null : "Null lookup for " + type; @@ -1057,6 +1074,7 @@ public class ClassHierarchy implements IClassHierarchy { * @param type an interface * @return Set of IClass that represent implementors of the interface */ + @Override public Set getImplementors(TypeReference type) { IClass T = lookupClass(type); Set result = implementors.get(T); @@ -1066,8 +1084,10 @@ public class ClassHierarchy implements IClassHierarchy { return Collections.unmodifiableSet(result); } + @Override public Iterator iterator() { Function toClass = new Function() { + @Override public IClass apply(Node n) { return n.klass; } @@ -1078,14 +1098,17 @@ public class ClassHierarchy implements IClassHierarchy { /** * @return The number of classes present in the class hierarchy. */ + @Override public int getNumberOfClasses() { return map.keySet().size(); } + @Override public IClassLoader[] getLoaders() { return loaders; } + @Override public IClassLoader getLoader(ClassLoaderReference loaderRef) { for (int i = 0; i < loaders.length; i++) { if (loaders[i].getReference().equals(loaderRef)) { @@ -1096,6 +1119,7 @@ public class ClassHierarchy implements IClassHierarchy { return null; } + @Override public AnalysisScope getScope() { return scope; } @@ -1104,6 +1128,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the number of classes that immediately extend klass. if klass is an array class A[][]...[], we return number of * immediate subclasses of A. If A is primitive, we return 0. */ + @Override public int getNumberOfImmediateSubclasses(IClass klass) { if (klass.isArrayClass()) { IClass innermost = getInnermostTypeOfArrayClass(klass); @@ -1118,11 +1143,13 @@ public class ClassHierarchy implements IClassHierarchy { * @return the classes that immediately extend klass. if klass is an array class A[][]...[], we return array classes B[][]...[] * (same dimensionality) where B is an immediate subclass of A. If A is primitive, we return the empty set. */ + @Override public Collection getImmediateSubclasses(IClass klass) { if (klass.isArrayClass()) { return getImmediateArraySubclasses((ArrayClass)klass); } Function node2Class = new Function() { + @Override public IClass apply(Node n) { return n.klass; } @@ -1219,10 +1246,12 @@ public class ClassHierarchy implements IClassHierarchy { return new ClassHierarchy(scope, factory, language, monitor); } + @Override public IClass getRootClass() { return root.getJavaClass(); } + @Override public boolean isRootClass(IClass c) throws IllegalArgumentException { if (c == null) { throw new IllegalArgumentException("c == null"); @@ -1230,6 +1259,7 @@ public class ClassHierarchy implements IClassHierarchy { return c.equals(root.getJavaClass()); } + @Override public int getNumber(IClass c) { return map.get(c.getReference()).left; } @@ -1267,6 +1297,7 @@ public class ClassHierarchy implements IClassHierarchy { * @throws IllegalArgumentException if c1 is null * @throws IllegalArgumentException if c2 is null */ + @Override public boolean isAssignableFrom(IClass c1, IClass c2) { if (c2 == null) { throw new IllegalArgumentException("c2 is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java index 91cedd96c..dbfd755b7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java @@ -38,30 +38,37 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { this.h = h; } + @Override public IClassHierarchy getClassHierarchy() { return h.getClassHierarchy(); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { return h.getFilteredPointerKeyForLocal(node, valueNumber, filter); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return h.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return h.getInstanceKeyForClassObject(type); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { return h.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return h.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { if (node == null) { throw new IllegalArgumentException("null node"); @@ -69,6 +76,7 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { return h.getInstanceKeyForPEI(node, instr, type); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { if (I == null) { throw new IllegalArgumentException("I is null"); @@ -76,10 +84,12 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { return h.getPointerKeyForArrayContents(I); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return h.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { if (field == null) { throw new IllegalArgumentException("field is null"); @@ -87,22 +97,27 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { return h.getPointerKeyForInstanceField(I, field); } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { return h.getPointerKeyForLocal(node, valueNumber); } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return h.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return h.getPointerKeyForStaticField(f); } + @Override public Iterator iteratePointerKeys() { return h.iteratePointerKeys(); } + @Override public PointerKey getPointerKeyForArrayLength(InstanceKey I) { return new ArrayLengthKey(I); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java index 138c30eef..07e2d1e72 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java @@ -61,10 +61,12 @@ public class GenReach extends BitVectorFramework { this.gen = gen; } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(T node) { BitVector v = getGen(node); return new BitVectorUnionVector(v); @@ -83,14 +85,17 @@ public class GenReach extends BitVectorFramework { } } + @Override public boolean hasEdgeTransferFunctions() { return false; } + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public UnaryOperator getEdgeTransferFunction(T src, T dst) { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java index f20c98037..a5e1072d2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java @@ -105,6 +105,7 @@ public class ModRef { return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>() { + @Override public Collection apply(CGNode n) { return scanNodeForMod(n, pa, heapExclude); } @@ -120,6 +121,7 @@ public class ModRef { private Map> scanForRef(CallGraph cg, final PointerAnalysis pa, final HeapExclusions heapExclude) { return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>() { + @Override public Collection apply(CGNode n) { return scanNodeForRef(n, pa, heapExclude); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java index 580281ea8..079d192ad 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java @@ -23,6 +23,7 @@ public class ExceptionalReturnCaller extends StatementWithInstructionIndex imple super(node, callIndex); } + @Override public int getValueNumber() { return getInstruction().getException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java index 86015509f..56c20c607 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java @@ -214,21 +214,25 @@ public class HeapReachingDefs { return delegate.toString(); } + @Override public void clear() { Assertions.UNREACHABLE(); delegate.clear(); } + @Override public boolean containsKey(Object key) { Assertions.UNREACHABLE(); return delegate.containsKey(key); } + @Override public boolean containsValue(Object value) { Assertions.UNREACHABLE(); return delegate.containsValue(value); } + @Override public Set>> entrySet() { Assertions.UNREACHABLE(); return delegate.entrySet(); @@ -240,6 +244,7 @@ public class HeapReachingDefs { return delegate.equals(o); } + @Override public OrdinalSet get(Object key) { return delegate.get(key); } @@ -250,35 +255,42 @@ public class HeapReachingDefs { return delegate.hashCode(); } + @Override public boolean isEmpty() { Assertions.UNREACHABLE(); return delegate.isEmpty(); } + @Override public Set keySet() { return delegate.keySet(); } + @Override public OrdinalSet put(Statement key, OrdinalSet value) { Assertions.UNREACHABLE(); return delegate.put(key, value); } + @Override public void putAll(Map> t) { Assertions.UNREACHABLE(); delegate.putAll(t); } + @Override public OrdinalSet remove(Object key) { Assertions.UNREACHABLE(); return delegate.remove(key); } + @Override public int size() { Assertions.UNREACHABLE(); return delegate.size(); } + @Override public Collection> values() { Assertions.UNREACHABLE(); return delegate.values(); @@ -505,6 +517,7 @@ public class HeapReachingDefs { } } + @Override public UnaryOperator getEdgeTransferFunction(IExplodedBasicBlock src, IExplodedBasicBlock dst) { if (DEBUG) { System.err.println("getEdgeXfer: " + src + " " + dst + " " + src.isEntryBlock()); @@ -546,18 +559,22 @@ public class HeapReachingDefs { } } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(IExplodedBasicBlock node) { return null; } + @Override public boolean hasEdgeTransferFunctions() { return true; } + @Override public boolean hasNodeTransferFunctions() { return false; } @@ -627,6 +644,7 @@ public class HeapReachingDefs { } else { // only static fields are actually killed Filter staticFilter = new Filter() { + @Override public boolean accepts(Object o) { return o instanceof StaticFieldKey; } @@ -638,6 +656,7 @@ public class HeapReachingDefs { } else { Filter f = new Filter() { // accept any statement which writes a killed location. + @Override public boolean accepts(Object o) { Statement s = (Statement) o; Collection m = getMod(s, node, h, pa, exclusions); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java index 7a2eed40a..3bdc8cfda 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java @@ -23,6 +23,7 @@ public class NormalReturnCaller extends StatementWithInstructionIndex implements super(node, callIndex); } + @Override public int getValueNumber() { return getInstruction().getReturnValue(0); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java index 271052848..a10b5afa2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java @@ -661,6 +661,7 @@ public class PDG implements NumberedGraph { // in reaching defs calculation, exclude heap statements that are // irrelevant. Filter f = new Filter() { + @Override public boolean accepts(Object o) { if (o instanceof HeapStatement) { HeapStatement h = (HeapStatement) o; @@ -753,6 +754,7 @@ public class PDG implements NumberedGraph { */ private Collection computeReturnStatements(final IR ir) { Filter filter = new Filter() { + @Override public boolean accepts(Object o) { if (o instanceof NormalStatement) { NormalStatement s = (NormalStatement) o; @@ -1073,12 +1075,14 @@ public class PDG implements NumberedGraph { return 103 * node.hashCode(); } + @Override public int getPredNodeCount(Statement N) throws UnimplementedError { populate(); Assertions.UNREACHABLE(); return delegate.getPredNodeCount(N); } + @Override public Iterator getPredNodes(Statement N) { populate(); if (!dOptions.isIgnoreHeap()) { @@ -1127,12 +1131,14 @@ public class PDG implements NumberedGraph { } } + @Override public int getSuccNodeCount(Statement N) throws UnimplementedError { populate(); Assertions.UNREACHABLE(); return delegate.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(Statement N) { populate(); if (!dOptions.isIgnoreHeap()) { @@ -1141,83 +1147,101 @@ public class PDG implements NumberedGraph { return delegate.getSuccNodes(N); } + @Override public boolean hasEdge(Statement src, Statement dst) throws UnimplementedError { populate(); return delegate.hasEdge(src, dst); } + @Override public void removeNodeAndEdges(Statement N) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void addNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(Statement N) { populate(); return delegate.containsNode(N); } + @Override public int getNumberOfNodes() { populate(); return delegate.getNumberOfNodes(); } + @Override public Iterator iterator() { populate(); return delegate.iterator(); } + @Override public void removeNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(Statement node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Statement src, Statement dst) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Statement node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Statement node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public int getMaxNumber() { populate(); return delegate.getMaxNumber(); } + @Override public Statement getNode(int number) { populate(); return delegate.getNode(number); } + @Override public int getNumber(Statement N) { populate(); return delegate.getNumber(N); } + @Override public Iterator iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getSuccNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java index 4ef8cb584..ec8b7f87f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java @@ -31,6 +31,7 @@ public class ParamCallee extends Statement implements ValueNumberCarrier { return Kind.PARAM_CALLEE; } + @Override public int getValueNumber() { return valueNumber; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java index 430d27636..52570bf57 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java @@ -42,6 +42,7 @@ public class ParamCaller extends StatementWithInstructionIndex implements ValueN return super.toString() + " v" + getValueNumber(); } + @Override public int getValueNumber() { return valueNumber; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java index 5b803736a..9eabeca12 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java @@ -26,6 +26,7 @@ public class ReachabilityFunctions implements IFlowFunctionMap { public final static VectorGenFlowFunction FLOW_REACHES = VectorGenFlowFunction.make(SparseIntSet.singleton(0)); public final static IUnaryFlowFunction KILL_FLOW = new IUnaryFlowFunction() { + @Override public SparseIntSet getTargets(int d1) { // kill even the reachability predicate 0. return new SparseIntSet(); @@ -46,19 +47,23 @@ public class ReachabilityFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getCallNoneToReturnFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(T src, T dest) { return FLOW_REACHES; } + @Override public IUnaryFlowFunction getCallToReturnFlowFunction(T src, T dest) { // force flow into callee and back. return KILL_FLOW; } + @Override public IUnaryFlowFunction getNormalFlowFunction(T src, T dest) { return FLOW_REACHES; } + @Override public IFlowFunction getReturnFlowFunction(T call, T src, T dest) { return FLOW_REACHES; } @@ -67,6 +72,7 @@ public class ReachabilityFunctions implements IFlowFunctionMap { return FLOW_REACHES; } + @Override public IUnaryFlowFunction getCallFlowFunction(T src, T dest, T ret) { return FLOW_REACHES; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java index 6ad7b1e5a..9f6fdd8e9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java @@ -199,6 +199,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { * iterate over the nodes without constructing any new ones. Use with extreme care. May break graph traversals that * lazily add more nodes. */ + @Override public Iterator iterateLazyNodes() { return nodeMgr.iterateLazyNodes(); } @@ -279,14 +280,17 @@ public class SDG extends AbstractNumberedGraph implements ISDG { } private class Edges implements NumberedEdgeManager { + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(Statement N) { return IteratorUtil.count(getPredNodes(N)); } + @Override public Iterator getPredNodes(Statement N) { if (dOptions.isIgnoreExceptions()) { assert !N.getKind().equals(Kind.EXC_RET_CALLEE); @@ -441,10 +445,12 @@ public class SDG extends AbstractNumberedGraph implements ISDG { } } + @Override public int getSuccNodeCount(Statement N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public Iterator getSuccNodes(Statement N) { if (dOptions.isTerminateAtCast() && isUninformativeForReflection(N.getNode())) { return EmptyIterator.instance(); @@ -607,6 +613,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return false; } + @Override public boolean hasEdge(Statement src, Statement dst) { addPDGStatementNodes(src.getNode()); addPDGStatementNodes(dst.getNode()); @@ -723,26 +730,31 @@ public class SDG extends AbstractNumberedGraph implements ISDG { } } + @Override public void removeAllIncidentEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public IntSet getPredNodeNumbers(Statement node) { // TODO: optimize me. MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); @@ -753,6 +765,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return result; } + @Override public IntSet getSuccNodeNumbers(Statement node) { // TODO: optimize me. MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); @@ -774,6 +787,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return nodeMgr; } + @Override public PDG getPDG(CGNode node) { PDG result = pdgMap.get(node); if (result == null) { @@ -787,6 +801,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return result; } + @Override public ControlDependenceOptions getCOptions() { return cOptions; } @@ -799,6 +814,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return cg; } + @Override public IClassHierarchy getClassHierarchy() { return cg.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java index dc9ff6cb0..b4a94f77f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java @@ -40,6 +40,7 @@ class SDGSupergraph implements ISupergraph { this.backward = backward; } + @Override public Graph getProcedureGraph() { Assertions.UNREACHABLE(); return null; @@ -53,6 +54,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#classifyEdge(java.lang.Object, java.lang.Object) */ + @Override public byte classifyEdge(Statement src, Statement dest) { Assertions.UNREACHABLE(); return 0; @@ -61,6 +63,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCallSites(java.lang.Object) */ + @Override public Iterator getCallSites(Statement r, PDG callee) { switch (r.getKind()) { case EXC_RET_CALLER: { @@ -90,10 +93,12 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCalledNodes(java.lang.Object) */ + @Override public Iterator getCalledNodes(Statement call) { switch (call.getKind()) { case NORMAL: Filter f = new Filter() { + @Override public boolean accepts(Object o) { Statement s = (Statement) o; return isEntry(s); @@ -112,6 +117,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getEntriesForProcedure(java.lang.Object) */ + @Override public Statement[] getEntriesForProcedure(PDG procedure) { Statement[] normal = procedure.getParamCalleeStatements(); Statement[] result = new Statement[normal.length + 1]; @@ -123,6 +129,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getExitsForProcedure(java.lang.Object) */ + @Override public Statement[] getExitsForProcedure(PDG procedure) { Statement[] normal = procedure.getReturnStatements(); Statement[] result = new Statement[normal.length + 1]; @@ -134,6 +141,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlock(java.lang.Object, int) */ + @Override public Statement getLocalBlock(PDG procedure, int i) { return procedure.getNode(i); } @@ -141,6 +149,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlockNumber(java.lang.Object) */ + @Override public int getLocalBlockNumber(Statement n) { PDG pdg = getProcOf(n); return pdg.getNumber(n); @@ -149,6 +158,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getNormalSuccessors(java.lang.Object) */ + @Override public Iterator getNormalSuccessors(Statement call) { if (!backward) { return EmptyIterator.instance(); @@ -161,6 +171,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getNumberOfBlocks(java.lang.Object) */ + @Override public int getNumberOfBlocks(PDG procedure) { Assertions.UNREACHABLE(); return 0; @@ -169,6 +180,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getProcOf(java.lang.Object) */ + @Override public PDG getProcOf(Statement n) { CGNode node = n.getNode(); PDG result = sdg.getPDG(node); @@ -181,6 +193,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getReturnSites(java.lang.Object) */ + @Override public Iterator getReturnSites(Statement call, PDG callee) { switch (call.getKind()) { case PARAM_CALLER: { @@ -210,6 +223,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isCall(java.lang.Object) */ + @Override public boolean isCall(Statement n) { switch (n.getKind()) { case EXC_RET_CALLEE: @@ -242,6 +256,7 @@ class SDGSupergraph implements ISupergraph { } } + @Override public boolean isEntry(Statement n) { switch (n.getKind()) { case PARAM_CALLEE: @@ -267,6 +282,7 @@ class SDGSupergraph implements ISupergraph { } } + @Override public boolean isExit(Statement n) { switch (n.getKind()) { case PARAM_CALLEE: @@ -293,6 +309,7 @@ class SDGSupergraph implements ISupergraph { } } + @Override public boolean isReturn(Statement n) { switch (n.getKind()) { case EXC_RET_CALLER: @@ -318,98 +335,119 @@ class SDGSupergraph implements ISupergraph { } } + @Override public void removeNodeAndEdges(Statement N) { Assertions.UNREACHABLE(); } + @Override public void addNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(Statement N) { return sdg.containsNode(N); } + @Override public int getNumberOfNodes() { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator iterator() { return sdg.iterator(); } + @Override public void removeNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(Statement N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getPredNodes(Statement N) { return sdg.getPredNodes(N); } + @Override public int getSuccNodeCount(Statement N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getSuccNodes(Statement N) { return sdg.getSuccNodes(N); } + @Override public boolean hasEdge(Statement src, Statement dst) { return sdg.hasEdge(src, dst); } + @Override public void removeAllIncidentEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public int getMaxNumber() { return sdg.getMaxNumber(); } + @Override public Statement getNode(int number) { return sdg.getNode(number); } + @Override public int getNumber(Statement N) { return sdg.getNumber(N); } + @Override public Iterator iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(Statement node) { return sdg.getPredNodeNumbers(node); } @@ -417,6 +455,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NumberedEdgeManager#getSuccNodeNumbers(java.lang.Object) */ + @Override public IntSet getSuccNodeNumbers(Statement node) { return sdg.getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java index 104fcd28d..e480ebc83 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java @@ -21,10 +21,12 @@ import com.ibm.wala.util.debug.Assertions; */ public class SliceFunctions implements IPartiallyBalancedFlowFunctions { + @Override public IUnaryFlowFunction getCallFlowFunction(Statement src, Statement dest, Statement ret) { return ReachabilityFunctions.createReachabilityFunctions().getCallFlowFunction(src, dest, ret); } + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(Statement src, Statement dest) { if (src == null) { throw new IllegalArgumentException("src is null"); @@ -61,14 +63,17 @@ public class SliceFunctions implements IPartiallyBalancedFlowFunctions getDomain() { // a dummy return new UnorderedDomain(); @@ -263,6 +264,7 @@ public class Slicer { /* * @see com.ibm.wala.dataflow.IFDS.TabulationProblem#getFunctionMap() */ + @Override public IPartiallyBalancedFlowFunctions getFunctionMap() { return f; } @@ -270,6 +272,7 @@ public class Slicer { /* * @see com.ibm.wala.dataflow.IFDS.TabulationProblem#getMergeFunction() */ + @Override public IMergeFunction getMergeFunction() { return null; } @@ -277,10 +280,12 @@ public class Slicer { /* * @see com.ibm.wala.dataflow.IFDS.TabulationProblem#getSupergraph() */ + @Override public ISupergraph getSupergraph() { return supergraph; } + @Override public Collection> initialSeeds() { if (backward) { Collection> result = HashSetFactory.make(); @@ -299,6 +304,7 @@ public class Slicer { } } + @Override public Statement getFakeEntry(Statement node) { return backward ? new MethodExitStatement(node.getNode()) : new MethodEntryStatement(node.getNode()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java index 574689098..cbfe20899 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java @@ -71,16 +71,19 @@ public class CISDG implements ISDG { invRef = MapUtil.inverseMap(ref); } + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); noHeap.addEdge(src, dst); } + @Override public void addNode(Statement n) { Assertions.UNREACHABLE(); noHeap.addNode(n); } + @Override public boolean containsNode(Statement N) { return noHeap.containsNode(N); } @@ -91,42 +94,51 @@ public class CISDG implements ISDG { return noHeap.equals(obj); } + @Override public ControlDependenceOptions getCOptions() { Assertions.UNREACHABLE(); return noHeap.getCOptions(); } + @Override public int getMaxNumber() { return noHeap.getMaxNumber(); } + @Override public Statement getNode(int number) { Assertions.UNREACHABLE(); return noHeap.getNode(number); } + @Override public int getNumber(Statement N) { return noHeap.getNumber(N); } + @Override public int getNumberOfNodes() { return noHeap.getNumberOfNodes(); } + @Override public PDG getPDG(CGNode node) { Assertions.UNREACHABLE(); return noHeap.getPDG(node); } + @Override public int getPredNodeCount(Statement N) { return IteratorUtil.count(getPredNodes(N)); } + @Override public IntSet getPredNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return noHeap.getPredNodeNumbers(node); } + @Override public Iterator getPredNodes(Statement N) { if (DEBUG) { System.err.println("getPredNodes " + N); @@ -145,15 +157,18 @@ public class CISDG implements ISDG { } } + @Override public int getSuccNodeCount(Statement N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public IntSet getSuccNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return noHeap.getSuccNodeNumbers(node); } + @Override public Iterator getSuccNodes(Statement N) { if (DEBUG) { System.err.println("getSuccNodes " + N); @@ -172,6 +187,7 @@ public class CISDG implements ISDG { } } + @Override public boolean hasEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); return noHeap.hasEdge(src, dst); @@ -184,45 +200,54 @@ public class CISDG implements ISDG { } + @Override public Iterator iterateLazyNodes() { Assertions.UNREACHABLE(); return noHeap.iterateLazyNodes(); } + @Override public Iterator iterator() { return noHeap.iterator(); } + @Override public Iterator iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return noHeap.iterateNodes(s); } + @Override public void removeAllIncidentEdges(Statement node) { Assertions.UNREACHABLE(); noHeap.removeAllIncidentEdges(node); } + @Override public void removeEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); noHeap.removeEdge(src, dst); } + @Override public void removeIncomingEdges(Statement node) { Assertions.UNREACHABLE(); noHeap.removeIncomingEdges(node); } + @Override public void removeNode(Statement n) { Assertions.UNREACHABLE(); noHeap.removeNode(n); } + @Override public void removeNodeAndEdges(Statement N) { Assertions.UNREACHABLE(); noHeap.removeNodeAndEdges(N); } + @Override public void removeOutgoingEdges(Statement node) { Assertions.UNREACHABLE(); noHeap.removeOutgoingEdges(node); @@ -234,6 +259,7 @@ public class CISDG implements ISDG { return noHeap.toString(); } + @Override public IClassHierarchy getClassHierarchy() { return noHeap.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java index 2924aab92..f679c07b5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java @@ -66,6 +66,7 @@ public class BypassClassTargetSelector implements ClassTargetSelector { * @see com.ibm.wala.ipa.callgraph.ClassTargetSelector#getAllocatedTarget(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.NewSiteReference) */ + @Override public IClass getAllocatedTarget(CGNode caller, NewSiteReference site) { if (site == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java index 1cd466b76..21d6b0a9f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java @@ -100,6 +100,7 @@ public class BypassMethodTargetSelector implements MethodTargetSelector { * * @throws IllegalArgumentException if site is null */ + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass dispatchType) { if (site == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java index 2b6d121c8..67f4ee0cd 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java @@ -73,6 +73,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getSuperclass() */ + @Override public IClass getSuperclass() { if (realType.isInterface()) { IClass result = loader.lookupClass(TypeReference.JavaLangObject.getName()); @@ -88,6 +89,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInterfaces() */ + @Override public Collection getAllImplementedInterfaces() { Collection realIfaces = realType.getAllImplementedInterfaces(); if (realType.isInterface()) { @@ -102,6 +104,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IMethod getMethod(Selector selector) { return realType.getMethod(selector); } @@ -109,6 +112,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IField getField(Atom name) { return realType.getField(name); } @@ -124,6 +128,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() { return null; } @@ -131,6 +136,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() { return realType.getDeclaredMethods(); } @@ -138,6 +144,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredInstanceFields() */ + @Override public Collection getDeclaredInstanceFields() { return realType.getDeclaredInstanceFields(); } @@ -145,6 +152,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ + @Override public Collection getDeclaredStaticFields() { return realType.getDeclaredStaticFields(); } @@ -185,6 +193,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getModifiers() */ + @Override public int getModifiers() throws UnimplementedError { Assertions.UNREACHABLE(); return 0; @@ -193,6 +202,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#isReferenceType() */ + @Override public boolean isReferenceType() { return getReference().isReferenceType(); } @@ -200,6 +210,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -208,6 +219,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { return realType.getAllInstanceFields(); } @@ -215,6 +227,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields(){ return realType.getAllStaticFields(); } @@ -222,6 +235,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { return realType.getAllMethods(); } @@ -229,14 +243,17 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { return realType.getAllFields(); } + @Override public boolean isPublic() { return realType.isPublic(); } + @Override public boolean isPrivate() { return realType.isPrivate(); } @@ -246,6 +263,7 @@ public class BypassSyntheticClass extends SyntheticClass { return null; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java index 73b4ebab3..10a9918e7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java @@ -91,6 +91,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { return me.getName().toString(); } + @Override public IClass lookupClass(TypeName className) { IClass pc = parent.lookupClass(className); if (pc == null) { @@ -112,6 +113,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * Return the ClassLoaderReference for this class loader. */ + @Override public ClassLoaderReference getReference() { return me; } @@ -119,6 +121,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @return an Iterator of all classes loaded by this loader */ + @Override public Iterator iterateAllClasses() { return syntheticClasses.values().iterator(); } @@ -126,6 +129,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @return the number of classes in scope to be loaded by this loader */ + @Override public int getNumberOfClasses() { return syntheticClasses.size(); } @@ -133,6 +137,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @return the unique name that identifies this class loader. */ + @Override public Atom getName() { return me.getName(); } @@ -141,6 +146,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { * @return the unique name that identifies the programming language * from which this class loader loads code. */ + @Override public Language getLanguage() { return Language.JAVA; } @@ -148,6 +154,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getNumberOfMethods() */ + @Override public int getNumberOfMethods() { // TODO Auto-generated method stub return 0; @@ -156,6 +163,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getSourceFileName(com.ibm.wala.classLoader.IClass) */ + @Override public String getSourceFileName(IClass klass) { return null; } @@ -163,16 +171,19 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @see com.ibm.wala.classLoader.IClassLoader#getParent() */ + @Override public IClassLoader getParent() { return parent; } + @Override public void init(List modules) throws IOException { } /* * @see com.ibm.wala.classLoader.IClassLoader#removeAll(java.util.Collection) */ + @Override public void removeAll(Collection toRemove) { if (toRemove == null) { throw new IllegalArgumentException("toRemove is null"); @@ -183,18 +194,22 @@ public class BypassSyntheticClassLoader implements IClassLoader { } } + @Override public InputStream getSource(IClass klass) { return null; } + @Override public SSAInstructionFactory getInstructionFactory() { return getLanguage().instructionFactory(); } + @Override public InputStream getSource(IMethod method, int offset) { return null; } + @Override public String getSourceFileName(IMethod method, int offset) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java index a67114b8d..e339127c4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java @@ -26,6 +26,7 @@ public class SyntheticIRFactory implements IRFactory { return method.makeControlFlowGraph(method.getStatements()); } + @Override public IR makeIR(SyntheticMethod method, Context C, SSAOptions options) { if (method == null) { throw new IllegalArgumentException("method is null"); @@ -33,6 +34,7 @@ public class SyntheticIRFactory implements IRFactory { return method.makeIR(C, options); } + @Override public boolean contextIsIrrelevant(SyntheticMethod method) { // conservatively return false .. the context might matter. return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java index cd9fa478f..5d3b7abe2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java @@ -46,6 +46,7 @@ public class CompoundPiPolicy implements SSAPiNodePolicy { /* * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAConditionalBranchInstruction, com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAConditionalBranchInstruction cond, SSAInstruction def1, SSAInstruction def2, SymbolTable symbolTable) { Pair result = p1.getPi(cond, def1, def2, symbolTable); @@ -59,6 +60,7 @@ public class CompoundPiPolicy implements SSAPiNodePolicy { /* * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAAbstractInvokeInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAAbstractInvokeInstruction call, SymbolTable symbolTable) { Pair result = p1.getPi(call, symbolTable); if (result != null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java index 84cecfefd..f6f3c4c28 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java @@ -44,6 +44,7 @@ public class ConstantValue implements Value { /* * @see com.ibm.wala.ssa.Value#isStringConstant() */ + @Override public boolean isStringConstant() { return constant instanceof String; } @@ -73,6 +74,7 @@ public class ConstantValue implements Value { /** * @return true iff this constant is "null" */ + @Override public boolean isNullConstant() { return (constant == null); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java index 330ad57ba..8b5495aff 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java @@ -163,14 +163,17 @@ public class DefUse { it = uses.intIterator(); } + @Override public boolean hasNext() { return it.hasNext(); } + @Override public SSAInstruction next() { return allInstructions.get(it.next()); } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java index 6393f59c5..e7f6b640b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java @@ -53,6 +53,7 @@ public class DefaultIRFactory implements IRFactory { * @see com.ibm.wala.ssa.IRFactory#makeIR(com.ibm.wala.classLoader.IMethod, com.ibm.wala.ipa.callgraph.Context, * com.ibm.wala.ipa.cha.IClassHierarchy, com.ibm.wala.ssa.SSAOptions, com.ibm.wala.util.warnings.WarningSet) */ + @Override public IR makeIR(IMethod method, Context c, SSAOptions options) throws IllegalArgumentException { if (method == null) { throw new IllegalArgumentException("method cannot be null"); @@ -70,6 +71,7 @@ public class DefaultIRFactory implements IRFactory { /** * Is the {@link Context} irrelevant as to structure of the {@link IR} for a particular {@link IMethod}? */ + @Override public boolean contextIsIrrelevant(IMethod method) { if (method == null) { throw new IllegalArgumentException("null method"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java index df8480222..da9bbd008 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java @@ -313,10 +313,12 @@ public abstract class IR { } } + @Override public boolean hasNext() { return currentBlockIndex != -1; } + @Override public SSAInstruction next() { SSAInstruction result = currentBlockIterator.next(); if (!currentBlockIterator.hasNext()) { @@ -325,6 +327,7 @@ public abstract class IR { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -405,10 +408,12 @@ public abstract class IR { } } + @Override public boolean hasNext() { return currentBlockIndex != -1; } + @Override public SSAInstruction next() { ExceptionHandlerBasicBlock bb = (ExceptionHandlerBasicBlock) cfg.getNode(currentBlockIndex); SSAInstruction result = bb.getCatchInstruction(); @@ -416,6 +421,7 @@ public abstract class IR { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -475,14 +481,17 @@ public abstract class IR { nextIndex = -1; } + @Override public boolean hasNext() { return nextIndex != -1; } + @Override public void remove() { Assertions.UNREACHABLE(); } + @Override public SSAInstruction next() { SSAInstruction result = instructions[nextIndex]; advanceIndex(nextIndex + 1); @@ -591,16 +600,19 @@ public abstract class IR { ; } + @Override public boolean hasNext() { return i <= limit; } + @Override public CallSiteReference next() { int index = callSiteMapping.getRelated(i).max(); advance(); return ((SSAAbstractInvokeInstruction) instructions[index]).getCallSite(); } + @Override public void remove() { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java index 4c6aee79a..57a583b61 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java @@ -24,16 +24,19 @@ public interface ISSABasicBlock extends IBasicBlock { /** * Is this block a catch block */ + @Override public boolean isCatchBlock(); /** * Does this block represent the unique exit from a {@link ControlFlowGraph}? */ + @Override public boolean isExitBlock(); /** * Does this block represent the unique entry to a {@link ControlFlowGraph} */ + @Override public boolean isEntryBlock(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java index 959e87abe..1f7b35eec 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java @@ -41,6 +41,7 @@ public class InstanceOfPiPolicy implements SSAPiNodePolicy { * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAConditionalBranchInstruction, com.ibm.wala.ssa.SSAInstruction, * com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAConditionalBranchInstruction cond, SSAInstruction def1, SSAInstruction def2, SymbolTable symbolTable) { if (def1 instanceof SSAInstanceofInstruction) { @@ -69,6 +70,7 @@ public class InstanceOfPiPolicy implements SSAPiNodePolicy { /* * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAAbstractInvokeInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAAbstractInvokeInstruction call, SymbolTable symbolTable) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java index 38b570f17..60e1eca0c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java @@ -35,6 +35,7 @@ public class NullTestPiPolicy implements SSAPiNodePolicy { * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAConditionalBranchInstruction, * com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAConditionalBranchInstruction cond, SSAInstruction def1, SSAInstruction def2, SymbolTable symbolTable) { if (symbolTable == null) { @@ -52,6 +53,7 @@ public class NullTestPiPolicy implements SSAPiNodePolicy { return null; } + @Override public Pair getPi(SSAAbstractInvokeInstruction call, SymbolTable symbolTable) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java index 2ea647585..72dc3b106 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java @@ -44,6 +44,7 @@ class PhiValue implements Value { /* * @see com.ibm.wala.ssa.Value#isStringConstant() */ + @Override public boolean isStringConstant() { return false; } @@ -51,6 +52,7 @@ class PhiValue implements Value { /* * @see com.ibm.wala.ssa.Value#isNullConstant() */ + @Override public boolean isNullConstant() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java index eee4eda48..409ea9d54 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java @@ -131,6 +131,7 @@ public class SSABuilder extends AbstractIntStackMachine { this.shrikeCFG = shrikeCFG; } + @Override public int meetStack(int slot, int[] rhs, BasicBlock bb) { assert bb != null : "null basic block"; @@ -171,6 +172,7 @@ public class SSABuilder extends AbstractIntStackMachine { /** * @see com.ibm.wala.analysis.stackMachine.AbstractIntStackMachine.Meeter#meetLocal(int, int[], BasicBlock) */ + @Override public int meetLocal(int n, int[] rhs, BasicBlock bb) { if (allTheSame(rhs)) { for (int i = 0; i < rhs.length; i++) { @@ -232,6 +234,7 @@ public class SSABuilder extends AbstractIntStackMachine { /** * @see com.ibm.wala.analysis.stackMachine.AbstractIntStackMachine.Meeter#meetStackAtCatchBlock(BasicBlock) */ + @Override public int meetStackAtCatchBlock(BasicBlock bb) { int bbNumber = shrikeCFG.getNumber(bb); SSACFG.ExceptionHandlerBasicBlock newBB = (SSACFG.ExceptionHandlerBasicBlock) cfg.getNode(bbNumber); @@ -967,6 +970,7 @@ public class SSABuilder extends AbstractIntStackMachine { * @param index - index into IR instruction array * @param vn - value number */ + @Override public String[] getLocalNames(int index, int vn) { try { if (!shrikeCFG.getMethod().hasLocalVariableTable()) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java index 62ae97878..633a318c4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java @@ -206,6 +206,7 @@ public class SSACFG implements ControlFlowGraph * Get the basic block an instruction belongs to. Note: the instruction2Block array is filled in lazily. During initialization, * the mapping is set up only for the first instruction of each basic block. */ + @Override public SSACFG.BasicBlock getBlockForInstruction(int instructionIndex) { IBasicBlock N = delegate.getBlockForInstruction(instructionIndex); int number = delegate.getNumber(N); @@ -219,6 +220,7 @@ public class SSACFG implements ControlFlowGraph * * @return an array containing the SSA instructions. */ + @Override public SSAInstruction[] getInstructions() { return instructions; } @@ -272,6 +274,7 @@ public class SSACFG implements ControlFlowGraph this.number = number; } + @Override public int getNumber() { return number; } @@ -279,6 +282,7 @@ public class SSACFG implements ControlFlowGraph /** * Method getFirstInstructionIndex. */ + @Override public int getFirstInstructionIndex() { IBasicBlock B = delegate.getNode(number); return B.getFirstInstructionIndex(); @@ -287,10 +291,12 @@ public class SSACFG implements ControlFlowGraph /** * Is this block marked as a catch block? */ + @Override public boolean isCatchBlock() { return delegate.getCatchBlocks().get(getNumber()); } + @Override public int getLastInstructionIndex() { IBasicBlock B = delegate.getNode(number); return B.getLastInstructionIndex(); @@ -299,6 +305,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.ssa.ISSABasicBlock#iteratePhis() */ + @Override public Iterator iteratePhis() { compressPhis(); if (stackSlotPhis == null) { @@ -459,6 +466,7 @@ public class SSACFG implements ControlFlowGraph blockPiInstructions.add(pi); } + @Override public Iterator iteratePis() { return blockPiInstructions.iterator(); } @@ -474,10 +482,12 @@ public class SSACFG implements ControlFlowGraph return new Iterator() { private int start = dummy; + @Override public boolean hasNext() { return (start <= end); } + @Override public SSAInstruction next() { SSAInstruction i = instructions[start]; start++; @@ -487,6 +497,7 @@ public class SSACFG implements ControlFlowGraph return i; } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -563,6 +574,7 @@ public class SSACFG implements ControlFlowGraph return result; } + @Override public Iterator iterator() { return getAllInstructions().iterator(); } @@ -577,6 +589,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.INodeWithNumber#getGraphNodeId() */ + @Override public int getGraphNodeId() { return number; } @@ -584,6 +597,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.INodeWithNumber#setGraphNodeId(int) */ + @Override public void setGraphNodeId(int number) { // TODO Auto-generated method stub } @@ -619,6 +633,7 @@ public class SSACFG implements ControlFlowGraph } } + @Override public IMethod getMethod() { return method; } @@ -631,6 +646,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.IBasicBlock#isExitBlock() */ + @Override public boolean isExitBlock() { return this == SSACFG.this.exit(); } @@ -638,10 +654,12 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.IBasicBlock#isEntryBlock() */ + @Override public boolean isEntryBlock() { return this == SSACFG.this.entry(); } + @Override public SSAInstruction getLastInstruction() { return instructions[getLastInstructionIndex()]; } @@ -651,6 +669,7 @@ public class SSACFG implements ControlFlowGraph * * @see com.ibm.wala.ssa.ISSABasicBlock#getCaughtExceptionTypes() */ + @Override public Iterator getCaughtExceptionTypes() { return EmptyIterator.instance(); } @@ -689,14 +708,17 @@ public class SSACFG implements ControlFlowGraph return new Iterator() { int next = 0; + @Override public boolean hasNext() { return next < nExceptionTypes; } + @Override public TypeReference next() { return exceptionTypes[next++]; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -752,6 +774,7 @@ public class SSACFG implements ControlFlowGraph return s.toString(); } + @Override public BitVector getCatchBlocks() { return delegate.getCatchBlocks(); } @@ -768,6 +791,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#entry() */ + @Override public SSACFG.BasicBlock entry() { return basicBlocks[0]; } @@ -775,6 +799,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#exit() */ + @Override public SSACFG.BasicBlock exit() { return exit; } @@ -782,6 +807,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("N == null"); @@ -792,6 +818,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#getNode(int) */ + @Override public BasicBlock getNode(int number) { return basicBlocks[number]; } @@ -799,6 +826,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#getMaxNumber() */ + @Override public int getMaxNumber() { return basicBlocks.length - 1; } @@ -806,6 +834,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#iterateNodes() */ + @Override public Iterator iterator() { ArrayList list = new ArrayList(); for (BasicBlock b : basicBlocks) { @@ -817,6 +846,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } @@ -824,6 +854,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getPredNodes(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -831,16 +862,19 @@ public class SSACFG implements ControlFlowGraph IBasicBlock n = delegate.getNode(b.getNumber()); final Iterator i = delegate.getPredNodes(n); return new Iterator() { + @Override public boolean hasNext() { return i.hasNext(); } + @Override public BasicBlock next() { IBasicBlock n = (IBasicBlock) i.next(); int number = n.getNumber(); return basicBlocks[number]; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -850,6 +884,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -861,6 +896,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getSuccNodes(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -868,16 +904,19 @@ public class SSACFG implements ControlFlowGraph IBasicBlock n = delegate.getNode(b.getNumber()); final Iterator i = delegate.getSuccNodes(n); return new Iterator() { + @Override public boolean hasNext() { return i.hasNext(); } + @Override public ISSABasicBlock next() { IBasicBlock n = (IBasicBlock) i.next(); int number = n.getNumber(); return basicBlocks[number]; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -887,6 +926,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -898,14 +938,17 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(ISSABasicBlock n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void addEdge(ISSABasicBlock src, ISSABasicBlock dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(ISSABasicBlock src, ISSABasicBlock dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -913,6 +956,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(ISSABasicBlock node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -920,6 +964,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(ISSABasicBlock N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -927,6 +972,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(ISSABasicBlock n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -934,6 +980,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getProgramCounter(int) */ + @Override public int getProgramCounter(int index) { // delegate to incoming cfg. return delegate.getProgramCounter(index); @@ -942,6 +989,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(ISSABasicBlock N) { if (N instanceof BasicBlock) { return basicBlocks[getNumber(N)] == N; @@ -953,6 +1001,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getMethod() */ + @Override public IMethod getMethod() { return method; } @@ -960,6 +1009,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public List getExceptionalSuccessors(final ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -977,12 +1027,14 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public Collection getExceptionalPredecessors(ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); } IBasicBlock n = delegate.getNode(b.getNumber()); Function, ISSABasicBlock> f = new Function, ISSABasicBlock>() { + @Override public ISSABasicBlock apply(IBasicBlock object) { return basicBlocks[delegate.getNumber(object)]; } @@ -1030,6 +1082,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public Collection getNormalSuccessors(ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -1047,6 +1100,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public Collection getNormalPredecessors(ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -1064,22 +1118,27 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } + @Override public void removeIncomingEdges(ISSABasicBlock node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(ISSABasicBlock node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public boolean hasEdge(ISSABasicBlock src, ISSABasicBlock dst) throws UnimplementedError { return getSuccNodeNumbers(src).contains(getNumber(dst)); } + @Override public IntSet getSuccNodeNumbers(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -1088,6 +1147,7 @@ public class SSACFG implements ControlFlowGraph return delegate.getSuccNodeNumbers(n); } + @Override public IntSet getPredNodeNumbers(ISSABasicBlock node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java index 9f58a5802..23ae24a8e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java @@ -116,72 +116,95 @@ public abstract class SSAInstruction { * A base visitor implementation that does nothing. */ public static abstract class Visitor implements IVisitor { + @Override public void visitGoto(SSAGotoInstruction instruction) { } + @Override public void visitArrayLoad(SSAArrayLoadInstruction instruction) { } + @Override public void visitArrayStore(SSAArrayStoreInstruction instruction) { } + @Override public void visitBinaryOp(SSABinaryOpInstruction instruction) { } + @Override public void visitUnaryOp(SSAUnaryOpInstruction instruction) { } + @Override public void visitConversion(SSAConversionInstruction instruction) { } + @Override public void visitComparison(SSAComparisonInstruction instruction) { } + @Override public void visitConditionalBranch(SSAConditionalBranchInstruction instruction) { } + @Override public void visitSwitch(SSASwitchInstruction instruction) { } + @Override public void visitReturn(SSAReturnInstruction instruction) { } + @Override public void visitGet(SSAGetInstruction instruction) { } + @Override public void visitPut(SSAPutInstruction instruction) { } + @Override public void visitInvoke(SSAInvokeInstruction instruction) { } + @Override public void visitNew(SSANewInstruction instruction) { } + @Override public void visitArrayLength(SSAArrayLengthInstruction instruction) { } + @Override public void visitThrow(SSAThrowInstruction instruction) { } + @Override public void visitMonitor(SSAMonitorInstruction instruction) { } + @Override public void visitCheckCast(SSACheckCastInstruction instruction) { } + @Override public void visitInstanceof(SSAInstanceofInstruction instruction) { } + @Override public void visitPhi(SSAPhiInstruction instruction) { } + @Override public void visitPi(SSAPiInstruction instruction) { } + @Override public void visitGetCaughtException(SSAGetCaughtExceptionInstruction instruction) { } + @Override public void visitLoadMetadata(SSALoadMetadataInstruction instruction) { } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java index fa679f0f3..139909d8f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java @@ -112,10 +112,12 @@ public class SSASwitchInstruction extends SSAInstruction { return new IntIterator() { private int i = 0; + @Override public boolean hasNext() { return i < casesAndLabels.length; } + @Override public int next() { int v = casesAndLabels[i]; i += 2; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java index c05af11d0..f28435d20 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java @@ -68,6 +68,7 @@ public class ShrikeIndirectionData implements SSAIndirectionData(2); @@ -92,6 +95,7 @@ public class ShrikeIndirectionData implements SSAIndirectionData(2); @@ -100,6 +104,7 @@ public class ShrikeIndirectionData implements SSAIndirectionData getNames() { HashSet result = new HashSet(); for (int i = 0; i < uses.length; i++) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java index f702434cc..0766b4551 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java @@ -89,14 +89,17 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getExceptionalPredecessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -133,6 +138,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getExceptionalSuccessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -155,14 +161,17 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getNormalPredecessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -191,6 +200,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getNormalSuccessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -220,38 +230,47 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iterator() { return allNodes.iterator(); } + @Override public void removeNode(IExplodedBasicBlock n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void addEdge(IExplodedBasicBlock src, IExplodedBasicBlock dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public int getPredNodeCount(IExplodedBasicBlock bb) throws IllegalArgumentException { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; if (eb == null) { @@ -274,6 +293,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getPredNodes(IExplodedBasicBlock bb) throws IllegalArgumentException { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; if (eb == null) { @@ -310,6 +330,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getSuccNodes(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -350,32 +372,39 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iterateNodes(IntSet s) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(IExplodedBasicBlock node) { MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); for (Iterator it = getPredNodes(node); it.hasNext();) { @@ -406,6 +438,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getCaughtExceptionTypes() { if (original instanceof ExceptionHandlerBasicBlock) { ExceptionHandlerBasicBlock eb = (ExceptionHandlerBasicBlock) original; @@ -442,18 +476,22 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iterator() { if (isEntryBlock() || isExitBlock() || getInstruction() == null) { return EmptyIterator.instance(); @@ -532,6 +577,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iteratePhis() { if (isEntryBlock() || isExitBlock() || instructionIndex != original.getFirstInstructionIndex()) { return EmptyIterator.instance(); @@ -556,6 +604,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iteratePis() { if (isEntryBlock() || isExitBlock() || instructionIndex != original.getLastInstructionIndex()) { return EmptyIterator.instance(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java b/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java index a6546f4c4..8c6e10f6c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java @@ -69,6 +69,7 @@ public class JUnitEntryPoints { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -128,6 +129,7 @@ public class JUnitEntryPoints { e.printStackTrace(); } return new Iterable() { + @Override public Iterator iterator() { return entryPts.iterator(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java b/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java index 0652e5787..cdd80d2d2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java @@ -46,6 +46,7 @@ public abstract class Warning implements Comparable { * * @throws ClassCastException if o is not a Warning */ + @Override public int compareTo(Object o) throws ClassCastException { if (o == null) { return -1; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java b/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java index d4486a26a..a18c95572 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java @@ -80,6 +80,7 @@ public class PDFViewUtil { labelMap.put(bb, getNodeLabel(ir, bb)); } NodeDecorator labels = new NodeDecorator() { + @Override public String getLabel(Object o) { return labelMap.get(o); } @@ -101,6 +102,7 @@ public class PDFViewUtil { this.B = B; } + @Override public String getLabel(Object o) throws WalaException { return A.getLabel(o) + B.getLabel(o); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java index cb3c01ef6..726be8c15 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java @@ -45,6 +45,7 @@ public class CgPanel extends JSplitPane{ this.setRightComponent(irViewer.getComponent()); tree.addTreeSelectionListener(new TreeSelectionListener() { + @Override public void valueChanged(TreeSelectionEvent e) { TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); if (null == newLeadSelectionPath){ @@ -76,6 +77,7 @@ public class CgPanel extends JSplitPane{ tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override public void treeExpanded(TreeExpansionEvent event) { TreePath path = event.getPath(); if (path == null) { @@ -85,6 +87,7 @@ public class CgPanel extends JSplitPane{ expandNode(lastNode); } + @Override public void treeCollapsed(TreeExpansionEvent event) { } diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java index 6a39cb66e..07c8e02ba 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java @@ -44,6 +44,7 @@ public class ChaPanel extends JSplitPane { this.setRightComponent(methodList); tree.addTreeSelectionListener(new TreeSelectionListener(){ + @Override public void valueChanged(TreeSelectionEvent e) { TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); if (null == newLeadSelectionPath){ @@ -69,6 +70,7 @@ public class ChaPanel extends JSplitPane { tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override public void treeExpanded(TreeExpansionEvent event) { TreePath path = event.getPath(); if (path == null) { @@ -78,6 +80,7 @@ public class ChaPanel extends JSplitPane { expandNode(lastNode); } + @Override public void treeCollapsed(TreeExpansionEvent event) { } diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java index 831f17f72..e4bc0b061 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java @@ -47,6 +47,7 @@ class DualTreeCellRenderer implements TreeCellRenderer { pkTreeCellRenderer.setLeafIcon(createImageIcon("images/pk_leaf.png")); } + @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { TreeCellRenderer delegate = getTreeCellRenderer(value); diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java index c085c3c74..46a5fd1ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java @@ -45,6 +45,7 @@ public class IrAndSourceViewer { irViewer.addSelectedPcListner(new SelectedPcListner(){ + @Override public void valueChanged(int pc) { IMethod method = ir.getMethod(); int sourceLineNumber = IrViewer.NA; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java index acc22daf5..14871d72f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java @@ -58,6 +58,7 @@ public class IrViewer extends JPanel{ irLines.addListSelectionListener(new ListSelectionListener() { + @Override public void valueChanged(ListSelectionEvent e) { int index = irLines.getSelectedIndex(); Integer pc = lineToPc.get(index); diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java index 7c1e4ec8d..c192a5775 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java @@ -102,6 +102,7 @@ public class PaPanel extends JSplitPane { heapTree.addTreeExpansionListener(new TreeExpansionListener() { + @Override public void treeExpanded(TreeExpansionEvent event) { TreePath path = event.getPath(); if (path == null) { @@ -111,12 +112,14 @@ public class PaPanel extends JSplitPane { expandNodeRec(lastNode, 2); } + @Override public void treeCollapsed(TreeExpansionEvent event) { } }); heapTree.addTreeSelectionListener(new TreeSelectionListener() { + @Override public void valueChanged(TreeSelectionEvent e) { TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); if (null == newLeadSelectionPath){ diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java index d026d2231..eb9e5a120 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java @@ -62,6 +62,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -72,6 +73,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java index 09fffd24b..637860f61 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java @@ -30,6 +30,7 @@ final class TypeInferenceAssertion implements IRAssertion { } // For now just check things in the main method + @Override public void check(CallGraph cg) { IR ir = getIR(cg, typeName, "main", "[Ljava/lang/String;", "V"); AstJavaTypeInference inference = new AstJavaTypeInference(ir, cg.getClassHierarchy(), true); diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java index 2f8a19b1e..257946756 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java @@ -76,11 +76,13 @@ public class FakeExceptionTypeBinding implements ITypeBinding { this.exceptionBinaryName = exceptionBinaryName; } + @Override public boolean isAssignmentCompatible(ITypeBinding variableType) { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean equals(Object o) { if (o instanceof FakeExceptionTypeBinding) return this == o; @@ -91,211 +93,253 @@ public class FakeExceptionTypeBinding implements ITypeBinding { // --- rest not needed + @Override public ITypeBinding createArrayType(int dimension) { Assertions.UNREACHABLE("FakeExceptionTypeBinding createArrayType"); return null; } + @Override public String getBinaryName() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getBound() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getComponentType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IVariableBinding[] getDeclaredFields() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IMethodBinding[] getDeclaredMethods() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getDeclaredModifiers() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public ITypeBinding[] getDeclaredTypes() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getDeclaringClass() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IMethodBinding getDeclaringMethod() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getDimensions() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public ITypeBinding getElementType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getErasure() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getInterfaces() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getModifiers() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public String getName() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IPackageBinding getPackage() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public String getQualifiedName() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getSuperclass() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getTypeArguments() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getTypeBounds() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getTypeDeclaration() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getTypeParameters() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getWildcard() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public boolean isAnnotation() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isAnonymous() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isArray() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isCapture() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isCastCompatible(ITypeBinding type) { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isClass() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isEnum() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isFromSource() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isGenericType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isInterface() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isLocal() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isMember() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isNested() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isNullType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isParameterizedType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isPrimitive() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isRawType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isSubTypeCompatible(ITypeBinding type) { String name = type.getBinaryName(); if (exceptionBinaryName.endsWith("Error;")) { @@ -313,70 +357,84 @@ public class FakeExceptionTypeBinding implements ITypeBinding { return false; } + @Override public boolean isTopLevel() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isTypeVariable() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isUpperbound() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isWildcardType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public IAnnotationBinding[] getAnnotations() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IJavaElement getJavaElement() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public String getKey() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getKind() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public boolean isDeprecated() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isEqualTo(IBinding binding) { return this.equals(binding); } + @Override public boolean isRecovered() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isSynthetic() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public ITypeBinding getGenericTypeOfWildcardType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getRank() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java index aa2ee5224..426ac79a1 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java @@ -60,6 +60,7 @@ public class JDTClassLoaderFactory extends ClassLoaderFactoryImpl { super(exclusions); } + @Override protected IClassLoader makeNewClassLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, IClassLoader parent, AnalysisScope scope) throws IOException { if (classLoaderReference.equals(JavaSourceAnalysisScope.SOURCE)) { diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java index 21603eb39..4e4f00466 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java @@ -53,7 +53,6 @@ import org.eclipse.core.resources.IFile; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; -import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; @@ -294,75 +293,92 @@ public class JDTJava2CAstTranslator { } - public int getKind() { + @Override + public int getKind() { return TYPE_ENTITY; } + @Override public String getName() { return fName; // unqualified? } + @Override public String getSignature() { return "L" + fName.replace('.', '/') + ";"; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public CAstNode getAST() { // This entity has no AST nodes, really. return null; } + @Override public Map> getAllScopedEntities() { return Collections.singletonMap(null, fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("Non-AST-bearing entity (ClassEntity) asked for scoped entities related to a given AST node"); return null; } + @Override public CAstControlFlowMap getControlFlow() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap getSourceMap() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return fSourcePosition; } + @Override public CAstNodeTypeMap getNodeTypeMap() { // This entity has no AST nodes, really. return new CAstNodeTypeMap() { + @Override public CAstType getNodeType(CAstNode node) { throw new UnsupportedOperationException(); } - public Collection getMappedNodes() { + @Override + public Collection getMappedNodes() { throw new UnsupportedOperationException(); } }; } + @Override public Collection getQualifiers() { return fQuals; } + @Override public CAstType getType() { // return new JdtJavaType(fCT, getTypeDict(), fTypeSystem); return fTypeDict.new JdtJavaType(fJdtType); @@ -826,10 +842,12 @@ public class JDTJava2CAstTranslator { // From Code Body Entity private final Map> fEntities; + @Override public Map> getAllScopedEntities() { return Collections.unmodifiableMap(fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { if (fEntities.containsKey(construct)) { return (fEntities.get(construct)).iterator(); @@ -838,6 +856,7 @@ public class JDTJava2CAstTranslator { } } + @Override public String getSignature() { return Util.methodEntityToSelector(this).toString(); } @@ -937,14 +956,17 @@ public class JDTJava2CAstTranslator { return annotations; } - public String toString() { + @Override + public String toString() { return fDecl == null ? "" : fDecl.toString(); } + @Override public int getKind() { return CAstEntity.FUNCTION_ENTITY; } + @Override public String getName() { if (fDecl == null) return MethodReference.clinitName.toString(); @@ -957,10 +979,12 @@ public class JDTJava2CAstTranslator { /** * INCLUDING first parameter 'this' (for non-static methods) */ + @Override public String[] getArgumentNames() { return fParameterNames; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } @@ -968,30 +992,37 @@ public class JDTJava2CAstTranslator { /** * INCLUDING first parameter 'this' (for non-static methods) */ + @Override public int getArgumentCount() { return fParameterNames.length; } + @Override public CAstNode getAST() { return fAst; } + @Override public CAstControlFlowMap getControlFlow() { return fContext.cfg(); } + @Override public CAstSourcePositionMap getSourceMap() { return fContext.pos(); } + @Override public CAstSourcePositionMap.Position getPosition() { return fDecl==null? getSourceMap().getPosition(fAst): makePosition(fDecl); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return fContext.getNodeTypeMap(); } + @Override public Collection getQualifiers() { if (fDecl == null) return JDT2CAstUtils.mapModifiersToQualifiers(Modifier.STATIC, false, false); // static init @@ -999,10 +1030,12 @@ public class JDTJava2CAstTranslator { return JDT2CAstUtils.mapModifiersToQualifiers(fModifiers, false, false); } + @Override public CAstType getType() { return new CAstType.Method() { private Collection fExceptionTypes = null; + @Override @SuppressWarnings("deprecation") public CAstType getReturnType() { if (fReturnType != null) @@ -1017,6 +1050,7 @@ public class JDTJava2CAstTranslator { /** * NOT INCLUDING first parameter 'this' (for non-static methods) */ + @Override public List getArgumentTypes() { return fParameterTypes; } @@ -1024,20 +1058,24 @@ public class JDTJava2CAstTranslator { /** * NOT INCLUDING first parameter 'this' (for non-static methods) */ + @Override public int getArgumentCount() { return fDecl == null ? 0 : fParameterTypes.size(); } + @Override public String getName() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getName() called???"); return "?"; } + @Override public Collection getSupertypes() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getSupertypes() called???"); return null; } + @Override public Collection/* */getExceptionTypes() { if (fExceptionTypes == null) { fExceptionTypes = new LinkedHashSet(); @@ -1048,6 +1086,7 @@ public class JDTJava2CAstTranslator { return fExceptionTypes; } + @Override public CAstType getDeclaringType() { return fTypeDict.getCAstTypeFor(fType); } @@ -1122,70 +1161,85 @@ public class JDTJava2CAstTranslator { return annotations; } - public int getKind() { + @Override + public int getKind() { return CAstEntity.FIELD_ENTITY; } + @Override public String getName() { return name; } + @Override public String getSignature() { return name + fIdentityMapper.typeToTypeID(type); } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public Iterator getScopedEntities(CAstNode construct) { return EmptyIterator.instance(); } + @Override public Map> getAllScopedEntities() { return Collections.emptyMap(); } + @Override public CAstNode getAST() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstControlFlowMap getControlFlow() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap getSourceMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return position; } + @Override public CAstNodeTypeMap getNodeTypeMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public Collection getQualifiers() { return quals; } + @Override public CAstType getType() { return fTypeDict.getCAstTypeFor(type); } @@ -2906,67 +2960,82 @@ public class JDTJava2CAstTranslator { return null; } - public int getKind() { + @Override + public int getKind() { return FILE_ENTITY; } + @Override public String getName() { return fName; } + @Override public String getSignature() { Assertions.UNREACHABLE(); return null; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public Map> getAllScopedEntities() { return Collections.singletonMap(null, fTopLevelDecls); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("CompilationUnitEntity asked for AST-related entities, but it has no AST."); return null; } + @Override public CAstNode getAST() { return null; } + @Override public CAstControlFlowMap getControlFlow() { Assertions.UNREACHABLE("CompilationUnitEntity.getControlFlow()"); return null; } + @Override public CAstSourcePositionMap getSourceMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getSourceMap()"); return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return null; } + @Override public CAstNodeTypeMap getNodeTypeMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getNodeTypeMap()"); return null; } + @Override public Collection getQualifiers() { return Collections.EMPTY_LIST; } + @Override public CAstType getType() { Assertions.UNREACHABLE("CompilationUnitEntity.getType()"); return null; @@ -3001,15 +3070,18 @@ public class JDTJava2CAstTranslator { super(parent); } + @Override public Collection> getCatchTargets(ITypeBinding type) { return parent.getCatchTargets(type); } + @Override public Map getLabelMap() { return parent.getLabelMap(); } - public boolean needLValue() { + @Override + public boolean needLValue() { return parent.needLValue(); } } @@ -3018,16 +3090,19 @@ public class JDTJava2CAstTranslator { * Root context. Doesn't do anything. */ public static class RootContext extends TranslatorToCAst.RootContext implements WalkContext { - public Collection> getCatchTargets(ITypeBinding type) { + @Override + public Collection> getCatchTargets(ITypeBinding type) { Assertions.UNREACHABLE("RootContext.getCatchTargets()"); return null; } + @Override public Map getLabelMap() { Assertions.UNREACHABLE("RootContext.getLabelMap()"); return null; } + @Override public boolean needLValue() { Assertions.UNREACHABLE("Rootcontext.needLValue()"); return false; @@ -3040,6 +3115,7 @@ public class JDTJava2CAstTranslator { super(parent); } + @Override public boolean needLValue() { return true; } @@ -3059,6 +3135,7 @@ public class JDTJava2CAstTranslator { } } + @Override public Collection> getCatchTargets(ITypeBinding label) { // Look for all matching targets for this thrown type: // if supertpe match, then return only matches at this catch @@ -3098,6 +3175,7 @@ public class JDTJava2CAstTranslator { this.breakTo = breakTo; } + @Override public ASTNode getBreakFor(String label) { return (label == null || label.equals(this.label)) ? breakTo : super.getBreakFor(label); } @@ -3111,6 +3189,7 @@ public class JDTJava2CAstTranslator { this.continueTo = continueTo; } + @Override public ASTNode getContinueFor(String label) { return (label == null || label.equals(this.label)) ? continueTo : super.getContinueFor(label); } @@ -3127,6 +3206,7 @@ public class JDTJava2CAstTranslator { fEntities = entities; } + @Override public Map getLabelMap() { return labelMap; // labels are kept within a method. } @@ -3137,22 +3217,27 @@ public class JDTJava2CAstTranslator { final CAstNodeTypeMapRecorder fNodeTypeMap = new CAstNodeTypeMapRecorder(); + @Override public CAstControlFlowRecorder cfg() { return fCFG; } + @Override public void addScopedEntity(CAstNode node, CAstEntity entity) { fEntities.put(node, entity); } + @Override public CAstSourcePositionRecorder pos() { return fSourceMap; } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { return fNodeTypeMap; } + @Override public Collection> getCatchTargets(ITypeBinding label) { // TAGALONG (need fRuntimeExcType) // Why do we seemingly catch a RuntimeException in every method? this won't catch the RuntimeException above where @@ -3162,6 +3247,7 @@ public class JDTJava2CAstTranslator { return result; } + @Override public boolean needLValue() { return false; } @@ -3397,6 +3483,7 @@ public class JDTJava2CAstTranslator { // constants are unsorted by default Collections.sort(constants, new Comparator() { + @Override public int compare(IVariableBinding arg0, IVariableBinding arg1) { return arg0.getVariableId() - arg1.getVariableId(); } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java index 77d299886..2e38e7366 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java @@ -53,6 +53,7 @@ public class JDTSourceLoaderImpl extends JavaSourceLoaderImpl { super(loaderRef, parent, exclusions, cha); } + @Override protected SourceModuleTranslator getTranslator() { return new JDTSourceModuleTranslator(cha.getScope(), this); } 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 275e1f82f..55d1cccc0 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 @@ -113,6 +113,7 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { * Project -> AST code from org.eclipse.jdt.core.tests.performance */ + @Override public void loadAllSources(Set modules) { // TODO: we might need one AST (-> "Object" class) for all files. // TODO: group by project and send 'em in @@ -137,6 +138,7 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { Set units = proj.getValue().keySet(); parser.createASTs(units.toArray(new ICompilationUnit[units.size()]), new String[0], new ASTRequestor() { + @Override public void acceptAST(ICompilationUnit source, CompilationUnit ast) { try { diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java index a59b60363..d83121ffc 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java @@ -69,6 +69,7 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fIdentityMapper = identityMapper; } + @Override public CAstType getCAstTypeFor(Object astType) { ITypeBinding jdtType = JDT2CAstUtils.getErasedType((ITypeBinding) astType, fAst); @@ -104,18 +105,22 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fEltCAstType = getCAstTypeFor(fEltJdtType); } + @Override public int getNumDimensions() { return 1; // always 1 for Java } + @Override public CAstType getElementType() { return fEltCAstType; } + @Override public String getName() { return "[" + fEltCAstType.getName(); } + @Override @SuppressWarnings("unchecked") public Collection getSupertypes() { if (fEltJdtType.isPrimitive()) @@ -139,6 +144,7 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { private Collection fSuperTypes = null; + @Override public String toString() { return super.toString() + ":" + getName(); } @@ -148,10 +154,12 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fType = type; } + @Override public String getName() { return fIdentityMapper.getTypeRef(fType).getName().toString(); } + @Override @SuppressWarnings("unchecked") public Collection getSupertypes() { if (fSuperTypes == null) { @@ -175,10 +183,12 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fSuperTypes.add(getCAstTypeFor(t)); } + @Override public Collection getQualifiers() { return JDT2CAstUtils.mapModifiersToQualifiers(fType.getModifiers(), fType.isInterface(), fType.isAnnotation()); } + @Override public boolean isInterface() { return fType.isInterface(); } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java index 6c044f1f3..e9c0a42d7 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java @@ -59,6 +59,7 @@ public abstract class AbstractJavaAnalysisAction implements IObjectActionDelegat /* * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart) */ + @Override public void setActivePart(IAction action, IWorkbenchPart targetPart) { } @@ -190,6 +191,7 @@ public abstract class AbstractJavaAnalysisAction implements IObjectActionDelegat /* * @see IActionDelegate#run(IAction) */ + @Override public void run(IAction action) { IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); try { @@ -205,6 +207,7 @@ public abstract class AbstractJavaAnalysisAction implements IObjectActionDelegat /* * @see IActionDelegate#selectionChanged(IAction, ISelection) */ + @Override public void selectionChanged(IAction action, ISelection selection) { currentSelection = selection; } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java index b954afbad..67cc47497 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java @@ -34,7 +34,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -43,7 +44,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java index 0913be3bb..861eddfb2 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java @@ -40,26 +40,32 @@ public final class JdtPosition implements Position { this.eclipseFile = eclipseFile; } + @Override public int getFirstCol() { return -1; } + @Override public int getFirstLine() { return firstLine; } + @Override public InputStream getInputStream() throws IOException { return null; } + @Override public int getLastCol() { return -1; } + @Override public int getLastLine() { return lastLine; } + @Override public URL getURL() { try { return new URL("file:" + path); @@ -69,6 +75,7 @@ public final class JdtPosition implements Position { } } + @Override public int compareTo(Object arg0) { if (arg0 instanceof JdtPosition) { if (firstOffset != ((JdtPosition)arg0).firstOffset) { @@ -81,14 +88,17 @@ public final class JdtPosition implements Position { return 0; } + @Override public int getFirstOffset() { return firstOffset; } + @Override public int getLastOffset() { return lastOffset; } + @Override public String toString() { return "[offset " + firstOffset + ":" + lastOffset + "]"; } diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java index a12ba2a07..2e5a74261 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java @@ -34,7 +34,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -43,7 +44,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java index e7943c5fc..3f2a36d99 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java @@ -21,7 +21,8 @@ public class JavaScriptHeadlessUtil extends HeadlessUtil { public static IJavaScriptProject getJavaScriptProjectFromWorkspace(final String projectName) { IJavaScriptProject jp = getProjectFromWorkspace(new Function() { - public IJavaScriptProject apply(IProject p) { + @Override + public IJavaScriptProject apply(IProject p) { try { if (p.hasNature(JavaScriptCore.NATURE_ID)) { IJavaScriptProject jp = JavaScriptCore.create(p); diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java index 5e35c5b61..c2d4e6d4f 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java @@ -82,17 +82,21 @@ public class JsdtUtil { public static CGInfo buildJSDTCallGraph(Set mes) { final CGInfo info = new CGInfo(); HeadlessUtil.parseModules(mes, new EclipseCompiler() { + @Override public IJavaScriptUnit getCompilationUnit(IFile file) { return JavaScriptCore.createCompilationUnitFrom(file); } + @Override public Parser getParser() { return new Parser() { IJavaScriptProject project; + @Override public void setProject(IProject project) { this.project = JavaScriptCore.create(project); } + @Override public void processASTs(Map files, Function errors) { final ASTVisitor visitor = new ASTVisitor() { private final CallHierarchy ch = CallHierarchy.getDefault(); diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java index ad6b680b5..03fb285f3 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java @@ -30,6 +30,7 @@ import com.ibm.wala.ide.util.JdtUtil; */ public class Main implements IApplication { + @Override public Object start(IApplicationContext context) throws Exception { Collection jp = JdtUtil.getWorkspaceJavaProjects(); for (IJavaProject p : jp) { @@ -40,6 +41,7 @@ public class Main implements IApplication { return null; } + @Override public void stop() { } } diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java index 52a42fe7f..78edbb101 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java @@ -107,6 +107,7 @@ public class SWTTypeHierarchy { */ static Graph pruneForAppLoader(Graph g) throws WalaException { Filter f = new Filter() { + @Override public boolean accepts(IClass c) { return (c.getClassLoader().getReference().equals(ClassLoaderReference.Application)); } diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java index ba7c0803f..b8a7b423e 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java @@ -62,6 +62,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -72,6 +73,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java index 71e9cfc05..d03518881 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java @@ -87,6 +87,7 @@ public class EclipseTestUtil { IPath containerPath = getWorkspacePath().append(projectName).addTrailingSeparator(); ImportOperation importOp = new ImportOperation(containerPath, provider.getRoot(), provider, new IOverwriteQuery() { + @Override public String queryOverwrite(String pathString) { return IOverwriteQuery.ALL; } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java index ac97194ff..80f84daf2 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java @@ -45,6 +45,7 @@ abstract public class EclipseProjectAnalysisEngine

    extends AbstractAnalysisEn abstract protected EclipseProjectPath createProjectPath(P project) throws IOException, CoreException; + @Override abstract protected CallGraphBuilder getCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache); abstract protected AnalysisScope makeAnalysisScope(); diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java index 660f710ec..4f9f00747 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java @@ -61,6 +61,7 @@ abstract public class EclipseProjectSourceAnalysisEngine

    extends EclipseProje * we don't provide a default implementation of this method to avoid * introducing a dependence on com.ibm.wala.cast from this project */ + @Override public abstract AnalysisCache makeDefaultCache(); protected abstract ClassLoaderReference getSourceLoader(); @@ -71,6 +72,7 @@ abstract public class EclipseProjectSourceAnalysisEngine

    extends EclipseProje SSAOptions ssaOptions = new SSAOptions(); ssaOptions.setDefaultValues(new SSAOptions.DefaultValues() { + @Override public int getDefaultValue(SymbolTable symtab, int valueNumber) { return symtab.getDefaultValue(valueNumber); } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java index ff8cebdbd..fe33fc903 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java @@ -109,6 +109,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { // run the code on the UI thread Display d = PlatformUI.getWorkbench().getDisplay(); Runnable r = new Runnable() { + @Override public void run() { try { w.open(); @@ -130,6 +131,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { Display.getCurrent().dispose(); } else { Runnable r = new Runnable() { + @Override public void run() { w.open(); Display.getCurrent().dispose(); @@ -218,6 +220,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ + @Override public void dispose() { // do nothing for now } @@ -226,6 +229,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ + @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // for now do nothing, since we're not dealing with listeners } @@ -233,6 +237,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ + @Override public Object[] getChildren(Object parentElement) { Object[] result = new Object[graph.getSuccNodeCount(parentElement)]; @@ -246,6 +251,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ + @Override public Object getParent(Object element) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -255,6 +261,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ + @Override public boolean hasChildren(Object element) { return graph.getSuccNodeCount(element) > 0; } @@ -262,6 +269,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ + @Override public Object[] getElements(Object inputElement) { Collection roots = getRootsInput(); Assertions.productionAssertion(roots != null); diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java index 7a7a6a800..3d3d1eae4 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java @@ -108,6 +108,7 @@ public class ViewIFDSLocalAction extends Action { this.result = result; } + @Override @SuppressWarnings("unchecked") public String getLabel(Object o) throws WalaException { T t = (T) o; @@ -176,6 +177,7 @@ public class ViewIFDSLocalAction extends Action { try { final P proc = getProcedureForSelection(); Filter filter = new Filter() { + @Override public boolean accepts(T o) { return supergraph.getProcOf(o).equals(proc); } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java index f37b3e0f3..fa7beb106 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java @@ -88,6 +88,7 @@ public abstract class EclipseProjectPath { this.ref = ref; } + @Override public ClassLoaderReference ref() { return ref; } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java index 043446130..0e52c6643 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java @@ -104,6 +104,7 @@ public class HeadlessUtil { for (final Map.Entry> proj : projectsFiles.entrySet()) { parser.setProject(proj.getKey()); parser.processASTs(proj.getValue(), new Function() { + @Override public Boolean apply(Object[] problems) { int length = problems.length; if (length > 0) { diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java index 4ceb30041..072f00da2 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java @@ -30,19 +30,23 @@ public class ProgressMonitorDelegate implements IProgressMonitor { this.delegate = d; } + @Override public void beginTask(String task, int totalWork) { delegate.beginTask(task, totalWork); } + @Override public boolean isCanceled() { return delegate.isCanceled(); } + @Override public void done() { delegate.done(); } + @Override public void worked(int units) { delegate.worked(units); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java index c517ddba7..1deaa3f87 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java @@ -95,6 +95,7 @@ public class CopyWriter { instrumenter = new OfflineInstrumenter(); instrumenter.setManifestBuilder(new OfflineInstrumenter.ManifestBuilder() { + @Override public void addEntry(ZipEntry ze) { entries.add(ze); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java index 89019b559..276dca550 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java @@ -59,6 +59,7 @@ final public class ArrayLengthInstruction extends Instruction { return "ArrayLength()"; } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java index c4725dab4..9bd000b87 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java @@ -90,6 +90,7 @@ final public class ArrayLoadInstruction extends Instruction implements IArrayLoa return Util.getWordSize(getType()); } + @Override public String getType() { return Constants.indexedTypes[opcode - OP_iaload]; } @@ -99,6 +100,7 @@ final public class ArrayLoadInstruction extends Instruction implements IArrayLoa v.visitArrayLoad(this); } + @Override public boolean isPEI() { return true; } @@ -107,6 +109,7 @@ final public class ArrayLoadInstruction extends Instruction implements IArrayLoa * Java bytecode does not permit this. * @see com.ibm.wala.shrikeBT.IMemoryOperation#isAddressOf() */ + @Override public boolean isAddressOf() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java index b2de46772..e91bda969 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java @@ -57,6 +57,7 @@ final public class ArrayStoreInstruction extends Instruction implements IArraySt return 3; } + @Override public String getType() { return Decoder.indexedTypes[opcode - OP_iastore]; } @@ -71,6 +72,7 @@ final public class ArrayStoreInstruction extends Instruction implements IArraySt v.visitArrayStore(this); } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java index 5db0f757b..c67fdba77 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java @@ -70,6 +70,7 @@ final public class BinaryOpInstruction extends Instruction implements IBinaryOpI } } + @Override public Operator getOperator() { if (opcode < OP_iand) { // For these opcodes, there are 4 variants (i,l,f,d) @@ -101,6 +102,7 @@ final public class BinaryOpInstruction extends Instruction implements IBinaryOpI return Util.getWordSize(getType()); } + @Override public String getType() { int t; if (opcode < OP_iand) { @@ -121,14 +123,17 @@ final public class BinaryOpInstruction extends Instruction implements IBinaryOpI return "BinaryOp(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return opcode == Constants.OP_idiv || opcode == Constants.OP_ldiv || opcode == Constants.OP_irem || opcode == Constants.OP_lrem; } + @Override public boolean throwsExceptionOnOverflow() { return false; } + @Override public boolean isUnsigned() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java index b12c341fe..1e46b26e5 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java @@ -51,6 +51,7 @@ final public class CheckCastInstruction extends Instruction implements ITypeTest /** * @return the type to which the operand is cast */ + @Override public String[] getTypes() { return new String[]{ type }; } @@ -78,10 +79,12 @@ final public class CheckCastInstruction extends Instruction implements ITypeTest return "CheckCast(" + type + ")"; } + @Override public boolean isPEI() { return true; } + @Override public boolean firstClassTypes() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java index 8f0d856aa..a35585d56 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java @@ -64,6 +64,7 @@ final public class ComparisonInstruction extends Instruction implements ICompari /** * @return OPR_cmp (for long), OPR_cmpl, or OPR_cmpg (for float and double) */ + @Override public Operator getOperator() { switch (opcode) { case OP_lcmp: @@ -79,6 +80,7 @@ final public class ComparisonInstruction extends Instruction implements ICompari } } + @Override public String getType() { switch (opcode) { case OP_lcmp: @@ -124,6 +126,7 @@ final public class ComparisonInstruction extends Instruction implements ICompari return "Comparison(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java index 7eaadcf7b..0e4c3f33f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java @@ -73,6 +73,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I return r; } + @Override public int getTarget() { return label; } @@ -89,6 +90,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I } } + @Override public Operator getOperator() { if (opcode < OP_if_acmpeq) { return Operator.values()[opcode - OP_if_icmpeq]; @@ -97,6 +99,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I } } + @Override public String getType() { return opcode < OP_if_acmpeq ? TYPE_int : TYPE_Object; } @@ -119,6 +122,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I v.visitConditionalBranch(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java index 8fd447e55..e9ef8552e 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java @@ -660,6 +660,7 @@ public abstract class ConstantInstruction extends Instruction { return "Constant(" + getType() + "," + quote(getValue()) + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java index 0561567e9..4569f5fae 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java @@ -69,6 +69,7 @@ public final class ConversionInstruction extends Instruction implements IConvers return 1; } + @Override public String getFromType() { return fromType; } @@ -77,6 +78,7 @@ public final class ConversionInstruction extends Instruction implements IConvers return a < b ? a : a + 1; } + @Override public String getToType() { return toType; } @@ -116,10 +118,12 @@ public final class ConversionInstruction extends Instruction implements IConvers v.visitConversion(this); } + @Override public boolean isPEI() { return false; } + @Override public boolean throwsExceptionOnOverflow() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java index a5d4822a1..19a5a18a1 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java @@ -105,6 +105,7 @@ public final class DupInstruction extends Instruction { v.visitDup(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java index c5c25b662..382b1fa96 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java @@ -104,18 +104,22 @@ public class GetInstruction extends Instruction implements IGetInstruction { } } + @Override public String getClassType() { return classType; } + @Override public String getFieldName() { return fieldName; } + @Override public String getFieldType() { return type; } + @Override final public boolean isStatic() { return opcode == OP_getstatic; } @@ -154,6 +158,7 @@ public class GetInstruction extends Instruction implements IGetInstruction { v.visitGet(this); } + @Override public boolean isPEI() { return !isStatic(); } @@ -161,6 +166,7 @@ public class GetInstruction extends Instruction implements IGetInstruction { /** * Java does not permit this */ + @Override public boolean isAddressOf() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java index f7c513091..187099de1 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java @@ -94,6 +94,7 @@ public final class GotoInstruction extends Instruction { v.visitGoto(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java index c50b8d34d..d32b57e46 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java @@ -149,6 +149,7 @@ public interface IInstruction { /** * Subclasses must implement toString. */ + @Override public String toString(); /** diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java index 7cd60989d..7469e1c45 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java @@ -42,6 +42,7 @@ public interface IInvokeInstruction extends IInstruction { } }; + @Override public boolean hasImplicitThis() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java index f9c58db2b..d9413edbb 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java @@ -48,6 +48,7 @@ public final class InstanceofInstruction extends Instruction implements IInstanc return 1; } + @Override public String getType() { return type; } @@ -75,10 +76,12 @@ public final class InstanceofInstruction extends Instruction implements IInstanc return "Instanceof(" + type + ")"; } + @Override public boolean isPEI() { return false; } + @Override public boolean firstClassType() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java index 84c5b7a21..398e747bd 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java @@ -54,6 +54,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * @return true if the instruction can "fall through" to the following instruction */ + @Override public boolean isFallThrough() { return true; } @@ -62,6 +63,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction * @return an array containing the labels this instruction can branch to (not including the following instruction if this * instruction 'falls through') */ + @Override public int[] getBranchTargets() { return noInstructions; } @@ -69,6 +71,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * @return an Instruction equivalent to this one but with any branch labels updated by looking them up in the targetMap array */ + @Override public IInstruction redirectTargets(int[] targetMap) { return this; } @@ -76,6 +79,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * @return the number of values this instruction pops off the working stack */ + @Override public int getPoppedCount() { return 0; } @@ -93,6 +97,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction * @param poppedTypesToCheck the types of the data popped off the stack by this instruction; if poppedTypes is null, then we don't * know the incoming stack types and the result of this method may be less accurate */ + @Override public String getPushedType(String[] poppedTypesToCheck) { return null; } @@ -101,6 +106,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction * @return the JVM word size of the value this instruction pushes onto the stack, or 0 if this instruction doesn't push anything * onto the stack. */ + @Override public byte getPushedWordSize() { return 0; } @@ -108,6 +114,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * Apply a Visitor to this instruction. We invoke the appropriate Visitor method according to the type of this instruction. */ + @Override public abstract void visit(IInstruction.Visitor v); /** diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java index 5e291ff88..e75978635 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java @@ -127,14 +127,17 @@ public class InvokeInstruction extends Instruction implements IInvokeInstruction } } + @Override public String getClassType() { return classType; } + @Override public String getMethodName() { return methodName; } + @Override public String getMethodSignature() { return type; } @@ -195,10 +198,12 @@ public class InvokeInstruction extends Instruction implements IInvokeInstruction return "Invoke(" + getInvocationModeString() + "," + getClassType() + "," + getMethodName() + "," + getMethodSignature() + ")"; } + @Override public boolean isPEI() { return true; } + @Override public Dispatch getInvocationCode() { switch (opcode) { case Constants.OP_invokestatic: diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java index cc950dc35..8189ab227 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java @@ -51,10 +51,12 @@ public final class LoadInstruction extends Instruction implements ILoadInstructi /** * @return the index of the local variable loaded */ + @Override public int getVarIndex() { return index; } + @Override public String getType() { if (opcode < OP_iload_0) { return indexedTypes[opcode - OP_iload]; @@ -98,6 +100,7 @@ public final class LoadInstruction extends Instruction implements ILoadInstructi return "LocalLoad(" + getType() + "," + index + ")"; } + @Override public boolean isPEI() { return false; } @@ -106,6 +109,7 @@ public final class LoadInstruction extends Instruction implements ILoadInstructi * Java does not permit this. * @see com.ibm.wala.shrikeBT.IMemoryOperation#isAddressOf() */ + @Override public boolean isAddressOf() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java index bda34c9c6..a85838fd4 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java @@ -63,6 +63,7 @@ public final class MonitorInstruction extends Instruction { return "Monitor(" + (isEnter() ? "ENTER" : "EXIT") + ")"; } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java index 3df1885c9..5d2e8c680 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java @@ -113,6 +113,7 @@ public final class NewInstruction extends Instruction { v.visitNew(this); } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java index 8865bd33d..ef939415f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java @@ -65,6 +65,7 @@ public final class PopInstruction extends Instruction { return "Pop(" + size + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java index 897b19c54..14b1f3438 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java @@ -104,18 +104,22 @@ public class PutInstruction extends Instruction implements IPutInstruction { } } + @Override public String getClassType() { return classType; } + @Override public String getFieldType() { return type; } + @Override public String getFieldName() { return fieldName; } + @Override final public boolean isStatic() { return opcode == OP_putstatic; } @@ -141,6 +145,7 @@ public class PutInstruction extends Instruction implements IPutInstruction { v.visitPut(this); } + @Override public boolean isPEI() { return !isStatic(); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java index 28ef30b6b..c38eb8fdd 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java @@ -84,6 +84,7 @@ public final class ReturnInstruction extends Instruction { return "Return(" + getType() + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java index a57c50200..2f2ed98cd 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java @@ -51,6 +51,7 @@ public final class ShiftInstruction extends Instruction implements IShiftInstruc } } + @Override public Operator getOperator() { return Operator.values()[(opcode - OP_ishl) / 2]; } @@ -75,6 +76,7 @@ public final class ShiftInstruction extends Instruction implements IShiftInstruc return Util.getWordSize(getType()); } + @Override public String getType() { return indexedTypes[(opcode - OP_ishl) & 1]; } @@ -89,10 +91,12 @@ public final class ShiftInstruction extends Instruction implements IShiftInstruc return "Shift(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return false; } + @Override public boolean isUnsigned() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java index d88b4e0a8..4f3f107e9 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java @@ -51,10 +51,12 @@ public final class StoreInstruction extends Instruction implements IStoreInstruc /** * @return the index of the local variable stored */ + @Override public int getVarIndex() { return index; } + @Override public String getType() { if (opcode < OP_istore_0) { return indexedTypes[opcode - OP_istore]; @@ -93,6 +95,7 @@ public final class StoreInstruction extends Instruction implements IStoreInstruc v.visitLocalStore(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java index 8d7d6e30b..7eafd4988 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java @@ -53,6 +53,7 @@ public final class SwapInstruction extends Instruction { v.visitSwap(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java index 8e5a1b52c..f38aa33b6 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java @@ -147,6 +147,7 @@ public final class SwitchInstruction extends Instruction { v.visitSwitch(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java index 3d334bd24..2f37950c4 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java @@ -70,6 +70,7 @@ public final class ThrowInstruction extends Instruction { return "Throw()"; } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java index 7b3cbcaf0..a119eb987 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java @@ -46,6 +46,7 @@ public final class UnaryOpInstruction extends Instruction implements IUnaryOpIns } } + @Override public IUnaryOpInstruction.Operator getOperator() { return IUnaryOpInstruction.Operator.NEG; } @@ -70,6 +71,7 @@ public final class UnaryOpInstruction extends Instruction implements IUnaryOpIns return Util.getWordSize(getType()); } + @Override public String getType() { return indexedTypes[opcode - OP_ineg]; } @@ -84,6 +86,7 @@ public final class UnaryOpInstruction extends Instruction implements IUnaryOpIns return "UnaryOp(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java index c5028f497..969fcfd68 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java @@ -81,6 +81,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /** * @see ClassHierarchyProvider#getSuperClass(String) */ + @Override public String getSuperClass(String cl) { ClassInfo info = contents.get(cl); return info == null ? null : info.superClass; @@ -89,6 +90,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /* * @see ClassHierarchyProvider#getSuperInterfaces(String) */ + @Override public String[] getSuperInterfaces(String cl) { ClassInfo info = contents.get(cl); return info == null ? null : info.superInterfaces; @@ -97,6 +99,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /* * @see ClassHierarchyProvider#getSubClasses(String) */ + @Override public String[] getSubClasses(String cl) { ClassInfo info = contents.get(cl); return (info == null || !info.isFinal) ? null : noClasses; @@ -105,6 +108,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /* * @see ClassHierarchyProvider#isInterface(String) */ + @Override public int isInterface(String cl) { ClassInfo info = contents.get(cl); return info == null ? Constants.MAYBE : (info.isInterface ? Constants.YES : Constants.NO); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java index f60c72c8b..03a01118b 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java @@ -275,6 +275,7 @@ public class InstructionTypeCounter implements MethodData.Results { * * This is not to be called by clients. */ + @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { // just throw this away and we'll recalculate from scratch if necessary diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java index 39e5c498c..35071c4ff 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java @@ -68,6 +68,7 @@ public class LocalAllocator implements MethodData.Results { /** * This should not be called by clients. */ + @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { return false; diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java index 6631e3831..21d0d3374 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java @@ -48,6 +48,7 @@ public class ThisAssignmentChecker implements MethodData.Results { /** * This should not be called by any client. */ + @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { // just throw this away and we'll recalculate from scratch if necessary diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java index 119d3c677..154b9332f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java @@ -118,6 +118,7 @@ public class AddSerialVersion { } } Arrays.sort(fields, 0, fieldCount, new Comparator() { + @Override public int compare(Integer o1, Integer o2) { String name1 = fieldNames[o1.intValue()]; String name2 = fieldNames[o2.intValue()]; @@ -153,6 +154,7 @@ public class AddSerialVersion { } } Arrays.sort(methods, 0, methodCount, new Comparator() { + @Override public int compare(Integer o1, Integer o2) { int m1 = o1.intValue(); int m2 = o2.intValue(); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java index ef2bfc861..2d16fda4a 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java @@ -239,6 +239,7 @@ public abstract class OfflineInstrumenterBase { throw new IllegalArgumentException("d is null"); } File[] fs = d.listFiles(new FileFilter() { + @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".class"); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java b/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java index d7609b3e2..bc24e923a 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java +++ b/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java @@ -30,6 +30,7 @@ public class BasicFramework implements IKilldallFramewor /* * @see com.ibm.wala.dataflow.graph.IKilldallFramework#getFlowGraph() */ + @Override public Graph getFlowGraph() { return flowGraph; } @@ -37,6 +38,7 @@ public class BasicFramework implements IKilldallFramewor /* * @see com.ibm.wala.dataflow.graph.IKilldallFramework#getTransferFunctionMap() */ + @Override public ITransferFunctionProvider getTransferFunctionProvider() { return transferFunctionProvider; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java index d5fe1dd4d..29def0776 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java @@ -127,6 +127,7 @@ public abstract class AbstractFixedPointSolver> implement * * @return true iff the evaluation of some equation caused a change in the value of some variable. */ + @Override @SuppressWarnings("unchecked") public boolean solve(IProgressMonitor monitor) throws CancelException { @@ -171,6 +172,7 @@ public abstract class AbstractFixedPointSolver> implement return globalChange; } + @Override public void performVerboseAction() { System.err.println("Evaluated " + nEvaluated); System.err.println("Created " + nCreated); diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java index cace0111f..c2647c820 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java @@ -35,6 +35,7 @@ public abstract class DefaultFixedPointSolver> extends Ab graph = new DefaultFixedPointSystem(); } + @Override public IFixedPointSystem getFixedPointSystem() { return graph; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java index 825ce9b54..338319251 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java @@ -87,19 +87,23 @@ public class DefaultFixedPointSystem> implements IFixedPo return graph.toString(); } + @Override public void removeStatement(IFixedPointStatement s) { graph.removeNodeAndEdges(s); } + @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public Iterator getStatements() { return new FilterIterator(graph.iterator(), new Filter() { + @Override public boolean accepts(Object x) { return x instanceof AbstractStatement; } }); } + @Override @SuppressWarnings("rawtypes") public void addStatement(IFixedPointStatement statement) throws IllegalArgumentException, UnimplementedError { if (statement == null) { @@ -197,6 +201,7 @@ public class DefaultFixedPointSystem> implements IFixedPo return (AbstractStatement) graph.getNode(number); } + @Override public void reorder() { if (DEBUG) { checkGraph(); @@ -226,10 +231,12 @@ public class DefaultFixedPointSystem> implements IFixedPo } } + @Override public Iterator getStatementsThatUse(T v) { return (graph.containsNode(v) ? graph.getSuccNodes(v) : EmptyIterator.instance()); } + @Override public Iterator getStatementsThatDef(T v) { return (graph.containsNode(v) ? graph.getPredNodes(v) : EmptyIterator.instance()); } @@ -239,16 +246,20 @@ public class DefaultFixedPointSystem> implements IFixedPo return (T) graph.getNode(n); } + @Override public int getNumberOfStatementsThatUse(T v) { return (graph.containsNode(v) ? graph.getSuccNodeCount(v) : 0); } + @Override public int getNumberOfStatementsThatDef(T v) { return (graph.containsNode(v) ? graph.getPredNodeCount(v) : 0); } + @Override public Iterator getVariables() { return new FilterIterator(graph.iterator(), new Filter() { + @Override public boolean accepts(T x) { return x instanceof IVariable; } @@ -268,10 +279,12 @@ public class DefaultFixedPointSystem> implements IFixedPo return graph.getPredNodeCount(n); } + @Override public boolean containsStatement(IFixedPointStatement s) { return equations.contains(s); } + @Override public boolean containsVariable(T v) { return variables.contains(v); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java index f60f98717..0cfbfb06b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java @@ -32,6 +32,7 @@ public abstract class GeneralStatement> extends AbstractS * * @return true if the lhs value changed. false otherwise */ + @Override public byte evaluate() { return operator.evaluate(lhs, rhs); } @@ -41,6 +42,7 @@ public abstract class GeneralStatement> extends AbstractS * * @return the lattice cell this equation computes */ + @Override public T getLHS() { return lhs; } @@ -54,6 +56,7 @@ public abstract class GeneralStatement> extends AbstractS * @param cell the cell in question * @return true or false */ + @Override public boolean hasVariable(T cell) { if (lhs == cell) { return true; @@ -209,6 +212,7 @@ public abstract class GeneralStatement> extends AbstractS return operator; } + @Override public T[] getRHS() { return rhs; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java index 19703db87..af342b542 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java @@ -31,6 +31,7 @@ public abstract class NullaryStatement extends AbstractStat * * @return true if the lhs value changed. false otherwise */ + @Override public byte evaluate() { NullaryOperator op = getOperator(); return op.evaluate(lhs); @@ -41,6 +42,7 @@ public abstract class NullaryStatement extends AbstractStat * * @return the lattice cell this equation computes */ + @Override public T getLHS() { return lhs; } @@ -50,6 +52,7 @@ public abstract class NullaryStatement extends AbstractStat * @param cell the cell in question * @return true or false */ + @Override public boolean hasVariable(T cell) { return lhs == cell; } @@ -99,6 +102,7 @@ public abstract class NullaryStatement extends AbstractStat return result; } + @Override public T[] getRHS() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java index d74678ca4..d34213f07 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java @@ -52,10 +52,12 @@ public abstract class AbstractVariable extends NodeW return hashCode; } + @Override public int getOrderNumber() { return orderNumber; } + @Override public void setOrderNumber(int orderNumber) { this.orderNumber = orderNumber; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java index 4956e8377..9b6826792 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java @@ -28,6 +28,7 @@ public class BitVectorVariable extends AbstractVariable { /* * @see com.ibm.wala.fixpoint.IVariable#copyState(com.ibm.wala.fixpoint.IVariable) */ + @Override public void copyState(BitVectorVariable other) { if (other == null) { throw new IllegalArgumentException("null other"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java index 2bd4e9059..9237b38ee 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java @@ -28,6 +28,7 @@ public class BooleanVariable extends AbstractVariable { this.B = b; } + @Override public void copyState(BooleanVariable other) { if (other == null) { throw new IllegalArgumentException("other null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java index b76a74b0d..5955e6538 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java @@ -24,6 +24,7 @@ public abstract class IntSetVariable extends AbstractV private MutableIntSet V; + @Override public void copyState(T other) { if (V == null) { if (other.V == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java index 95ef48cc8..aa9439d61 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java @@ -30,6 +30,7 @@ public abstract class UnaryStatement extends AbstractStatem * * @return true if the lhs value changed. false otherwise */ + @Override public byte evaluate() { UnaryOperator op = getOperator(); return op.evaluate(lhs, rhs); @@ -40,6 +41,7 @@ public abstract class UnaryStatement extends AbstractStatem * * @return the lattice cell this equation computes */ + @Override public T getLHS() { return lhs; } @@ -66,6 +68,7 @@ public abstract class UnaryStatement extends AbstractStatem * @param cell the cell in question * @return true or false */ + @Override public boolean hasVariable(T cell) { if (lhs == cell) return true; @@ -152,6 +155,7 @@ public abstract class UnaryStatement extends AbstractStatem return result; } + @Override public T[] getRHS() throws UnsupportedOperationException { // This should never be called ...use the more efficient getRightHandSide instead throw new UnsupportedOperationException(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java b/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java index 511aca236..d246b671d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java @@ -44,6 +44,7 @@ public class ProgressMaster implements IProgressMonitor { return new ProgressMaster(monitor); } + @Override public synchronized void beginTask(String name, int totalWork) { delegate.beginTask(name, totalWork); startNanny(); @@ -72,6 +73,7 @@ public class ProgressMaster implements IProgressMonitor { return timedOut; } + @Override public synchronized void done() { killNanny(); delegate.done(); @@ -88,6 +90,7 @@ public class ProgressMaster implements IProgressMonitor { } } + @Override public boolean isCanceled() { return delegate.isCanceled() || timedOut; } @@ -96,6 +99,7 @@ public class ProgressMaster implements IProgressMonitor { killNanny(); } + @Override public synchronized void worked(int work) { killNanny(); delegate.worked(work); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java index c1711aec6..ec483e96c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java @@ -60,6 +60,7 @@ abstract class AbstractMultiMap implements MultiMap { } + @Override public Set get(K key) { Set ret = map.get(key); if (ret == null) { @@ -78,6 +79,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#put(K, V) */ + @Override public boolean put(K key, V val) { Set vals = map.get(key); if (vals == null) { @@ -92,6 +94,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#remove(K, V) */ + @Override public boolean remove(K key, V val) { Set elems = map.get(key); if (elems == null) @@ -103,6 +106,7 @@ abstract class AbstractMultiMap implements MultiMap { return ret; } + @Override public Set removeAll(K key) { return map.remove(key); } @@ -112,6 +116,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#keys() */ + @Override public Set keySet() { return map.keySet(); } @@ -121,6 +126,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#containsKey(java.lang.Object) */ + @Override public boolean containsKey(K key) { return map.containsKey(key); } @@ -130,6 +136,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#size() */ + @Override public int size() { int ret = 0; for (K key : keySet()) { @@ -153,6 +160,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#putAll(K, java.util.Set) */ + @Override public boolean putAll(K key, Collection vals) { Set edges = map.get(key); if (edges == null) { @@ -162,10 +170,12 @@ abstract class AbstractMultiMap implements MultiMap { return edges.addAll(vals); } + @Override public void clear() { map.clear(); } + @Override public boolean isEmpty() { return map.isEmpty(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java index 9f8b0e0eb..afa0cb471 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java @@ -76,10 +76,12 @@ public class ArrayIterator implements Iterator { this.last = last; } + @Override public boolean hasNext() { return _cnt <= last; } + @Override public T next() throws NoSuchElementException { if (_cnt >= _elts.length) { throw new NoSuchElementException(); @@ -87,6 +89,7 @@ public class ArrayIterator implements Iterator { return _elts[_cnt++]; } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java index f604f4d30..43b9d1b74 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java @@ -228,14 +228,17 @@ public class ArraySet extends AbstractSet { public ArraySetIterator() { } + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return ind < setSize; } + @Override public T next() { if (ind >= setSize) { throw new NoSuchElementException(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java index 701e3dc4e..16a2966e0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java @@ -44,6 +44,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#size() */ + @Override public int size() { return (backingStore == null) ? 0 : backingStore.size(); } @@ -51,6 +52,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#isEmpty() */ + @Override public boolean isEmpty() { return (backingStore == null) ? true : backingStore.isEmpty(); } @@ -58,6 +60,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#containsKey(java.lang.Object) */ + @Override public boolean containsKey(Object key) { return (backingStore == null) ? false : backingStore.containsKey(key); } @@ -65,6 +68,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#containsValue(java.lang.Object) */ + @Override public boolean containsValue(Object value) { return (backingStore == null) ? false : backingStore.containsValue(value); } @@ -72,6 +76,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#get(java.lang.Object) */ + @Override public V get(Object key) { return (backingStore == null) ? null : backingStore.get(key); } @@ -79,6 +84,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ + @Override public V put(K key, V value) { if (backingStore == null) { backingStore = new SmallMap(); @@ -114,6 +120,7 @@ public class BimodalMap implements Map { /** * @throws UnsupportedOperationException if the backingStore doesn't support remove */ + @Override public V remove(Object key) { return (backingStore == null) ? null : backingStore.remove(key); } @@ -121,6 +128,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#putAll(java.util.Map) */ + @Override @SuppressWarnings("unchecked") public void putAll(Map t) throws UnsupportedOperationException { if (t == null) { @@ -157,6 +165,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#clear() */ + @Override public void clear() { backingStore = null; } @@ -164,6 +173,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#keySet() */ + @Override @SuppressWarnings("unchecked") public Set keySet() { return (Set) ((backingStore == null) ? Collections.emptySet() : backingStore.keySet()); @@ -172,6 +182,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#values() */ + @Override @SuppressWarnings("unchecked") public Collection values() { return (Collection) ((backingStore == null) ? Collections.emptySet() : backingStore.values()); @@ -180,6 +191,7 @@ public class BimodalMap implements Map { /** * @throws UnimplementedError if the backingStore implementation does */ + @Override @SuppressWarnings("unchecked") public Set> entrySet() { return (Set>) ((backingStore == null) ? Collections.emptySet() : backingStore.entrySet()); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java index b5f4d7b1d..feb63ebff 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java @@ -31,6 +31,7 @@ public class CollectionFilter implements Filter { /* * @see com.ibm.wala.util.Filter#accepts(java.lang.Object) */ + @Override public boolean accepts(T o) { return S.contains(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java index 56b46277c..04e76da8c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java @@ -38,14 +38,17 @@ public abstract class ComposedIterator implements Iterator { public abstract Iterator makeInner(O outer); + @Override public void remove() throws UnsupportedOperationException{ throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return (inner != null); } + @Override public I next() { I result = inner.next(); if (!inner.hasNext()) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java index 273890489..35e7a8dc0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java @@ -40,11 +40,13 @@ public class CompoundIntIterator implements IntIterator { } + @Override public boolean hasNext() { return A.hasNext() || B.hasNext(); } + @Override public int next() { if (A.hasNext()) { return A.next(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java index ae59f965a..8ca0968ea 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java @@ -28,10 +28,12 @@ public class CompoundIterator implements Iterator { this.B = B; } + @Override public boolean hasNext() { return A.hasNext() || B.hasNext(); } + @Override public T next() throws NoSuchElementException { if (A.hasNext()) { return A.next(); @@ -43,6 +45,7 @@ public class CompoundIterator implements Iterator { /** * @see java.util.Iterator#remove() */ + @Override public void remove() { } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java index 87f9b4a6c..f69e21399 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java @@ -32,10 +32,12 @@ public final class EmptyIntIterator implements IntIterator { private EmptyIntIterator() { } + @Override public boolean hasNext() { return false; } + @Override public int next() throws NoSuchElementException { throw new NoSuchElementException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java index 59138cebb..f053dbbed 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java @@ -33,14 +33,17 @@ public final class EmptyIterator implements Iterator { private EmptyIterator() { } + @Override public boolean hasNext() { return false; } + @Override public T next() { throw new NoSuchElementException(); } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java index b935e4143..d96095532 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java @@ -58,6 +58,7 @@ public class FilterIterator implements java.util.Iterator { done = true; } + @Override public T next() throws NoSuchElementException { if (done) { throw new java.util.NoSuchElementException(); @@ -67,10 +68,12 @@ public class FilterIterator implements java.util.Iterator { return o; } + @Override public boolean hasNext() { return !done; } + @Override public void remove() throws UnsupportedOperationException { throw new java.lang.UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java index 4c141bc86..5bac2669c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java @@ -30,6 +30,7 @@ public class Filtersection implements Filter { } } + @Override public boolean accepts(T o) { return a.accepts(o) && b.accepts(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java index 0c85fe286..ed310f08b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java @@ -23,6 +23,7 @@ public class HashCodeComparator implements Comparator { /* * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ + @Override public int compare(T o1, T o2) throws NullPointerException { // by convention null is less than non-null if (o1 == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java index 60832aa22..f2a89ab22 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java @@ -250,7 +250,8 @@ public class ImmutableStack implements Iterable { return new ImmutableStack(tmpEntries); } - public Iterator iterator() { + @Override + public Iterator iterator() { if (entries.length == 0) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java index 966f24f2e..7963e8320 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java @@ -24,6 +24,7 @@ public class IndiscriminateFilter implements Filter { /* * @see com.ibm.wala.util.Filter#accepts(java.lang.Object) */ + @Override public boolean accepts(Object o) { return true; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java index 83d0f1fc5..441cf70e4 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java @@ -34,14 +34,17 @@ public class IntMapIterator implements Iterator { this.f = f; } + @Override public T next() { return f.apply(i.next()); } + @Override public boolean hasNext() { return i.hasNext(); } + @Override public void remove() throws UnsupportedOperationException { throw new java.lang.UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java index b10c0036d..22ebc90df 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java @@ -54,6 +54,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#size() */ + @Override public int size() { return getDelegate().size(); } @@ -61,6 +62,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#clear() */ + @Override public void clear() { getDelegate().clear(); } @@ -68,6 +70,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#isEmpty() */ + @Override public boolean isEmpty() { return getDelegate().isEmpty(); } @@ -75,6 +78,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#toArray() */ + @Override public Object[] toArray() { return getDelegate().toArray(); } @@ -82,6 +86,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#add(java.lang.Object) */ + @Override public boolean add(T arg0) { return getDelegate().add(arg0); } @@ -89,6 +94,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#contains(java.lang.Object) */ + @Override public boolean contains(Object arg0) { return getDelegate().contains(arg0); } @@ -96,6 +102,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#remove(java.lang.Object) */ + @Override public boolean remove(Object arg0) { return getDelegate().remove(arg0); } @@ -103,6 +110,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#addAll(java.util.Collection) */ + @Override public boolean addAll(Collection arg0) { return getDelegate().addAll(arg0); } @@ -110,6 +118,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#containsAll(java.util.Collection) */ + @Override public boolean containsAll(Collection arg0) { return getDelegate().containsAll(arg0); } @@ -117,6 +126,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#removeAll(java.util.Collection) */ + @Override public boolean removeAll(Collection arg0) { return getDelegate().removeAll(arg0); } @@ -124,6 +134,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#retainAll(java.util.Collection) */ + @Override public boolean retainAll(Collection arg0) { return getDelegate().retainAll(arg0); } @@ -131,10 +142,12 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#iterator() */ + @Override public Iterator iterator() { return getDelegate().iterator(); } + @Override @SuppressWarnings("hiding") public T[] toArray(T[] a) { return getDelegate().toArray(a); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java index fc9cd17c0..ba5b756c3 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java @@ -27,6 +27,7 @@ public class Iterator2Iterable implements Iterable { this.iter = iter; } + @Override public Iterator iterator() { return iter; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java index 48d21d068..aef864745 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java @@ -26,42 +26,52 @@ public class Iterator2List extends Iterator2Collection implements List } } + @Override public void add(int index, T element) { delegate.add(index, element); } + @Override public boolean addAll(int index, Collection c) { return delegate.addAll(index, c); } + @Override public T get(int index) { return delegate.get(index); } + @Override public int indexOf(Object o) { return delegate.indexOf(o); } + @Override public int lastIndexOf(Object o) { return delegate.lastIndexOf(o); } + @Override public ListIterator listIterator() { return delegate.listIterator(); } + @Override public ListIterator listIterator(int index) { return delegate.listIterator(index); } + @Override public T remove(int index) { return delegate.remove(index); } + @Override public T set(int index, T element) { return delegate.set(index, element); } + @Override public List subList(int fromIndex, int toIndex) { return delegate.subList(fromIndex, toIndex); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java index decb755a8..c9a5166e7 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java @@ -33,10 +33,12 @@ public class IteratorPlusOne implements Iterator { this.xtra = xtra; } + @Override public boolean hasNext() { return it.hasNext() || (xtra != null); } + @Override public T next() { if (it.hasNext()) { return it.next(); @@ -47,6 +49,7 @@ public class IteratorPlusOne implements Iterator { } } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java index 8831b76e3..5fe2b0364 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java @@ -30,10 +30,12 @@ public class IteratorPlusTwo implements Iterator { this.xtra2 = xtra2; } + @Override public boolean hasNext() { return it.hasNext() || (xtra1 != null) || (xtra2 != null); } + @Override public T next() { if (it.hasNext()) { return it.next(); @@ -48,6 +50,7 @@ public class IteratorPlusTwo implements Iterator { } } + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java index 11f9686d1..9cff3e485 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java @@ -30,14 +30,17 @@ public class MapIterator implements Iterator { this.f = f; } + @Override public Y next() { return f.apply(i.next()); } + @Override public boolean hasNext() { return i.hasNext(); } + @Override public void remove() throws UnsupportedOperationException { throw new java.lang.UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java index b72067f51..759fb55e0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java @@ -54,6 +54,7 @@ public interface MultiMap { public int size(); + @Override public String toString(); public boolean putAll(K key, Collection vals); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java index b46ebbf7d..2e8c0305f 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java @@ -31,10 +31,12 @@ public class NonNullSingletonIterator implements Iterator { this.it = o; } + @Override public boolean hasNext() { return it != null; } + @Override public T next() { if (it == null) { throw new NoSuchElementException(); @@ -45,6 +47,7 @@ public class NonNullSingletonIterator implements Iterator { } } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java index 1c78becab..8fd99a79b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java @@ -40,6 +40,7 @@ public class ObjectArrayMapping implements OrdinalSetMapping { } } + @Override public T getMappedObject(int n) throws NoSuchElementException { try { return array[n]; @@ -48,6 +49,7 @@ public class ObjectArrayMapping implements OrdinalSetMapping { } } + @Override public int getMappedIndex(Object o) { if (map.get(o) == null) { return -1; @@ -55,23 +57,28 @@ public class ObjectArrayMapping implements OrdinalSetMapping { return map.get(o).intValue(); } + @Override public boolean hasMappedIndex(Object o) { return map.get(o) != null; } + @Override public Iterator iterator() { return map.keySet().iterator(); } + @Override public int add(Object o) throws UnimplementedError { Assertions.UNREACHABLE(); return 0; } + @Override public int getMaximumIndex() { return array.length - 1; } + @Override public int getSize() { return map.size(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java index 96751699d..963231bde 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java @@ -30,6 +30,7 @@ public class OrFilter implements Filter { this.b = b; } + @Override public boolean accepts(T o) { return a.accepts(o) || b.accepts(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java index 2f70da11b..bf2c8272d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java @@ -48,10 +48,12 @@ public class Pair { return new Iterator() { byte next = 1; + @Override public boolean hasNext() { return next > 0; } + @Override public Object next() { switch (next) { case 1 : @@ -65,6 +67,7 @@ public class Pair { } } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java index 2647dd5a1..e89a2d788 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java @@ -38,10 +38,12 @@ public class ReverseIterator implements Iterator { nextIndex = list.size() - 1; } + @Override public boolean hasNext() { return nextIndex > -1; } + @Override public T next() throws NoSuchElementException { if (!hasNext()) { throw new NoSuchElementException(); @@ -49,6 +51,7 @@ public class ReverseIterator implements Iterator { return list.get(nextIndex--); } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java index 783466c0b..9ceef764b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java @@ -32,6 +32,7 @@ public class SimpleVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#get(int) */ + @Override @SuppressWarnings("unchecked") public T get(int x) { if (x < 0) { @@ -47,6 +48,7 @@ public class SimpleVector implements IVector { /* * @see com.ibm.wala.util.intset.IVector#set(int, int) */ + @Override public void set(int x, T value) { if (x < 0) { throw new IllegalArgumentException("illegal x value " + x); @@ -81,6 +83,7 @@ public class SimpleVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#reportStats() */ + @Override public void performVerboseAction() { System.err.println(("size: " + store.length)); System.err.println(("occupancy: " + computeOccupancy())); @@ -100,6 +103,7 @@ public class SimpleVector implements IVector { } + @Override @SuppressWarnings("unchecked") public Iterator iterator() { ArrayList result = new ArrayList(); @@ -109,6 +113,7 @@ public class SimpleVector implements IVector { return result.iterator(); } + @Override public int getMaxIndex() { return maxIndex; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java index 51d5861c1..c14c9fd50 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java @@ -35,6 +35,7 @@ public class SmallMap implements Map { /* */ + @Override public int size() { if (keysAndValues == null) { return 0; @@ -79,6 +80,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#isEmpty() */ + @Override public boolean isEmpty() { return (keysAndValues == null); } @@ -86,6 +88,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#containsKey(java.lang.Object) */ + @Override public boolean containsKey(Object key) { for (int i = 0; i < size(); i++) { if (keysAndValues[i].equals(key)) { @@ -98,6 +101,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#containsValue(java.lang.Object) */ + @Override public boolean containsValue(Object value) { if (keysAndValues == null) { return false; @@ -120,6 +124,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#get(java.lang.Object) */ + @Override @SuppressWarnings("unchecked") public V get(Object key) { @@ -149,6 +154,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ + @Override @SuppressWarnings({ "unchecked", "unused" }) public V put(Object key, Object value) { if (key == null) { @@ -173,6 +179,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#remove(java.lang.Object) */ + @Override public V remove(Object key) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -180,6 +187,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#putAll(java.util.Map) */ + @Override public void putAll(Map t) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -187,6 +195,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#clear() */ + @Override public void clear() { keysAndValues = null; } @@ -194,6 +203,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#keySet() */ + @Override @SuppressWarnings("unchecked") public Set keySet() { // TODO: use a better set implementation, SOON!! @@ -207,6 +217,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#values() */ + @Override @SuppressWarnings("unchecked") public Collection values() { int s = size(); @@ -223,6 +234,7 @@ public class SmallMap implements Map { /** * @throws UnimplementedError */ + @Override public Set> entrySet() throws UnimplementedError { Assertions.UNREACHABLE("must implement entrySet"); return null; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java index a530f07b7..82e75aba2 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java @@ -53,6 +53,7 @@ public class SparseVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#get(int) */ + @Override @SuppressWarnings("unchecked") public T get(int x) { int index = indices.getIndex(x); @@ -68,6 +69,7 @@ public class SparseVector implements IVector { * * @see com.ibm.wala.util.intset.IntVector#set(int, int) */ + @Override public void set(int x, T value) { int index = indices.getIndex(x); if (index == -1) { @@ -92,6 +94,7 @@ public class SparseVector implements IVector { /* * @see com.ibm.wala.util.debug.VerboseAction#performVerboseAction() */ + @Override public void performVerboseAction() { System.err.println((getClass() + " stats: ")); System.err.println(("data.length " + data.length)); @@ -102,15 +105,18 @@ public class SparseVector implements IVector { /* * @see com.ibm.wala.util.intset.IVector#iterator() */ + @Override public Iterator iterator() { return new Iterator() { int i = 0; + @Override public boolean hasNext() { return i < indices.size(); } + @Override @SuppressWarnings("unchecked") public T next() { if (!hasNext()) { @@ -119,6 +125,7 @@ public class SparseVector implements IVector { return (T) data[i++]; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -130,6 +137,7 @@ public class SparseVector implements IVector { /** * @return max i s.t get(i) != null */ + @Override public int getMaxIndex() throws IllegalStateException { return indices.max(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java index 42c2397c0..161fc3d19 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java @@ -25,6 +25,7 @@ public class ToStringComparator implements Comparator { /* * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ + @Override public int compare(T o1, T o2) throws NullPointerException { // by convention, null is the least element if (o1 == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java index d28e8f29a..26c59d53c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java @@ -36,6 +36,7 @@ public class TwoLevelVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#get(int) */ + @Override public T get(int x) { if (x < 0) { throw new IllegalArgumentException("invalid x: " + x); @@ -65,6 +66,7 @@ public class TwoLevelVector implements IVector { * * @see com.ibm.wala.util.intset.IntVector#set(int, int) */ + @Override public void set(int x, T value) { if (x < 0) { throw new IllegalArgumentException("illegal x: " + x); @@ -100,6 +102,7 @@ public class TwoLevelVector implements IVector { /* * @see com.ibm.wala.util.debug.VerboseAction#performVerboseAction() */ + @Override public void performVerboseAction() { // do nothing; } @@ -107,6 +110,7 @@ public class TwoLevelVector implements IVector { /* * @see com.ibm.wala.util.intset.IVector#iterator() */ + @Override public Iterator iterator() { return new Iterator() { final Iterator> outer = data.iterator(); @@ -125,10 +129,12 @@ public class TwoLevelVector implements IVector { } } + @Override public boolean hasNext() { return inner != null; } + @Override public T next() { T result = inner.next(); if (!inner.hasNext()) { @@ -147,6 +153,7 @@ public class TwoLevelVector implements IVector { return result; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -154,6 +161,7 @@ public class TwoLevelVector implements IVector { }; } + @Override public int getMaxIndex() { if (maxPage == -1) { return -1; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java index da0aeeea0..94b8d9253 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java @@ -30,6 +30,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.Graph#iterateNodes() */ + @Override public Iterator iterator() { return getNodeManager().iterator(); } @@ -37,6 +38,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.Graph#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return getNodeManager().getNumberOfNodes(); } @@ -44,6 +46,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(java.lang.Object) */ + @Override public int getPredNodeCount(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("n cannot be null"); @@ -54,6 +57,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(java.lang.Object) */ + @Override public Iterator getPredNodes(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("n cannot be null"); @@ -64,6 +68,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(java.lang.Object) */ + @Override public int getSuccNodeCount(T n) throws IllegalArgumentException { if (!containsNode(n) || n == null) { throw new IllegalArgumentException("node not in graph " + n); @@ -74,6 +79,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(java.lang.Object) */ + @Override public Iterator getSuccNodes(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("n cannot be null"); @@ -84,6 +90,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(T n) { getNodeManager().addNode(n); } @@ -92,6 +99,7 @@ public abstract class AbstractGraph implements Graph { * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, * com.ibm.wala.util.graph.Node) */ + @Override public void addEdge(T src, T dst) throws IllegalArgumentException { getEdgeManager().addEdge(src, dst); } @@ -99,6 +107,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdge(java.lang.Object, java.lang.Object) */ + @Override public void removeEdge(T src, T dst) throws IllegalArgumentException { getEdgeManager().removeEdge(src, dst); } @@ -106,6 +115,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#hasEdge(java.lang.Object, java.lang.Object) */ + @Override public boolean hasEdge(T src, T dst) { if (src == null) { throw new IllegalArgumentException("src is null"); @@ -119,6 +129,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -129,6 +140,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -139,6 +151,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -149,6 +162,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.Graph#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -160,6 +174,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("N cannot be null"); @@ -187,6 +202,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T n) { if (n == null) { throw new IllegalArgumentException("n cannot be null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java index ed630b9cc..431a1756d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java @@ -23,16 +23,19 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /** * @return the object which manages nodes in the graph */ + @Override protected abstract NumberedNodeManager getNodeManager(); /** * @return the object which manages edges in the graph */ + @Override protected abstract NumberedEdgeManager getEdgeManager(); /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getMaxNumber() */ + @Override public int getMaxNumber() { return getNodeManager().getMaxNumber(); } @@ -40,6 +43,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNode(int) */ + @Override public T getNode(int number) { return getNodeManager().getNode(number); } @@ -47,6 +51,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(T N) { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -57,6 +62,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(final IntSet s) { return new NumberedNodeIterator(s, this); } @@ -64,6 +70,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedEdgeManager#getPredNodeNumbers(java.lang.Object) */ + @Override public IntSet getPredNodeNumbers(T node) throws IllegalArgumentException { assert getEdgeManager() != null; return getEdgeManager().getPredNodeNumbers(node); @@ -72,6 +79,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedEdgeManager#getSuccNodeNumbers(java.lang.Object) */ + @Override public IntSet getSuccNodeNumbers(T node) throws IllegalArgumentException { return getEdgeManager().getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java index bc91b0ae8..4fa778937 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java @@ -49,51 +49,62 @@ public class EdgeFilteredNumberedGraph extends AbstractNumberedGraph { private final class Edges implements NumberedEdgeManager { + @Override public void addEdge(T src, T dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(T N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getPredNodes(T N) { Assertions.UNREACHABLE(); return null; } + @Override public int getSuccNodeCount(T N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getSuccNodes(T N) { Assertions.UNREACHABLE(); return null; } + @Override public boolean hasEdge(T src, T dst) { Assertions.UNREACHABLE(); return false; } + @Override public void removeAllIncidentEdges(T node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeEdge(T src, T dst) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(T node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(T node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public IntSet getPredNodeNumbers(T node) { IntSet s = delegate.getPredNodeNumbers(node); MutableIntSet result = MutableSparseIntSet.makeEmpty(); @@ -106,6 +117,7 @@ public class EdgeFilteredNumberedGraph extends AbstractNumberedGraph { return result; } + @Override public IntSet getSuccNodeNumbers(T node) { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java index 7ff21d2ba..0885de27e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java @@ -94,6 +94,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#getNodeTransferFunction(java.lang.Object) */ + @Override public UnaryOperator getNodeTransferFunction(T n) { int index = domain.getMappedIndex(n); if (index > -1) { @@ -106,6 +107,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#hasNodeTransferFunctions() */ + @Override public boolean hasNodeTransferFunctions() { return true; } @@ -113,6 +115,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#getEdgeTransferFunction(java.lang.Object, java.lang.Object) */ + @Override public UnaryOperator getEdgeTransferFunction(Object from, Object to) { Assertions.UNREACHABLE(); return null; @@ -121,6 +124,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#hasEdgeTransferFunctions() */ + @Override public boolean hasEdgeTransferFunctions() { return false; } @@ -128,6 +132,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#getMeetOperator() */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java index 755adaa45..0028ff087 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java @@ -82,10 +82,12 @@ public class GraphSlicer { final NodeManager n = new NodeManager() { int nodeCount = -1; + @Override public Iterator iterator() { return Predicate.filter(g.iterator(), p).iterator(); } + @Override public int getNumberOfNodes() { if (nodeCount == -1) { nodeCount = IteratorUtil.count(iterator()); @@ -93,14 +95,17 @@ public class GraphSlicer { return nodeCount; } + @Override public void addNode(T n) { Assertions.UNREACHABLE(); } + @Override public void removeNode(T n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(T n) { return p.test(n) && g.containsNode(n); } @@ -108,42 +113,52 @@ public class GraphSlicer { }; final EdgeManager e = new EdgeManager() { + @Override public Iterator getPredNodes(T n) { return Predicate.filter(g.getPredNodes(n), p).iterator(); } + @Override public int getPredNodeCount(T n) { return IteratorUtil.count(getPredNodes(n)); } + @Override public Iterator getSuccNodes(T n) { return Predicate.filter(g.getSuccNodes(n), p).iterator(); } + @Override public int getSuccNodeCount(T N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public void addEdge(T src, T dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(T src, T dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(T node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(T node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(T node) { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(T src, T dst) { return g.hasEdge(src, dst) && p.test(src) && p.test(dst); } @@ -170,14 +185,17 @@ public class GraphSlicer { final NodeManager nodeManager = new NodeManager() { private int count = -1; + @Override public void addNode(E n) { throw new UnsupportedOperationException(); } + @Override public boolean containsNode(E N) { return G.containsNode(N) && fmember.accepts(N); } + @Override public int getNumberOfNodes() { if (count == -1) { count = IteratorUtil.count(iterator()); @@ -185,10 +203,12 @@ public class GraphSlicer { return count; } + @Override public Iterator iterator() { return new FilterIterator(G.iterator(), fmember); } + @Override public void removeNode(E n) { throw new UnsupportedOperationException(); } @@ -229,6 +249,7 @@ public class GraphSlicer { private void setPredNodes(E N) { preds.put(N, getConnected(N, new Function>() { + @Override public Iterator apply(E object) { return G.getPredNodes(object); } @@ -237,12 +258,14 @@ public class GraphSlicer { private void setSuccNodes(E N) { succs.put(N, getConnected(N, new Function>() { + @Override public Iterator apply(E object) { return G.getSuccNodes(object); } })); } + @Override public int getPredNodeCount(E N) { if (!preds.containsKey(N)) { setPredNodes(N); @@ -250,6 +273,7 @@ public class GraphSlicer { return preds.get(N).size(); } + @Override public Iterator getPredNodes(E N) { if (!preds.containsKey(N)) { setPredNodes(N); @@ -257,6 +281,7 @@ public class GraphSlicer { return preds.get(N).iterator(); } + @Override public int getSuccNodeCount(E N) { if (!succs.containsKey(N)) { setSuccNodes(N); @@ -264,6 +289,7 @@ public class GraphSlicer { return succs.get(N).size(); } + @Override public Iterator getSuccNodes(E N) { if (!succs.containsKey(N)) { setSuccNodes(N); @@ -271,6 +297,7 @@ public class GraphSlicer { return succs.get(N).iterator(); } + @Override public boolean hasEdge(E src, E dst) { if (!preds.containsKey(dst)) { setPredNodes(dst); @@ -278,22 +305,27 @@ public class GraphSlicer { return preds.get(dst).contains(src); } + @Override public void addEdge(E src, E dst) { throw new UnsupportedOperationException(); } + @Override public void removeAllIncidentEdges(E node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(E src, E dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges(E node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(E node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java index 7464546c6..26d255933 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java @@ -26,6 +26,7 @@ public interface NodeManager extends Iterable { /** * @return an {@link Iterator} of the nodes in this graph */ + @Override public Iterator iterator(); /** diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java index 3e3b5ddfd..3ccc5f868 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java @@ -116,14 +116,17 @@ public abstract class Dominators { return new Iterator() { private T current = node; + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return current != null; } + @Override public T next() { if (current == null) throw new NoSuchElementException(); @@ -165,6 +168,7 @@ public abstract class Dominators { } } + @Override public Iterator getPredNodes(T N) { if (N == root) return EmptyIterator.instance(); @@ -172,10 +176,12 @@ public abstract class Dominators { return new NonNullSingletonIterator(getIdom(N)); } + @Override public int getPredNodeCount(Object N) { return (N == root) ? 0 : 1; } + @Override public Iterator getSuccNodes(Object N) { if (nextMap.containsKey(N)) return nextMap.get(N).iterator(); @@ -183,6 +189,7 @@ public abstract class Dominators { return EmptyIterator.instance(); } + @Override public int getSuccNodeCount(Object N) { if (nextMap.containsKey(N)) return nextMap.get(N).size(); @@ -190,30 +197,36 @@ public abstract class Dominators { return 0; } + @Override public void addEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Object node) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Object node) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(Object src, Object dst) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java index a67954686..aee118f10 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java @@ -24,6 +24,7 @@ public class BasicNodeManager implements NodeManager { final private HashSet nodes = HashSetFactory.make(); + @Override public Iterator iterator() { return nodes.iterator(); } @@ -31,6 +32,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return nodes.size(); } @@ -38,6 +40,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(T n) { nodes.add(n); } @@ -45,6 +48,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) { nodes.remove(n); } @@ -52,6 +56,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T N) { return nodes.contains(N); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java index 27a483d8c..4b95f7266 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java @@ -40,6 +40,7 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { /** * Add this edge, unconditionally setting it as the next successor. */ + @Override public void addEdge(T src, T dst) throws IllegalArgumentException { delegate.addEdge(src, dst); SimpleVector s = successorEdges.get(src); @@ -50,6 +51,7 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { s.set(s.getMaxIndex() + 1, dst); } + @Override public void addEdge(int i, T src, T dst) throws IllegalArgumentException { delegate.addEdge(src, dst); SimpleVector s = successorEdges.get(src); @@ -60,18 +62,22 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { s.set(i, dst); } + @Override public void addNode(T n) { delegate.addNode(n); } + @Override public boolean containsNode(T N) { return delegate.containsNode(N); } + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException { return delegate.getPredNodeCount(N); } @@ -79,56 +85,68 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { /** * For now, this returns nodes in no particular order! Fix this when needed. */ + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { return delegate.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException { return delegate.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException { return delegate.getSuccNodes(N); } + @Override public boolean hasEdge(T src, T dst) { return delegate.hasEdge(src, dst); } + @Override public Iterator iterator() { return delegate.iterator(); } + @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeAllIncidentEdges(node); } + @Override public void removeEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeEdge(src, dst); } + @Override public void removeIncomingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeIncomingEdges(node); } + @Override public void removeNode(T n) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeNode(n); } + @Override public void removeNodeAndEdges(T N) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeNodeAndEdges(N); } + @Override public void removeOutgoingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeOutgoingEdges(node); } + @Override public T getSuccessor(T node, int i) throws IllegalArgumentException { SimpleVector s = successorEdges.get(node); if (s == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java index 024e55583..56c8dca27 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java @@ -28,18 +28,22 @@ public class DelegatingGraph implements Graph { this.delegate = delegate; } + @Override public void addEdge(T src, T dst) throws IllegalArgumentException { delegate.addEdge(src, dst); } + @Override public void addNode(T n) { delegate.addNode(n); } + @Override public boolean containsNode(T N) { return delegate.containsNode(N); } + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } @@ -49,50 +53,62 @@ public class DelegatingGraph implements Graph { return delegate.toString(); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException { return delegate.getPredNodeCount(N); } + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { return delegate.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException { return delegate.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException { return delegate.getSuccNodes(N); } + @Override public boolean hasEdge(T src, T dst) { return delegate.hasEdge(src, dst); } + @Override public Iterator iterator() { return delegate.iterator(); } + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { delegate.removeAllIncidentEdges(node); } + @Override public void removeEdge(T src, T dst) throws IllegalArgumentException { delegate.removeEdge(src, dst); } + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException { delegate.removeIncomingEdges(node); } + @Override public void removeNode(T n) { delegate.removeNode(n); } + @Override public void removeNodeAndEdges(T N) throws IllegalArgumentException { delegate.removeNodeAndEdges(N); } + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { delegate.removeOutgoingEdges(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java index ff2baaafd..38ff3e9f1 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java @@ -44,14 +44,17 @@ public class DelegatingNumberedEdgeManager imp this.delegate = delegate; } + @Override public boolean hasNext() { return delegate.hasNext(); } + @Override public T next() { return nodeManager.getNode(delegate.next()); } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -61,6 +64,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -71,6 +75,7 @@ public class DelegatingNumberedEdgeManager imp return (pred == null) ? empty : (Iterator) new IntSetNodeIterator(pred.intIterator()); } + @Override public IntSet getPredNodeNumbers(T node) { if (node == null) { throw new IllegalArgumentException("N cannot be null"); @@ -83,6 +88,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -99,6 +105,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getSuccNodes(T N) { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -112,6 +119,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -124,6 +132,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, com.ibm.wala.util.graph.Node) */ + @Override public void addEdge(T src, T dst) { if (dst == null || src == null) { throw new IllegalArgumentException("parameter is null"); @@ -132,6 +141,7 @@ public class DelegatingNumberedEdgeManager imp dst.addPred(src.getGraphNodeId()); } + @Override public void removeEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } @@ -139,6 +149,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -150,6 +161,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeIncomingEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -161,6 +173,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeOutgoingEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -169,6 +182,7 @@ public class DelegatingNumberedEdgeManager imp n.removeOutgoingEdges(); } + @Override public boolean hasEdge(T src, T dst) throws IllegalArgumentException { if (dst == null) { throw new IllegalArgumentException("dst == null"); @@ -176,6 +190,7 @@ public class DelegatingNumberedEdgeManager imp return getSuccNodeNumbers(src).contains(dst.getGraphNodeId()); } + @Override public IntSet getSuccNodeNumbers(T node) { if (node == null) { throw new IllegalArgumentException("node cannot be null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java index 09542fe8c..9f23fec37 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java @@ -35,6 +35,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NumberedGraph#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -43,6 +44,7 @@ public class DelegatingNumberedNodeManager implements return n.getGraphNodeId(); } + @Override @SuppressWarnings("unchecked") public T getNode(int number) { try { @@ -55,6 +57,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NumberedGraph#getMaxNumber() */ + @Override public int getMaxNumber() { return maxNumber; } @@ -62,6 +65,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.Graph#iterateNodes() */ + @Override public Iterator iterator() { final INodeWithNumber[] arr = nodes; return new Iterator() { @@ -80,10 +84,12 @@ public class DelegatingNumberedNodeManager implements next = -1; } + @Override public boolean hasNext() { return next != -1; } + @Override @SuppressWarnings("unchecked") public T next() { if (hasNext()) { @@ -95,6 +101,7 @@ public class DelegatingNumberedNodeManager implements } } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -104,6 +111,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.Graph#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return numberOfNodes; } @@ -114,6 +122,7 @@ public class DelegatingNumberedNodeManager implements * @see com.ibm.wala.util.graph.NodeManager#addNode(java.lang.Object) * @throws IllegalArgumentException if n is null */ + @Override public void addNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -152,6 +161,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -183,6 +193,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -208,6 +219,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java index 7b4f2ea0a..96c5e1de8 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java @@ -28,43 +28,53 @@ public class InvertingEdgeManager implements EdgeManager { this.original = original; } + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { return original.getSuccNodes(N); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException{ return original.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException{ return original.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException{ return original.getPredNodeCount(N); } + @Override public void addEdge(T src, T dst)throws IllegalArgumentException { original.addEdge(dst, src); } + @Override public void removeEdge(T src, T dst) throws IllegalArgumentException{ original.removeEdge(dst, src); } + @Override public boolean hasEdge(T src, T dst) { return original.hasEdge(dst, src); } + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { original.removeAllIncidentEdges(node); } + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException{ original.removeOutgoingEdges(node); } + @Override public void removeOutgoingEdges(T node)throws IllegalArgumentException { original.removeIncomingEdges(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java index 2931a8400..fff03b480 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java @@ -29,50 +29,62 @@ public class InvertingNumberedEdgeManager implements NumberedEdgeManager { this.original = original; } + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException{ return original.getSuccNodes(N); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException{ return original.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException{ return original.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException{ return original.getPredNodeCount(N); } + @Override public void addEdge(T src, T dst) throws IllegalArgumentException{ original.addEdge(dst, src); } + @Override public void removeEdge(T src, T dst)throws IllegalArgumentException { original.removeEdge(dst, src); } + @Override public boolean hasEdge(T src, T dst) { return original.hasEdge(dst, src); } + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException{ original.removeAllIncidentEdges(node); } + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException{ original.removeOutgoingEdges(node); } + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException{ original.removeIncomingEdges(node); } + @Override public IntSet getSuccNodeNumbers(T node) throws IllegalArgumentException{ return original.getPredNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(T node) throws IllegalArgumentException{ return original.getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java index 0fefceb43..5b33cb183 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java @@ -26,10 +26,12 @@ public class NodeWithNumber implements INodeWithNumber { /** * @return the number which identifies this node in the numbered graph */ + @Override public int getGraphNodeId() { return number; } + @Override public void setGraphNodeId(int i) { number = i; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java index 07d33688f..44f6b6d73 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java @@ -25,10 +25,12 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu private BimodalMutableIntSet succNumbers; + @Override public IntSet getSuccNumbers() { return succNumbers; } + @Override public IntSet getPredNumbers() { return predNumbers; } @@ -39,6 +41,7 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu * @param eqNumber * the equation number */ + @Override public void addSucc(int eqNumber) { if (succNumbers == null) { succNumbers = new BimodalMutableIntSet(); @@ -54,6 +57,7 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu * @param eqNumber * the equation number */ + @Override public void addPred(int eqNumber) { if (predNumbers == null) { predNumbers = new BimodalMutableIntSet(); @@ -95,15 +99,18 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu /* * @see com.ibm.wala.util.graph.INodeWithNumberedEdges#removeAllIncidentEdges() */ + @Override public void removeAllIncidentEdges() throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } + @Override public void removeIncomingEdges() throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } + @Override public void removeOutgoingEdges() throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java index fba3fc791..2d9156693 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java @@ -35,10 +35,12 @@ public class NumberedNodeIterator implements Iterator { this.nodeManager = nodeManager; } + @Override public boolean hasNext() { return numbers.hasNext(); } + @Override public T next() throws NoSuchElementException { int i = numbers.next(); T result = nodeManager.getNode(i); @@ -46,6 +48,7 @@ public class NumberedNodeIterator implements Iterator { return result; } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java index e921728bd..685130f8d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java @@ -27,11 +27,13 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { final private MutableMapping map = MutableMapping.make(); + @Override public int getNumber(T obj) { return map.getMappedIndex(obj); } + @Override public T getNode(int number) { if (number < 0) { throw new IllegalArgumentException("number must be >= 0"); @@ -43,20 +45,24 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NumberedGraph#getMaxNumber() */ + @Override public int getMaxNumber() { return map.getMaximumIndex(); } + @Override public Iterator iterator() { return map.iterator(); } + @Override public int getNumberOfNodes() { return map.getSize(); } + @Override public void addNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -67,6 +73,7 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) { map.deleteMappedObject(n); } @@ -85,6 +92,7 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T N) { return getNumber(N) != -1; } @@ -92,6 +100,7 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java index 3050bbfb9..cc96bf775 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java @@ -84,6 +84,7 @@ public final class SparseNumberedEdgeManager implements NumberedEdgeManager getPredNodes(T N) throws IllegalArgumentException { int number = nodeManager.getNumber(N); if (number < 0) { @@ -97,6 +98,7 @@ public final class SparseNumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager getSuccNodes(T N) throws IllegalArgumentException { int number = nodeManager.getNumber(N); if (number == -1) { @@ -127,6 +130,7 @@ public final class SparseNumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager extends AbstractGraph implem @Override protected abstract LabeledEdgeManager getEdgeManager(); + @Override public void addEdge(T src, T dst, U label) { getEdgeManager().addEdge(src, dst, label); } + @Override public Iterator getPredLabels(T N) { return getEdgeManager().getPredLabels(N); } + @Override public int getPredNodeCount(T N, U label) { return getEdgeManager().getPredNodeCount(N, label); } + @Override public Iterator getPredNodes(T N, U label) { return getEdgeManager().getPredNodes(N, label); } + @Override public Iterator getSuccLabels(T N) { return getEdgeManager().getSuccLabels(N); } + @Override public int getSuccNodeCount(T N, U label) { return getEdgeManager().getSuccNodeCount(N, label); } + @Override public Iterator getSuccNodes(T N, U label) { return getEdgeManager().getSuccNodes(N, label); } + @Override public boolean hasEdge(T src, T dst, U label) { return getEdgeManager().hasEdge(src, dst, label); } + @Override public void removeEdge(T src, T dst, U label) { getEdgeManager().removeEdge(src, dst, label); } + @Override public Set getEdgeLabels(T src, T dst) { return getEdgeManager().getEdgeLabels(src, dst); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java index dc07ab309..c9221664e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java @@ -24,30 +24,37 @@ public abstract class AbstractNumberedLabeledGraph extends AbstractNumbere @Override protected abstract NumberedLabeledEdgeManager getEdgeManager(); + @Override public void addEdge(T src, T dst, U label) { getEdgeManager().addEdge(src, dst, label); } + @Override public Iterator getPredLabels(T N) { return getEdgeManager().getPredLabels(N); } + @Override public int getPredNodeCount(T N, U label) { return getEdgeManager().getPredNodeCount(N, label); } + @Override public Iterator getPredNodes(T N, U label) { return getEdgeManager().getPredNodes(N, label); } + @Override public Iterator getSuccLabels(T N) { return getEdgeManager().getSuccLabels(N); } + @Override public int getSuccNodeCount(T N, U label) { return getEdgeManager().getSuccNodeCount(N, label); } + @Override public Iterator getSuccNodes(T N, U label) { return getEdgeManager().getSuccNodes(N, label); } @@ -60,18 +67,22 @@ public abstract class AbstractNumberedLabeledGraph extends AbstractNumbere return getEdgeManager().getSuccNodeNumbers(node, label); } + @Override public boolean hasEdge(T src, T dst, U label) { return getEdgeManager().hasEdge(src, dst, label); } + @Override public void removeEdge(T src, T dst, U label) { getEdgeManager().removeEdge(src, dst, label); } + @Override public Set getEdgeLabels(T src, T dst) { return getEdgeManager().getEdgeLabels(src, dst); } + @Override public U getDefaultLabel() { return getEdgeManager().getDefaultLabel(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java index a2688ffbd..73115b033 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java @@ -95,6 +95,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#addEdge(java.lang.Object, java.lang.Object, * java.lang.Object) */ + @Override public void addEdge(T src, T dst, U label) { nodeToSuccLabels.put(src, label); nodeToPredLabels.put(dst, label); @@ -105,6 +106,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getPredNodeCount(java.lang.Object, * java.lang.Object) */ + @Override public int getPredNodeCount(T N, U label) { return getManagerForLabel(label).getPredNodeCount(N); } @@ -113,6 +115,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getPredNodes(java.lang.Object, * java.lang.Object) */ + @Override public Iterator getPredNodes(T N, U label) { return getManagerForLabel(label).getPredNodes(N); } @@ -121,6 +124,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getSuccNodeCount(java.lang.Object, * java.lang.Object) */ + @Override public int getSuccNodeCount(T N, U label) { return getManagerForLabel(label).getSuccNodeCount(N); } @@ -129,6 +133,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getSuccNodes(java.lang.Object, * java.lang.Object) */ + @Override public Iterator getSuccNodes(T N, U label) { return getManagerForLabel(label).getSuccNodes(N); } @@ -137,6 +142,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#hasEdge(java.lang.Object, java.lang.Object, * java.lang.Object) */ + @Override public boolean hasEdge(T src, T dst, U label) { return getManagerForLabel(label).hasEdge(src, dst); } @@ -146,6 +152,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * * @see util.LabelledEdgeManager#removeAllIncidentEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(T node) { removeIncomingEdges(node); removeOutgoingEdges(node); @@ -155,6 +162,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#removeEdge(java.lang.Object, * java.lang.Object, java.lang.Object) */ + @Override public void removeEdge(T src, T dst, U label) throws IllegalArgumentException { getManagerForLabel(label).removeEdge(src, dst); } @@ -162,6 +170,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd /* * @see util.LabelledEdgeManager#removeIncomingEdges(java.lang.Object) */ + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException { for (Iterator inLabelIter = nodeToPredLabels.get(node).iterator(); inLabelIter.hasNext();) { U label = inLabelIter.next(); @@ -173,6 +182,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd /* * @see util.LabelledEdgeManager#removeOutgoingEdges(java.lang.Object) */ + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { for (Iterator outLabelIter = nodeToSuccLabels.get(node).iterator(); outLabelIter.hasNext();) { U label = outLabelIter.next(); @@ -193,14 +203,17 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd } } + @Override public Iterator getPredLabels(T N) { return nodeToPredLabels.get(N).iterator(); } + @Override public Iterator getSuccLabels(T N) { return nodeToSuccLabels.get(N).iterator(); } + @Override public Set getEdgeLabels(T src, T dst) { Set labels = HashSetFactory.make(); @@ -213,10 +226,12 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return labels; } + @Override public void addEdge(T src, T dst) { addEdge(src, dst, defaultLabel); } + @Override public int getPredNodeCount(T N) { int count = 0; for (U label : nodeToPredLabels.get(N)) { @@ -225,6 +240,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return count; } + @Override public Iterator getPredNodes(T N) { Collection preds = HashSetFactory.make(); for (U label : nodeToPredLabels.get(N)) { @@ -233,6 +249,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return preds.iterator(); } + @Override public int getSuccNodeCount(T N) { int count = 0; for (U label : nodeToSuccLabels.get(N)) { @@ -241,6 +258,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return count; } + @Override public Iterator getSuccNodes(T N) { Collection succs = HashSetFactory.make(); for (U label : nodeToSuccLabels.get(N)) { @@ -249,26 +267,32 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return succs.iterator(); } + @Override public boolean hasEdge(T src, T dst) { return hasEdge(src, dst, defaultLabel); } + @Override public void removeEdge(T src, T dst) throws UnsupportedOperationException { removeEdge(src, dst, defaultLabel); } + @Override public U getDefaultLabel() { return defaultLabel; } + @Override public IntSet getPredNodeNumbers(T node, U label) throws IllegalArgumentException { return getManagerForLabel(label).getPredNodeNumbers(node); } + @Override public IntSet getSuccNodeNumbers(T node, U label) throws IllegalArgumentException { return getManagerForLabel(label).getSuccNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(T node) { BitVectorIntSet preds = new BitVectorIntSet(); @@ -279,6 +303,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return preds; } + @Override public IntSet getSuccNodeNumbers(T node) { BitVectorIntSet succs = new BitVectorIntSet(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java index 407121b7b..4c6346603 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java @@ -119,6 +119,7 @@ public class BFSIterator implements Iterator { * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (Q.size() > index); } @@ -128,6 +129,7 @@ public class BFSIterator implements Iterator { * * @return the next graph node in discover time order. */ + @Override public T next() throws NoSuchElementException { if (index >= Q.size()) { throw new NoSuchElementException(); @@ -155,6 +157,7 @@ public class BFSIterator implements Iterator { /** * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java index 409036e21..7ecb4c2b9 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java @@ -84,6 +84,7 @@ public class BFSPathFinder { throw new IllegalArgumentException("src is not in graph " + src); } this.filter = new Filter() { + @Override public boolean accepts(T o) { return target.equals(o); } @@ -108,6 +109,7 @@ public class BFSPathFinder { this.roots = new NonNullSingletonIterator(src); this.filter = new Filter() { + @Override public boolean accepts(T o) { return ts.contains(o); } @@ -129,6 +131,7 @@ public class BFSPathFinder { this.G = G; this.roots = sources; this.filter = new Filter() { + @Override public boolean accepts(T o) { return target.equals(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java index 0a0b1e1f5..b69ac43d6 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java @@ -141,6 +141,7 @@ public class BoundedBFSIterator implements Iterator { * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (Q.size() > index); } @@ -150,6 +151,7 @@ public class BoundedBFSIterator implements Iterator { * * @return the next graph node in discover time order. */ + @Override public T next() throws NoSuchElementException { if (!hasNext()) { throw new NoSuchElementException(); @@ -180,6 +182,7 @@ public class BoundedBFSIterator implements Iterator { /** * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java index 8dfb72873..2869b5a9e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java @@ -126,6 +126,7 @@ public class DFS { this.order = order; } + @Override public int compare(T o1, T o2) { // throws an exception if either argument is not a Node object if (o1 == o2) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java index bdbc00866..7fca8996d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java @@ -56,6 +56,7 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (!empty()); } @@ -69,6 +70,7 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite * * @return the next graph node in discover time order. */ + @Override public T next() throws NoSuchElementException { if (empty()) { @@ -122,6 +124,7 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite */ abstract protected Iterator getConnected(T n); + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java index 3b38a8371..040e226d2 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java @@ -58,6 +58,7 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (!empty() || (theNextElement != null && getPendingChildren(theNextElement) == null)); } @@ -71,6 +72,7 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera * * @return the next graph node in finishing time order. */ + @Override @SuppressWarnings("unchecked") public T next() throws NoSuchElementException { if (!hasNext()) { @@ -122,6 +124,7 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera /** * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java index ca342959e..ab7febc3b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java @@ -59,6 +59,7 @@ public class FloydWarshall { final int fn = G.getNumber(from); IntSet tos = G.getSuccNodeNumbers(from); tos.foreach(new IntSetAction() { + @Override public void act(int x) { result[fn][x] = edgeCost(fn, x); } @@ -107,6 +108,7 @@ public class FloydWarshall { final int[][] paths = allPairsShortestPaths(); return new GetPath() { + @Override public List getPath(T from, T to) { int fn = G.getNumber(from); int tn = G.getNumber(to); @@ -145,7 +147,8 @@ public class FloydWarshall { private GetPaths doit() { final int[][] paths = allPairsShortestPaths(); return new GetPaths() { - public Set> getPaths(final T from, final T to) { + @Override + public Set> getPaths(final T from, final T to) { int fn = G.getNumber(from); int tn = G.getNumber(to); if (paths[fn][tn] == Integer.MAX_VALUE) { @@ -159,6 +162,7 @@ public class FloydWarshall { final Set> result = new HashSet>(); intermediate.foreach(new IntSetAction() { + @Override public void act(int x) { T in = G.getNode(x); for(List pre : getPaths(from, in)) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java index eea0aee7b..b82367242 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java @@ -57,6 +57,7 @@ public class SCCIterator implements Iterator> { /** * Determine whether there are any more SCCs remaining in this enumeration. */ + @Override public boolean hasNext() { return rev.hasNext(); } @@ -64,6 +65,7 @@ public class SCCIterator implements Iterator> { /** * Find the next SCC in this enumeration */ + @Override public Set next() throws NoSuchElementException { Set currentSCC = HashSetFactory.make(); @@ -78,6 +80,7 @@ public class SCCIterator implements Iterator> { } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java b/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java index 9ad8c6f85..ee2c2d24e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java @@ -698,7 +698,8 @@ public class HeapTracer { * @see java.util.Comparator#compare(java.lang.Object, * java.lang.Object) */ - public int compare(Object o1, Object o2) { + @Override + public int compare(Object o1, Object o2) { Integer i1 = sizeCount.get(o1); Integer i2 = sizeCount.get(o2); return i2.intValue() - i1.intValue(); @@ -803,7 +804,8 @@ public class HeapTracer { * @see java.util.Comparator#compare(java.lang.Object, * java.lang.Object) */ - public int compare(Field o1, Field o2) { + @Override + public int compare(Field o1, Field o2) { Demographics d1 = roots.get(o1); Demographics d2 = roots.get(o2); return d2.getTotalSize() - d1.getTotalSize(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java index d3a40f059..d3e06c52e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java @@ -122,6 +122,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { * * @return true iff the relation changes as a result of this call. */ + @Override public boolean add(int x, int y) throws IllegalArgumentException { if (x < 0) { throw new IllegalArgumentException("illegal x: " + x); @@ -173,6 +174,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { return smallStore[0].get(x) == DELEGATE_CODE; } + @Override public Iterator iterator() { return new TotalIterator(); } @@ -223,10 +225,12 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public boolean hasNext() { return nextX != -1; } + @Override public IntPair next() { IntPair result = null; if (nextIndex == smallStore.length) { @@ -246,6 +250,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -260,6 +265,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { * @param x * @return true iff there exists pair (x,y) for some y */ + @Override public boolean anyRelated(int x) { return smallStore[0].get(x) != EMPTY_CODE; } @@ -267,6 +273,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { /* * @see com.ibm.wala.util.intset.IBinaryNonNegativeIntRelation#getRelated(int) */ + @Override public IntSet getRelated(int x) { if (DEBUG) { assert x >= 0; @@ -310,6 +317,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { /* * @see com.ibm.wala.util.intset.IBinaryNonNegativeIntRelation#getRelatedCount(int) */ + @Override public int getRelatedCount(int x) throws IllegalArgumentException { if (x < 0) { throw new IllegalArgumentException("x must be greater than zero"); @@ -332,6 +340,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public void remove(int x, int y) { if (x < 0) { throw new IllegalArgumentException("illegal x: " + x); @@ -365,6 +374,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public void removeAll(int x) { for (int i = 0; i < smallStore.length; i++) { smallStore[i].set(x, EMPTY_CODE); @@ -375,6 +385,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { /* * @see com.ibm.wala.util.debug.VerboseAction#performVerboseAction() */ + @Override public void performVerboseAction() { if (VERBOSE) { System.err.println((getClass() + " stats:")); @@ -401,6 +412,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { return result; } + @Override public boolean contains(int x, int y) { if (x < 0) { throw new IllegalArgumentException("invalid x: " + x); @@ -420,6 +432,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public int maxKeyValue() { return maxX; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java index 7a50ea1c4..c8e6efc85 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java @@ -23,6 +23,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#copySet(com.ibm.wala.util.intset.IntSet) */ + @Override public void copySet(IntSet set) { if (set == null) { throw new IllegalArgumentException("null set"); @@ -56,6 +57,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAll(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation @@ -71,6 +73,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAll(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation @@ -117,6 +120,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#add(int) */ + @Override public boolean add(int i) { boolean result = impl.add(i); if (result) { @@ -128,6 +132,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#remove(int) */ + @Override public boolean remove(int i) { boolean result = impl.remove(i); maybeChangeRepresentation(); @@ -137,6 +142,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#intersectWith(com.ibm.wala.util.intset.IntSet) */ + @Override public void intersectWith(IntSet set) throws UnimplementedError { if (set == null) { throw new IllegalArgumentException("null set"); @@ -152,6 +158,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#contains(int) */ + @Override public boolean contains(int i) { return impl.contains(i); } @@ -159,6 +166,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intersection(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet intersection(IntSet that) throws UnimplementedError { if (that instanceof BimodalMutableIntSet) { BimodalMutableIntSet b = (BimodalMutableIntSet) that; @@ -174,6 +182,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { BimodalMutableIntSet temp = new BimodalMutableIntSet(); temp.addAll(this); @@ -185,6 +194,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isEmpty() */ + @Override public boolean isEmpty() { return impl.isEmpty(); } @@ -192,6 +202,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#size() */ + @Override public int size() { return impl.size(); } @@ -199,6 +210,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#iterator() */ + @Override public IntIterator intIterator() { return impl.intIterator(); } @@ -206,6 +218,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreach(IntSetAction action) { impl.foreach(action); } @@ -213,6 +226,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreachExcluding(com.ibm.wala.util.intset.IntSet, com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { impl.foreachExcluding(X, action); } @@ -220,6 +234,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#max() */ + @Override public int max() throws IllegalStateException { return impl.max(); } @@ -259,6 +274,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ + @Override public void clear() { impl = MutableSparseIntSet.makeEmpty(); } @@ -278,6 +294,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#sameValue(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean sameValue(IntSet that) { return impl.sameValue(that); } @@ -285,6 +302,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isSubset(com.ibm.wala.util.intset.SparseIntSet) */ + @Override public boolean isSubset(IntSet that) throws IllegalArgumentException { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -316,6 +334,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#containsAny(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean containsAny(IntSet that) throws IllegalArgumentException, UnimplementedError { if (that == null) { throw new IllegalArgumentException("that == null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java index dde8b860f..02143a90e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java @@ -22,6 +22,7 @@ public class BimodalMutableIntSetFactory implements MutableIntSetFactory { } } + @Override public boolean hasNext() { return (next != -1); } + @Override public T next() { T result = map.getMappedObject(next); int start = next + 1; @@ -172,6 +174,7 @@ public final class BitSet { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java index c1bd4747a..59442bd83 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java @@ -48,6 +48,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ + @Override public void clear() { bitVector.clearAll(); populationCount = 0; @@ -56,6 +57,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#copySet(com.ibm.wala.util.intset.IntSet) */ + @Override public void copySet(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -93,6 +95,7 @@ public final class BitVectorIntSet implements MutableIntSet { } + @Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet) { BitVector B = ((BitVectorIntSet) set).bitVector; @@ -128,6 +131,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#add(int) */ + @Override public boolean add(int i) { if (bitVector.get(i)) { return false; @@ -142,6 +146,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#remove(int) */ + @Override public boolean remove(int i) { if (contains(i)) { populationCount--; @@ -156,6 +161,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#intersectWith(com.ibm.wala.util.intset.IntSet) */ + @Override public void intersectWith(IntSet set) { if (!(set instanceof BitVectorIntSet)) { set = new BitVectorIntSet(set); @@ -168,6 +174,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intersection(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet intersection(IntSet that) { BitVectorIntSet newbie = new BitVectorIntSet(); newbie.copySet(this); @@ -178,6 +185,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { BitVectorIntSet temp = new BitVectorIntSet(); temp.addAll(this); @@ -189,6 +197,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isEmpty() */ + @Override public boolean isEmpty() { return size() == 0; } @@ -196,6 +205,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#size() */ + @Override public int size() { populationCount = (populationCount == UNDEFINED) ? bitVector.populationCount() : populationCount; return populationCount; @@ -204,6 +214,7 @@ public final class BitVectorIntSet implements MutableIntSet { /** * Use with extreme care; doesn't detect ConcurrentModificationExceptions */ + @Override public IntIterator intIterator() { populationCount = (populationCount == UNDEFINED) ? bitVector.populationCount() : populationCount; return new IntIterator() { @@ -211,10 +222,12 @@ public final class BitVectorIntSet implements MutableIntSet { int last = 0; + @Override public boolean hasNext() { return count < populationCount; } + @Override public int next() { count++; last = nextSetBit(last) + 1; @@ -226,6 +239,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreach(IntSetAction action) { if (action == null) { throw new IllegalArgumentException("null action"); @@ -252,6 +266,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { if (X instanceof BitVectorIntSet) { fastForeachExcluding((BitVectorIntSet) X, action); @@ -309,6 +324,7 @@ public final class BitVectorIntSet implements MutableIntSet { } } + @Override public boolean contains(int i) { if (i < 0) { throw new IllegalArgumentException("invalid i: " + i) ; @@ -316,6 +332,7 @@ public final class BitVectorIntSet implements MutableIntSet { return bitVector.get(i); } + @Override public int max() { return bitVector.max(); } @@ -335,6 +352,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#sameValue(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean sameValue(IntSet that) throws IllegalArgumentException, UnimplementedError { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -373,6 +391,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isSubset(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean isSubset(IntSet that) { if (that instanceof BitVectorIntSet) { return bitVector.isSubset(((BitVectorIntSet) that).bitVector); @@ -427,6 +446,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#containsAny(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean containsAny(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -449,6 +469,7 @@ public final class BitVectorIntSet implements MutableIntSet { * @see com.ibm.wala.util.intset.MutableIntSet#addAllInIntersection(com.ibm.wala.util.intset.IntSet, * com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) throws IllegalArgumentException { if (other == null) { throw new IllegalArgumentException("other == null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java index 2fdd4404a..aa3467463 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java @@ -21,6 +21,7 @@ public class BitVectorIntSetFactory implements MutableIntSetFactorythis has the same value as that. */ + @Override public boolean sameValue(IntSet that) { if (that instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) that; @@ -176,6 +187,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * @return true iff this is a subset of that. */ + @Override public boolean isSubset(IntSet that) { if (that instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) that; @@ -194,6 +206,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Set the value of this to be the same as the value of set */ + @Override public void copySet(IntSet set) { if (set instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) set; @@ -211,6 +224,7 @@ class DebuggingMutableIntSet implements MutableIntSet { * * @return true iff the value of this changes. */ + @Override public boolean addAll(IntSet set) { if (set instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) set; @@ -236,6 +250,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Intersect this with another set. */ + @Override public void intersectWith(IntSet set) { if (set instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) set; @@ -252,6 +267,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other instanceof DebuggingMutableIntSet && filter instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) other; @@ -271,6 +287,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intIterator() */ + @Override public IntIterator intIterator() { MutableSparseIntSet bits = MutableSparseIntSet.makeEmpty(); for (IntIterator pi = primaryImpl.intIterator(); pi.hasNext();) { @@ -291,15 +308,18 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Invoke an action on each element of the Set */ + @Override public void foreach(IntSetAction action) { final Set bits = HashSetFactory.make(); primaryImpl.foreach(new IntSetAction() { + @Override public void act(int x) { assert !bits.contains(new Integer(x)); bits.add(new Integer(x)); } }); secondaryImpl.foreach(new IntSetAction() { + @Override public void act(int x) { assert bits.contains(new Integer(x)); bits.remove(new Integer(x)); @@ -313,15 +333,18 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Invoke an action on each element of the Set, excluding elements of Set X */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { final Set bits = HashSetFactory.make(); primaryImpl.foreachExcluding(X, new IntSetAction() { + @Override public void act(int x) { assert !bits.contains(new Integer(x)); bits.add(new Integer(x)); } }); secondaryImpl.foreachExcluding(X, new IntSetAction() { + @Override public void act(int x) { assert bits.contains(new Integer(x)); bits.remove(new Integer(x)); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java index a993a0ec3..2286a1747 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java @@ -38,6 +38,7 @@ public class DebuggingMutableIntSetFactory implements MutableIntSetFactory implements OrdinalSetMapping { nextIndex = 0; } + @Override @SuppressWarnings("unchecked") public T getMappedObject(int n) { try { @@ -69,6 +70,7 @@ public class MutableMapping implements OrdinalSetMapping { } } + @Override public int getMappedIndex(T o) { Integer I = map.get(o); if (I == null) { @@ -79,6 +81,7 @@ public class MutableMapping implements OrdinalSetMapping { } + @Override public boolean hasMappedIndex(T o) { return map.get(o) != null; } @@ -88,6 +91,7 @@ public class MutableMapping implements OrdinalSetMapping { * * @return the integer to which the object is mapped. */ + @Override public int add(T o) { Integer I = map.get(o); if (I != null) { @@ -116,6 +120,7 @@ public class MutableMapping implements OrdinalSetMapping { /* * @see com.ibm.wala.util.intset.OrdinalSetMapping#iterator() */ + @Override public Iterator iterator() { return map.keySet().iterator(); } @@ -175,10 +180,12 @@ public class MutableMapping implements OrdinalSetMapping { } + @Override public int getMaximumIndex() { return nextIndex - 1; } + @Override public int getSize() { return map.size(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java index e06dda492..c69aa9917 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java @@ -163,6 +163,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#contains(int) */ + @Override public boolean contains(int i) { if (privatePart != null && privatePart.contains(i)) { return true; @@ -176,6 +177,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intersection(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet intersection(IntSet that) { if (that == null) { throw new IllegalArgumentException("null that"); @@ -204,6 +206,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { MutableSharedBitVectorIntSet temp = new MutableSharedBitVectorIntSet(); temp.addAll(this); @@ -228,6 +231,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isEmpty() */ + @Override public boolean isEmpty() { return privatePart == null && sharedPart == null; } @@ -235,6 +239,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#size() */ + @Override public int size() { int result = 0; result += (privatePart == null) ? 0 : privatePart.size(); @@ -245,6 +250,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#iterator() */ + @Override public IntIterator intIterator() { if (privatePart == null) { return (sharedPart == null) ? EmptyIntIterator.instance() : sharedPart.intIterator(); @@ -257,6 +263,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreach(IntSetAction action) { if (privatePart != null) { privatePart.foreach(action); @@ -269,6 +276,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreachExcluding(com.ibm.wala.util.intset.IntSet, com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { if (X instanceof MutableSharedBitVectorIntSet) { foreachExcludingInternal((MutableSharedBitVectorIntSet) X, action); @@ -315,6 +323,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#max() */ + @Override public int max() { int result = -1; if (privatePart != null && privatePart.size() > 0) { @@ -329,6 +338,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#sameValue(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean sameValue(IntSet that) throws IllegalArgumentException, UnimplementedError { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -461,6 +471,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isSubset(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean isSubset(IntSet that) { if (that == null) { throw new IllegalArgumentException("null that"); @@ -572,6 +583,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#copySet(com.ibm.wala.util.intset.IntSet) */ + @Override public void copySet(IntSet set) { if (set instanceof MutableSharedBitVectorIntSet) { MutableSharedBitVectorIntSet other = (MutableSharedBitVectorIntSet) set; @@ -595,6 +607,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAll(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAll(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -775,6 +788,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#add(int) */ + @Override public boolean add(int i) { if (privatePart == null) { if (sharedPart == null) { @@ -810,6 +824,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#remove(int) */ + @Override public boolean remove(int i) { if (privatePart != null) { if (privatePart.contains(i)) { @@ -838,6 +853,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#intersectWith(com.ibm.wala.util.intset.IntSet) */ + @Override public void intersectWith(IntSet set) { if (set instanceof MutableSharedBitVectorIntSet) { intersectWithInternal((MutableSharedBitVectorIntSet) set); @@ -978,6 +994,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#containsAny(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean containsAny(IntSet set) { if (set instanceof MutableSharedBitVectorIntSet) { MutableSharedBitVectorIntSet other = (MutableSharedBitVectorIntSet) set; @@ -1009,6 +1026,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAllExcluding(com.ibm.wala.util.intset.IntSet, com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other instanceof MutableSharedBitVectorIntSet) { return addAllInIntersectionInternal((MutableSharedBitVectorIntSet) other, filter); @@ -1089,6 +1107,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { } } + @Override public void clear() { privatePart = null; sharedPart = null; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java index 5b3391395..e51bb6235 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java @@ -21,6 +21,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#make(int[]) */ + @Override public MutableSharedBitVectorIntSet make(int[] set) { SparseIntSet s = (SparseIntSet) sparseFactory.make(set); return new MutableSharedBitVectorIntSet(s); @@ -29,6 +30,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#parse(java.lang.String) */ + @Override public MutableSharedBitVectorIntSet parse(String string) throws NumberFormatException { SparseIntSet s = (SparseIntSet) sparseFactory.parse(string); return new MutableSharedBitVectorIntSet(s); @@ -37,6 +39,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#makeCopy(com.ibm.wala.util.intset.IntSet) */ + @Override public MutableSharedBitVectorIntSet makeCopy(IntSet x) throws IllegalArgumentException { if (x == null) { throw new IllegalArgumentException("x == null"); @@ -62,6 +65,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#make() */ + @Override public MutableSharedBitVectorIntSet make() { return new MutableSharedBitVectorIntSet(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java index ae06469da..22232cada 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java @@ -69,13 +69,15 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ - public void clear() { + @Override + public void clear() { size = 0; } /** */ - public boolean remove(int value) { + @Override + public boolean remove(int value) { if (elements != null) { int remove; for (remove = 0; remove < size; remove++) { @@ -117,7 +119,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * @param value * @return true iff this value changes */ - @SuppressWarnings("unused") + @Override + @SuppressWarnings("unused") public boolean add(int value) { if (elements == null) { elements = new int[getInitialNonEmptySize()]; @@ -176,7 +179,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * @throws IllegalArgumentException * if that == null */ - @SuppressWarnings("unused") + @Override + @SuppressWarnings("unused") public void copySet(IntSet that) throws IllegalArgumentException { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -201,7 +205,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { that.foreach(new IntSetAction() { private int index = 0; - public void act(int i) { + @Override + public void act(int i) { elements[index++] = i; } }); @@ -211,7 +216,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { } } - public void intersectWith(IntSet set) { + @Override + public void intersectWith(IntSet set) { if (set == null) { throw new IllegalArgumentException("null set"); } @@ -307,7 +313,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * @throws IllegalArgumentException * if set == null */ - @SuppressWarnings("unused") + @Override + @SuppressWarnings("unused") public boolean addAll(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -317,7 +324,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { } else { int oldSize = size; set.foreach(new IntSetAction() { - public void act(int i) { + @Override + public void act(int i) { if (!contains(i)) add(i); } @@ -474,7 +482,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * com.ibm.wala.util.intset.MutableIntSet#addAllInIntersection(com.ibm.wala * .util.intset.IntSet, com.ibm.wala.util.intset.IntSet) */ - public boolean addAllInIntersection(IntSet other, IntSet filter) { + @Override + public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other == null) { throw new IllegalArgumentException("other is null"); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java index 2d976d963..dfcbb3bca 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java @@ -21,6 +21,7 @@ public class MutableSparseIntSetFactory implements MutableIntSetFactory implements OrdinalSetMapping { this.offset = offset; } + @Override public int getMaximumIndex() { return offset + delegate.getMaximumIndex(); } + @Override public int getSize() { return delegate.getSize(); } @@ -47,10 +49,12 @@ public class OffsetOrdinalSetMapping implements OrdinalSetMapping { return new OffsetOrdinalSetMapping(m, offset); } + @Override public int add(T o) { return offset + delegate.add(o); } + @Override public int getMappedIndex(T o) { if (delegate.getMappedIndex(o) == -1) { return -1; @@ -58,14 +62,17 @@ public class OffsetOrdinalSetMapping implements OrdinalSetMapping { return offset + delegate.getMappedIndex(o); } + @Override public T getMappedObject(int n) throws NoSuchElementException { return delegate.getMappedObject(n - offset); } + @Override public boolean hasMappedIndex(T o) { return delegate.hasMappedIndex(o); } + @Override public Iterator iterator() { return delegate.iterator(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java index 34188c78f..af6d63451 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java @@ -58,6 +58,7 @@ public class OrdinalSet implements Iterable { return (S == null) ? 0 : S.size(); } + @Override public Iterator iterator() { if (S == null) { return EmptyIterator.instance(); @@ -66,14 +67,17 @@ public class OrdinalSet implements Iterable { return new Iterator() { IntIterator it = S.intIterator(); + @Override public boolean hasNext() { return it.hasNext(); } + @Override public T next() { return mapping.getMappedObject(it.next()); } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java index 9563e942a..4b6968399 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java @@ -227,6 +227,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ + @Override public void clear() { sparsePart.clear(); densePart = null; @@ -236,6 +237,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @param i * @return true iff this set contains integer i */ + @Override public boolean contains(int i) { if (densePart != null && inDenseRange(i)) { return densePart.contains(i); @@ -247,6 +249,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return true iff this set contains integer i */ + @Override public boolean containsAny(IntSet set) { if (set == null) { throw new IllegalArgumentException("null set"); @@ -273,6 +276,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @return a new IntSet which is the intersection of this and that */ + @Override public IntSet intersection(IntSet that) { if (that == null) { throw new IllegalArgumentException("null that"); @@ -290,6 +294,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { SemiSparseMutableIntSet temp = new SemiSparseMutableIntSet(); temp.addAll(this); @@ -301,6 +306,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return true iff this set is empty */ + @Override public boolean isEmpty() { return sparsePart.isEmpty() && (densePart == null || densePart.isZero()); } @@ -308,6 +314,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return the number of elements in this set */ + @Override public int size() { return sparsePart.size() + (densePart == null ? 0 : densePart.populationCount()); } @@ -315,14 +322,17 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return a perhaps more efficient iterator */ + @Override public IntIterator intIterator() { class DensePartIterator implements IntIterator { private int i = -1; + @Override public boolean hasNext() { return densePart.nextSetBit(i + 1) != -1; } + @Override public int next() { int next = densePart.nextSetBit(i + 1); i = next; @@ -349,6 +359,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * Invoke an action on each element of the Set */ + @Override public void foreach(IntSetAction action) { if (action == null) { throw new IllegalArgumentException("null action"); @@ -366,6 +377,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @param action */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { sparsePart.foreachExcluding(X, action); if (densePart != null) { @@ -380,6 +392,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return maximum integer in this set. */ + @Override public int max() throws IllegalStateException { if (densePart == null) { return sparsePart.max(); @@ -392,6 +405,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @return true iff this has the same value as that. * @throws IllegalArgumentException if that is null */ + @Override public boolean sameValue(IntSet that) { if (that == null) { throw new IllegalArgumentException("that is null"); @@ -418,6 +432,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @return true iff this is a subset of that. * @throws IllegalArgumentException if that is null */ + @Override public boolean isSubset(IntSet that) { if (that == null) { throw new IllegalArgumentException("that is null"); @@ -448,6 +463,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @throws IllegalArgumentException if set == null */ + @Override public void copySet(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -479,6 +495,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @return true iff the value of this changes. * @throws IllegalArgumentException if set == null */ + @Override public boolean addAll(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -556,6 +573,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @param i integer to add * @return true iff the value of this changes. */ + @Override public boolean add(int i) { if (densePart != null && inDenseRange(i)) { if (!densePart.get(i)) { @@ -579,6 +597,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @param i integer to remove * @return true iff the value of this changes. */ + @Override public boolean remove(int i) { if (densePart != null && densePart.get(i)) { densePart.clear(i); @@ -599,6 +618,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @param set */ + @Override public void intersectWith(IntSet set) { sparsePart.intersectWith(set); if (densePart != null) { @@ -613,6 +633,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @throws IllegalArgumentException if other is null */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other == null) { throw new IllegalArgumentException("other is null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java index 945ed3eee..cd3df1b8d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java @@ -21,6 +21,7 @@ public class SemiSparseMutableIntSetFactory implements MutableIntSetFactory= data.size()) { @@ -69,6 +70,7 @@ public class TwoLevelIntVector implements IntVector { * * @see com.ibm.wala.util.intset.IntVector#set(int, int) */ + @Override public void set(int x, int value) { maxIndex = Math.max(maxIndex, x); int page = getPageNumber(x); @@ -101,6 +103,7 @@ public class TwoLevelIntVector implements IntVector { System.err.println(("data: size = " + data.size())); } + @Override public int getMaxIndex() { return maxIndex; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java b/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java index 890f56ab6..85fbe9574 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java @@ -17,6 +17,7 @@ import com.ibm.wala.util.WalaException; public interface NodeDecorator { public static final NodeDecorator DEFAULT = new NodeDecorator() { + @Override public String getLabel(Object o) { return o.toString(); } }; From 6e2fadd31625f3726a57a297e39cdedf211ed35f Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 10 Jun 2013 15:04:56 -0700 Subject: [PATCH 179/187] remove @Override annotations from Java source tests. Polyglot can't parse these annotations. --- .../.settings/org.eclipse.jdt.core.prefs | 35 ++++++++++++++++++- .../src/AnonymousClass.java | 10 +++--- .../src/FunkySupers.java | 2 +- .../src/Inheritance1.java | 4 +-- .../src/InnerClassLexicalReads.java | 2 +- .../src/InterfaceTest1.java | 2 +- .../src/MiniaturSliceBug.java | 8 ++--- .../src/SimpleCalls.java | 2 +- .../src/Thread1.java | 2 +- .../src/foo/SimpleNames.java | 2 +- .../world/ConstructorsAndInitializers.java | 1 - .../src/foo/bar/hello/world/InnerClasses.java | 3 -- .../foo/bar/hello/world/MethodMadness.java | 1 - .../AnonGeneNullarySimple.java | 2 +- .../javaonepointfive/AnonymousGenerics.java | 8 ++--- .../src/javaonepointfive/Cocovariant.java | 4 +-- .../CustomGenericsAndFields.java | 6 ++-- .../GenericMemberClasses.java | 6 ++-- .../MoreOverriddenGenerics.java | 4 +-- .../javaonepointfive/NotSoSimpleEnums.java | 8 ++--- .../OverridesOnePointFour.java | 2 +- .../javaonepointfive/VarargsCovariant.java | 2 +- .../javaonepointfive/VarargsOverriding.java | 2 +- 23 files changed, 73 insertions(+), 45 deletions(-) diff --git a/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs index 92bf738bc..e1b29887d 100644 --- a/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,10 @@ eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -11,18 +16,23 @@ org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=ignore org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning @@ -33,44 +43,67 @@ org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false diff --git a/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java b/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java index 5537eac96..8aeea4c1c 100644 --- a/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java +++ b/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java @@ -19,9 +19,9 @@ public class AnonymousClass { Foo f= new Foo() { int value = 3; - @Override + public int getValue() { return value; } - @Override + public int getValueBase() { return value - base.intValue(); } }; @@ -37,21 +37,21 @@ public class AnonymousClass { abstract class FooImpl implements Foo { int y; - @Override + public abstract int getValue(); FooImpl(int _y) { y = _y; } - @Override + public int getValueBase() { return y + getValue() - base.intValue(); } } Foo f= new FooImpl(-4) { - @Override + public int getValue() { return 7; } }; diff --git a/com.ibm.wala.cast.java.test.data/src/FunkySupers.java b/com.ibm.wala.cast.java.test.data/src/FunkySupers.java index d0ac75bda..17697e5f4 100644 --- a/com.ibm.wala.cast.java.test.data/src/FunkySupers.java +++ b/com.ibm.wala.cast.java.test.data/src/FunkySupers.java @@ -21,7 +21,7 @@ public class FunkySupers { } class SubFunkySupers extends FunkySupers { - @Override + int funky(FunkySupers fs) { SubFunkySupers.super.funky(fs); SubFunkySupers.this.funky(fs); diff --git a/com.ibm.wala.cast.java.test.data/src/Inheritance1.java b/com.ibm.wala.cast.java.test.data/src/Inheritance1.java index a362c4adb..af56df73e 100644 --- a/com.ibm.wala.cast.java.test.data/src/Inheritance1.java +++ b/com.ibm.wala.cast.java.test.data/src/Inheritance1.java @@ -29,11 +29,11 @@ class Base { } } class Derived extends Base { - @Override + public void foo() { super.foo(); } - @Override + public String bar(int x) { return Integer.toHexString(x); } diff --git a/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java b/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java index c09350e78..28426514c 100644 --- a/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java +++ b/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java @@ -31,7 +31,7 @@ public class InnerClassLexicalReads { * 0 v2:com.ibm.wala.ssa.SymbolTable$1@16b18b6 = lexical:y@LInnerClassLexicalReads/makeIntConstant(I)LIntConstant; * 1 return v2:com.ibm.wala.ssa.SymbolTable$1@16b18b6[11:4] -> [11:13] */ - @Override + public int getConstant() { return y; } diff --git a/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java b/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java index 3a4f77c8e..82c474622 100644 --- a/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java +++ b/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java @@ -25,7 +25,7 @@ class FooIT1 implements IFoo { public FooIT1(char ch) { fValue= ch; } - @Override + public char getValue() { return fValue; } diff --git a/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java b/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java index 14df1b48f..0e3c9301e 100644 --- a/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java +++ b/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java @@ -29,7 +29,7 @@ abstract class PrimitiveWrapper { * {@inheritDoc} * @see java.lang.Object#equals(java.lang.Object) */ - @Override + abstract public boolean equals(Object o); } @@ -48,7 +48,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#intValue() */ - @Override + public int intValue() { return val; } @@ -57,7 +57,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#setIntValue(int) */ - @Override + public void setIntValue(int i) { this.val = i; } @@ -66,7 +66,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#equals(java.lang.Object) */ - @Override + public boolean equals(Object o) { return o instanceof IntWrapper && ((IntWrapper)o).val==val; } diff --git a/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java b/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java index 62c1bf9d5..7ea739d60 100644 --- a/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java +++ b/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java @@ -13,7 +13,7 @@ interface ISimpleCalls { public void helloWorld(); } public class SimpleCalls implements ISimpleCalls { - @Override + public void helloWorld() { System.out.println("hello world!"); } diff --git a/com.ibm.wala.cast.java.test.data/src/Thread1.java b/com.ibm.wala.cast.java.test.data/src/Thread1.java index d78ceff23..d483dbb10 100644 --- a/com.ibm.wala.cast.java.test.data/src/Thread1.java +++ b/com.ibm.wala.cast.java.test.data/src/Thread1.java @@ -13,7 +13,7 @@ class R implements Runnable { R(int i) { this.i = i; } - @Override + public void run() { return; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java b/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java index 811e6a9ad..b46c5b610 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java @@ -55,7 +55,7 @@ public class SimpleNames { final int i = 5; new Object() { - @Override + public int hashCode() { f = 5; // SimpleNames.this = 5 s = 6; // SimpleNames.s = 6 diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java index abd51274c..91cfa92d3 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java @@ -76,7 +76,6 @@ public class ConstructorsAndInitializers extends Super { iX = 55 + 12; } - @Override public String toString() { return s + " -- from an anon class in " + iX + "," + sX + ": " + ConstructorsAndInitializers.this.s; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java index eeac7e75b..935545d51 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java @@ -45,7 +45,6 @@ public class InnerClasses extends Temp { Object supportLocalBusiness() { final int x = 54; class FooBar { - @Override public int hashCode() { return x; } } return new FooBar(); @@ -54,7 +53,6 @@ public class InnerClasses extends Temp { static Object anonymousCoward() { final int x = 5; return new Object() { - @Override public int hashCode() { return x; } }; } @@ -66,7 +64,6 @@ public class InnerClasses extends Temp { System.out.println(anonymousCoward().hashCode()); final String xx = "crazy"; Outie outie = new Outie("weird") { - @Override public String toString() { return "bogus" + x + xx + xxxx; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java index 7b625209c..f558e850b 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java @@ -95,7 +95,6 @@ public class MethodMadness { return 13 + x; } - @Override protected int protectedInteger() { return 233 + x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java index 5e6a9b195..02cf96ea2 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java @@ -44,7 +44,7 @@ public class AnonGeneNullarySimple { } static class StrTripler implements Ops { - @Override + public String nullary() { String x = "talk about it "; return x+x+x; diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java index b3ec5adb1..85ce14520 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java @@ -48,11 +48,11 @@ public class AnonymousGenerics { // if has type parameters, find overriding method and // get erasures for all of those types and make a new method // that calls this one (with casts). no worries about return values. - @Override + public String unary(String x) { return x + x + x; } - @Override + public String nullary() { String x = "talk about it "; return x+x+x; @@ -65,11 +65,11 @@ public class AnonymousGenerics { private void doit() { Ops strQuadrupler = new Ops() { - @Override + public String unary(String x) { return x+x+x+x; } - @Override + public String nullary() { String x = "time to make a move to the global economy "; return x+x+x+x; diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java index 8c2821a1e..a2b08f2fe 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java @@ -42,11 +42,11 @@ public class Cocovariant { A foo(String x) { return null; } } static class B extends A { - @Override + B foo(String x) { return null; } } static class C extends B { - @Override + C foo(String x) { return null; } } public static void main(String[] args) { diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java index cc3e98188..34f550a3a 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java @@ -51,7 +51,7 @@ interface IGeneric { class ConcreteGeneric implements IGeneric { Q x; - @Override + public Q bar(Q a, Q b) { x = a; if (b.hashCode() == a.hashCode() || b.toString().equals(a.toString())) @@ -59,7 +59,7 @@ class ConcreteGeneric implements IGeneric { return b; } - @Override + public Q foo() { return x; } @@ -70,7 +70,7 @@ class ConcreteGeneric2 extends ConcreteGeneric { public void setFoo(Q a) { y = a; } - @Override + public Q foo() { return y; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java index e60e74b35..24b25d1d7 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java @@ -45,18 +45,18 @@ public class GenericMemberClasses { T x = null; private int localChangeID; - @Override + public boolean hasNext() { return ( localChangeID == 5 ); } - @Override + public T next() { localChangeID = 5; return x; } - @Override + public void remove() { } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java index 6b1d1cc0e..1684cca24 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java @@ -47,14 +47,14 @@ public class MoreOverriddenGenerics { } class Sub extends Super { - @Override + public Number get() { return super.get(); } } class SubSub extends Sub { - @Override + public Long get() { return new Long(6); } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java index 74b9dc2aa..7bf21ad1d 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java @@ -39,13 +39,13 @@ package javaonepointfive; public class NotSoSimpleEnums { public enum Direction { - NORTH("nord") { @Override + NORTH("nord") { public Direction getOpposite() { return SOUTH; }}, - EAST("est") { @Override + EAST("est") { public Direction getOpposite() { return WEST; }}, - SOUTH("sud") { @Override + SOUTH("sud") { public Direction getOpposite() { return NORTH; }}, - WEST("ouest") { @Override + WEST("ouest") { public Direction getOpposite() { return EAST; }}; public abstract Direction getOpposite(); diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java index c82132bfc..0fede31c1 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java @@ -43,7 +43,7 @@ public class OverridesOnePointFour { } static class Sub implements Super { - @Override + public Long get() { return new Long(6); } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java index 2d4ad92ad..4f0c34905 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java @@ -46,7 +46,7 @@ public class VarargsCovariant { } static class B extends A { - @Override + B hello(int... x) { System.out.println("b hello"); return this; diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java index a20275740..a112e79db 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java @@ -69,7 +69,7 @@ class VarityTestSuper { } class VarityTestSub extends VarityTestSuper { - @Override + void bar(String... args) {} } From 587ef6635606106f9370b75d4393c66d05235322 Mon Sep 17 00:00:00 2001 From: sjfink Date: Mon, 24 Jun 2013 08:34:16 -0700 Subject: [PATCH 180/187] publicize a method and add some comments --- .../com/ibm/wala/util/graph/traverse/FloydWarshall.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java index ab7febc3b..25b03fab2 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java @@ -22,6 +22,13 @@ import com.ibm.wala.util.intset.IntSetAction; import com.ibm.wala.util.intset.IntSetUtil; import com.ibm.wala.util.intset.MutableIntSet; +/** + * Floyd-Warshall algorithm to compute all-pairs shortest path in graph with no negative cycles. + * + * TODO: this API should be cleaned up. + * + * @param node type in the graph + */ public class FloydWarshall { public interface GetPath { @@ -46,7 +53,7 @@ public class FloydWarshall { } - int[][] allPairsShortestPaths() { + public int[][] allPairsShortestPaths() { final int[][] result = new int[G.getNumberOfNodes()][G.getNumberOfNodes()]; for(int i = 0; i < result.length; i++) { From 3015d1c5f96fb5c87da79fcf35111da59d8f3442 Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Tue, 25 Jun 2013 11:53:58 -0400 Subject: [PATCH 181/187] added container access to ModuleEntry --- .../com/ibm/wala/cast/java/test/IRTests.java | 5 ++- .../js/test/TestSimpleCallGraphShape.java | 1 + .../cast/js/html/MappedSourceFileModule.java | 3 +- .../ibm/wala/cast/ir/ssa/AstIRFactory.java | 13 +++++++- .../ibm/wala/cast/ir/ssa/SSAConversion.java | 32 +++++++++++++++++++ .../AbstractNestedJarFileModule.java | 23 +++++++++++++ .../wala/classLoader/AbstractURLModule.java | 12 +++++++ .../ibm/wala/classLoader/ClassFileModule.java | 7 ++-- .../ibm/wala/classLoader/CompoundModule.java | 16 ++++++++++ .../com/ibm/wala/classLoader/FileModule.java | 16 +++++++++- .../ibm/wala/classLoader/JarFileEntry.java | 25 +++++++++------ .../com/ibm/wala/classLoader/ShrikeClass.java | 5 +++ .../wala/classLoader/SourceFileModule.java | 11 +++++-- .../ipa/callgraph/impl/ExplicitCallGraph.java | 22 +++++++++++++ 14 files changed, 172 insertions(+), 19 deletions(-) diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java index 9675451de..399869def 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/IRTests.java @@ -159,6 +159,7 @@ public abstract class IRTests { return ea; } + @Override public void check(CallGraph callGraph) { MethodReference srcMethod = descriptorToMethodRef(this.srcDescriptor, callGraph.getClassHierarchy()); Set srcNodes = callGraph.getNodes(srcMethod); @@ -213,6 +214,7 @@ public abstract class IRTests { this.definingLineNumber = definingLineNumber; } + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef(method, cg.getClassHierarchy()); @@ -278,6 +280,7 @@ public abstract class IRTests { public final Set classAnnotations = HashSetFactory.make(); public final Set methodAnnotations = HashSetFactory.make(); + @Override public void check(CallGraph cg) { classes: for(ClassAnnotation ca : classAnnotations) { IClass cls = cg.getClassHierarchy().lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application, ca.className)); @@ -476,7 +479,7 @@ public abstract class IRTests { if (f.isDirectory()) { engine.addSourceModule(new SourceDirectoryTreeModule(f)); } else { - engine.addSourceModule(new SourceFileModule(f, srcFileName)); + engine.addSourceModule(new SourceFileModule(f, srcFileName, null)); } } } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 7bdaf1905..6e95fd98d 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -734,6 +734,7 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { if (pointsToSet == null || pointsToSet.getBackingSet() == null) continue; pointsToSet.getBackingSet().foreach(new IntSetAction() { + @Override public void act(int ikId) { Set> s = ret.get(ikId); if (s == null) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/MappedSourceFileModule.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/MappedSourceFileModule.java index 94976c1f9..413bccde5 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/MappedSourceFileModule.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/MappedSourceFileModule.java @@ -18,7 +18,7 @@ public class MappedSourceFileModule extends SourceFileModule implements MappedSo private final FileMapping fileMapping; public MappedSourceFileModule(File f, String fileName, FileMapping fileMapping) { - super(f, fileName); + super(f, fileName, null); this.fileMapping = fileMapping; } @@ -27,6 +27,7 @@ public class MappedSourceFileModule extends SourceFileModule implements MappedSo this.fileMapping = fileMapping; } + @Override public FileMapping getMapping() { return fileMapping; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java index 852c6d675..da4bf2049 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java @@ -50,6 +50,7 @@ public class AstIRFactory implements IRFactory { this.astFactory = astFactory; } + @Override public IR makeIR(IMethod method, Context context, SSAOptions options) { if (method instanceof AstMethod) { return astFactory.makeIR(method, context, options); @@ -58,6 +59,7 @@ public class AstIRFactory implements IRFactory { } } + @Override public ControlFlowGraph makeCFG(IMethod method, Context context) { if (method instanceof AstMethod) { return astFactory.makeCFG(method, context); @@ -96,12 +98,14 @@ public class AstIRFactory implements IRFactory { } } + @Override protected SSA2LocalMap getLocalMap() { return localMap; } + @Override protected String instructionPosition(int instructionIndex) { - Position pos = ((AstMethod) getMethod()).getSourcePosition(instructionIndex); + Position pos = getMethod().getSourcePosition(instructionIndex); if (pos == null) { return ""; } else { @@ -109,6 +113,11 @@ public class AstIRFactory implements IRFactory { } } + @Override + public AstMethod getMethod() { + return (AstMethod)super.getMethod(); + } + private AstIR(AstMethod method, SSAInstruction[] instructions, SymbolTable symbolTable, SSACFG cfg, SSAOptions options) { super(method, instructions, symbolTable, cfg, options); @@ -130,6 +139,7 @@ public class AstIRFactory implements IRFactory { } } + @Override public IR makeIR(final IMethod method, final Context context, final SSAOptions options) { assert method instanceof AstMethod : method.toString(); @@ -148,6 +158,7 @@ public class AstIRFactory implements IRFactory { return new AstDefaultIRFactory(); } + @Override public boolean contextIsIrrelevant(IMethod method) { return true; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java index 8f2931575..47e628b02 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/SSAConversion.java @@ -81,10 +81,12 @@ public class SSAConversion extends AbstractSSAConversion { this.instructionIndex = instructionIndex; } + @Override public int hashCode() { return useNumber * instructionIndex; } + @Override public boolean equals(Object o) { return (o instanceof UseRecord) && instructionIndex == ((UseRecord) o).instructionIndex && useNumber == ((UseRecord) o).useNumber; @@ -104,10 +106,12 @@ public class SSAConversion extends AbstractSSAConversion { this.useNumber = useNumber; } + @Override public int hashCode() { return phiNumber * BBnumber * useNumber; } + @Override public boolean equals(Object o) { return (o instanceof PhiUseRecord) && BBnumber == ((PhiUseRecord) o).BBnumber && phiNumber == ((PhiUseRecord) o).phiNumber && useNumber == ((PhiUseRecord) o).useNumber; @@ -123,10 +127,12 @@ public class SSAConversion extends AbstractSSAConversion { private final Set childRecords = HashSetFactory.make(1); + @Override public int hashCode() { return instructionIndex; } + @Override public boolean equals(Object o) { return (o instanceof CopyPropagationRecord) && instructionIndex == ((CopyPropagationRecord) o).instructionIndex; } @@ -232,6 +238,7 @@ public class SSAConversion extends AbstractSSAConversion { // private class SSAInformation implements com.ibm.wala.ssa.IR.SSA2LocalMap { + @Override public String[] getLocalNames(int pc, int vn) { int v = skip(vn) || vn >= valueMap.length ? vn : valueMap[vn]; String[][] namesData = debugInfo.getSourceNamesForValues(); @@ -279,34 +286,42 @@ public class SSAConversion extends AbstractSSAConversion { // implementation of AbstractSSAConversion hooks // + @Override protected int getNumberOfDefs(SSAInstruction inst) { return inst.getNumberOfDefs(); } + @Override protected int getDef(SSAInstruction inst, int index) { return inst.getDef(index); } + @Override protected int getNumberOfUses(SSAInstruction inst) { return inst.getNumberOfUses(); } + @Override protected int getUse(SSAInstruction inst, int index) { return inst.getUse(index); } + @Override protected boolean isAssignInstruction(SSAInstruction inst) { return inst instanceof AssignInstruction; } + @Override protected int getMaxValueNumber() { return symtab.getMaxValueNumber(); } + @Override protected boolean skip(int vn) { return false; } + @Override protected boolean isLive(SSACFG.BasicBlock Y, int V) { return (liveness.isLiveEntry(Y, V)); } @@ -315,6 +330,7 @@ public class SSAConversion extends AbstractSSAConversion { BB.addPhiForLocal(phiCounts[BB.getGraphNodeId()], phi); } + @Override protected void placeNewPhiAt(int value, SSACFG.BasicBlock Y) { int[] params = new int[CFG.getPredNodeCount(Y)]; for (int i = 0; i < params.length; i++) @@ -328,18 +344,22 @@ public class SSAConversion extends AbstractSSAConversion { addPhi(Y, phi); } + @Override protected SSAPhiInstruction getPhi(SSACFG.BasicBlock B, int index) { return B.getPhiForLocal(index); } + @Override protected void setPhi(SSACFG.BasicBlock B, int index, SSAPhiInstruction inst) { B.addPhiForLocal(index, inst); } + @Override protected SSAPhiInstruction repairPhiDefs(SSAPhiInstruction phi, int[] newDefs) { return (SSAPhiInstruction) phi.copyForSSA(CFG.getMethod().getDeclaringClass().getClassLoader().getInstructionFactory(), newDefs, null); } + @Override protected void repairPhiUse(SSACFG.BasicBlock BB, int phiIndex, int rvalIndex, int newRval) { SSAPhiInstruction phi = getPhi(BB, phiIndex); @@ -357,6 +377,7 @@ public class SSAConversion extends AbstractSSAConversion { phi.setValues(newUses); } + @Override protected void pushAssignment(SSAInstruction inst, int index, int newRhs) { int lhs = getDef(inst, 0); int rhs = getUse(inst, 0); @@ -370,6 +391,7 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected void repairInstructionUses(SSAInstruction inst, int index, int[] newUses) { for (int j = 0; j < getNumberOfUses(inst); j++) { if (topR(getUse(inst, j)) != null) { @@ -398,18 +420,22 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected void repairInstructionDefs(SSAInstruction inst, int index, int[] newDefs, int[] newUses) { instructions[index] = inst.copyForSSA(CFG.getMethod().getDeclaringClass().getClassLoader().getInstructionFactory(), newDefs, newUses); } + @Override protected void popAssignment(SSAInstruction inst, int index) { instructions[index] = null; } + @Override protected boolean isConstant(int valueNumber) { return symtab.isConstant(valueNumber); } + @Override protected boolean skipRepair(SSAInstruction inst, int index) { if (!super.skipRepair(inst, index)) { return false; @@ -475,6 +501,7 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected int getNextNewValueNumber() { while (symtab.isConstant(nextSSAValue) || skip(nextSSAValue)) ++nextSSAValue; @@ -499,6 +526,7 @@ public class SSAConversion extends AbstractSSAConversion { } } + @Override protected void initializeVariables() { for (int V = 1; V <= getMaxValueNumber(); V++) { if (!skip(V)) { @@ -516,6 +544,7 @@ public class SSAConversion extends AbstractSSAConversion { } + @Override protected void repairExit() { int[] exitLives = lexicalInfo.getExitExposedUses(); if (exitLives != null) { @@ -532,6 +561,7 @@ public class SSAConversion extends AbstractSSAConversion { // Global control. // + @Override protected void fail(int v) { System.err.println("during SSA conversion of the following IR:"); System.err.println(ir); @@ -542,6 +572,7 @@ public class SSAConversion extends AbstractSSAConversion { return computedLocalMap; } + @Override public void perform() { super.perform(); @@ -603,6 +634,7 @@ public class SSAConversion extends AbstractSSAConversion { SSAConversion ssa = new SSAConversion(M, ir, options) { final int limit = ir.getSymbolTable().getMaxValueNumber(); + @Override protected boolean skip(int i) { return (i >= 0) && (i <= limit) && (!values.contains(i)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java index 762c72420..ea54e8f29 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractNestedJarFileModule.java @@ -32,6 +32,8 @@ public abstract class AbstractNestedJarFileModule implements Module { private static final boolean DEBUG = false; + private final Module container; + /** * For efficiency, we cache the byte[] holding each ZipEntry's contents; this will help avoid multiple unzipping TODO: use a soft * reference? @@ -39,6 +41,10 @@ public abstract class AbstractNestedJarFileModule implements Module { private HashMap cache = null; protected abstract InputStream getNestedContents() throws IOException; + + protected AbstractNestedJarFileModule(Module container) { + this.container = container; + } public InputStream getInputStream(String name) { populateCache(); @@ -92,6 +98,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.Module#getEntries() */ + @Override public Iterator getEntries() { populateCache(); final Iterator it = cache.keySet().iterator(); @@ -109,16 +116,19 @@ public abstract class AbstractNestedJarFileModule implements Module { } } + @Override public boolean hasNext() { return next != null; } + @Override public ModuleEntry next() { ModuleEntry result = new Entry(next); advance(); return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -139,13 +149,21 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#getName() */ + @Override public String getName() { return name; } + + @Override + public Module getContainer() { + return container; + } + /* * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() */ + @Override public boolean isClassFile() { return FileSuffixes.isClassFile(getName()); } @@ -153,6 +171,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() */ + @Override public InputStream getInputStream() { return AbstractNestedJarFileModule.this.getInputStream(name); } @@ -160,6 +179,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() */ + @Override public boolean isModuleFile() { return false; } @@ -167,6 +187,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#asModule() */ + @Override public Module asModule() { Assertions.UNREACHABLE(); return null; @@ -180,6 +201,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() */ + @Override public String getClassName() { return FileSuffixes.stripSuffix(getName()); } @@ -187,6 +209,7 @@ public abstract class AbstractNestedJarFileModule implements Module { /* * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() */ + @Override public boolean isSourceFile() { return FileSuffixes.isSourceFile(getName()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java index 315ec5516..02295cb9d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/AbstractURLModule.java @@ -34,6 +34,7 @@ public abstract class AbstractURLModule implements Module, ModuleEntry { return url; } + @Override public String getName() { try { URLConnection con = url.openConnection(); @@ -47,6 +48,7 @@ public abstract class AbstractURLModule implements Module, ModuleEntry { } } + @Override public InputStream getInputStream() { try { return url.openConnection().getInputStream(); @@ -56,21 +58,31 @@ public abstract class AbstractURLModule implements Module, ModuleEntry { } } + @Override public boolean isModuleFile() { return false; } + @Override public Module asModule() throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public String getClassName() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Iterator getEntries() { return new NonNullSingletonIterator(this); } + @Override + public Module getContainer() { + // URLs are freestanding, without containers + return null; + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java index 901fcf3fe..de90ebf23 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassFileModule.java @@ -24,8 +24,8 @@ public class ClassFileModule extends FileModule { private final String className; - public ClassFileModule(File f) throws InvalidClassFileException { - super(f); + public ClassFileModule(File f, Module container) throws InvalidClassFileException { + super(f, container); ShrikeClassReaderHandle reader = new ShrikeClassReaderHandle(this); ImmutableByteArray name = ImmutableByteArray.make(reader.get().getName()); className = name.toString(); @@ -37,14 +37,17 @@ public class ClassFileModule extends FileModule { return "ClassFileModule:" + getFile(); } + @Override public boolean isClassFile() { return true; } + @Override public String getClassName() { return className; } + @Override public boolean isSourceFile() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java index 1a238737f..f24fa1d92 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/CompoundModule.java @@ -37,38 +37,47 @@ public class CompoundModule implements ModuleEntry, Module, SourceModule { return stuff; } + @Override public Iterator getEntries() { return new NonNullSingletonIterator(this); } + @Override public boolean isModuleFile() { return false; } + @Override public Module asModule() { throw new UnsupportedOperationException(); } + @Override public String getClassName() { throw new UnsupportedOperationException(); } + @Override public String getName() { return name.toString(); } + @Override public URL getURL() { return name; } + @Override public boolean isClassFile() { return false; } + @Override public boolean isSourceFile() { return true; } + @Override public InputStream getInputStream() { return new InputStream() { private int index = 0; @@ -146,8 +155,15 @@ public class CompoundModule implements ModuleEntry, Module, SourceModule { } } + @Override public Reader getInputReader() { return new Reader(); } + @Override + public Module getContainer() { + // stitched together module has no single container + return null; + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java index 39996da22..0e601a099 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FileModule.java @@ -27,11 +27,14 @@ public abstract class FileModule implements Module, ModuleEntry { private final File file; - public FileModule(File f) throws IllegalArgumentException { + private final Module container; + + public FileModule(File f, Module container) throws IllegalArgumentException { if (f == null) { throw new IllegalArgumentException("f is null"); } this.file = f; + this.container = container; if (!f.exists()) { throw new IllegalArgumentException("bad file " + f.getAbsolutePath()); } @@ -44,6 +47,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.Module#getEntries() */ + @Override public Iterator getEntries() { return new NonNullSingletonIterator(this); } @@ -69,6 +73,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getName() */ + @Override public String getName() { return file.getName(); } @@ -76,6 +81,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() */ + @Override public InputStream getInputStream() { try { if (!file.exists()) { @@ -92,6 +98,7 @@ public abstract class FileModule implements Module, ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() */ + @Override public boolean isModuleFile() { return false; } @@ -103,8 +110,15 @@ public abstract class FileModule implements Module, ModuleEntry { return file; } + @Override public Module asModule() throws UnimplementedError { Assertions.UNREACHABLE("implement me"); return null; } + + @Override + public Module getContainer() { + return container; + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java index 0161d1a80..94d640b4b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileEntry.java @@ -26,17 +26,15 @@ public class JarFileEntry implements ModuleEntry { private final JarFileModule jarFileModule; - private final JarFile jarFile; - protected JarFileEntry(String entryName, JarFileModule jarFile) { this.entryName = entryName; this.jarFileModule = jarFile; - this.jarFile = jarFile.getJarFile(); } /* * @see com.ibm.wala.classLoader.ModuleEntry#getName() */ + @Override public String getName() { return entryName; } @@ -44,6 +42,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() */ + @Override public boolean isClassFile() { return FileSuffixes.isClassFile(getName()); } @@ -51,8 +50,10 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#getInputStream() */ + @Override public InputStream getInputStream() { try { + JarFile jarFile = jarFileModule.getJarFile(); return jarFile.getInputStream(jarFile.getEntry(entryName)); } catch (Exception e) { // TODO Auto-generated catch block @@ -67,18 +68,18 @@ public class JarFileEntry implements ModuleEntry { */ public long getSize() { // TODO: cache this? - return jarFile.getEntry(entryName).getSize(); + return jarFileModule.getJarFile().getEntry(entryName).getSize(); } @Override public String toString() { - // TODO Auto-generated method stub - return jarFile.getName() + ":" + getName(); + return jarFileModule.getJarFile().getName() + ":" + getName(); } /* * @see com.ibm.wala.classLoader.ModuleEntry#isModuleFile() */ + @Override public boolean isModuleFile() { return FileSuffixes.isJarFile(getName()) || FileSuffixes.isWarFile(getName()); } @@ -86,26 +87,29 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#asModule() */ + @Override public Module asModule() { - return new NestedJarFileModule(jarFileModule, jarFile.getEntry(entryName)); + return new NestedJarFileModule(jarFileModule, jarFileModule.getJarFile().getEntry(entryName)); } public JarFile getJarFile() { - return jarFile; + return jarFileModule.getJarFile(); } - protected JarFileModule getJarFileModule() { + @Override + public JarFileModule getContainer() { return jarFileModule; } @Override public int hashCode() { - return entryName.hashCode() * 5059 + jarFile.hashCode(); + return entryName.hashCode() * 5059 + jarFileModule.getJarFile().hashCode(); } /* * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() */ + @Override public String getClassName() { return FileSuffixes.stripSuffix(getName()); } @@ -113,6 +117,7 @@ public class JarFileEntry implements ModuleEntry { /* * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() */ + @Override public boolean isSourceFile() { return FileSuffixes.isSourceFile(getName()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java index a5eac76ca..fc1061ff6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java @@ -228,6 +228,7 @@ public final class ShrikeClass extends JVMClass { return getAnnotations(false); } + @Override public Collection getAnnotations() { Collection result = HashSetFactory.make(); try { @@ -430,4 +431,8 @@ public final class ShrikeClass extends JVMClass { } return null; } + + public Module getContainer() { + return reader.getModuleEntry().getContainer(); + } } \ No newline at end of file diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java index 75ccd1103..a8e3e6af4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceFileModule.java @@ -24,14 +24,14 @@ import com.ibm.wala.util.io.FileSuffixes; public class SourceFileModule extends FileModule implements Module, ModuleEntry, SourceModule { private final String fileName; - public SourceFileModule(File f, String fileName) { - super(f); + public SourceFileModule(File f, String fileName, Module container) { + super(f, container); this.fileName = fileName; } public SourceFileModule(File f, SourceFileModule clonedFrom) { - super(f); + super(f, clonedFrom.getContainer()); if (clonedFrom == null) { throw new IllegalArgumentException("clonedFrom is null"); } @@ -46,6 +46,7 @@ public class SourceFileModule extends FileModule implements Module, ModuleEntry, /* * @see com.ibm.wala.classLoader.ModuleEntry#isClassFile() */ + @Override public boolean isClassFile() { return false; } @@ -53,6 +54,7 @@ public class SourceFileModule extends FileModule implements Module, ModuleEntry, /* * @see com.ibm.wala.classLoader.ModuleEntry#getClassName() */ + @Override public String getClassName() { return FileSuffixes.stripSuffix(fileName).replace(File.separator.charAt(0), '/'); } @@ -60,14 +62,17 @@ public class SourceFileModule extends FileModule implements Module, ModuleEntry, /* * @see com.ibm.wala.classLoader.ModuleEntry#isSourceFile() */ + @Override public boolean isSourceFile() { return true; } + @Override public Reader getInputReader() { return new InputStreamReader(getInputStream()); } + @Override public URL getURL() { try { return getFile().toURI().toURL(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java index 93d388234..04541eaff 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ExplicitCallGraph.java @@ -188,6 +188,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp protected Iterator getPossibleSites(final CGNode to) { final int n = getCallGraph().getNumber(to); return new FilterIterator(iterateCallSites(), new Filter() { + @Override public boolean accepts(Object o) { IntSet s = getPossibleTargetNumbers((CallSiteReference) o); return s == null ? false : s.contains(n); @@ -297,6 +298,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp allTargets.clear(); } + @Override public IR getIR() { if (getMethod().isSynthetic()) { // disable local cache in this case, as context interpreters @@ -311,6 +313,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return ir; } + @Override public DefUse getDU() { if (getMethod().isSynthetic()) { // disable local cache in this case, as context interpreters @@ -329,10 +332,12 @@ public class ExplicitCallGraph extends BasicCallGraph imp return ExplicitCallGraph.this; } + @Override public Iterator iterateCallSites() { return getCallGraph().getInterpreter(this).iterateCallSites(this); } + @Override public Iterator iterateNewSites() { return getCallGraph().getInterpreter(this).iterateNewSites(this); } @@ -345,6 +350,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp /* * @see com.ibm.wala.ipa.callgraph.CallGraph#getClassHierarchy() */ + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -352,6 +358,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp protected class ExplicitEdgeManager implements NumberedEdgeManager { final IntFunction toNode = new IntFunction() { + @Override public CGNode apply(int i) { CGNode result = getNode(i); // if (Assertions.verifyAssertions && result == null) { @@ -367,17 +374,20 @@ public class ExplicitCallGraph extends BasicCallGraph imp final IBinaryNaturalRelation predecessors = new BasicNaturalRelation(new byte[] { BasicNaturalRelation.SIMPLE_SPACE_STINGY }, BasicNaturalRelation.SIMPLE); + @Override public IntSet getSuccNodeNumbers(CGNode node) { ExplicitNode n = (ExplicitNode) node; return n.getAllTargetNumbers(); } + @Override public IntSet getPredNodeNumbers(CGNode node) { ExplicitNode n = (ExplicitNode) node; int y = getNumber(n); return predecessors.getRelated(y); } + @Override public Iterator getPredNodes(CGNode N) { IntSet s = getPredNodeNumbers(N); if (s == null) { @@ -387,22 +397,26 @@ public class ExplicitCallGraph extends BasicCallGraph imp } } + @Override public int getPredNodeCount(CGNode N) { ExplicitNode n = (ExplicitNode) N; int y = getNumber(n); return predecessors.getRelatedCount(y); } + @Override public Iterator getSuccNodes(CGNode N) { ExplicitNode n = (ExplicitNode) N; return new IntMapIterator(n.getAllTargetNumbers().intIterator(), toNode); } + @Override public int getSuccNodeCount(CGNode N) { ExplicitNode n = (ExplicitNode) N; return n.getAllTargetNumbers().size(); } + @Override public void addEdge(CGNode src, CGNode dst) { // we assume that this is called from ExplicitNode.addTarget(). // so we only have to track the inverse edge. @@ -411,6 +425,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp predecessors.add(y, x); } + @Override public void removeEdge(CGNode src, CGNode dst) { int x = getNumber(src); int y = getNumber(dst); @@ -422,20 +437,24 @@ public class ExplicitCallGraph extends BasicCallGraph imp predecessors.add(y, x); } + @Override public void removeAllIncidentEdges(CGNode node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(CGNode node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(CGNode node) { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(CGNode src, CGNode dst) { int x = getNumber(src); int y = getNumber(dst); @@ -455,6 +474,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return new ExplicitEdgeManager(); } + @Override public int getNumberOfTargets(CGNode node, CallSiteReference site) { if (!containsNode(node)) { throw new IllegalArgumentException("node not in callgraph " + node); @@ -464,6 +484,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return n.getNumberOfTargets(site); } + @Override public Iterator getPossibleSites(CGNode src, CGNode target) { if (!containsNode(src)) { throw new IllegalArgumentException("node not in callgraph " + src); @@ -476,6 +497,7 @@ public class ExplicitCallGraph extends BasicCallGraph imp return n.getPossibleSites(target); } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site) { if (!containsNode(node)) { throw new IllegalArgumentException("node not in callgraph " + node); From 080325b5f697fefc22d139da5c13d647084369dd Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Tue, 25 Jun 2013 11:57:37 -0400 Subject: [PATCH 182/187] merge --- .../cast/java/polyglot/test/Activator.java | 2 + .../wala/cast/java/test/PolyglotJLexTest.java | 1 + .../cast/java/test/PolyglotJavaIRTest.java | 1 + .../java/test/PolyglotSyncDuplicatorTest.java | 4 + .../translator/polyglot/AscriptionGoal.java | 1 + .../cast/java/translator/polyglot/IRGoal.java | 1 + .../polyglot/JavaIRTranslatorExtension.java | 4 + .../translator/polyglot/ModuleSource.java | 3 + .../polyglot/PolyglotClassLoaderFactory.java | 1 + .../polyglot/PolyglotIdentityMapper.java | 3 + .../polyglot/PolyglotJava2CAstTranslator.java | 184 ++++++++++ .../PolyglotJavaSourceAnalysisEngine.java | 1 + .../polyglot/PolyglotSourceLoaderImpl.java | 1 + .../PolyglotSourceModuleTranslator.java | 1 + .../polyglot/PolyglotTypeDictionary.java | 5 + .../PolyglotUnwoundIRTranslatorExtension.java | 4 +- .../.settings/org.eclipse.jdt.core.prefs | 35 +- .../src/AnonymousClass.java | 15 +- .../src/FunkySupers.java | 3 +- .../src/Inheritance1.java | 2 + .../src/InnerClassLexicalReads.java | 3 +- .../src/InterfaceTest1.java | 1 + .../src/MiniaturSliceBug.java | 4 + .../src/SimpleCalls.java | 3 +- .../src/Thread1.java | 1 + .../src/foo/SimpleNames.java | 3 +- .../world/ConstructorsAndInitializers.java | 2 +- .../src/foo/bar/hello/world/InnerClasses.java | 6 +- .../foo/bar/hello/world/MethodMadness.java | 2 +- .../AnonGeneNullarySimple.java | 3 +- .../javaonepointfive/AnonymousGenerics.java | 12 +- .../src/javaonepointfive/Cocovariant.java | 2 + .../CustomGenericsAndFields.java | 9 +- .../GenericMemberClasses.java | 9 +- .../MoreOverriddenGenerics.java | 6 +- .../javaonepointfive/NotSoSimpleEnums.java | 12 +- .../OverridesOnePointFour.java | 3 +- .../javaonepointfive/VarargsCovariant.java | 3 +- .../javaonepointfive/VarargsOverriding.java | 3 +- .../com/ibm/wala/cast/java/test/JLexTest.java | 2 + .../ibm/wala/cast/java/test/JavaIRTests.java | 12 + .../ibm/wala/cast/java/test/TestPlugin.java | 6 +- .../ibm/wala/cast/java/JavaSourcePlugin.java | 6 +- .../typeInference/AstJavaTypeInference.java | 9 + .../java/client/JavaSourceAnalysisEngine.java | 6 + .../ast/SynchronizedBlockDuplicator.java | 8 + ...AstJavaSSAPropagationCallGraphBuilder.java | 15 + .../JavaScopeMappingInstanceKeys.java | 1 + .../callgraph/JavaSourceAnalysisScope.java | 1 + .../cast/java/ipa/modref/AstJavaModRef.java | 5 + .../cast/java/ipa/slicer/AstJavaSlicer.java | 4 + .../java/loader/JavaSourceLoaderImpl.java | 44 +++ .../AstJavaAbstractInstructionVisitor.java | 2 + .../java/ssa/AstJavaInvokeInstruction.java | 3 + .../ssa/AstJavaNewEnclosingInstruction.java | 5 + .../java/ssa/EnclosingObjectReference.java | 10 + .../translator/JavaCAst2IRTranslator.java | 26 ++ .../java/translator/JavaProcedureEntity.java | 1 + .../cast/java/types/JavaPrimitiveTypeMap.java | 2 + .../ibm/wala/cast/java/types/JavaType.java | 1 + .../nu_validator/NuValidatorHtmlParser.java | 20 + .../test/TestAjaxsltCallGraphShapeRhino.java | 1 + .../js/test/TestArgumentSensitivityRhino.java | 3 +- .../TestCorrelatedPairExtractionRhino.java | 6 +- .../js/test/TestForInBodyExtractionRhino.java | 3 +- .../cast/js/test/TestForInLoopHackRhino.java | 3 +- .../cast/js/test/TestJQueryExamplesRhino.java | 3 +- .../TestMediawikiCallGraphShapeRhino.java | 1 + .../wala/cast/js/test/TestRhinoSourceMap.java | 1 - .../test/TestSimpleCallGraphShapeRhino.java | 1 + .../TestSimplePageCallGraphShapeRhino.java | 9 +- com.ibm.wala.cast.js.rhino/.classpath | 2 +- .../META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/build.properties | 2 +- .../js/translator/CAstRhinoTranslator.java | 3 +- .../CAstRhinoTranslatorFactory.java | 3 +- .../js/translator/RhinoToAstTranslator.java | 19 + .../com/ibm/wala/js/rhino/Activator.java | 6 +- .../com/ibm/wala/cast/js/test/CAstDumper.java | 3 +- .../cast/js/test/JSCallGraphBuilderUtil.java | 3 + .../js/test/TestCorrelatedPairExtraction.java | 2 +- .../cast/js/test/TestForInBodyExtraction.java | 2 +- .../cast/js/test/TestJSCallGraphShape.java | 1 + .../js/test/TestSimplePageCallGraphShape.java | 2 + .../ibm/wala/cast/js/JavaScriptPlugin.java | 6 +- .../typeInference/JSTypeInference.java | 10 + .../fieldbased/flowgraph/FlowGraph.java | 1 + .../vertices/AbstractVertexVisitor.java | 24 +- .../ibm/wala/cast/js/cfg/JSInducedCFG.java | 16 + .../js/client/JavaScriptAnalysisEngine.java | 6 + .../cast/js/html/CompositeFileMapping.java | 6 - .../cast/js/html/DomLessSourceExtractor.java | 7 +- .../wala/cast/js/html/EmptyFileMapping.java | 7 - .../ibm/wala/cast/js/html/FileMapping.java | 4 - .../cast/js/html/IdentityUrlResolver.java | 2 + .../wala/cast/js/html/IncludedPosition.java | 9 + .../wala/cast/js/html/NestedRangeMapping.java | 6 - .../wala/cast/js/html/RangeFileMapping.java | 9 +- .../ibm/wala/cast/js/html/SourceRegion.java | 9 + .../ibm/wala/cast/js/html/UnicodeReader.java | 2 + .../com/ibm/wala/cast/js/html/WebUtil.java | 1 + .../js/html/jericho/JerichoHtmlParser.java | 3 +- .../wala/cast/js/html/jericho/JerichoTag.java | 15 +- .../ipa/callgraph/ArgumentSpecialization.java | 8 + .../js/ipa/callgraph/GlobalObjectKey.java | 2 + .../cast/js/ipa/callgraph/JSCFABuilder.java | 1 + .../cast/js/ipa/callgraph/JSCallGraph.java | 4 + .../js/ipa/callgraph/JSCallGraphUtil.java | 6 + .../JSSSAPropagationCallGraphBuilder.java | 42 +++ .../callgraph/JSSyntheticParameterKey.java | 3 + .../JavaScriptConstructTargetSelector.java | 2 + .../JavaScriptConstructorInstanceKeys.java | 5 + .../ipa/callgraph/JavaScriptEntryPoints.java | 1 + ...avaScriptFunctionApplyContextSelector.java | 3 + ...vaScriptFunctionDotCallTargetSelector.java | 1 + .../JavaScriptScopeMappingInstanceKeys.java | 1 + .../ipa/callgraph/LoadFileTargetSelector.java | 1 + .../ObjectSensitivityContextSelector.java | 2 + .../PropertyNameContextSelector.java | 9 +- .../js/ipa/callgraph/SelectiveCPAContext.java | 1 + .../ipa/callgraph/TransitivePrototypeKey.java | 3 + .../correlations/CorrelationFinder.java | 1 + .../extraction/ClosureExtractor.java | 6 +- .../CorrelatedPairExtractorFactory.java | 2 +- .../extraction/ExtractedFunction.java | 45 ++- .../correlations/extraction/NodePos.java | 3 +- .../JavaScriptSummarizedFunction.java | 2 + .../js/ipa/summaries/JavaScriptSummary.java | 2 + .../cast/js/loader/JSCallSiteReference.java | 3 + .../wala/cast/js/loader/JavaScriptLoader.java | 119 ++++++ .../js/loader/JavaScriptLoaderFactory.java | 2 + .../js/ssa/JSAbstractInstructionVisitor.java | 7 + .../cast/js/ssa/JavaScriptCheckReference.java | 3 + .../cast/js/ssa/JavaScriptInstanceOf.java | 5 + .../wala/cast/js/ssa/JavaScriptInvoke.java | 7 + .../cast/js/ssa/JavaScriptPropertyRead.java | 4 + .../cast/js/ssa/JavaScriptPropertyWrite.java | 5 + .../js/ssa/JavaScriptTypeOfInstruction.java | 4 + .../cast/js/ssa/JavaScriptWithRegion.java | 2 + .../cast/js/translator/JSAstTranslator.java | 26 ++ ...aScriptLoopUnwindingTranslatorFactory.java | 4 +- .../JavaScriptTranslatorToCAst.java | 15 + .../js/translator/PropertyReadExpander.java | 13 + .../cast/js/translator/RangePosition.java | 9 + .../com/ibm/wala/cast/js/vis/JsPaPanel.java | 3 +- .../ibm/wala/cast/test/TestCAstPattern.java | 1 + .../typeInference/AstTypeInference.java | 10 + .../callgraph/ArgumentInstanceContext.java | 1 + .../wala/cast/ipa/callgraph/AstCallGraph.java | 4 + ...ntextInsensitiveSSAContextInterpreter.java | 2 + .../ipa/callgraph/AstGlobalPointerKey.java | 3 + .../AstSSAPropagationCallGraphBuilder.java | 75 ++++ .../cast/ipa/callgraph/CAstAnalysisScope.java | 10 + .../cast/ipa/callgraph/CAstCallGraphUtil.java | 2 +- .../ipa/callgraph/CrossLanguageCallGraph.java | 8 + .../CrossLanguageClassTargetSelector.java | 1 + .../CrossLanguageContextSelector.java | 2 + .../callgraph/CrossLanguageInstanceKeys.java | 5 + .../CrossLanguageMethodTargetSelector.java | 1 + ...anguageSSAPropagationCallGraphBuilder.java | 7 + .../callgraph/DelegatingAstPointerKeys.java | 10 + .../MiscellaneousHacksContextSelector.java | 2 + .../callgraph/ObjectPropertyCatalogKey.java | 3 + .../callgraph/ReflectedFieldPointerKey.java | 7 + .../callgraph/ScopeMappingInstanceKeys.java | 11 + .../cast/ipa/callgraph/ScriptEntryPoints.java | 5 + .../StandardFunctionTargetSelector.java | 1 + .../ipa/cha/CrossLanguageClassHierarchy.java | 30 ++ .../wala/cast/ipa/lexical/LexicalModRef.java | 2 + .../ibm/wala/cast/ipa/modref/AstModRef.java | 19 + .../ibm/wala/cast/ir/cfg/AstInducedCFG.java | 20 + .../ibm/wala/cast/ir/cfg/DelegatingCFG.java | 13 + .../cast/ir/ssa/AbstractLexicalInvoke.java | 6 + .../cast/ir/ssa/AbstractReflectiveGet.java | 6 + .../cast/ir/ssa/AbstractReflectivePut.java | 4 + .../wala/cast/ir/ssa/AssignInstruction.java | 3 + .../ir/ssa/AstAbstractInstructionVisitor.java | 9 + .../cast/ir/ssa/AstAssertInstruction.java | 8 + .../ibm/wala/cast/ir/ssa/AstConstants.java | 2 + .../wala/cast/ir/ssa/AstEchoInstruction.java | 10 + .../ibm/wala/cast/ir/ssa/AstGlobalRead.java | 5 + .../ibm/wala/cast/ir/ssa/AstGlobalWrite.java | 5 + .../cast/ir/ssa/AstIsDefinedInstruction.java | 12 + .../wala/cast/ir/ssa/AstLexicalAccess.java | 6 + .../ibm/wala/cast/ir/ssa/AstLexicalRead.java | 7 + .../ibm/wala/cast/ir/ssa/AstLexicalWrite.java | 7 + .../ir/ssa/EachElementGetInstruction.java | 4 + .../ir/ssa/EachElementHasNextInstruction.java | 4 + ...xedParametersLexicalInvokeInstruction.java | 3 + .../MultiReturnValueInvokeInstruction.java | 2 + .../cast/ir/ssa/analysis/LiveAnalysis.java | 19 + .../ir/translator/AbstractClassEntity.java | 5 + .../ir/translator/AbstractCodeEntity.java | 5 + .../ir/translator/AbstractDataEntity.java | 7 + .../cast/ir/translator/AbstractEntity.java | 5 + .../ir/translator/AbstractFieldEntity.java | 5 + .../ir/translator/AbstractGlobalEntity.java | 5 + .../ir/translator/AbstractScriptEntity.java | 7 + .../cast/ir/translator/AstTranslator.java | 342 ++++++++++++++++++ .../ir/translator/ExposedNamesCollector.java | 2 + .../cast/ir/translator/TranslatorToCAst.java | 14 + .../com/ibm/wala/cast/loader/AstClass.java | 26 ++ .../cast/loader/AstDynamicPropertyClass.java | 14 + .../com/ibm/wala/cast/loader/AstField.java | 13 + .../wala/cast/loader/AstFunctionClass.java | 27 ++ .../com/ibm/wala/cast/loader/AstMethod.java | 25 ++ .../wala/cast/loader/CAstAbstractLoader.java | 13 + .../cast/loader/CAstAbstractModuleLoader.java | 1 + .../cast/loader/SingleClassLoaderFactory.java | 1 + .../com/ibm/wala/cast/plugin/AstPlugin.java | 6 +- .../com/ibm/wala/cast/tree/AstPlugin.java | 6 +- .../wala/cast/tree/CAstControlFlowMap.java | 7 + .../wala/cast/tree/CAstMemberReference.java | 5 + .../com/ibm/wala/cast/tree/CAstQualifier.java | 2 + .../com/ibm/wala/cast/tree/CAstSymbol.java | 1 + .../java/com/ibm/wala/cast/tree/CAstType.java | 2 + .../wala/cast/tree/CAstTypeDictionary.java | 1 + .../tree/impl/AbstractSourcePosition.java | 4 + .../tree/impl/CAstControlFlowRecorder.java | 8 + .../com/ibm/wala/cast/tree/impl/CAstImpl.java | 30 ++ .../tree/impl/CAstNodeTypeMapRecorder.java | 2 + .../ibm/wala/cast/tree/impl/CAstOperator.java | 5 + .../tree/impl/CAstSourcePositionRecorder.java | 29 +- .../wala/cast/tree/impl/CAstSymbolImpl.java | 1 + .../cast/tree/impl/CAstSymbolImplBase.java | 6 + .../tree/impl/CAstTypeDictionaryImpl.java | 3 + .../wala/cast/tree/impl/CAstValueImpl.java | 6 + .../wala/cast/tree/impl/DelegatingEntity.java | 16 + .../cast/tree/impl/LineNumberPosition.java | 9 + .../com/ibm/wala/cast/tree/pattern/Alt.java | 1 + .../ibm/wala/cast/tree/pattern/AnyNode.java | 3 +- .../wala/cast/tree/pattern/NodeOfKind.java | 3 +- .../cast/tree/rewrite/AstLoopUnwinder.java | 8 + .../cast/tree/rewrite/CAstBasicRewriter.java | 5 + .../wala/cast/tree/rewrite/CAstCloner.java | 1 + .../wala/cast/tree/rewrite/CAstRewriter.java | 17 + .../tree/visit/DelegatingCAstVisitor.java | 129 +++++++ .../com/ibm/wala/cast/util/CAstFunctions.java | 6 + .../com/ibm/wala/cast/util/CAstPattern.java | 3 + .../com/ibm/wala/cast/util/SourceBuffer.java | 25 +- .../src/demandpa/ArraySet.java | 1 + .../src/demandpa/DummyHashMap.java | 2 + .../src/demandpa/DummyLinkedList.java | 1 + .../src/multiTypes/Foo.java | 1 + .../src/recurse/NList.java | 13 + .../src/reflection/Reflect5.java | 3 +- .../src/reflection/Reflect6.java | 3 +- com.ibm.wala.core.testdata/src/slice/B.java | 1 + .../core/tests/basic/FloydWarshallTest.java | 10 + .../core/tests/basic/GraphDataflowTest.java | 10 + .../wala/core/tests/basic/PathFinderTest.java | 1 + .../core/tests/callGraph/CallGraphTest.java | 18 + .../tests/callGraph/PiNodeCallGraphTest.java | 1 - .../wala/core/tests/cha/SourceMapTest.java | 5 + .../ContextInsensitiveReachingDefs.java | 5 + .../ContextSensitiveReachingDefs.java | 15 + .../dataflow/IntraprocReachingDefs.java | 5 + .../wala/examples/drivers/PDFCallGraph.java | 1 + .../com/ibm/wala/examples/drivers/PDFSDG.java | 2 + .../ibm/wala/examples/drivers/PDFSlice.java | 2 + .../examples/drivers/PDFTypeHierarchy.java | 1 + .../analysis/pointers/BasicHeapGraph.java | 43 +++ .../ibm/wala/analysis/pointers/HeapGraph.java | 3 + .../ClassFactoryContextInterpreter.java | 10 + .../ClassFactoryContextSelector.java | 2 + .../ClassNewInstanceContextInterpreter.java | 10 + .../ClassNewInstanceContextSelector.java | 2 + .../analysis/reflection/CloneInterpreter.java | 10 + .../reflection/FactoryBypassInterpreter.java | 13 + .../reflection/FactoryContextSelector.java | 2 + .../reflection/GetClassContextInterpeter.java | 10 + .../reflection/GetClassContextSelector.java | 2 + .../IllegalArgumentExceptionContext.java | 1 + .../JavaLangClassContextInterpreter.java | 10 + .../JavaLangClassContextSelector.java | 2 + .../analysis/reflection/JavaTypeContext.java | 1 + .../ReflectionContextInterpreter.java | 10 + .../reflection/ReflectionContextSelector.java | 2 + .../ReflectiveInvocationInterpreter.java | 10 + .../ReflectiveInvocationSelector.java | 2 + .../stackMachine/AbstractIntStackMachine.java | 10 + .../analysis/typeInference/TypeInference.java | 5 + .../analysis/typeInference/TypeVariable.java | 1 + .../src/com/ibm/wala/cfg/AbstractCFG.java | 30 ++ .../src/com/ibm/wala/cfg/InducedCFG.java | 11 + .../src/com/ibm/wala/cfg/ShrikeCFG.java | 11 + .../wala/cfg/cdg/ControlDependenceGraph.java | 12 + .../com/ibm/wala/classLoader/ArrayClass.java | 28 ++ .../BinaryDirectoryTreeModule.java | 2 +- .../ibm/wala/classLoader/BytecodeClass.java | 5 +- .../classLoader/ClassLoaderFactoryImpl.java | 1 + .../ibm/wala/classLoader/ClassLoaderImpl.java | 15 + .../wala/classLoader/DirectoryTreeModule.java | 1 + .../com/ibm/wala/classLoader/FieldImpl.java | 12 + .../src/com/ibm/wala/classLoader/IField.java | 1 + .../com/ibm/wala/classLoader/JVMClass.java | 6 + .../ibm/wala/classLoader/JarFileModule.java | 1 + .../ibm/wala/classLoader/JavaLanguage.java | 60 +++ .../ibm/wala/classLoader/LanguageImpl.java | 3 + .../com/ibm/wala/classLoader/ModuleEntry.java | 5 + .../wala/classLoader/NestedJarFileModule.java | 1 + .../classLoader/ResourceJarFileModule.java | 1 + .../ibm/wala/classLoader/ShrikeBTMethod.java | 25 ++ .../ibm/wala/classLoader/ShrikeCTMethod.java | 6 + .../ibm/wala/classLoader/ShrikeIRFactory.java | 2 + .../SourceDirectoryTreeModule.java | 2 +- .../ibm/wala/classLoader/SourceURLModule.java | 3 + .../ibm/wala/classLoader/SyntheticClass.java | 11 + .../ibm/wala/classLoader/SyntheticMethod.java | 28 ++ .../wala/client/AbstractAnalysisEngine.java | 6 + .../wala/client/AbstractEngineStopwatch.java | 4 + .../dataflow/IFDS/BackwardsSupergraph.java | 41 +++ .../wala/dataflow/IFDS/ICFGSupergraph.java | 39 ++ .../dataflow/IFDS/IdentityFlowFunction.java | 2 + .../dataflow/IFDS/IdentityFlowFunctions.java | 5 + .../wala/dataflow/IFDS/KillEverything.java | 1 + .../PartiallyBalancedTabulationProblem.java | 1 + .../dataflow/IFDS/SingletonFlowFunction.java | 2 + .../wala/dataflow/IFDS/TabulationSolver.java | 17 + .../wala/dataflow/IFDS/UnorderedDomain.java | 1 + .../dataflow/IFDS/VectorGenFlowFunction.java | 2 + .../dataflow/IFDS/VectorKillFlowFunction.java | 2 + .../demandpa/alg/AbstractDemandPointsTo.java | 3 + .../alg/ContextSensitiveStateMachine.java | 22 ++ .../alg/DemandRefinementPointsTo.java | 24 ++ .../wala/demandpa/alg/IntraProcFilter.java | 3 + .../demandpa/alg/SimpleDemandPointsTo.java | 1 + .../demandpa/alg/ThisFilteringHeapModel.java | 14 + .../AbstractRefinementPolicy.java | 5 + .../refinepolicy/AlwaysRefineCGPolicy.java | 2 + .../AlwaysRefineFieldsPolicy.java | 2 + .../DelegatingFieldRefinePolicy.java | 2 + .../refinepolicy/ManualCGRefinePolicy.java | 2 + .../alg/refinepolicy/ManualFieldPolicy.java | 2 + .../refinepolicy/ManualRefinementPolicy.java | 1 + .../alg/refinepolicy/NeverRefineCGPolicy.java | 2 + .../refinepolicy/NeverRefineFieldsPolicy.java | 2 + .../SinglePassRefinementPolicy.java | 1 + .../TunedFieldRefinementPolicy.java | 2 + .../refinepolicy/TunedRefinementPolicy.java | 1 + .../alg/statemachine/DummyStateMachine.java | 3 + .../flowgraph/AbstractDemandFlowGraph.java | 4 + .../demandpa/flowgraph/AbstractFlowGraph.java | 12 + .../flowgraph/AbstractFlowLabelVisitor.java | 16 + .../demandpa/flowgraph/AssignBarLabel.java | 4 + .../flowgraph/AssignGlobalBarLabel.java | 3 + .../demandpa/flowgraph/AssignGlobalLabel.java | 3 + .../wala/demandpa/flowgraph/AssignLabel.java | 4 + .../flowgraph/DemandPointerFlowGraph.java | 1 + .../flowgraph/DemandValueFlowGraph.java | 1 + .../demandpa/flowgraph/GetFieldBarLabel.java | 3 + .../demandpa/flowgraph/GetFieldLabel.java | 3 + .../demandpa/flowgraph/MatchBarLabel.java | 3 + .../wala/demandpa/flowgraph/MatchLabel.java | 3 + .../wala/demandpa/flowgraph/NewBarLabel.java | 3 + .../ibm/wala/demandpa/flowgraph/NewLabel.java | 3 + .../demandpa/flowgraph/ParamBarLabel.java | 3 + .../wala/demandpa/flowgraph/ParamLabel.java | 3 + .../demandpa/flowgraph/PutFieldBarLabel.java | 3 + .../demandpa/flowgraph/PutFieldLabel.java | 3 + .../demandpa/flowgraph/ReturnBarLabel.java | 3 + .../wala/demandpa/flowgraph/ReturnLabel.java | 3 + .../ibm/wala/demandpa/util/ArrayContents.java | 12 + .../demandpa/util/PABasedMemoryAccessMap.java | 7 + .../util/PointerParamValueNumIterator.java | 3 + .../demandpa/util/SimpleMemoryAccessMap.java | 7 + .../ibm/wala/escape/FILiveObjectAnalysis.java | 3 + .../wala/escape/LocalLiveRangeAnalysis.java | 1 + .../ibm/wala/escape/TrivialMethodEscape.java | 2 + .../ibm/wala/ipa/callgraph/AnalysisScope.java | 4 +- .../wala/ipa/callgraph/DelegatingContext.java | 1 + .../wala/ipa/callgraph/cha/CHACallGraph.java | 24 ++ ...ntextInsensitiveCHAContextInterpreter.java | 2 + .../callgraph/impl/AbstractRootMethod.java | 9 + .../ipa/callgraph/impl/BasicCallGraph.java | 8 + .../ClassHierarchyClassTargetSelector.java | 1 + .../ClassHierarchyMethodTargetSelector.java | 1 + .../callgraph/impl/ComposedEntrypoints.java | 1 + .../impl/ContextInsensitiveSelector.java | 2 + .../impl/DefaultContextSelector.java | 2 + .../impl/DelegatingContextSelector.java | 2 + .../wala/ipa/callgraph/impl/Everywhere.java | 1 + .../ipa/callgraph/impl/FakeRootClass.java | 29 ++ .../ipa/callgraph/impl/PartialCallGraph.java | 17 + .../com/ibm/wala/ipa/callgraph/impl/Util.java | 5 + .../propagation/AbstractFieldPointerKey.java | 1 + .../propagation/AbstractPointerAnalysis.java | 3 + .../propagation/AbstractPointsToSolver.java | 1 + .../propagation/AbstractTypeInNode.java | 2 + .../callgraph/propagation/AllocationSite.java | 4 + .../propagation/AllocationSiteInNode.java | 1 + .../AllocationSiteInNodeFactory.java | 5 + .../propagation/ArrayContentsKey.java | 1 + .../callgraph/propagation/AssignOperator.java | 1 + .../propagation/ClassBasedInstanceKeys.java | 5 + .../propagation/CloneContextSelector.java | 2 + .../propagation/ConcreteTypeKey.java | 4 + .../callgraph/propagation/ConstantKey.java | 2 + .../propagation/FilteredPointerKey.java | 13 + .../InstanceFieldKeyWithFilter.java | 1 + .../LocalPointerKeyWithFilter.java | 1 + .../propagation/PointerAnalysisImpl.java | 19 + .../propagation/PointerKeyComparator.java | 1 + .../callgraph/propagation/PointsToMap.java | 1 + .../propagation/PointsToSetVariable.java | 1 + .../PropagationCallGraphBuilder.java | 16 + .../propagation/PropagationGraph.java | 34 ++ .../propagation/PropagationSystem.java | 1 + .../propagation/ReceiverInstanceContext.java | 1 + .../ReceiverTypeContextSelector.java | 2 + .../propagation/ReturnValueKeyWithFilter.java | 1 + .../SSAPropagationCallGraphBuilder.java | 8 + .../SmushedAllocationSiteInNode.java | 3 + .../SmushedAllocationSiteInstanceKeys.java | 5 + .../propagation/StringConstantCharArray.java | 2 + .../TargetMethodContextSelector.java | 3 + .../propagation/cfa/CallStringContext.java | 1 + .../cfa/CallStringContextSelector.java | 3 + .../propagation/cfa/CallerContext.java | 1 + .../cfa/ContextInsensitiveSSAInterpreter.java | 4 + .../cfa/DefaultPointerKeyFactory.java | 7 + .../cfa/DefaultSSAInterpreter.java | 4 + .../cfa/DelegatingSSAContextInterpreter.java | 4 + .../cfa/OneLevelSiteContextSelector.java | 2 + .../propagation/cfa/ZeroXInstanceKeys.java | 5 + .../propagation/rta/BasicRTABuilder.java | 1 + .../rta/ContextInsensitiveRTAInterpreter.java | 5 +- .../rta/DefaultRTAInterpreter.java | 6 + .../rta/DelegatingRTAContextInterpreter.java | 6 + .../propagation/rta/TypeBasedHeapModel.java | 14 + .../rta/TypeBasedPointerAnalysis.java | 5 + .../ipa/cfg/AbstractInterproceduralCFG.java | 26 ++ .../ibm/wala/ipa/cfg/BasicBlockInContext.java | 12 + .../ibm/wala/ipa/cfg/ExceptionPrunedCFG.java | 2 + .../src/com/ibm/wala/ipa/cfg/PrunedCFG.java | 39 ++ .../com/ibm/wala/ipa/cha/ClassHierarchy.java | 31 ++ .../modref/DelegatingExtendedHeapModel.java | 15 + .../src/com/ibm/wala/ipa/modref/GenReach.java | 5 + .../src/com/ibm/wala/ipa/modref/ModRef.java | 2 + .../ipa/slicer/ExceptionalReturnCaller.java | 1 + .../ibm/wala/ipa/slicer/HeapReachingDefs.java | 19 + .../wala/ipa/slicer/NormalReturnCaller.java | 1 + .../src/com/ibm/wala/ipa/slicer/PDG.java | 24 ++ .../com/ibm/wala/ipa/slicer/ParamCallee.java | 1 + .../com/ibm/wala/ipa/slicer/ParamCaller.java | 1 + .../ipa/slicer/ReachabilityFunctions.java | 6 + .../src/com/ibm/wala/ipa/slicer/SDG.java | 16 + .../ibm/wala/ipa/slicer/SDGSupergraph.java | 39 ++ .../ibm/wala/ipa/slicer/SliceFunctions.java | 6 + .../src/com/ibm/wala/ipa/slicer/Slicer.java | 6 + .../com/ibm/wala/ipa/slicer/thin/CISDG.java | 26 ++ .../summaries/BypassClassTargetSelector.java | 1 + .../summaries/BypassMethodTargetSelector.java | 1 + .../ipa/summaries/BypassSyntheticClass.java | 18 + .../summaries/BypassSyntheticClassLoader.java | 15 + .../ipa/summaries/SyntheticIRFactory.java | 2 + .../com/ibm/wala/ssa/CompoundPiPolicy.java | 2 + .../src/com/ibm/wala/ssa/ConstantValue.java | 2 + .../src/com/ibm/wala/ssa/DefUse.java | 3 + .../com/ibm/wala/ssa/DefaultIRFactory.java | 2 + .../src/com/ibm/wala/ssa/IR.java | 12 + .../src/com/ibm/wala/ssa/ISSABasicBlock.java | 3 + .../com/ibm/wala/ssa/InstanceOfPiPolicy.java | 2 + .../com/ibm/wala/ssa/NullTestPiPolicy.java | 2 + .../src/com/ibm/wala/ssa/PhiValue.java | 2 + .../src/com/ibm/wala/ssa/SSABuilder.java | 4 + .../src/com/ibm/wala/ssa/SSACFG.java | 60 +++ .../src/com/ibm/wala/ssa/SSAInstruction.java | 23 ++ .../ibm/wala/ssa/SSASwitchInstruction.java | 2 + .../ibm/wala/ssa/ShrikeIndirectionData.java | 5 + .../analysis/ExplodedControlFlowGraph.java | 49 +++ .../ibm/wala/util/scope/JUnitEntryPoints.java | 2 + .../com/ibm/wala/util/warnings/Warning.java | 1 + .../src/com/ibm/wala/viz/PDFViewUtil.java | 2 + .../src/com/ibm/wala/viz/viewer/CgPanel.java | 3 + .../src/com/ibm/wala/viz/viewer/ChaPanel.java | 3 + .../wala/viz/viewer/DualTreeCellRenderer.java | 1 + .../wala/viz/viewer/IrAndSourceViewer.java | 1 + .../src/com/ibm/wala/viz/viewer/IrViewer.java | 1 + .../src/com/ibm/wala/viz/viewer/PaPanel.java | 3 + .../wala/cast/java/jdt/test/Activator.java | 2 + .../java/test/TypeInferenceAssertion.java | 1 + .../jdt/FakeExceptionTypeBinding.java | 58 +++ .../translator/jdt/JDTClassLoaderFactory.java | 1 + .../jdt/JDTJava2CAstTranslator.java | 103 +++++- .../translator/jdt/JDTSourceLoaderImpl.java | 1 + .../jdt/JDTSourceModuleTranslator.java | 2 + .../translator/jdt/JDTTypeDictionary.java | 10 + .../wala/ide/AbstractJavaAnalysisAction.java | 3 + .../com/ibm/wala/ide/jdt/Activator.java | 6 +- .../com/ibm/wala/ide/util/JdtPosition.java | 10 + .../com/ibm/wala/ide/jsdt/Activator.java | 6 +- .../wala/ide/util/JavaScriptHeadlessUtil.java | 3 +- .../com/ibm/wala/ide/util/JsdtUtil.java | 4 + .../com/ibm/wala/eclipse/headless/Main.java | 2 + .../examples/drivers/SWTTypeHierarchy.java | 1 + .../src/com/ibm/wala/ide/test/Activator.java | 2 + .../wala/ide/tests/util/EclipseTestUtil.java | 1 + .../classloader/EclipseSourceFileModule.java | 2 +- .../client/EclipseProjectAnalysisEngine.java | 1 + .../EclipseProjectSourceAnalysisEngine.java | 2 + .../com/ibm/wala/ide/ui/SWTTreeViewer.java | 8 + .../ibm/wala/ide/ui/ViewIFDSLocalAction.java | 2 + .../ibm/wala/ide/util/EclipseProjectPath.java | 1 + .../com/ibm/wala/ide/util/HeadlessUtil.java | 1 + .../ide/util/ProgressMonitorDelegate.java | 4 + .../wala/shrike/copywriter/CopyWriter.java | 1 + .../wala/shrikeBT/ArrayLengthInstruction.java | 1 + .../wala/shrikeBT/ArrayLoadInstruction.java | 3 + .../wala/shrikeBT/ArrayStoreInstruction.java | 2 + .../wala/shrikeBT/BinaryOpInstruction.java | 5 + .../wala/shrikeBT/CheckCastInstruction.java | 3 + .../wala/shrikeBT/ComparisonInstruction.java | 3 + .../ConditionalBranchInstruction.java | 4 + .../wala/shrikeBT/ConstantInstruction.java | 1 + .../wala/shrikeBT/ConversionInstruction.java | 4 + .../com/ibm/wala/shrikeBT/DupInstruction.java | 1 + .../com/ibm/wala/shrikeBT/GetInstruction.java | 6 + .../ibm/wala/shrikeBT/GotoInstruction.java | 1 + .../com/ibm/wala/shrikeBT/IInstruction.java | 1 + .../ibm/wala/shrikeBT/IInvokeInstruction.java | 1 + .../wala/shrikeBT/InstanceofInstruction.java | 3 + .../com/ibm/wala/shrikeBT/Instruction.java | 7 + .../ibm/wala/shrikeBT/InvokeInstruction.java | 5 + .../ibm/wala/shrikeBT/LoadInstruction.java | 4 + .../ibm/wala/shrikeBT/MonitorInstruction.java | 1 + .../com/ibm/wala/shrikeBT/NewInstruction.java | 1 + .../com/ibm/wala/shrikeBT/PopInstruction.java | 1 + .../com/ibm/wala/shrikeBT/PutInstruction.java | 5 + .../ibm/wala/shrikeBT/ReturnInstruction.java | 1 + .../ibm/wala/shrikeBT/ShiftInstruction.java | 4 + .../ibm/wala/shrikeBT/StoreInstruction.java | 3 + .../ibm/wala/shrikeBT/SwapInstruction.java | 1 + .../ibm/wala/shrikeBT/SwitchInstruction.java | 1 + .../ibm/wala/shrikeBT/ThrowInstruction.java | 1 + .../ibm/wala/shrikeBT/UnaryOpInstruction.java | 3 + .../analysis/ClassHierarchyStore.java | 4 + .../shrikeBT/info/InstructionTypeCounter.java | 1 + .../wala/shrikeBT/info/LocalAllocator.java | 1 + .../shrikeBT/info/ThisAssignmentChecker.java | 1 + .../shrikeCT/tools/AddSerialVersion.java | 2 + .../tools/OfflineInstrumenterBase.java | 1 + .../wala/dataflow/graph/BasicFramework.java | 2 + .../impl/AbstractFixedPointSolver.java | 2 + .../impl/DefaultFixedPointSolver.java | 1 + .../impl/DefaultFixedPointSystem.java | 13 + .../fixedpoint/impl/GeneralStatement.java | 4 + .../fixedpoint/impl/NullaryStatement.java | 4 + .../ibm/wala/fixpoint/AbstractVariable.java | 2 + .../ibm/wala/fixpoint/BitVectorVariable.java | 1 + .../ibm/wala/fixpoint/BooleanVariable.java | 1 + .../com/ibm/wala/fixpoint/IntSetVariable.java | 1 + .../com/ibm/wala/fixpoint/UnaryStatement.java | 4 + .../src/com/ibm/wala/util/ProgressMaster.java | 4 + .../util/collections/AbstractMultiMap.java | 10 + .../wala/util/collections/ArrayIterator.java | 3 + .../ibm/wala/util/collections/ArraySet.java | 3 + .../ibm/wala/util/collections/BimodalMap.java | 12 + .../util/collections/CollectionFilter.java | 1 + .../util/collections/ComposedIterator.java | 3 + .../util/collections/CompoundIntIterator.java | 2 + .../util/collections/CompoundIterator.java | 3 + .../util/collections/EmptyIntIterator.java | 2 + .../wala/util/collections/EmptyIterator.java | 3 + .../wala/util/collections/FilterIterator.java | 3 + .../wala/util/collections/Filtersection.java | 1 + .../util/collections/HashCodeComparator.java | 1 + .../wala/util/collections/ImmutableStack.java | 3 +- .../collections/IndiscriminateFilter.java | 1 + .../wala/util/collections/IntMapIterator.java | 3 + .../util/collections/Iterator2Collection.java | 13 + .../util/collections/Iterator2Iterable.java | 1 + .../wala/util/collections/Iterator2List.java | 10 + .../util/collections/IteratorPlusOne.java | 3 + .../util/collections/IteratorPlusTwo.java | 3 + .../wala/util/collections/MapIterator.java | 3 + .../ibm/wala/util/collections/MultiMap.java | 1 + .../collections/NonNullSingletonIterator.java | 3 + .../util/collections/ObjectArrayMapping.java | 7 + .../ibm/wala/util/collections/OrFilter.java | 1 + .../com/ibm/wala/util/collections/Pair.java | 3 + .../util/collections/ReverseIterator.java | 3 + .../wala/util/collections/SimpleVector.java | 5 + .../ibm/wala/util/collections/SmallMap.java | 12 + .../wala/util/collections/SparseVector.java | 8 + .../util/collections/ToStringComparator.java | 1 + .../wala/util/collections/TwoLevelVector.java | 8 + .../ibm/wala/util/graph/AbstractGraph.java | 16 + .../util/graph/AbstractNumberedGraph.java | 8 + .../util/graph/EdgeFilteredNumberedGraph.java | 12 + .../wala/util/graph/GraphReachability.java | 5 + .../com/ibm/wala/util/graph/GraphSlicer.java | 32 ++ .../com/ibm/wala/util/graph/NodeManager.java | 1 + .../util/graph/dominators/Dominators.java | 13 + .../util/graph/impl/BasicNodeManager.java | 5 + .../graph/impl/BasicOrderedMultiGraph.java | 18 + .../wala/util/graph/impl/DelegatingGraph.java | 16 + .../impl/DelegatingNumberedEdgeManager.java | 15 + .../impl/DelegatingNumberedNodeManager.java | 12 + .../util/graph/impl/InvertingEdgeManager.java | 10 + .../impl/InvertingNumberedEdgeManager.java | 12 + .../wala/util/graph/impl/NodeWithNumber.java | 2 + .../graph/impl/NodeWithNumberedEdges.java | 7 + .../util/graph/impl/NumberedNodeIterator.java | 3 + .../graph/impl/SlowNumberedNodeManager.java | 9 + .../graph/impl/SparseNumberedEdgeManager.java | 16 + .../graph/labeled/AbstractLabeledGraph.java | 10 + .../labeled/AbstractNumberedLabeledGraph.java | 11 + .../SparseNumberedLabeledEdgeManager.java | 25 ++ .../wala/util/graph/traverse/BFSIterator.java | 3 + .../util/graph/traverse/BFSPathFinder.java | 3 + .../graph/traverse/BoundedBFSIterator.java | 3 + .../com/ibm/wala/util/graph/traverse/DFS.java | 1 + .../traverse/DFSDiscoverTimeIterator.java | 3 + .../graph/traverse/DFSFinishTimeIterator.java | 3 + .../util/graph/traverse/FloydWarshall.java | 15 +- .../wala/util/graph/traverse/SCCIterator.java | 3 + .../ibm/wala/util/heapTrace/HeapTracer.java | 6 +- .../util/intset/BasicNaturalRelation.java | 13 + .../util/intset/BimodalMutableIntSet.java | 19 + .../intset/BimodalMutableIntSetFactory.java | 4 + .../src/com/ibm/wala/util/intset/BitSet.java | 3 + .../ibm/wala/util/intset/BitVectorIntSet.java | 21 ++ .../util/intset/BitVectorIntSetFactory.java | 4 + .../util/intset/DebuggingMutableIntSet.java | 23 ++ .../intset/DebuggingMutableIntSetFactory.java | 4 + .../wala/util/intset/MultiModalIntVector.java | 3 + .../ibm/wala/util/intset/MutableMapping.java | 7 + .../intset/MutableSharedBitVectorIntSet.java | 19 + .../MutableSharedBitVectorIntSetFactory.java | 4 + .../wala/util/intset/MutableSparseIntSet.java | 27 +- .../intset/MutableSparseIntSetFactory.java | 4 + .../util/intset/MutableSparseLongSet.java | 5 + .../intset/MutableSparseLongSetFactory.java | 4 + .../util/intset/OffsetOrdinalSetMapping.java | 7 + .../com/ibm/wala/util/intset/OrdinalSet.java | 4 + .../util/intset/SemiSparseMutableIntSet.java | 21 ++ .../SemiSparseMutableIntSetFactory.java | 4 + .../ibm/wala/util/intset/SimpleIntVector.java | 3 + .../ibm/wala/util/intset/SparseIntSet.java | 15 + .../ibm/wala/util/intset/SparseIntVector.java | 3 + .../ibm/wala/util/intset/SparseLongSet.java | 14 + .../wala/util/intset/TwoLevelIntVector.java | 3 + .../src/com/ibm/wala/viz/NodeDecorator.java | 1 + 644 files changed, 4956 insertions(+), 195 deletions(-) diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java index bb5cadf97..448f86ed0 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/polyglot/test/Activator.java @@ -31,6 +31,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -41,6 +42,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java index a4e80d1c1..21b34b0ac 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJLexTest.java @@ -23,6 +23,7 @@ public class PolyglotJLexTest extends JLexTest { @Override protected JavaSourceAnalysisEngine getAnalysisEngine(final String[] mainClassDescriptors, Collection sources, List libs) { JavaSourceAnalysisEngine engine = new PolyglotJavaSourceAnalysisEngine() { + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, new String[] { "LJLex/Main" }); } diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java index e0950fc3f..47918b1a2 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotJavaIRTest.java @@ -28,6 +28,7 @@ public class PolyglotJavaIRTest extends JavaIRTests { @Override protected AbstractAnalysisEngine getAnalysisEngine(final String[] mainClassDescriptors, Collection sources, List libs) { JavaSourceAnalysisEngine engine = new PolyglotJavaSourceAnalysisEngine() { + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, mainClassDescriptors); } diff --git a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java index 58dc1e851..08a0224a2 100644 --- a/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java +++ b/com.ibm.wala.cast.java.polyglot.test/source/com/ibm/wala/cast/java/test/PolyglotSyncDuplicatorTest.java @@ -26,15 +26,19 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; public class PolyglotSyncDuplicatorTest extends SyncDuplicatorTest { + @Override protected JavaSourceAnalysisEngine getAnalysisEngine(final String[] mainClassDescriptors, Collection sources, List libs) { JavaSourceAnalysisEngine engine = new PolyglotJavaSourceAnalysisEngine() { + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha, mainClassDescriptors); } + @Override public IRTranslatorExtension getTranslatorExtension() { JavaIRTranslatorExtension ext = new JavaIRTranslatorExtension(); ext.setCAstRewriterFactory(new CAstRewriterFactory() { + @Override public CAstRewriter createCAstRewriter(CAst ast) { return new SynchronizedBlockDuplicator(ast, true, testMethod); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java index ac69460cc..5402aa51a 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/AscriptionGoal.java @@ -32,6 +32,7 @@ public class AscriptionGoal extends VisitorGoal { public AscriptionGoal(Job job) { super(job, new AscriptionVisitor(job, job.extensionInfo().typeSystem(), job.extensionInfo().nodeFactory()) { + @Override public Expr ascribe(Expr e, Type toType) throws SemanticException { if (e instanceof ArrayInit && e.type().isNull()) { return e.type(toType); diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java index e33f9951f..8cd6b8b01 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/IRGoal.java @@ -66,6 +66,7 @@ public class IRGoal extends SourceGoal_c /* PORT1.7 removed 'implements EndGoal' return true; } + @Override public String name() { return ""; } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java index babbf3938..b4cc2173f 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/JavaIRTranslatorExtension.java @@ -52,11 +52,13 @@ public class JavaIRTranslatorExtension extends JLExtensionInfo implements IRTran }; } + @Override public void setSourceLoader(PolyglotSourceLoaderImpl sourceLoader) { fSourceLoader= sourceLoader; fMapper= new PolyglotIdentityMapper(sourceLoader.getReference()); } + @Override public PolyglotIdentityMapper getIdentityMapper() { return fMapper; } @@ -65,10 +67,12 @@ public class JavaIRTranslatorExtension extends JLExtensionInfo implements IRTran rewriterFactory = factory; } + @Override public CAstRewriterFactory getCAstRewriterFactory() { return rewriterFactory; } + @Override public boolean getReplicateForDoLoops() { return false; } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java index 1be479632..249835130 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/ModuleSource.java @@ -37,14 +37,17 @@ public class ModuleSource extends FileSource { public ModuleSource(final SourceModule module) throws IOException { super(new Resource() { + @Override public File file() { return new File(module.getURL().getFile()); } + @Override public InputStream getInputStream() throws IOException { return module.getInputStream(); } + @Override public String name() { String fullPath = module.getURL().getFile(); int idx= fullPath.lastIndexOf(File.separatorChar); diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java index 06a24357b..9e1bae855 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotClassLoaderFactory.java @@ -43,6 +43,7 @@ public class PolyglotClassLoaderFactory extends ClassLoaderFactoryImpl { return fExtensionMap.get(clr); } + @Override protected IClassLoader makeNewClassLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, IClassLoader parent, AnalysisScope scope) throws IOException { if (classLoaderReference.equals(JavaSourceAnalysisScope.SOURCE)) { diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java index 1e6786234..88f244263 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotIdentityMapper.java @@ -62,6 +62,7 @@ public class PolyglotIdentityMapper implements IdentityMapper> getAllScopedEntities() { return Collections.singletonMap(null, fTopLevelDecls); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("CompilationUnitEntity asked for AST-related entities, but it has no AST."); return null; } + @Override public CAstNode getAST() { return null; } @@ -1405,29 +1469,35 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public CAstControlFlowMap getControlFlow() { Assertions.UNREACHABLE("CompilationUnitEntity.getControlFlow()"); return null; } + @Override public CAstSourcePositionMap getSourceMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getSourceMap()"); return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return null; } + @Override public CAstNodeTypeMap getNodeTypeMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getNodeTypeMap()"); return null; } + @Override public Collection getQualifiers() { return Collections.EMPTY_LIST; } + @Override public CAstType getType() { Assertions.UNREACHABLE("CompilationUnitEntity.getType()"); return null; @@ -1450,6 +1520,7 @@ public class PolyglotJava2CAstTranslator { fType = type; } + @Override public String getName() { // TODO Will the IdentityMapper do the right thing for anonymous classes? // If so, we can delete most of the following logic... @@ -1459,6 +1530,7 @@ public class PolyglotJava2CAstTranslator { return fIdentityMapper.getTypeRef(fType).getName().toString(); } + @Override public Collection getSupertypes() { if (fSuperTypes == null) { buildSuperTypes(); @@ -1495,10 +1567,12 @@ public class PolyglotJava2CAstTranslator { } } + @Override public Collection getQualifiers() { return mapFlagsToQualifiers(fType.flags()); } + @Override public boolean isInterface() { if (fType == fSystem.Object()) { return false; // fSystem.Object() MUST be a class, as far as WALA is concerned @@ -1514,10 +1588,12 @@ public class PolyglotJava2CAstTranslator { fEntities = new LinkedHashMap>(entities); } + @Override public Map> getAllScopedEntities() { return Collections.unmodifiableMap(fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { if (fEntities.containsKey(construct)) { return (fEntities.get(construct)).iterator(); @@ -1526,6 +1602,7 @@ public class PolyglotJava2CAstTranslator { } } + @Override public String getSignature() { return Util.methodEntityToSelector(this).toString(); } @@ -1555,30 +1632,37 @@ public class PolyglotJava2CAstTranslator { sourcePosition = makePosition(p); } + @Override public int getKind() { return TYPE_ENTITY; } + @Override public String getName() { return fName; // unqualified? } + @Override public String getSignature() { return "L" + fName.replace('.', '/') + ";"; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public CAstNode getAST() { // This entity has no AST nodes, really. return null; @@ -1589,42 +1673,51 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public Map> getAllScopedEntities() { return Collections.singletonMap(null, fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("Non-AST-bearing entity (ClassEntity) asked for scoped entities related to a given AST node"); return null; } + @Override public CAstControlFlowMap getControlFlow() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap getSourceMap() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return sourcePosition; } + @Override public CAstNodeTypeMap getNodeTypeMap() { // This entity has no AST nodes, really. return new CAstNodeTypeMap() { + @Override public CAstType getNodeType(CAstNode node) { throw new UnsupportedOperationException(); } + @Override public Collection getMappedNodes() { throw new UnsupportedOperationException(); } }; } + @Override public Collection getQualifiers() { if (fCT == fTypeSystem.Object()) { // pretend the root of the hierarchy is always a class return mapFlagsToQualifiers(fCT.flags().clear(Flags.INTERFACE)); @@ -1632,6 +1725,7 @@ public class PolyglotJava2CAstTranslator { return mapFlagsToQualifiers(fCT.flags()); } + @Override public CAstType getType() { return new PolyglotJavaType(fCT, getTypeDict(), fTypeSystem); } @@ -1680,14 +1774,17 @@ public class PolyglotJava2CAstTranslator { } } + @Override public String toString() { return fPd.toString(); } + @Override public int getKind() { return CAstEntity.FUNCTION_ENTITY; } + @Override public String getName() { if (fPd instanceof ConstructorInstance) { return MethodReference.initAtom.toString(); @@ -1701,10 +1798,12 @@ public class PolyglotJava2CAstTranslator { } } + @Override public String[] getArgumentNames() { return argumentNames; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } @@ -1727,45 +1826,55 @@ public class PolyglotJava2CAstTranslator { return false; } + @Override public int getArgumentCount() { return isStatic() ? formalTypes().size() : formalTypes().size() + 1; } + @Override public CAstNode getAST() { return fPdast; } + @Override public CAstControlFlowMap getControlFlow() { return fMc.cfg(); } + @Override public CAstSourcePositionMap getSourceMap() { return fMc.pos(); } + @Override public CAstSourcePositionMap.Position getPosition() { return getSourceMap().getPosition(fPdast); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return fMc.getNodeTypeMap(); } + @Override public Collection getQualifiers() { return mapFlagsToQualifiers(getFlags()); } + @Override public CAstType getType() { return new CAstType.Method() { private Collection fExceptionTypes = null; private List fParameterTypes = null; + @Override public CAstType getReturnType() { return fMc.getTypeDictionary().getCAstTypeFor( (fPd instanceof MethodInstance) ? ((MethodInstance) fPd).returnType() : fSystem.Void()); } + @Override public List getArgumentTypes() { if (fParameterTypes == null) { final List formalTypes = formalTypes(); @@ -1778,16 +1887,19 @@ public class PolyglotJava2CAstTranslator { return fParameterTypes; } + @Override public String getName() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getName() called???"); return "?"; } + @Override public Collection getSupertypes() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getSupertypes() called???"); return null; } + @Override public Collection/* */ getExceptionTypes() { if (fExceptionTypes == null) { fExceptionTypes = new LinkedHashSet(); @@ -1807,10 +1919,12 @@ public class PolyglotJava2CAstTranslator { return fExceptionTypes; } + @Override public int getArgumentCount() { return formalTypes().size(); } + @Override public CAstType getDeclaringType() { return getTypeDict().getCAstTypeFor(declaringType); } @@ -1834,38 +1948,47 @@ public class PolyglotJava2CAstTranslator { fContext = context; } + @Override public int getKind() { return CAstEntity.FIELD_ENTITY; } + @Override public String getName() { return fFI.name().toString(); } + @Override public String getSignature() { return fFI.name() + fIdentityMapper.typeToTypeID(fFI.type()); } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public Iterator getScopedEntities(CAstNode construct) { return EmptyIterator.instance(); } + @Override public Map> getAllScopedEntities() { return Collections.emptyMap(); } + @Override public CAstNode getAST() { // No AST for a field decl; initializers folded into // constructor processing... @@ -1877,32 +2000,38 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public CAstControlFlowMap getControlFlow() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap getSourceMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return makePosition(fFI.position()); } + @Override public CAstNodeTypeMap getNodeTypeMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public Collection getQualifiers() { return mapFlagsToQualifiers(fFI.flags()); } + @Override public CAstType getType() { return fContext.getTypeDictionary().getCAstTypeFor(fFI.type()); } @@ -1933,38 +2062,47 @@ public class PolyglotJava2CAstTranslator { super(parent); } + @Override public Collection> getCatchTargets(Type label) { return parent.getCatchTargets(label); } + @Override public Node getFinally() { return parent.getFinally(); } + @Override public CodeInstance getEnclosingMethod() { return parent.getEnclosingMethod(); } + @Override public Type getEnclosingType() { return parent.getEnclosingType(); } + @Override public CAstTypeDictionary getTypeDictionary() { return parent.getTypeDictionary(); } + @Override public List getStaticInitializers() { return parent.getStaticInitializers(); } + @Override public List getInitializers() { return parent.getInitializers(); } + @Override public Map getLabelMap() { return parent.getLabelMap(); } + @Override public boolean needLVal() { return parent.needLVal(); } @@ -1986,6 +2124,7 @@ public class PolyglotJava2CAstTranslator { fChildren = entities; } + @Override public void addScopedEntity(CAstNode node, CAstEntity e) { Assertions.productionAssertion(node == null); fChildren.add(e); @@ -1995,18 +2134,22 @@ public class PolyglotJava2CAstTranslator { // return null; // fChildren; // } + @Override public Type getEnclosingType() { return type; } + @Override public List getInitializers() { return fInitializers; } + @Override public List getStaticInitializers() { return fStaticInitializers; } + @Override public CAstControlFlowRecorder cfg() { Assertions.UNREACHABLE("ClassContext.cfg()"); return null; @@ -2017,11 +2160,13 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public Node getFinally() { Assertions.UNREACHABLE("ClassContext.getFinally()"); return null; } + @Override public CodeInstance getEnclosingMethod() { // No one outside a method defining a local class can see it, // so it clearly can't escape through to the method's enclosing @@ -2030,28 +2175,33 @@ public class PolyglotJava2CAstTranslator { return null; } + @Override public CAstSourcePositionRecorder pos() { // No AST, so no AST map Assertions.UNREACHABLE("ClassContext.pos()"); return null; } + @Override public Node getContinueFor(String label) { Assertions.UNREACHABLE("ClassContext.getContinueFor() with label " + label + " in " + type); return null; } + @Override public Node getBreakFor(String label) { System.err.println("Cannot find break target for " + label + " in " + type); Assertions.UNREACHABLE("ClassContext.getBreakFor()"); return null; } + @Override public Map getLabelMap() { Assertions.UNREACHABLE("ClassContext.getLabelMap()"); return null; } + @Override public boolean needLVal() { Assertions.UNREACHABLE("ClassContext.needLVal()"); return false; @@ -2074,31 +2224,38 @@ public class PolyglotJava2CAstTranslator { fEntities = entities; } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { return fNodeTypeMap; } + @Override public CAstSourcePositionRecorder pos() { return fSourceMap; } + @Override public CAstControlFlowRecorder cfg() { return fCFG; } + @Override public void addScopedEntity(CAstNode node, CAstEntity entity) { if (! fEntities.containsKey(node)) { fEntities.put(node, new HashSet(1)); } fEntities.get(node).add(entity); } + @Override public Map> getScopedEntities() { return fEntities; } + @Override public Map getLabelMap() { return labelMap; } + @Override public boolean needLVal() { return false; } @@ -2112,11 +2269,13 @@ public class PolyglotJava2CAstTranslator { fPI = pi; } + @Override public Collection> getCatchTargets(Type label) { Collection> result = Collections.singleton(Pair.make(fREType, CAstControlFlowMap.EXCEPTION_TO_EXIT)); return result; } + @Override public CodeInstance getEnclosingMethod() { return fPI; } @@ -2143,6 +2302,7 @@ public class PolyglotJava2CAstTranslator { } } + @Override public Collection> getCatchTargets(Type label) { // Look for all matching targets for this thrown type: // if supertpe match, then return only matches at this catch @@ -2168,10 +2328,12 @@ public class PolyglotJava2CAstTranslator { return catchNodes; } + @Override public List getStaticInitializers() { return null; } + @Override public List getInitializers() { return null; } @@ -2184,45 +2346,54 @@ public class PolyglotJava2CAstTranslator { fTypeDict = typeDict; } + @Override public Collection> getCatchTargets(Type label) { Assertions.UNREACHABLE("RootContext.getCatchTargets()"); return null; } + @Override public Node getFinally() { Assertions.UNREACHABLE("RootContext.getFinally()"); return null; } + @Override public CodeInstance getEnclosingMethod() { Assertions.UNREACHABLE("RootContext.getEnclosingMethod()"); return null; } + @Override public Type getEnclosingType() { Assertions.UNREACHABLE("RootContext.getEnclosingType()"); return null; } + @Override public CAstTypeDictionary getTypeDictionary() { return fTypeDict; } + @Override public List getStaticInitializers() { Assertions.UNREACHABLE("RootContext.getStaticInitializers()"); return null; } + @Override public List getInitializers() { Assertions.UNREACHABLE("RootContext.getInitializers()"); return null; } + @Override public Map getLabelMap() { Assertions.UNREACHABLE("RootContext.getLabelMap()"); return null; } + @Override public boolean needLVal() { Assertions.UNREACHABLE("ClassContext.needLVal()"); return false; @@ -2240,14 +2411,17 @@ public class PolyglotJava2CAstTranslator { this.breakTo = breakTo; } + @Override public Node getBreakFor(String label) { return (label == null || label.equals(this.label)) ? breakTo : super.getBreakFor(label); } + @Override public List getStaticInitializers() { return null; } + @Override public List getInitializers() { return null; } @@ -2261,6 +2435,7 @@ public class PolyglotJava2CAstTranslator { this.continueTo = continueTo; } + @Override public Node getContinueFor(String label) { return (label == null || label.equals(this.label)) ? continueTo : super.getContinueFor(label); } @@ -2272,6 +2447,7 @@ public class PolyglotJava2CAstTranslator { super(parent); } + @Override public boolean needLVal() { return true; } @@ -2297,30 +2473,37 @@ public class PolyglotJava2CAstTranslator { this.p = p; } + @Override public int getFirstLine() { return p.line(); } + @Override public int getLastLine() { return p.endLine(); } + @Override public int getFirstCol() { return p.column(); } + @Override public int getLastCol() { return p.endColumn(); } + @Override public int getFirstOffset() { return p.offset(); } + @Override public int getLastOffset() { return p.endOffset(); } + @Override public URL getURL() { try { String path = p.path(); @@ -2331,6 +2514,7 @@ public class PolyglotJava2CAstTranslator { } } + @Override public InputStream getInputStream() throws IOException { return getURL().openConnection().getInputStream(); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java index a22ce4838..b2285b679 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotJavaSourceAnalysisEngine.java @@ -20,6 +20,7 @@ public class PolyglotJavaSourceAnalysisEngine extends JavaSourceAnalysisEngine { return new JavaIRTranslatorExtension(); } + @Override protected ClassLoaderFactory getClassLoaderFactory(SetOfClasses exclusions) { return new PolyglotClassLoaderFactory(exclusions, getTranslatorExtension()); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java index df8a49022..7eb3a2bc2 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceLoaderImpl.java @@ -36,6 +36,7 @@ public class PolyglotSourceLoaderImpl extends JavaSourceLoaderImpl { return fExtInfo; } + @Override protected SourceModuleTranslator getTranslator() { return new PolyglotSourceModuleTranslator(cha.getScope(), fExtInfo, this, JavaSourceAnalysisScope.SOURCE); } diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java index f59a6aff2..39da5ee70 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotSourceModuleTranslator.java @@ -108,6 +108,7 @@ public class PolyglotSourceModuleTranslator implements SourceModuleTranslator { fSourcePath = "."; } + @Override public void loadAllSources(Set modules) { Options opts= fExtInfo.getOptions(); opts.assertions = true; diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java index 6ab77ec71..a381be5e9 100644 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotTypeDictionary.java @@ -42,18 +42,22 @@ public class PolyglotTypeDictionary extends CAstTypeDictionaryImpl { fEltCAstType = getCAstTypeFor(fEltPolyglotType); } + @Override public int getNumDimensions() { return 1; // always 1 for Java } + @Override public CAstType getElementType() { return fEltCAstType; } + @Override public String getName() { return "[" + fEltCAstType.getName(); } + @Override public Collection getSupertypes() { if (fEltPolyglotType.isPrimitive()) return Collections.singleton(getCAstTypeFor(fTypeSystem.Object())); @@ -81,6 +85,7 @@ public class PolyglotTypeDictionary extends CAstTypeDictionaryImpl { fTranslator = translator; } + @Override public CAstType getCAstTypeFor(Object astType) { CAstType type = super.getCAstTypeFor(astType); // Handle the case where we haven't seen an AST decl for some type before diff --git a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java index e154dfcea..00f942de5 100755 --- a/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java +++ b/com.ibm.wala.cast.java.polyglot/source/com/ibm/wala/cast/java/translator/polyglot/PolyglotUnwoundIRTranslatorExtension.java @@ -24,9 +24,11 @@ public class PolyglotUnwoundIRTranslatorExtension this.unrollDepth = unrollDepth; } + @Override public CAstRewriterFactory,AstLoopUnwinder.UnwindKey> getCAstRewriterFactory() { return new CAstRewriterFactory,AstLoopUnwinder.UnwindKey>() { - public AstLoopUnwinder createCAstRewriter(CAst ast) { + @Override + public AstLoopUnwinder createCAstRewriter(CAst ast) { return new AstLoopUnwinder(ast, true, unrollDepth); } }; diff --git a/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs b/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs index 92bf738bc..e1b29887d 100644 --- a/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs +++ b/com.ibm.wala.cast.java.test.data/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,10 @@ eclipse.preferences.version=1 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -11,18 +16,23 @@ org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=ignore org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning @@ -33,44 +43,67 @@ org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false diff --git a/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java b/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java index 33ce01281..8aeea4c1c 100644 --- a/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java +++ b/com.ibm.wala.cast.java.test.data/src/AnonymousClass.java @@ -19,8 +19,10 @@ public class AnonymousClass { Foo f= new Foo() { int value = 3; - public int getValue() { return value; } - public int getValueBase() { return value - base.intValue(); } + + public int getValue() { return value; } + + public int getValueBase() { return value - base.intValue(); } }; System.out.println(f.getValue()); @@ -35,19 +37,22 @@ public class AnonymousClass { abstract class FooImpl implements Foo { int y; - public abstract int getValue(); + + public abstract int getValue(); FooImpl(int _y) { y = _y; } - public int getValueBase() { + + public int getValueBase() { return y + getValue() - base.intValue(); } } Foo f= new FooImpl(-4) { - public int getValue() { return 7; } + + public int getValue() { return 7; } }; System.out.println(f.getValue()); diff --git a/com.ibm.wala.cast.java.test.data/src/FunkySupers.java b/com.ibm.wala.cast.java.test.data/src/FunkySupers.java index ff61a6417..17697e5f4 100644 --- a/com.ibm.wala.cast.java.test.data/src/FunkySupers.java +++ b/com.ibm.wala.cast.java.test.data/src/FunkySupers.java @@ -21,7 +21,8 @@ public class FunkySupers { } class SubFunkySupers extends FunkySupers { - int funky(FunkySupers fs) { + + int funky(FunkySupers fs) { SubFunkySupers.super.funky(fs); SubFunkySupers.this.funky(fs); SubFunkySupers.this.y = 7; diff --git a/com.ibm.wala.cast.java.test.data/src/Inheritance1.java b/com.ibm.wala.cast.java.test.data/src/Inheritance1.java index b36a90a97..af56df73e 100644 --- a/com.ibm.wala.cast.java.test.data/src/Inheritance1.java +++ b/com.ibm.wala.cast.java.test.data/src/Inheritance1.java @@ -29,9 +29,11 @@ class Base { } } class Derived extends Base { + public void foo() { super.foo(); } + public String bar(int x) { return Integer.toHexString(x); } diff --git a/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java b/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java index 287d8b391..28426514c 100644 --- a/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java +++ b/com.ibm.wala.cast.java.test.data/src/InnerClassLexicalReads.java @@ -31,7 +31,8 @@ public class InnerClassLexicalReads { * 0 v2:com.ibm.wala.ssa.SymbolTable$1@16b18b6 = lexical:y@LInnerClassLexicalReads/makeIntConstant(I)LIntConstant; * 1 return v2:com.ibm.wala.ssa.SymbolTable$1@16b18b6[11:4] -> [11:13] */ - public int getConstant() { + + public int getConstant() { return y; } }; diff --git a/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java b/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java index 59ab4f912..82c474622 100644 --- a/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java +++ b/com.ibm.wala.cast.java.test.data/src/InterfaceTest1.java @@ -25,6 +25,7 @@ class FooIT1 implements IFoo { public FooIT1(char ch) { fValue= ch; } + public char getValue() { return fValue; } diff --git a/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java b/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java index 2528e7cae..0e3c9301e 100644 --- a/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java +++ b/com.ibm.wala.cast.java.test.data/src/MiniaturSliceBug.java @@ -29,6 +29,7 @@ abstract class PrimitiveWrapper { * {@inheritDoc} * @see java.lang.Object#equals(java.lang.Object) */ + abstract public boolean equals(Object o); } @@ -47,6 +48,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#intValue() */ + public int intValue() { return val; } @@ -55,6 +57,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#setIntValue(int) */ + public void setIntValue(int i) { this.val = i; } @@ -63,6 +66,7 @@ final class IntWrapper extends PrimitiveWrapper { * {@inheritDoc} * @see com.ibm.miniatur.tests.sequential.PrimitiveWrapper#equals(java.lang.Object) */ + public boolean equals(Object o) { return o instanceof IntWrapper && ((IntWrapper)o).val==val; } diff --git a/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java b/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java index 1320f5522..7ea739d60 100644 --- a/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java +++ b/com.ibm.wala.cast.java.test.data/src/SimpleCalls.java @@ -13,7 +13,8 @@ interface ISimpleCalls { public void helloWorld(); } public class SimpleCalls implements ISimpleCalls { - public void helloWorld() { + + public void helloWorld() { System.out.println("hello world!"); } public int anotherCall() { diff --git a/com.ibm.wala.cast.java.test.data/src/Thread1.java b/com.ibm.wala.cast.java.test.data/src/Thread1.java index e7c54f474..d483dbb10 100644 --- a/com.ibm.wala.cast.java.test.data/src/Thread1.java +++ b/com.ibm.wala.cast.java.test.data/src/Thread1.java @@ -13,6 +13,7 @@ class R implements Runnable { R(int i) { this.i = i; } + public void run() { return; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java b/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java index 2648ef81a..b46c5b610 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/SimpleNames.java @@ -55,7 +55,8 @@ public class SimpleNames { final int i = 5; new Object() { - public int hashCode() { + + public int hashCode() { f = 5; // SimpleNames.this = 5 s = 6; // SimpleNames.s = 6 diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java index 169d8157d..91cfa92d3 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/ConstructorsAndInitializers.java @@ -76,7 +76,7 @@ public class ConstructorsAndInitializers extends Super { iX = 55 + 12; } - public String toString() { + public String toString() { return s + " -- from an anon class in " + iX + "," + sX + ": " + ConstructorsAndInitializers.this.s; } diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java index 55be101b4..935545d51 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/InnerClasses.java @@ -45,7 +45,7 @@ public class InnerClasses extends Temp { Object supportLocalBusiness() { final int x = 54; class FooBar { - public int hashCode() { return x; } + public int hashCode() { return x; } } return new FooBar(); } @@ -53,7 +53,7 @@ public class InnerClasses extends Temp { static Object anonymousCoward() { final int x = 5; return new Object() { - public int hashCode() { return x; } + public int hashCode() { return x; } }; } @@ -64,7 +64,7 @@ public class InnerClasses extends Temp { System.out.println(anonymousCoward().hashCode()); final String xx = "crazy"; Outie outie = new Outie("weird") { - public String toString() { + public String toString() { return "bogus" + x + xx + xxxx; } }; diff --git a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java index 961a7a66e..f558e850b 100644 --- a/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java +++ b/com.ibm.wala.cast.java.test.data/src/foo/bar/hello/world/MethodMadness.java @@ -95,7 +95,7 @@ public class MethodMadness { return 13 + x; } - protected int protectedInteger() { + protected int protectedInteger() { return 233 + x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java index 2395285ec..02cf96ea2 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonGeneNullarySimple.java @@ -44,7 +44,8 @@ public class AnonGeneNullarySimple { } static class StrTripler implements Ops { - public String nullary() { + + public String nullary() { String x = "talk about it "; return x+x+x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java index 1ab55e264..85ce14520 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/AnonymousGenerics.java @@ -48,10 +48,12 @@ public class AnonymousGenerics { // if has type parameters, find overriding method and // get erasures for all of those types and make a new method // that calls this one (with casts). no worries about return values. - public String unary(String x) { + + public String unary(String x) { return x + x + x; } - public String nullary() { + + public String nullary() { String x = "talk about it "; return x+x+x; } @@ -63,10 +65,12 @@ public class AnonymousGenerics { private void doit() { Ops strQuadrupler = new Ops() { - public String unary(String x) { + + public String unary(String x) { return x+x+x+x; } - public String nullary() { + + public String nullary() { String x = "time to make a move to the global economy "; return x+x+x+x; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java index d7b3ef5d0..a2b08f2fe 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/Cocovariant.java @@ -42,9 +42,11 @@ public class Cocovariant { A foo(String x) { return null; } } static class B extends A { + B foo(String x) { return null; } } static class C extends B { + C foo(String x) { return null; } } public static void main(String[] args) { diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java index 5b722006b..34f550a3a 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/CustomGenericsAndFields.java @@ -51,14 +51,16 @@ interface IGeneric { class ConcreteGeneric implements IGeneric { Q x; - public Q bar(Q a, Q b) { + + public Q bar(Q a, Q b) { x = a; if (b.hashCode() == a.hashCode() || b.toString().equals(a.toString())) return a; return b; } - public Q foo() { + + public Q foo() { return x; } } @@ -68,7 +70,8 @@ class ConcreteGeneric2 extends ConcreteGeneric { public void setFoo(Q a) { y = a; } - public Q foo() { + + public Q foo() { return y; } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java index 522dd137e..24b25d1d7 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/GenericMemberClasses.java @@ -45,16 +45,19 @@ public class GenericMemberClasses { T x = null; private int localChangeID; - public boolean hasNext() { + + public boolean hasNext() { return ( localChangeID == 5 ); } - public T next() { + + public T next() { localChangeID = 5; return x; } - public void remove() { + + public void remove() { } } public static void main(String args[]) { diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java index 40f70a9a1..1684cca24 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/MoreOverriddenGenerics.java @@ -47,13 +47,15 @@ public class MoreOverriddenGenerics { } class Sub extends Super { - public Number get() { + + public Number get() { return super.get(); } } class SubSub extends Sub { - public Long get() { + + public Long get() { return new Long(6); } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java index 8560f6473..7bf21ad1d 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/NotSoSimpleEnums.java @@ -39,10 +39,14 @@ package javaonepointfive; public class NotSoSimpleEnums { public enum Direction { - NORTH("nord") { public Direction getOpposite() { return SOUTH; }}, - EAST("est") { public Direction getOpposite() { return WEST; }}, - SOUTH("sud") { public Direction getOpposite() { return NORTH; }}, - WEST("ouest") { public Direction getOpposite() { return EAST; }}; + NORTH("nord") { + public Direction getOpposite() { return SOUTH; }}, + EAST("est") { + public Direction getOpposite() { return WEST; }}, + SOUTH("sud") { + public Direction getOpposite() { return NORTH; }}, + WEST("ouest") { + public Direction getOpposite() { return EAST; }}; public abstract Direction getOpposite(); diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java index 31a276436..0fede31c1 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/OverridesOnePointFour.java @@ -43,7 +43,8 @@ public class OverridesOnePointFour { } static class Sub implements Super { - public Long get() { + + public Long get() { return new Long(6); } } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java index d85780e6b..4f0c34905 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsCovariant.java @@ -46,7 +46,8 @@ public class VarargsCovariant { } static class B extends A { - B hello(int... x) { + + B hello(int... x) { System.out.println("b hello"); return this; } diff --git a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java index 93b1a0345..a112e79db 100644 --- a/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java +++ b/com.ibm.wala.cast.java.test.data/src/javaonepointfive/VarargsOverriding.java @@ -69,7 +69,8 @@ class VarityTestSuper { } class VarityTestSub extends VarityTestSuper { - void bar(String... args) {} + + void bar(String... args) {} } public class VarargsOverriding { diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java index acc86e89d..a991121a2 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JLexTest.java @@ -18,6 +18,7 @@ public abstract class JLexTest extends IRTests { super(null); } + @Override protected String singleJavaInputForTest() { return "JLex"; } @@ -26,6 +27,7 @@ public abstract class JLexTest extends IRTests { runTest(singleTestSrc(), rtJar, new String[] { "LJLex/Main" }, emptyList, false); } + @Override protected String singleJavaPkgInputForTest(String pkgName) { return ""; } diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java index 48a4f8596..281f41e9d 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java @@ -84,6 +84,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); @@ -115,6 +116,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = "IFoo"; @@ -132,6 +134,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = "FooIT1"; @@ -157,6 +160,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = "Derived"; @@ -186,6 +190,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#Array1#foo#()V", cg.getClassHierarchy()); @@ -215,6 +220,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#ArrayLiteral1#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); @@ -236,6 +242,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#ArrayLiteral2#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); @@ -297,6 +304,7 @@ public abstract class JavaIRTests extends IRTests { */ new IRAssertion() { + @Override public void check(CallGraph cg) { MethodReference mref = descriptorToMethodRef("Source#QualifiedStatic#main#([Ljava/lang/String;)V", cg.getClassHierarchy()); @@ -319,6 +327,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest() + "$WhatsIt"; @@ -349,6 +358,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); @@ -465,6 +475,7 @@ public abstract class JavaIRTests extends IRTests { * Classes local to method are enclosed in the class the methods belong * to. */ + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); final String localClassStr = "Foo"; @@ -501,6 +512,7 @@ public abstract class JavaIRTests extends IRTests { new IRAssertion() { + @Override public void check(CallGraph cg) { final String typeStr = singleInputForTest(); diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java index 24447a842..ed104b052 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/TestPlugin.java @@ -31,14 +31,16 @@ public class TestPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java index 3ea8ff0d7..6087c80aa 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/JavaSourcePlugin.java @@ -31,14 +31,16 @@ public class JavaSourcePlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java index 12114eb4b..b9d111b53 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/analysis/typeInference/AstJavaTypeInference.java @@ -36,6 +36,7 @@ public class AstJavaTypeInference extends AstTypeInference { protected IClass stringClass; protected class AstJavaTypeOperatorFactory extends AstTypeOperatorFactory implements AstJavaInstructionVisitor { + @Override public void visitBinaryOp(SSABinaryOpInstruction instruction) { if (doPrimitives) { IBinaryOpInstruction.IOperator op = instruction.getOperator(); @@ -48,6 +49,7 @@ public class AstJavaTypeInference extends AstTypeInference { } } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { TypeReference type = inst.getEnclosingType(); IClass klass = cha.lookupClass(type); @@ -58,6 +60,7 @@ public class AstJavaTypeInference extends AstTypeInference { } } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { TypeReference type = instruction.getDeclaredResultType(); if (type.isReferenceType()) { @@ -81,6 +84,7 @@ public class AstJavaTypeInference extends AstTypeInference { public class AstJavaTypeVarFactory extends TypeVarFactory { + @Override public IVariable makeVariable(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { @@ -105,10 +109,12 @@ public class AstJavaTypeInference extends AstTypeInference { return stringClass; } + @Override protected void initialize() { init(ir, new AstJavaTypeVarFactory(), new AstJavaTypeOperatorFactory()); } + @Override public TypeAbstraction getConstantPrimitiveType(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isBooleanConstant(valueNumber)) { @@ -123,6 +129,7 @@ public class AstJavaTypeInference extends AstTypeInference { private PrimAndStringOp() { } + @Override public byte evaluate(TypeVariable lhs, TypeVariable[] rhs) { TypeAbstraction meet = null; @@ -164,6 +171,7 @@ public class AstJavaTypeInference extends AstTypeInference { * * @see com.ibm.wala.dataflow.Operator#hashCode() */ + @Override public int hashCode() { return 71292; } @@ -173,6 +181,7 @@ public class AstJavaTypeInference extends AstTypeInference { * * @see com.ibm.wala.dataflow.Operator#equals(java.lang.Object) */ + @Override public boolean equals(Object o) { return o != null && o.getClass().equals(getClass()); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java index 3e89a8f60..6c9b3637a 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/client/JavaSourceAnalysisEngine.java @@ -86,6 +86,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { systemEntries.add(M); } + @Override protected void addApplicationModulesToScope() { ClassLoaderReference app = scope.getApplicationLoader(); for (Module M : userEntries) { @@ -99,6 +100,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { } } + @Override public void buildAnalysisScope() throws IOException { scope = makeSourceAnalysisScope(); @@ -120,6 +122,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { protected abstract ClassLoaderFactory getClassLoaderFactory(SetOfClasses exclusions); + @Override public IClassHierarchy buildClassHierarchy() { IClassHierarchy cha = null; ClassLoaderFactory factory = getClassLoaderFactory(scope.getExclusions()); @@ -134,6 +137,7 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { return cha; } + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return Util.makeMainEntrypoints(JavaSourceAnalysisScope.SOURCE, cha); } @@ -143,11 +147,13 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine { return new AnalysisCache(AstIRFactory.makeDefaultFactory()); } + @Override public AnalysisOptions getDefaultOptions(Iterable entrypoints) { AnalysisOptions options = new AnalysisOptions(getScope(), entrypoints); SSAOptions ssaOptions = new SSAOptions(); ssaOptions.setDefaultValues(new SSAOptions.DefaultValues() { + @Override public int getDefaultValue(SymbolTable symtab, int valueNumber) { return symtab.getDefaultValue(valueNumber); } 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 2b716c715..c5d6bc663 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 @@ -61,19 +61,23 @@ public class SynchronizedBlockDuplicator extends this.testDirection = testDirection; } + @Override public int hashCode() { return (testDirection ? 1 : -1) * System.identityHashCode(syncNode) * (rest == null ? 1 : rest.hashCode()); } + @Override public UnwindKey parent() { return rest; } + @Override public boolean equals(Object o) { return (o instanceof UnwindKey) && ((UnwindKey) o).testDirection == testDirection && ((UnwindKey) o).syncNode == syncNode && (rest == null ? ((UnwindKey) o).rest == null : rest.equals(((UnwindKey) o).rest)); } + @Override public String toString() { return "#" + testDirection + ((rest == null) ? "" : rest.toString()); } @@ -101,6 +105,7 @@ public class SynchronizedBlockDuplicator extends */ private static class RootContext implements RewriteContext { + @Override public UnwindKey key() { return null; } @@ -131,6 +136,7 @@ public class SynchronizedBlockDuplicator extends this.parent = parent; } + @Override public UnwindKey key() { return new UnwindKey(testDirection, syncNode, parent.key()); } @@ -150,6 +156,7 @@ public class SynchronizedBlockDuplicator extends } } + @Override protected CAstNode flowOutTo(Map nodeMap, CAstNode oldSource, Object label, CAstNode oldTarget, CAstControlFlowMap orig, CAstSourcePositionMap src) { assert oldTarget == CAstControlFlowMap.EXCEPTION_TO_EXIT; @@ -196,6 +203,7 @@ public class SynchronizedBlockDuplicator extends return null; } + @Override protected CAstNode copyNodes(CAstNode n, final CAstControlFlowMap cfg, RewriteContext c, Map, CAstNode> nodeMap) { String varName; // don't copy operators or constants (presumably since they are immutable?) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java index 30beb2b12..73c46148b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/AstJavaSSAPropagationCallGraphBuilder.java @@ -51,6 +51,7 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall // // /////////////////////////////////////////////////////////////////////////// + @Override protected boolean useObjectCatalog() { return false; } @@ -69,10 +70,12 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall this.outer = outer; } + @Override public int hashCode() { return getInstanceKey().hashCode() * outer.hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof EnclosingObjectReferenceKey) && ((EnclosingObjectReferenceKey) o).outer.equals(outer) && ((EnclosingObjectReferenceKey) o).getInstanceKey().equals(getInstanceKey()); @@ -109,15 +112,18 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall super(vn); } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { Assertions.UNREACHABLE(); } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { bingo = true; } } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new AstJavaInterestingVisitor(vn); } @@ -166,10 +172,12 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall } else { system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { IntSetVariable tv = (IntSetVariable) rhs; if (tv.getValue() != null) { tv.getValue().foreach(new IntSetAction() { + @Override public void act(int ptr) { InstanceKey iKey = system.getInstanceKey(ptr); PointerKey enclosing = new EnclosingObjectReferenceKey(iKey, cls); @@ -180,14 +188,17 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "enclosing objects of " + objKey; } @@ -195,6 +206,7 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall } } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { PointerKey lvalKey = getPointerKeyForLocal(inst.getDef()); PointerKey objKey = getPointerKeyForLocal(1); @@ -202,6 +214,7 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall handleEnclosingObject(lvalKey, cls, objKey); } + @Override public void visitNew(SSANewInstruction instruction) { super.visitNew(instruction); InstanceKey iKey = getInstanceKeyForAllocation(instruction.getNewSite()); @@ -272,11 +285,13 @@ public class AstJavaSSAPropagationCallGraphBuilder extends AstSSAPropagationCall } } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { visitInvokeInternal(instruction, new DefaultInvariantComputer()); } } + @Override protected ConstraintVisitor makeVisitor(CGNode node) { return new AstJavaConstraintVisitor(this, node); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java index e3ced01c7..89aae96b1 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaScopeMappingInstanceKeys.java @@ -72,6 +72,7 @@ public class JavaScopeMappingInstanceKeys extends ScopeMappingInstanceKeys { return cls instanceof JavaClass; } + @Override protected boolean needsScopeMappingKey(InstanceKey base) { boolean result = getParents(base).length > 0; if (AstTranslator.DEBUG_LEXICAL) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java index 51c519ac5..5d0c405ab 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/callgraph/JavaSourceAnalysisScope.java @@ -49,6 +49,7 @@ public class JavaSourceAnalysisScope extends AnalysisScope { return SOURCE; } + @Override public void addToScope(ClassLoaderReference loader, Module m) { if (m instanceof SourceDirectoryTreeModule && loader.equals(ClassLoaderReference.Application)) { super.addToScope(SOURCE, m); diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java index 6b60b34dc..c40954bf7 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/modref/AstJavaModRef.java @@ -32,16 +32,19 @@ public class AstJavaModRef extends AstModRef { super(n, result, pa, h); } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { } } + @Override protected RefVisitor makeRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { return new AstJavaRefVisitor(n, result, pa, h); } @@ -56,10 +59,12 @@ public class AstJavaModRef extends AstModRef { } + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java index 993ad558b..8bb064124 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ipa/slicer/AstJavaSlicer.java @@ -77,6 +77,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherAssertions(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return o instanceof AstAssertInstruction; } @@ -85,6 +86,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherMonitors(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return o instanceof SSAMonitorInstruction; } @@ -93,6 +95,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherWrites(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return (o instanceof SSAPutInstruction) || (o instanceof SSAArrayStoreInstruction); } @@ -101,6 +104,7 @@ public class AstJavaSlicer extends Slicer { public static Set gatherReads(CallGraph CG, Collection partialRoots) { return gatherStatements(CG, partialRoots, new Filter() { + @Override public boolean accepts(SSAInstruction o) { return (o instanceof SSAGetInstruction) || (o instanceof SSAArrayLoadInstruction); } 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 9684f85fd..cfd0a461d 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 @@ -108,14 +108,17 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { this.annotations = annotations; } + @Override public Collection getAnnotations() { return annotations; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public IClass getSuperclass() { boolean excludedSupertype=false; for (Iterator iter = superTypeNames.iterator(); iter.hasNext();) { @@ -143,6 +146,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return null; } + @Override public Collection getDirectInterfaces() { List result = new ArrayList(); for (Iterator iter = superTypeNames.iterator(); iter.hasNext();) { @@ -177,6 +181,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return enclosingClass; } + @Override public String toString() { StringBuffer sb = new StringBuffer(""; } @@ -324,20 +332,24 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { super(methodEntity, owner); } + @Override public String getLocalVariableName(int bcIndex, int localNumber) { Assertions.UNREACHABLE("AbstractJavaMethod.getLocalVariableName() called"); return null; } + @Override public boolean hasLocalVariableTable() { Assertions.UNREACHABLE("AbstractJavaMethod.hasLocalVariableTable() called"); return false; } + @Override public LexicalParent[] getParents() { return new LexicalParent[0]; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -355,18 +367,22 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { super(methodEntity, owner, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String getLocalVariableName(int bcIndex, int localNumber) { return null; } + @Override public boolean hasLocalVariableTable() { return false; } + @Override public LexicalParent[] getParents() { if (AstTranslator.DEBUG_LEXICAL) { System.err.println(("resolving parents of " + this)); @@ -409,10 +425,12 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { final int hack = i; result[i] = new LexicalParent() { + @Override public String getName() { return parents[hack]; } + @Override public AstMethod getMethod() { return (AstMethod) cls.getMethod(sel); } @@ -467,12 +485,14 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return cha; } + @Override protected void loadAllSources(Set modules) { getTranslator().loadAllSources(modules); } protected abstract SourceModuleTranslator getTranslator(); + @Override public void init(List modules) throws IOException { super.init(modules); fTypeMap = null; @@ -513,97 +533,120 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { return javaClass; } + @Override public String toString() { return "Java Source Loader (classes " + loadedClasses.values() + ")"; } public static class InstructionFactory extends JavaInstructionFactory implements AstJavaInstructionFactory { + @Override public com.ibm.wala.cast.java.ssa.EnclosingObjectReference EnclosingObjectReference(int lval, TypeReference type) { return new EnclosingObjectReference(lval, type); } + @Override public AstJavaNewEnclosingInstruction JavaNewEnclosingInstruction(int result, NewSiteReference site, int enclosing) { return new AstJavaNewEnclosingInstruction(result, site, enclosing); } + @Override public AstJavaInvokeInstruction JavaInvokeInstruction(int result, int[] params, int exception, CallSiteReference site) { return new AstJavaInvokeInstruction(result, params, exception, site); } + @Override public AstJavaInvokeInstruction JavaInvokeInstruction(int[] params, int exception, CallSiteReference site) { return new AstJavaInvokeInstruction(params, exception, site); } + @Override public AstJavaInvokeInstruction JavaInvokeInstruction(int[] results, int[] params, int exception, CallSiteReference site, Access[] lexicalReads, Access[] lexicalWrites) { return new AstJavaInvokeInstruction(results, params, exception, site, lexicalReads, lexicalWrites); } + @Override public AstAssertInstruction AssertInstruction(int value, boolean fromSpecification) { return new AstAssertInstruction(value, fromSpecification); } + @Override public com.ibm.wala.cast.ir.ssa.AssignInstruction AssignInstruction(int result, int val) { return new AssignInstruction(result, val); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementGetInstruction EachElementGetInstruction(int value, int objectRef) { throw new UnsupportedOperationException(); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction EachElementHasNextInstruction(int value, int objectRef) { throw new UnsupportedOperationException(); } + @Override public AstEchoInstruction EchoInstruction(int[] rvals) { throw new UnsupportedOperationException(); } + @Override public AstGlobalRead GlobalRead(int lhs, FieldReference global) { throw new UnsupportedOperationException(); } + @Override public AstGlobalWrite GlobalWrite(FieldReference global, int rhs) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal, FieldReference fieldRef) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, FieldReference fieldRef) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal) { throw new UnsupportedOperationException(); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval) { throw new UnsupportedOperationException(); } + @Override public AstLexicalRead LexicalRead(Access[] accesses) { return new AstLexicalRead(accesses); } + @Override public AstLexicalRead LexicalRead(Access access) { return new AstLexicalRead(access); } + @Override public AstLexicalRead LexicalRead(int lhs, String definer, String globalName) { return new AstLexicalRead(lhs, definer, globalName); } + @Override public AstLexicalWrite LexicalWrite(Access[] accesses) { return new AstLexicalWrite(accesses); } + @Override public AstLexicalWrite LexicalWrite(Access access) { return new AstLexicalWrite(access); } + @Override public AstLexicalWrite LexicalWrite(String definer, String globalName, int rhs) { return new AstLexicalWrite(definer, globalName, rhs); } @@ -615,6 +658,7 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { private static final InstructionFactory insts = new InstructionFactory(); + @Override public InstructionFactory getInstructionFactory() { return insts; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java index 78d4a8aad..22db21621 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaAbstractInstructionVisitor.java @@ -17,10 +17,12 @@ public class AstJavaAbstractInstructionVisitor implements AstJavaInstructionVisitor { + @Override public void visitJavaInvoke(AstJavaInvokeInstruction instruction) { } + @Override public void visitEnclosingObjectReference(EnclosingObjectReference inst) { } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java index d8a7fea7c..df128d6c9 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaInvokeInstruction.java @@ -51,6 +51,7 @@ public class AstJavaInvokeInstruction extends FixedParametersLexicalInvokeInstru super(results, params, exception, site, lexicalReads, lexicalWrites); } + @Override protected SSAInstruction copyInstruction(SSAInstructionFactory insts, int results[], int[] params, int exception, Access[] lexicalReads, Access[] lexicalWrites) { return ((AstJavaInstructionFactory) insts).JavaInvokeInstruction(results, params, exception, getCallSite(), lexicalReads, @@ -60,6 +61,7 @@ public class AstJavaInvokeInstruction extends FixedParametersLexicalInvokeInstru /** * @see com.ibm.domo.ssa.SSAInstruction#visit(IVisitor) */ + @Override public void visit(IVisitor v) { ((AstJavaInstructionVisitor) v).visitJavaInvoke(this); } @@ -69,6 +71,7 @@ public class AstJavaInvokeInstruction extends FixedParametersLexicalInvokeInstru * * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return JavaLanguage.getNullPointerException(); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java index 6584e38f0..e741ecf35 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/AstJavaNewEnclosingInstruction.java @@ -24,10 +24,12 @@ public class AstJavaNewEnclosingInstruction extends SSANewInstruction { int enclosing; + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return enclosing; @@ -42,14 +44,17 @@ public class AstJavaNewEnclosingInstruction extends SSANewInstruction { return this.enclosing; } + @Override public String toString() { return super.toString() + " ENCLOSING v" + enclosing; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstJavaInstructionFactory)insts).JavaNewEnclosingInstruction(defs==null? getDef(0): defs[0], getNewSite(), uses==null? enclosing: uses[0]); } + @Override public Collection getExceptionTypes() { return JavaLanguage.getNewScalarExceptions(); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java index c0352d815..c4feba6a1 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/ssa/EnclosingObjectReference.java @@ -35,20 +35,24 @@ public class EnclosingObjectReference extends SSAInstruction { this.type = type; } + @Override public boolean hasDef() { return true; } + @Override public int getDef() { return lval; } + @Override public int getDef(int i) { assert i == 0; return lval; } + @Override public int getNumberOfDefs() { return 1; } @@ -57,26 +61,32 @@ public class EnclosingObjectReference extends SSAInstruction { return type; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstJavaInstructionFactory) insts).EnclosingObjectReference(defs == null ? lval : defs[0], type); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, lval) + " = enclosing " + type.getName(); } + @Override public void visit(IVisitor v) { ((AstJavaInstructionVisitor) v).visitEnclosingObjectReference(this); } + @Override public int hashCode() { return lval * type.hashCode(); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } + @Override public boolean isFallThrough() { return true; } 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 26c30d542..b6c8dddaa 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 @@ -64,6 +64,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { return (JavaSourceLoaderImpl) loader; } + @Override protected boolean useDefaultInitValues() { return true; } @@ -71,35 +72,42 @@ public class JavaCAst2IRTranslator extends AstTranslator { // Java does not have standalone global variables, and let's not // adopt the nasty JavaScript practice of creating globals without // explicit definitions + @Override protected boolean hasImplicitGlobals() { return false; } + @Override protected TypeReference defaultCatchType() { return TypeReference.JavaLangThrowable; } + @Override protected TypeReference makeType(CAstType type) { return TypeReference.findOrCreate(loader.getReference(), TypeName.string2TypeName(type.getName())); } // Java globals are disguised as fields (statics), so we should never // ask this question when parsing Java code + @Override protected boolean treatGlobalsAsLexicallyScoped() { Assertions.UNREACHABLE(); return false; } + @Override protected void doThrow(WalkContext context, int exception) { context.cfg().addInstruction(insts.ThrowInstruction(exception)); } + @Override public void doArrayRead(WalkContext context, int result, int arrayValue, CAstNode arrayRefNode, int[] dimValues) { TypeReference arrayTypeRef = (TypeReference) arrayRefNode.getChild(1).getValue(); context.cfg().addInstruction(insts.ArrayLoadInstruction(result, arrayValue, dimValues[0], arrayTypeRef)); processExceptions(arrayRefNode, context); } + @Override public void doArrayWrite(WalkContext context, int arrayValue, CAstNode arrayRefNode, int[] dimValues, int rval) { TypeReference arrayTypeRef = arrayRefNode.getKind() == CAstNode.ARRAY_LITERAL ? ((TypeReference) arrayRefNode.getChild(0) .getChild(0).getValue()).getArrayElementType() : (TypeReference) arrayRefNode.getChild(1).getValue(); @@ -109,6 +117,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { processExceptions(arrayRefNode, context); } + @Override protected void doFieldRead(WalkContext context, int result, int receiver, CAstNode elt, CAstNode parent) { // elt is a constant CAstNode whose value is a FieldReference. FieldReference fieldRef = (FieldReference) elt.getValue(); @@ -122,6 +131,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected void doFieldWrite(WalkContext context, int receiver, CAstNode elt, CAstNode parent, int rval) { FieldReference fieldRef = (FieldReference) elt.getValue(); @@ -134,11 +144,13 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected void doMaterializeFunction(CAstNode n, WalkContext context, int result, int exception, CAstEntity fn) { // Not possible in Java (no free-standing functions) Assertions.UNREACHABLE("Real functions in Java??? I don't think so!"); } + @Override protected void doNewObject(WalkContext context, CAstNode newNode, int result, Object type, int[] arguments) { TypeReference typeRef = (TypeReference) type; @@ -169,6 +181,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected void doCall(WalkContext context, CAstNode call, int result, int exception, CAstNode name, int receiver, int[] arguments) { assert name.getKind() == CAstNode.CONSTANT; CallSiteReference dummySiteRef = (CallSiteReference) name.getValue(); @@ -193,10 +206,12 @@ public class JavaCAst2IRTranslator extends AstTranslator { Assertions.UNREACHABLE("doGlobalRead() called for Java code???"); } + @Override protected void doGlobalWrite(WalkContext context, String name, int rval) { Assertions.UNREACHABLE("doGlobalWrite() called for Java code???"); } + @Override protected void defineField(CAstEntity topEntity, WalkContext definingContext, CAstEntity n) { assert topEntity.getKind() == CAstEntity.TYPE_ENTITY; assert n.getKind() == CAstEntity.FIELD_ENTITY; @@ -214,6 +229,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { // handles abstract method declarations, which do not get defineFunction // called for them + @Override protected void declareFunction(CAstEntity N, WalkContext definingContext) { CAstType.Method methodType = (Method) N.getType(); CAstType owningType = methodType.getDeclaringType(); @@ -226,6 +242,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { ((JavaSourceLoaderImpl) loader).defineAbstractFunction(N, owner); } + @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { @@ -247,11 +264,13 @@ public class JavaCAst2IRTranslator extends AstTranslator { debugInfo); } + @Override protected void doPrimitive(int resultVal, WalkContext context, CAstNode primitiveCall) { // For now, no-op (no primitives in normal Java code) Assertions.UNREACHABLE("doPrimitive() called for Java code???"); } + @Override protected String composeEntityName(WalkContext parent, CAstEntity f) { switch (f.getKind()) { case CAstEntity.TYPE_ENTITY: { @@ -295,6 +314,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected boolean defineType(CAstEntity type, WalkContext wc) { CAstEntity parentType = getEnclosingType(type); // ((JavaSourceLoaderImpl)loader).defineType(type, @@ -302,6 +322,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { return ((JavaSourceLoaderImpl) loader).defineType(type, type.getType().getName(), parentType) != null; } + @Override protected void leaveThis(CAstNode n, WalkContext c, CAstVisitor visitor) { if (n.getChildCount() == 0) { super.leaveThis(n, c, visitor); @@ -312,12 +333,14 @@ public class JavaCAst2IRTranslator extends AstTranslator { } } + @Override protected boolean visitCast(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.currentScope().allocateTempValue(); context.setValue(n, result); return false; } + @Override protected void leaveCast(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.getValue(n); CAstType toType = (CAstType) n.getChild(0).getValue(); @@ -347,12 +370,14 @@ processExceptions(n, context); } } + @Override protected boolean visitInstanceOf(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.currentScope().allocateTempValue(); context.setValue(n, result); return false; } + @Override protected void leaveInstanceOf(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = context.getValue(n); CAstType type = (CAstType) n.getChild(0).getValue(); @@ -365,6 +390,7 @@ processExceptions(n, context); ref)); } + @Override protected boolean doVisit(CAstNode n, WalkContext wc, CAstVisitor visitor) { if (n.getKind() == CAstNode.MONITOR_ENTER) { visitor.visit(n.getChild(0), wc, visitor); diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java index 8cd51be5a..2b098003b 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaProcedureEntity.java @@ -14,6 +14,7 @@ import com.ibm.wala.cast.tree.CAstEntity; public interface JavaProcedureEntity extends CAstEntity { + @Override public String getSignature(); } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java index 37a4ecc2e..6f58b85ef 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaPrimitiveTypeMap.java @@ -33,6 +33,7 @@ public class JavaPrimitiveTypeMap { fShortName = shortName; } + @Override public String getName() { return fShortName; } @@ -41,6 +42,7 @@ public class JavaPrimitiveTypeMap { return fLongName; } + @Override public Collection getSupertypes() { return Collections.EMPTY_LIST; } diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java index f29341b6d..0eb72eafd 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/types/JavaType.java @@ -16,5 +16,6 @@ package com.ibm.wala.cast.java.types; import com.ibm.wala.cast.tree.CAstType; public interface JavaType extends CAstType.Class { + @Override boolean isInterface(); } diff --git a/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java b/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java index 2a5aef99f..ee5ab89fa 100644 --- a/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java +++ b/com.ibm.wala.cast.js.html.nu_validator/src/com/ibm/wala/cast/js/html/nu_validator/NuValidatorHtmlParser.java @@ -40,6 +40,7 @@ import com.ibm.wala.util.collections.Pair; public class NuValidatorHtmlParser implements IHtmlParser { + @Override public void parse(final URL url, final InputStream reader, final IHtmlCallback handler, final String fileName) { URL xx = null; try { @@ -65,18 +66,22 @@ public class NuValidatorHtmlParser implements IHtmlParser { return r.getLineNumber(); } + @Override public void setDocumentLocator(Locator locator) { this.locator = locator; } + @Override public void startElement(String uri, final String localName, String qName, final Attributes atts) throws SAXException { final Position line = new LineNumberPosition(url, localFileName, locator.getLineNumber()); tags.push(new ITag() { + @Override public String getName() { return localName; } + @Override public Pair getAttributeByName(String name) { if (atts.getValue(name) != null) { return Pair.make(atts.getValue(name), line); @@ -85,6 +90,7 @@ public class NuValidatorHtmlParser implements IHtmlParser { } } + @Override public Map> getAllAttributes() { return new AbstractMap>() { private Set>> es = null; @@ -97,10 +103,12 @@ public class NuValidatorHtmlParser implements IHtmlParser { final int index = i; es.add(new Map.Entry>() { + @Override public String getKey() { return atts.getLocalName(index).toLowerCase(); } + @Override public Pair getValue() { if (atts.getValue(index) != null) { return Pair.make(atts.getValue(index), line); @@ -109,6 +117,7 @@ public class NuValidatorHtmlParser implements IHtmlParser { } } + @Override public Pair setValue(Pair value) { throw new UnsupportedOperationException(); } @@ -120,10 +129,12 @@ public class NuValidatorHtmlParser implements IHtmlParser { }; } + @Override public Position getElementPosition() { return line; } + @Override public Position getContentPosition() { return line; } @@ -132,38 +143,47 @@ public class NuValidatorHtmlParser implements IHtmlParser { handler.handleStartTag(tags.peek()); } + @Override public void endElement(String uri, String localName, String qName) throws SAXException { handler.handleEndTag(tags.pop()); } + @Override public void characters(char[] ch, int start, int length) throws SAXException { handler.handleText(new LineNumberPosition(url, localFileName, locator.getLineNumber() - countLines(ch, start, length)), new String(ch, start, length)); } + @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { handler.handleText(new LineNumberPosition(url, localFileName, locator.getLineNumber()), new String(ch, start, length)); } + @Override public void startDocument() throws SAXException { // do nothing } + @Override public void endDocument() throws SAXException { // do nothing } + @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // do nothing } + @Override public void endPrefixMapping(String prefix) throws SAXException { // do nothing } + @Override public void processingInstruction(String target, String data) throws SAXException { // do nothing } + @Override public void skippedEntity(String name) throws SAXException { // do nothing } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java index 0e52c9ccf..37ce27f09 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestAjaxsltCallGraphShapeRhino.java @@ -20,6 +20,7 @@ public class TestAjaxsltCallGraphShapeRhino extends TestAjaxsltCallGraphShape { justThisTest(TestAjaxsltCallGraphShapeRhino.class); } + @Override @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java index 33c698e5f..88078e56e 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestArgumentSensitivityRhino.java @@ -17,7 +17,8 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; public class TestArgumentSensitivityRhino extends TestArgumentSensitivity { - @Before + @Override + @Before public void setUp() { JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java index 3f6d96c3a..438b13fde 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtractionRhino.java @@ -22,11 +22,13 @@ import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.classLoader.SourceModule; public class TestCorrelatedPairExtractionRhino extends TestCorrelatedPairExtraction { - protected CorrelationFinder makeCorrelationFinder() { + @Override + protected CorrelationFinder makeCorrelationFinder() { return new CorrelationFinder(new CAstRhinoTranslatorFactory()); } - protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { + @Override + protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); CAstEntity entity = null; try { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java index 1726083d3..56075fdb7 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtractionRhino.java @@ -20,7 +20,8 @@ import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.classLoader.SourceModule; public class TestForInBodyExtractionRhino extends TestForInBodyExtraction { - protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { + @Override + protected CAstEntity parseJS(CAstImpl ast, SourceModule module) throws IOException { RhinoToAstTranslator translator = new RhinoToAstTranslator(ast, module, module.getName(), false); CAstEntity entity = null; try { diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java index 89a6146d0..e311a0268 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestForInLoopHackRhino.java @@ -16,7 +16,8 @@ import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; public class TestForInLoopHackRhino extends TestForInLoopHack { - @Before + @Override + @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java index ff84f65ad..6234ee49e 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestJQueryExamplesRhino.java @@ -21,7 +21,8 @@ public class TestJQueryExamplesRhino extends TestJQueryExamples { justThisTest(TestJQueryExamplesRhino.class); } - @Before + @Override + @Before public void setUp() { JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); } diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java index fb9d14596..c6037220a 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestMediawikiCallGraphShapeRhino.java @@ -20,6 +20,7 @@ public class TestMediawikiCallGraphShapeRhino extends TestMediawikiCallGraphShap justThisTest(TestMediawikiCallGraphShapeRhino.class); } + @Override @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java index 2db00dfc1..2d5c95eef 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestRhinoSourceMap.java @@ -16,7 +16,6 @@ import static com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFa import static com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.makeScriptScope; import java.io.IOException; -import java.net.URL; import java.util.Map; import junit.framework.Assert; diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java index 323fa5eb8..9d55622c8 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShapeRhino.java @@ -29,6 +29,7 @@ public class TestSimpleCallGraphShapeRhino extends TestSimpleCallGraphShape { justThisTest(TestSimpleCallGraphShapeRhino.class); } + @Override @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); diff --git a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java index 147d55b91..ed9f0917c 100644 --- a/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java +++ b/com.ibm.wala.cast.js.rhino.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShapeRhino.java @@ -52,13 +52,16 @@ public abstract class TestSimplePageCallGraphShapeRhino extends TestSimplePageCa justThisTest(TestSimplePageCallGraphShapeRhino.class); } - protected abstract IHtmlParser getParser(); + @Override + protected abstract IHtmlParser getParser(); - @Before + @Override + @Before public void setUp() { com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); WebUtil.setFactory(new IHtmlParserFactory() { - public IHtmlParser getParser() { + @Override + public IHtmlParser getParser() { return TestSimplePageCallGraphShapeRhino.this.getParser(); } }); diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index 41ccd7f97..42121f797 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -3,6 +3,6 @@ - + diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index c0fa3d389..35ce3fb27 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -36,4 +36,4 @@ Export-Package: com.ibm.wala.cast.js.translator, org.mozilla.javascript.xml.impl.xmlbeans, org.mozilla.javascript.xmlimpl Bundle-ClassPath: ., - lib/rhino-1.7R3.jar + lib/js.jar diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index 2986328a0..49aa09ae1 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,5 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/rhino-1.7R3.jar + lib/js.jar jars.extra.classpath = lib/rhino-1.7R3.jar diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java index 7bdb5294f..30cf60b93 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslator.java @@ -15,7 +15,6 @@ import java.util.LinkedList; import java.util.List; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; -import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; @@ -34,6 +33,7 @@ public class CAstRhinoTranslator implements TranslatorToCAst { this.replicateForDoLoops = replicateForDoLoops; } + @Override public , K extends CopyKey> void addRewriter(CAstRewriterFactory factory, boolean prepend) { if(prepend) rewriters.add(0, factory); @@ -41,6 +41,7 @@ public class CAstRhinoTranslator implements TranslatorToCAst { rewriters.add(factory); } + @Override public CAstEntity translateToCAst() throws IOException, Error { String N; if (M instanceof SourceFileModule) { diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java index 57795bb14..9af82b065 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/CAstRhinoTranslatorFactory.java @@ -16,7 +16,8 @@ import com.ibm.wala.classLoader.SourceModule; public class CAstRhinoTranslatorFactory implements JavaScriptTranslatorFactory { - public TranslatorToCAst make(CAst ast, SourceModule M) { + @Override + public TranslatorToCAst make(CAst ast, SourceModule M) { return new CAstRhinoTranslator(M, false); } } 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 e7026392a..af41d49c9 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 @@ -415,35 +415,43 @@ public class RhinoToAstTranslator { return ""; } + @Override public String getName() { return name; } + @Override public String getSignature() { Assertions.UNREACHABLE(); return null; } + @Override public int getKind() { return kind; } + @Override public String[] getArgumentNames() { return arguments; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return arguments.length; } + @Override public Map> getAllScopedEntities() { return Collections.unmodifiableMap(subs); } + @Override public Iterator getScopedEntities(CAstNode construct) { if (subs.containsKey(construct)) return subs.get(construct).iterator(); @@ -451,35 +459,43 @@ public class RhinoToAstTranslator { return EmptyIterator.instance(); } + @Override public CAstNode getAST() { return ast; } + @Override public CAstControlFlowMap getControlFlow() { return map; } + @Override public CAstSourcePositionMap getSourceMap() { return pos; } + @Override public CAstSourcePositionMap.Position getPosition() { return entityPosition; } + @Override public CAstNodeTypeMap getNodeTypeMap() { return null; } + @Override public Collection getAnnotations() { return null; } + @Override public Collection getQualifiers() { Assertions.UNREACHABLE("JuliansUnnamedCAstEntity$2.getQualifiers()"); return null; } + @Override public CAstType getType() { Assertions.UNREACHABLE("JuliansUnnamedCAstEntity$2.getType()"); return null; @@ -2263,6 +2279,7 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { class CAstErrorReporter implements ErrorReporter { private Warning w = null; + @Override public void error(final String arg0, final String arg1, final int arg2, final String arg3, int arg4) { w = new Warning(Warning.SEVERE) { @Override @@ -2272,11 +2289,13 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { }; } + @Override public EvaluatorException runtimeError(String arg0, String arg1, int arg2, String arg3, int arg4) { error(arg0, arg1, arg2, arg3, arg4); return null; } + @Override public void warning(String arg0, String arg1, int arg2, String arg3, int arg4) { // ignore warnings } diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java index 37f078a23..b6ccfccb2 100644 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/js/rhino/Activator.java @@ -34,7 +34,8 @@ public class Activator extends Plugin { * (non-Javadoc) * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -43,7 +44,8 @@ public class Activator extends Plugin { * (non-Javadoc) * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java index d20389728..349b43a77 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/CAstDumper.java @@ -100,7 +100,8 @@ public class CAstDumper { m.put(scopedEntity, e.getKey()); } Collections.sort(scopedEntities, new Comparator() { - public int compare(CAstEntity o1, CAstEntity o2) { + @Override + public int compare(CAstEntity o1, CAstEntity o2) { return o1.getName().compareTo(o2.getName()); } }); diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java index eeff153e5..c119e4768 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/JSCallGraphBuilderUtil.java @@ -84,6 +84,9 @@ public class JSCallGraphBuilderUtil extends com.ibm.wala.cast.js.ipa.callgraph.J } } + /** + * create a CG builder for script. Note that the script at dir/name is loaded via the classloader, not from the filesystem. + */ public static JSCFABuilder makeScriptCGBuilder(String dir, String name, CGBuilderType builderType) throws IOException, WalaException { URL script = getURLforFile(dir, name); CAstRewriterFactory preprocessor = builderType.extractCorrelatedPairs ? new CorrelatedPairExtractorFactory(translatorFactory, script) : null; diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtraction.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtraction.java index 32daf6ad1..ce0073179 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtraction.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestCorrelatedPairExtraction.java @@ -89,7 +89,7 @@ public abstract class TestCorrelatedPairExtraction { protected CAstEntity parseJS(File tmp, CAstImpl ast) throws IOException { String moduleName = tmp.getName(); - SourceFileModule module = new SourceFileModule(tmp, moduleName); + SourceFileModule module = new SourceFileModule(tmp, moduleName, null); return parseJS(ast, module); } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtraction.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtraction.java index 68d94c936..b390560a4 100644 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtraction.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestForInBodyExtraction.java @@ -72,7 +72,7 @@ public abstract class TestForInBodyExtraction { protected CAstEntity parseJS(File tmp, CAstImpl ast) throws IOException { String moduleName = tmp.getName(); - SourceFileModule module = new SourceFileModule(tmp, moduleName); + SourceFileModule module = new SourceFileModule(tmp, moduleName, null); return parseJS(ast, module); } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java index c19414167..064812678 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestJSCallGraphShape.java @@ -17,6 +17,7 @@ import com.ibm.wala.ipa.callgraph.CallGraph; public abstract class TestJSCallGraphShape extends TestCallGraphShape { + @Override protected Collection getNodes(CallGraph CG, String functionIdentifier) { return JSCallGraphBuilderUtil.getNodes(CG, functionIdentifier); } diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java index 3e8c25d7e..8b2bf58b8 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimplePageCallGraphShape.java @@ -32,9 +32,11 @@ public abstract class TestSimplePageCallGraphShape extends TestJSCallGraphShape protected abstract IHtmlParser getParser(); + @Override @Before public void setUp() { WebUtil.setFactory(new IHtmlParserFactory() { + @Override public IHtmlParser getParser() { return getParser(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java index 0dd6d0e41..febd89ea8 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/JavaScriptPlugin.java @@ -36,14 +36,16 @@ public class JavaScriptPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; resourceBundle = null; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java index 3bb968ead..6fd54b9c7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/analysis/typeInference/JSTypeInference.java @@ -37,30 +37,38 @@ public class JSTypeInference extends AstTypeInference { super(ir, cha, new PointType(cha.lookupClass(JavaScriptTypes.Boolean)), true); } + @Override protected void initialize() { class JSTypeOperatorFactory extends AstTypeOperatorFactory implements com.ibm.wala.cast.js.ssa.JSInstructionVisitor { + @Override public void visitJavaScriptInvoke(JavaScriptInvoke inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.String))); } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf inst) { result = new DeclaredTypeOperator(new PointType(cha.lookupClass(JavaScriptTypes.Boolean))); } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -81,6 +89,7 @@ public class JSTypeInference extends AstTypeInference { return new PointType(cha.lookupClass(typeRef)); } + @Override public IVariable makeVariable(int vn) { if (ir.getSymbolTable().isStringConstant(vn)) { return new TypeVariable(make(JavaScriptTypes.String)); @@ -100,6 +109,7 @@ public class JSTypeInference extends AstTypeInference { init(ir, new JSTypeVarFactory(), new JSTypeOperatorFactory()); } + @Override public TypeAbstraction getConstantType(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java index 393287ffb..5cd6cbe95 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/FlowGraph.java @@ -115,6 +115,7 @@ public class FlowGraph implements Iterable { return graph.getSuccNodes(v); } + @Override public Iterator iterator() { return graph.iterator(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java index 8bdbf4385..46140b1bb 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/callgraph/fieldbased/flowgraph/vertices/AbstractVertexVisitor.java @@ -20,35 +20,43 @@ public class AbstractVertexVisitor implements VertexVisitor { return null; } - public T visitVarVertex(VarVertex varVertex) { + @Override + public T visitVarVertex(VarVertex varVertex) { return visitVertex(varVertex); } - public T visitPropVertex(PropVertex propVertex) { + @Override + public T visitPropVertex(PropVertex propVertex) { return visitVertex(propVertex); } - public T visitUnknownVertex(UnknownVertex unknownVertex) { + @Override + public T visitUnknownVertex(UnknownVertex unknownVertex) { return visitVertex(unknownVertex); } - public T visitFuncVertex(FuncVertex funcVertex) { + @Override + public T visitFuncVertex(FuncVertex funcVertex) { return visitVertex(funcVertex); } - public T visitParamVertex(ParamVertex paramVertex) { + @Override + public T visitParamVertex(ParamVertex paramVertex) { return visitVertex(paramVertex); } - public T visitRetVertex(RetVertex retVertex) { + @Override + public T visitRetVertex(RetVertex retVertex) { return visitVertex(retVertex); } - public T visitCalleeVertex(CallVertex calleeVertex) { + @Override + public T visitCalleeVertex(CallVertex calleeVertex) { return visitVertex(calleeVertex); } - public T visitLexicalAccessVertex(LexicalVarVertex lexicalAccessVertex) { + @Override + public T visitLexicalAccessVertex(LexicalVarVertex lexicalAccessVertex) { return visitVertex(lexicalAccessVertex); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java index 0ff1d75ea..2b5451efb 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/cfg/JSInducedCFG.java @@ -37,27 +37,34 @@ public class JSInducedCFG extends AstInducedCFG { super(r); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke inst) { breakBasicBlock(); } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { breakBasicBlock(); } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -77,24 +84,31 @@ public class JSInducedCFG extends AstInducedCFG { super(r); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke inst) { } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead inst) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite inst) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -107,10 +121,12 @@ public class JSInducedCFG extends AstInducedCFG { } } + @Override protected BranchVisitor makeBranchVisitor(boolean[] r) { return new JSBranchVisitor(r); } + @Override protected PEIVisitor makePEIVisitor(boolean[] r) { return new JSPEIVisitor(r); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java index 72259e869..80425faad 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java @@ -45,6 +45,7 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { public JavaScriptAnalysisEngine() { } + @Override public void buildAnalysisScope() { try { loaderFactory = new JavaScriptLoaderFactory(translatorFactory); @@ -57,6 +58,7 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { } } + @Override public IClassHierarchy buildClassHierarchy() { try { return ClassHierarchy.make(getScope(), loaderFactory, JavaScriptLoader.JS); @@ -70,14 +72,17 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { this.translatorFactory = factory; } + @Override public void setJ2SELibraries(JarFile[] libs) { Assertions.UNREACHABLE("Illegal to call setJ2SELibraries"); } + @Override public void setJ2SELibraries(Module[] libs) { Assertions.UNREACHABLE("Illegal to call setJ2SELibraries"); } + @Override protected Iterable makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return new JavaScriptEntryPoints(cha, cha.getLoader(JavaScriptTypes.jsLoader)); } @@ -87,6 +92,7 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine { return new AnalysisCache(AstIRFactory.makeDefaultFactory()); } + @Override public AnalysisOptions getDefaultOptions(Iterable roots) { final AnalysisOptions options = new AnalysisOptions(scope, roots); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java index c66591983..e49626ba9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/CompositeFileMapping.java @@ -10,7 +10,6 @@ *******************************************************************************/ package com.ibm.wala.cast.js.html; -import java.io.PrintStream; import java.util.ArrayList; import java.util.List; @@ -43,11 +42,6 @@ public class CompositeFileMapping implements FileMapping { } @Override - public void dump(PrintStream ps) { - // TODO Auto-generated method stub - - } - public String toString() { return mappings.toString(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java index fedeb48d4..4ee690d1b 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/DomLessSourceExtractor.java @@ -67,6 +67,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { return governingTag.getElementPosition(); } + @Override public void handleEndTag(ITag tag) { if (tag.getName().equalsIgnoreCase("script")) { assert currentScriptTag != null; @@ -74,6 +75,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { } } + @Override public void handleText(Position p, String text) { if (currentScriptTag != null) { if (text.startsWith(" extractSources(URL entrypointUrl, IHtmlParser htmlParser, IUrlResolver urlResolver) throws IOException, Error { @@ -304,7 +309,7 @@ public class DomLessSourceExtractor extends JSSourceExtractor { Set res = domLessScopeGenerator.extractSources(entrypointUrl , htmlParser , urlResolver); MappedSourceModule entry = res.iterator().next(); System.out.println(entry); - entry.getMapping().dump(System.out); + System.out.println(entry.getMapping()); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java index 858b46bc1..eb6e6b888 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/EmptyFileMapping.java @@ -10,8 +10,6 @@ *******************************************************************************/ package com.ibm.wala.cast.js.html; -import java.io.PrintStream; - import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public class EmptyFileMapping implements FileMapping { @@ -21,9 +19,4 @@ public class EmptyFileMapping implements FileMapping { return null; } - @Override - public void dump(PrintStream ps) { - ps.println("empty mapping"); - } - } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java index c3998ee6f..3b15fd6ad 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/FileMapping.java @@ -10,8 +10,6 @@ *******************************************************************************/ package com.ibm.wala.cast.js.html; -import java.io.PrintStream; - import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public interface FileMapping { @@ -22,6 +20,4 @@ public interface FileMapping { */ public abstract IncludedPosition getIncludedPosition(Position line); - public abstract void dump(PrintStream ps); - } \ No newline at end of file diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IdentityUrlResolver.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IdentityUrlResolver.java index 3d36c3f3e..eb115878f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IdentityUrlResolver.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IdentityUrlResolver.java @@ -14,10 +14,12 @@ import java.net.URL; public class IdentityUrlResolver implements IUrlResolver{ + @Override public URL resolve(URL input) { return input; } + @Override public URL deResolve(URL input) { return input; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java index 53732d407..80ce86ee9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/IncludedPosition.java @@ -12,8 +12,17 @@ package com.ibm.wala.cast.js.html; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; +/** + * A {@link Position} for source code that has been included in some enclosing + * file, e.g., JavaScript code included in an HTML file via a script node. + */ public interface IncludedPosition extends Position { + /** + * get the position of the containing script within the enclosing file. E.g., + * for a position in JavaScript code included in an HTML file, returns the + * position of the relevant <script> tag in the HTML + */ Position getIncludePosition(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java index d5095c3a4..f8d3c6811 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/NestedRangeMapping.java @@ -12,7 +12,6 @@ package com.ibm.wala.cast.js.html; import java.io.IOException; import java.io.InputStream; -import java.io.PrintStream; import java.net.URL; import com.ibm.wala.cast.js.html.RangeFileMapping.Range; @@ -80,11 +79,6 @@ public class NestedRangeMapping implements FileMapping { } @Override - public void dump(PrintStream ps) { - // TODO Auto-generated method stub - - } - public String toString() { return range + "(" + innerMapping + ")"; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java index a6e8dfef5..525e5b6fa 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/RangeFileMapping.java @@ -12,7 +12,6 @@ package com.ibm.wala.cast.js.html; import java.io.IOException; import java.io.InputStream; -import java.io.PrintStream; import java.net.URL; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; @@ -58,6 +57,7 @@ public class RangeFileMapping implements FileMapping { return rangeEndingLine; } + @Override public String toString() { return "{"+rangeStart+"->"+rangeEnd+"}"; } @@ -74,6 +74,7 @@ public class RangeFileMapping implements FileMapping { includedURL = url; } + @Override public String toString() { return range + ":" + includePosition; } @@ -119,6 +120,7 @@ public class RangeFileMapping implements FileMapping { public Position getIncludePosition() { return includePosition; } + @Override public String toString() { return "[include:"+includePosition+"]"+super.toString(); } @@ -130,10 +132,5 @@ public class RangeFileMapping implements FileMapping { } } - @Override - public void dump(PrintStream ps) { - // TODO Auto-generated method stub - - } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java index 6e8be4f8c..408d3e04d 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/SourceRegion.java @@ -15,9 +15,18 @@ import java.net.URL; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; +/** + * Represents a region of source code, with source locations. Regions can be + * added to other {@link SourceRegion}s, with nested source location information + * maintained. + */ public class SourceRegion { private final StringBuilder source = new StringBuilder(); + + /** + * source location information + */ private FileMapping fileMapping; private int currentLine = 1; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/UnicodeReader.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/UnicodeReader.java index b15ad292f..1ce9c2efc 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/UnicodeReader.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/UnicodeReader.java @@ -109,11 +109,13 @@ public class UnicodeReader extends Reader { } } + @Override public void close() throws IOException { init(); internalIn2.close(); } + @Override public int read(char[] cbuf, int off, int len) throws IOException { init(); return internalIn2.read(cbuf, off, len); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java index f7e2fccb8..d404e93e5 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebUtil.java @@ -27,6 +27,7 @@ public class WebUtil { public static final String preamble = "preamble.js"; private static IHtmlParserFactory factory = new IHtmlParserFactory() { + @Override public IHtmlParser getParser() { return new JerichoHtmlParser(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java index 75a5e1691..73f47f40a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java @@ -101,7 +101,8 @@ public class JerichoHtmlParser implements IHtmlParser{ Config.LoggerProvider = new CAstLoggerProvider(); } - public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) throws TranslatorToCAst.Error { + @Override + public void parse(URL url, InputStream reader, IHtmlCallback callback, String fileName) throws TranslatorToCAst.Error { warnings.clear(); Parser parser = new Parser(callback, fileName); Source src; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoTag.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoTag.java index 90c5a4d18..895263208 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoTag.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoTag.java @@ -103,14 +103,16 @@ public class JerichoTag implements ITag { return result; } - public Map> getAllAttributes() { + @Override + public Map> getAllAttributes() { if (allAttributes == null) { allAttributes = makeAllAttributes(); } return allAttributes; } - public Pair getAttributeByName(String name) { + @Override + public Pair getAttributeByName(String name) { if (allAttributes == null) { allAttributes = makeAllAttributes(); } @@ -128,7 +130,8 @@ public class JerichoTag implements ITag { return sourceFile; } - public String getName() { + @Override + public String getName() { return innerElement.getName(); } @@ -137,11 +140,13 @@ public class JerichoTag implements ITag { return innerElement.toString(); } - public Position getElementPosition() { + @Override + public Position getElementPosition() { return getPosition(innerElement); } - public Position getContentPosition() { + @Override + public Position getContentPosition() { return getPosition(innerElement.getContent()); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java index 75258a53b..f1ccbeb48 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java @@ -70,6 +70,7 @@ public class ArgumentSpecialization { } } + @Override public DefUse getDU(CGNode node) { if (node.getMethod() instanceof Retranslatable) { return getAnalysisCache().getSSACache().findOrCreateDU(node.getMethod(), node.getContext(), options.getSSAOptions()); @@ -84,15 +85,18 @@ public class ArgumentSpecialization { private final int argumentCount; public static ContextKey ARGUMENT_COUNT = new ContextKey() { + @Override public String toString() { return "argument count key"; } }; + @Override public int hashCode() { return base.hashCode() + (argumentCount * 4073); } + @Override public boolean equals(Object o) { return o.getClass() == this.getClass() && @@ -105,10 +109,12 @@ public class ArgumentSpecialization { this.base = base; } + @Override public ContextItem get(ContextKey name) { return (name == ARGUMENT_COUNT)? ContextItem.Value.make(argumentCount): base.get(name); } + @Override public String toString() { return base.toString() + "(nargs:" + argumentCount + ")"; } @@ -121,6 +127,7 @@ public class ArgumentSpecialization { this.base = base; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); if (caller.getMethod() instanceof Retranslatable) { @@ -141,6 +148,7 @@ public class ArgumentSpecialization { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return base.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java index f4fea43ac..37ed56413 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/GlobalObjectKey.java @@ -33,10 +33,12 @@ public class GlobalObjectKey implements InstanceKey { this.concreteType = concreteType; } + @Override public IClass getConcreteType() { return concreteType; } + @Override public String toString() { return "JS Global Object"; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java index 0224c774f..33a4f2f8e 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCFABuilder.java @@ -105,6 +105,7 @@ public abstract class JSCFABuilder extends JSSSAPropagationCallGraphBuilder { * All values used as property names get implicitly converted to strings in JavaScript. * @see com.ibm.wala.cast.ipa.callgraph.DelegatingAstPointerKeys#getFieldNameType(com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override protected IClass getFieldNameType(InstanceKey F) { return F.getConcreteType().getClassHierarchy().lookupClass(JavaScriptTypes.String); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java index d30bd1a93..fc2e27407 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraph.java @@ -50,10 +50,12 @@ public class JSCallGraph extends AstCallGraph { super(fakeRoot, cha.lookupClass(JavaScriptTypes.FakeRoot), cha, options, cache); } + @Override public InducedCFG makeControlFlowGraph(SSAInstruction[] instructions) { return new JSInducedCFG(instructions, this, Everywhere.EVERYWHERE); } + @Override public SSANewInstruction addAllocation(TypeReference T) { if (cha.isSubclassOf(cha.lookupClass(T), cha.lookupClass(JavaScriptTypes.Root))) { int instance = nextLocal++; @@ -66,6 +68,7 @@ public class JSCallGraph extends AstCallGraph { } } + @Override public SSAAbstractInvokeInstruction addDirectCall(int function, int[] params, CallSiteReference site) { CallSiteReference newSite = new JSCallSiteReference(statements.size()); @@ -81,6 +84,7 @@ public class JSCallGraph extends AstCallGraph { return null; } + @Override protected CGNode makeFakeRootNode() throws com.ibm.wala.util.CancelException { return findOrCreateNode(new JSFakeRoot(cha, options, getAnalysisCache()), Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index 7f13debc8..1ce3abbf0 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -19,6 +19,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil; import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector; import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error; @@ -107,6 +108,11 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra return makeLoaders(null); } + public static IClassHierarchy makeHierarchyForScripts(String... scriptFiles) throws IOException, ClassHierarchyException { + JavaScriptLoaderFactory loaders = makeLoaders(); + AnalysisScope scope = CAstCallGraphUtil.makeScope(scriptFiles, loaders, JavaScriptLoader.JS); + return makeHierarchy(scope, loaders); + } public static IClassHierarchy makeHierarchy(AnalysisScope scope, ClassLoaderFactory loaders) throws ClassHierarchyException { return ClassHierarchy.make(scope, loaders, JavaScriptLoader.JS); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java index cc331aab0..83fedd8e1 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSSAPropagationCallGraphBuilder.java @@ -141,6 +141,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(cha, options, cache, pointerKeyFactory); } + @Override protected boolean isConstantRef(SymbolTable symbolTable, int valueNumber) { if (valueNumber == -1) { return false; @@ -154,10 +155,12 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph // // /////////////////////////////////////////////////////////////////////////// + @Override protected boolean useObjectCatalog() { return true; } + @Override protected boolean isUncataloguedField(IClass type, String fieldName) { if (!type.getReference().equals(JavaScriptTypes.Object)) { return true; @@ -181,6 +184,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph assert f != null : "couldn't resolve " + varName; return getPointerKeyForInstanceField(globalObject, f); } + @Override protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new JSCallGraph(cha, options, getAnalysisCache()); } @@ -204,6 +208,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph return ti; } + @Override protected void addAssignmentsForCatchPointerKey(PointerKey exceptionVar, Set catchClasses, PointerKey e) { system.newConstraint(exceptionVar, assignOperator, e); } @@ -213,34 +218,42 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(vn); } + @Override public void visitBinaryOp(final SSABinaryOpInstruction instruction) { bingo = true; } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { bingo = true; } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { bingo = true; } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { bingo = true; } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction inst) { bingo = true; } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { bingo = true; } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -256,6 +269,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new JSInterestingVisitor(vn); } @@ -280,30 +294,37 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(analysis, lpk); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction instruction) { } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } @@ -338,13 +359,16 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph }; + @Override protected ImplicitPointsToSetVisitor makeImplicitPointsToVisitor(LocalPointerKey lpk) { return new JSImplicitPointsToSetVisitor(this, lpk); } }; + @Override protected PropagationSystem makeSystem(AnalysisOptions options) { return new PropagationSystem(callGraph, pointerKeyFactory, instanceKeyFactory) { + @Override public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) { return new JSPointerAnalysisImpl(builder, cg, pointsToMap, instanceKeys, pointerKeyFactory, instanceKeyFactory); } @@ -357,6 +381,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph // // /////////////////////////////////////////////////////////////////////////// + @Override protected JSConstraintVisitor makeVisitor(CGNode node) { if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) { final IMethod method = node.getMethod(); @@ -387,10 +412,12 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph super(builder, node); } + @Override protected JSSSAPropagationCallGraphBuilder getBuilder() { return (JSSSAPropagationCallGraphBuilder) builder; } + @Override public void visitUnaryOp(SSAUnaryOpInstruction inst) { if (inst.getOpcode() == IUnaryOpInstruction.Operator.NEG) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); @@ -411,19 +438,23 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph system.newConstraint(lk, key); } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf inst) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { addLvalTypeKeyConstraint(inst, JavaScriptTypes.Boolean); } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction instruction) { addLvalTypeKeyConstraint(instruction, JavaScriptTypes.String); } @@ -476,10 +507,12 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } + @Override public void visitBinaryOp(final SSABinaryOpInstruction instruction) { handleBinaryOp(instruction, node, symbolTable, du); } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) { Position instructionPosition = getInstructionPosition(instruction); @@ -503,6 +536,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph return null; } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { if (AstSSAPropagationCallGraphBuilder.DEBUG_PROPERTIES) { Position instructionPosition = getInstructionPosition(instruction); @@ -513,6 +547,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph newFieldWrite(node, instruction.getUse(0), instruction.getUse(1), instruction.getUse(2)); } + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { if (instruction.getDeclaredTarget().equals(JavaScriptMethods.dispatchReference)) { handleJavascriptDispatch(instruction); @@ -675,14 +710,17 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph return instruction; } + @Override public String toString() { return "BinOp: " + getInstruction(); } + @Override public int hashCode() { return 17 * getInstruction().getUse(0) * getInstruction().getUse(1); } + @Override public boolean equals(Object o) { if (o instanceof BinaryOperator) { BinaryOperator op = (BinaryOperator) o; @@ -704,6 +742,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } else { final Set temp = HashSetFactory.make(); v.getValue().foreach(new IntSetAction() { + @Override public void act(int keyIndex) { temp.add(system.getInstanceKey(keyIndex)); } @@ -728,6 +767,7 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } } + @Override public byte evaluate(PointsToSetVariable lhs, final PointsToSetVariable[] rhs) { boolean doDefault = false; byte changed = NOT_CHANGED; @@ -823,11 +863,13 @@ public class JSSSAPropagationCallGraphBuilder extends AstSSAPropagationCallGraph } } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { // TODO Auto-generated method stub } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { // TODO Auto-generated method stub diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java index 378b5d7c4..73dfb74a1 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSSyntheticParameterKey.java @@ -23,16 +23,19 @@ public class JSSyntheticParameterKey extends NodeKey { this.param = param; } + @Override public boolean equals(Object o) { return (o instanceof JSSyntheticParameterKey) && ((JSSyntheticParameterKey)o).param == param && internalEquals(o); } + @Override public int hashCode() { return param*getNode().hashCode(); } + @Override public String toString() { return "p" + param + ":" + getNode().getMethod().getName(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java index b99f679a6..e48211396 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructTargetSelector.java @@ -67,6 +67,7 @@ public class JavaScriptConstructTargetSelector implements MethodTargetSelector { this(ref, summary, declaringClass, ""); } + @Override public String toString() { return ""; } @@ -552,6 +553,7 @@ public class JavaScriptConstructTargetSelector implements MethodTargetSelector { } } + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { if (site.getDeclaredTarget().equals(JavaScriptMethods.ctorReference)) { assert cha.isSubclassOf(receiver, cha.lookupClass(JavaScriptTypes.Root)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java index 5b9462baa..6520fb6d9 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorInstanceKeys.java @@ -26,6 +26,7 @@ public class JavaScriptConstructorInstanceKeys implements InstanceKeyFactory { this.base = base; } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { if (node.getMethod() instanceof JavaScriptConstructTargetSelector.JavaScriptConstructor) { InstanceKey bk = base.getInstanceKeyForAllocation(node, allocation); @@ -35,18 +36,22 @@ public class JavaScriptConstructorInstanceKeys implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return base.getInstanceKeyForClassObject(type); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { return base.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return base.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return base.getInstanceKeyForPEI(node, instr, type); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java index 140f2b45f..5dc7d697c 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptEntryPoints.java @@ -20,6 +20,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy; public class JavaScriptEntryPoints extends ScriptEntryPoints { + @Override protected CallSiteReference makeScriptSite(IMethod m, int pc) { return new JSCallSiteReference(pc); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java index 49771f54f..e472f49a4 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionApplyContextSelector.java @@ -52,6 +52,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { this.oneLevel = new OneLevelSiteContextSelector(base); } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { // 0 for function (synthetic apply), 1 for this (function being invoked), 2 // for this arg of function being invoked, @@ -77,6 +78,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { this.isNonNullArray = ContextItem.Value.make(isNonNullArray); } + @Override public ContextItem get(ContextKey name) { if (APPLY_NON_NULL_ARGS.equals(name)) { return isNonNullArray; @@ -117,6 +119,7 @@ public class JavaScriptFunctionApplyContextSelector implements ContextSelector { } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { IClass declaringClass = callee.getDeclaringClass(); IMethod method = declaringClass.getMethod(AstMethodReference.fnSelector); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java index 2663e97aa..58dc7c970 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptFunctionDotCallTargetSelector.java @@ -74,6 +74,7 @@ public class JavaScriptFunctionDotCallTargetSelector implements MethodTargetSele * .wala.ipa.callgraph.CGNode, com.ibm.wala.classLoader.CallSiteReference, * com.ibm.wala.classLoader.IClass) */ + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { IMethod method = receiver.getMethod(AstMethodReference.fnSelector); if (method != null) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java index 1de58778a..afb7473e7 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptScopeMappingInstanceKeys.java @@ -56,6 +56,7 @@ public class JavaScriptScopeMappingInstanceKeys extends ScopeMappingInstanceKeys return function==null? new LexicalParent[0]: function.getParents(); } + @Override protected boolean needsScopeMappingKey(InstanceKey base) { return cha.isSubclassOf(base.getConcreteType(), codeBody) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java index cab685b70..25180c415 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/LoadFileTargetSelector.java @@ -48,6 +48,7 @@ public class LoadFileTargetSelector implements MethodTargetSelector { private final HashSet loadedFiles = HashSetFactory.make(); + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { IMethod target = base.getCalleeTarget(caller, site, receiver); if (target != null && target.getReference().equals(loadFileFunRef)) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java index b4b8ebbcd..4b0e41fdc 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ObjectSensitivityContextSelector.java @@ -62,6 +62,7 @@ public class ObjectSensitivityContextSelector implements ContextSelector { return false; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] arguments) { Context baseContext = base.getCalleeTarget(caller, site, callee, arguments); if(returnsThis(callee)) { @@ -72,6 +73,7 @@ public class ObjectSensitivityContextSelector implements ContextSelector { return baseContext; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (caller.getIR().getCalls(site)[0].getNumberOfUses() > 1) { return IntSetUtil.make(new int[]{1}).union(base.getRelevantParameters(caller, site)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java index ec5d4d8fa..c14306c5e 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/PropertyNameContextSelector.java @@ -14,13 +14,10 @@ import java.util.Collections; import java.util.HashMap; import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet; -import com.ibm.wala.cast.ir.ssa.AstIRFactory; import com.ibm.wala.cast.ir.ssa.AstIsDefinedInstruction; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.ClosureExtractor; -import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.classLoader.CallSiteReference; -import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.CGNode; @@ -28,18 +25,14 @@ import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextItem; import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.ContextSelector; -import com.ibm.wala.ipa.callgraph.impl.Everywhere; -import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey; import com.ibm.wala.ipa.callgraph.propagation.ConstantKey; import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey.SingleInstanceFilter; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ssa.DefUse; -import com.ibm.wala.ssa.IR; import com.ibm.wala.ssa.ReflectiveMemberAccess; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; import com.ibm.wala.ssa.SSAGetInstruction; import com.ibm.wala.ssa.SSAInstruction; -import com.ibm.wala.ssa.SSAOptions; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Iterator2Iterable; @@ -211,6 +204,7 @@ public class PropertyNameContextSelector implements ContextSelector { return f; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); @@ -234,6 +228,7 @@ public class PropertyNameContextSelector implements ContextSelector { } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (caller.getIR().getCalls(site)[0].getNumberOfUses() > index) { return IntSetUtil.make(new int[]{index}).union(base.getRelevantParameters(caller, site)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java index 65c41bbdb..993f500f3 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/SelectiveCPAContext.java @@ -44,6 +44,7 @@ public class SelectiveCPAContext implements Context { hashCode = base.hashCode() ^ parameterObjs.hashCode(); } + @Override public ContextItem get(ContextKey name) { if (parameterObjs.containsKey(name)) { return new FilteredPointerKey.SingleInstanceFilter(parameterObjs.get(name)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java index d5a85293c..f4ce25f44 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/TransitivePrototypeKey.java @@ -23,15 +23,18 @@ public class TransitivePrototypeKey extends AbstractFieldPointerKey { super(object); } + @Override public boolean equals(Object x) { return (x instanceof TransitivePrototypeKey) && ((TransitivePrototypeKey)x).getInstanceKey().equals(getInstanceKey()); } + @Override public int hashCode() { return getInstanceKey().hashCode(); } + @Override public String toString() { return ""; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java index 05e1d5037..228b8bb1f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/CorrelationFinder.java @@ -244,6 +244,7 @@ public class CorrelationFinder { correlations.addAll(summary.pp()); Collections.sort(correlations, new Comparator>() { + @Override @SuppressWarnings("unchecked") public int compare(Pair o1, Pair o2) { return o1.fst.compareTo(o2.fst); 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 5f05ea121..a9ecde373 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 @@ -50,7 +50,6 @@ import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder; import com.ibm.wala.cast.tree.impl.CAstOperator; import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; -import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; @@ -534,10 +533,15 @@ public class ClosureExtractor extends CAstRewriterExt { theChildren.putAll(copyChildren(root.getChild(i), nodes, entity.getAllScopedEntities())); Rewrite rw = new Rewrite() { + @Override public CAstNode newRoot() { return newRoot; } + @Override public CAstControlFlowMap newCfg() { return theCfg; } + @Override public CAstSourcePositionMap newPos() { return theSource; } + @Override public CAstNodeTypeMap newTypes() { return theTypes; } + @Override public Map> newChildren() { return theChildren; } }; new_entity.setRewrite(rw); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java index f2c233b7d..1b2bf4131 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/CorrelatedPairExtractorFactory.java @@ -13,7 +13,6 @@ package com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction; import java.io.IOException; import java.net.URL; -import java.util.Collection; import java.util.Map; import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationFinder; @@ -42,6 +41,7 @@ public class CorrelatedPairExtractorFactory implements CAstRewriterFactory> getAllScopedEntities() { + @Override + public Map> getAllScopedEntities() { if(scopedEntities == null) { scopedEntities = HashMapFactory.make(); // first, add all existing entities inside the body of this for loop @@ -126,7 +133,8 @@ class ExtractedFunction implements CAstEntity { return scopedEntities; } - public Iterator getScopedEntities(CAstNode construct) { + @Override + public Iterator getScopedEntities(CAstNode construct) { if(getAllScopedEntities().containsKey(construct)) { return getAllScopedEntities().get(construct).iterator(); } else { @@ -134,31 +142,38 @@ class ExtractedFunction implements CAstEntity { } } - public CAstNode getAST() { + @Override + public CAstNode getAST() { return root; } - public CAstControlFlowMap getControlFlow() { + @Override + public CAstControlFlowMap getControlFlow() { return cfg; } - public CAstSourcePositionMap getSourceMap() { + @Override + public CAstSourcePositionMap getSourceMap() { return posmap; } - public Position getPosition() { + @Override + public Position getPosition() { return getSourceMap().getPosition(root); } - public CAstNodeTypeMap getNodeTypeMap() { + @Override + public CAstNodeTypeMap getNodeTypeMap() { return types; } - public Collection getQualifiers() { + @Override + public Collection getQualifiers() { return null; } - public CAstType getType() { + @Override + public CAstType getType() { return null; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java index a0a5408a8..ff4888ee2 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/NodePos.java @@ -26,7 +26,8 @@ import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey; public abstract class NodePos implements CAstRewriter.RewriteContext { public abstract A accept(PosSwitch ps); - public NoKey key() { + @Override + public NoKey key() { return null; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java index a7e2ad784..cd4ca9365 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummarizedFunction.java @@ -25,10 +25,12 @@ public class JavaScriptSummarizedFunction extends SummarizedMethod { super(ref, summary, declaringClass); } + @Override public boolean equals(Object o) { return this == o; } + @Override public InducedCFG makeControlFlowGraph(SSAInstruction[] instructions) { return new JSInducedCFG(instructions, this, Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java index b7a1acc02..635f56ac6 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/summaries/JavaScriptSummary.java @@ -33,10 +33,12 @@ public class JavaScriptSummary extends MethodSummary { } + @Override public int getNumberOfParameters() { return declaredParameters; } + @Override public TypeReference getParameterType(int i) { return JavaScriptTypes.Root; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java index debf4d214..ff978cd13 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JSCallSiteReference.java @@ -23,6 +23,7 @@ public class JSCallSiteReference extends CallSiteReference { public static enum Dispatch implements IInvokeInstruction.IDispatch { JS_CALL; + @Override public boolean hasImplicitThis() { return false; } @@ -36,10 +37,12 @@ public class JSCallSiteReference extends CallSiteReference { this(AstMethodReference.fnReference(JavaScriptTypes.CodeBody), pc); } + @Override public IInvokeInstruction.IDispatch getInvocationCode() { return Dispatch.JS_CALL; } + @Override public String toString() { return "JSCall@" + getProgramCounter(); } 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 76e1760f4..9e00784e2 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 @@ -127,18 +127,22 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { JSPrimitiveType.init(); } + @Override public Atom getName() { return Atom.findOrCreateUnicodeAtom("JavaScript"); } + @Override public TypeReference getRootType() { return JavaScriptTypes.Root; } + @Override public TypeReference getThrowableType() { return JavaScriptTypes.Root; } + @Override public TypeReference getConstantType(Object o) { if (o == null) { return JavaScriptTypes.Null; @@ -161,14 +165,17 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } } + @Override public boolean isNullType(TypeReference type) { return type.equals(JavaScriptTypes.Undefined) || type.equals(JavaScriptTypes.Null); } + @Override public TypeReference[] getArrayInterfaces() { return new TypeReference[0]; } + @Override public TypeName lookupPrimitiveType(String name) { if ("Boolean".equals(name)) { return JavaScriptTypes.Boolean.getName(); @@ -184,61 +191,75 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } } + @Override public Collection inferInvokeExceptions(MethodReference target, IClassHierarchy cha) throws InvalidClassFileException { return Collections.singleton(JavaScriptTypes.Root); } + @Override public Object getMetadataToken(Object value) { assert false; return null; } + @Override public TypeReference getPointerType(TypeReference pointee) throws UnsupportedOperationException { throw new UnsupportedOperationException("JavaScript does not permit explicit pointers"); } + @Override public JSInstructionFactory instructionFactory() { return new JSInstructionFactory() { + @Override public JavaScriptCheckReference CheckReference(int ref) { return new JavaScriptCheckReference(ref); } + @Override public SSAGetInstruction GetInstruction(int result, int ref, String field) { return GetInstruction(result, ref, FieldReference.findOrCreate(JavaScriptTypes.Root, Atom.findOrCreateUnicodeAtom(field), JavaScriptTypes.Root)); } + @Override public JavaScriptInstanceOf InstanceOf(int result, int objVal, int typeVal) { return new JavaScriptInstanceOf(result, objVal, typeVal); } + @Override public JavaScriptInvoke Invoke(int function, int[] results, int[] params, int exception, CallSiteReference site) { return new JavaScriptInvoke(function, results, params, exception, site); } + @Override public JavaScriptInvoke Invoke(int function, int[] results, int[] params, int exception, CallSiteReference site, Access[] lexicalReads, Access[] lexicalWrites) { return new JavaScriptInvoke(function, results, params, exception, site, lexicalReads, lexicalWrites); } + @Override public JavaScriptInvoke Invoke(int function, int result, int[] params, int exception, CallSiteReference site) { return new JavaScriptInvoke(function, result, params, exception, site); } + @Override public JavaScriptInvoke Invoke(int function, int[] params, int exception, CallSiteReference site) { return new JavaScriptInvoke(function, params, exception, site); } + @Override public JavaScriptPropertyRead PropertyRead(int result, int objectRef, int memberRef) { return new JavaScriptPropertyRead(result, objectRef, memberRef); } + @Override public JavaScriptPropertyWrite PropertyWrite(int objectRef, int memberRef, int value) { return new JavaScriptPropertyWrite(objectRef, memberRef, value); } + @Override public SSAPutInstruction PutInstruction(int ref, int value, String field) { try { byte[] utf8 = field.getBytes("UTF-8"); @@ -250,101 +271,126 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } } + @Override public JavaScriptTypeOfInstruction TypeOfInstruction(int lval, int object) { return new JavaScriptTypeOfInstruction(lval, object); } + @Override public JavaScriptWithRegion WithRegion(int expr, boolean isEnter) { return new JavaScriptWithRegion(expr, isEnter); } + @Override public AstAssertInstruction AssertInstruction(int value, boolean fromSpecification) { return new AstAssertInstruction(value, fromSpecification); } + @Override public com.ibm.wala.cast.ir.ssa.AssignInstruction AssignInstruction(int result, int val) { return new AssignInstruction(result, val); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementGetInstruction EachElementGetInstruction(int value, int objectRef) { return new EachElementGetInstruction(value, objectRef); } + @Override public com.ibm.wala.cast.ir.ssa.EachElementHasNextInstruction EachElementHasNextInstruction(int value, int objectRef) { return new EachElementHasNextInstruction(value, objectRef); } + @Override public AstEchoInstruction EchoInstruction(int[] rvals) { return new AstEchoInstruction(rvals); } + @Override public AstGlobalRead GlobalRead(int lhs, FieldReference global) { return new AstGlobalRead(lhs, global); } + @Override public AstGlobalWrite GlobalWrite(FieldReference global, int rhs) { return new AstGlobalWrite(global, rhs); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal, FieldReference fieldRef) { return new AstIsDefinedInstruction(lval, rval, fieldVal, fieldRef); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, FieldReference fieldRef) { return new AstIsDefinedInstruction(lval, rval, fieldRef); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval, int fieldVal) { return new AstIsDefinedInstruction(lval, rval, fieldVal); } + @Override public AstIsDefinedInstruction IsDefinedInstruction(int lval, int rval) { return new AstIsDefinedInstruction(lval, rval); } + @Override public AstLexicalRead LexicalRead(Access[] accesses) { return new AstLexicalRead(accesses); } + @Override public AstLexicalRead LexicalRead(Access access) { return new AstLexicalRead(access); } + @Override public AstLexicalRead LexicalRead(int lhs, String definer, String globalName) { return new AstLexicalRead(lhs, definer, globalName); } + @Override public AstLexicalWrite LexicalWrite(Access[] accesses) { return new AstLexicalWrite(accesses); } + @Override public AstLexicalWrite LexicalWrite(Access access) { return new AstLexicalWrite(access); } + @Override public AstLexicalWrite LexicalWrite(String definer, String globalName, int rhs) { return new AstLexicalWrite(definer, globalName, rhs); } + @Override public SSAArrayLengthInstruction ArrayLengthInstruction(int result, int arrayref) { throw new UnsupportedOperationException(); } + @Override public SSAArrayLoadInstruction ArrayLoadInstruction(int result, int arrayref, int index, TypeReference declaredType) { throw new UnsupportedOperationException(); } + @Override public SSAArrayStoreInstruction ArrayStoreInstruction(int arrayref, int index, int value, TypeReference declaredType) { throw new UnsupportedOperationException(); } + @Override public SSABinaryOpInstruction BinaryOpInstruction(IOperator operator, boolean overflow, boolean unsigned, int result, int val1, int val2, boolean mayBeInteger) { return new SSABinaryOpInstruction(operator, result, val1, val2, mayBeInteger) { + @Override public boolean isPEI() { return false; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return insts.BinaryOpInstruction(getOperator(), false, false, defs == null || defs.length == 0 ? getDef(0) : defs[0], uses == null ? getUse(0) : uses[0], uses == null ? getUse(1) : uses[1], mayBeIntegerOp()); @@ -352,33 +398,40 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { }; } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference[] types, boolean isPEI) { throw new UnsupportedOperationException(); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int[] typeValues, boolean isPEI) { throw new UnsupportedOperationException(); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int typeValue, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new int[]{ typeValue }, true); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference type, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new TypeReference[]{ type }, true); } + @Override public SSAComparisonInstruction ComparisonInstruction(Operator operator, int result, int val1, int val2) { return new SSAComparisonInstruction(operator, result, val1, val2); } + @Override public SSAConditionalBranchInstruction ConditionalBranchInstruction( com.ibm.wala.shrikeBT.IConditionalBranchInstruction.IOperator operator, TypeReference type, int val1, int val2) { return new SSAConditionalBranchInstruction(operator, type, val1, val2); } + @Override public SSAConversionInstruction ConversionInstruction(int result, int val, TypeReference fromType, TypeReference toType, boolean overflow) { assert !overflow; @@ -394,127 +447,158 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { }; } + @Override public SSAGetCaughtExceptionInstruction GetCaughtExceptionInstruction(int bbNumber, int exceptionValueNumber) { return new SSAGetCaughtExceptionInstruction(bbNumber, exceptionValueNumber); } + @Override public SSAGetInstruction GetInstruction(int result, FieldReference field) { throw new UnsupportedOperationException(); } + @Override public SSAGetInstruction GetInstruction(int result, int ref, FieldReference field) { return new SSAGetInstruction(result, ref, field) { + @Override public boolean isPEI() { return false; } }; } + @Override public SSAGotoInstruction GotoInstruction() { return new SSAGotoInstruction(); } + @Override public SSAInstanceofInstruction InstanceofInstruction(int result, int ref, TypeReference checkedType) { throw new UnsupportedOperationException(); } + @Override public SSAInvokeInstruction InvokeInstruction(int result, int[] params, int exception, CallSiteReference site) { throw new UnsupportedOperationException(); } + @Override public SSAInvokeInstruction InvokeInstruction(int[] params, int exception, CallSiteReference site) { throw new UnsupportedOperationException(); } + @Override public SSALoadMetadataInstruction LoadMetadataInstruction(int lval, TypeReference entityType, Object token) { throw new UnsupportedOperationException(); } + @Override public SSAMonitorInstruction MonitorInstruction(int ref, boolean isEnter) { throw new UnsupportedOperationException(); } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site) { return new SSANewInstruction(result, site) { + @Override public boolean isPEI() { return true; } + @Override public Collection getExceptionTypes() { return Collections.singleton(JavaScriptTypes.TypeError); } }; } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site, int[] params) { throw new UnsupportedOperationException(); } + @Override public SSAPhiInstruction PhiInstruction(int result, int[] params) { return new SSAPhiInstruction(result, params); } + @Override public SSAPiInstruction PiInstruction(int result, int val, int piBlock, int successorBlock, SSAInstruction cause) { return new SSAPiInstruction(result, val, piBlock, successorBlock, cause); } + @Override public SSAPutInstruction PutInstruction(int ref, int value, FieldReference field) { return new SSAPutInstruction(ref, value, field) { + @Override public boolean isPEI() { return false; } }; } + @Override public SSAPutInstruction PutInstruction(int value, FieldReference field) { throw new UnsupportedOperationException(); } + @Override public SSAReturnInstruction ReturnInstruction() { return new SSAReturnInstruction(); } + @Override public SSAReturnInstruction ReturnInstruction(int result, boolean isPrimitive) { return new SSAReturnInstruction(result, isPrimitive); } + @Override public SSASwitchInstruction SwitchInstruction(int val, int defaultLabel, int[] casesAndLabels) { return new SSASwitchInstruction(val, defaultLabel, casesAndLabels); } + @Override public SSAThrowInstruction ThrowInstruction(int exception) { return new SSAThrowInstruction(exception) { + @Override public boolean isPEI() { return true; } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } }; } + @Override public SSAUnaryOpInstruction UnaryOpInstruction(com.ibm.wala.shrikeBT.IUnaryOpInstruction.IOperator operator, int result, int val) { return new SSAUnaryOpInstruction(operator, result, val); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, int indexVal, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, FieldReference field, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSALoadIndirectInstruction LoadIndirectInstruction(int lval, TypeReference t, int addressVal) { throw new UnsupportedOperationException(); } + @Override public SSAStoreIndirectInstruction StoreIndirectInstruction(int addressVal, int rval, TypeReference t) { throw new UnsupportedOperationException(); } @@ -532,50 +616,62 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { }; } + @Override public boolean isDoubleType(TypeReference type) { return type == JavaScriptTypes.Number || type == JavaScriptTypes.NumberObject; } + @Override public boolean isFloatType(TypeReference type) { return false; } + @Override public boolean isIntType(TypeReference type) { return false; } + @Override public boolean isLongType(TypeReference type) { return false; } + @Override public boolean isMetadataType(TypeReference type) { return false; } + @Override public boolean isStringType(TypeReference type) { return type == JavaScriptTypes.String || type == JavaScriptTypes.StringObject; } + @Override public boolean isVoidType(TypeReference type) { return false; } + @Override public TypeReference getMetadataType() { return null; } + @Override public TypeReference getStringType() { return JavaScriptTypes.String; } + @Override public PrimitiveType getPrimitive(TypeReference reference) { return JSPrimitiveType.getPrimitive(reference); } + @Override public boolean isBooleanType(TypeReference type) { return JavaScriptTypes.Boolean.equals(type); } + @Override public boolean isCharType(TypeReference type) { return false; } @@ -610,10 +706,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { superClass = superRef == null ? null : loader.lookupClass(superRef.getName()); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String toString() { return "JS:" + getReference().toString(); } @@ -642,18 +740,22 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { types.put(JavaScriptTypes.Root.getName(), this); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String toString() { return "JS Root:" + getReference().toString(); } + @Override public Collection getDirectInterfaces() { return Collections.emptySet(); } + @Override public IClass getSuperclass() { return null; } @@ -676,6 +778,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { this.entity = entity; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -715,27 +818,33 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } + @Override public CAstEntity getEntity() { return entity; } + @Override public void retranslate(AstTranslator xlator) { xlator.translate(entity, translationContext); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public String toString() { return ""; } + @Override public TypeReference[] getDeclaredExceptions() { return null; } + @Override public LexicalParent[] getParents() { if (lexicalInfo() == null) return new LexicalParent[0]; @@ -751,10 +860,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { final int hack = i; final AstMethod method = (AstMethod) lookupClass(parents[i], cha).getMethod(AstMethodReference.fnSelector); result[i] = new LexicalParent() { + @Override public String getName() { return parents[hack]; } + @Override public AstMethod getMethod() { return method; } @@ -768,10 +879,12 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { return result; } + @Override public String getLocalVariableName(int bcIndex, int localNumber) { return null; } + @Override public boolean hasLocalVariableTable() { return false; } @@ -786,6 +899,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { return -1; } + @Override public TypeReference getParameterType(int i) { if (i == 0) { return getDeclaringClass().getReference(); @@ -864,14 +978,17 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { final JavaScriptClass STRING_OBJECT = new JavaScriptClass(this, JavaScriptTypes.StringObject, JavaScriptTypes.Object, null); + @Override public Language getLanguage() { return JS; } + @Override public ClassLoaderReference getReference() { return JavaScriptTypes.jsLoader; } + @Override public SSAInstructionFactory getInstructionFactory() { return JS.instructionFactory(); } @@ -905,12 +1022,14 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { * adds the {@link #bootstrapFileNames bootstrap files} to the list of modules * and then invokes the superclass method */ + @Override public void init(List modules) { List all = new LinkedList(); for (final String fn : bootstrapFileNames) { all.add(new SourceURLModule(getClass().getClassLoader().getResource(fn)) { + @Override public String getName() { return fn; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java index 91242a302..bfac347ba 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoaderFactory.java @@ -34,10 +34,12 @@ public class JavaScriptLoaderFactory extends SingleClassLoaderFactory { this.preprocessor = preprocessor; } + @Override protected IClassLoader makeTheLoader(IClassHierarchy cha) { return new JavaScriptLoader( cha, translatorFactory, preprocessor ); } + @Override public ClassLoaderReference getTheReference() { return JavaScriptTypes.jsLoader; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java index 2b4c7bc12..6c5a51270 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JSAbstractInstructionVisitor.java @@ -17,30 +17,37 @@ public class JSAbstractInstructionVisitor implements JSInstructionVisitor { + @Override public void visitJavaScriptInvoke(JavaScriptInvoke instruction) { } + @Override public void visitJavaScriptPropertyRead(JavaScriptPropertyRead instruction) { } + @Override public void visitJavaScriptPropertyWrite(JavaScriptPropertyWrite instruction) { } + @Override public void visitTypeOf(JavaScriptTypeOfInstruction instruction) { } + @Override public void visitJavaScriptInstanceOf(JavaScriptInstanceOf instruction) { } + @Override public void visitCheckRef(JavaScriptCheckReference instruction) { } + @Override public void visitWithRegion(JavaScriptWithRegion instruction) { } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java index e230a4f11..c0636941a 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptCheckReference.java @@ -60,14 +60,17 @@ public class JavaScriptCheckReference extends SSAInstruction { ((JSInstructionVisitor)v).visitCheckRef(this); } + @Override public boolean isPEI() { return true; } + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return ref; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java index 55c340b55..9f46f455b 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInstanceOf.java @@ -45,6 +45,7 @@ public class JavaScriptInstanceOf extends SSAInstruction { return Collections.singleton(JavaScriptTypes.TypeError); } + @Override public boolean isPEI() { return true; } @@ -69,19 +70,23 @@ public class JavaScriptInstanceOf extends SSAInstruction { ((JSInstructionVisitor)v).visitJavaScriptInstanceOf(this); } + @Override public int getNumberOfDefs() { return 1; } + @Override public int getDef(int i) { assert i == 0; return result; } + @Override public int getNumberOfUses() { return 2; } + @Override public int getUse(int i) { switch (i) { case 0: return objVal; diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java index 5a63aa0a1..b0f308627 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptInvoke.java @@ -50,6 +50,7 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { this(function, null, params, exception, site); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { int fn = function; int newParams[] = params; @@ -96,6 +97,7 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { return ((JSInstructionFactory)insts).Invoke(fn, newLvals, newParams, newExp, site, reads, writes); } + @Override public String toString(SymbolTable symbolTable) { StringBuffer s = new StringBuffer(); if (getNumberOfReturnValues() > 0) { @@ -152,11 +154,13 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { /** * @see com.ibm.domo.ssa.Instruction#visit(Visitor) */ + @Override public void visit(IVisitor v) { assert v instanceof JSInstructionVisitor; ((JSInstructionVisitor) v).visitJavaScriptInvoke(this); } + @Override public int getNumberOfParameters() { if (params == null) { return 1; @@ -168,6 +172,7 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { /** * @see com.ibm.domo.ssa.Instruction#getUse(int) */ + @Override public int getUse(int j) { if (j == 0) return function; @@ -186,10 +191,12 @@ public class JavaScriptInvoke extends AbstractLexicalInvoke { * (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return Util.typeErrorExceptions(); } + @Override public int hashCode() { return site.hashCode() * function * 7529; } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java index 0a37fac4e..159d44e66 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyRead.java @@ -22,6 +22,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { super(result, objectRef, memberRef); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((JSInstructionFactory)insts).PropertyRead( @@ -33,6 +34,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { /* (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#isPEI() */ + @Override public boolean isPEI() { return true; } @@ -40,6 +42,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { /* (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return Util.typeErrorExceptions(); } @@ -48,6 +51,7 @@ public class JavaScriptPropertyRead extends AbstractReflectiveGet { /* (non-Javadoc) * @see com.ibm.domo.ssa.SSAInstruction#visit(com.ibm.domo.ssa.SSAInstruction.Visitor) */ + @Override public void visit(IVisitor v) { assert v instanceof JSInstructionVisitor; ((JSInstructionVisitor)v).visitJavaScriptPropertyRead(this); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java index 86323b260..8b89d9f91 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptPropertyWrite.java @@ -24,11 +24,13 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { super(objectRef, memberRef, value); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((JSInstructionFactory)insts).PropertyWrite(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()); } @@ -36,6 +38,7 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { /** * @see com.ibm.domo.ssa.Instruction#visit(Visitor) */ + @Override public void visit(IVisitor v) { assert v instanceof JSInstructionVisitor; ((JSInstructionVisitor) v).visitJavaScriptPropertyWrite(this); @@ -45,6 +48,7 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { * (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#isPEI() */ + @Override public boolean isPEI() { return true; } @@ -53,6 +57,7 @@ public class JavaScriptPropertyWrite extends AbstractReflectivePut { * (non-Javadoc) * @see com.ibm.domo.ssa.Instruction#getExceptionTypes() */ + @Override public Collection getExceptionTypes() { return Util.typeErrorExceptions(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java index 5855a3acf..12425daf5 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptTypeOfInstruction.java @@ -24,18 +24,22 @@ public class JavaScriptTypeOfInstruction extends SSAAbstractUnaryInstruction { super(lval, object); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((JSInstructionFactory)insts).TypeOfInstruction((defs != null ? defs[0] : getDef(0)), (uses != null ? uses[0] : getUse(0))); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef(0)) + " = typeof(" + getValueString(symbolTable, getUse(0)) + ")"; } + @Override public void visit(IVisitor v) { ((JSInstructionVisitor) v).visitTypeOf(this); } + @Override public Collection getExceptionTypes() { return Util.noExceptions(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java index d13e18598..51f9dba9f 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ssa/JavaScriptWithRegion.java @@ -56,10 +56,12 @@ public class JavaScriptWithRegion extends SSAInstruction { ((JSInstructionVisitor)v).visitWithRegion(this); } + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return expr; 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 d22747ffe..34c0df3fd 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 @@ -53,22 +53,27 @@ public class JSAstTranslator extends AstTranslator { return JavaScriptLoader.bootstrapFileNames.contains( context.getModule().getName() ); } + @Override protected boolean useDefaultInitValues() { return false; } + @Override protected boolean hasImplicitGlobals() { return true; } + @Override protected boolean treatGlobalsAsLexicallyScoped() { return false; } + @Override protected TypeReference defaultCatchType() { return JavaScriptTypes.Root; } + @Override protected TypeReference makeType(CAstType type) { Assertions.UNREACHABLE("JavaScript does not use CAstType"); return null; @@ -90,6 +95,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().newBlock(true); } + @Override protected int doLexicallyScopedRead(CAstNode n, WalkContext context, String name) { int readVn = super.doLexicallyScopedRead(n, context, name); // should get an exception if name is undefined @@ -97,6 +103,7 @@ public class JSAstTranslator extends AstTranslator { return readVn; } + @Override protected int doGlobalRead(CAstNode n, WalkContext context, String name) { int readVn = super.doGlobalRead(n, context, name); // add a check if name is undefined, unless we're reading the value 'undefined' @@ -106,15 +113,18 @@ public class JSAstTranslator extends AstTranslator { return readVn; } + @Override protected boolean defineType(CAstEntity type, WalkContext wc) { Assertions.UNREACHABLE("JavaScript doesn't have types. I suggest you look elsewhere for your amusement."); return false; } + @Override protected void defineField(CAstEntity topEntity, WalkContext wc, CAstEntity n) { Assertions.UNREACHABLE("JavaScript doesn't have fields"); } + @Override protected String composeEntityName(WalkContext parent, CAstEntity f) { if (f.getKind() == CAstEntity.SCRIPT_ENTITY) return f.getName(); @@ -122,6 +132,7 @@ public class JSAstTranslator extends AstTranslator { return parent.getName() + "/" + f.getName(); } + @Override protected void declareFunction(CAstEntity N, WalkContext context) { String fnName = composeEntityName(context, N); if (N.getKind() == CAstEntity.SCRIPT_ENTITY) { @@ -133,6 +144,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { @@ -147,10 +159,12 @@ public class JSAstTranslator extends AstTranslator { debugInfo); } + @Override protected void doThrow(WalkContext context, int exception) { context.cfg().addInstruction(insts.ThrowInstruction(exception)); } + @Override protected void doCall(WalkContext context, CAstNode call, int result, int exception, CAstNode name, int receiver, int[] arguments) { MethodReference ref = name.getValue().equals("ctor") ? JavaScriptMethods.ctorReference @@ -173,6 +187,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addPreEdgeToExit(call, true); } + @Override protected void doNewObject(WalkContext context, CAstNode newNode, int result, Object type, int[] arguments) { assert arguments == null; TypeReference typeRef = TypeReference.findOrCreate(JavaScriptTypes.jsLoader, TypeName.string2TypeName("L" + type)); @@ -181,6 +196,7 @@ public class JSAstTranslator extends AstTranslator { insts.NewInstruction(result, NewSiteReference.make(context.cfg().getCurrentInstruction(), typeRef))); } + @Override 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 @@ -190,14 +206,17 @@ public class JSAstTranslator extends AstTranslator { JavaScriptMethods.ctorReference, context.cfg().getCurrentInstruction()))); } + @Override public void doArrayRead(WalkContext context, int result, int arrayValue, CAstNode arrayRef, int[] dimValues) { Assertions.UNREACHABLE("JSAstTranslator.doArrayRead() called!"); } + @Override public void doArrayWrite(WalkContext context, int arrayValue, CAstNode arrayRef, int[] dimValues, int rval) { Assertions.UNREACHABLE("JSAstTranslator.doArrayWrite() called!"); } + @Override protected void doFieldRead(WalkContext context, int result, int receiver, CAstNode elt, CAstNode readNode) { this.visit(elt, context, this); int x = context.currentScope().allocateTempValue(); @@ -228,6 +247,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected void doFieldWrite(WalkContext context, int receiver, CAstNode elt, CAstNode parent, int rval) { this.visit(elt, context, this); if (elt.getKind() == CAstNode.CONSTANT && elt.getValue() instanceof String) { @@ -262,6 +282,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(resultVal, rval, "class")); } + @Override protected void doPrimitive(int resultVal, WalkContext context, CAstNode primitiveCall) { try { String name = (String) primitiveCall.getChild(0).getValue(); @@ -327,6 +348,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected void doIsFieldDefined(WalkContext context, int result, int ref, CAstNode f) { if (f.getKind() == CAstNode.CONSTANT && f.getValue() instanceof String) { String field = (String) f.getValue(); @@ -342,6 +364,7 @@ public class JSAstTranslator extends AstTranslator { } } + @Override protected boolean visitInstanceOf(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -349,6 +372,7 @@ public class JSAstTranslator extends AstTranslator { return false; } + @Override protected void leaveInstanceOf(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.getValue(n); @@ -362,6 +386,7 @@ public class JSAstTranslator extends AstTranslator { context.cfg().addInstruction(new JavaScriptInstanceOf(result, value, type)); } + @Override protected void doPrologue(WalkContext context) { super.doPrologue(context); @@ -372,6 +397,7 @@ public class JSAstTranslator extends AstTranslator { //context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(1, tempVal, "arguments")); } + @Override protected boolean doVisit(CAstNode n, WalkContext cntxt, CAstVisitor visitor) { WalkContext context = (WalkContext) cntxt; switch (n.getKind()) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java index 83c05a515..64db4fdc0 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptLoopUnwindingTranslatorFactory.java @@ -35,6 +35,7 @@ public abstract class JavaScriptLoopUnwindingTranslatorFactory protected abstract TranslatorToCAst translateInternal(CAst Ast, SourceModule M, String N); + @Override public TranslatorToCAst make(CAst ast, final SourceModule M) { String N; if (M instanceof SourceFileModule) { @@ -45,7 +46,8 @@ public abstract class JavaScriptLoopUnwindingTranslatorFactory TranslatorToCAst xlator = translateInternal(ast, M, N); xlator.addRewriter(new CAstRewriterFactory,AstLoopUnwinder.UnwindKey>() { - public CAstRewriter, UnwindKey> createCAstRewriter(CAst ast) { + @Override + public CAstRewriter, UnwindKey> createCAstRewriter(CAst ast) { return new AstLoopUnwinder(ast, true, unwindFactor); } }, false); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java index 51c6f2204..be32d130c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JavaScriptTranslatorToCAst.java @@ -55,22 +55,27 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { public static class RootContext, T> extends TranslatorToCAst.RootContext implements WalkContext { + @Override public String script() { return null; } + @Override public T top() { Assertions.UNREACHABLE(); return null; } + @Override public void addNameDecl(CAstNode v) { Assertions.UNREACHABLE(); } + @Override public Collection getNameDecls() { Assertions.UNREACHABLE(); return null; } + @Override public CAstNode getCatchTarget() { Assertions.UNREACHABLE(); return null; @@ -99,22 +104,27 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { super(parent); } + @Override public String script() { return parent.script(); } + @Override public T top() { return parent.top(); } + @Override public void addNameDecl(CAstNode n) { parent.addNameDecl(n); } + @Override public Collection getNameDecls() { return parent.getNameDecls(); } + @Override public CAstNode getCatchTarget() { return parent.getCatchTarget(); } @@ -188,6 +198,7 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { this.script = script; } + @Override public String script() { return script; } } @@ -199,6 +210,7 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { this.catchNode = catchNode; } + @Override public CAstNode getCatchTarget() { return catchNode; } } @@ -265,6 +277,7 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { this.operationIndex = operationIndex; } + @Override public int setOperation(T node) { if (baseFor.contains( node )) { foundBase = true; @@ -274,10 +287,12 @@ public interface JavaScriptTranslatorToCAst extends TranslatorToCAst { } } + @Override public boolean foundMemberOperation(T node) { return foundBase; } + @Override public void copyOperation(T from, T to) { if (baseFor.contains(from)) baseFor.add(to); } 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 0dd8d9800..62148d431 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 @@ -31,8 +31,10 @@ public class PropertyReadExpander extends CAstRewriter { EVERYWHERE, EXTRA { + @Override public ExpanderKey parent() { return EVERYWHERE; } }; + @Override public ExpanderKey parent() { return null; } } @@ -42,6 +44,7 @@ public class PropertyReadExpander extends CAstRewriter { + @Override public ExpanderKey key() { return ExpanderKey.EVERYWHERE; } @@ -72,10 +75,12 @@ public class PropertyReadExpander extends CAstRewriter, CAstNode> nodeMap) { int kind = root.getKind(); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java index ce6d25412..8a11e6eec 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/RangePosition.java @@ -32,6 +32,7 @@ public class RangePosition extends AbstractSourcePosition implements Position { this.endOffset = endOffset; } + @Override public int compareTo(Object o) { Position other = (Position) o; if (startOffset != other.getFirstOffset()) { @@ -41,34 +42,42 @@ public class RangePosition extends AbstractSourcePosition implements Position { } } + @Override public int getFirstLine() { return line; } + @Override public int getLastLine() { return -1; } + @Override public int getFirstCol() { return -1; } + @Override public int getLastCol() { return -1; } + @Override public int getFirstOffset() { return startOffset; } + @Override public int getLastOffset() { return endOffset; } + @Override public URL getURL() { return url; } + @Override public InputStream getInputStream() throws IOException { return url.openStream(); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java index 33d9e2985..3cd7aeba6 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/vis/JsPaPanel.java @@ -63,7 +63,8 @@ public class JsPaPanel extends PaPanel { } } - protected List getPointerKeysUnderInstanceKey(InstanceKey ik) { + @Override + protected List getPointerKeysUnderInstanceKey(InstanceKey ik) { List ret = new ArrayList(); ret.addAll(super.getPointerKeysUnderInstanceKey(ik)); int ikIndex = pa.getInstanceKeyMapping().getMappedIndex(ik); diff --git a/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java b/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java index bae4db4ca..e8d3b3439 100644 --- a/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java +++ b/com.ibm.wala.cast.test/harness-src/com/ibm/wala/cast/test/TestCAstPattern.java @@ -36,6 +36,7 @@ public class TestCAstPattern extends WalaTestCase { private static class TestingCAstImpl extends CAstImpl { private final Map testNameMap = new HashMap(); + @Override @SuppressWarnings("unchecked") public CAstNode makeNode(int kind, CAstNode children[]) { if (kind == NAME_ASSERTION_SINGLE || kind == NAME_ASSERTION_MULTI) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java index 175a0f766..8f0917ae9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/analysis/typeInference/AstTypeInference.java @@ -31,36 +31,45 @@ public abstract class AstTypeInference extends TypeInference { private final TypeAbstraction booleanType; protected class AstTypeOperatorFactory extends TypeOperatorFactory implements AstInstructionVisitor { + @Override public void visitAstLexicalRead(AstLexicalRead inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitAstLexicalWrite(AstLexicalWrite inst) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { result = new DeclaredTypeOperator(new ConeType(cha.getRootClass())); } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { if (doPrimitives) { result = new DeclaredTypeOperator(booleanType); } } + @Override public void visitEcho(AstEchoInstruction inst) { } @@ -71,6 +80,7 @@ public abstract class AstTypeInference extends TypeInference { this.booleanType = booleanType; } + @Override protected void initialize() { init(ir, new TypeVarFactory(), new AstTypeOperatorFactory()); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java index 765616b4c..6aaf8d47c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ArgumentInstanceContext.java @@ -30,6 +30,7 @@ public class ArgumentInstanceContext implements Context { this.instanceKey = instanceKey; } + @Override public ContextItem get(ContextKey name) { /*if(name == ContextKey.RECEIVER && index == 1) return instanceKey;*/ diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java index 72f0a44dc..21a9ca451 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstCallGraph.java @@ -54,6 +54,7 @@ public class AstCallGraph extends ExplicitCallGraph { super(rootMethod, cha, options, cache); } + @Override public InducedCFG makeControlFlowGraph(SSAInstruction[] statements) { return new AstInducedCFG(statements, this, Everywhere.EVERYWHERE); } @@ -147,6 +148,7 @@ public class AstCallGraph extends ExplicitCallGraph { targets.remove(cs.getProgramCounter()); } + @Override public boolean addTarget(CallSiteReference site, CGNode node) { if (super.addTarget(site, node)) { if (((AstCGNode) node).callbacks != null) { @@ -160,10 +162,12 @@ public class AstCallGraph extends ExplicitCallGraph { } } + @Override protected ExplicitNode makeNode(IMethod method, Context context) { return new AstCGNode(method, context); } + @Override protected CGNode makeFakeRootNode() throws CancelException { return findOrCreateNode(new AstFakeRoot(FakeRootMethod.rootMethod, cha, options, getAnalysisCache()), Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java index 8e9c003ac..60a52bb7a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstContextInsensitiveSSAContextInterpreter.java @@ -41,6 +41,7 @@ public class AstContextInsensitiveSSAContextInterpreter extends ContextInsensiti return method instanceof AstMethod; } + @Override public Iterator iterateNewSites(CGNode N) { IR ir = getIR(N); if (ir == null) { @@ -50,6 +51,7 @@ public class AstContextInsensitiveSSAContextInterpreter extends ContextInsensiti } } + @Override public Iterator iterateCallSites(CGNode N) { IR ir = getIR(N); if (ir == null) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java index 51fbdff25..415ef3cce 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstGlobalPointerKey.java @@ -22,15 +22,18 @@ public class AstGlobalPointerKey extends AbstractPointerKey { this.globalName = globalName; } + @Override public boolean equals(Object x) { return (x instanceof AstGlobalPointerKey) && ((AstGlobalPointerKey)x).globalName.equals(globalName); } + @Override public int hashCode() { return globalName.hashCode(); } + @Override public String toString() { return "[global: " + globalName + "]"; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java index 4b92d66b5..153d8bcf9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/AstSSAPropagationCallGraphBuilder.java @@ -141,6 +141,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(builder, cg, pointsToMap, instanceKeys, pointerKeys, iKeyFactory); } + @Override protected ImplicitPointsToSetVisitor makeImplicitPointsToVisitor(LocalPointerKey lpk) { return new AstImplicitPointsToSetVisitor(this, lpk); } @@ -150,38 +151,47 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(analysis, lpk); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { pointsToSet = analysis.computeImplicitPointsToSetAtGet(node, instruction.getDeclaredField(), -1, true); } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } @@ -194,6 +204,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa // // ///////////////////////////////////////////////////////////////////////// + @Override protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new AstCallGraph(cha, options, getAnalysisCache()); } @@ -204,43 +215,53 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(vn); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { bingo = true; } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { bingo = true; } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { bingo = true; } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { bingo = true; } + @Override public void visitAssert(AstAssertInstruction instruction) { bingo = true; } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { bingo = true; } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new AstInterestingVisitor(vn); } @@ -274,6 +295,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa super(builder, node); } + @Override protected AstSSAPropagationCallGraphBuilder getBuilder() { return (AstSSAPropagationCallGraphBuilder) builder; } @@ -301,8 +323,10 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { visitLexical(instruction, new LexicalOperator((AstCGNode) node, instruction.getAccesses(), true) { + @Override protected void action(PointerKey lexicalKey, int vn) { PointerKey lval = getPointerKeyForLocal(vn); if (lexicalKey instanceof LocalPointerKey) { @@ -328,8 +352,10 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa }); } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { visitLexical(instruction, new LexicalOperator((AstCGNode) node, instruction.getAccesses(), false) { + @Override protected void action(PointerKey lexicalKey, int vn) { PointerKey rval = getPointerKeyForLocal(vn); if (contentsAreInvariant(symbolTable, du, vn)) { @@ -346,14 +372,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa }); } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { visitGetInternal(instruction.getDef(), -1, true, instruction.getDeclaredField()); } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { visitPutInternal(instruction.getVal(), -1, true, instruction.getDeclaredField()); } + @Override public void visitPut(SSAPutInstruction inst) { super.visitPut(inst); @@ -394,10 +423,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } else { final String hack = fieldName; system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable objects = (IntSetVariable) rhs; if (objects.getValue() != null) { objects.getValue().foreach(new IntSetAction() { + @Override public void act(int optr) { InstanceKey object = system.getInstanceKey(optr); if (!getBuilder().isUncataloguedField(object.getConcreteType(), hack)) { @@ -412,14 +443,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "field name record: " + objKey; } @@ -427,14 +461,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { int lval = inst.getDef(0); final PointerKey lk = getPointerKeyForLocal(lval); @@ -452,10 +489,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa else { system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable objects = (IntSetVariable) rhs; if (objects.getValue() != null) { objects.getValue().foreach(new IntSetAction() { + @Override public void act(int optr) { InstanceKey object = system.getInstanceKey(optr); PointerKey objCatalog = getPointerKeyForObjectCatalog(object); @@ -468,14 +507,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "get catalog op" + rk; } @@ -483,14 +525,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } + @Override protected void visitInvokeInternal(final SSAAbstractInvokeInstruction instruction, InvariantComputer invs) { super.visitInvokeInternal(instruction, invs); if (instruction instanceof AbstractLexicalInvoke) { @@ -581,6 +626,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { doLexicalPointerKeys(true); return NOT_CHANGED; @@ -588,10 +634,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa abstract protected void action(PointerKey lexicalKey, int vn); + @Override public String toString() { return "lexical op"; } + @Override public boolean equals(Object o) { if (!(o instanceof LexicalOperator)) { return false; @@ -625,6 +673,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public int hashCode() { return node.hashCode() * accesses[0].hashCode() * accesses.length; } @@ -658,6 +707,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa PointsToSetVariable FV = system.findOrCreatePointsToSet(F); if (FV.getValue() != null) { FV.getValue().foreach(new IntSetAction() { + @Override public void act(int ptr) { InstanceKey iKey = system.getInstanceKey(ptr); if (iKey instanceof ScopeMappingInstanceKey) { @@ -745,6 +795,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return definingNode; } + @Override public boolean equals(Object x) { return (x instanceof UpwardFunargPointerKey) && super.equals(x) @@ -752,10 +803,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa .equals(((UpwardFunargPointerKey) x).getDefiningNode())); } + @Override public int hashCode() { return super.hashCode() * ((definingNode == null) ? 17 : definingNode.hashCode()); } + @Override public String toString() { return "[upward:" + getName() + ":" + definingNode + "]"; } @@ -894,11 +947,13 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa private final MutableIntSet doneReceiver = IntSetUtil.make(); private final MutableIntSet doneField = IntSetUtil.make(); + @Override public byte evaluate(PointsToSetVariable lhs, final PointsToSetVariable[] rhs) { final IntSetVariable receivers = (IntSetVariable) rhs[0]; final IntSetVariable fields = (IntSetVariable) rhs[1]; if (receivers.getValue() != null && fields.getValue() != null) { receivers.getValue().foreach(new IntSetAction() { + @Override public void act(final int rptr) { final InstanceKey receiver = system.getInstanceKey(rptr); @@ -910,6 +965,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } fields.getValue().foreach(new IntSetAction() { + @Override public void act(int fptr) { if (!doneField.contains(fptr) || !doneReceiver.contains(rptr)) { InstanceKey field = system.getInstanceKey(fptr); @@ -932,14 +988,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public String toString() { return "field op"; } + @Override public boolean equals(Object o) { return o == this; } + @Override public int hashCode() { return System.identityHashCode(this); } @@ -949,10 +1008,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa protected void newFieldOperationOnlyFieldConstant(final boolean isLoadOperation, final ReflectedFieldAction action, final PointerKey objKey, final InstanceKey[] fieldsKeys) { system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable objects = (IntSetVariable) rhs; if (objects.getValue() != null) { objects.getValue().foreach(new IntSetAction() { + @Override public void act(int optr) { InstanceKey object = system.getInstanceKey(optr); PointerKey objCatalog = getPointerKeyForObjectCatalog(object); @@ -982,14 +1043,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "field op" + objKey; } @@ -1008,10 +1072,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } system.newSideEffect(new UnaryOperator() { + @Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { final IntSetVariable fields = (IntSetVariable) rhs; if (fields.getValue() != null) { fields.getValue().foreach(new IntSetAction() { + @Override public void act(int fptr) { InstanceKey field = system.getInstanceKey(fptr); for (int o = 0; o < objKeys.length; o++) { @@ -1029,14 +1095,17 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa return NOT_CHANGED; } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public String toString() { return "field op" + fieldKey; } @@ -1090,6 +1159,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa this.rhsFixedValues = rhsFixedValues; } + @Override public void dump(AbstractFieldPointerKey fieldKey, boolean constObj, boolean constProp) { System.err.println(("writing fixed rvals to " + fieldKey + " " + constObj + ", " + constProp)); for (int i = 0; i < rhsFixedValues.length; i++) { @@ -1097,6 +1167,7 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa } } + @Override public void action(AbstractFieldPointerKey fieldKey) { if (!representsNullType(fieldKey.getInstanceKey())) { for (int i = 0; i < rhsFixedValues.length; i++) { @@ -1122,10 +1193,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa this.rhs = rhs; } + @Override public void dump(AbstractFieldPointerKey fieldKey, boolean constObj, boolean constProp) { System.err.println(("write " + rhs + " to " + fieldKey + " " + constObj + ", " + constProp)); } + @Override public void action(AbstractFieldPointerKey fieldKey) { if (!representsNullType(fieldKey.getInstanceKey())) { system.newConstraint(fieldKey, assignOperator, rhs); @@ -1147,10 +1220,12 @@ public abstract class AstSSAPropagationCallGraphBuilder extends SSAPropagationCa protected void newFieldRead(CGNode opNode, int objVn, int fieldsVn, final PointerKey lhs) { newFieldOperation(opNode, objVn, fieldsVn, true, new ReflectedFieldAction() { + @Override public void dump(AbstractFieldPointerKey fieldKey, boolean constObj, boolean constProp) { System.err.println(("read " + lhs + " from " + fieldKey + " " + constObj + ", " + constProp)); } + @Override public void action(AbstractFieldPointerKey fieldKey) { if (!representsNullType(fieldKey.getInstanceKey())) { system.newConstraint(lhs, assignOperator, fieldKey); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java index b0381ac4d..c27441e1d 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstAnalysisScope.java @@ -62,6 +62,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getPrimordialLoader() { Assertions.UNREACHABLE(); return null; @@ -72,6 +73,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getExtensionLoader() { Assertions.UNREACHABLE(); return null; @@ -82,6 +84,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getApplicationLoader() { Assertions.UNREACHABLE(); return null; @@ -90,6 +93,7 @@ public class CAstAnalysisScope extends AnalysisScope { /** * @return Returns the arrayClassLoader. */ + @Override public ArrayClassLoader getArrayClassLoader() { Assertions.UNREACHABLE(); return null; @@ -100,6 +104,7 @@ public class CAstAnalysisScope extends AnalysisScope { * * @return ClassLoaderReference */ + @Override public ClassLoaderReference getSyntheticLoader() { Assertions.UNREACHABLE(); return null; @@ -111,6 +116,7 @@ public class CAstAnalysisScope extends AnalysisScope { * @param loader * @param file */ + @Override public void addClassFileToScope(ClassLoaderReference loader, File file) { Assertions.UNREACHABLE(); } @@ -118,6 +124,7 @@ public class CAstAnalysisScope extends AnalysisScope { /** * @return the ClassLoaderReference specified by name. */ + @Override public ClassLoaderReference getLoader(Atom name) { assert name.equals(theLoader.getName()); return theLoader; @@ -125,6 +132,7 @@ public class CAstAnalysisScope extends AnalysisScope { /** */ + @Override public Collection getLoaders() { return Collections.singleton(theLoader); } @@ -132,10 +140,12 @@ public class CAstAnalysisScope extends AnalysisScope { /** * @return the number of loaders. */ + @Override public int getNumberOfLoaders() { return 1; } + @Override public String toString() { return super.toString() + "\n" + theLoader + ": " + getModules(theLoader); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstCallGraphUtil.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstCallGraphUtil.java index ed8402cdb..7dce238a9 100755 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstCallGraphUtil.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CAstCallGraphUtil.java @@ -54,7 +54,7 @@ public class CAstCallGraphUtil { assert hackedName.endsWith(scriptName) : scriptName + " does not match file " + script.getFile(); - return new SourceFileModule(scriptFile, scriptName); + return new SourceFileModule(scriptFile, scriptName, null); } public static AnalysisScope makeScope(String[] files, SingleClassLoaderFactory loaders, Language language) throws IOException { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java index baea5d530..75550b238 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageCallGraph.java @@ -107,6 +107,7 @@ public class CrossLanguageCallGraph extends AstCallGraph { return root.addPhi(values); } + @Override public int addGetInstance(FieldReference ref, int object) { TypeReference type = ref.getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -114,6 +115,7 @@ public class CrossLanguageCallGraph extends AstCallGraph { return root.addGetInstance(ref, object); } + @Override public int addGetStatic(FieldReference ref) { TypeReference type = ref.getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -121,18 +123,21 @@ public class CrossLanguageCallGraph extends AstCallGraph { return root.addGetStatic(ref); } + @Override public int addCheckcast(TypeReference[] type, int rv, boolean isPEI) { Atom language = type[0].getClassLoader().getLanguage(); AbstractRootMethod root = getLanguageRoot(language); return root.addCheckcast(type, rv, isPEI); } + @Override public SSANewInstruction addAllocation(TypeReference type) { Atom language = type.getClassLoader().getLanguage(); AbstractRootMethod root = getLanguageRoot(language); return root.addAllocation(type); } + @Override public SSAInvokeInstruction addInvocation(int[] params, CallSiteReference site) { TypeReference type = site.getDeclaredTarget().getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -144,12 +149,14 @@ public class CrossLanguageCallGraph extends AstCallGraph { return super.addInvocation(params, site); } + @Override public AstLexicalRead addGlobalRead(TypeReference type, String name) { Atom language = type.getClassLoader().getLanguage(); AbstractRootMethod root = getLanguageRoot(language); return ((AstFakeRoot) root).addGlobalRead(type, name); } + @Override public SSAAbstractInvokeInstruction addDirectCall(int functionVn, int[] argVns, CallSiteReference callSite) { TypeReference type = callSite.getDeclaredTarget().getDeclaringClass(); Atom language = type.getClassLoader().getLanguage(); @@ -162,6 +169,7 @@ public class CrossLanguageCallGraph extends AstCallGraph { return languageRootNodes.iterator(); } + @Override protected CGNode makeFakeRootNode() throws CancelException { return findOrCreateNode(new CrossLanguageFakeRoot(cha, options, getAnalysisCache()), Everywhere.EVERYWHERE); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java index 53a84a5b2..bc87d4484 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageClassTargetSelector.java @@ -46,6 +46,7 @@ public class CrossLanguageClassTargetSelector implements ClassTargetSelector { return (ClassTargetSelector)languageSelectors.get(getLanguage(site)); } + @Override public IClass getAllocatedTarget(CGNode caller, NewSiteReference site) { return getSelector(site).getAllocatedTarget(caller, site); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java index 5f1f470bd..b301c6bb9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageContextSelector.java @@ -53,10 +53,12 @@ public class CrossLanguageContextSelector implements ContextSelector { return (ContextSelector)languageSelectors.get(getLanguage(site)); } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return getSelector(site).getCalleeTarget(caller, site, callee, receiver); } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return getSelector(site).getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java index e2f60c7dc..80b8fd4a4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageInstanceKeys.java @@ -57,23 +57,28 @@ public class CrossLanguageInstanceKeys implements InstanceKeyFactory { } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return getSelector(allocation).getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return getSelector(allocation).getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return getSelector(type).getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { assert getSelector(type) != null : "no instance keys for " + type; return getSelector(type).getInstanceKeyForPEI(node, instr, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return getSelector(type).getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java index 948dd1e05..c03f533ec 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageMethodTargetSelector.java @@ -57,6 +57,7 @@ public class CrossLanguageMethodTargetSelector return (MethodTargetSelector)languageSelectors.get(getLanguage(site)); } + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { assert getSelector(site) != null: "no selector for " + getLanguage(site) + " method " + site; return getSelector(site).getCalleeTarget(caller, site, receiver); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java index bdf52fe45..35ad73e05 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/CrossLanguageSSAPropagationCallGraphBuilder.java @@ -54,6 +54,7 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA interesting = makeInterestingVisitorSelector(); } + @Override protected ExplicitCallGraph createEmptyCallGraph(IClassHierarchy cha, AnalysisOptions options) { return new CrossLanguageCallGraph(makeRootNodeSelector(), cha, options, getAnalysisCache()); } @@ -62,16 +63,20 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA return node.getMethod().getReference().getDeclaringClass().getClassLoader().getLanguage(); } + @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return interesting.get(getLanguage(node), new Integer(vn)); } + @Override protected ConstraintVisitor makeVisitor(ExplicitCallGraph.ExplicitNode node) { return visitors.get(getLanguage(node), node); } + @Override protected PropagationSystem makeSystem(AnalysisOptions options) { return new PropagationSystem(callGraph, pointerKeyFactory, instanceKeyFactory) { + @Override public PointerAnalysis makePointerAnalysis(PropagationCallGraphBuilder builder) { assert builder == CrossLanguageSSAPropagationCallGraphBuilder.this; return new CrossLanguagePointerAnalysisImpl(CrossLanguageSSAPropagationCallGraphBuilder.this, cg, pointsToMap, @@ -90,11 +95,13 @@ public abstract class CrossLanguageSSAPropagationCallGraphBuilder extends AstSSA this.implicitVisitors = builder.makeImplicitVisitorSelector(this); } + @Override protected ImplicitPointsToSetVisitor makeImplicitPointsToVisitor(LocalPointerKey lpk) { return implicitVisitors.get(getLanguage(lpk.getNode()), lpk); } } + @Override protected void customInit() { for (Iterator roots = ((CrossLanguageCallGraph) callGraph).getLanguageRoots(); roots.hasNext();) { markDiscovered((CGNode) roots.next()); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java index a31d5b7c1..c69a3c21e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/DelegatingAstPointerKeys.java @@ -34,38 +34,47 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { this.base = base; } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { return base.getPointerKeyForLocal(node, valueNumber); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { return base.getFilteredPointerKeyForLocal(node, valueNumber, filter); } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return base.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return base.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return base.getPointerKeyForStaticField(f); } + @Override public PointerKey getPointerKeyForObjectCatalog(InstanceKey I) { return new ObjectPropertyCatalogKey(I); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField f) { return base.getPointerKeyForInstanceField(I, f); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return base.getPointerKeyForArrayContents(I); } + @Override public Iterator getPointerKeysForReflectedFieldWrite(InstanceKey I, InstanceKey F) { List result = new LinkedList(); @@ -106,6 +115,7 @@ public class DelegatingAstPointerKeys implements AstPointerKeyFactory { return null; } + @Override public Iterator getPointerKeysForReflectedFieldRead(InstanceKey I, InstanceKey F) { if (F instanceof ConstantKey) { PointerKey ifk = getInstanceFieldPointerKeyForConstant(I, (ConstantKey) F); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java index 9036635de..a21cce624 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/MiscellaneousHacksContextSelector.java @@ -108,6 +108,7 @@ public class MiscellaneousHacksContextSelector implements ContextSelector { System.err.println(("hacking context selector for methods " + methodsToSpecialize)); } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (methodsToSpecialize.contains(site.getDeclaredTarget()) || methodsToSpecialize.contains(callee.getReference())) { return specialPolicy.getCalleeTarget(caller, site, callee, receiver); @@ -116,6 +117,7 @@ public class MiscellaneousHacksContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return specialPolicy.getRelevantParameters(caller, site).union(basePolicy.getRelevantParameters(caller, site)); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java index 55c55fbaf..b40ecea23 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ObjectPropertyCatalogKey.java @@ -24,15 +24,18 @@ public class ObjectPropertyCatalogKey extends AbstractPointerKey { this.object = object; } + @Override public boolean equals(Object x) { return (x instanceof ObjectPropertyCatalogKey) && ((ObjectPropertyCatalogKey)x).object.equals(object); } + @Override public int hashCode() { return object.hashCode(); } + @Override public String toString() { return "[" + getName() + "]"; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java index bfb1631c8..c7ca06d63 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ReflectedFieldPointerKey.java @@ -22,9 +22,11 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { public abstract Object getFieldIdentifier(); private static final Object arrayStateKey = new Object() { + @Override public String toString() { return "ArrayStateKey"; } }; + @Override public boolean equals(Object obj) { if (obj == this) { return true; @@ -39,14 +41,17 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { } } + @Override public int hashCode() { return getFieldIdentifier().hashCode() ^ getInstanceKey().hashCode(); } + @Override public String toString() { return "[" + getInstanceKey() + "; " + getFieldIdentifier() + "]"; } public static ReflectedFieldPointerKey literal(final String lit, InstanceKey instance) { return new ReflectedFieldPointerKey(instance) { + @Override public Object getFieldIdentifier() { return lit; } @@ -55,6 +60,7 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { public static ReflectedFieldPointerKey mapped(final InstanceKey mapFrom, InstanceKey instance) { return new ReflectedFieldPointerKey(instance) { + @Override public Object getFieldIdentifier() { return mapFrom; } @@ -63,6 +69,7 @@ public abstract class ReflectedFieldPointerKey extends AbstractFieldPointerKey { public static ReflectedFieldPointerKey index(InstanceKey instance) { return new ReflectedFieldPointerKey(instance) { + @Override public Object getFieldIdentifier() { return arrayStateKey; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index c6269491a..6a1251b23 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -81,6 +81,7 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { this.base = base; } + @Override public IClass getConcreteType() { return base.getConcreteType(); } @@ -113,15 +114,18 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { } + @Override public int hashCode() { return base.hashCode() * creator.hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof ScopeMappingInstanceKey) && ((ScopeMappingInstanceKey) o).base.equals(base) && ((ScopeMappingInstanceKey) o).creator.equals(creator); } + @Override public String toString() { return "SMIK:" + base + "@creator:" + creator; } @@ -134,10 +138,12 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { return creator; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new FilterIterator>( base.getCreationSites(CG), new Filter>() { + @Override public boolean accepts(Pair o) { return o.fst.equals(creator); } @@ -145,6 +151,7 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode creatorNode, NewSiteReference allocationSite) { InstanceKey base = basic.getInstanceKeyForAllocation(creatorNode, allocationSite); if (base != null && needsScopeMappingKey(base)) { @@ -159,18 +166,22 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { */ protected abstract Collection getConstructorCallers(ScopeMappingInstanceKey smik, Pair name); + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return basic.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return basic.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return basic.getInstanceKeyForPEI(node, instr, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return basic.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java index 0b1574e56..f90dc04e8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScriptEntryPoints.java @@ -35,10 +35,12 @@ public abstract class ScriptEntryPoints implements Iterable { super(scriptCodeBody); } + @Override public CallSiteReference makeSite(int programCounter) { return makeScriptSite(getMethod(), programCounter); } + @Override public TypeReference[] getParameterTypes(int i) { assert i == 0; if (getMethod().isStatic()) { @@ -48,11 +50,13 @@ public abstract class ScriptEntryPoints implements Iterable { } } + @Override public int getNumberOfParameters() { return getMethod().isStatic()? 0: 1; } + @Override public SSAAbstractInvokeInstruction addCall(AbstractRootMethod m){ CallSiteReference site = makeSite(0); @@ -81,6 +85,7 @@ public abstract class ScriptEntryPoints implements Iterable { return true; } + @Override public Iterator iterator() { Set ES = HashSetFactory.make(); Iterator classes = scriptType.getClassLoader().iterateAllClasses(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java index 363f2896f..9f9f40a2e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/StandardFunctionTargetSelector.java @@ -31,6 +31,7 @@ public class StandardFunctionTargetSelector implements MethodTargetSelector { this.base = base; } + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { ClassLoaderReference loader = (site.isStatic() || receiver==null)? diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java index 4956956de..9be0ef27f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/cha/CrossLanguageClassHierarchy.java @@ -60,10 +60,12 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { private final Map hierarchies; + @Override public ClassLoaderFactory getFactory() { return loaderFactory; } + @Override public AnalysisScope getScope() { return analysisScope; } @@ -96,6 +98,7 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return getHierarchy(ref.getDeclaringClass()); } + @Override public IClassLoader[] getLoaders() { Set loaders = HashSetFactory.make(); for (Iterator ldrs = analysisScope.getLoaders().iterator(); ldrs.hasNext();) { @@ -105,14 +108,17 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return (IClassLoader[]) loaders.toArray(new IClassLoader[loaders.size()]); } + @Override public IClassLoader getLoader(ClassLoaderReference loaderRef) { return getHierarchy(loaderRef).getLoader(loaderRef); } + @Override public boolean addClass(IClass klass) { return getHierarchy(klass).addClass(klass); } + @Override public int getNumberOfClasses() { int total = 0; for (Iterator ldrs = analysisScope.getLoaders().iterator(); ldrs.hasNext();) { @@ -122,43 +128,53 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { return total; } + @Override public boolean isRootClass(IClass c) { return getHierarchy(c).isRootClass(c); } + @Override public IClass getRootClass() { Assertions.UNREACHABLE(); return null; } + @Override public int getNumber(IClass c) { return getHierarchy(c).getNumber(c); } + @Override public Set getPossibleTargets(MethodReference ref) { return getHierarchy(ref).getPossibleTargets(ref); } + @Override public Set getPossibleTargets(IClass receiverClass, MethodReference ref) { return getHierarchy(ref).getPossibleTargets(receiverClass, ref); } + @Override public IMethod resolveMethod(MethodReference m) { return getHierarchy(m).resolveMethod(m); } + @Override public IField resolveField(FieldReference f) { return getHierarchy(f).resolveField(f); } + @Override public IField resolveField(IClass klass, FieldReference f) { return getHierarchy(klass).resolveField(klass, f); } + @Override public IMethod resolveMethod(IClass receiver, Selector selector) { return getHierarchy(receiver).resolveMethod(receiver, selector); } + @Override public IClass lookupClass(TypeReference A) { return getHierarchy(A).lookupClass(A); } @@ -167,56 +183,70 @@ public class CrossLanguageClassHierarchy implements IClassHierarchy { // return getHierarchy(c).isSyntheticClass(c); // } + @Override public boolean isInterface(TypeReference type) { return getHierarchy(type).isInterface(type); } + @Override public IClass getLeastCommonSuperclass(IClass A, IClass B) { return getHierarchy(A).getLeastCommonSuperclass(A, B); } + @Override public TypeReference getLeastCommonSuperclass(TypeReference A, TypeReference B) { return getHierarchy(A).getLeastCommonSuperclass(A, B); } + @Override public boolean isSubclassOf(IClass c, IClass T) { return getHierarchy(c).isSubclassOf(c, T); } + @Override public boolean implementsInterface(IClass c, IClass i) { return getHierarchy(c).implementsInterface(c, i); } + @Override public Collection computeSubClasses(TypeReference type) { return getHierarchy(type).computeSubClasses(type); } + @Override public Collection getJavaLangRuntimeExceptionTypes() { return getHierarchy(TypeReference.JavaLangRuntimeException).getJavaLangErrorTypes(); } + @Override public Collection getJavaLangErrorTypes() { return getHierarchy(TypeReference.JavaLangError).getJavaLangErrorTypes(); } + @Override public Set getImplementors(TypeReference type) { return getHierarchy(type).getImplementors(type); } + @Override public int getNumberOfImmediateSubclasses(IClass klass) { return getHierarchy(klass).getNumberOfImmediateSubclasses(klass); } + @Override public Collection getImmediateSubclasses(IClass klass) { return getHierarchy(klass).getImmediateSubclasses(klass); } + @Override public boolean isAssignableFrom(IClass c1, IClass c2) { return getHierarchy(c1).isAssignableFrom(c1, c2); } + @Override public Iterator iterator() { return new ComposedIterator(analysisScope.getLoaders().iterator()) { + @Override public Iterator makeInner(ClassLoaderReference o) { IClassLoader ldr = getLoader(o); return ldr.iterateAllClasses(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java index dc02115a3..3a5c10056 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/lexical/LexicalModRef.java @@ -58,6 +58,7 @@ public class LexicalModRef { Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + @Override public Collection> apply(CGNode n) { return scanNodeForLexReads(n); } @@ -74,6 +75,7 @@ public class LexicalModRef { Map>> scan = CallGraphTransitiveClosure.collectNodeResults(cg, new Function>>() { + @Override public Collection> apply(CGNode n) { return scanNodeForLexWrites(n); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java index 77dfc6b47..c1dc97d24 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/modref/AstModRef.java @@ -39,43 +39,53 @@ public class AstModRef extends ModRef { super(n, result, pa, h); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } } + @Override protected RefVisitor makeRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { return new AstRefVisitor(n, result, pa, h); } @@ -89,38 +99,47 @@ public class AstModRef extends ModRef { super(n, result, h, pa, true); } + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java index 8f84f280d..e8ff6ebe9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/AstInducedCFG.java @@ -37,34 +37,43 @@ public class AstInducedCFG extends InducedCFG { super(r); } + @Override public void visitAstLexicalRead(AstLexicalRead inst) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite inst) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } @@ -76,38 +85,49 @@ public class AstInducedCFG extends InducedCFG { super(r); } + @Override public void visitAstLexicalRead(AstLexicalRead inst) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite inst) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } } + @Override protected BranchVisitor makeBranchVisitor(boolean[] r) { return new AstBranchVisitor(r); } + @Override protected PEIVisitor makePEIVisitor(boolean[] r) { return new AstPEIVisitor(r); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java index a704c2acd..77bd61ce3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/cfg/DelegatingCFG.java @@ -29,54 +29,67 @@ public class DelegatingCFG> extends AbstractNumbered this.parent = parent; } + @Override protected NumberedNodeManager getNodeManager() { return parent; } + @Override protected NumberedEdgeManager getEdgeManager() { return parent; } + @Override public T entry() { return parent.entry(); } + @Override public T exit() { return parent.exit(); } + @Override public BitVector getCatchBlocks() { return parent.getCatchBlocks(); } + @Override public T getBlockForInstruction(int index) { return parent.getBlockForInstruction(index); } + @Override public I[] getInstructions() { return parent.getInstructions(); } + @Override public int getProgramCounter(int index) { return parent.getProgramCounter(index); } + @Override public IMethod getMethod() { return parent.getMethod(); } + @Override public List getExceptionalSuccessors(T b) { return parent.getExceptionalSuccessors(b); } + @Override public Collection getNormalSuccessors(T b) { return parent.getNormalSuccessors(b); } + @Override public Collection getExceptionalPredecessors(T b) { return parent.getExceptionalPredecessors(b); } + @Override public Collection getNormalPredecessors(T b) { return parent.getNormalPredecessors(b); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java index d757cd8a1..28f575973 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractLexicalInvoke.java @@ -45,6 +45,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru this.lexicalWrites = lexicalWrites; } + @Override public int getNumberOfUses() { if (lexicalReads == null) return getNumberOfParameters(); @@ -76,6 +77,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru } } + @Override public int getUse(int j) { assert j >= getNumberOfParameters(); assert lexicalReads != null; @@ -83,6 +85,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru return lexicalReads[j - getNumberOfParameters()].valueNumber; } + @Override public int getNumberOfDefs() { if (lexicalWrites == null) return super.getNumberOfDefs(); @@ -90,6 +93,7 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru return super.getNumberOfDefs() + lexicalWrites.length; } + @Override public int getDef(int j) { if (j < super.getNumberOfDefs()) return super.getDef(j); @@ -132,10 +136,12 @@ public abstract class AbstractLexicalInvoke extends MultiReturnValueInvokeInstru return lexicalWrites[i - super.getNumberOfDefs()]; } + @Override public int hashCode() { return site.hashCode() * 7529; } + @Override public String toString(SymbolTable symbolTable) { StringBuffer s = new StringBuffer(super.toString(symbolTable)); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java index fcf756105..301a789d8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectiveGet.java @@ -28,6 +28,7 @@ public abstract class AbstractReflectiveGet extends ReflectiveMemberAccess { this.result = result; } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, result) + " = " + super.toString(symbolTable); } @@ -35,14 +36,17 @@ public abstract class AbstractReflectiveGet extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getDef() */ + @Override public boolean hasDef() { return true; } + @Override public int getDef() { return result; } + @Override public int getDef(int i) { return result; } @@ -50,10 +54,12 @@ public abstract class AbstractReflectiveGet extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getNumberOfUses() */ + @Override public int getNumberOfUses() { return 2; } + @Override public int getNumberOfDefs() { return 1; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java index e2afea811..2699a6d57 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AbstractReflectivePut.java @@ -28,6 +28,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { this.value = value; } + @Override public String toString(SymbolTable symbolTable) { return super.toString(symbolTable) + " = " + getValueString(symbolTable, value); } @@ -35,6 +36,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getDef() */ + @Override public int getDef() { return -1; } @@ -42,6 +44,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { /** * @see com.ibm.wala.ssa.Instruction#getNumberOfUses() */ + @Override public int getNumberOfUses() { return 3; } @@ -50,6 +53,7 @@ public abstract class AbstractReflectivePut extends ReflectiveMemberAccess { return getUse(2); } + @Override public int getUse(int index) { if (index == 2) return value; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java index 76cc1d1f3..5c635cfdd 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AssignInstruction.java @@ -40,6 +40,7 @@ public class AssignInstruction extends SSAUnaryOpInstruction { /* * @see com.ibm.wala.ssa.SSAInstruction#copyForSSA(int[], int[]) */ + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory) insts) .AssignInstruction(defs == null ? getDef(0) : defs[0], uses == null ? getUse(0) : uses[0]); @@ -48,6 +49,7 @@ public class AssignInstruction extends SSAUnaryOpInstruction { /* * @see com.ibm.wala.ssa.SSAInstruction#toString(com.ibm.wala.ssa.SymbolTable, com.ibm.wala.ssa.ValueDecorator) */ + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, result) + " := " + getValueString(symbolTable, val); } @@ -55,6 +57,7 @@ public class AssignInstruction extends SSAUnaryOpInstruction { /* * @see com.ibm.wala.ssa.SSAInstruction#visit(com.ibm.wala.ssa.SSAInstruction.Visitor) */ + @Override public void visit(IVisitor v) { ((AstPreInstructionVisitor) v).visitAssign(this); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java index c189d7ed3..9fd7b7b00 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAbstractInstructionVisitor.java @@ -17,38 +17,47 @@ public abstract class AstAbstractInstructionVisitor implements AstInstructionVisitor { + @Override public void visitAstLexicalRead(AstLexicalRead instruction) { } + @Override public void visitAstLexicalWrite(AstLexicalWrite instruction) { } + @Override public void visitAstGlobalRead(AstGlobalRead instruction) { } + @Override public void visitAstGlobalWrite(AstGlobalWrite instruction) { } + @Override public void visitAssert(AstAssertInstruction instruction) { } + @Override public void visitEachElementGet(EachElementGetInstruction inst) { } + @Override public void visitEachElementHasNext(EachElementHasNextInstruction inst) { } + @Override public void visitIsDefined(AstIsDefinedInstruction inst) { } + @Override public void visitEcho(AstEchoInstruction inst) { } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java index 68029ea3e..9fe8c773f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstAssertInstruction.java @@ -37,35 +37,43 @@ public class AstAssertInstruction extends SSAInstruction { this.fromSpecification = fromSpecification; } + @Override public int getNumberOfUses() { return 1; } + @Override public int getUse(int i) { assert i == 0; return value; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).AssertInstruction(uses == null ? value : uses[0], fromSpecification); } + @Override public String toString(SymbolTable symbolTable) { return "assert " + getValueString(symbolTable, value) + " (fromSpec: " + fromSpecification + ")"; } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitAssert(this); } + @Override public int hashCode() { return 2177 * value; } + @Override public Collection getExceptionTypes() { return null; } + @Override public boolean isFallThrough() { return true; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java index ec76537a3..ff47576d5 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstConstants.java @@ -18,6 +18,7 @@ public interface AstConstants { public enum BinaryOp implements IBinaryOpInstruction.IOperator { CONCAT, EQ, NE, LT, GE, GT, LE, STRICT_EQ, STRICT_NE; + @Override public String toString() { return super.toString().toLowerCase(); } @@ -26,6 +27,7 @@ public interface AstConstants { public enum UnaryOp implements IUnaryOpInstruction.IOperator { MINUS, BITNOT, PLUS; + @Override public String toString() { return super.toString().toLowerCase(); } 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 e33aecd2d..5109ddbc6 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 @@ -26,27 +26,33 @@ public class AstEchoInstruction extends SSAInstruction { this.rvals = rvals; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).EchoInstruction(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 i = 0;i < rvals.length; i++) { @@ -56,6 +62,7 @@ public class AstEchoInstruction extends SSAInstruction { return v; } + @Override public String toString(SymbolTable symbolTable) { StringBuffer result = new StringBuffer("echo/print "); for(int i = 0; i < rvals.length; i++) { @@ -65,14 +72,17 @@ public class AstEchoInstruction extends SSAInstruction { return result.toString(); } + @Override public void visit(IVisitor v) { ((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/AstGlobalRead.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalRead.java index ace71ce68..333e4787e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalRead.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalRead.java @@ -30,23 +30,28 @@ public class AstGlobalRead extends SSAGetInstruction { super(lhs, global); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).GlobalRead((defs==null)? getDef(): defs[0], getDeclaredField()); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef()) + " = global:" + getGlobalName(); } + @Override public void visit(IVisitor v) { if (v instanceof AstInstructionVisitor) ((AstInstructionVisitor)v).visitAstGlobalRead(this); } + @Override public boolean isFallThrough() { return true; } + @Override public Collection getExceptionTypes() { return null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java index 85d9dc773..5bf5130d4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstGlobalWrite.java @@ -30,23 +30,28 @@ public class AstGlobalWrite extends SSAPutInstruction { super(rhs, global); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).GlobalWrite(getDeclaredField(), (uses==null)? getVal(): uses[0]); } + @Override public String toString(SymbolTable symbolTable) { return "global:" + getGlobalName() + " = " + getValueString(symbolTable,getVal()); } + @Override public void visit(IVisitor v) { if (v instanceof AstInstructionVisitor) ((AstInstructionVisitor)v).visitAstGlobalWrite(this); } + @Override public boolean isFallThrough() { return true; } + @Override public Collection getExceptionTypes() { return null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java index ebaf873c8..c74257fc2 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIsDefinedInstruction.java @@ -77,6 +77,7 @@ public class AstIsDefinedInstruction extends SSAInstruction { this.fieldRef = null; } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { assert fieldVal == -1 || fieldRef == null; @@ -84,6 +85,7 @@ public class AstIsDefinedInstruction extends SSAInstruction { (uses == null || fieldVal == -1) ? fieldVal : uses[1], fieldRef); } + @Override public String toString(SymbolTable symbolTable) { if (fieldVal == -1 && fieldRef == null) { return getValueString(symbolTable, lval) + " = isDefined(" + getValueString(symbolTable, rval) + ")"; @@ -99,36 +101,44 @@ public class AstIsDefinedInstruction extends SSAInstruction { } } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitIsDefined(this); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } + @Override public boolean hasDef() { return true; } + @Override public int getDef() { return lval; } + @Override public int getDef(int i) { assert i == 0; return lval; } + @Override public int getNumberOfDefs() { return 1; } + @Override public int getNumberOfUses() { return (fieldVal == -1) ? 1 : 2; } + @Override public int getUse(int j) { if (j == 0) { return rval; @@ -140,10 +150,12 @@ public class AstIsDefinedInstruction extends SSAInstruction { } } + @Override public boolean isFallThrough() { return true; } + @Override public int hashCode() { return 3077 * fieldVal * rval; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java index 29f5cb31a..45aa60bcc 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalAccess.java @@ -54,10 +54,12 @@ public abstract class AstLexicalAccess extends SSAInstruction { return Pair.make(variableName, variableDefiner); } + @Override public int hashCode() { return variableName.hashCode() * valueNumber; } + @Override public boolean equals(Object other) { return (other instanceof Access) && variableName.equals( ((Access)other).variableName ) && @@ -67,6 +69,7 @@ public abstract class AstLexicalAccess extends SSAInstruction { variableDefiner.equals(((Access)other).variableDefiner) ); } + @Override public String toString() { return "Access(" + variableName + "@" + variableDefiner + ":" + valueNumber + ")"; } @@ -94,14 +97,17 @@ public abstract class AstLexicalAccess extends SSAInstruction { return accesses.length; } + @Override public boolean isFallThrough() { return true; } + @Override public Collection getExceptionTypes() { return null; } + @Override public int hashCode() { int v = 1; for(int i = 0; i < accesses.length; i++) diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java index 60175fcfd..010e91e23 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalRead.java @@ -36,6 +36,7 @@ public class AstLexicalRead extends AstLexicalAccess { this(new Access(globalName, definer, lhs)); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { if (defs == null) { return new AstLexicalRead(getAccesses()); @@ -50,22 +51,27 @@ public class AstLexicalRead extends AstLexicalAccess { } } + @Override public int getNumberOfDefs() { return getAccessCount(); } + @Override public int getDef(int i) { return getAccess(i).valueNumber; } + @Override public int getNumberOfUses() { return 0; } + @Override public int getUse(int i) { throw new UnsupportedOperationException(); } + @Override public String toString(SymbolTable symbolTable) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < getAccessCount(); i++) { @@ -82,6 +88,7 @@ public class AstLexicalRead extends AstLexicalAccess { return sb.toString(); } + @Override public void visit(IVisitor v) { assert v instanceof AstInstructionVisitor; ((AstInstructionVisitor) v).visitAstLexicalRead(this); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java index 9324b5ac0..0fc1241a2 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstLexicalWrite.java @@ -36,6 +36,7 @@ public class AstLexicalWrite extends AstLexicalAccess { super(accesses); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { if (uses == null) { return new AstLexicalWrite(getAccesses()); @@ -50,22 +51,27 @@ public class AstLexicalWrite extends AstLexicalAccess { } } + @Override public int getNumberOfUses() { return getAccessCount(); } + @Override public int getUse(int i) { return getAccess(i).valueNumber; } + @Override public int getNumberOfDefs() { return 0; } + @Override public int getDef(int i) { throw new UnsupportedOperationException(); } + @Override public String toString(SymbolTable symbolTable) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < getAccessCount(); i++) { @@ -83,6 +89,7 @@ public class AstLexicalWrite extends AstLexicalAccess { return sb.toString(); } + @Override public void visit(IVisitor v) { assert v instanceof AstInstructionVisitor; ((AstInstructionVisitor) v).visitAstLexicalWrite(this); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java index c51a19d8f..1e8bd2d10 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementGetInstruction.java @@ -35,18 +35,22 @@ public class EachElementGetInstruction extends SSAAbstractUnaryInstruction { super(lValue, objectRef); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).EachElementGetInstruction((defs == null) ? getDef(0) : defs[0], (uses == null) ? getUse(0) : uses[0]); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef(0)) + " = a property name of " + getValueString(symbolTable, getUse(0)); } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitEachElementGet(this); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java index 8bf5d9463..70ff36363 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/EachElementHasNextInstruction.java @@ -35,18 +35,22 @@ public class EachElementHasNextInstruction extends SSAAbstractUnaryInstruction { super(lValue, objectRef); } + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { return ((AstInstructionFactory)insts).EachElementHasNextInstruction((defs == null) ? getDef(0) : defs[0], (uses == null) ? getUse(0) : uses[0]); } + @Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, getDef(0)) + " = has next property: " + getValueString(symbolTable, getUse(0)); } + @Override public void visit(IVisitor v) { ((AstInstructionVisitor) v).visitEachElementHasNext(this); } + @Override public Collection getExceptionTypes() { return Collections.emptySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java index ccf036fcd..052776045 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/FixedParametersLexicalInvokeInstruction.java @@ -59,6 +59,7 @@ public abstract class FixedParametersLexicalInvokeInstruction protected abstract SSAInstruction copyInstruction(SSAInstructionFactory insts, int result[], int[] params, int exception, Access[] lexicalReads, Access[] lexicalWrites); + @Override public SSAInstruction copyForSSA(SSAInstructionFactory insts, int[] defs, int[] uses) { int newParams[] = params; Access[] reads = lexicalReads; @@ -104,6 +105,7 @@ public abstract class FixedParametersLexicalInvokeInstruction return copyInstruction(insts, newLvals, newParams, newExp, reads, writes); } + @Override public int getNumberOfParameters() { if (params == null) { return 0; @@ -115,6 +117,7 @@ public abstract class FixedParametersLexicalInvokeInstruction /** * @see com.ibm.wala.ssa.Instruction#getUse(int) */ + @Override public int getUse(int j) { if (j < getNumberOfParameters()) return params[j]; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java index c74e8d0cc..1688ff92d 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/MultiReturnValueInvokeInstruction.java @@ -23,10 +23,12 @@ abstract class MultiReturnValueInvokeInstruction this.results = results; } + @Override public int getNumberOfReturnValues() { return results==null? 0: results.length; } + @Override public int getReturnValue(int i) { return results[i]; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java index 17fe6ba00..235f95d32 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/analysis/LiveAnalysis.java @@ -86,14 +86,17 @@ public class LiveAnalysis { * Gen/kill operator specific to exit basic blocks */ final class ExitBlockGenKillOperator extends UnaryOperator { + @Override public String toString() { return "ExitGenKill"; } + @Override public boolean equals(Object o) { return o == this; } + @Override public int hashCode() { return 37721; } @@ -101,6 +104,7 @@ public class LiveAnalysis { /** * Evaluate the transfer between two nodes in the flow graph within an exit block. */ + @Override public byte evaluate(BitVectorVariable lhs, BitVectorVariable rhs) { boolean changed = lhs.getValue() == null ? !considerLiveAtExit.isZero() : !lhs.getValue().sameValue(liveAtExit); @@ -120,14 +124,17 @@ public class LiveAnalysis { this.block = block; } + @Override public String toString() { return "GenKill:" + block; } + @Override public boolean equals(Object o) { return (o instanceof BlockValueGenKillOperator) && ((BlockValueGenKillOperator) o).block.equals(block); } + @Override public int hashCode() { return block.hashCode() * 17; } @@ -156,6 +163,7 @@ public class LiveAnalysis { /** * Evaluate the transfer between two nodes in the flow graph within one basic block. */ + @Override public byte evaluate(BitVectorVariable lhs, BitVectorVariable rhs) { // Calculate here the result of the transfer BitVectorIntSet bits = new BitVectorIntSet(); @@ -204,17 +212,21 @@ public class LiveAnalysis { final BitVectorSolver S = new BitVectorSolver(new IKilldallFramework() { private final Graph G = GraphInverter.invert(cfg); + @Override public Graph getFlowGraph() { return G; } + @Override public ITransferFunctionProvider getTransferFunctionProvider() { return new ITransferFunctionProvider() { + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public boolean hasEdgeTransferFunctions() { return false; } @@ -222,6 +234,7 @@ public class LiveAnalysis { /** * Create the specialized operator for regular and exit basic blocks. */ + @Override public UnaryOperator getNodeTransferFunction(ISSABasicBlock node) { if (node.isExitBlock()) { return new ExitBlockGenKillOperator(); @@ -230,6 +243,7 @@ public class LiveAnalysis { } } + @Override public UnaryOperator getEdgeTransferFunction(ISSABasicBlock s, ISSABasicBlock d) { Assertions.UNREACHABLE(); return null; @@ -238,6 +252,7 @@ public class LiveAnalysis { /** * Live analysis uses 'union' as 'meet operator' */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } @@ -259,6 +274,7 @@ public class LiveAnalysis { */ return new Result() { + @Override public String toString() { StringBuffer s = new StringBuffer(); for (int i = 0; i < cfg.getNumberOfNodes(); i++) { @@ -270,10 +286,12 @@ public class LiveAnalysis { return s.toString(); } + @Override public boolean isLiveEntry(ISSABasicBlock bb, int valueNumber) { return S.getOut(bb).get(valueNumber); } + @Override public boolean isLiveExit(ISSABasicBlock bb, int valueNumber) { return S.getIn(bb).get(valueNumber); } @@ -285,6 +303,7 @@ public class LiveAnalysis { * @see * how the 'in' and 'out' variable sets work */ + @Override public BitVector getLiveBefore(int instr) { ISSABasicBlock bb = cfg.getBlockForInstruction(instr); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java index c4782e5a7..46faaf4d0 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractClassEntity.java @@ -15,22 +15,27 @@ public class AbstractClassEntity extends AbstractDataEntity { this.type = type; } + @Override public String toString() { return "class " + type.getName(); } + @Override public int getKind() { return TYPE_ENTITY; } + @Override public String getName() { return type.getName(); } + @Override public CAstType getType() { return type; } + @Override public Collection getQualifiers() { return type.getQualifiers(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java index 61f296f5b..81f086265 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractCodeEntity.java @@ -28,22 +28,27 @@ public abstract class AbstractCodeEntity extends AbstractEntity { this.type = type; } + @Override public CAstNode getAST() { return Ast; } + @Override public CAstType getType() { return type; } + @Override public CAstControlFlowMap getControlFlow() { return cfg; } + @Override public CAstSourcePositionMap getSourceMap() { return src; } + @Override public CAstNodeTypeMap getNodeTypeMap() { return types; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java index 0ffeabe7a..78b53c112 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractDataEntity.java @@ -9,30 +9,37 @@ import com.ibm.wala.cast.tree.CAstNodeTypeMap; import com.ibm.wala.cast.tree.CAstSourcePositionMap; abstract class AbstractDataEntity extends AbstractEntity { + @Override public CAstNode getAST() { return null; } + @Override public CAstControlFlowMap getControlFlow() { return null; } + @Override public CAstSourcePositionMap getSourceMap() { return null; } + @Override public CAstNodeTypeMap getNodeTypeMap() { return null; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java index f0c9c99e9..c2604e809 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractEntity.java @@ -21,16 +21,19 @@ public abstract class AbstractEntity implements CAstEntity { private final Map> scopedEntities = HashMapFactory.make(); + @Override public Map> getAllScopedEntities() { return scopedEntities; } + @Override public String getSignature() { Assertions.UNREACHABLE(); return null; } + @Override public Collection getAnnotations() { return null; } @@ -39,10 +42,12 @@ public abstract class AbstractEntity implements CAstEntity { sourcePosition = pos; } + @Override public Position getPosition() { return sourcePosition; } + @Override public Iterator getScopedEntities(CAstNode construct) { if (scopedEntities.containsKey(construct)) { return scopedEntities.get(construct).iterator(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java index 0f1f1f11e..90cc2d8e4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractFieldEntity.java @@ -32,23 +32,28 @@ class AbstractFieldEntity extends AbstractDataEntity { } } + @Override public String toString() { return "field " + name + " of " + declaringClass.getName(); } + @Override public int getKind() { return FIELD_ENTITY; } + @Override public String getName() { return name; } + @Override public CAstType getType() { Assertions.UNREACHABLE(); return null; } + @Override public Collection getQualifiers() { return modifiers; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java index d5002e32c..9578f64a8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractGlobalEntity.java @@ -26,6 +26,7 @@ public class AbstractGlobalEntity extends AbstractDataEntity { } } + @Override public String toString() { if (type == null) { return "global " + name; @@ -34,18 +35,22 @@ public class AbstractGlobalEntity extends AbstractDataEntity { } } + @Override public int getKind() { return GLOBAL_ENTITY; } + @Override public String getName() { return name; } + @Override public CAstType getType() { return type; } + @Override public Collection getQualifiers() { return modifiers; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java index ecb6ff5de..301973d57 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AbstractScriptEntity.java @@ -23,6 +23,7 @@ public class AbstractScriptEntity extends AbstractCodeEntity { this(new File(file), type); } + @Override public int getKind() { return SCRIPT_ENTITY; } @@ -31,26 +32,32 @@ public class AbstractScriptEntity extends AbstractCodeEntity { return file; } + @Override public String getName() { return "script " + file.getName(); } + @Override public String toString() { return "script " + file.getName(); } + @Override public String[] getArgumentNames() { return new String[] { "script object" }; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 1; } + @Override public Collection getQualifiers() { return Collections.emptySet(); } 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 3ce431333..6c8a29b34 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 @@ -158,11 +158,13 @@ public abstract class AstTranslator extends CAstVisitor instructions = new ArrayList(); + @Override public int getNumber() { return getGraphNodeId(); } + @Override public int getGraphNodeId() { return number; } + @Override public void setGraphNodeId(int number) { this.number = number; } + @Override public int getFirstInstructionIndex() { return firstIndex; } @@ -554,6 +563,7 @@ public abstract class AstTranslator extends CAstVisitor -1) && (instructions.get(0) instanceof SSAGetCaughtExceptionInstruction); } + @Override public IMethod getMethod() { return null; } + @Override public Iterator iterator() { return instructions.iterator(); } @@ -624,10 +640,12 @@ public abstract class AstTranslator extends CAstVisitor, CAstNode> nodeMap, CAstNode oldSource, Object label, CAstNode oldTarget, CAstControlFlowMap orig, CAstSourcePositionMap src) { if (exception && !isExceptionLabel(label)) { @@ -734,10 +753,12 @@ public abstract class AstTranslator extends CAstVisitor>make() : null; if (hasDeadBlocks) { transferEdges(liveBlocks, icfg, new EdgeOperation() { + @Override public void act(PreBasicBlock src, PreBasicBlock dst) { if (! normalEdges.containsKey(src)) { normalEdges.put(src, HashSetFactory.make()); @@ -1116,6 +1139,7 @@ public abstract class AstTranslator extends CAstVisitormake()); @@ -1167,10 +1191,12 @@ public abstract class AstTranslator extends CAstVisitor getAllNames() { return values.keySet().iterator(); } + @Override public int allocateTempValue() { return getUnderlyingSymtab().newSymbol(); } + @Override public int getConstantValue(Object o) { if (o instanceof Integer) { return getUnderlyingSymtab().getConstant(((Integer) o).intValue()); @@ -1446,14 +1494,17 @@ public abstract class AstTranslator extends CAstVisitor getAllNames() { return globalSymbols.keySet().iterator(); } + @Override public int allocateTempValue() { throw new UnsupportedOperationException(); } + @Override public int getConstantValue(Object c) { throw new UnsupportedOperationException(); } + @Override public boolean isConstant(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public Object getConstantObject(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public ScopeType type() { return ScopeType.GLOBAL; } + @Override public boolean contains(String name) { return hasImplicitGlobals() || globalSymbols.containsKey(mapName(name)); } + @Override public boolean isCaseInsensitive(String name) { return caseInsensitiveNames.containsKey(name.toLowerCase()); } + @Override public Symbol lookup(final String name) { if (!globalSymbols.containsKey(mapName(name))) { if (hasImplicitGlobals()) { declare(new CAstSymbol() { + @Override public String name() { return name; } + @Override public boolean isFinal() { return false; } + @Override public boolean isCaseInsensitive() { return false; } + @Override public boolean isInternalName() { return false; } + @Override public Object defaultInitValue() { return null; } @@ -1851,29 +1963,35 @@ public abstract class AstTranslator extends CAstVisitor getAllNames() { return typeSymbols.keySet().iterator(); } + @Override public int allocateTempValue() { throw new UnsupportedOperationException(); } + @Override public int getConstantValue(Object c) { throw new UnsupportedOperationException(); } + @Override public boolean isConstant(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public Object getConstantObject(int valueNumber) { throw new UnsupportedOperationException(); } + @Override public ScopeType type() { return ScopeType.TYPE; } + @Override public boolean contains(String name) { return typeSymbols.containsKey(mapName(name)); } + @Override public boolean isCaseInsensitive(String name) { return caseInsensitiveNames.containsKey(name.toLowerCase()); } + @Override public Symbol lookup(String nm) { if (typeSymbols.containsKey(mapName(nm))) return typeSymbols.get(mapName(nm)); @@ -1951,29 +2083,35 @@ public abstract class AstTranslator extends CAstVisitor getAccesses(CAstEntity e) { return parent.getAccesses(e); } + @Override public ModuleEntry getModule() { return parent.getModule(); } + @Override public String getName() { return parent.getName(); } + @Override public String file() { return parent.file(); } + @Override public CAstEntity top() { return parent.top(); } + @Override public CAstSourcePositionMap getSourceMap() { return parent.getSourceMap(); } + @Override public CAstControlFlowMap getControlFlow() { return parent.getControlFlow(); } + @Override public Scope currentScope() { return parent.currentScope(); } + @Override public Set entityScopes() { return parent.entityScopes(); } + @Override public IncipientCFG cfg() { return parent.cfg(); } + @Override public UnwindState getUnwindState() { return parent.getUnwindState(); } + @Override public void setCatchType(IBasicBlock bb, TypeReference catchType) { parent.setCatchType(bb, catchType); } + @Override public void setCatchType(CAstNode catchNode, TypeReference catchType) { parent.setCatchType(catchNode, catchType); } + @Override public Map getCatchTypes() { return parent.getCatchTypes(); } + @Override public void addEntityName(CAstEntity e, String name) { parent.addEntityName(e, name); } + @Override public String getEntityName(CAstEntity e) { return parent.getEntityName(e); } + @Override public boolean hasValue(CAstNode n) { return parent.hasValue(n); } + @Override public int setValue(CAstNode n, int v) { return parent.setValue(n, v); } + @Override public int getValue(CAstNode n) { return parent.getValue(n); } + @Override public Set, Integer>> exposeNameSet(CAstEntity entity, boolean writeSet) { return parent.exposeNameSet(entity, writeSet); } + @Override public Scope getGlobalScope() { return parent.getGlobalScope(); } @@ -2127,6 +2287,7 @@ public abstract class AstTranslator extends CAstVisitor getAccesses(CAstEntity e) { if (e == topNode) { if (accesses == null) { @@ -2233,30 +2399,37 @@ public abstract class AstTranslator extends CAstVisitor entityScopes() { return allEntityScopes; } + @Override public UnwindState getUnwindState() { return null; } + @Override public void setCatchType(CAstNode catchNode, TypeReference catchType) { setCatchType(cfg.getBlock(catchNode), catchType); } + @Override public void setCatchType(IBasicBlock bb, TypeReference catchType) { if (! catchTypes.containsKey(bb)) { catchTypes.put(bb, new TypeReference[] { catchType }); @@ -2277,19 +2450,23 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return catchTypes; } + @Override public boolean hasValue(CAstNode n) { return results.containsKey(n); } + @Override public final int setValue(CAstNode n, int v) { results.put(n, new Integer(v)); return v; } + @Override public final int getValue(CAstNode n) { if (results.containsKey(n)) return results.get(n).intValue(); @@ -2309,16 +2486,19 @@ public abstract class AstTranslator extends CAstVisitor[] getExposedNames() { return exposedNames; } + @Override public String[] getScopingParents() { return scopingParents; } + @Override public boolean isReadOnly(String name) { return readOnlyNames != null && readOnlyNames.contains(name); } + @Override public String getScopingName() { return functionLexicalName; } @@ -2799,14 +2987,17 @@ public abstract class AstTranslator extends CAstVisitor visitor) { if (DEBUG_TOP) System.err.println(("translating " + n.getName())); return false; } + @Override protected boolean visitFileEntity(CAstEntity n, WalkContext context, WalkContext fileContext, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFileEntity(CAstEntity n, WalkContext context, WalkContext fileContext, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitFieldEntity(CAstEntity n, WalkContext context, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFieldEntity(CAstEntity n, WalkContext context, CAstVisitor visitor) { // Define a new field in the enclosing type, if the language we're // processing allows such. @@ -2842,23 +3038,28 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveGlobalEntity(CAstEntity n, WalkContext context, 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())); } + @Override protected boolean visitTypeEntity(CAstEntity n, WalkContext context, WalkContext typeContext, CAstVisitor visitor) { return !defineType(n, (WalkContext) context); } + @Override protected void leaveTypeEntity(CAstEntity n, WalkContext context, WalkContext typeContext, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitFunctionEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { if (n.getAST() == null) // presumably abstract declareFunction(n, (WalkContext) context); @@ -2867,21 +3068,25 @@ public abstract class AstTranslator extends CAstVisitor visitor) { if (n.getAST() != null) // non-abstract closeFunctionEntity(n, (WalkContext) context, (WalkContext) codeContext); } + @Override protected boolean visitMacroEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { return true; } + @Override protected boolean visitScriptEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { declareFunction(n, (WalkContext) codeContext); initFunctionEntity(n, (WalkContext) context, (WalkContext) codeContext); return false; } + @Override protected void leaveScriptEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor visitor) { closeFunctionEntity(n, (WalkContext) context, (WalkContext) codeContext); } @@ -2928,10 +3133,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { // here, n represents the "finally" block of the unwind return new UnwindContext(n, (WalkContext) context, visitor); @@ -2947,19 +3154,23 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFunctionExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { int result = processFunctionExpr(n, c); c.setValue(n, result); } + @Override protected boolean visitFunctionStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveFunctionStmt(CAstNode n, WalkContext context, CAstVisitor visitor) { int result = processFunctionExpr(n, context); CAstEntity fn = (CAstEntity) n.getChild(0).getValue(); @@ -2977,29 +3188,36 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveLocalScope(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(0))); } + @Override protected boolean visitBlockExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(n.getChildCount() - 1))); } + @Override protected boolean visitBlockStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitLoop(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; // loop test block @@ -3034,16 +3252,20 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveLoop(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitGetCaughtException(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveGetCaughtException(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; String nm = (String) n.getChild(0).getValue(); @@ -3053,22 +3275,27 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveThis(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, 1); } + @Override protected boolean visitSuper(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveSuper(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, 1); } + @Override protected boolean visitCall(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3076,6 +3303,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3089,10 +3317,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveVar(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; String nm = (String) n.getChild(0).getValue(); @@ -3108,15 +3338,18 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveConstant(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; c.setValue(n, context.currentScope().getConstantValue(n.getValue())); } + @Override protected boolean visitBinaryExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3146,6 +3379,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3165,6 +3399,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3172,6 +3407,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3179,6 +3415,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3186,6 +3423,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3193,10 +3431,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayRef(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int arrayValue = c.getValue(n.getChild(0)); @@ -3205,11 +3445,13 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } // TODO: should we handle exploded declaration nodes here instead? + @Override protected void leaveDeclStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { CAstSymbol s = (CAstSymbol) n.getChild(0).getValue(); String nm = s.name(); @@ -3230,10 +3472,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveReturn(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (n.getChildCount() > 0) { @@ -3247,10 +3491,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveIfgoto(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (n.getChildCount() == 1) { @@ -3270,10 +3516,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveGoto(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (!context.cfg().isDeadBlock(context.cfg().getCurrentBlock())) { @@ -3288,6 +3536,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (!context.getControlFlow().getSourceNodes(n).isEmpty()) { @@ -3297,6 +3546,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } @@ -3344,29 +3594,37 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfStmtTrueClause(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfExprCondition(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfExprTrueClause(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveIfExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitIfStmt(CAstNode n, WalkContext c, CAstVisitor visitor) { processIf(n, false, c, visitor); return true; } + @Override protected boolean visitIfExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3375,10 +3633,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveNew(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; @@ -3397,10 +3657,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveObjectLiteralFieldInit(CAstNode n, int i, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (n.getChild(i).getKind() == CAstNode.EMPTY) { @@ -3409,27 +3671,33 @@ public abstract class AstTranslator extends CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(0))); } + @Override protected boolean visitArrayLiteral(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayLiteralObject(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(0))); } + @Override protected void leaveArrayLiteralInitElement(CAstNode n, int i, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; arrayOpHandler.doArrayWrite(context, c.getValue(n.getChild(0)), n, new int[] { context.currentScope().getConstantValue(new Integer(i - 1)) }, c.getValue(n.getChild(i))); } + @Override protected void leaveArrayLiteral(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitObjectRef(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3437,6 +3705,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = c.getValue(n); @@ -3444,10 +3713,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override public void leaveAssign(CAstNode n, WalkContext c, CAstVisitor visitor) { if (n.getKind() == CAstNode.ASSIGN) { c.setValue(n, c.getValue(n.getChild(1))); @@ -3483,10 +3754,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayRefAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int rval = c.getValue(v); @@ -3494,10 +3767,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveArrayRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int temp = context.currentScope().allocateTempValue(); @@ -3508,10 +3783,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveObjectRefAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int rval = c.getValue(v); @@ -3522,10 +3799,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveObjectRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int temp = context.currentScope().allocateTempValue(); @@ -3535,22 +3814,27 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockExprAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { c.setValue(n, c.getValue(n.getChild(n.getChildCount() - 1))); } + @Override protected boolean visitBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { /* empty */ c.setValue(n, c.getValue(n.getChild(n.getChildCount() - 1))); } + @Override protected boolean visitVarAssign(CAstNode n, CAstNode v, CAstNode a, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } @@ -3569,6 +3853,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; int rval = c.getValue(v); @@ -3578,10 +3863,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveVarAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; String nm = (String) n.getChild(0).getValue(); @@ -3745,6 +4032,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; if (isSimpleSwitch(n, context, visitor)) { @@ -3756,16 +4044,20 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveSwitch(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitThrow(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveThrow(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; doThrow(context, c.getValue(n.getChild(0))); @@ -3784,6 +4076,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext context = (WalkContext) c; @@ -3814,13 +4107,16 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitUnwind(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveUnwind(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } @@ -3838,6 +4134,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { final WalkContext context = (WalkContext) c; boolean addSkipCatchGoto = false; @@ -3877,25 +4174,31 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ } + @Override protected final void leaveTry(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ } + @Override protected boolean visitEmpty(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveEmpty(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; c.setValue(n, context.currentScope().getConstantValue(null)); } + @Override protected boolean visitPrimitive(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leavePrimitive(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; int result = context.currentScope().allocateTempValue(); @@ -3904,18 +4207,22 @@ public abstract class AstTranslator extends CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveVoid(CAstNode n, WalkContext c, CAstVisitor visitor) { c.setValue(n, -1); } + @Override protected boolean visitAssert(CAstNode n, WalkContext c, CAstVisitor visitor) { /* empty */ return false; } + @Override protected void leaveAssert(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext context = (WalkContext) c; boolean fromSpec = true; @@ -3928,16 +4235,19 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveEachElementGet(CAstNode n, WalkContext c, CAstVisitor visitor) { int result = ((WalkContext) c).currentScope().allocateTempValue(); c.setValue(n, result); ((WalkContext) c).cfg().addInstruction(new EachElementGetInstruction(result, c.getValue(n.getChild(0)))); } + @Override protected boolean visitEachElementHasNext(CAstNode n, WalkContext c, CAstVisitor visitor) { return false; } @@ -3949,10 +4259,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveTypeLiteralExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext wc = (WalkContext) c; assert n.getChild(0).getKind() == CAstNode.CONSTANT; @@ -3966,10 +4278,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveIsDefinedExpr(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext wc = (WalkContext) c; int ref = c.getValue(n.getChild(0)); @@ -3982,10 +4296,12 @@ public abstract class AstTranslator extends CAstVisitor visitor) { return false; } + @Override protected void leaveEcho(CAstNode n, WalkContext c, CAstVisitor visitor) { WalkContext wc = (WalkContext) c; @@ -4006,6 +4322,7 @@ public abstract class AstTranslator extends CAstVisitor visitor) { WalkContext wc = (WalkContext) c; @@ -4037,6 +4354,7 @@ public abstract class AstTranslator extends CAstVisitor, CAstNode> nodeMap) { if (isMacroExpansion && root.getKind() == CAstNode.MACRO_VAR) { int arg = ((Number) root.getChild(0).getValue()).intValue(); @@ -4054,10 +4372,12 @@ public abstract class AstTranslator extends CAstVisitor entityScopes() { return Collections.singleton(globalScope); } + @Override public CAstSourcePositionMap getSourceMap() { return N.getSourceMap(); } + @Override public CAstControlFlowMap getControlFlow() { return N.getControlFlow(); } + @Override public IncipientCFG cfg() { return null; } + @Override public UnwindState getUnwindState() { return null; } + @Override public String getName() { return null; } + @Override public void setCatchType(IBasicBlock bb, TypeReference catchType) { } + @Override public void setCatchType(CAstNode castNode, TypeReference catchType) { } + @Override public Map getCatchTypes() { return null; } + @Override public void addEntityName(CAstEntity e, String name) { entityNames.put(e, name); } + @Override public String getEntityName(CAstEntity e) { if (e == null) { return null; @@ -4150,31 +4485,37 @@ public abstract class AstTranslator extends CAstVisitor, Integer>> exposeNameSet(CAstEntity entity, boolean writeSet) { assert false; return null; } + @Override public Set getAccesses(CAstEntity e) { assert false; return null; } + @Override public Scope getGlobalScope(){ return globalScope; } @@ -4184,6 +4525,7 @@ public abstract class AstTranslator extends CAstVisitor, T> implements WalkContext { + @Override public Map> getScopedEntities() { assert false; return Collections.emptyMap(); } + @Override public void addScopedEntity(CAstNode newNode, CAstEntity visit) { assert false; } + @Override public CAstControlFlowRecorder cfg() { assert false; return null; } + @Override public CAstSourcePositionRecorder pos() { assert false; return null; } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { assert false; return null; } + @Override public T getContinueFor(String label) { assert false; return null; } + @Override public T getBreakFor(String label) { assert false; return null; @@ -128,30 +135,37 @@ public interface TranslatorToCAst { this.parent = parent; } + @Override public CAstControlFlowRecorder cfg() { return parent.cfg(); } + @Override public CAstSourcePositionRecorder pos() { return parent.pos(); } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { return parent.getNodeTypeMap(); } + @Override public T getContinueFor(String label) { return parent.getContinueFor(label); } + @Override public T getBreakFor(String label) { return parent.getBreakFor(label); } + @Override public void addScopedEntity(CAstNode newNode, CAstEntity visit) { parent.addScopedEntity(newNode, visit); } + @Override public Map> getScopedEntities() { return parent.getScopedEntities(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java index cf2bad852..dc09677e0 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstClass.java @@ -56,30 +56,37 @@ abstract public class AstClass implements IClass, ClassConstants { this.typeReference = TypeReference.findOrCreate(loader.getReference(), typeName); } + @Override public boolean isInterface() { return (modifiers & ACC_INTERFACE) != 0; } + @Override public boolean isAbstract() { return (modifiers & ACC_ABSTRACT) != 0; } + @Override public boolean isPublic() { return (modifiers & ACC_PUBLIC) != 0; } + @Override public boolean isPrivate() { return (modifiers & ACC_PRIVATE) != 0; } + @Override public boolean isReferenceType() { return true; } + @Override public boolean isArrayClass() { return false; } + @Override public int getModifiers() { return modifiers; } @@ -92,26 +99,32 @@ abstract public class AstClass implements IClass, ClassConstants { return sourcePosition.getURL(); } + @Override public String getSourceFileName() { return sourcePosition.getURL().getFile(); } + @Override public InputStream getSource() { return null; } + @Override public TypeName getName() { return typeName; } + @Override public TypeReference getReference() { return typeReference; } + @Override public IClassLoader getClassLoader() { return loader; } + @Override public abstract IClass getSuperclass(); private Collection gatherInterfaces() { @@ -123,16 +136,20 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public abstract Collection getDirectInterfaces(); + @Override public Collection getAllImplementedInterfaces() { return gatherInterfaces(); } + @Override public IMethod getClassInitializer() { return getMethod(MethodReference.clinitSelector); } + @Override public IMethod getMethod(Selector selector) { if (declaredMethods.containsKey(selector)) { return declaredMethods.get(selector); @@ -143,6 +160,7 @@ abstract public class AstClass implements IClass, ClassConstants { } } + @Override public IField getField(Atom name) { if (declaredFields.containsKey(name)) { return declaredFields.get(name); @@ -153,14 +171,17 @@ abstract public class AstClass implements IClass, ClassConstants { } } + @Override public IField getField(Atom name, TypeName type) { // assume that for AST classes, you can't have multiple fields with the same name return getField(name); } + @Override public Collection getDeclaredMethods() { return declaredMethods.values(); } + @Override public Collection getDeclaredInstanceFields() { Set result = HashSetFactory.make(); for (Iterator FS = declaredFields.values().iterator(); FS.hasNext();) { @@ -173,6 +194,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getDeclaredStaticFields() { Set result = HashSetFactory.make(); for (Iterator FS = declaredFields.values().iterator(); FS.hasNext();) { @@ -185,6 +207,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllInstanceFields() { Collection result = HashSetFactory.make(); result.addAll(getDeclaredInstanceFields()); @@ -195,6 +218,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllStaticFields() { Collection result = HashSetFactory.make(); result.addAll(getDeclaredStaticFields()); @@ -205,6 +229,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllFields() { Collection result = HashSetFactory.make(); result.addAll(getAllInstanceFields()); @@ -212,6 +237,7 @@ abstract public class AstClass implements IClass, ClassConstants { return result; } + @Override public Collection getAllMethods() { Collection result = HashSetFactory.make(); for (Iterator ms = getDeclaredMethods().iterator(); ms.hasNext();) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java index 91093f3cb..1b3b5c1aa 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstDynamicPropertyClass.java @@ -37,6 +37,7 @@ public abstract class AstDynamicPropertyClass extends AstClass { this.defaultDescriptor = defaultDescriptor; } + @Override public IField getField(final Atom name) { if (declaredFields.containsKey(name)) { return declaredFields.get(name); @@ -45,54 +46,67 @@ public abstract class AstDynamicPropertyClass extends AstClass { } else { final boolean isStatic = isStaticField(name); declaredFields.put(name, new IField() { + @Override public String toString() { return ""; } + @Override public IClass getDeclaringClass() { return AstDynamicPropertyClass.this; } + @Override public Atom getName() { return name; } + @Override public TypeReference getFieldTypeReference() { return defaultDescriptor; } + @Override public FieldReference getReference() { return FieldReference.findOrCreate(AstDynamicPropertyClass.this.getReference(), name, defaultDescriptor); } + @Override public boolean isFinal() { return false; } + @Override public boolean isPrivate() { return false; } + @Override public boolean isProtected() { return false; } + @Override public boolean isPublic() { return false; } + @Override public boolean isVolatile() { return false; } + @Override public boolean isStatic() { return isStatic; } + @Override public IClassHierarchy getClassHierarchy() { return AstDynamicPropertyClass.this.getClassHierarchy(); } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java index 65fd4a827..ce723f35e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstField.java @@ -43,54 +43,67 @@ public class AstField implements IField { } + @Override public Collection getAnnotations() { return annotations; } + @Override public IClass getDeclaringClass() { return declaringClass; } + @Override public String toString() { return "field " + ref.getName(); } + @Override public Atom getName() { return ref.getName(); } + @Override public TypeReference getFieldTypeReference() { return ref.getFieldType(); } + @Override public FieldReference getReference() { return ref; } + @Override public boolean isStatic() { return qualifiers.contains(CAstQualifier.STATIC); } + @Override public boolean isFinal() { return qualifiers.contains(CAstQualifier.CONST) || qualifiers.contains(CAstQualifier.FINAL); } + @Override public boolean isPrivate() { return qualifiers.contains(CAstQualifier.PRIVATE); } + @Override public boolean isProtected() { return qualifiers.contains(CAstQualifier.PROTECTED); } + @Override public boolean isPublic() { return qualifiers.contains(CAstQualifier.PUBLIC); } + @Override public boolean isVolatile() { return qualifiers.contains(CAstQualifier.VOLATILE); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java index 713651a9a..8cbbf15aa 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstFunctionClass.java @@ -53,6 +53,7 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { sourcePosition); } + @Override public String toString() { try { return "function " + functionBody.getReference().getDeclaringClass().getName(); @@ -61,22 +62,27 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { } } + @Override public IClassLoader getClassLoader() { return loader; } + @Override public boolean isInterface() { return false; } + @Override public boolean isAbstract() { return functionBody == null; } + @Override public boolean isPublic() { return true; } + @Override public boolean isPrivate() { return false; } @@ -85,18 +91,22 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { return false; } + @Override public int getModifiers() { return ACC_PUBLIC; } + @Override public IClass getSuperclass() { return loader.lookupClass(superReference.getName()); } + @Override public Collection getDirectInterfaces() { return Collections.emptySet(); } + @Override public Collection getAllImplementedInterfaces() { return Collections.emptySet(); } @@ -105,6 +115,7 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { return Collections.emptySet(); } + @Override public IMethod getMethod(Selector selector) { if (selector.equals(AstMethodReference.fnSelector)) { return functionBody; @@ -113,15 +124,18 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { } } + @Override public IField getField(Atom name) { return loader.lookupClass(superReference.getName()).getField(name); } + @Override public IField getField(Atom name, TypeName type) { // assume that for AST classes, you can't have multiple fields with the same name return loader.lookupClass(superReference.getName()).getField(name); } + @Override public TypeReference getReference() { return reference; } @@ -134,22 +148,27 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { return sourcePosition.getURL(); } + @Override public String getSourceFileName() { return sourcePosition.getURL().getFile(); } + @Override public InputStream getSource() { return null; } + @Override public IMethod getClassInitializer() { return null; } + @Override public boolean isArrayClass() { return false; } + @Override public Collection getDeclaredMethods() { if (functionBody != null) { return Collections.singleton(functionBody); @@ -158,34 +177,42 @@ abstract public class AstFunctionClass implements IClass, ClassConstants { } } + @Override public Collection getDeclaredInstanceFields() { return Collections.emptySet(); } + @Override public Collection getDeclaredStaticFields() { return Collections.emptySet(); } + @Override public Collection getAllInstanceFields() { return Collections.emptySet(); } + @Override public Collection getAllStaticFields() { return Collections.emptySet(); } + @Override public Collection getAllFields() { return Collections.emptySet(); } + @Override public Collection getAllMethods() { return Collections.singleton(functionBody); } + @Override public TypeName getName() { return reference.getName(); } + @Override public boolean isReferenceType() { return true; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java index 65dd81776..96930b887 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java @@ -173,6 +173,7 @@ public abstract class AstMethod implements IMethod { return debugInfo; } + @Override public Collection getAnnotations() { return annotations; } @@ -186,10 +187,12 @@ public abstract class AstMethod implements IMethod { public abstract AstMethod getMethod(); + @Override public int hashCode() { return getName().hashCode() * getMethod().hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof LexicalParent) && getName().equals(((LexicalParent) o).getName()) && getMethod().equals(((LexicalParent) o).getMethod()); @@ -198,78 +201,97 @@ public abstract class AstMethod implements IMethod { public abstract LexicalParent[] getParents(); + @Override public IClass getDeclaringClass() { return cls; } + @Override public String getSignature() { return ref.getSignature(); } + @Override public Selector getSelector() { return ref.getSelector(); } + @Override public boolean isClinit() { return getSelector().equals(MethodReference.clinitSelector); } + @Override public boolean isInit() { return getSelector().getName().equals(MethodReference.initAtom); } + @Override public Atom getName() { return ref.getName(); } + @Override public Descriptor getDescriptor() { return ref.getDescriptor(); } + @Override public MethodReference getReference() { return ref; } + @Override public TypeReference getReturnType() { return ref.getReturnType(); } + @Override public boolean isStatic() { return qualifiers.contains(CAstQualifier.STATIC); } + @Override public boolean isSynchronized() { return qualifiers.contains(CAstQualifier.SYNCHRONIZED); } + @Override public boolean isNative() { return qualifiers.contains(CAstQualifier.NATIVE); } + @Override public boolean isSynthetic() { return false; } + @Override public boolean isAbstract() { return qualifiers.contains(CAstQualifier.ABSTRACT); } + @Override public boolean isPrivate() { return qualifiers.contains(CAstQualifier.PRIVATE); } + @Override public boolean isProtected() { return qualifiers.contains(CAstQualifier.PROTECTED); } + @Override public boolean isPublic() { return qualifiers.contains(CAstQualifier.PUBLIC); } + @Override public boolean isFinal() { return qualifiers.contains(CAstQualifier.FINAL); } + @Override public boolean isBridge() { return qualifiers.contains(CAstQualifier.VOLATILE); } @@ -278,6 +300,7 @@ public abstract class AstMethod implements IMethod { return cfg; } + @Override public boolean hasExceptionHandler() { return hasCatchBlock; } @@ -286,10 +309,12 @@ public abstract class AstMethod implements IMethod { return hasMonitorOp; } + @Override public int getNumberOfParameters() { return symtab.getParameterValueNumbers().length; } + @Override public int getLineNumber(int instructionIndex) { Position pos = debugInfo.getInstructionPosition(instructionIndex); if (pos == null) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java index d7de02e65..1c80e6fb3 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java @@ -75,6 +75,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { private Iterator getMessages(final byte severity) { return new MapIterator>, ModuleEntry>(new FilterIterator>>(errors.entrySet().iterator(), new Filter>>() { + @Override public boolean accepts(Entry> o) { for(Warning w : o.getValue()) { if (w.getLevel() == severity) { @@ -84,6 +85,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { return false; } }), new Function>, ModuleEntry>() { + @Override public ModuleEntry apply(Entry> object) { return object.getKey(); } @@ -112,22 +114,27 @@ public abstract class CAstAbstractLoader implements IClassLoader { return (IClass) types.get(TypeName.string2TypeName(className)); } + @Override public IClass lookupClass(TypeName className) { return (IClass) types.get(className); } + @Override public Iterator iterateAllClasses() { return types.values().iterator(); } + @Override public int getNumberOfClasses() { return types.size(); } + @Override public Atom getName() { return getReference().getName(); } + @Override public int getNumberOfMethods() { int i = 0; for (Iterator cls = types.values().iterator(); cls.hasNext();) { @@ -142,6 +149,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { return i; } + @Override public String getSourceFileName(IMethod method, int bcOffset) { if (!(method instanceof AstMethod)){ return null; @@ -153,10 +161,12 @@ public abstract class CAstAbstractLoader implements IClassLoader { return pos.getURL().getFile(); } + @Override public String getSourceFileName(IClass klass) { return ((AstClass)klass).getSourcePosition().getURL().getFile(); } + @Override public InputStream getSource(IClass klass) { try { return ((AstClass)klass).getSourcePosition().getInputStream(); @@ -165,6 +175,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { } } + @Override public InputStream getSource(IMethod method, int bcOffset) { try { return ((AstMethod)method).getSourcePosition(bcOffset).getInputStream(); @@ -173,11 +184,13 @@ public abstract class CAstAbstractLoader implements IClassLoader { } } + @Override public IClassLoader getParent() { assert parent != null; return parent; } + @Override public void removeAll(Collection toRemove) { Set keys = HashSetFactory.make(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java index 72bfe78e9..68d0f23cc 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractModuleLoader.java @@ -91,6 +91,7 @@ public abstract class CAstAbstractModuleLoader extends CAstAbstractLoader { } + @Override public void init(final List modules) { final CAst ast = new CAstImpl(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java index 04a3dfb62..052eea4d6 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/SingleClassLoaderFactory.java @@ -28,6 +28,7 @@ public abstract class SingleClassLoaderFactory implements ClassLoaderFactory { */ private IClassLoader THE_LOADER = null; + @Override public IClassLoader getLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, AnalysisScope scope) { if (THE_LOADER == null) { THE_LOADER = makeTheLoader(cha); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java index 8dacb26f3..0cc43fd3a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/plugin/AstPlugin.java @@ -31,14 +31,16 @@ public class AstPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java index 2e032360e..03b34d7ba 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/AstPlugin.java @@ -31,14 +31,16 @@ public class AstPlugin extends Plugin { /** * This method is called upon plug-in activation */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); } /** * This method is called when the plug-in is stopped */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java index a5475112f..fb4919e8e 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstControlFlowMap.java @@ -39,31 +39,38 @@ public interface CAstControlFlowMap { * uncaught exception. */ public static final CAstNode EXCEPTION_TO_EXIT = new CAstNode() { + @Override public int getKind() { return CAstNode.CONSTANT; } + @Override public Object getValue() { return this; } + @Override public CAstNode getChild(int n) { Assertions.UNREACHABLE(); return null; } + @Override public int getChildCount() { return 0; } + @Override public String toString() { return "EXCEPTION_TO_EXIT"; } + @Override public int hashCode() { return getKind() * toString().hashCode(); } + @Override public boolean equals(Object o) { return o == this; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java index 3ea0d471b..986cede81 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstMemberReference.java @@ -14,22 +14,27 @@ public interface CAstMemberReference extends CAstReference { public static final CAstMemberReference FUNCTION = new CAstMemberReference() { + @Override public String member() { return "the function body"; } + @Override public CAstType type() { return null; } + @Override public String toString() { return "Any::FUNCTION CALL"; } + @Override public int hashCode() { return toString().hashCode(); } + @Override public boolean equals(Object o) { return o == this; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java index d7aff3a11..3fd850bb4 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstQualifier.java @@ -73,6 +73,7 @@ public class CAstQualifier { return fName; } + @Override public boolean equals(Object o) { if (!(o instanceof CAstQualifier)) return false; @@ -80,6 +81,7 @@ public class CAstQualifier { return other.fName.equals(fName) && (fBit == other.fBit); } + @Override public int hashCode() { int result = 37; result = result * 13 + fName.hashCode(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java index b212664e9..1f711ae53 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstSymbol.java @@ -13,6 +13,7 @@ package com.ibm.wala.cast.tree; public interface CAstSymbol { public static Object NULL_DEFAULT_VALUE = new Object() { + @Override public String toString() { return "NULL DEFAULT VALUE"; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java index 783d1b165..8fccb0d86 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstType.java @@ -64,10 +64,12 @@ public interface CAstType { public static final CAstType DYNAMIC = new CAstType() { + @Override public String getName() { return "DYNAMIC"; } + @Override public Collection/**/ getSupertypes() { return Collections.EMPTY_SET; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java index e784f49ca..a744d931a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstTypeDictionary.java @@ -21,6 +21,7 @@ public interface CAstTypeDictionary/**/ extends Iterable { CAstReference resolveReference(CAstReference ref); + @Override Iterator iterator(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java index 9361ab196..350523a44 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/AbstractSourcePosition.java @@ -16,6 +16,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; public abstract class AbstractSourcePosition implements Position { + @Override public boolean equals(Object o){ if (o instanceof Position) { Position p = (Position)o; @@ -33,10 +34,12 @@ public abstract class AbstractSourcePosition implements Position { } } + @Override public int hashCode() { return getFirstLine()*getLastLine()*getFirstCol()*getLastCol(); } + @Override public int compareTo(Object o) { if (o instanceof Position) { Position p = (Position)o; @@ -54,6 +57,7 @@ public abstract class AbstractSourcePosition implements Position { } } + @Override public String toString() { URL x = getURL(); String xf = x.toString(); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java index 6414f7872..be9787708 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstControlFlowRecorder.java @@ -67,6 +67,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { this.label = label; } + @Override public int hashCode() { if (label != null) return from.hashCode() * label.hashCode(); @@ -74,11 +75,13 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { return from.hashCode(); } + @Override public boolean equals(Object o) { return (o instanceof Key) && from == ((Key) o).from && ((label == null) ? ((Key) o).label == null : label.equals(((Key) o).label)); } + @Override public String toString() { return ""; } @@ -89,6 +92,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { map(EXCEPTION_TO_EXIT, EXCEPTION_TO_EXIT); } + @Override public CAstNode getTarget(CAstNode from, Object label) { assert CAstToNode.get(from) != null; Key key = new Key(label, CAstToNode.get(from)); @@ -100,6 +104,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { return null; } + @Override public Collection getTargetLabels(CAstNode from) { if (labelMap.containsKey(CAstToNode.get(from))) { return labelMap.get(CAstToNode.get(from)); @@ -108,6 +113,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { } } + @Override public Collection getSourceNodes(CAstNode to) { if (sourceMap.containsKey(CAstToNode.get(to))) { return (Set) sourceMap.get(CAstToNode.get(to)); @@ -116,6 +122,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { } } + @Override public Collection getMappedNodes() { Collection nodes = cachedMappedNodes; if (nodes == null) { @@ -192,6 +199,7 @@ public class CAstControlFlowRecorder implements CAstControlFlowMap { return nodeToCAst.containsKey(node); } + @Override public String toString() { StringBuffer sb = new StringBuffer("control flow map\n"); for (Iterator keys = table.keySet().iterator(); keys.hasNext();) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java index 775138f95..13da32d82 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstImpl.java @@ -27,6 +27,7 @@ import com.ibm.wala.cast.util.CAstPrinter; public class CAstImpl implements CAst { private int nextID = 0; + @Override public String makeUnique() { return "id" + (nextID++); } @@ -45,14 +46,17 @@ public class CAstImpl implements CAst { + "]"; } + @Override public int getKind() { return kind; } + @Override public Object getValue() { return null; } + @Override public CAstNode getChild(int n) { try { return cs[n]; @@ -61,14 +65,17 @@ public class CAstImpl implements CAst { } } + @Override public int getChildCount() { return cs.length; } + @Override public String toString() { return System.identityHashCode(this) + ":" + CAstPrinter.print(this); } + @Override public int hashCode() { int code = getKind() * (getChildCount() + 13); for (int i = 0; i < getChildCount(); i++) { @@ -79,10 +86,12 @@ public class CAstImpl implements CAst { } } + @Override public CAstNode makeNode(final int kind, final CAstNode[] cs) { return new CAstNodeImpl(kind, cs); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode[] cs) { CAstNode[] children = new CAstNode[cs.length + 1]; children[0] = c1; @@ -90,30 +99,37 @@ public class CAstImpl implements CAst { return makeNode(kind, children); } + @Override public CAstNode makeNode(int kind) { return makeNode(kind, new CAstNode[0]); } + @Override public CAstNode makeNode(int kind, CAstNode c1) { return makeNode(kind, new CAstNode[] { c1 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2) { return makeNode(kind, new CAstNode[] { c1, c2 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3) { return makeNode(kind, new CAstNode[] { c1, c2, c3 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3, CAstNode c4) { return makeNode(kind, new CAstNode[] { c1, c2, c3, c4 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3, CAstNode c4, CAstNode c5) { return makeNode(kind, new CAstNode[] { c1, c2, c3, c4, c5 }); } + @Override public CAstNode makeNode(int kind, CAstNode c1, CAstNode c2, CAstNode c3, CAstNode c4, CAstNode c5, CAstNode c6) { return makeNode(kind, new CAstNode[] { c1, c2, c3, c4, c5, c6 }); } @@ -125,59 +141,73 @@ public class CAstImpl implements CAst { this.value = value; } + @Override public int getKind() { return CAstNode.CONSTANT; } + @Override public Object getValue() { return value; } + @Override public CAstNode getChild(int n) { throw new NoSuchElementException(); } + @Override public int getChildCount() { return 0; } + @Override public String toString() { return "CAstValue: " + value; } + @Override public int hashCode() { return getKind() * toString().hashCode(); } } + @Override public CAstNode makeConstant(final Object value) { return new CAstValueImpl(value); } + @Override public CAstNode makeConstant(boolean value) { return makeConstant(value ? Boolean.TRUE : Boolean.FALSE); } + @Override public CAstNode makeConstant(char value) { return makeConstant(new Character(value)); } + @Override public CAstNode makeConstant(short value) { return makeConstant(new Short(value)); } + @Override public CAstNode makeConstant(int value) { return makeConstant(new Integer(value)); } + @Override public CAstNode makeConstant(long value) { return makeConstant(new Long(value)); } + @Override public CAstNode makeConstant(float value) { return makeConstant(new Float(value)); } + @Override public CAstNode makeConstant(double value) { return makeConstant(new Double(value)); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java index 8bbc2ffb6..b15d2e275 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstNodeTypeMapRecorder.java @@ -26,6 +26,7 @@ public class CAstNodeTypeMapRecorder { private static final long serialVersionUID= 7812144102027916961L; + @Override public CAstType getNodeType(CAstNode node) { return (CAstType) get(node); } @@ -34,6 +35,7 @@ public class CAstNodeTypeMapRecorder put(node, type); } + @Override public Collection getMappedNodes() { return keySet(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java index 07f48dc85..dc527f283 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstOperator.java @@ -29,22 +29,27 @@ public class CAstOperator implements CAstNode { this.op = op; } + @Override public String toString() { return "OP:" + op; } + @Override public int getKind() { return CAstNode.OPERATOR; } + @Override public Object getValue() { return op; } + @Override public CAstNode getChild(int n) { throw new NoSuchElementException(); } + @Override public int getChildCount() { return 0; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java index 2d8de6884..4df9dd6ef 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSourcePositionRecorder.java @@ -25,10 +25,12 @@ public class CAstSourcePositionRecorder implements CAstSourcePositionMap { private final HashMap positions = HashMapFactory.make(); + @Override public Position getPosition(CAstNode n) { return positions.get(n); } + @Override public Iterator getMappedNodes() { return positions.keySet().iterator(); } @@ -59,17 +61,26 @@ public class CAstSourcePositionRecorder implements CAstSourcePositionMap { { setPosition(n, new AbstractSourcePosition() { - public int getFirstLine() { return fl; } - public int getLastLine() { return ll; } - public int getFirstCol() { return fc; } - public int getLastCol() { return lc; } - public int getFirstOffset() { return -1; } - public int getLastOffset() { return -1; } - public URL getURL() { return url; } - public InputStream getInputStream() throws IOException { + @Override + public int getFirstLine() { return fl; } + @Override + public int getLastLine() { return ll; } + @Override + public int getFirstCol() { return fc; } + @Override + public int getLastCol() { return lc; } + @Override + public int getFirstOffset() { return -1; } + @Override + public int getLastOffset() { return -1; } + @Override + public URL getURL() { return url; } + @Override + public InputStream getInputStream() throws IOException { return file.openConnection().getInputStream(); } - public String toString() { + @Override + public String toString() { return "["+fl+":"+fc+"]->["+ll+":"+lc+"]"; } }); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java index 8ae1aead8..a3e064d68 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImpl.java @@ -35,5 +35,6 @@ public class CAstSymbolImpl extends CAstSymbolImplBase { super(_name, _isFinal, _isCaseInsensitive, _defaultInitValue); } + @Override public boolean isInternalName() { return false; } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java index ae9723247..2ec09d10a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstSymbolImplBase.java @@ -45,24 +45,30 @@ public abstract class CAstSymbolImplBase implements CAstSymbol { this._defaultInitValue= defaultInitValue; } + @Override public String name() { return _name; } + @Override public boolean isFinal() { return _isFinal; } + @Override public boolean isCaseInsensitive() { return _isCaseInsensitive; } + @Override public Object defaultInitValue() { return _defaultInitValue; } + @Override public abstract boolean isInternalName(); + @Override public String toString() { return _name; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java index 87af3307f..1a583e291 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstTypeDictionaryImpl.java @@ -24,6 +24,7 @@ import com.ibm.wala.util.collections.HashMapFactory; public class CAstTypeDictionaryImpl implements CAstTypeDictionary { protected final Map fMap = HashMapFactory.make(); + @Override public CAstType getCAstTypeFor(Object/*ASTType*/ astType) { return (CAstType) fMap.get(astType); } @@ -33,10 +34,12 @@ public class CAstTypeDictionaryImpl implements CAstTypeDictionary { fMap.put(astType, castType); } + @Override public Iterator iterator() { return fMap.values().iterator(); } + @Override public CAstReference resolveReference(CAstReference ref) { return ref; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java index 96dc8d7f2..2cd6f59f8 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/CAstValueImpl.java @@ -30,6 +30,7 @@ public class CAstValueImpl extends CAstImpl { super(kind, cs); } + @Override public int hashCode() { int value = 1237 * kind; for(int i = 0; i < cs.length; i++) @@ -38,6 +39,7 @@ public class CAstValueImpl extends CAstImpl { return value; } + @Override public boolean equals(Object o) { if (! (o instanceof CAstNode)) return false; if (kind != ((CAstNode)o).getKind()) return false; @@ -50,6 +52,7 @@ public class CAstValueImpl extends CAstImpl { } } + @Override public CAstNode makeNode(final int kind, final CAstNode[] cs) { return new CAstNodeValueImpl(kind, cs); } @@ -60,10 +63,12 @@ public class CAstValueImpl extends CAstImpl { super(value); } + @Override public int hashCode() { return value.hashCode(); } + @Override public boolean equals(Object o) { if (o instanceof CAstNode) { return value==null? @@ -75,6 +80,7 @@ public class CAstValueImpl extends CAstImpl { } } + @Override public CAstNode makeConstant(final Object value) { return new CAstValueValueImpl(value); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java index 047b88a30..98914fc74 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/DelegatingEntity.java @@ -30,66 +30,82 @@ public class DelegatingEntity implements CAstEntity { this.base = base; } + @Override public int getKind() { return base.getKind(); } + @Override public String getName() { return base.getName(); } + @Override public String getSignature() { return base.getSignature(); } + @Override public String[] getArgumentNames() { return base.getArgumentNames(); } + @Override public CAstNode[] getArgumentDefaults() { return base.getArgumentDefaults(); } + @Override public int getArgumentCount() { return base.getArgumentCount(); } + @Override public Map> getAllScopedEntities() { return base.getAllScopedEntities(); } + @Override public Iterator getScopedEntities(CAstNode construct) { return base.getScopedEntities(construct); } + @Override public CAstNode getAST() { return base.getAST(); } + @Override public CAstControlFlowMap getControlFlow() { return base.getControlFlow(); } + @Override public CAstSourcePositionMap getSourceMap() { return base.getSourceMap(); } + @Override public CAstSourcePositionMap.Position getPosition() { return base.getPosition(); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return base.getNodeTypeMap(); } + @Override public Collection getQualifiers() { return base.getQualifiers(); } + @Override public CAstType getType() { return base.getType(); } + @Override public Collection getAnnotations() { return base.getAnnotations(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java index f6a122162..d2c7b6efe 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/impl/LineNumberPosition.java @@ -25,24 +25,33 @@ public class LineNumberPosition extends AbstractSourcePosition { this.lineNumber = lineNumber; } + @Override public int getFirstLine() { return lineNumber; } + @Override public int getLastLine() { return lineNumber; } + @Override public int getFirstCol() { return -1; } + @Override public int getLastCol() { return -1; } + @Override public int getFirstOffset() { return -1; } + @Override public int getLastOffset() { return -1; } + @Override public URL getURL() { return url; } + @Override public InputStream getInputStream() throws IOException { return localFile.openConnection().getInputStream(); } + @Override public String toString() { String nm = url.getFile(); nm = nm.substring(nm.lastIndexOf('/') + 1); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java index b56953576..5b7712c1a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/Alt.java @@ -26,6 +26,7 @@ public class Alt implements NodePattern { this.right = right; } + @Override public boolean matches(CAstNode node) { return left.matches(node) || right.matches(node); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java index e6f97eb7c..f71498196 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/AnyNode.java @@ -20,7 +20,8 @@ import com.ibm.wala.cast.tree.CAstNode; * */ public class AnyNode implements NodePattern { - public boolean matches(CAstNode node) { + @Override + public boolean matches(CAstNode node) { return true; } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java index 5bd0daa38..b3850255f 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/pattern/NodeOfKind.java @@ -34,7 +34,8 @@ public class NodeOfKind implements NodePattern { /* (non-Javadoc) * @see pattern.NodePattern#matches(com.ibm.wala.cast.tree.CAstNode) */ - public boolean matches(CAstNode node) { + @Override + public boolean matches(CAstNode node) { if(node == null || node.getKind() != kind || node.getChildCount() != children.length) return false; for(int i=0;i { + @Override public UnwindKey key() { return null; } @@ -85,12 +90,14 @@ public class AstLoopUnwinder this.parent = parent; } + @Override public UnwindKey key() { return new UnwindKey(iteration, parent.key()); } } + @Override protected CAstNode flowOutTo(Map nodeMap, CAstNode oldSource, Object label, @@ -102,6 +109,7 @@ public class AstLoopUnwinder return oldTarget; } + @Override protected CAstNode copyNodes(CAstNode n, final CAstControlFlowMap cfg, RewriteContext c, Map,CAstNode> nodeMap) { if (n instanceof CAstOperator) { return n; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java index 766a6a392..5e2cb509b 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstBasicRewriter.java @@ -38,6 +38,7 @@ public abstract class CAstBasicRewriter return nodeMap; } + @Override public NoKey key() { return null; } @@ -52,14 +53,17 @@ public abstract class CAstBasicRewriter Assertions.UNREACHABLE(); } + @Override public int hashCode() { return System.identityHashCode(this); } + @Override public boolean equals(Object o) { return o == this; } + @Override public NoKey parent() { return null; } @@ -69,6 +73,7 @@ public abstract class CAstBasicRewriter super(Ast, recursive, new NonCopyingContext()); } + @Override protected abstract CAstNode copyNodes(CAstNode root, final CAstControlFlowMap cfg, NonCopyingContext context, Map, CAstNode> nodeMap); } \ No newline at end of file diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java index f06925bc8..0ae4b02b5 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstCloner.java @@ -32,6 +32,7 @@ public class CAstCloner extends CAstBasicRewriter { this(Ast, false); } + @Override protected CAstNode copyNodes(CAstNode root, final CAstControlFlowMap cfg, NonCopyingContext c, Map, CAstNode> nodeMap) { return copyNodesHackForEclipse(root, cfg, c, nodeMap); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java index b46efe23f..485e4fa37 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java @@ -59,8 +59,10 @@ public abstract class CAstRewriter, K e */ public interface CopyKey { + @Override int hashCode(); + @Override boolean equals(Object o); /** @@ -356,28 +358,33 @@ public abstract class CAstRewriter, K e private Map> theChildren = null; + @Override public CAstNode newRoot() { return newRoot; } + @Override public CAstControlFlowMap newCfg() { if (theCfg == null) theCfg = copyFlow(nodes, cfg, newPos()); return theCfg; } + @Override public CAstSourcePositionMap newPos() { if (theSource == null) theSource = copySource(nodes, pos); return theSource; } + @Override public CAstNodeTypeMap newTypes() { if (theTypes == null) theTypes = copyTypes(nodes, types); return theTypes; } + @Override public Map> newChildren() { if (theChildren == null) theChildren = copyChildren(root, nodes, children); @@ -397,10 +404,12 @@ public abstract class CAstRewriter, K e root.getAllScopedEntities()); return new DelegatingEntity(root) { + @Override public String toString() { return root.toString() + " (clone)"; } + @Override public Iterator getScopedEntities(CAstNode construct) { Map> newChildren = getAllScopedEntities(); if (newChildren.containsKey(construct)) { @@ -410,22 +419,27 @@ public abstract class CAstRewriter, K e } } + @Override public Map> getAllScopedEntities() { return rewrite.newChildren(); } + @Override public CAstNode getAST() { return rewrite.newRoot(); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return rewrite.newTypes(); } + @Override public CAstSourcePositionMap getSourceMap() { return rewrite.newPos(); } + @Override public CAstControlFlowMap getControlFlow() { return rewrite.newCfg(); } @@ -446,10 +460,12 @@ public abstract class CAstRewriter, K e } return new DelegatingEntity(root) { + @Override public String toString() { return root.toString() + " (clone)"; } + @Override public Iterator getScopedEntities(CAstNode construct) { if (newChildren.containsKey(construct)) { return newChildren.get(construct).iterator(); @@ -458,6 +474,7 @@ public abstract class CAstRewriter, K e } } + @Override public Map> getAllScopedEntities() { return newChildren; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java index 47383c62b..53e19926a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/DelegatingCAstVisitor.java @@ -26,6 +26,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which this file was visited * @param n the file entity */ + @Override protected C makeFileContext(C context, CAstEntity n) { return delegate.makeFileContext(context, n); } @@ -34,6 +35,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which this type was visited * @param n the type entity */ + @Override protected C makeTypeContext(C context, CAstEntity n) { return delegate.makeTypeContext(context, n); } @@ -42,6 +44,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which the code was visited * @param n the code entity */ + @Override protected C makeCodeContext(C context, CAstEntity n) { return delegate.makeCodeContext(context, n); } @@ -51,6 +54,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which the local scope was visited * @param n the local scope node */ + @Override protected C makeLocalContext(C context, CAstNode n) { return delegate.makeLocalContext(context, n); } @@ -59,6 +63,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context in which the unwind was visited * @param n the unwind node */ + @Override protected C makeUnwindContext(C context, CAstNode n, CAstVisitor visitor) { return delegate.makeUnwindContext(context, n, visitor); } @@ -68,6 +73,7 @@ public abstract class DelegatingCAstVisitor exten * @param entity the child entity * @return the parent entity for the given entity */ + @Override protected CAstEntity getParent(CAstEntity entity) { return delegate.getParent(entity); } @@ -77,6 +83,7 @@ public abstract class DelegatingCAstVisitor exten * @param entity the child entity * @param parent the parent entity */ + @Override protected void setParent(CAstEntity entity, CAstEntity parent) { delegate.setParent(entity, parent); } @@ -101,6 +108,7 @@ public abstract class DelegatingCAstVisitor exten * Should invoke super.doVisitEntity() for unprocessed entities. * @return true if entity was handled */ + @Override protected boolean doVisitEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.doVisitEntity(n, context, visitor); } @@ -111,6 +119,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean enterEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.enterEntity(n, context, visitor); } @@ -119,6 +128,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the entity to process * @param context a visitor-specific context */ + @Override protected void postProcessEntity(CAstEntity n, C context, CAstVisitor visitor) { delegate.postProcessEntity(n, context, visitor); } @@ -129,6 +139,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @return true if no further processing is needed */ + @Override public boolean visitEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.visitEntity(n, context, visitor); } @@ -137,6 +148,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the entity to process * @param context a visitor-specific context */ + @Override public void leaveEntity(CAstEntity n, C context, CAstVisitor visitor) { delegate.leaveEntity(n, context, visitor); } @@ -148,6 +160,7 @@ public abstract class DelegatingCAstVisitor exten * @param fileContext a visitor-specific context for this file * @return true if no further processing is needed */ + @Override protected boolean visitFileEntity(CAstEntity n, C context, C fileContext, CAstVisitor visitor) { return delegate.visitFileEntity(n, context, fileContext, visitor); } @@ -157,6 +170,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param fileContext a visitor-specific context for this file */ + @Override protected void leaveFileEntity(CAstEntity n, C context, C fileContext, CAstVisitor visitor) { delegate.leaveFileEntity(n, context, fileContext, visitor); } @@ -166,6 +180,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitFieldEntity(CAstEntity n, C context, CAstVisitor visitor) { return delegate.visitFieldEntity(n, context, visitor); } @@ -174,6 +189,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the entity to process * @param context a visitor-specific context */ + @Override protected void leaveFieldEntity(CAstEntity n, C context, CAstVisitor visitor) { delegate.leaveFieldEntity(n, context, visitor); } @@ -184,6 +200,7 @@ public abstract class DelegatingCAstVisitor exten * @param typeContext a visitor-specific context for this type * @return true if no further processing is needed */ + @Override protected boolean visitTypeEntity(CAstEntity n, C context, C typeContext, CAstVisitor visitor) { return delegate.visitTypeEntity(n, context, typeContext, visitor); } @@ -193,6 +210,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param typeContext a visitor-specific context for this type */ + @Override protected void leaveTypeEntity(CAstEntity n, C context, C typeContext, CAstVisitor visitor) { delegate.leaveTypeEntity(n, context, typeContext, visitor); } @@ -203,6 +221,7 @@ public abstract class DelegatingCAstVisitor exten * @param codeContext a visitor-specific context for this function * @return true if no further processing is needed */ + @Override protected boolean visitFunctionEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { return delegate.visitFunctionEntity(n, context, codeContext, visitor); } @@ -212,6 +231,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param codeContext a visitor-specific context for this function */ + @Override protected void leaveFunctionEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { delegate.leaveFunctionEntity(n, context, codeContext, visitor); } @@ -222,6 +242,7 @@ public abstract class DelegatingCAstVisitor exten * @param codeContext a visitor-specific context for this script * @return true if no further processing is needed */ + @Override protected boolean visitScriptEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { return delegate.visitScriptEntity(n, context, codeContext, visitor); } @@ -231,6 +252,7 @@ public abstract class DelegatingCAstVisitor exten * @param context a visitor-specific context * @param codeContext a visitor-specific context for this script */ + @Override protected void leaveScriptEntity(CAstEntity n, C context, C codeContext, CAstVisitor visitor) { delegate.leaveScriptEntity(n, context, codeContext, visitor); } @@ -241,6 +263,7 @@ public abstract class DelegatingCAstVisitor exten * Should invoke super.doVisit() for unprocessed nodes. * @return true if node was handled */ + @Override protected boolean doVisit(CAstNode n, C context, CAstVisitor visitor) { return delegate.doVisit(n, context, visitor); } @@ -251,6 +274,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean enterNode(CAstNode n, C c, CAstVisitor visitor) { return delegate.enterNode(n, c, visitor); } @@ -259,6 +283,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void postProcessNode(CAstNode n, C c, CAstVisitor visitor) { delegate.postProcessNode(n, c, visitor); } @@ -269,6 +294,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override public boolean visitNode(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitNode(n, c, visitor); } @@ -277,6 +303,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override public void leaveNode(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveNode(n, c, visitor); } @@ -287,6 +314,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitFunctionExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitFunctionExpr(n, c, visitor); } @@ -295,6 +323,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveFunctionExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveFunctionExpr(n, c, visitor); } @@ -304,6 +333,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitFunctionStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitFunctionStmt(n, c, visitor); } @@ -312,6 +342,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveFunctionStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveFunctionStmt(n, c, visitor); } @@ -321,6 +352,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitLocalScope(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitLocalScope(n, c, visitor); } @@ -329,6 +361,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLocalScope(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLocalScope(n, c, visitor); } @@ -338,6 +371,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitBlockExpr(n, c, visitor); } @@ -346,6 +380,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveBlockExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveBlockExpr(n, c, visitor); } @@ -355,6 +390,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitBlockStmt(n, c, visitor); } @@ -363,6 +399,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveBlockStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveBlockStmt(n, c, visitor); } @@ -372,6 +409,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitLoop(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitLoop(n, c, visitor); } @@ -380,6 +418,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLoopHeader(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLoopHeader(n, c, visitor); } @@ -388,6 +427,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLoop(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLoop(n, c, visitor); } @@ -397,6 +437,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitGetCaughtException(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitGetCaughtException(n, c, visitor); } @@ -405,6 +446,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveGetCaughtException(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveGetCaughtException(n, c, visitor); } @@ -414,6 +456,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitThis(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitThis(n, c, visitor); } @@ -422,6 +465,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveThis(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveThis(n, c, visitor); } @@ -431,6 +475,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitSuper(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitSuper(n, c, visitor); } @@ -439,6 +484,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveSuper(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveSuper(n, c, visitor); } @@ -448,6 +494,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitCall(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitCall(n, c, visitor); } @@ -456,6 +503,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveCall(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveCall(n, c, visitor); } @@ -465,6 +513,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVar(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitVar(n, c, visitor); } @@ -473,6 +522,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveVar(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveVar(n, c, visitor); } @@ -482,6 +532,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitConstant(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitConstant(n, c, visitor); } @@ -490,6 +541,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveConstant(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveConstant(n, c, visitor); } @@ -499,6 +551,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBinaryExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitBinaryExpr(n, c, visitor); } @@ -507,6 +560,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveBinaryExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveBinaryExpr(n, c, visitor); } @@ -516,6 +570,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitUnaryExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitUnaryExpr(n, c, visitor); } @@ -524,6 +579,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveUnaryExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveUnaryExpr(n, c, visitor); } @@ -533,6 +589,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayLength(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitArrayLength(n, c, visitor); } @@ -541,6 +598,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayLength(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayLength(n, c, visitor); } @@ -550,6 +608,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayRef(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitArrayRef(n, c, visitor); } @@ -558,6 +617,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayRef(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayRef(n, c, visitor); } @@ -567,6 +627,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitDeclStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitDeclStmt(n, c, visitor); } @@ -575,6 +636,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveDeclStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveDeclStmt(n, c, visitor); } @@ -584,6 +646,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitReturn(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitReturn(n, c, visitor); } @@ -592,6 +655,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveReturn(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveReturn(n, c, visitor); } @@ -601,6 +665,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitIfgoto(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitIfgoto(n, c, visitor); } @@ -609,6 +674,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfgoto(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfgoto(n, c, visitor); } @@ -618,6 +684,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitGoto(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitGoto(n, c, visitor); } @@ -626,6 +693,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveGoto(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveGoto(n, c, visitor); } @@ -635,6 +703,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitLabelStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitLabelStmt(n, c, visitor); } @@ -643,6 +712,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveLabelStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveLabelStmt(n, c, visitor); } @@ -652,6 +722,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitIfStmt(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitIfStmt(n, c, visitor); } @@ -660,6 +731,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfStmtCondition(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfStmtCondition(n, c, visitor); } @@ -668,6 +740,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfStmtTrueClause(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfStmtTrueClause(n, c, visitor); } @@ -676,6 +749,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfStmt(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfStmt(n, c, visitor); } @@ -685,6 +759,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitIfExpr(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitIfExpr(n, c, visitor); } @@ -693,6 +768,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfExprCondition(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfExprCondition(n, c, visitor); } @@ -701,6 +777,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfExprTrueClause(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfExprTrueClause(n, c, visitor); } @@ -709,6 +786,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveIfExpr(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveIfExpr(n, c, visitor); } @@ -718,6 +796,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitNew(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitNew(n, c, visitor); } @@ -726,6 +805,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveNew(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveNew(n, c, visitor); } @@ -735,6 +815,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectLiteral(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitObjectLiteral(n, c, visitor); } @@ -744,6 +825,7 @@ public abstract class DelegatingCAstVisitor exten * @param i the field position that was initialized * @param c a visitor-specific context */ + @Override protected void leaveObjectLiteralFieldInit(CAstNode n, int i, C c, CAstVisitor visitor) { delegate.leaveObjectLiteralFieldInit(n, i, c, visitor); } @@ -752,6 +834,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveObjectLiteral(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveObjectLiteral(n, c, visitor); } @@ -761,6 +844,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayLiteral(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitArrayLiteral(n, c, visitor); } @@ -769,6 +853,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayLiteralObject(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayLiteralObject(n, c, visitor); } @@ -778,6 +863,7 @@ public abstract class DelegatingCAstVisitor exten * @param i the index that was initialized * @param c a visitor-specific context */ + @Override protected void leaveArrayLiteralInitElement(CAstNode n, int i, C c, CAstVisitor visitor) { delegate.leaveArrayLiteralInitElement(n, i, c, visitor); } @@ -786,6 +872,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayLiteral(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveArrayLiteral(n, c, visitor); } @@ -795,6 +882,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectRef(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitObjectRef(n, c, visitor); } @@ -803,6 +891,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveObjectRef(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveObjectRef(n, c, visitor); } @@ -812,6 +901,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override public boolean visitAssign(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitAssign(n, c, visitor); } @@ -820,6 +910,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override public void leaveAssign(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveAssign(n, c, visitor); } @@ -831,6 +922,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitArrayRefAssign(n, v, a, c, visitor); } @@ -841,6 +933,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveArrayRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveArrayRefAssign(n, v, a, c, visitor); } @@ -853,6 +946,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitArrayRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitArrayRefAssignOp(n, v, a, pre, c, visitor); } @@ -864,6 +958,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveArrayRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveArrayRefAssignOp(n, v, a, pre, c, visitor); } @@ -875,6 +970,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitObjectRefAssign(n, v, a, c, visitor); } @@ -885,6 +981,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveObjectRefAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveObjectRefAssign(n, v, a, c, visitor); } @@ -897,6 +994,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitObjectRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitObjectRefAssignOp(n, v, a, pre, c, visitor); } @@ -908,6 +1006,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveObjectRefAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveObjectRefAssignOp(n, v, a, pre, c, visitor); } @@ -919,6 +1018,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockExprAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitBlockExprAssign(n, v, a, c, visitor); } @@ -929,6 +1029,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveBlockExprAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveBlockExprAssign(n, v, a, c, visitor); } @@ -941,6 +1042,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitBlockExprAssignOp(n, v, a, pre, c, visitor); } @@ -952,6 +1054,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveBlockExprAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveBlockExprAssignOp(n, v, a, pre, c, visitor); } @@ -963,6 +1066,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVarAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { return delegate.visitVarAssign(n, v, a, c, visitor); } @@ -973,6 +1077,7 @@ public abstract class DelegatingCAstVisitor exten * @param a the assignment node to process * @param c a visitor-specific context */ + @Override protected void leaveVarAssign(CAstNode n, CAstNode v, CAstNode a, C c, CAstVisitor visitor) { delegate.leaveVarAssign(n, v, a, c, visitor); } @@ -985,6 +1090,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVarAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { return delegate.visitVarAssignOp(n, v, a, pre, c, visitor); } @@ -996,6 +1102,7 @@ public abstract class DelegatingCAstVisitor exten * @param pre whether the value before the operation should be used * @param c a visitor-specific context */ + @Override protected void leaveVarAssignOp(CAstNode n, CAstNode v, CAstNode a, boolean pre, C c, CAstVisitor visitor) { delegate.leaveVarAssignOp(n, v, a, pre, c, visitor); } @@ -1005,6 +1112,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitSwitch(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitSwitch(n, c, visitor); } @@ -1013,6 +1121,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveSwitchValue(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveSwitchValue(n, c, visitor); } @@ -1021,6 +1130,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveSwitch(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveSwitch(n, c, visitor); } @@ -1030,6 +1140,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitThrow(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitThrow(n, c, visitor); } @@ -1038,6 +1149,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveThrow(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveThrow(n, c, visitor); } @@ -1047,6 +1159,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitCatch(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitCatch(n, c, visitor); } @@ -1055,6 +1168,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveCatch(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveCatch(n, c, visitor); } @@ -1064,6 +1178,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitUnwind(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitUnwind(n, c, visitor); } @@ -1072,6 +1187,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveUnwind(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveUnwind(n, c, visitor); } @@ -1081,6 +1197,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitTry(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitTry(n, c, visitor); } @@ -1089,6 +1206,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveTryBlock(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveTryBlock(n, c, visitor); } @@ -1097,6 +1215,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveTry(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveTry(n, c, visitor); } @@ -1106,6 +1225,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitEmpty(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitEmpty(n, c, visitor); } @@ -1114,6 +1234,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveEmpty(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveEmpty(n, c, visitor); } @@ -1123,6 +1244,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitPrimitive(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitPrimitive(n, c, visitor); } @@ -1131,6 +1253,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leavePrimitive(CAstNode n, C c, CAstVisitor visitor) { delegate.leavePrimitive(n, c, visitor); } @@ -1140,6 +1263,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitVoid(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitVoid(n, c, visitor); } @@ -1148,6 +1272,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveVoid(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveVoid(n, c, visitor); } @@ -1157,6 +1282,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitCast(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitCast(n, c, visitor); } @@ -1165,6 +1291,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveCast(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveCast(n, c, visitor); } @@ -1174,6 +1301,7 @@ public abstract class DelegatingCAstVisitor exten * @param c a visitor-specific context * @return true if no further processing is needed */ + @Override protected boolean visitInstanceOf(CAstNode n, C c, CAstVisitor visitor) { return delegate.visitInstanceOf(n, c, visitor); } @@ -1182,6 +1310,7 @@ public abstract class DelegatingCAstVisitor exten * @param n the node to process * @param c a visitor-specific context */ + @Override protected void leaveInstanceOf(CAstNode n, C c, CAstVisitor visitor) { delegate.leaveInstanceOf(n, c, visitor); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java index e0187eb13..a189bebb6 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstFunctions.java @@ -41,26 +41,32 @@ public class CAstFunctions { private final Map> pendingChildren = HashMapFactory.make(); + @Override protected Iterator getPendingChildren(CAstNode n) { return pendingChildren.get(n); } + @Override protected void setPendingChildren(CAstNode v, Iterator iterator) { pendingChildren.put(v, iterator); } + @Override protected Iterator getConnected(final CAstNode n) { return new Iterator() { private int i = 0; + @Override public boolean hasNext() { return i < ((CAstNode) n).getChildCount(); } + @Override public CAstNode next() { return ((CAstNode) n).getChild(i++); } + @Override public void remove() { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java index 143531b2f..9c722ae0c 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPattern.java @@ -137,6 +137,7 @@ public class CAstPattern { this.children = null; } + @Override public String toString() { StringBuffer sb = new StringBuffer(); @@ -392,9 +393,11 @@ public class CAstPattern { }; v.visit(e.getAST(), new Context() { + @Override public CAstEntity top() { return e; } + @Override public CAstSourcePositionMap getSourceMap() { return e.getSourceMap(); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java index 11ca8d2c1..a312451d9 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/SourceBuffer.java @@ -55,6 +55,7 @@ public class SourceBuffer { } } + @Override public String toString() { StringBuffer result = new StringBuffer(); for(int i = 0; i < lines.length; i++) { @@ -94,14 +95,22 @@ public class SourceBuffer { final Position hack = range; range = new AbstractSourcePosition() { - public int getFirstLine() { return hack.getFirstLine(); } - public int getLastLine() { return hack.getFirstLine(); } - public int getFirstCol() { return hack.getFirstCol(); } - public int getLastCol() { return hack.getFirstCol(); } - public int getFirstOffset() { return hack.getFirstOffset(); } - public int getLastOffset() { return hack.getFirstOffset(); } - public URL getURL() { return hack.getURL(); } - public InputStream getInputStream() throws IOException { + @Override + public int getFirstLine() { return hack.getFirstLine(); } + @Override + public int getLastLine() { return hack.getFirstLine(); } + @Override + public int getFirstCol() { return hack.getFirstCol(); } + @Override + public int getLastCol() { return hack.getFirstCol(); } + @Override + public int getFirstOffset() { return hack.getFirstOffset(); } + @Override + public int getLastOffset() { return hack.getFirstOffset(); } + @Override + public URL getURL() { return hack.getURL(); } + @Override + public InputStream getInputStream() throws IOException { return hack.getInputStream(); } }; diff --git a/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java b/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java index 889fdab53..014ad5eef 100644 --- a/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java +++ b/com.ibm.wala.core.testdata/src/demandpa/ArraySet.java @@ -57,6 +57,7 @@ class ArraySet { } class ArraySetIter implements Iter { + @Override public Object next() { return elems[0]; } diff --git a/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java b/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java index 8420393e6..87c6589a0 100644 --- a/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java +++ b/com.ibm.wala.core.testdata/src/demandpa/DummyHashMap.java @@ -28,6 +28,7 @@ public class DummyHashMap { public Iter keyIter() { return new Iter() { + @Override public Object next() { return keys[0]; } @@ -37,6 +38,7 @@ public class DummyHashMap { public Iter valuesIter() { return new Iter() { + @Override public Object next() { return values[0]; } diff --git a/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java b/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java index bf1e6ad66..c08077a10 100644 --- a/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java +++ b/com.ibm.wala.core.testdata/src/demandpa/DummyLinkedList.java @@ -45,6 +45,7 @@ public class DummyLinkedList { public Iter iterator() { return new Iter() { + @Override public Object next() { // just return some arbitrary element, from the point of view of flow-insensitive points-to analysis Element tmp = head; diff --git a/com.ibm.wala.core.testdata/src/multiTypes/Foo.java b/com.ibm.wala.core.testdata/src/multiTypes/Foo.java index 8085fc90a..bfba119b7 100644 --- a/com.ibm.wala.core.testdata/src/multiTypes/Foo.java +++ b/com.ibm.wala.core.testdata/src/multiTypes/Foo.java @@ -25,6 +25,7 @@ public class Foo { @SuppressWarnings("unused") private static class B extends A { + @Override public void bar() { } } diff --git a/com.ibm.wala.core.testdata/src/recurse/NList.java b/com.ibm.wala.core.testdata/src/recurse/NList.java index 427e0dde1..cc2c4091c 100644 --- a/com.ibm.wala.core.testdata/src/recurse/NList.java +++ b/com.ibm.wala.core.testdata/src/recurse/NList.java @@ -40,6 +40,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#size() */ + @Override public int size() { // TODO Auto-generated method stub return 0; @@ -48,6 +49,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#isEmpty() */ + @Override public boolean isEmpty() { // TODO Auto-generated method stub return false; @@ -56,6 +58,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#contains(java.lang.Object) */ + @Override public boolean contains(Object o) { // TODO Auto-generated method stub return false; @@ -64,6 +67,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#iterator() */ + @Override public Iterator iterator() { // TODO Auto-generated method stub return null; @@ -72,6 +76,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#toArray() */ + @Override public Object[] toArray() { // TODO Auto-generated method stub return null; @@ -81,6 +86,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#add(java.lang.Object) */ + @Override public boolean add(Object o) { // TODO Auto-generated method stub return false; @@ -89,6 +95,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#remove(java.lang.Object) */ + @Override public boolean remove(Object o) { // TODO Auto-generated method stub return false; @@ -97,6 +104,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#containsAll(java.util.Collection) */ + @Override public boolean containsAll(Collection c) { // TODO Auto-generated method stub return false; @@ -105,6 +113,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#addAll(java.util.Collection) */ + @Override public boolean addAll(Collection c) { // TODO Auto-generated method stub return false; @@ -113,6 +122,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#removeAll(java.util.Collection) */ + @Override public boolean removeAll(Collection c) { // TODO Auto-generated method stub return false; @@ -121,6 +131,7 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#retainAll(java.util.Collection) */ + @Override public boolean retainAll(Collection c) { // TODO Auto-generated method stub return false; @@ -129,12 +140,14 @@ public class NList implements Collection { /* (non-Javadoc) * @see java.util.Collection#clear() */ + @Override public void clear() { // TODO Auto-generated method stub } + @Override public Object[] toArray(Object[] a) { // TODO Auto-generated method stub return null; diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect5.java b/com.ibm.wala.core.testdata/src/reflection/Reflect5.java index 185e060e7..66605ef13 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect5.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect5.java @@ -22,7 +22,8 @@ public class Reflect5 { public static class A { private A() { } - public String toString() { + @Override + public String toString() { return "Instance of A"; } } diff --git a/com.ibm.wala.core.testdata/src/reflection/Reflect6.java b/com.ibm.wala.core.testdata/src/reflection/Reflect6.java index 68c880787..5c1737660 100644 --- a/com.ibm.wala.core.testdata/src/reflection/Reflect6.java +++ b/com.ibm.wala.core.testdata/src/reflection/Reflect6.java @@ -22,7 +22,8 @@ public class Reflect6 { public static class A { private A(int i) { } - public String toString() { + @Override + public String toString() { return "Instance of A"; } } diff --git a/com.ibm.wala.core.testdata/src/slice/B.java b/com.ibm.wala.core.testdata/src/slice/B.java index 6e0821e00..f52ce1528 100644 --- a/com.ibm.wala.core.testdata/src/slice/B.java +++ b/com.ibm.wala.core.testdata/src/slice/B.java @@ -11,6 +11,7 @@ package slice; class B extends A { + @Override Object foo() { return new Float(4); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java index eafa6e85e..8c45a5379 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/FloydWarshallTest.java @@ -37,6 +37,7 @@ public class FloydWarshallTest { private final MutableIntSet preds = IntSetUtil.make(); private final MutableIntSet succs = IntSetUtil.make(); + @Override public int getGraphNodeId() { return number; } @@ -45,38 +46,47 @@ public class FloydWarshallTest { this.number = number; } + @Override public void setGraphNodeId(int number) { throw new UnsupportedOperationException(); } + @Override public IntSet getSuccNumbers() { return succs; } + @Override public IntSet getPredNumbers() { return preds; } + @Override public void addSucc(int n) { succs.add(n); } + @Override public void addPred(int n) { preds.add(n); } + @Override public void removeAllIncidentEdges() { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges() { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges() { throw new UnsupportedOperationException(); } + @Override public String toString() { return "["+number+"]"; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java index a3425ac98..7485da720 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/GraphDataflowTest.java @@ -130,23 +130,28 @@ public class GraphDataflowTest extends WalaTestCase { final OrdinalSetMapping values = new MutableMapping(nodes); ITransferFunctionProvider functions = new ITransferFunctionProvider() { + @Override public UnaryOperator getNodeTransferFunction(String node) { return new BitVectorUnionConstant(values.getMappedIndex(node)); } + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public UnaryOperator getEdgeTransferFunction(String from, String to) { Assertions.UNREACHABLE(); return null; } + @Override public boolean hasEdgeTransferFunctions() { return false; } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } @@ -163,14 +168,17 @@ public class GraphDataflowTest extends WalaTestCase { final OrdinalSetMapping values = new MutableMapping(nodes); ITransferFunctionProvider functions = new ITransferFunctionProvider() { + @Override public UnaryOperator getNodeTransferFunction(String node) { return new BitVectorUnionConstant(values.getMappedIndex(node)); } + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public UnaryOperator getEdgeTransferFunction(String from, String to) { if (from == nodes[1] && to == nodes[3]) return new BitVectorFilter(zero()); @@ -181,10 +189,12 @@ public class GraphDataflowTest extends WalaTestCase { } } + @Override public boolean hasEdgeTransferFunctions() { return true; } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java index 20c3e329f..da36b9085 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/basic/PathFinderTest.java @@ -43,6 +43,7 @@ public class PathFinderTest { private static DFSAllPathsFinder makeFinder(Graph g, String start, final String end) { return new DFSAllPathsFinder(g, start, new Filter() { + @Override public boolean accepts(String o) { return end.equals(o); } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java index 51cf8d70d..60da43bbc 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/CallGraphTest.java @@ -219,6 +219,7 @@ public class CallGraphTest extends WalaTestCase { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -275,6 +276,7 @@ public class CallGraphTest extends WalaTestCase { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -458,6 +460,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#iterateNodes() */ + @Override public Iterator iterator() { return nodes.iterator(); } @@ -465,6 +468,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(java.lang.Object) */ + @Override public boolean containsNode(MethodReference N) { return nodes.contains(N); } @@ -472,6 +476,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return nodes.size(); } @@ -479,6 +484,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(java.lang.Object) */ + @Override public Iterator getPredNodes(MethodReference N) { Set pred = HashSetFactory.make(10); MethodReference methodReference = N; @@ -492,6 +498,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(java.lang.Object) */ + @Override public int getPredNodeCount(MethodReference N) { int count = 0; for (Iterator ps = getPredNodes(N); ps.hasNext(); count++, ps.next()) @@ -502,6 +509,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(java.lang.Object) */ + @Override public Iterator getSuccNodes(MethodReference N) { Set succ = HashSetFactory.make(10); MethodReference methodReference = N; @@ -515,6 +523,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(java.lang.Object) */ + @Override public int getSuccNodeCount(MethodReference N) { int count = 0; for (Iterator ps = getSuccNodes(N); ps.hasNext(); count++, ps.next()) @@ -525,6 +534,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(java.lang.Object) */ + @Override public void addNode(MethodReference n) { Assertions.UNREACHABLE(); } @@ -532,6 +542,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.NodeManager#removeNode(java.lang.Object) */ + @Override public void removeNode(MethodReference n) { Assertions.UNREACHABLE(); } @@ -539,10 +550,12 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(java.lang.Object, java.lang.Object) */ + @Override public void addEdge(MethodReference src, MethodReference dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(MethodReference src, MethodReference dst) { Assertions.UNREACHABLE(); } @@ -550,6 +563,7 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.EdgeManager#removeAllIncidentEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(MethodReference node) { Assertions.UNREACHABLE(); } @@ -557,22 +571,26 @@ public class CallGraphTest extends WalaTestCase { /* * @see com.ibm.wala.util.graph.Graph#removeNodeAndEdges(java.lang.Object) */ + @Override public void removeNodeAndEdges(MethodReference N) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(MethodReference node) { // TODO Auto-generated method stubMethodReference Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(MethodReference node) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(MethodReference src, MethodReference dst) { for (Iterator succNodes = getSuccNodes(src); succNodes.hasNext();) { if (dst.equals(succNodes.next())) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java index ef0309ebe..ed061d25c 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/callGraph/PiNodeCallGraphTest.java @@ -38,7 +38,6 @@ import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.HashSetFactory; -import com.ibm.wala.util.collections.Iterator2List; import com.ibm.wala.util.strings.Atom; /** diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java index 356f03d8c..366b63373 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/cha/SourceMapTest.java @@ -15,7 +15,9 @@ import java.io.IOException; import org.junit.Assert; import org.junit.Test; +import com.ibm.wala.classLoader.BytecodeClass; import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.Module; import com.ibm.wala.core.tests.util.TestConstants; import com.ibm.wala.core.tests.util.WalaTestCase; import com.ibm.wala.ipa.callgraph.AnalysisScope; @@ -60,5 +62,8 @@ public class SourceMapTest extends WalaTestCase { String sourceFile = klass.getSourceFileName(); Assert.assertTrue(sourceFile != null); System.err.println("Source file: " + sourceFile); + Module container = ((BytecodeClass)klass).getContainer(); + Assert.assertTrue(container != null); + System.err.println("container: " + container); } } \ No newline at end of file diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java index 4b43a4edf..83615e658 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextInsensitiveReachingDefs.java @@ -113,10 +113,12 @@ public class ContextInsensitiveReachingDefs { /** * our meet operator is set union */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(BasicBlockInContext node) { IExplodedBasicBlock ebb = node.getDelegate(); SSAInstruction instruction = ebb.getInstruction(); @@ -141,10 +143,12 @@ public class ContextInsensitiveReachingDefs { * here we need an edge transfer function for call-to-return edges (see * {@link #getEdgeTransferFunction(BasicBlockInContext, BasicBlockInContext)}) */ + @Override public boolean hasEdgeTransferFunctions() { return true; } + @Override public boolean hasNodeTransferFunctions() { return true; } @@ -153,6 +157,7 @@ public class ContextInsensitiveReachingDefs { * for direct call-to-return edges at a call site, the edge transfer function will kill all facts, since we only want to * consider facts that arise from going through the callee */ + @Override public UnaryOperator getEdgeTransferFunction(BasicBlockInContext src, BasicBlockInContext dst) { if (isCallToReturnEdge(src, dst)) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java index f9404e12f..572971cc2 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/ContextSensitiveReachingDefs.java @@ -75,6 +75,7 @@ public class ContextSensitiveReachingDefs { private class ReachingDefsDomain extends MutableMapping> implements TabulationDomain, BasicBlockInContext> { + @Override public boolean hasPriorityOver(PathEdge> p1, PathEdge> p2) { // don't worry about worklist priorities @@ -96,6 +97,7 @@ public class ContextSensitiveReachingDefs { * * @see ReachingDefsProblem */ + @Override public IFlowFunction getUnbalancedReturnFlowFunction(BasicBlockInContext src, BasicBlockInContext dest) { return IdentityFlowFunction.identity(); @@ -104,6 +106,7 @@ public class ContextSensitiveReachingDefs { /** * flow function from caller to callee; just the identity function */ + @Override public IUnaryFlowFunction getCallFlowFunction(BasicBlockInContext src, BasicBlockInContext dest, BasicBlockInContext ret) { return IdentityFlowFunction.identity(); @@ -112,6 +115,7 @@ public class ContextSensitiveReachingDefs { /** * flow function from call node to return node when there are no targets for the call site; not a case we are expecting */ + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(BasicBlockInContext src, BasicBlockInContext dest) { // if we're missing callees, just keep what information we have @@ -122,6 +126,7 @@ public class ContextSensitiveReachingDefs { * flow function from call node to return node at a call site when callees exist. We kill everything; surviving facts should * flow out of the callee */ + @Override public IUnaryFlowFunction getCallToReturnFlowFunction(BasicBlockInContext src, BasicBlockInContext dest) { return KillEverything.singleton(); @@ -130,6 +135,7 @@ public class ContextSensitiveReachingDefs { /** * flow function for normal intraprocedural edges */ + @Override public IUnaryFlowFunction getNormalFlowFunction(final BasicBlockInContext src, BasicBlockInContext dest) { final IExplodedBasicBlock ebb = src.getDelegate(); @@ -139,6 +145,7 @@ public class ContextSensitiveReachingDefs { if (putInstr.isStatic()) { return new IUnaryFlowFunction() { + @Override public IntSet getTargets(int d1) { // first, gen this statement int factNum = domain.getMappedIndex(Pair.make(src.getNode(), ebb.getFirstInstructionIndex())); @@ -159,6 +166,7 @@ public class ContextSensitiveReachingDefs { return result; } + @Override public String toString() { return "Reaching Defs Normal Flow"; } @@ -172,6 +180,7 @@ public class ContextSensitiveReachingDefs { /** * standard flow function from callee to caller; just identity */ + @Override public IFlowFunction getReturnFlowFunction(BasicBlockInContext call, BasicBlockInContext src, BasicBlockInContext dest) { return IdentityFlowFunction.identity(); @@ -202,6 +211,7 @@ public class ContextSensitiveReachingDefs { /** * we use the entry block of the CGNode as the fake entry when propagating from callee to caller with unbalanced parens */ + @Override public BasicBlockInContext getFakeEntry(BasicBlockInContext node) { final CGNode cgNode = node.getNode(); return getFakeEntry(cgNode); @@ -240,10 +250,12 @@ public class ContextSensitiveReachingDefs { return result; } + @Override public IPartiallyBalancedFlowFunctions> getFunctionMap() { return flowFunctions; } + @Override public TabulationDomain, BasicBlockInContext> getDomain() { return domain; } @@ -251,14 +263,17 @@ public class ContextSensitiveReachingDefs { /** * we don't need a merge function; the default unioning of tabulation works fine */ + @Override public IMergeFunction getMergeFunction() { return null; } + @Override public ISupergraph, CGNode> getSupergraph() { return supergraph; } + @Override public Collection>> initialSeeds() { return initialSeeds; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java index 8289746db..eca082f23 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/analysis/dataflow/IntraprocReachingDefs.java @@ -103,6 +103,7 @@ public class IntraprocReachingDefs { private class TransferFunctions implements ITransferFunctionProvider { + @Override public UnaryOperator getEdgeTransferFunction(IExplodedBasicBlock src, IExplodedBasicBlock dst) { throw new UnsupportedOperationException(); } @@ -110,10 +111,12 @@ public class IntraprocReachingDefs { /** * our meet operator is set union */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(IExplodedBasicBlock node) { SSAInstruction instruction = node.getInstruction(); int instructionIndex = node.getFirstInstructionIndex(); @@ -132,11 +135,13 @@ public class IntraprocReachingDefs { } } + @Override public boolean hasEdgeTransferFunctions() { // we only need transfer functions on nodes return false; } + @Override public boolean hasNodeTransferFunctions() { return true; } diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java index 8c7ea772a..05f6fef93 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFCallGraph.java @@ -196,6 +196,7 @@ public class PDFCallGraph { */ private static class ApplicationLoaderFilter implements Filter { + @Override public boolean accepts(CGNode o) { if (o instanceof CGNode) { CGNode n = (CGNode) o; diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java index 48de77f93..cddb80c79 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSDG.java @@ -162,6 +162,7 @@ public class PDFSDG { private static Graph pruneSDG(final SDG sdg) { Filter f = new Filter() { + @Override public boolean accepts(Statement o) { Statement s = (Statement) o; if (s.getNode().equals(sdg.getCallGraph().getFakeRootNode())) { @@ -178,6 +179,7 @@ public class PDFSDG { private static NodeDecorator makeNodeDecorator() { return new NodeDecorator() { + @Override public String getLabel(Object o) throws WalaException { Statement s = (Statement) o; switch (s.getKind()) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java index c73e11cb3..0344a2b13 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFSlice.java @@ -245,6 +245,7 @@ public class PDFSlice { */ public static Graph pruneSDG(SDG sdg, final Collection slice) { Filter f = new Filter() { + @Override public boolean accepts(Statement o) { return slice.contains(o); } @@ -257,6 +258,7 @@ public class PDFSlice { */ public static NodeDecorator makeNodeDecorator() { return new NodeDecorator() { + @Override public String getLabel(Object o) throws WalaException { Statement s = (Statement) o; switch (s.getKind()) { diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java index bbcb500ed..681042bd1 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/examples/drivers/PDFTypeHierarchy.java @@ -103,6 +103,7 @@ public class PDFTypeHierarchy { */ public static Graph pruneForAppLoader(Graph g) throws WalaException { Filter f = new Filter() { + @Override public boolean accepts(IClass c) { return (c.getClassLoader().getReference().equals(ClassLoaderReference.Application)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java index 8dfdd02d8..4f2fa9cd5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/BasicHeapGraph.java @@ -76,22 +76,27 @@ public class BasicHeapGraph extends HeapGraph { final OrdinalSetMapping pointerKeys = getPointerKeys(); final NumberedNodeManager nodeMgr = new NumberedNodeManager() { + @Override public Iterator iterator() { return new CompoundIterator(pointerKeys.iterator(), P.getInstanceKeyMapping().iterator()); } + @Override public int getNumberOfNodes() { return pointerKeys.getSize() + P.getInstanceKeyMapping().getSize(); } + @Override public void addNode(Object n) { Assertions.UNREACHABLE(); } + @Override public void removeNode(Object n) { Assertions.UNREACHABLE(); } + @Override public int getNumber(Object N) { if (N instanceof PointerKey) { return pointerKeys.getMappedIndex((PointerKey) N); @@ -104,6 +109,7 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public Object getNode(int number) { if (number > pointerKeys.getMaximumIndex()) { return P.getInstanceKeyMapping().getMappedObject(number - pointerKeys.getSize()); @@ -112,14 +118,17 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public int getMaxNumber() { return getNumberOfNodes() - 1; } + @Override public boolean containsNode(Object n) { return getNumber(n) != -1; } + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } @@ -127,6 +136,7 @@ public class BasicHeapGraph extends HeapGraph { final IBinaryNaturalRelation pred = computePredecessors(nodeMgr); final IntFunction toNode = new IntFunction() { + @Override public Object apply(int i) { return nodeMgr.getNode(i); } @@ -134,6 +144,7 @@ public class BasicHeapGraph extends HeapGraph { this.G = new AbstractNumberedGraph() { private final NumberedEdgeManager edgeMgr = new NumberedEdgeManager() { + @Override public Iterator getPredNodes(Object N) { int n = nodeMgr.getNumber(N); IntSet p = pred.getRelated(n); @@ -144,6 +155,7 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public IntSet getPredNodeNumbers(Object N) { int n = nodeMgr.getNumber(N); IntSet p = pred.getRelated(n); @@ -154,11 +166,13 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public int getPredNodeCount(Object N) { int n = nodeMgr.getNumber(N); return pred.getRelatedCount(n); } + @Override public Iterator getSuccNodes(Object N) { int[] succ = computeSuccNodeNumbers(N, nodeMgr); if (succ == null) { @@ -168,6 +182,7 @@ public class BasicHeapGraph extends HeapGraph { return new IntMapIterator(s.intIterator(), toNode); } + @Override public IntSet getSuccNodeNumbers(Object N) { int[] succ = computeSuccNodeNumbers(N, nodeMgr); if (succ == null) { @@ -177,31 +192,38 @@ public class BasicHeapGraph extends HeapGraph { } } + @Override public int getSuccNodeCount(Object N) { int[] succ = computeSuccNodeNumbers(N, nodeMgr); return succ == null ? 0 : succ.length; } + @Override public void addEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(Object src, Object dst) { Assertions.UNREACHABLE(); return false; @@ -354,6 +376,7 @@ public class BasicHeapGraph extends HeapGraph { * sorts local pointers by node, then value number */ private final class LocalPointerComparator implements Comparator { + @Override public int compare(Object arg1, Object arg2) { LocalPointerKey o1 = (LocalPointerKey) arg1; LocalPointerKey o2 = (LocalPointerKey) arg2; @@ -368,6 +391,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(Object N) { return G.getNumber(N); } @@ -375,6 +399,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNode(int) */ + @Override public Object getNode(int number) { return G.getNode(number); } @@ -382,6 +407,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getMaxNumber() */ + @Override public int getMaxNumber() { return G.getMaxNumber(); } @@ -389,6 +415,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#iterateNodes() */ + @Override public Iterator iterator() { return G.iterator(); } @@ -396,6 +423,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return G.getNumberOfNodes(); } @@ -403,6 +431,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getPredNodes(Object N) { return G.getPredNodes(N); } @@ -410,6 +439,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(Object N) { return G.getPredNodeCount(N); } @@ -417,6 +447,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getSuccNodes(Object N) { return G.getSuccNodes(N); } @@ -424,6 +455,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(Object N) { return G.getSuccNodeCount(N); } @@ -431,6 +463,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(Object n) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -438,23 +471,28 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(Object n) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void addEdge(Object from, Object to) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Object from, Object to) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(Object from, Object to) throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public void removeAllIncidentEdges(Object node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -462,6 +500,7 @@ public class BasicHeapGraph extends HeapGraph { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(Object N) { return G.containsNode(N); } @@ -492,19 +531,23 @@ public class BasicHeapGraph extends HeapGraph { return result.toString(); } + @Override public void removeIncomingEdges(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public IntSet getSuccNodeNumbers(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java index 9b3b242ce..16c3c3c3d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/pointers/HeapGraph.java @@ -46,12 +46,14 @@ public abstract class HeapGraph implements NumberedGraph { this.pa = pa; } + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } public Collection getReachableInstances(Set roots) { Filter f = new Filter() { + @Override public boolean accepts(Object o) { return (o instanceof InstanceKey); } @@ -59,6 +61,7 @@ public abstract class HeapGraph implements NumberedGraph { return DFS.getReachableNodes(this, roots, f); } + @Override public void removeNodeAndEdges(Object N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java index 49ea6f3e3..7694616d1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextInterpreter.java @@ -44,6 +44,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { private static final boolean DEBUG = false; + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -56,6 +57,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; @@ -64,6 +66,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#understands(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -77,6 +80,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateNewSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -93,6 +97,7 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateCallSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return EmptyIterator.instance(); @@ -123,22 +128,27 @@ public class ClassFactoryContextInterpreter implements SSAContextInterpreter { return new SyntheticIR(method, context, new InducedCFG(instrs, method, context), instrs, SSAOptions.defaultOptions(), null); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java index dc6df81f0..f9a3f2034 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassFactoryContextSelector.java @@ -84,6 +84,7 @@ class ClassFactoryContextSelector implements ContextSelector { * com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, * InstanceKey[]) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (isClassFactory(callee.getReference())) { IR ir = caller.getIR(); @@ -110,6 +111,7 @@ class ClassFactoryContextSelector implements ContextSelector { private static final IntSet firstParameter = IntSetUtil.make(new int[]{1}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (isClassFactory(site.getDeclaredTarget())) { SSAAbstractInvokeInstruction[] invokeInstructions = caller.getIR().getCalls(site); diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java index ddfce7790..903cf5689 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextInterpreter.java @@ -63,6 +63,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp this.cha = cha; } + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -75,11 +76,13 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; } + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -90,6 +93,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return node.getMethod().getReference().equals(CLASS_NEW_INSTANCE_REF); } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -103,6 +107,7 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return EmptyIterator.instance(); } + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return EmptyIterator.instance(); @@ -151,22 +156,27 @@ public class ClassNewInstanceContextInterpreter extends AbstractReflectionInterp return null; } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java index f2f84eeb8..0440987c3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ClassNewInstanceContextSelector.java @@ -36,6 +36,7 @@ class ClassNewInstanceContextSelector implements ContextSelector { * representing the type of the IClass. (This corresponds to the case where we know the exact type that will be * allocated by the Class.newInstance() call.) Otherwise, return null. */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(ClassNewInstanceContextInterpreter.CLASS_NEW_INSTANCE_REF) && isTypeConstant(receiver[0])) { IClass c = (IClass) ((ConstantKey) receiver[0]).getValue(); @@ -58,6 +59,7 @@ class ClassNewInstanceContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java index c2c122c2a..ce981a62b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/CloneInterpreter.java @@ -99,6 +99,7 @@ public class CloneInterpreter implements SSAContextInterpreter { private final SSAInstructionFactory insts = Language.JAVA.instructionFactory(); + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -113,11 +114,13 @@ public class CloneInterpreter implements SSAContextInterpreter { return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; } + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -125,6 +128,7 @@ public class CloneInterpreter implements SSAContextInterpreter { return (node.getMethod().getReference().equals(CLONE) && ContextUtil.getConcreteClassFromContext(node.getContext()) != null); } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -134,6 +138,7 @@ public class CloneInterpreter implements SSAContextInterpreter { return new NonNullSingletonIterator(NewSiteReference.make(NEW_PC, cls.getReference())); } + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return new NonNullSingletonIterator(ARRAYCOPY_SITE); @@ -215,15 +220,18 @@ public class CloneInterpreter implements SSAContextInterpreter { * @see com.ibm.wala.ipa.callgraph.propagation.cfa.CFAContextInterpreter#recordFactoryType(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.IClass) */ + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { SSAInstruction[] statements = getIR(node).getInstructions(); return CodeScanner.getFieldsRead(statements).iterator(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { SSAInstruction[] statements = getIR(node).getInstructions(); return CodeScanner.getFieldsWritten(statements).iterator(); @@ -249,10 +257,12 @@ public class CloneInterpreter implements SSAContextInterpreter { return CodeScanner.iterateCastTypes(statements); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java index 3abd8382b..e5319f9cc 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryBypassInterpreter.java @@ -82,6 +82,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { this.cache = cache; } + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -115,6 +116,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getNumberOfStatements(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public int getNumberOfStatements(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -127,6 +129,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { * @see com.ibm.wala.ipa.callgraph.rta.RTAContextInterpreter#understands(com.ibm.wala.classLoader.IMethod, * com.ibm.wala.ipa.callgraph.Context) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -141,6 +144,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -162,18 +166,22 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { return m.getInvokeStatements().iterator(); } + @Override public Iterator iterateCallSites(CGNode node) { final Iterator I = getInvokeStatements(node); return new Iterator() { + @Override public boolean hasNext() { return I.hasNext(); } + @Override public CallSiteReference next() { SSAInvokeInstruction s = (SSAInvokeInstruction) I.next(); return s.getCallSite(); } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -205,6 +213,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#recordFactoryType(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.IClass) */ + @Override public boolean recordFactoryType(CGNode node, IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -215,6 +224,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { return recordType(node.getMethod().getClassHierarchy(), node.getContext(), klass.getReference()); } + @Override public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -229,6 +239,7 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { } } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -312,10 +323,12 @@ class FactoryBypassInterpreter extends AbstractReflectionInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getCFG(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java index 0d2f04599..a02807a76 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/FactoryContextSelector.java @@ -33,6 +33,7 @@ class FactoryContextSelector implements ContextSelector { /* * @see com.ibm.wala.ipa.callgraph.ContextSelector#getCalleeTarget(com.ibm.wala.ipa.callgraph.CGNode, com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee == null) { throw new IllegalArgumentException("callee is null"); @@ -46,6 +47,7 @@ class FactoryContextSelector implements ContextSelector { return null; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return EmptyIntSet.instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java index b03758c46..fe56373ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextInterpeter.java @@ -41,6 +41,7 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { private static final boolean DEBUG = false; + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -53,11 +54,13 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { return result; } + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; } + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -68,10 +71,12 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { return node.getMethod().getReference().equals(GetClassContextSelector.GET_CLASS); } + @Override public Iterator iterateNewSites(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateCallSites(CGNode node) { return EmptyIterator.instance(); } @@ -101,22 +106,27 @@ public class GetClassContextInterpeter implements SSAContextInterpreter { return new SyntheticIR(method, context, new InducedCFG(instrs, method, context), instrs, SSAOptions.defaultOptions(), null); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java index 694e00542..558777805 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/GetClassContextSelector.java @@ -39,6 +39,7 @@ class GetClassContextSelector implements ContextSelector { * com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, * com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(GET_CLASS)) { return new JavaTypeContext(new PointType(receiver[0].getConcreteType())); @@ -48,6 +49,7 @@ class GetClassContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java index 6049a6ff3..292c5469c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/IllegalArgumentExceptionContext.java @@ -17,6 +17,7 @@ import com.ibm.wala.ipa.callgraph.ContextKey; public class IllegalArgumentExceptionContext implements Context { + @Override public ContextItem get(ContextKey name) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java index 70481fb3b..d06fc05d7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextInterpreter.java @@ -90,6 +90,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getIR(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -148,6 +149,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getNumberOfStatements(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; @@ -156,6 +158,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#understands(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -169,6 +172,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { || mRef.equals(GET_DECLARED_METHODS); } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -182,6 +186,7 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { return EmptyIterator.instance(); } + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return EmptyIterator.instance(); @@ -404,22 +409,27 @@ public class JavaLangClassContextInterpreter implements SSAContextInterpreter { } } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java index e81d61a80..a03fa0217 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaLangClassContextSelector.java @@ -48,6 +48,7 @@ class JavaLangClassContextSelector implements ContextSelector { * If the {@link CallSiteReference} invokes a method we understand and c is a type constant, return a {@link JavaTypeContext} * representing the type named by s, if we can resolve it in the {@link IClassHierarchy}. */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver != null && receiver.length > 0 && mayUnderstand(caller, site, callee, receiver[0])) { return new JavaTypeContext(new PointType(getTypeConstant(receiver[0]))); @@ -87,6 +88,7 @@ class JavaLangClassContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java index 93cae38b1..b7b861b1c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/JavaTypeContext.java @@ -32,6 +32,7 @@ public class JavaTypeContext implements Context { this.type = type; } + @Override public ContextItem get(ContextKey name) { if (name == ContextKey.RECEIVER) { return type; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java index 86b972a07..dda789e34 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextInterpreter.java @@ -42,50 +42,60 @@ public class ReflectionContextInterpreter { // start with a dummy interpreter that understands nothing SSAContextInterpreter result = new SSAContextInterpreter() { + @Override public boolean understands(CGNode node) { return false; } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // TODO Auto-generated method stub return false; } + @Override public Iterator iterateNewSites(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public Iterator iterateFieldsWritten(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public Iterator iterateFieldsRead(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public Iterator iterateCallSites(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public int getNumberOfStatements(CGNode node) { // TODO Auto-generated method stub return 0; } + @Override public IR getIR(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public DefUse getDU(CGNode node) { // TODO Auto-generated method stub return null; } + @Override public ControlFlowGraph getCFG(CGNode n) { // TODO Auto-generated method stub return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java index c9f856e80..5b64a80ee 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectionContextSelector.java @@ -34,9 +34,11 @@ public class ReflectionContextSelector { // start with a dummy ContextSelector result = new ContextSelector() { + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return null; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return EmptyIntSet.instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java index 0568d7bfc..1371e6934 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationInterpreter.java @@ -55,6 +55,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getIR(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -73,6 +74,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.SSAContextInterpreter#getNumberOfStatements(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public int getNumberOfStatements(CGNode node) { assert understands(node); return getIR(node).getInstructions().length; @@ -81,6 +83,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#understands(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean understands(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -98,6 +101,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateNewSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -109,6 +113,7 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret /* * @see com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter#iterateCallSites(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public Iterator iterateCallSites(CGNode node) { assert understands(node); return getIR(node).iterateCallSites(); @@ -202,22 +207,27 @@ public class ReflectiveInvocationInterpreter extends AbstractReflectionInterpret return new SyntheticIR(method, context, new InducedCFG(instrs, method, context), instrs, SSAOptions.defaultOptions(), constants); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } + @Override public ControlFlowGraph getCFG(CGNode N) { return getIR(N).getControlFlowGraph(); } + @Override public DefUse getDU(CGNode node) { return new DefUse(getIR(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java index dc3426cee..72aedf89f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/reflection/ReflectiveInvocationSelector.java @@ -47,6 +47,7 @@ class ReflectiveInvocationSelector implements ContextSelector { *
  • Otherwise, return a new {@link ReceiverInstanceContext} for receiver. * */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver == null || receiver.length == 0 || !mayUnderstand(caller, site, callee, receiver[0])) { return null; @@ -126,6 +127,7 @@ class ReflectiveInvocationSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isDispatch() || site.getDeclaredTarget().getNumberOfParameters() > 0) { return thisParameter; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java index 316ac6cc1..1e5700fe1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/stackMachine/AbstractIntStackMachine.java @@ -100,14 +100,17 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { protected void init(Meeter meeter, final FlowProvider flow) { final MeetOperator meet = new MeetOperator(meeter); ITransferFunctionProvider xferFunctions = new ITransferFunctionProvider() { + @Override public boolean hasNodeTransferFunctions() { return flow.needsNodeFlow(); } + @Override public boolean hasEdgeTransferFunctions() { return flow.needsEdgeFlow(); } + @Override public UnaryOperator getNodeTransferFunction(final BasicBlock node) { return new UnaryOperator() { @Override @@ -142,6 +145,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { }; } + @Override public UnaryOperator getEdgeTransferFunction(final BasicBlock from, final BasicBlock to) { return new UnaryOperator() { @Override @@ -176,6 +180,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { }; } + @Override public AbstractMeetOperator getMeetOperator() { return meet; } @@ -717,6 +722,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { return result; } + @Override public void copyState(MachineState other) { if (other.stack == null) { stack = null; @@ -834,14 +840,17 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { this.edgeVisitor = ev; } + @Override public boolean needsNodeFlow() { return true; } + @Override public boolean needsEdgeFlow() { return false; } + @Override public MachineState flow(MachineState entry, BasicBlock basicBlock) { workingState = entry.duplicate(); currentBlock = basicBlock; @@ -861,6 +870,7 @@ public abstract class AbstractIntStackMachine implements FixedPointConstants { return workingState; } + @Override public MachineState flow(MachineState entry, BasicBlock from, BasicBlock to) { workingState = entry.duplicate(); currentBlock = from; diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java index 47e9c39ca..7c551947c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeInference.java @@ -505,6 +505,7 @@ public class TypeInference extends SSAInference implements FixedPo protected AbstractOperator result = null; + @Override public AbstractOperator get(SSAInstruction instruction) { instruction.visit(this); AbstractOperator temp = result; @@ -705,15 +706,18 @@ public class TypeInference extends SSAInference implements FixedPo } } + @Override public void visitAddressOf(SSAAddressOfInstruction instruction) { TypeReference type = language.getPointerType(instruction.getType()); result = getPointerTypeOperator(type); } + @Override public void visitLoadIndirect(SSALoadIndirectInstruction instruction) { result = getPointerTypeOperator(instruction.getLoadedType()); } + @Override public void visitStoreIndirect(SSAStoreIndirectInstruction instruction) { Assertions.UNREACHABLE(); } @@ -721,6 +725,7 @@ public class TypeInference extends SSAInference implements FixedPo public class TypeVarFactory implements VariableFactory { + @Override public IVariable makeVariable(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (doPrimitives) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java index 2a32b021c..0571f737c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java +++ b/com.ibm.wala.core/src/com/ibm/wala/analysis/typeInference/TypeVariable.java @@ -28,6 +28,7 @@ public class TypeVariable extends AbstractVariable { this.type = type; } + @Override public void copyState(TypeVariable other) throws IllegalArgumentException { if (other == null) { throw new IllegalArgumentException("v == null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java b/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java index 1c91efa72..113a5abf5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/cfg/AbstractCFG.java @@ -121,6 +121,7 @@ public abstract class AbstractCFG> implements Contro /** * Return the entry basic block for the CFG. */ + @Override public T entry() { return getNode(0); } @@ -128,10 +129,12 @@ public abstract class AbstractCFG> implements Contro /** * Return the exit basic block for the CFG. */ + @Override public T exit() { return exit; } + @Override public int getPredNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -218,6 +221,7 @@ public abstract class AbstractCFG> implements Contro return getNumberOfExceptionalOut(getNumber(N)); } + @Override public Iterator getPredNodes(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -261,6 +265,7 @@ public abstract class AbstractCFG> implements Contro } } + @Override public int getSuccNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -299,6 +304,7 @@ public abstract class AbstractCFG> implements Contro return Iterator2Collection.toSet(getSuccNodes(N)).size(); } + @Override public Iterator getSuccNodes(T N) { int number = getNumber(N); if (normalToExit.get(number) && exceptionalToExit.get(number)) { @@ -392,38 +398,47 @@ public abstract class AbstractCFG> implements Contro /** * @param n */ + @Override public void addNode(T n) { nodeManager.addNode(n); } + @Override public int getMaxNumber() { return nodeManager.getMaxNumber(); } + @Override public T getNode(int number) { return nodeManager.getNode(number); } + @Override public int getNumber(T N) { return nodeManager.getNumber(N); } + @Override public int getNumberOfNodes() { return nodeManager.getNumberOfNodes(); } + @Override public Iterator iterator() { return nodeManager.iterator(); } + @Override public void addEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE("Don't call me .. use addNormalEdge or addExceptionalEdge"); } + @Override public void removeEdge(T src, T dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public boolean hasEdge(T src, T dst) { if (dst == null) { throw new IllegalArgumentException("dst is null"); @@ -507,6 +522,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.Graph#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(T N) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -514,6 +530,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -521,6 +538,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T N) { return nodeManager.containsNode(N); } @@ -557,10 +575,12 @@ public abstract class AbstractCFG> implements Contro /** * Returns the catchBlocks. */ + @Override public BitVector getCatchBlocks() { return catchBlocks; } + @Override public IMethod getMethod() { return method; } @@ -568,6 +588,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -575,6 +596,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalSuccessors(com.ibm.wala.cfg.T) */ + @Override public List getExceptionalSuccessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -589,6 +611,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalSuccessors(com.ibm.wala.cfg.T) */ + @Override public Collection getNormalSuccessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -599,14 +622,17 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } + @Override public void removeIncomingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); } @@ -622,6 +648,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalPredecessors(com.ibm.wala.cfg.T) */ + @Override public Collection getExceptionalPredecessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -632,6 +659,7 @@ public abstract class AbstractCFG> implements Contro /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalPredecessors(com.ibm.wala.cfg.T) */ + @Override public Collection getNormalPredecessors(T b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -639,6 +667,7 @@ public abstract class AbstractCFG> implements Contro return Iterator2Collection.toSet(iterateNormalPredecessors(b)); } + @Override public IntSet getPredNodeNumbers(T node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -647,6 +676,7 @@ public abstract class AbstractCFG> implements Contro /* * TODO: optimize this. */ + @Override public IntSet getSuccNodeNumbers(T node) { int number = getNumber(node); IntSet s = normalEdgeManager.getSuccNodeNumbers(node); diff --git a/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java index 9dfac2f80..26d7c8a86 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/cfg/InducedCFG.java @@ -111,6 +111,7 @@ public class InducedCFG extends AbstractCFG iterator() { return new ArrayIterator(getInstructions(), getFirstInstructionIndex(), getLastInstructionIndex()); } @@ -580,6 +590,7 @@ public class InducedCFG extends AbstractCFG { return (o instanceof ShrikeCFG) && getMethod().equals(((ShrikeCFG) o).getMethod()); } + @Override public IInstruction[] getInstructions() { try { return method.getInstructions(); @@ -216,6 +217,7 @@ public class ShrikeCFG extends AbstractCFG { /** * Return an instruction's basic block in the CFG given the index of the instruction in the CFG's instruction array. */ + @Override public BasicBlock getBlockForInstruction(int index) { return getNode(instruction2Block[index]); } @@ -231,6 +233,7 @@ public class ShrikeCFG extends AbstractCFG { this.startIndex = startIndex; } + @Override public boolean isCatchBlock() { return ShrikeCFG.this.isCatchBlock(getNumber()); } @@ -421,6 +424,7 @@ public class ShrikeCFG extends AbstractCFG { addExceptionalEdge(this, b); } + @Override public int getLastInstructionIndex() { if (this == entry() || this == exit()) { // these are the special end blocks @@ -439,6 +443,7 @@ public class ShrikeCFG extends AbstractCFG { } } + @Override public int getFirstInstructionIndex() { return startIndex; } @@ -451,6 +456,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#isExitBlock() */ + @Override public boolean isExitBlock() { return this == ShrikeCFG.this.exit(); } @@ -458,6 +464,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#isEntryBlock() */ + @Override public boolean isEntryBlock() { return this == ShrikeCFG.this.entry(); } @@ -465,6 +472,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#getMethod() */ + @Override public IMethod getMethod() { return ShrikeCFG.this.getMethod(); } @@ -483,10 +491,12 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.BasicBlock#getNumber() */ + @Override public int getNumber() { return getGraphNodeId(); } + @Override public Iterator iterator() { return new ArrayIterator(getInstructions(), getFirstInstructionIndex(), getLastInstructionIndex()); } @@ -517,6 +527,7 @@ public class ShrikeCFG extends AbstractCFG { /* * @see com.ibm.wala.cfg.ControlFlowGraph#getProgramCounter(int) */ + @Override public int getProgramCounter(int index) { try { return method.getBytecodeIndex(index); diff --git a/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java b/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java index ead3feea4..dc749fbbe 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/cfg/cdg/ControlDependenceGraph.java @@ -114,6 +114,7 @@ public class ControlDependenceGraph> extends Abstrac } } + @Override public Iterator getPredNodes(T N) { if (backwardEdges.containsKey(N)) return backwardEdges.get(N).iterator(); @@ -121,6 +122,7 @@ public class ControlDependenceGraph> extends Abstrac return EmptyIterator.instance(); } + @Override public IntSet getPredNodeNumbers(T node) { MutableIntSet x = IntSetUtil.make(); if (backwardEdges.containsKey(node)) { @@ -131,6 +133,7 @@ public class ControlDependenceGraph> extends Abstrac return x; } + @Override public int getPredNodeCount(T N) { if (backwardEdges.containsKey(N)) return ((Set) backwardEdges.get(N)).size(); @@ -138,6 +141,7 @@ public class ControlDependenceGraph> extends Abstrac return 0; } + @Override public Iterator getSuccNodes(T N) { if (forwardEdges.containsKey(N)) return forwardEdges.get(N).iterator(); @@ -145,6 +149,7 @@ public class ControlDependenceGraph> extends Abstrac return EmptyIterator.instance(); } + @Override public IntSet getSuccNodeNumbers(T node) { MutableIntSet x = IntSetUtil.make(); if (forwardEdges.containsKey(node)) { @@ -155,6 +160,7 @@ public class ControlDependenceGraph> extends Abstrac return x; } + @Override public int getSuccNodeCount(T N) { if (forwardEdges.containsKey(N)) return ((Set) forwardEdges.get(N)).size(); @@ -162,26 +168,32 @@ public class ControlDependenceGraph> extends Abstrac return 0; } + @Override public boolean hasEdge(T src, T dst) { return forwardEdges.containsKey(src) && ((Set) forwardEdges.get(src)).contains(dst); } + @Override public void addEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeAllIncidentEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(T node) { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java index cd8ad5b72..95c977025 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClass.java @@ -65,6 +65,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getClassLoader() */ + @Override public IClassLoader getClassLoader() { return loader; } @@ -72,6 +73,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getName() */ + @Override public TypeName getName() { return getReference().getName(); } @@ -79,6 +81,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isInterface() */ + @Override public boolean isInterface() { return false; } @@ -86,6 +89,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isAbstract() */ + @Override public boolean isAbstract() { return false; } @@ -93,6 +97,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getModifiers() */ + @Override public int getModifiers() { return ACC_PUBLIC | ACC_FINAL; } @@ -104,6 +109,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getSuperclass() */ + @Override public IClass getSuperclass() { IClass elt = getElementClass(); assert getReference().getArrayElementType().isPrimitiveType() || elt != null; @@ -126,14 +132,17 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IMethod getMethod(Selector sig) { return cha.lookupClass(getClassLoader().getLanguage().getRootType()).getMethod(sig); } + @Override public IField getField(Atom name) { return getSuperclass().getField(name); } + @Override public IField getField(Atom name, TypeName typeName) { return getSuperclass().getField(name, typeName); } @@ -141,6 +150,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() { return Collections.emptySet(); } @@ -152,6 +162,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getReference() */ + @Override public TypeReference getReference() { return type; } @@ -159,6 +170,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getSourceFileName() */ + @Override public String getSourceFileName() { return null; } @@ -166,6 +178,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() { return null; } @@ -173,6 +186,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isArrayClass() */ + @Override public boolean isArrayClass() { return true; } @@ -201,6 +215,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredFields() */ + @Override public Collection getDeclaredInstanceFields() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -208,6 +223,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ + @Override public Collection getDeclaredStaticFields() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -216,6 +232,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllImplementedInterfaces() */ + @Override public Collection getAllImplementedInterfaces() { HashSet result = HashSetFactory.make(2); for (TypeReference ref : getClassLoader().getLanguage().getArrayInterfaces()) { @@ -238,6 +255,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#isReferenceType() */ + @Override public boolean isReferenceType() { return true; } @@ -279,6 +297,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() throws UnimplementedError { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -298,6 +317,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { Assertions.UNREACHABLE(); return null; @@ -306,6 +326,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields() { Assertions.UNREACHABLE(); return null; @@ -314,6 +335,7 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { return loader.lookupClass(getClassLoader().getLanguage().getRootType().getName()).getAllMethods(); } @@ -321,27 +343,33 @@ public class ArrayClass implements IClass, Constants { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { Assertions.UNREACHABLE(); return null; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public boolean isPublic() { return true; } + @Override public boolean isPrivate() { return false; } + @Override public InputStream getSource() { return null; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BinaryDirectoryTreeModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BinaryDirectoryTreeModule.java index f00d7c270..9dead1d0e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BinaryDirectoryTreeModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BinaryDirectoryTreeModule.java @@ -33,7 +33,7 @@ public class BinaryDirectoryTreeModule extends DirectoryTreeModule { @Override protected FileModule makeFile(final File file) { try { - return new ClassFileModule(file); + return new ClassFileModule(file, this); } catch (InvalidClassFileException e) { Warnings.add(new Warning(Warning.MODERATE) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index 5b3d235cb..8b7ec7bf6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -144,6 +144,8 @@ public abstract class BytecodeClass implements IClass { } } + public abstract Module getContainer(); + public IClassLoader getClassLoader() { return loader; } @@ -570,6 +572,5 @@ public abstract class BytecodeClass implements IClass { } } } - } - + } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java index 8e01d26a3..23804672c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderFactoryImpl.java @@ -53,6 +53,7 @@ public class ClassLoaderFactoryImpl implements ClassLoaderFactory { * @param classLoaderReference * identifier for the desired class loader */ + @Override public IClassLoader getLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, AnalysisScope scope) throws IOException { if (classLoaderReference == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java index c0715a634..a26566cd1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ClassLoaderImpl.java @@ -431,6 +431,7 @@ public class ClassLoaderImpl implements IClassLoader { * * @throws IllegalArgumentException if modules is null */ + @Override public void init(List modules) throws IOException { if (modules == null) { @@ -529,10 +530,12 @@ public class ClassLoaderImpl implements IClassLoader { } } + @Override public ClassLoaderReference getReference() { return loader; } + @Override public Iterator iterateAllClasses() { return getAllClasses().iterator(); } @@ -540,6 +543,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#lookupClass(com.ibm.wala.types.TypeName) */ + @Override public IClass lookupClass(TypeName className) { if (className == null) { throw new IllegalArgumentException("className is null"); @@ -569,14 +573,17 @@ public class ClassLoaderImpl implements IClassLoader { /** * Method getParent. */ + @Override public IClassLoader getParent() { return parent; } + @Override public Atom getName() { return loader.getName(); } + @Override public Language getLanguage() { return Language.JAVA; } @@ -589,6 +596,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getNumberOfClasses() */ + @Override public int getNumberOfClasses() { return getAllClasses().size(); } @@ -596,6 +604,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getNumberOfMethods() */ + @Override public int getNumberOfMethods() { int result = 0; for (Iterator it = iterateAllClasses(); it.hasNext();) { @@ -608,6 +617,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getSourceFileName(com.ibm.wala.classLoader.IClass) */ + @Override public String getSourceFileName(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -616,14 +626,17 @@ public class ClassLoaderImpl implements IClassLoader { return e == null ? null : e.getName(); } + @Override public InputStream getSource(IMethod method, int offset) { return getSource(method.getDeclaringClass()); } + @Override public String getSourceFileName(IMethod method, int offset) { return getSourceFileName(method.getDeclaringClass()); } + @Override public InputStream getSource(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -635,6 +648,7 @@ public class ClassLoaderImpl implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#removeAll(java.util.Collection) */ + @Override public void removeAll(Collection toRemove) { if (toRemove == null) { throw new IllegalArgumentException("toRemove is null"); @@ -649,6 +663,7 @@ public class ClassLoaderImpl implements IClassLoader { } } + @Override public SSAInstructionFactory getInstructionFactory() { return getLanguage().instructionFactory(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java index a96e60e7d..e6e25d06e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/DirectoryTreeModule.java @@ -66,6 +66,7 @@ public abstract class DirectoryTreeModule implements Module { return result; } + @Override public Iterator getEntries() { return getEntriesRecursive(root).iterator(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java index 141233efe..7077fde69 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/FieldImpl.java @@ -50,6 +50,7 @@ public final class FieldImpl implements IField { /* * @see com.ibm.wala.classLoader.IMember#getDeclaringClass() */ + @Override public IClass getDeclaringClass() { return declaringClass; } @@ -79,6 +80,7 @@ public final class FieldImpl implements IField { return fr.toString(); } + @Override public FieldReference getReference() { return FieldReference.findOrCreate(getDeclaringClass().getReference(), getName(), getFieldTypeReference()); } @@ -86,6 +88,7 @@ public final class FieldImpl implements IField { /* * @see com.ibm.wala.classLoader.IMember#getName() */ + @Override public Atom getName() { return fieldRef.getName(); } @@ -93,38 +96,47 @@ public final class FieldImpl implements IField { /* * @see com.ibm.wala.classLoader.IField#getFieldTypeReference() */ + @Override public TypeReference getFieldTypeReference() { return fieldRef.getFieldType(); } + @Override public boolean isStatic() { return ((accessFlags & ClassConstants.ACC_STATIC) != 0); } + @Override public boolean isFinal() { return ((accessFlags & ClassConstants.ACC_FINAL) != 0); } + @Override public boolean isPrivate() { return ((accessFlags & ClassConstants.ACC_PRIVATE) != 0); } + @Override public boolean isProtected() { return ((accessFlags & ClassConstants.ACC_PROTECTED) != 0); } + @Override public boolean isPublic() { return ((accessFlags & ClassConstants.ACC_PUBLIC) != 0); } + @Override public boolean isVolatile() { return ((accessFlags & ClassConstants.ACC_VOLATILE) != 0); } + @Override public IClassHierarchy getClassHierarchy() { return declaringClass.getClassHierarchy(); } + @Override public Collection getAnnotations() { return annotations == null ? null : Collections.unmodifiableCollection(annotations); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java index e04c7730c..6b135df89 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IField.java @@ -35,6 +35,7 @@ public interface IField extends IMember { public boolean isPrivate(); public boolean isProtected(); public boolean isPublic(); + @Override public boolean isStatic(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java index a3ab48f99..899584c89 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java @@ -32,20 +32,24 @@ public abstract class JVMClass extends BytecodeClass */ protected int modifiers; + @Override public int getModifiers() { return modifiers; } + @Override public boolean isPublic() { boolean result = ((modifiers & Constants.ACC_PUBLIC) != 0); return result; } + @Override public boolean isPrivate() { boolean result = ((modifiers & Constants.ACC_PRIVATE) != 0); return result; } + @Override public boolean isInterface() { boolean result = ((modifiers & Constants.ACC_INTERFACE) != 0); return result; @@ -55,6 +59,7 @@ public abstract class JVMClass extends BytecodeClass /* * @see com.ibm.wala.classLoader.IClass#isAbstract() */ + @Override public boolean isAbstract() { boolean result = ((modifiers & Constants.ACC_ABSTRACT) != 0); return result; @@ -63,6 +68,7 @@ public abstract class JVMClass extends BytecodeClass /** * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() { try { computeMethodMapIfNeeded(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java index dc7dd536b..509d7ac69 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JarFileModule.java @@ -60,6 +60,7 @@ public class JarFileModule implements Module { /* * @see com.ibm.wala.classLoader.Module#getEntries() */ + @Override public Iterator getEntries() { HashSet result = HashSetFactory.make(); for (Enumeration e = file.entries(); e.hasMoreElements();) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java index 699785859..19ae7f94a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java @@ -74,6 +74,7 @@ import com.ibm.wala.util.warnings.Warnings; public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Constants { public static class JavaInstructionFactory implements SSAInstructionFactory { + @Override public SSAArrayLengthInstruction ArrayLengthInstruction(int result, int arrayref) { return new SSAArrayLengthInstruction(result, arrayref) { @Override @@ -83,6 +84,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAArrayLoadInstruction ArrayLoadInstruction(int result, int arrayref, int index, TypeReference declaredType) { return new SSAArrayLoadInstruction(result, arrayref, index, declaredType) { @Override @@ -92,6 +94,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAArrayStoreInstruction ArrayStoreInstruction(int arrayref, int index, int value, TypeReference declaredType) { return new SSAArrayStoreInstruction(arrayref, index, value, declaredType) { @Override @@ -105,6 +108,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSABinaryOpInstruction BinaryOpInstruction(IBinaryOpInstruction.IOperator operator, boolean overflow, boolean unsigned, int result, int val1, int val2, boolean mayBeInteger) { assert !overflow; @@ -128,10 +132,12 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int[] typeValues, boolean isPEI) { throw new UnsupportedOperationException(); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference[] types, boolean isPEI) { assert types.length == 1; assert isPEI; @@ -143,25 +149,30 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, int typeValue, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new int[]{ typeValue }, true); } + @Override public SSACheckCastInstruction CheckCastInstruction(int result, int val, TypeReference type, boolean isPEI) { assert isPEI; return CheckCastInstruction(result, val, new TypeReference[]{ type }, true); } + @Override public SSAComparisonInstruction ComparisonInstruction(IComparisonInstruction.Operator operator, int result, int val1, int val2) { return new SSAComparisonInstruction(operator, result, val1, val2); } + @Override public SSAConditionalBranchInstruction ConditionalBranchInstruction(IConditionalBranchInstruction.IOperator operator, TypeReference type, int val1, int val2) { return new SSAConditionalBranchInstruction(operator, type, val1, val2); } + @Override public SSAConversionInstruction ConversionInstruction(int result, int val, TypeReference fromType, TypeReference toType, boolean overflow) { assert !overflow; @@ -177,15 +188,18 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAGetCaughtExceptionInstruction GetCaughtExceptionInstruction(int bbNumber, int exceptionValueNumber) { return new SSAGetCaughtExceptionInstruction(bbNumber, exceptionValueNumber); } + @Override public SSAGetInstruction GetInstruction(int result, FieldReference field) { return new SSAGetInstruction(result, field) { }; } + @Override public SSAGetInstruction GetInstruction(int result, int ref, FieldReference field) { return new SSAGetInstruction(result, ref, field) { @Override @@ -195,14 +209,17 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAGotoInstruction GotoInstruction() { return new SSAGotoInstruction(); } + @Override public SSAInstanceofInstruction InstanceofInstruction(int result, int ref, TypeReference checkedType) { return new SSAInstanceofInstruction(result, ref, checkedType); } + @Override public SSAInvokeInstruction InvokeInstruction(int result, int[] params, int exception, CallSiteReference site) { return new SSAInvokeInstruction(result, params, exception, site) { @Override @@ -216,6 +233,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAInvokeInstruction InvokeInstruction(int[] params, int exception, CallSiteReference site) { return new SSAInvokeInstruction(params, exception, site) { @Override @@ -229,6 +247,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAMonitorInstruction MonitorInstruction(int ref, boolean isEnter) { return new SSAMonitorInstruction(ref, isEnter) { @Override @@ -238,6 +257,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site) { return new SSANewInstruction(result, site) { @Override @@ -251,11 +271,13 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAPhiInstruction PhiInstruction(int result, int[] params) throws IllegalArgumentException { return new SSAPhiInstruction(result, params) { }; } + @Override public SSAPutInstruction PutInstruction(int ref, int value, FieldReference field) { return new SSAPutInstruction(ref, value, field) { @Override @@ -265,23 +287,28 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAPutInstruction PutInstruction(int value, FieldReference field) { return new SSAPutInstruction(value, field) { }; } + @Override public SSAReturnInstruction ReturnInstruction() { return new SSAReturnInstruction(); } + @Override public SSAReturnInstruction ReturnInstruction(int result, boolean isPrimitive) { return new SSAReturnInstruction(result, isPrimitive); } + @Override public SSASwitchInstruction SwitchInstruction(int val, int defaultLabel, int[] casesAndLabels) { return new SSASwitchInstruction(val, defaultLabel, casesAndLabels); } + @Override public SSAThrowInstruction ThrowInstruction(int exception) { return new SSAThrowInstruction(exception) { @Override @@ -291,10 +318,12 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAUnaryOpInstruction UnaryOpInstruction(IUnaryOpInstruction.IOperator operator, int result, int val) { return new SSAUnaryOpInstruction(operator, result, val); } + @Override public SSALoadMetadataInstruction LoadMetadataInstruction(int lval, TypeReference entityType, Object token) { return new SSALoadMetadataInstruction(lval, entityType, token) { @Override @@ -304,6 +333,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSANewInstruction NewInstruction(int result, NewSiteReference site, int[] params) { return new SSANewInstruction(result, site, params) { @Override @@ -313,26 +343,32 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons }; } + @Override public SSAPiInstruction PiInstruction(int result, int val, int piBlock, int successorBlock, SSAInstruction cause) { return new SSAPiInstruction(result, val, piBlock, successorBlock, cause); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, int indexVal, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSAAddressOfInstruction AddressOfInstruction(int lval, int local, FieldReference field, TypeReference pointeeType) { throw new UnsupportedOperationException(); } + @Override public SSALoadIndirectInstruction LoadIndirectInstruction(int lval, TypeReference t, int addressVal) { throw new UnsupportedOperationException(); } + @Override public SSAStoreIndirectInstruction StoreIndirectInstruction(int addressVal, int rval, TypeReference pointeeType) { throw new UnsupportedOperationException(); } @@ -406,18 +442,22 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons return exceptionInInitializerError; } + @Override public Atom getName() { return ClassLoaderReference.Java; } + @Override public TypeReference getRootType() { return TypeReference.JavaLangObject; } + @Override public TypeReference getThrowableType() { return TypeReference.JavaLangThrowable; } + @Override public TypeReference getConstantType(Object o) { if (o == null) { // TODO: do we really want null here instead of TypeReference.Null? @@ -446,14 +486,17 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons } } + @Override public boolean isNullType(TypeReference type) { return type == null || type == TypeReference.Null; } + @Override public TypeReference[] getArrayInterfaces() { return new TypeReference[] { TypeReference.JavaIoSerializable, TypeReference.JavaLangCloneable }; } + @Override public TypeName lookupPrimitiveType(String name) { throw new UnsupportedOperationException(); } @@ -464,6 +507,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons * @throws IllegalArgumentException if target is null * @throws IllegalArgumentException if cha is null */ + @Override public Collection inferInvokeExceptions(MethodReference target, IClassHierarchy cha) throws InvalidClassFileException { @@ -509,6 +553,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons * * @throws IllegalArgumentException if pei is null */ + @Override public Collection getImplicitExceptionTypes(IInstruction pei) { if (pei == null) { throw new IllegalArgumentException("pei is null"); @@ -575,48 +620,59 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons } } + @Override public SSAInstructionFactory instructionFactory() { return javaShrikeFactory; } private final static SSAInstructionFactory javaShrikeFactory = new JavaInstructionFactory(); + @Override public boolean isDoubleType(TypeReference type) { return type == TypeReference.Double; } + @Override public boolean isFloatType(TypeReference type) { return type == TypeReference.Float; } + @Override public boolean isIntType(TypeReference type) { return type == TypeReference.Int; } + @Override public boolean isLongType(TypeReference type) { return type == TypeReference.Long; } + @Override public boolean isVoidType(TypeReference type) { return type == TypeReference.Void; } + @Override public boolean isMetadataType(TypeReference type) { return type == TypeReference.JavaLangClass; } + @Override public boolean isStringType(TypeReference type) { return type == TypeReference.JavaLangString; } + @Override public boolean isBooleanType(TypeReference type) { return type == TypeReference.Boolean; } + @Override public boolean isCharType(TypeReference type) { return type == TypeReference.Char; } + @Override public Object getMetadataToken(Object value) { if (value instanceof ClassToken) { return ShrikeUtil.makeTypeReference(ClassLoaderReference.Primordial, ((ClassToken) value).getTypeName()); @@ -626,14 +682,17 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons } } + @Override public TypeReference getPointerType(TypeReference pointee) throws UnsupportedOperationException { throw new UnsupportedOperationException("Java does not permit explicit pointers"); } + @Override public TypeReference getMetadataType() { return TypeReference.JavaLangClass; } + @Override public TypeReference getStringType() { return TypeReference.JavaLangString; } @@ -642,6 +701,7 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons JavaPrimitiveType.init(); } + @Override @SuppressWarnings("static-access") public PrimitiveType getPrimitive(TypeReference reference) { return JavaPrimitiveType.getPrimitive(reference); diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java index 267a2c2be..d6d05a31b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/LanguageImpl.java @@ -30,14 +30,17 @@ public abstract class LanguageImpl implements Language { base.registerDerivedLanguage(this); } + @Override public Language getBaseLanguage() { return baseLang; } + @Override public Set getDerivedLanguages() { return derivedLangs; } + @Override public void registerDerivedLanguage(Language l) { derivedLangs.add(l); if (baseLang != null) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ModuleEntry.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ModuleEntry.java index ebcefaf28..3ce32451c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ModuleEntry.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ModuleEntry.java @@ -58,4 +58,9 @@ public interface ModuleEntry { */ String getClassName(); + /** + * the containing module + */ + Module getContainer(); + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java index 6d595a5b9..a2c97fda1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/NestedJarFileModule.java @@ -21,6 +21,7 @@ public class NestedJarFileModule extends AbstractNestedJarFileModule { private final ZipEntry entry; public NestedJarFileModule(JarFileModule parent, ZipEntry entry) { + super(parent); this.parent = parent; this.entry = entry; if (parent == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java index 5e1697d48..431577cf2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ResourceJarFileModule.java @@ -19,6 +19,7 @@ public class ResourceJarFileModule extends AbstractNestedJarFileModule { private final URL resourceURL; public ResourceJarFileModule(URL resourceURL) { + super(new SourceURLModule(resourceURL)); this.resourceURL = resourceURL; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java index bc6947b6c..cd511571e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeBTMethod.java @@ -326,6 +326,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { } } + @Override public MethodReference getReference() { if (methodReference == null) { methodReference = computeMethodReference(); @@ -333,56 +334,69 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { return methodReference; } + @Override public boolean isClinit() { return getReference().getSelector().equals(MethodReference.clinitSelector); } + @Override public boolean isInit() { return getReference().getName().equals(MethodReference.initAtom); } protected abstract int getModifiers(); + @Override public boolean isNative() { return ((getModifiers() & Constants.ACC_NATIVE) != 0); } + @Override public boolean isAbstract() { return ((getModifiers() & Constants.ACC_ABSTRACT) != 0); } + @Override public boolean isPrivate() { return ((getModifiers() & Constants.ACC_PRIVATE) != 0); } + @Override public boolean isProtected() { return ((getModifiers() & Constants.ACC_PROTECTED) != 0); } + @Override public boolean isPublic() { return ((getModifiers() & Constants.ACC_PUBLIC) != 0); } + @Override public boolean isFinal() { return ((getModifiers() & Constants.ACC_FINAL) != 0); } + @Override public boolean isBridge() { return ((getModifiers() & Constants.ACC_VOLATILE) != 0); } + @Override public boolean isSynchronized() { return ((getModifiers() & Constants.ACC_SYNCHRONIZED) != 0); } + @Override public boolean isStatic() { return ((getModifiers() & Constants.ACC_STATIC) != 0); } + @Override public boolean isSynthetic() { return false; } + @Override public IClass getDeclaringClass() { return declaringClass; } @@ -530,10 +544,12 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { // TODO: ShrikeBT should have a getMaxStack method on Decoder, I think. public abstract int getMaxStackHeight(); + @Override public Atom getName() { return getReference().getName(); } + @Override public Descriptor getDescriptor() { return getReference().getDescriptor(); } @@ -675,6 +691,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /** * By convention, for a non-static method, getParameterType(0) is the this pointer */ + @Override public TypeReference getParameterType(int i) { if (!isStatic()) { if (i == 0) { @@ -692,6 +709,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { * * @return int */ + @Override public int getNumberOfParameters() { if (isStatic() || isClinit()) { return getReference().getNumberOfParameters(); @@ -703,6 +721,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#hasExceptionHandler() */ + @Override public abstract boolean hasExceptionHandler(); /** @@ -712,6 +731,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { * * @see com.ibm.wala.classLoader.IMethod#getDeclaredExceptions() */ + @Override public TypeReference[] getDeclaredExceptions() throws InvalidClassFileException { return (getBCInfo().exceptionTypes == null) ? new TypeReference[0] : getBCInfo().exceptionTypes; } @@ -744,6 +764,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getLineNumber(int) */ + @Override public int getLineNumber(int bcIndex) { try { return (getBCInfo().lineNumberMap == null) ? -1 : getBCInfo().lineNumberMap[bcIndex]; @@ -779,6 +800,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getSignature() */ + @Override public String getSignature() { return getReference().getSignature(); } @@ -786,6 +808,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getSelector() */ + @Override public Selector getSelector() { return getReference().getSelector(); } @@ -793,6 +816,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { /* * @see com.ibm.wala.classLoader.IMethod#getLocalVariableName(int, int) */ + @Override public abstract String getLocalVariableName(int bcIndex, int localNumber); /* @@ -800,6 +824,7 @@ public abstract class ShrikeBTMethod implements IMethod, BytecodeConstants { * * @see com.ibm.wala.classLoader.IMethod#hasLocalVariableTable() */ + @Override public abstract boolean hasLocalVariableTable(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java index 18fc1b5cd..67d166db7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java @@ -308,10 +308,12 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet } } + @Override public TypeReference getReturnType() { return getReference().getReturnType(); } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -355,6 +357,7 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet return Annotation.getAnnotationsFromReader(r, getDeclaringClass().getClassLoader().getReference()); } + @Override public Collection getAnnotations() { Collection result = HashSetFactory.make(); try { @@ -370,16 +373,19 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet private final int[] NOTHING = new int[0]; + @Override public int[] indirectlyReadLocals(int instructionIndex) { return NOTHING; } + @Override public int[] indirectlyWrittenLocals(int instructionIndex) { return NOTHING; } }; + @Override public IndirectionData getIndirectionData() { return NO_INDIRECTIONS; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java index 2fb4a807a..37764809e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeIRFactory.java @@ -36,6 +36,7 @@ public class ShrikeIRFactory implements IRFactory { return ShrikeCFG.make(method); } + @Override public IR makeIR(final IBytecodeMethod method, Context C, final SSAOptions options) throws IllegalArgumentException { if (method == null) { @@ -113,6 +114,7 @@ public class ShrikeIRFactory implements IRFactory { }; } + @Override public boolean contextIsIrrelevant(IBytecodeMethod method) { // this factory always returns the same IR for a method return true; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceDirectoryTreeModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceDirectoryTreeModule.java index a0ceb9596..327404073 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceDirectoryTreeModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceDirectoryTreeModule.java @@ -48,7 +48,7 @@ public class SourceDirectoryTreeModule extends DirectoryTreeModule { assert filePath.startsWith(rootPath); - return new SourceFileModule(file, filePath.substring(rootPath.length())); + return new SourceFileModule(file, filePath.substring(rootPath.length()), this); } @Override diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java index e30faea0c..2a8b2004d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SourceURLModule.java @@ -20,14 +20,17 @@ public class SourceURLModule extends AbstractURLModule implements SourceModule { super(url); } + @Override public boolean isClassFile() { return false; } + @Override public boolean isSourceFile() { return true; } + @Override public Reader getInputReader() { return new InputStreamReader(getInputStream()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java index d38d18ed4..155cb3914 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticClass.java @@ -75,6 +75,7 @@ public abstract class SyntheticClass implements IClass { * Subclasses may override as necessary. * @see com.ibm.wala.classLoader.IClass#getClassLoader() */ + @Override public IClassLoader getClassLoader() { return cha.getLoader(ClassLoaderReference.Primordial); } @@ -82,6 +83,7 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#isInterface() */ + @Override public boolean isInterface() { return false; } @@ -89,6 +91,7 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#isAbstract() */ + @Override public boolean isAbstract() { return false; } @@ -96,6 +99,7 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getReference() */ + @Override public TypeReference getReference() { return T; } @@ -103,10 +107,12 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#getSourceFileName() */ + @Override public String getSourceFileName() { return null; } + @Override public InputStream getSource() { return null; } @@ -114,14 +120,17 @@ public abstract class SyntheticClass implements IClass { /* * @see com.ibm.wala.classLoader.IClass#isArrayClass() */ + @Override public boolean isArrayClass() { return false; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } + @Override public TypeName getName() { return getReference().getName(); } @@ -129,10 +138,12 @@ public abstract class SyntheticClass implements IClass { /** * we assume synthetic classes do not need to have multiple fields with the same name. */ + @Override public IField getField(Atom name, TypeName typeName) { return getField(name); } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java index d3a3d25e4..23eba9bcb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/SyntheticMethod.java @@ -74,6 +74,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isClinit() */ + @Override public boolean isClinit() { return method.getSelector().equals(MethodReference.clinitSelector); } @@ -81,6 +82,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isInit() */ + @Override public boolean isInit() { return method.getSelector().equals(MethodReference.initSelector); } @@ -88,6 +90,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isStatic() */ + @Override public boolean isStatic() { return isStatic; } @@ -95,6 +98,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isNative() */ + @Override public boolean isNative() { return false; } @@ -102,6 +106,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isAbstract() */ + @Override public boolean isAbstract() { return false; } @@ -109,14 +114,17 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isPrivate() */ + @Override public boolean isPrivate() { return false; } + @Override public boolean isProtected() { return false; } + @Override public boolean isPublic() { return false; } @@ -124,6 +132,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isFinal() */ + @Override public boolean isFinal() { return false; } @@ -131,6 +140,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isBridge() */ + @Override public boolean isBridge() { return false; } @@ -138,6 +148,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isAbstract() */ + @Override public boolean isSynchronized() { return false; } @@ -145,6 +156,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#isSynthetic() */ + @Override public boolean isSynthetic() { return true; } @@ -152,6 +164,7 @@ public class SyntheticMethod implements IMethod { /** * @see com.ibm.wala.classLoader.IMethod#getReference() */ + @Override public MethodReference getReference() { return method; } @@ -189,6 +202,7 @@ public class SyntheticMethod implements IMethod { throw new UnsupportedOperationException(); } + @Override public IClass getDeclaringClass() { return declaringClass; } @@ -234,6 +248,7 @@ public class SyntheticMethod implements IMethod { return true; } + @Override public boolean hasExceptionHandler() { return false; } @@ -273,6 +288,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getParameterType(int) */ + @Override public TypeReference getParameterType(int i) { if (isStatic()) { return method.getParameterType(i); @@ -289,6 +305,7 @@ public class SyntheticMethod implements IMethod { * * @see com.ibm.wala.classLoader.IMethod#getNumberOfParameters() */ + @Override public int getNumberOfParameters() { int n = method.getNumberOfParameters(); return isStatic() ? n : n + 1; @@ -297,6 +314,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getDeclaredExceptions() */ + @Override public TypeReference[] getDeclaredExceptions() throws InvalidClassFileException { if (resolvedMethod == null) { return null; @@ -305,10 +323,12 @@ public class SyntheticMethod implements IMethod { } } + @Override public Atom getName() { return method.getSelector().getName(); } + @Override public Descriptor getDescriptor() { return method.getSelector().getDescriptor(); } @@ -316,6 +336,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getLineNumber(int) */ + @Override public int getLineNumber(int bcIndex) { return -1; } @@ -327,6 +348,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getSignature() */ + @Override public String getSignature() { return getReference().getSignature(); } @@ -334,6 +356,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getSelector() */ + @Override public Selector getSelector() { return getReference().getSelector(); } @@ -341,6 +364,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getLocalVariableName(int, int) */ + @Override public String getLocalVariableName(int bcIndex, int localNumber) { // no information is available return null; @@ -349,6 +373,7 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#hasLocalVariableTable() */ + @Override public boolean hasLocalVariableTable() { return false; } @@ -360,14 +385,17 @@ public class SyntheticMethod implements IMethod { /* * @see com.ibm.wala.classLoader.IMethod#getReturnType() */ + @Override public TypeReference getReturnType() { return getReference().getReturnType(); } + @Override public IClassHierarchy getClassHierarchy() { return getDeclaringClass().getClassHierarchy(); } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java index d4d848d8d..6005d94ee 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractAnalysisEngine.java @@ -121,6 +121,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { private HeapGraph heapGraph; private EntrypointBuilder entrypointBuilder = new EntrypointBuilder() { + @Override public Iterable createEntrypoints(AnalysisScope scope, IClassHierarchy cha) { return makeDefaultEntrypoints(scope, cha); } @@ -141,6 +142,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { return builder; } + @Override public void setModuleFiles(Collection moduleFiles) { this.moduleFiles = moduleFiles; } @@ -218,6 +220,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { } } + @Override public void setJ2SELibraries(JarFile[] libs) { if (libs == null) { throw new IllegalArgumentException("libs is null"); @@ -228,6 +231,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { } } + @Override public void setJ2SELibraries(Module[] libs) { if (libs == null) { throw new IllegalArgumentException("libs is null"); @@ -238,6 +242,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { } } + @Override public void setClosedWorld(boolean b) { this.closedWorld = b; } @@ -269,6 +274,7 @@ public abstract class AbstractAnalysisEngine implements AnalysisEngine { this.exclusionsFile = exclusionsFile; } + @Override public AnalysisOptions getDefaultOptions(Iterable entrypoints) { return new AnalysisOptions(getScope(), entrypoints); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java index b245ed7e7..133bb5a7c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java +++ b/com.ibm.wala.core/src/com/ibm/wala/client/AbstractEngineStopwatch.java @@ -36,6 +36,7 @@ public abstract class AbstractEngineStopwatch implements EngineStopwatch { } } + @Override public final String report() { StringBuffer result = new StringBuffer(); long total = 0; @@ -50,6 +51,7 @@ public abstract class AbstractEngineStopwatch implements EngineStopwatch { /** * */ + @Override public void start(byte category) { stopwatch[category].start(); } @@ -57,10 +59,12 @@ public abstract class AbstractEngineStopwatch implements EngineStopwatch { /** * */ + @Override public void stop(byte category) { stopwatch[category].stop(); } + @Override public StopwatchGC getTimer(byte category) { return stopwatch[category]; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java index 010774a66..231e06271 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/BackwardsSupergraph.java @@ -60,6 +60,7 @@ public class BackwardsSupergraph implements ISupergraph { * * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getProcedureGraph() */ + @Override public Graph getProcedureGraph() { return delegate.getProcedureGraph(); } @@ -67,6 +68,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isCall(java.lang.Object) */ + @Override public boolean isCall(T n) { return delegate.isReturn(n); } @@ -78,6 +80,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.Filter#accepts(java.lang.Object) */ + @Override @SuppressWarnings("unchecked") public boolean accepts(Object o) { return delegate.isExit((T) o); @@ -89,6 +92,7 @@ public class BackwardsSupergraph implements ISupergraph { * * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCalledNodes(java.lang.Object) */ + @Override public Iterator getCalledNodes(T ret) { if (DEBUG_LEVEL > 1) { System.err.println(getClass() + " getCalledNodes " + ret); @@ -103,9 +107,11 @@ public class BackwardsSupergraph implements ISupergraph { * * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCalledNodes(java.lang.Object) */ + @Override public Iterator getNormalSuccessors(final T ret) { Iterator allPreds = delegate.getPredNodes(ret); Filter sameProc = new Filter() { + @Override public boolean accepts(T o) { // throw out the exit node, which can be a predecessor due to tail recursion. return getProcOf(ret).equals(getProcOf(o)) && !delegate.isExit(o); @@ -113,6 +119,7 @@ public class BackwardsSupergraph implements ISupergraph { }; Iterator sameProcPreds = new FilterIterator(allPreds, sameProc); Filter notCall = new Filter() { + @Override public boolean accepts(T o) { return !delegate.isCall(o); } @@ -123,6 +130,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getReturnSites(java.lang.Object) */ + @Override public Iterator getReturnSites(T c, P callee) { return delegate.getCallSites(c, callee); } @@ -130,6 +138,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isExit(java.lang.Object) */ + @Override public boolean isExit(T n) { return delegate.isEntry(n); } @@ -137,6 +146,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getProcOf(java.lang.Object) */ + @Override public P getProcOf(T n) { return delegate.getProcOf(n); } @@ -144,11 +154,13 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.Graph#removeNodeAndEdges(java.lang.Object) */ + @Override public void removeNodeAndEdges(Object N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Iterator iterator() { return delegate.iterator(); } @@ -156,6 +168,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } @@ -163,6 +176,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(java.lang.Object) */ + @Override public void addNode(Object n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -170,6 +184,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#removeNode(java.lang.Object) */ + @Override public void removeNode(Object n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); @@ -178,6 +193,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(java.lang.Object) */ + @Override public boolean containsNode(T N) { return delegate.containsNode(N); } @@ -185,6 +201,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(java.lang.Object) */ + @Override public Iterator getPredNodes(T N) { return delegate.getSuccNodes(N); } @@ -192,6 +209,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(java.lang.Object) */ + @Override public int getPredNodeCount(T N) { return delegate.getSuccNodeCount(N); } @@ -199,10 +217,12 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(java.lang.Object) */ + @Override public Iterator getSuccNodes(T N) { return delegate.getPredNodes(N); } + @Override public boolean hasEdge(T src, T dst) { return delegate.hasEdge(dst, src); } @@ -210,6 +230,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(java.lang.Object) */ + @Override public int getSuccNodeCount(T N) { return delegate.getPredNodeCount(N); } @@ -217,10 +238,12 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(java.lang.Object, java.lang.Object) */ + @Override public void addEdge(Object src, Object dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(Object src, Object dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -228,6 +251,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(Object node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -235,6 +259,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getEntriesForProcedure(java.lang.Object) */ + @Override public T[] getEntriesForProcedure(P object) { return delegate.getExitsForProcedure(object); } @@ -242,6 +267,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getEntriesForProcedure(java.lang.Object) */ + @Override public T[] getExitsForProcedure(P object) { return delegate.getEntriesForProcedure(object); } @@ -249,6 +275,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isReturn(java.lang.Object) */ + @Override public boolean isReturn(T n) throws UnimplementedError { return delegate.isCall(n); } @@ -256,6 +283,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCallSites(java.lang.Object) */ + @Override public Iterator getCallSites(T r, P callee) { return delegate.getReturnSites(r, callee); } @@ -263,6 +291,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isEntry(java.lang.Object) */ + @Override public boolean isEntry(T n) { return delegate.isExit(n); } @@ -270,6 +299,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#classifyEdge(java.lang.Object, java.lang.Object) */ + @Override public byte classifyEdge(T src, T dest) { byte d = delegate.classifyEdge(dest, src); switch (d) { @@ -292,11 +322,13 @@ public class BackwardsSupergraph implements ISupergraph { return "Backwards of delegate\n" + delegate; } + @Override public void removeIncomingEdges(Object node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(T node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -304,6 +336,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getNumberOfBlocks(java.lang.Object) */ + @Override public int getNumberOfBlocks(P procedure) { return delegate.getNumberOfBlocks(procedure); } @@ -311,6 +344,7 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlockNumber(java.lang.Object) */ + @Override public int getLocalBlockNumber(T n) { return delegate.getLocalBlockNumber(n); } @@ -318,31 +352,38 @@ public class BackwardsSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlock(java.lang.Object, int) */ + @Override public T getLocalBlock(P procedure, int i) { return delegate.getLocalBlock(procedure, i); } + @Override public int getNumber(T N) { return delegate.getNumber(N); } + @Override public T getNode(int number) { return delegate.getNode(number); } + @Override public int getMaxNumber() { return delegate.getMaxNumber(); } + @Override public Iterator iterateNodes(IntSet s) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getSuccNodeNumbers(T node) { return delegate.getPredNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(Object node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java index 83806fe66..72e24408f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/ICFGSupergraph.java @@ -59,6 +59,7 @@ public class ICFGSupergraph implements ISupergraph getProcedureGraph() { return icfg.getCallGraph(); } @@ -79,6 +80,7 @@ public class ICFGSupergraph implements ISupergraph src, BasicBlockInContext dest) { if (isCall(src)) { if (isEntry(dest)) { @@ -97,12 +99,15 @@ public class ICFGSupergraph implements ISupergraph> getCallSites(BasicBlockInContext r, CGNode callee) { return icfg.getCallSites(r, callee); } + @Override public Iterator> getCalledNodes(BasicBlockInContext call) { final Filter> isEntryFilter = new Filter>() { + @Override public boolean accepts(BasicBlockInContext o) { return o.isEntryBlock(); } @@ -110,21 +115,25 @@ public class ICFGSupergraph implements ISupergraph>(getSuccNodes(call), isEntryFilter); } + @Override @SuppressWarnings("unchecked") public BasicBlockInContext[] getEntriesForProcedure(CGNode procedure) { return new BasicBlockInContext[] { icfg.getEntry(procedure) }; } + @Override @SuppressWarnings("unchecked") public BasicBlockInContext[] getExitsForProcedure(CGNode procedure) { return new BasicBlockInContext[] { icfg.getExit(procedure) }; } + @Override public BasicBlockInContext getLocalBlock(CGNode procedure, int i) { IExplodedBasicBlock b = icfg.getCFG(procedure).getNode(i); return new BasicBlockInContext(procedure, b); } + @Override public int getLocalBlockNumber(BasicBlockInContext n) { return n.getDelegate().getNumber(); } @@ -135,135 +144,165 @@ public class ICFGSupergraph implements ISupergraph> getNormalSuccessors(BasicBlockInContext call) { return EmptyIterator.instance(); } + @Override public int getNumberOfBlocks(CGNode procedure) { Assertions.UNREACHABLE(); return 0; } + @Override public CGNode getProcOf(BasicBlockInContext n) { return icfg.getCGNode(n); } + @Override public Iterator> getReturnSites(BasicBlockInContext call, CGNode callee) { return icfg.getReturnSites(call); } + @Override public boolean isCall(BasicBlockInContext n) { return n.getDelegate().getInstruction() instanceof SSAAbstractInvokeInstruction; } + @Override public boolean isEntry(BasicBlockInContext n) { return n.getDelegate().isEntryBlock(); } + @Override public boolean isExit(BasicBlockInContext n) { return n.getDelegate().isExitBlock(); } + @Override public boolean isReturn(BasicBlockInContext n) { return icfg.isReturn(n); } + @Override public void removeNodeAndEdges(BasicBlockInContext N) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void addNode(BasicBlockInContext n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(BasicBlockInContext N) { return icfg.containsNode(N); } + @Override public int getNumberOfNodes() { return icfg.getNumberOfNodes(); } + @Override public Iterator> iterator() { return icfg.iterator(); } + @Override public void removeNode(BasicBlockInContext n) { Assertions.UNREACHABLE(); } + @Override public void addEdge(BasicBlockInContext src, BasicBlockInContext dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(BasicBlockInContext N) { return icfg.getPredNodeCount(N); } + @Override public Iterator> getPredNodes(BasicBlockInContext N) { return icfg.getPredNodes(N); } + @Override public int getSuccNodeCount(BasicBlockInContext N) { return icfg.getSuccNodeCount(N); } + @Override public Iterator> getSuccNodes(BasicBlockInContext N) { return icfg.getSuccNodes(N); } + @Override public boolean hasEdge(BasicBlockInContext src, BasicBlockInContext dst) { return icfg.hasEdge(src, dst); } + @Override public void removeAllIncidentEdges(BasicBlockInContext node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeEdge(BasicBlockInContext src, BasicBlockInContext dst) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(BasicBlockInContext node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(BasicBlockInContext node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public int getMaxNumber() { return icfg.getMaxNumber(); } + @Override public BasicBlockInContext getNode(int number) { return icfg.getNode(number); } + @Override public int getNumber(BasicBlockInContext N) { return icfg.getNumber(N); } + @Override public Iterator> iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(BasicBlockInContext node) { return icfg.getPredNodeNumbers(node); } + @Override public IntSet getSuccNodeNumbers(BasicBlockInContext node) { return icfg.getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java index 24639e6eb..5d8bb6cfd 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunction.java @@ -19,10 +19,12 @@ public class IdentityFlowFunction implements IReversibleFlowFunction { private final static IdentityFlowFunction singleton = new IdentityFlowFunction(); + @Override public SparseIntSet getTargets(int i) { return SparseIntSet.singleton(i); } + @Override public SparseIntSet getSources(int i) { return SparseIntSet.singleton(i); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java index 902ead9d4..df6856827 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/IdentityFlowFunctions.java @@ -28,6 +28,7 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getNormalFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getNormalFlowFunction(T src, T dest) { return IdentityFlowFunction.identity(); } @@ -35,6 +36,7 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getReturnFlowFunction(java.lang.Object, java.lang.Object, java.lang.Object) */ + @Override public IFlowFunction getReturnFlowFunction(T call, T src, T dest) { return IdentityFlowFunction.identity(); } @@ -49,6 +51,7 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getCallToReturnFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getCallToReturnFlowFunction(T src, T dest) { return IdentityFlowFunction.identity(); } @@ -56,10 +59,12 @@ public class IdentityFlowFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getCallNoneToReturnFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(T src, T dest) { return IdentityFlowFunction.identity(); } + @Override public IUnaryFlowFunction getCallFlowFunction(T src, T dest, T ret) { return IdentityFlowFunction.identity(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java index 766f89a88..d4087f109 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/KillEverything.java @@ -29,6 +29,7 @@ public class KillEverything implements IUnaryFlowFunction { private KillEverything() { } + @Override public SparseIntSet getTargets(int d1) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java index 339c56092..0a0ddcc43 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/PartiallyBalancedTabulationProblem.java @@ -20,6 +20,7 @@ package com.ibm.wala.dataflow.IFDS; */ public interface PartiallyBalancedTabulationProblem extends TabulationProblem { + @Override public IPartiallyBalancedFlowFunctions getFunctionMap(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java index 836d61637..0a602b2bf 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/SingletonFlowFunction.java @@ -25,6 +25,7 @@ public class SingletonFlowFunction implements IReversibleFlowFunction { this.dest = dest; } + @Override public SparseIntSet getTargets(int i) { if (i == 0) { return SparseIntSet.add(zeroSet,dest); @@ -33,6 +34,7 @@ public class SingletonFlowFunction implements IReversibleFlowFunction { } } + @Override public SparseIntSet getSources(int i) { if (i == dest || i == 0) { return zeroSet; diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java index 6c600b6a5..2128af135 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/TabulationSolver.java @@ -342,6 +342,7 @@ public class TabulationSolver { } if (D3 != null) { D3.foreach(new IntSetAction() { + @Override public void act(int d3) { propagate(edge.entry, edge.d1, m, d3); } @@ -432,6 +433,7 @@ public class TabulationSolver { System.err.println("D5 " + D5); } IntSetAction action = new IntSetAction() { + @Override public void act(final int d4) { propToReturnSite(c, entries, retSite, d4, D5); } @@ -456,6 +458,7 @@ public class TabulationSolver { private void propagateToReturnSiteWithBinaryFlowFunction(final PathEdge edge, final T c, final IntSet D4, final T[] entries, final T retSite, final IFlowFunction retf) { D4.foreach(new IntSetAction() { + @Override public void act(final int d4) { final IntSet D5 = computeBinaryFlow(d4, edge.d2, (IBinaryReturnFlowFunction) retf); propToReturnSite(c, entries, retSite, d4, D5); @@ -477,6 +480,7 @@ public class TabulationSolver { private void propToReturnSite(final T c, final T[] entries, final T retSite, final int d4, final IntSet D5) { if (D5 != null) { D5.foreach(new IntSetAction() { + @Override public void act(final int d5) { // [26 - 28] // note that we've modified the algorithm here to account @@ -497,6 +501,7 @@ public class TabulationSolver { } if (D3 != null) { D3.foreach(new IntSetAction() { + @Override public void act(int d3) { // set curPathEdge to be consistent with its setting in processCall() when applying a summary edge curPathEdge = PathEdge.createPathEdge(s_p, d3, c, d4); @@ -562,6 +567,7 @@ public class TabulationSolver { } if (D3 != null) { D3.foreach(new IntSetAction() { + @Override public void act(int d3) { propagate(edge.entry, edge.d1, m, d3); } @@ -587,6 +593,7 @@ public class TabulationSolver { } if (reached != null) { reached.foreach(new IntSetAction() { + @Override public void act(int x) { assert x >= 0; assert edge.d1 >= 0; @@ -639,6 +646,7 @@ public class TabulationSolver { final int s_p_num = supergraph.getLocalBlockNumber(calleeEntry); reached.foreach(new IntSetAction() { + @Override public void act(final int d1) { // we get reuse if we _don't_ propagate a new fact to the callee entry final boolean gotReuse = !propagate(calleeEntry, d1, calleeEntry, d1); @@ -668,6 +676,7 @@ public class TabulationSolver { if (supergraph.hasEdge(exit, returnSite)) { final IFlowFunction retf = flowFunctionMap.getReturnFlowFunction(edge.target, exit, returnSite); reachedBySummary.foreach(new IntSetAction() { + @Override public void act(int d2) { assert curSummaryEdge == null : "curSummaryEdge should be null here"; curSummaryEdge = PathEdge.createPathEdge(calleeEntry, d1, exit, d2); @@ -675,6 +684,7 @@ public class TabulationSolver { final IntSet D5 = computeBinaryFlow(edge.d2, d2, (IBinaryReturnFlowFunction) retf); if (D5 != null) { D5.foreach(new IntSetAction() { + @Override public void act(int d5) { propagate(edge.entry, edge.d1, returnSite, d5); } @@ -684,6 +694,7 @@ public class TabulationSolver { final IntSet D5 = computeFlow(d2, (IUnaryFlowFunction) retf); if (D5 != null) { D5.foreach(new IntSetAction() { + @Override public void act(int d5) { propagate(edge.entry, edge.d1, returnSite, d5); } @@ -906,6 +917,7 @@ public class TabulationSolver { * * @return IntSet representing the bitvector */ + @Override public IntSet getResult(T node) { return TabulationSolver.this.getResult(node); } @@ -917,6 +929,7 @@ public class TabulationSolver { TreeMap> map = new TreeMap>(ToStringComparator.instance()); Comparator c = new Comparator() { + @Override public int compare(Object o1, Object o2) { if (!(o1 instanceof IBasicBlock)) { return -1; @@ -951,6 +964,7 @@ public class TabulationSolver { /* * @see com.ibm.wala.dataflow.IFDS.TabulationResult#getProblem() */ + @Override public TabulationProblem getProblem() { return problem; } @@ -958,6 +972,7 @@ public class TabulationSolver { /* * @see com.ibm.wala.dataflow.IFDS.TabulationResult#getSupergraphNodesReached() */ + @Override public Collection getSupergraphNodesReached() { Collection result = HashSetFactory.make(); for (Entry e : pathEdges.entrySet()) { @@ -978,6 +993,7 @@ public class TabulationSolver { * @param n2 * @return set of d2 s.t. (n1,d1) -> (n2,d2) is recorded as a summary edge, or null if none found */ + @Override public IntSet getSummaryTargets(T n1, int d1, T n2) { LocalSummaryEdges summaries = summaryEdges.get(supergraph.getProcOf(n1)); if (summaries == null) { @@ -988,6 +1004,7 @@ public class TabulationSolver { return summaries.getSummaryEdges(num1, num2, d1); } + @Override public Collection> getSeeds() { return TabulationSolver.this.getSeeds(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java index 310e8dd16..f52eac1ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/UnorderedDomain.java @@ -20,6 +20,7 @@ public class UnorderedDomain extends MutableMapping implements Tabulati /* * @see com.ibm.wala.dataflow.IFDS.TabulationDomain#isWeakerThan(int, int) */ + @Override public boolean hasPriorityOver(PathEdge p1, PathEdge p2) { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java index b3ecb23be..4335f702e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorGenFlowFunction.java @@ -30,10 +30,12 @@ public class VectorGenFlowFunction implements IReversibleFlowFunction { assert gen.contains(0); } + @Override public IntSet getTargets(int i) { return (i == 0) ? gen : gen.contains(i) ? null : SparseIntSet.singleton(i); } + @Override public IntSet getSources(int i) { return (gen.contains(i)) ? SparseIntSet.singleton(0) : SparseIntSet.singleton(i); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java index 7977ba86a..92204c7ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/dataflow/IFDS/VectorKillFlowFunction.java @@ -30,10 +30,12 @@ public class VectorKillFlowFunction implements IReversibleFlowFunction { this.kill = kill; } + @Override public IntSet getTargets(int i) { return (kill.contains(i)) ? null : SparseIntSet.singleton(i); } + @Override public IntSet getSources(int i) { return (kill.contains(i)) ? null : SparseIntSet.singleton(i); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java index 752f155cb..ab31e4b69 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/AbstractDemandPointsTo.java @@ -84,6 +84,7 @@ public abstract class AbstractDemandPointsTo implements IDemandPointerAnalysis { this.options = options; } + @Override public HeapModel getHeapModel() { return heapModel; } @@ -106,10 +107,12 @@ public abstract class AbstractDemandPointsTo implements IDemandPointerAnalysis { return numNodesTraversed; } + @Override public CallGraph getBaseCallGraph() { return cg; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java index 200a93353..770414571 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ContextSensitiveStateMachine.java @@ -81,6 +81,7 @@ public class ContextSensitiveStateMachine implements StateMachine { */ private final CallStack emptyStack = CallStack.emptyCallStack(); + @Override public CallStack getStartState() { return emptyStack; } @@ -97,46 +98,57 @@ public class ContextSensitiveStateMachine implements StateMachine { this.prevStack = prevStack; } + @Override public void visitAssign(AssignLabel label, Object dst) { nextState = prevStack; } + @Override public void visitAssignBar(AssignBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitAssignGlobal(AssignGlobalLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitAssignGlobalBar(AssignGlobalBarLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitGetField(GetFieldLabel label, Object dst) { nextState = prevStack; } + @Override public void visitGetFieldBar(GetFieldBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitMatch(MatchLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitMatchBar(MatchBarLabel label, Object dst) { nextState = emptyStack; } + @Override public void visitNew(NewLabel label, Object dst) { nextState = prevStack; } + @Override public void visitNewBar(NewBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitParam(ParamLabel label, Object dst) { handleMethodExit(label.getCallSite()); } @@ -153,6 +165,7 @@ public class ContextSensitiveStateMachine implements StateMachine { } } + @Override public void visitParamBar(ParamBarLabel label, Object dst) { // method entry handleMethodEntry(label.getCallSite()); @@ -188,18 +201,22 @@ public class ContextSensitiveStateMachine implements StateMachine { } } + @Override public void visitPutField(PutFieldLabel label, Object dst) { nextState = prevStack; } + @Override public void visitPutFieldBar(PutFieldBarLabel label, Object dst) { nextState = prevStack; } + @Override public void visitReturn(ReturnLabel label, Object dst) { handleMethodEntry(label.getCallSite()); } + @Override public void visitReturnBar(ReturnBarLabel label, Object dst) { handleMethodExit(label.getCallSite()); } @@ -209,6 +226,7 @@ public class ContextSensitiveStateMachine implements StateMachine { /* * @see com.ibm.wala.demandpa.alg.statemachine.StateMachine#transition(com.ibm.wala.demandpa.alg.statemachine.StateMachine.State, java.lang.Object) */ + @Override public State transition(State prevState, IFlowLabel label) throws IllegalArgumentException, IllegalArgumentException { if (prevState == null) { throw new IllegalArgumentException("prevState == null"); @@ -252,6 +270,7 @@ public class ContextSensitiveStateMachine implements StateMachine { this(new BasicRecursionHandler()); } + @Override public StateMachine make() { return new ContextSensitiveStateMachine(prototype.makeNew()); } @@ -278,14 +297,17 @@ public class ContextSensitiveStateMachine implements StateMachine { private final HashSet recursiveCallSites = HashSetFactory.make(); + @Override public boolean isRecursive(CallerSiteContext callSite) { return recursiveCallSites.contains(callSite); } + @Override public void makeRecursive(Collection callSites) { recursiveCallSites.addAll(callSites); } + @Override public RecursionHandler makeNew() { return new BasicRecursionHandler(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java index b4e868da1..aa79d68a6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/DemandRefinementPointsTo.java @@ -289,6 +289,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { Collection finalP2Set = Iterator2Collection.toSet(new MapIterator, T>(p2SetWithStates.iterator(), new Function, T>() { + @Override public T apply(WithState object) { return object.getWrapped(); } @@ -515,6 +516,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { * @return the points-to set of pk, or null if the points-to set can't be computed in the allocated * budget */ + @Override public Collection getPointsTo(PointerKey pk) { return getPointsTo(pk, Predicate. falsePred()).snd; } @@ -910,6 +912,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final MutableIntSet tmp = intSetFactory.make(); vals.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKeyAndState ikAndState = ikAndStates.getMappedObject(x); if (cha.isAssignableFrom(concreteType, ikAndState.getInstanceKey().getConcreteType())) { @@ -923,6 +926,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final MutableIntSet tmp = intSetFactory.make(); vals.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKeyAndState ikAndState = ikAndStates.getMappedObject(x); for (IClass t : ((MultipleClassesFilter) typeFilter).getConcreteTypes()) { @@ -939,6 +943,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final MutableIntSet tmp = intSetFactory.make(); vals.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKeyAndState ikAndState = ikAndStates.getMappedObject(x); if (ikAndState.getInstanceKey().equals(theOnlyInstanceKey)) { @@ -980,6 +985,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { State curState = curPkAndState.getState(); doTransition(curState, label, new Function() { + @Override public Object apply(State nextState) { PointerKeyAndState succPkAndState = new PointerKeyAndState(succPk, nextState); handleCopy(curPkAndState, succPkAndState, label); @@ -1149,6 +1155,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey ret = heapModel.getPointerKeyForReturnValue(targetForCall); doTransition(receiverState, returnLabel, new Function() { + @Override public Object apply(State retState) { repropCallArg(defAndState, new PointerKeyAndState(ret, retState), returnLabel.bar()); return null; @@ -1161,6 +1168,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey excRet = heapModel.getPointerKeyForExceptionalReturnValue(targetForCall); doTransition(receiverState, returnLabel, new Function() { + @Override public Object apply(State excRetState) { repropCallArg(exc, new PointerKeyAndState(excRet, excRetState), returnLabel.bar()); return null; @@ -1173,6 +1181,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final ParamBarLabel paramBarLabel = ParamBarLabel.make(new CallerSiteContext(caller, call)); doTransition(receiverState, paramBarLabel, new Function() { + @Override public Object apply(State formalState) { repropCallArg( new PointerKeyAndState(heapModel.getPointerKeyForLocal(targetForCall, formalNum), formalState), @@ -1243,6 +1252,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } doTransition(curState, label, new Function() { + @Override public Object apply(State newState) { InstanceKeyAndState ikAndState = new InstanceKeyAndState(ik, newState); int n = ikAndStates.add(ikAndState); @@ -1339,6 +1349,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } } + @Override public Object apply(State callerState) { // hack to get some actual parameter from call site // TODO do this better @@ -1627,6 +1638,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } } + @Override public Object apply(State callerState) { // if (DEBUG) { // System.err.println("caller " + caller); @@ -1765,6 +1777,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey predPk = (PointerKey) readIter.next(); doTransition(curState, AssignGlobalBarLabel.v(), new Function() { + @Override public Object apply(State predPkState) { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, AssignGlobalBarLabel.v()); @@ -1796,6 +1809,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey predPk = readIter.next(); doTransition(curState, MatchBarLabel.v(), new Function() { + @Override public Object apply(State predPkState) { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, MatchBarLabel.v()); @@ -1834,6 +1848,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey predPk = (PointerKey) dst; doTransition(curState, label.bar(), new Function() { + @Override public Object apply(State predPkState) { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, label.bar()); @@ -1851,6 +1866,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { void handle(PointerKeyAndState src, final PointerKey dst, final IFlowLabel label) { assert src == curPkAndState; doTransition(curState, label, new Function() { + @Override public Object apply(State dstState) { PointerKeyAndState dstAndState = new PointerKeyAndState(dst, dstState); handleTrackedPred(trackedSet, dstAndState, label); @@ -2112,6 +2128,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { assert g.containsNode(actualPk); assert g.containsNode(localPk); doTransition(curState, paramLabel, new Function() { + @Override public Object apply(State nextState) { propagate(new PointerKeyAndState(actualPk, nextState)); return null; @@ -2121,6 +2138,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } } + @Override public Object apply(State callerState) { // hack to get some actual parameter from call site // TODO do this better @@ -2164,6 +2182,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { assert g.containsNode(retVal); doTransition(curState, ReturnLabel.make(callSiteAndCGNode), new Function() { + @Override public Object apply(State nextState) { propagate(new PointerKeyAndState(retVal, nextState)); return null; @@ -2185,6 +2204,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { assert g.containsNode(retVal); doTransition(curState, ReturnLabel.make(callSiteAndCGNode), new Function() { + @Override public Object apply(State nextState) { propagate(new PointerKeyAndState(retVal, nextState)); return null; @@ -2287,6 +2307,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { } doTransition(curState, label, new Function() { + @Override public Object apply(State newState) { // just check if ik violates the pred if (!pred.test(ik)) { @@ -2341,6 +2362,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey writtenPk = writesToInstanceField.next(); doTransition(curState, MatchLabel.v(), new Function() { + @Override public Object apply(State nextState) { h.propagate(new PointerKeyAndState(writtenPk, nextState)); return null; @@ -2398,6 +2420,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey writtenPk = (PointerKey) writesToStaticField.next(); doTransition(curState, label, new Function() { + @Override public Object apply(State nextState) { h.propagate(new PointerKeyAndState(writtenPk, nextState)); return null; @@ -2413,6 +2436,7 @@ public class DemandRefinementPointsTo extends AbstractDemandPointsTo { final PointerKey succPk = (PointerKey) dst; doTransition(curState, label, new Function() { + @Override public Object apply(State nextState) { h.propagate(new PointerKeyAndState(succPk, nextState)); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java index b242de4d6..2ffd80b75 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/IntraProcFilter.java @@ -58,6 +58,7 @@ public class IntraProcFilter implements StateMachine { private static final State DUMMY = new State() { }; + @Override public State getStartState() { return DUMMY; } @@ -87,6 +88,7 @@ public class IntraProcFilter implements StateMachine { } + @Override public State transition(State prevState, IFlowLabel label) throws IllegalArgumentException { if (label == null) { throw new IllegalArgumentException("label == null"); @@ -102,6 +104,7 @@ public class IntraProcFilter implements StateMachine { public static class Factory implements StateMachineFactory { + @Override public StateMachine make() { return new IntraProcFilter(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java index 6d245a4a3..12eddfb51 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/SimpleDemandPointsTo.java @@ -69,6 +69,7 @@ public class SimpleDemandPointsTo extends AbstractDemandPointsTo { super(cg, model, fam, cha, options); } + @Override @SuppressWarnings("unchecked") public Collection getPointsTo(PointerKey pk) throws IllegalArgumentException, UnimplementedError { diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java index 3a47adc05..673d2d377 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/ThisFilteringHeapModel.java @@ -42,46 +42,57 @@ class ThisFilteringHeapModel implements HeapModel { private final IClassHierarchy cha; + @Override public IClassHierarchy getClassHierarchy() { return delegate.getClassHierarchy(); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, TypeFilter filter) { return delegate.getFilteredPointerKeyForLocal(node, valueNumber, filter); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return delegate.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return delegate.getInstanceKeyForClassObject(type); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return delegate.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return delegate.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return delegate.getInstanceKeyForPEI(node, instr, type); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return delegate.getPointerKeyForArrayContents(I); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return delegate.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { return delegate.getPointerKeyForInstanceField(I, field); } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { if (!node.getMethod().isStatic() && valueNumber == 1) { return delegate.getFilteredPointerKeyForLocal(node, valueNumber, getFilter(node)); @@ -119,14 +130,17 @@ class ThisFilteringHeapModel implements HeapModel { return C; } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return delegate.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return delegate.getPointerKeyForStaticField(f); } + @Override public Iterator iteratePointerKeys() { return delegate.iteratePointerKeys(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java index 2d69ee655..36936b043 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AbstractRefinementPolicy.java @@ -55,22 +55,27 @@ public abstract class AbstractRefinementPolicy implements RefinementPolicy { this(fieldRefinePolicy, cgRefinePolicy, DEFAULT_NUM_PASSES, DEFAULT_BUDGET_PER_PASS); } + @Override public int getBudgetForPass(int passNum) { return budgetPerPass[passNum]; } + @Override public CallGraphRefinePolicy getCallGraphRefinePolicy() { return cgRefinePolicy; } + @Override public FieldRefinePolicy getFieldRefinePolicy() { return fieldRefinePolicy; } + @Override public int getNumPasses() { return numPasses; } + @Override public boolean nextPass() { // don't short-circuit since nextPass() can have side-effects boolean fieldNextPass = fieldRefinePolicy.nextPass(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java index 05faaa6c0..580dd66f8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java @@ -44,10 +44,12 @@ import com.ibm.wala.ipa.callgraph.propagation.cfa.CallerSiteContext; */ public class AlwaysRefineCGPolicy implements CallGraphRefinePolicy { + @Override public boolean shouldRefine(CallerSiteContext callSiteAndCGNode) { return true; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java index 43efd3747..5acf41006 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineFieldsPolicy.java @@ -52,10 +52,12 @@ import com.ibm.wala.ipa.callgraph.propagation.PointerKey; */ public class AlwaysRefineFieldsPolicy implements FieldRefinePolicy { + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { return true; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java index db88c03a4..42be600ed 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/DelegatingFieldRefinePolicy.java @@ -35,6 +35,7 @@ public class DelegatingFieldRefinePolicy implements FieldRefinePolicy { B = b; } + @Override public boolean nextPass() { // careful not to short-circuit here, since nextPass() can have side-effects boolean AnextPass = A.nextPass(); @@ -48,6 +49,7 @@ public class DelegatingFieldRefinePolicy implements FieldRefinePolicy { * if A.shouldRefine(field) is true, * B.shouldRefine(field) is not called. */ + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { // make code explicit to avoid subtle reliance on short-circuiting boolean AshouldRefine = A.shouldRefine(field, basePtr, val, label, state); diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java index bb6e79014..4ace6d1d6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java @@ -47,6 +47,7 @@ import com.ibm.wala.types.MethodReference; */ public class ManualCGRefinePolicy implements CallGraphRefinePolicy { + @Override public boolean shouldRefine(CallerSiteContext callSiteAndCGNode) throws IllegalArgumentException { if (callSiteAndCGNode == null) { throw new IllegalArgumentException("callSiteAndCGNode == null"); @@ -58,6 +59,7 @@ public class ManualCGRefinePolicy implements CallGraphRefinePolicy { return true; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java index 63f7aeb14..e72b8bf84 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualFieldPolicy.java @@ -67,6 +67,7 @@ public class ManualFieldPolicy implements FieldRefinePolicy { final private IClass[] encounteredClasses = new IClass[NUM_DECISIONS_TO_TRACK]; + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { if (field == null) { throw new IllegalArgumentException("null field"); @@ -132,6 +133,7 @@ public class ManualFieldPolicy implements FieldRefinePolicy { this.refinePattern = refinePattern; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java index 970b00a04..cba42952d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java @@ -58,6 +58,7 @@ public class ManualRefinementPolicy extends AbstractRefinementPolicy { this.cha = cha; } + @Override public RefinementPolicy make() { return new ManualRefinementPolicy(cha); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java index 6dd2909a4..a254796c2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java @@ -41,10 +41,12 @@ import com.ibm.wala.ipa.callgraph.propagation.cfa.CallerSiteContext; public class NeverRefineCGPolicy implements CallGraphRefinePolicy { + @Override public boolean shouldRefine(CallerSiteContext callSiteAndCGNode) { return false; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java index 59fadf137..0604e9b7c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineFieldsPolicy.java @@ -44,10 +44,12 @@ import com.ibm.wala.ipa.callgraph.propagation.PointerKey; public class NeverRefineFieldsPolicy implements FieldRefinePolicy { + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { return false; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java index 04f4fc7ee..7ddc7b467 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java @@ -73,6 +73,7 @@ public class SinglePassRefinementPolicy extends AbstractRefinementPolicy { } + @Override public RefinementPolicy make() { return new SinglePassRefinementPolicy(fieldRefinePolicy, cgRefinePolicy, budget); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java index 58119d9ef..fb03684aa 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedFieldRefinementPolicy.java @@ -33,6 +33,7 @@ public class TunedFieldRefinementPolicy implements FieldRefinePolicy { private IClass firstSkippedClass = null; + @Override public boolean nextPass() { if (firstSkippedClass != null) { typesToRefine.add(firstSkippedClass); @@ -46,6 +47,7 @@ public class TunedFieldRefinementPolicy implements FieldRefinePolicy { } } + @Override public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) { if (field == null) { throw new IllegalArgumentException("null field"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java index d40b4e39a..ec1dd4c0b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java @@ -60,6 +60,7 @@ public class TunedRefinementPolicy extends AbstractRefinementPolicy { this.cha = cha; } + @Override public RefinementPolicy make() { return new TunedRefinementPolicy(cha); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java index 15d776027..f268bfc7e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/statemachine/DummyStateMachine.java @@ -48,6 +48,7 @@ public class DummyStateMachine implements StateMachine { public static class Factory implements StateMachineFactory { + @Override public StateMachine make() { return new DummyStateMachine(); } @@ -66,10 +67,12 @@ public class DummyStateMachine implements StateMachine { * * @see statemachine.StateMachine#transition(int, java.lang.Object) */ + @Override public State transition(State prevState, T label) { return DUMMY; } + @Override public State getStartState() { return DUMMY; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java index d39d2465d..a5416d4d7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractDemandFlowGraph.java @@ -88,6 +88,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { /* * @see com.ibm.wala.demandpa.flowgraph.IFlowGraph#addSubgraphForNode(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public void addSubgraphForNode(CGNode node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node == null"); @@ -108,6 +109,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { /* * @see com.ibm.wala.demandpa.flowgraph.IFlowGraph#hasSubgraphForNode(com.ibm.wala.ipa.callgraph.CGNode) */ + @Override public boolean hasSubgraphForNode(CGNode node) { return cgNodesVisited.contains(cg.getNumber(node)); } @@ -352,6 +354,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { final Map> callerCache = HashMapFactory.make(); + @Override public Set getPotentialCallers(PointerKey formalPk) { CGNode callee = null; if (formalPk instanceof LocalPointerKey) { @@ -376,6 +379,7 @@ public abstract class AbstractDemandFlowGraph extends AbstractFlowGraph { return ret; } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site, LocalPointerKey actualPk) { return cg.getPossibleTargets(node, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java index 84c081578..d37bd23f0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowGraph.java @@ -96,14 +96,17 @@ import com.ibm.wala.util.graph.labeled.SlowSparseNumberedLabeledGraph; public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph implements IFlowGraph { private final static IFlowLabel defaultLabel = new IFlowLabel() { + @Override public IFlowLabel bar() { return defaultLabel; } + @Override public boolean isBarred() { return false; } + @Override public void visit(IFlowLabelVisitor v, Object dst) { } @@ -153,6 +156,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph succLabelIter = getSuccLabels(node); succLabelIter.hasNext();) { final IFlowLabel label = succLabelIter.next(); @@ -166,6 +170,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph predLabelIter = getPredLabels(node); predLabelIter.hasNext();) { final IFlowLabel label = predLabelIter.next(); @@ -210,10 +215,12 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getInstrsPassingParam(LocalPointerKey pk) { Set instrs = callParams.get(pk); if (instrs == null) { @@ -223,10 +230,12 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getWritesToStaticField(StaticFieldKey sfk) throws IllegalArgumentException { if (sfk == null) { throw new IllegalArgumentException("sfk == null"); @@ -238,6 +247,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getReadsOfStaticField(StaticFieldKey sfk) throws IllegalArgumentException { if (sfk == null) { throw new IllegalArgumentException("sfk == null"); @@ -249,6 +259,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getWritesToInstanceField(PointerKey pk, IField f) { // TODO: cache this!! if (f == ArrayContents.v()) { @@ -309,6 +320,7 @@ public abstract class AbstractFlowGraph extends SlowSparseNumberedLabeledGraph getReadsOfInstanceField(PointerKey pk, IField f) { // TODO: cache this!! if (f == ArrayContents.v()) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java index 2bf727da7..0f3fccdea 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AbstractFlowLabelVisitor.java @@ -48,65 +48,81 @@ import com.ibm.wala.demandpa.flowgraph.IFlowLabel.IFlowLabelVisitor; */ public class AbstractFlowLabelVisitor implements IFlowLabelVisitor { + @Override public void visitParam(ParamLabel label, Object dst) { } + @Override public void visitReturn(ReturnLabel label, Object dst) { } + @Override public void visitAssign(AssignLabel label, Object dst) { } + @Override public void visitAssignGlobal(AssignGlobalLabel label, Object dst) { } + @Override public void visitGetField(GetFieldLabel label, Object dst) { } + @Override public void visitMatch(MatchLabel label, Object dst) { } + @Override public void visitNew(NewLabel label, Object dst) { } + @Override public void visitPutField(PutFieldLabel label, Object dst) { } + @Override public void visitAssignGlobalBar(AssignGlobalBarLabel label, Object dst) { } + @Override public void visitAssignBar(AssignBarLabel label, Object dst) { } + @Override public void visitGetFieldBar(GetFieldBarLabel label, Object dst) { } + @Override public void visitMatchBar(MatchBarLabel label, Object dst) { } + @Override public void visitNewBar(NewBarLabel label, Object dst) { } + @Override public void visitPutFieldBar(PutFieldBarLabel label, Object dst) { } + @Override public void visitReturnBar(ReturnBarLabel label, Object dst) { } + @Override public void visitParamBar(ParamBarLabel label, Object dst) { } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java index 60de67fd3..dc0a1acc0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignBarLabel.java @@ -65,6 +65,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { * (non-Javadoc) * @see demandGraph.IFlowLabel#bar() */ + @Override public AssignLabel bar() { return (this == noFilter) ? AssignLabel.noFilter() : AssignLabel.make(filter); } @@ -73,6 +74,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { * (non-Javadoc) * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -80,6 +82,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { v.visitAssignBar(this, dst); } + @Override public boolean isBarred() { return true; } @@ -109,6 +112,7 @@ public class AssignBarLabel implements IFlowLabelWithFilter { return true; } + @Override public TypeFilter getFilter() { return filter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java index 3baaa6005..b5894878e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalBarLabel.java @@ -57,6 +57,7 @@ public class AssignGlobalBarLabel implements IFlowLabel { * * @see demandGraph.IFlowLabel#bar() */ + @Override public AssignGlobalLabel bar() { return AssignGlobalLabel.v(); } @@ -67,6 +68,7 @@ public class AssignGlobalBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -74,6 +76,7 @@ public class AssignGlobalBarLabel implements IFlowLabel { v.visitAssignGlobalBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java index 942971535..f96df15e7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignGlobalLabel.java @@ -47,6 +47,7 @@ public class AssignGlobalLabel implements IFlowLabel { return theInstance; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -54,10 +55,12 @@ public class AssignGlobalLabel implements IFlowLabel { v.visitAssignGlobal(this, dst); } + @Override public AssignGlobalBarLabel bar() { return AssignGlobalBarLabel.v(); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java index 9a8e12eff..4ab9d4db1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/AssignLabel.java @@ -82,6 +82,7 @@ public class AssignLabel implements IFlowLabelWithFilter { return new AssignLabel(filter); } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -89,6 +90,7 @@ public class AssignLabel implements IFlowLabelWithFilter { v.visitAssign(this, dst); } + @Override public AssignBarLabel bar() { return this == noFilter ? AssignBarLabel.noFilter() : AssignBarLabel.make(filter); } @@ -98,10 +100,12 @@ public class AssignLabel implements IFlowLabelWithFilter { return "assign"; } + @Override public boolean isBarred() { return false; } + @Override public TypeFilter getFilter() { return filter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java index 556eee4f0..f5ace68e0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandPointerFlowGraph.java @@ -477,6 +477,7 @@ public class DemandPointerFlowGraph extends AbstractDemandFlowGraph implements I /** * The calling loop must call this in each iteration! */ + @Override public void setBasicBlock(ISSABasicBlock block) { basicBlock = block; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java index a7f6475cf..1113dd36b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/DemandValueFlowGraph.java @@ -444,6 +444,7 @@ public class DemandValueFlowGraph extends AbstractDemandFlowGraph { /** * The calling loop must call this in each iteration! */ + @Override public void setBasicBlock(ISSABasicBlock block) { basicBlock = block; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java index 8acfe1397..536ba189f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldBarLabel.java @@ -65,6 +65,7 @@ public class GetFieldBarLabel implements IFlowLabel { * * @see demandGraph.IFlowLabel#bar() */ + @Override public GetFieldLabel bar() { return GetFieldLabel.make(field); } @@ -75,6 +76,7 @@ public class GetFieldBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -107,6 +109,7 @@ public class GetFieldBarLabel implements IFlowLabel { return true; } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java index bccddfcfb..f110db428 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/GetFieldLabel.java @@ -81,6 +81,7 @@ public class GetFieldLabel implements IFlowLabel { return true; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -93,10 +94,12 @@ public class GetFieldLabel implements IFlowLabel { return "getfield[" + field + "]"; } + @Override public GetFieldBarLabel bar() { return GetFieldBarLabel.make(field); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java index 9b0a45b19..fa75bd414 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchBarLabel.java @@ -55,6 +55,7 @@ public class MatchBarLabel implements IFlowLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public MatchLabel bar() { return MatchLabel.v(); } @@ -63,6 +64,7 @@ public class MatchBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -70,6 +72,7 @@ public class MatchBarLabel implements IFlowLabel { v.visitMatchBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java index d4da54995..0d8c26ee1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/MatchLabel.java @@ -48,6 +48,7 @@ public class MatchLabel implements IFlowLabel { return theInstance; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -60,10 +61,12 @@ public class MatchLabel implements IFlowLabel { return "match"; } + @Override public MatchBarLabel bar() { return MatchBarLabel.v(); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java index d56e45926..507ea2af9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewBarLabel.java @@ -55,6 +55,7 @@ public class NewBarLabel implements IFlowLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public NewLabel bar() { return NewLabel.v(); } @@ -63,6 +64,7 @@ public class NewBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -70,6 +72,7 @@ public class NewBarLabel implements IFlowLabel { v.visitNewBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java index a1209ec91..e7e4ca898 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/NewLabel.java @@ -48,6 +48,7 @@ public class NewLabel implements IFlowLabel { return theInstance; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -60,10 +61,12 @@ public class NewLabel implements IFlowLabel { return "new"; } + @Override public NewBarLabel bar() { return NewBarLabel.v(); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java index eaabf93c2..9c0e1e7a4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamBarLabel.java @@ -54,6 +54,7 @@ public class ParamBarLabel extends CallLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public ParamLabel bar() { return ParamLabel.make(callSite); } @@ -62,6 +63,7 @@ public class ParamBarLabel extends CallLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -69,6 +71,7 @@ public class ParamBarLabel extends CallLabel { v.visitParamBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java index 085b0655c..c8bf1a222 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ParamLabel.java @@ -49,6 +49,7 @@ public class ParamLabel extends CallLabel { return new ParamLabel(callSite); } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -61,10 +62,12 @@ public class ParamLabel extends CallLabel { return "param[" + callSite + "]"; } + @Override public ParamBarLabel bar() { return ParamBarLabel.make(callSite); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java index e920d1986..8eda14875 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldBarLabel.java @@ -88,6 +88,7 @@ public class PutFieldBarLabel implements IFlowLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public PutFieldLabel bar() { return PutFieldLabel.make(field); } @@ -96,6 +97,7 @@ public class PutFieldBarLabel implements IFlowLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -103,6 +105,7 @@ public class PutFieldBarLabel implements IFlowLabel { v.visitPutFieldBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java index fe634f986..bad59690d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/PutFieldLabel.java @@ -81,6 +81,7 @@ public class PutFieldLabel implements IFlowLabel { return true; } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -93,10 +94,12 @@ public class PutFieldLabel implements IFlowLabel { return "putfield[" + field + "]"; } + @Override public PutFieldBarLabel bar() { return PutFieldBarLabel.make(field); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java index 04f17a178..1dfc83f10 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnBarLabel.java @@ -54,6 +54,7 @@ public class ReturnBarLabel extends CallLabel { /* * @see demandGraph.IFlowLabel#bar() */ + @Override public ReturnLabel bar() { return ReturnLabel.make(callSite); } @@ -62,6 +63,7 @@ public class ReturnBarLabel extends CallLabel { * @see demandGraph.IFlowLabel#visit(demandGraph.IFlowLabel.IFlowLabelVisitor, * java.lang.Object) */ + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -69,6 +71,7 @@ public class ReturnBarLabel extends CallLabel { v.visitReturnBar(this, dst); } + @Override public boolean isBarred() { return true; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java index 70ca370b9..061d82231 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/flowgraph/ReturnLabel.java @@ -49,6 +49,7 @@ public class ReturnLabel extends CallLabel { return new ReturnLabel(callSite); } + @Override public void visit(IFlowLabelVisitor v, Object dst) throws IllegalArgumentException { if (v == null) { throw new IllegalArgumentException("v == null"); @@ -61,10 +62,12 @@ public class ReturnLabel extends CallLabel { return "return[" + callSite + "]"; } + @Override public ReturnBarLabel bar() { return ReturnBarLabel.make(callSite); } + @Override public boolean isBarred() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java index 17e4c55bb..fd3290f58 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/ArrayContents.java @@ -68,40 +68,48 @@ public class ArrayContents implements IField { private ArrayContents() { } + @Override public TypeReference getFieldTypeReference() throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public boolean isFinal() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isPrivate() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isProtected() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isPublic() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public boolean isStatic() throws UnimplementedError { Assertions.UNREACHABLE(); return false; } + @Override public IClass getDeclaringClass() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Atom getName() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -112,19 +120,23 @@ public class ArrayContents implements IField { return "arr"; } + @Override public boolean isVolatile() { return false; } + @Override public ClassHierarchy getClassHierarchy() throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public FieldReference getReference() { return null; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java index 78ec0af5b..a47276ad2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PABasedMemoryAccessMap.java @@ -70,6 +70,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { invRef = MapUtil.inverseMap(ref); } + @Override public Collection getArrayReads(PointerKey arrayRef) { Collection memAccesses = new ArrayList(); if (DEBUG) { @@ -82,6 +83,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getArrayWrites(PointerKey arrayRef) { Collection memAccesses = new ArrayList(); if (DEBUG) { @@ -97,6 +99,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getFieldReads(PointerKey baseRef, IField field) { Collection memAccesses = new ArrayList(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { @@ -106,6 +109,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getFieldWrites(PointerKey baseRef, IField field) { Collection memAccesses = new ArrayList(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { @@ -115,12 +119,14 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { return memAccesses; } + @Override public Collection getStaticFieldReads(IField field) { Collection result = new ArrayList(); convertStmtsToMemoryAccess(invRef.get(heapModel.getPointerKeyForStaticField(field)), result); return result; } + @Override public Collection getStaticFieldWrites(IField field) { Collection result = new ArrayList(); convertStmtsToMemoryAccess(invMod.get(heapModel.getPointerKeyForStaticField(field)), result); @@ -146,6 +152,7 @@ public class PABasedMemoryAccessMap implements MemoryAccessMap { } } + @Override public HeapModel getHeapModel() { return heapModel; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java index 43d74a3c1..c7b392274 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/PointerParamValueNumIterator.java @@ -92,6 +92,7 @@ public class PointerParamValueNumIterator implements Iterator { /* * @see java.util.Iterator#hasNext() */ + @Override public boolean hasNext() { return paramInd <= numParams; } @@ -99,6 +100,7 @@ public class PointerParamValueNumIterator implements Iterator { /* * @see java.util.Iterator#next() */ + @Override public Integer next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -111,6 +113,7 @@ public class PointerParamValueNumIterator implements Iterator { /* * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java index 239240c2c..4169e7da1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/util/SimpleMemoryAccessMap.java @@ -343,6 +343,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getFieldReads(com.ibm.wala.classLoader.IField) */ + @Override public Collection getFieldReads(PointerKey pk, IField field) { Collection result = readMap.get(field); if (result == null) { @@ -355,6 +356,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getFieldWrites(com.ibm.wala.classLoader.IField) */ + @Override public Collection getFieldWrites(PointerKey pk, IField field) { Collection result = writeMap.get(field); if (result == null) { @@ -367,6 +369,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getArrayReads() */ + @Override public Collection getArrayReads(PointerKey pk) { return arrayReads; } @@ -374,6 +377,7 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { /* * @see com.ibm.wala.demandpa.util.MemoryAccessMap#getArrayWrites() */ + @Override public Collection getArrayWrites(PointerKey pk) { return arrayWrites; } @@ -422,14 +426,17 @@ public class SimpleMemoryAccessMap implements MemoryAccessMap { return result.toString(); } + @Override public Collection getStaticFieldReads(IField field) { return getFieldReads(null, field); } + @Override public Collection getStaticFieldWrites(IField field) { return getFieldWrites(null, field); } + @Override public HeapModel getHeapModel() { // NOTE: this memory access map actually makes no use of the heap model return heapModel; diff --git a/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java index 64e008714..836cffaad 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/escape/FILiveObjectAnalysis.java @@ -75,6 +75,7 @@ public class FILiveObjectAnalysis implements ILiveObjectAnalysis { this.expensiveIntraproceduralAnalysis = expensiveIntraproceduralAnalysis; } + @Override public boolean mayBeLive(CGNode allocMethod, int allocPC, CGNode m, int instructionIndex) throws IllegalArgumentException, WalaException { if (allocMethod == null) { @@ -88,6 +89,7 @@ public class FILiveObjectAnalysis implements ILiveObjectAnalysis { /** * @param instructionIndex index of an SSA instruction */ + @Override public boolean mayBeLive(InstanceKey ik, CGNode m, int instructionIndex) { if (liveEverywhere.contains(ik)) { return true; @@ -186,6 +188,7 @@ public class FILiveObjectAnalysis implements ILiveObjectAnalysis { return DFS.getReachableNodes(callGraph, localRootNodes); } + @Override public boolean mayBeLive(InstanceKey ik, CGNode m, IntSet instructionIndices) { if (instructionIndices == null) { throw new IllegalArgumentException("instructionIndices is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java index cbe434910..528da2427 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/escape/LocalLiveRangeAnalysis.java @@ -58,6 +58,7 @@ public class LocalLiveRangeAnalysis { // a filter which accepts everything but the block which defs v Filter notDef = new Filter() { + @Override public boolean accepts(Object o) { return (defBlock == null || !defBlock.equals(o)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java b/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java index 65b6a9484..878312be8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java +++ b/com.ibm.wala.core/src/com/ibm/wala/escape/TrivialMethodEscape.java @@ -56,6 +56,7 @@ public class TrivialMethodEscape implements IMethodEscapeAnalysis, INodeEscapeAn this.cg = cg; } + @Override public boolean mayEscape(MethodReference allocMethod, int allocPC, MethodReference m) throws WalaException { if (allocMethod == null) { @@ -75,6 +76,7 @@ public class TrivialMethodEscape implements IMethodEscapeAnalysis, INodeEscapeAn return mayEscape(allocN, allocPC, nodes); } + @Override public boolean mayEscape(CGNode allocNode, int allocPC, CGNode node) throws WalaException { return mayEscape(Collections.singleton(allocNode), allocPC, Collections.singleton(node)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/AnalysisScope.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/AnalysisScope.java index c0e090594..7785b1062 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/AnalysisScope.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/AnalysisScope.java @@ -198,7 +198,7 @@ public class AnalysisScope { */ public void addSourceFileToScope(ClassLoaderReference loader, File file, String fileName) throws IllegalArgumentException { List s = MapUtil.findOrCreateList(moduleMap, loader); - s.add(new SourceFileModule(file, fileName)); + s.add(new SourceFileModule(file, fileName, null)); } /** @@ -207,7 +207,7 @@ public class AnalysisScope { */ public void addClassFileToScope(ClassLoaderReference loader, File file) throws IllegalArgumentException, InvalidClassFileException { List s = MapUtil.findOrCreateList(moduleMap, loader); - s.add(new ClassFileModule(file)); + s.add(new ClassFileModule(file, null)); } /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java index 4baff8f3c..e42cbf50e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/DelegatingContext.java @@ -31,6 +31,7 @@ public class DelegatingContext implements Context { } } + @Override public ContextItem get(ContextKey name) { ContextItem result = A.get(name); if (result == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java index e2c1ef269..5fe066d76 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/CHACallGraph.java @@ -61,21 +61,25 @@ public class CHACallGraph extends BasicCallGraph { super(method, C); } + @Override public IR getIR() { assert false; return null; } + @Override public DefUse getDU() { assert false; return null; } + @Override public Iterator iterateNewSites() { assert false; return null; } + @Override public Iterator iterateCallSites() { return getInterpreter(this).iterateCallSites(this); } @@ -116,6 +120,7 @@ public class CHACallGraph extends BasicCallGraph { isInitialized = true; } + @Override public IClassHierarchy getClassHierarchy() { return cha; } @@ -133,18 +138,21 @@ public class CHACallGraph extends BasicCallGraph { } } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site) { return Iterator2Collection.toSet( new MapIterator( new FilterIterator( getPossibleTargets(site), new Filter() { + @Override public boolean accepts(IMethod o) { return !o.isAbstract(); } } ), new Function() { + @Override public CGNode apply(IMethod object) { try { return findOrCreateNode(object, Everywhere.EVERYWHERE); @@ -156,14 +164,17 @@ public class CHACallGraph extends BasicCallGraph { })); } + @Override public int getNumberOfTargets(CGNode node, CallSiteReference site) { return IteratorUtil.count(getPossibleTargets(site)); } + @Override public Iterator getPossibleSites(final CGNode src, final CGNode target) { return new FilterIterator(getInterpreter(src).iterateCallSites(src), new Filter() { + @Override public boolean accepts(CallSiteReference o) { return getPossibleTargets(src, o).contains(target); } @@ -267,14 +278,17 @@ public class CHACallGraph extends BasicCallGraph { } } + @Override public Iterator getPredNodes(CGNode n) { return getPreds(n).iterator(); } + @Override public int getPredNodeCount(CGNode n) { return getPreds(n).size(); } + @Override public Iterator getSuccNodes(final CGNode n) { return new FilterIterator(new ComposedIterator(n.iterateCallSites()) { @Override @@ -284,6 +298,7 @@ public class CHACallGraph extends BasicCallGraph { }, new Filter() { private final MutableIntSet nodes = IntSetUtil.make(); + @Override public boolean accepts(CGNode o) { if (nodes.contains(o.getGraphNodeId())) { return false; @@ -295,34 +310,42 @@ public class CHACallGraph extends BasicCallGraph { }); } + @Override public int getSuccNodeCount(CGNode N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public void addEdge(CGNode src, CGNode dst) { assert false; } + @Override public void removeEdge(CGNode src, CGNode dst) throws UnsupportedOperationException { assert false; } + @Override public void removeAllIncidentEdges(CGNode node) throws UnsupportedOperationException { assert false; } + @Override public void removeIncomingEdges(CGNode node) throws UnsupportedOperationException { assert false; } + @Override public void removeOutgoingEdges(CGNode node) throws UnsupportedOperationException { assert false; } + @Override public boolean hasEdge(CGNode src, CGNode dst) { return getPossibleSites(src, dst).hasNext(); } + @Override public IntSet getSuccNodeNumbers(CGNode node) { MutableIntSet result = IntSetUtil.make(); for(Iterator ss = getSuccNodes(node); ss.hasNext(); ) { @@ -331,6 +354,7 @@ public class CHACallGraph extends BasicCallGraph { return result; } + @Override public IntSet getPredNodeNumbers(CGNode node) { MutableIntSet result = IntSetUtil.make(); for(Iterator ss = getPredNodes(node); ss.hasNext(); ) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java index fe2321fbd..e31818ba3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/cha/ContextInsensitiveCHAContextInterpreter.java @@ -20,10 +20,12 @@ import com.ibm.wala.util.debug.Assertions; public class ContextInsensitiveCHAContextInterpreter implements CHAContextInterpreter { + @Override public boolean understands(CGNode node) { return true; } + @Override public Iterator iterateCallSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java index d52ee64a7..08626f004 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java @@ -341,6 +341,7 @@ public abstract class AbstractRootMethod extends SyntheticMethod { public RTAContextInterpreter getInterpreter() { return new RTAContextInterpreter() { + @Override public Iterator iterateNewSites(CGNode node) { ArrayList result = new ArrayList(); SSAInstruction[] statements = getStatements(options.getSSAOptions()); @@ -364,37 +365,45 @@ public abstract class AbstractRootMethod extends SyntheticMethod { return result.iterator(); } + @Override public Iterator iterateCallSites(CGNode node) { final Iterator I = getInvokeStatements(); return new Iterator() { + @Override public boolean hasNext() { return I.hasNext(); } + @Override public CallSiteReference next() { SSAInvokeInstruction s = (SSAInvokeInstruction) I.next(); return s.getCallSite(); } + @Override public void remove() { Assertions.UNREACHABLE(); } }; } + @Override public boolean understands(CGNode node) { return node.getMethod().getDeclaringClass().getReference().equals(FakeRootClass.FAKE_ROOT_CLASS); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; } + @Override public Iterator iterateFieldsRead(CGNode node) { return EmptyIterator.instance(); } + @Override public Iterator iterateFieldsWritten(CGNode node) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java index fadca3c22..cfdb6bd6a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/BasicCallGraph.java @@ -140,6 +140,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im return (NodeImpl) nodes.get(K); } + @Override public CGNode getFakeRootNode() { return fakeRoot; } @@ -158,6 +159,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im /** * Note: not all successors of the root node are entrypoints */ + @Override public Collection getEntrypointNodes() { return entrypointNodes; } @@ -186,6 +188,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im assert C != null; } + @Override public IMethod getMethod() { return method; } @@ -210,12 +213,15 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im return "Node: " + method.toString() + " Context: " + context.toString(); } + @Override public Context getContext() { return context; } + @Override public abstract boolean addTarget(CallSiteReference reference, CGNode target); + @Override public IClassHierarchy getClassHierarchy() { return method.getClassHierarchy(); } @@ -252,6 +258,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im /** * @return NodeImpl, or null if none found */ + @Override public CGNode getNode(IMethod method, Context C) { Key key = new Key(method, C); return getNode(key); @@ -288,6 +295,7 @@ public abstract class BasicCallGraph extends AbstractNumberedGraph im } + @Override public Set getNodes(MethodReference m) { IMethod im = getClassHierarchy().resolveMethod(m); if (im == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java index 1628b87cd..031375a6b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyClassTargetSelector.java @@ -30,6 +30,7 @@ public class ClassHierarchyClassTargetSelector implements ClassTargetSelector { this.cha = cha; } + @Override public IClass getAllocatedTarget(CGNode caller, NewSiteReference site) { if (site == null) { throw new IllegalArgumentException("site is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java index 9bbb497f7..77f980aa4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ClassHierarchyMethodTargetSelector.java @@ -46,6 +46,7 @@ public class ClassHierarchyMethodTargetSelector implements MethodTargetSelector * * @throws IllegalArgumentException if call is null */ + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference call, IClass receiver) { if (call == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java index 51c52fb93..68882d2e5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ComposedEntrypoints.java @@ -39,6 +39,7 @@ public class ComposedEntrypoints implements Iterable { } } + @Override public Iterator iterator() { return entrypoints.iterator(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java index e0e9ebc46..2c0ce65de 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/ContextInsensitiveSelector.java @@ -25,10 +25,12 @@ import com.ibm.wala.util.intset.IntSet; */ public class ContextInsensitiveSelector implements ContextSelector { + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return Everywhere.EVERYWHERE; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return EmptyIntSet.instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java index ca321ea66..4ebecd88a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DefaultContextSelector.java @@ -39,6 +39,7 @@ public class DefaultContextSelector implements ContextSelector { delegate = new DelegatingContextSelector(new CloneContextSelector(cha), s); } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (caller == null) { throw new IllegalArgumentException("null caller"); @@ -46,6 +47,7 @@ public class DefaultContextSelector implements ContextSelector { return delegate.getCalleeTarget(caller, site, callee, receiver); } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return delegate.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java index 0ba236096..342f2c5d0 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/DelegatingContextSelector.java @@ -39,6 +39,7 @@ public class DelegatingContextSelector implements ContextSelector { } } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (DEBUG) { System.err.println(("getCalleeTarget " + caller + " " + site + " " + callee)); @@ -59,6 +60,7 @@ public class DelegatingContextSelector implements ContextSelector { return C; } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return A.getRelevantParameters(caller, site).union(B.getRelevantParameters(caller, site)); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java index ee67917f2..2a7080c3f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Everywhere.java @@ -27,6 +27,7 @@ public class Everywhere implements Context { /** * This context gives no information. */ + @Override public ContextItem get(ContextKey name) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java index aa1e82e76..4b2438734 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java @@ -62,50 +62,62 @@ public class FakeRootClass extends SyntheticClass { } fakeRootStaticFields.put(name, new IField() { + @Override public IClassHierarchy getClassHierarchy() { return FakeRootClass.this.getClassHierarchy(); } + @Override public TypeReference getFieldTypeReference() { return fieldType; } + @Override public IClass getDeclaringClass() { return FakeRootClass.this; } + @Override public Atom getName() { return name; } + @Override public boolean isStatic() { return true; } + @Override public boolean isVolatile() { return false; } + @Override public FieldReference getReference() { return FieldReference.findOrCreate(FAKE_ROOT_CLASS, name, fieldType); } + @Override public boolean isFinal() { return false; } + @Override public boolean isPrivate() { return true; } + @Override public boolean isProtected() { return false; } + @Override public boolean isPublic() { return false; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } @@ -115,6 +127,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getModifiers() */ + @Override public int getModifiers() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -122,6 +135,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getSuperclass() */ + @Override public IClass getSuperclass() throws UnsupportedOperationException { return getClassHierarchy().getRootClass(); } @@ -129,6 +143,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllImplementedInterfaces() */ + @Override public Collection getAllImplementedInterfaces() throws UnsupportedOperationException { return Collections.emptySet(); } @@ -143,6 +158,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IMethod getMethod(Selector selector) throws UnsupportedOperationException { for (IMethod m : methods) { if (m.getSelector().equals(selector)) { @@ -155,6 +171,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IField getField(Atom name) { if (fakeRootStaticFields != null) { return fakeRootStaticFields.get(name); @@ -166,6 +183,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -174,6 +192,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() throws UnsupportedOperationException { return Collections.unmodifiableCollection(methods); } @@ -181,6 +200,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredInstanceFields() */ + @Override public Collection getDeclaredInstanceFields() throws UnsupportedOperationException { return Collections.emptySet(); } @@ -188,6 +208,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ + @Override public Collection getDeclaredStaticFields() { if (fakeRootStaticFields != null) { return fakeRootStaticFields.values(); @@ -199,6 +220,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#isReferenceType() */ + @Override public boolean isReferenceType() { return getReference().isReferenceType(); } @@ -206,6 +228,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -213,6 +236,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { return Collections.emptySet(); } @@ -220,6 +244,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields() { return getDeclaredStaticFields(); } @@ -227,6 +252,7 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { throw new UnsupportedOperationException(); } @@ -234,14 +260,17 @@ public class FakeRootClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { return getDeclaredStaticFields(); } + @Override public boolean isPublic() { return false; } + @Override public boolean isPrivate() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java index 4895c03c2..8a5dac1d4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/PartialCallGraph.java @@ -54,6 +54,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra */ public static PartialCallGraph make(final CallGraph cg, final Collection partialRoots, final Collection nodes) { Graph partialGraph = GraphSlicer.prune(cg, new Filter() { + @Override public boolean accepts(CGNode o) { return nodes.contains(o); } @@ -70,6 +71,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra public static PartialCallGraph make(CallGraph cg, Collection partialRoots) { final Set nodes = DFS.getReachableNodes(cg, partialRoots); Graph partialGraph = GraphSlicer.prune(cg, new Filter() { + @Override public boolean accepts(CGNode o) { return nodes.contains(o); } @@ -78,14 +80,17 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return new PartialCallGraph(cg, partialRoots, partialGraph); } + @Override public CGNode getFakeRootNode() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public Collection getEntrypointNodes() { return partialRoots; } + @Override public CGNode getNode(IMethod method, Context C) { CGNode x = cg.getNode(method, C); if (x == null) { @@ -94,6 +99,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return (containsNode(x) ? x : null); } + @Override public Set getNodes(MethodReference m) { Set result = HashSetFactory.make(); for (Iterator xs = cg.getNodes(m).iterator(); xs.hasNext();) { @@ -106,31 +112,38 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return result; } + @Override public IClassHierarchy getClassHierarchy() { return cg.getClassHierarchy(); } + @Override public Iterator iterateNodes(IntSet nodes) { return new FilterIterator(cg.iterateNodes(nodes), new Filter() { + @Override public boolean accepts(Object o) { return containsNode((CGNode) o); } }); } + @Override public int getMaxNumber() { return cg.getMaxNumber(); } + @Override public CGNode getNode(int index) { CGNode n = cg.getNode(index); return (containsNode(n) ? n : null); } + @Override public int getNumber(CGNode n) { return (containsNode(n) ? cg.getNumber(n) : -1); } + @Override public IntSet getSuccNodeNumbers(CGNode node) { assert containsNode(node); MutableIntSet x = IntSetUtil.make(); @@ -144,6 +157,7 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return x; } + @Override public IntSet getPredNodeNumbers(CGNode node) { assert containsNode(node); MutableIntSet x = IntSetUtil.make(); @@ -157,14 +171,17 @@ public class PartialCallGraph extends DelegatingGraph implements CallGra return x; } + @Override public int getNumberOfTargets(CGNode node, CallSiteReference site) { return (containsNode(node) ? getPossibleTargets(node, site).size() : -1); } + @Override public Iterator getPossibleSites(CGNode src, CGNode target) { return ((containsNode(src) && containsNode(target)) ? cg.getPossibleSites(src, target) : null); } + @Override public Set getPossibleTargets(CGNode node, CallSiteReference site) { if (!containsNode(node)) { return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java index cc717bcef..aa7ff380d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/Util.java @@ -133,6 +133,7 @@ public class Util { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -183,19 +184,23 @@ public class Util { } return new Iterable() { + @Override public Iterator iterator() { final Atom mainMethod = Atom.findOrCreateAsciiAtom("main"); return new Iterator() { private int index = 0; + @Override public void remove() { Assertions.UNREACHABLE(); } + @Override public boolean hasNext() { return index < classNames.length; } + @Override public Entrypoint next() { TypeReference T = TypeReference.findOrCreate(loaderRef, TypeName.string2TypeName(classNames[index++])); MethodReference mainRef = MethodReference.findOrCreate(T, mainMethod, Descriptor diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java index a0c609367..7103fc6d2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractFieldPointerKey.java @@ -24,6 +24,7 @@ public abstract class AbstractFieldPointerKey extends AbstractPointerKey impleme this.instance = container; } + @Override public InstanceKey getInstanceKey() { return instance; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java index 00383947b..86751d018 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointerAnalysis.java @@ -43,6 +43,7 @@ public abstract class AbstractPointerAnalysis implements PointerAnalysis { this.instanceKeys = instanceKeys; } + @Override public HeapGraph getHeapGraph() { if (heapGraph == null) { heapGraph = new BasicHeapGraph(this, cg); @@ -54,10 +55,12 @@ public abstract class AbstractPointerAnalysis implements PointerAnalysis { return cg; } + @Override public Collection getInstanceKeys() { return Collections.unmodifiableCollection(instanceKeys.getObjects()); } + @Override public OrdinalSetMapping getInstanceKeyMapping() { return instanceKeys; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java index 33d27dc7a..3f073467a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractPointsToSolver.java @@ -40,6 +40,7 @@ public abstract class AbstractPointsToSolver implements IPointsToSolver { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointsToSolver#solve() */ + @Override public abstract void solve(IProgressMonitor monitor) throws IllegalArgumentException, CancelException; protected PropagationCallGraphBuilder getBuilder() { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java index 708287e02..c94e32261 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AbstractTypeInNode.java @@ -46,6 +46,7 @@ public abstract class AbstractTypeInNode implements InstanceKeyWithNode { /** * @return the concrete type allocated */ + @Override public IClass getConcreteType() { return type; } @@ -53,6 +54,7 @@ public abstract class AbstractTypeInNode implements InstanceKeyWithNode { /** * @return the call graph node which contains this allocation */ + @Override public CGNode getNode() { return node; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java index d9e9a0f42..9cfdc5e51 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSite.java @@ -55,6 +55,7 @@ public class AllocationSite implements InstanceKey { return method; } + @Override public IClass getConcreteType() { return concreteType; } @@ -90,17 +91,20 @@ public class AllocationSite implements InstanceKey { return true; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new MapIterator>( new FilterIterator( CG.getNodes(method.getReference()).iterator(), new Filter() { + @Override public boolean accepts(CGNode o) { return o.getMethod().equals(method); } } ), new Function>() { + @Override public Pair apply(CGNode object) { return Pair.make(object, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java index d03bf247a..093904782 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNode.java @@ -48,6 +48,7 @@ public abstract class AllocationSiteInNode extends AbstractTypeInNode { return site; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new NonNullSingletonIterator>(Pair.make(getNode(), getSite())); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java index 58946c82f..f7b3bb207 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AllocationSiteInNodeFactory.java @@ -59,6 +59,7 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { this.classBased = new ClassBasedInstanceKeys(options, cha); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { IClass type = options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -94,6 +95,7 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { ArrayClass type = (ArrayClass) options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -104,6 +106,7 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (options.getUseConstantSpecificKeys()) { return new ConstantKey(S, cha.lookupClass(type)); @@ -112,10 +115,12 @@ public class AllocationSiteInNodeFactory implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter pei, TypeReference type) { return classBased.getInstanceKeyForPEI(node, pei, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return classBased.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java index b7a008054..bca3e385e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ArrayContentsKey.java @@ -43,6 +43,7 @@ public final class ArrayContentsKey extends AbstractFieldPointerKey implements F /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKey#getTypeFilter() */ + @Override public TypeFilter getTypeFilter() { return new SingleClassFilter(((ArrayClass) instance.getConcreteType()).getElementClass()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java index 1abe64319..2def3ae28 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/AssignOperator.java @@ -63,6 +63,7 @@ class AssignOperator extends UnaryOperator implements IPoin /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return false; } 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 5df7c76c6..7bdb5cf06 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 @@ -40,6 +40,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { this.options = options; } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { if (allocation == null) { throw new IllegalArgumentException("allocation is null"); @@ -64,6 +65,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { * [[Object; e.g., the [[Object; instances in [[[Object; dim == 1 represents the second dimension, e.g., the [Object * instances in [[[Object; */ + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { if (DEBUG) { System.err.println(("getInstanceKeyForMultiNewArray " + allocation + " " + dim)); @@ -98,6 +100,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (type == null || cha.lookupClass(type) == null) { return null; @@ -113,6 +116,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { /** * @return a set of ConcreteTypeKeys that represent the exceptions the PEI may throw. */ + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter peiLoc, TypeReference type) { IClass klass = cha.lookupClass(type); if (klass == null) { @@ -121,6 +125,7 @@ public class ClassBasedInstanceKeys implements InstanceKeyFactory { return new ConcreteTypeKey(cha.lookupClass(type)); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { IClass klass = cha.lookupClass(type); if (klass == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java index 55e5709a0..fbf77931f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/CloneContextSelector.java @@ -35,6 +35,7 @@ public class CloneContextSelector implements ContextSelector { this.cha = cha; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver == null) { return null; @@ -46,6 +47,7 @@ public class CloneContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { IMethod declaredTarget = cha.resolveMethod(site.getDeclaredTarget()); if (declaredTarget != null && declaredTarget.getReference().equals(CloneInterpreter.CLONE)) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java index f55e77299..9cfaff4f8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/ConcreteTypeKey.java @@ -72,6 +72,7 @@ public final class ConcreteTypeKey implements InstanceKey { /* * @see com.ibm.wala.ipa.callgraph.propagation.InstanceKey#getConcreteType() */ + @Override public IClass getConcreteType() { return type; } @@ -102,6 +103,7 @@ public final class ConcreteTypeKey implements InstanceKey { return result; } + @Override public Iterator> getCreationSites(CallGraph CG) { return new ComposedIterator>(CG.iterator()) { @Override @@ -110,12 +112,14 @@ public final class ConcreteTypeKey implements InstanceKey { new FilterIterator( outer.iterateNewSites(), new Filter() { + @Override public boolean accepts(NewSiteReference o) { return o.getDeclaredType().equals(type.getReference()); } } ), new Function>() { + @Override public Pair apply(NewSiteReference object) { return Pair.make(outer, object); } 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 53e46eca9..17226c3c0 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 @@ -58,6 +58,7 @@ public final class ConstantKey implements InstanceKey { /* * @see com.ibm.wala.ipa.callgraph.propagation.InstanceKey#getConcreteType() */ + @Override public IClass getConcreteType() { return valueClass; } @@ -66,6 +67,7 @@ public final class ConstantKey implements InstanceKey { return value; } + @Override public Iterator> getCreationSites(CallGraph CG) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java index f9b0ac47d..ef512862a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/FilteredPointerKey.java @@ -59,11 +59,13 @@ public interface FilteredPointerKey extends PointerKey { return (o instanceof SingleClassFilter) && ((SingleClassFilter) o).getConcreteType().equals(concreteType); } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = system.getInstanceKeysForClass(concreteType); return (f == null) ? false : L.addAllInIntersection(R, f); } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = system.getInstanceKeysForClass(concreteType); @@ -73,6 +75,7 @@ public interface FilteredPointerKey extends PointerKey { return (f == null) ? L.addAll(R) : L.addAll(IntSetUtil.diff(R.getValue(), f)); } + @Override public boolean isRootFilter() { return concreteType.equals(concreteType.getClassHierarchy().getRootClass()); } @@ -132,11 +135,13 @@ public interface FilteredPointerKey extends PointerKey { return f; } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = bits(system); return (f == null) ? false : L.addAllInIntersection(R, f); } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { IntSet f = bits(system); @@ -146,6 +151,7 @@ public interface FilteredPointerKey extends PointerKey { return (f == null) ? L.addAll(R) : L.addAll(IntSetUtil.diff(R.getValue(), f)); } + @Override public boolean isRootFilter() { return concreteType.length == 1 && concreteType[0].getClassHierarchy().getRootClass().equals(concreteType[0]); } @@ -177,6 +183,7 @@ public interface FilteredPointerKey extends PointerKey { return (o instanceof SingleInstanceFilter) && ((SingleInstanceFilter) o).getInstance().equals(concreteType); } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { int idx = system.findOrCreateIndexForInstanceKey(concreteType); if (R.contains(idx)) { @@ -189,6 +196,7 @@ public interface FilteredPointerKey extends PointerKey { return false; } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { int idx = system.findOrCreateIndexForInstanceKey(concreteType); if (!R.contains(idx) || L.contains(idx)) { @@ -200,6 +208,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean isRootFilter() { return false; } @@ -246,6 +255,7 @@ public interface FilteredPointerKey extends PointerKey { this.system = system; } + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); IClass C = I.getConcreteType(); @@ -258,6 +268,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean addFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { if (R.getValue() == null) { return false; @@ -268,6 +279,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean addInverseFiltered(PropagationSystem system, PointsToSetVariable L, PointsToSetVariable R) { if (R.getValue() == null) { return false; @@ -278,6 +290,7 @@ public interface FilteredPointerKey extends PointerKey { } } + @Override public boolean isRootFilter() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java index 62d1e18f1..672c4a93b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/InstanceFieldKeyWithFilter.java @@ -43,6 +43,7 @@ public class InstanceFieldKeyWithFilter extends InstanceFieldKey implements Filt /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKey#getTypeFilter() */ + @Override public TypeFilter getTypeFilter() { return new SingleClassFilter(filter); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java index d0f66ac48..a2f52b298 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/LocalPointerKeyWithFilter.java @@ -26,6 +26,7 @@ public class LocalPointerKeyWithFilter extends LocalPointerKey implements Filter } + @Override public TypeFilter getTypeFilter() { return typeFilter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java index 1bf0a6a4b..5243eee3f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerAnalysisImpl.java @@ -107,6 +107,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis#getPointsToSet(com.ibm.wala.ipa.callgraph.propagation.PointerKey) */ + @Override @SuppressWarnings("unchecked") public OrdinalSet getPointsToSet(PointerKey key) { if (pointsToMap.isImplicit(key)) { @@ -141,6 +142,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /** * did the pointer analysis use a type filter for a given points-to set? (this is ugly). */ + @Override public boolean isFiltered(PointerKey key) { if (pointsToMap.isImplicit(key)) { return false; @@ -447,32 +449,39 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis#getHeapModel() */ + @Override public HeapModel getHeapModel() { return H; } private class HModel implements HeapModel { + @Override public Iterator iteratePointerKeys() { return pointsToMap.iterateKeys(); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return iKeyFactory.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return iKeyFactory.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { return iKeyFactory.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter peiLoc, TypeReference type) { return iKeyFactory.getInstanceKeyForPEI(node, peiLoc, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return iKeyFactory.getInstanceKeyForClassObject(type); } @@ -480,10 +489,12 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForLocal(com.ibm.detox.ipa.callgraph.CGNode, int) */ + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { return pointerKeys.getPointerKeyForLocal(node, valueNumber); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { return pointerKeys.getFilteredPointerKeyForLocal(node, valueNumber, filter); } @@ -491,6 +502,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForReturnValue(com.ibm.detox.ipa.callgraph.CGNode) */ + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return pointerKeys.getPointerKeyForReturnValue(node); } @@ -500,6 +512,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForExceptionalReturnValue(com.ibm.detox.ipa.callgraph * .CGNode) */ + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return pointerKeys.getPointerKeyForExceptionalReturnValue(node); } @@ -508,6 +521,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * @see * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForStaticField(com.ibm.wala.classLoader.FieldReference) */ + @Override public PointerKey getPointerKeyForStaticField(IField f) { return pointerKeys.getPointerKeyForStaticField(f); } @@ -517,6 +531,7 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForInstance(com.ibm.wala.ipa.callgraph.propagation. * InstanceKey, com.ibm.wala.classLoader.FieldReference) */ + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { assert field != null; return pointerKeys.getPointerKeyForInstanceField(I, field); @@ -527,10 +542,12 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { * com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForArrayContents(com.ibm.wala.ipa.callgraph.propagation * .InstanceKey) */ + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return pointerKeys.getPointerKeyForArrayContents(I); } + @Override public IClassHierarchy getClassHierarchy() { return getCallGraph().getClassHierarchy(); } @@ -539,10 +556,12 @@ public class PointerAnalysisImpl extends AbstractPointerAnalysis { /* * @see com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis#iteratePointerKeys() */ + @Override public Iterable getPointerKeys() { return Iterator2Iterable.make(pointsToMap.iterateKeys()); } + @Override public IClassHierarchy getClassHierarchy() { return builder.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java index 0ae185f0a..7ce61bc0c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointerKeyComparator.java @@ -180,6 +180,7 @@ public class PointerKeyComparator implements Comparator { return -1; } + @Override public int compare(Object key1, Object key2) { if (key1 == key2) return 0; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java index cc4b03dca..7ae2de21c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToMap.java @@ -202,6 +202,7 @@ public class PointsToMap { */ public Iterator getTransitiveRoots() { return new FilterIterator(iterateKeys(), new Filter() { + @Override public boolean accepts(Object o) { return isTransitiveRoot((PointerKey) o); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java index f016a093d..3f690bb81 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PointsToSetVariable.java @@ -122,6 +122,7 @@ public class PointsToSetVariable extends IntSetVariable { } b.foreach(new IntSetAction() { + @Override public void act(int x) { InstanceKey ik = instanceKeys.getMappedObject(x); IClass concreteType = ik.getConcreteType(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java index 372c3a108..13c3abf28 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.java @@ -216,6 +216,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.CallGraphBuilder#makeCallGraph(com.ibm.wala.ipa.callgraph.AnalysisOptions) */ + @Override public CallGraph makeCallGraph(AnalysisOptions options, IProgressMonitor monitor) throws IllegalArgumentException, CallGraphBuilderCancelException { if (options == null) { @@ -507,6 +508,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey#getTypeFilter() */ + @Override public TypeFilter getTypeFilter() { return new SingleClassFilter(type); } @@ -622,6 +624,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return false; } @@ -671,6 +674,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.detox.ipa.callgraph.CallGraphBuilder#getPointerAnalysis() */ + @Override public PointerAnalysis getPointerAnalysis() { return system.extractPointerAnalysis(this); } @@ -821,6 +825,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!I.getConcreteType().isArrayClass()) { @@ -869,6 +874,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -944,6 +950,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { return 9859 + super.hashCode(); } + @Override public boolean isComplex() { return true; } @@ -1003,6 +1010,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { } final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!representsNullType(I)) { @@ -1062,6 +1070,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1089,6 +1098,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1116,6 +1126,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { } final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!representsNullType(I)) { @@ -1218,6 +1229,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { IntSet value = ref.getValue(); final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!representsNullType(I)) { @@ -1256,6 +1268,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1290,6 +1303,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { IntSet value = arrayref.getValue(); final MutableBoolean sideEffect = new MutableBoolean(); IntSetAction action = new IntSetAction() { + @Override public void act(int i) { InstanceKey I = system.getInstanceKey(i); if (!I.getConcreteType().isArrayClass()) { @@ -1346,6 +1360,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1455,6 +1470,7 @@ public abstract class PropagationCallGraphBuilder implements CallGraphBuilder { boolean b = false; } + @Override public AnalysisCache getAnalysisCache() { return analysisCache; }; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java index 95032499f..73e8bb919 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java @@ -273,9 +273,11 @@ public class PropagationGraph implements IFixedPointSystem implicitUnaryCount--; } + @Override @SuppressWarnings("unchecked") public Iterator getStatements() { Iterator it = new FilterIterator(delegateGraph.iterator(), new Filter() { + @Override public boolean accepts(Object x) { return x instanceof AbstractStatement; } @@ -300,10 +302,12 @@ public class PropagationGraph implements IFixedPointSystem this.defs = defs.intIterator(); } + @Override public boolean hasNext() { return defs.hasNext(); } + @Override public AbstractStatement next() { int l = defs.next(); PointsToSetVariable lhs = (PointsToSetVariable) delegateGraph.getNode(l); @@ -315,6 +319,7 @@ public class PropagationGraph implements IFixedPointSystem return temp; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -338,10 +343,12 @@ public class PropagationGraph implements IFixedPointSystem this.uses = uses.intIterator(); } + @Override public boolean hasNext() { return uses.hasNext(); } + @Override public AbstractStatement next() { int r = uses.next(); PointsToSetVariable rhs = (PointsToSetVariable) delegateGraph.getNode(r); @@ -352,6 +359,7 @@ public class PropagationGraph implements IFixedPointSystem return temp; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -389,10 +397,12 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public boolean hasNext() { return innerDelegate != null; } + @Override public AbstractStatement next() { IntPair p = (IntPair) innerDelegate.next(); int lhs = p.getX(); @@ -405,6 +415,7 @@ public class PropagationGraph implements IFixedPointSystem return result; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -412,6 +423,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void removeStatement(IFixedPointStatement eq) throws IllegalArgumentException { if (eq == null) { throw new IllegalArgumentException("eq == null"); @@ -424,6 +436,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void reorder() { VariableGraphView graph = new VariableGraphView(); @@ -507,10 +520,12 @@ public class PropagationGraph implements IFixedPointSystem return new Iterator() { Iterator inner; + @Override public boolean hasNext() { return eqs.hasNext() || (inner != null); } + @Override public PointsToSetVariable next() { if (inner != null) { PointsToSetVariable result = (PointsToSetVariable)inner.next(); @@ -529,6 +544,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -566,10 +582,12 @@ public class PropagationGraph implements IFixedPointSystem advance(); } + @Override public boolean hasNext() { return nextResult != null; } + @Override public PointsToSetVariable next() { PointsToSetVariable result = nextResult; advance(); @@ -584,6 +602,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -645,6 +664,7 @@ public class PropagationGraph implements IFixedPointSystem } + @Override @SuppressWarnings("unchecked") public Iterator getStatementsThatUse(PointsToSetVariable v) { if (v == null) { @@ -670,6 +690,7 @@ public class PropagationGraph implements IFixedPointSystem return list.iterator(); } + @Override @SuppressWarnings("unchecked") public Iterator getStatementsThatDef(PointsToSetVariable v) { if (v == null) { @@ -703,6 +724,7 @@ public class PropagationGraph implements IFixedPointSystem * @throws IllegalArgumentException if v is null * */ + @Override public int getNumberOfStatementsThatUse(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); @@ -723,6 +745,7 @@ public class PropagationGraph implements IFixedPointSystem return result; } + @Override public int getNumberOfStatementsThatDef(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); @@ -743,9 +766,11 @@ public class PropagationGraph implements IFixedPointSystem return result; } + @Override @SuppressWarnings("unchecked") public Iterator getVariables() { Iterator it = new FilterIterator(delegateGraph.iterator(), new Filter() { + @Override public boolean accepts(Object x) { return x instanceof IVariable; } @@ -778,6 +803,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public boolean containsStatement(IFixedPointStatement eq) throws IllegalArgumentException { if (eq == null) { throw new IllegalArgumentException("eq == null"); @@ -811,10 +837,12 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public boolean containsVariable(PointsToSetVariable v) { return delegateGraph.containsNode(v); } + @Override public void addStatement(IFixedPointStatement statement) throws IllegalArgumentException, UnimplementedError { if (statement == null) { throw new IllegalArgumentException("statement == null"); @@ -936,10 +964,12 @@ public class PropagationGraph implements IFixedPointSystem advance(); } + @Override public boolean hasNext() { return nextResult != null; } + @Override public PointsToSetVariable next() { PointsToSetVariable result = nextResult; advance(); @@ -956,6 +986,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -989,10 +1020,12 @@ public class PropagationGraph implements IFixedPointSystem advance(); } + @Override public boolean hasNext() { return nextResult != null; } + @Override public PointsToSetVariable next() { PointsToSetVariable result = nextResult; advance(); @@ -1009,6 +1042,7 @@ public class PropagationGraph implements IFixedPointSystem } } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java index 80bb74d37..e46c52f38 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationSystem.java @@ -646,6 +646,7 @@ public class PropagationSystem extends DefaultFixedPointSolver pks = new ArrayList(params.size()); params.foreach(new IntSetAction() { + @Override public void act(int x) { if (!contentsAreInvariant(symbolTable, du, instruction.getUse(x))) { pks.add(getBuilder().getPointerKeyForLocal(node, instruction.getUse(x))); @@ -1357,6 +1359,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap * @return if non-null, then result[i] holds the set of instance keys which may be passed as the ith parameter. (which must be * invariant) */ + @Override public InstanceKey[][] computeInvariantParameters(SSAAbstractInvokeInstruction call) { InstanceKey[][] constParams = null; for (int i = 0; i < call.getNumberOfUses(); i++) { @@ -1810,6 +1813,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap /* * @see com.ibm.wala.ipa.callgraph.propagation.IPointerOperator#isComplex() */ + @Override public boolean isComplex() { return true; } @@ -1846,6 +1850,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap IntSet s = system.findOrCreatePointsToSet(var).getValue(); if (s != null && !s.isEmpty()) { s.foreach(new IntSetAction() { + @Override public void act(int x) { keys[p] = system.getInstanceKey(x); rec(pi + 1); @@ -1878,6 +1883,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap } final Set targets = HashSetFactory.make(); VoidFunction f = new VoidFunction() { + @Override public void apply(InstanceKey[] v) { IClass recv = null; if (site.isDispatch()) { @@ -2243,6 +2249,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap /* * @see com.ibm.wala.ipa.callgraph.propagation.HeapModel#iteratePointerKeys() */ + @Override public Iterator iteratePointerKeys() { return system.iteratePointerKeys(); } @@ -2266,6 +2273,7 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap return types; } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { return getInstanceKeyForPEI(node, instr, type, instanceKeyFactory); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java index 83c6d5ec8..f8bca489b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInNode.java @@ -54,16 +54,19 @@ public class SmushedAllocationSiteInNode extends AbstractTypeInNode { return "SMUSHED " + getNode() + " : " + getConcreteType(); } + @Override public Iterator> getCreationSites(CallGraph CG) { return new MapIterator>( new FilterIterator( getNode().iterateNewSites(), new Filter() { + @Override public boolean accepts(NewSiteReference o) { return o.getDeclaredType().equals(getConcreteType().getReference()); } }), new Function>() { + @Override public Pair apply(NewSiteReference object) { return Pair.make(getNode(), object); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java index ad9bc9751..99df2b486 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SmushedAllocationSiteInstanceKeys.java @@ -48,6 +48,7 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { this.classBased = new ClassBasedInstanceKeys(options, cha); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { IClass type = options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -68,6 +69,7 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { ArrayClass type = (ArrayClass) options.getClassTargetSelector().getAllocatedTarget(node, allocation); if (type == null) { @@ -78,6 +80,7 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { return key; } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (options.getUseConstantSpecificKeys()) return new ConstantKey(S, cha.lookupClass(type)); @@ -85,10 +88,12 @@ public class SmushedAllocationSiteInstanceKeys implements InstanceKeyFactory { return new ConcreteTypeKey(cha.lookupClass(type)); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter pei, TypeReference type) { return classBased.getInstanceKeyForPEI(node, pei, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return classBased.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java index c153b792d..0c0ca06b2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/StringConstantCharArray.java @@ -64,6 +64,7 @@ public class StringConstantCharArray implements InstanceKey { return true; } + @Override public IClass getConcreteType() { return constant.getConcreteType().getClassHierarchy().lookupClass(TypeReference.CharArray); } @@ -73,6 +74,7 @@ public class StringConstantCharArray implements InstanceKey { return "StringConstantCharArray:" + constant; } + @Override public Iterator> getCreationSites(CallGraph CG) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java index 2a0e7c472..fcfe60ed2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/TargetMethodContextSelector.java @@ -34,6 +34,7 @@ public class TargetMethodContextSelector implements ContextSelector { this.selector = selector; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] R) { if (R == null || R[0] == null) { throw new IllegalArgumentException("R is null"); @@ -47,6 +48,7 @@ public class TargetMethodContextSelector implements ContextSelector { return M; } + @Override public ContextItem get(ContextKey name) { if (name.equals(ContextKey.PARAMETERS[0])) { return new FilteredPointerKey.TargetMethodFilter(M); @@ -77,6 +79,7 @@ public class TargetMethodContextSelector implements ContextSelector { private static final IntSet thisParameter = IntSetUtil.make(new int[]{0}); + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return thisParameter; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java index 1e41e38f8..c3e64ea62 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContext.java @@ -39,6 +39,7 @@ public class CallStringContext implements Context { return "CallStringContext: " + cs.toString(); } + @Override public ContextItem get(ContextKey name) { if (CallStringContextSelector.CALL_STRING.equals(name)) { return cs; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java index e776d2b98..c32da64f2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallStringContextSelector.java @@ -56,6 +56,7 @@ public abstract class CallStringContextSelector implements ContextSelector { return cs.hashCode() * base.hashCode(); } + @Override public ContextItem get(ContextKey name) { if (CALL_STRING.equals(name)) { return cs; @@ -97,6 +98,7 @@ public abstract class CallStringContextSelector implements ContextSelector { /* * @see com.ibm.wala.ipa.callgraph.ContextSelector#getCalleeTarget(com.ibm.wala.ipa.callgraph.CGNode, com.ibm.wala.classLoader.CallSiteReference, com.ibm.wala.classLoader.IMethod, com.ibm.wala.ipa.callgraph.propagation.InstanceKey) */ + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); CallString cs = getCallString(caller, site, callee); @@ -109,6 +111,7 @@ public abstract class CallStringContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return base.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java index c6e928d5b..91fba9bfb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/CallerContext.java @@ -32,6 +32,7 @@ public class CallerContext implements Context { this.caller = caller; } + @Override public ContextItem get(ContextKey name) { if (name == null) { throw new IllegalArgumentException("name is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java index 6a12e650f..e92e86e0c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ContextInsensitiveSSAInterpreter.java @@ -36,6 +36,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter this.options = options; } + @Override public IR getIR(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -45,6 +46,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter return getAnalysisCache().getSSACache().findOrCreateIR(node.getMethod(), Everywhere.EVERYWHERE, options.getSSAOptions()); } + @Override public int getNumberOfStatements(CGNode node) { IR ir = getIR(node); return (ir == null) ? -1 : ir.getInstructions().length; @@ -55,6 +57,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter return false; } + @Override public ControlFlowGraph getCFG(CGNode N) { IR ir = getIR(N); if (ir == null) { @@ -64,6 +67,7 @@ public class ContextInsensitiveSSAInterpreter extends ContextInsensitiveRTAInter } } + @Override public DefUse getDU(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java index 2d06e1f25..5a2e5cf7e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultPointerKeyFactory.java @@ -31,6 +31,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { public DefaultPointerKeyFactory() { } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { if (valueNumber <= 0) { throw new IllegalArgumentException("illegal value number: " + valueNumber + " in " + node); @@ -38,6 +39,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new LocalPointerKey(node, valueNumber); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { if (filter == null) { throw new IllegalArgumentException("null filter"); @@ -47,14 +49,17 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new LocalPointerKeyWithFilter(node, valueNumber, filter); } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return new ReturnValueKey(node); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return new ExceptionReturnValueKey(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { if (f == null) { throw new IllegalArgumentException("null f"); @@ -62,6 +67,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new StaticFieldKey(f); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { if (field == null) { throw new IllegalArgumentException("field is null"); @@ -69,6 +75,7 @@ public class DefaultPointerKeyFactory implements PointerKeyFactory { return new InstanceFieldKey(I, field); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return new ArrayContentsKey(I); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java index 80cc3c7b3..cd1b84605 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DefaultSSAInterpreter.java @@ -51,10 +51,12 @@ public class DefaultSSAInterpreter extends DefaultRTAInterpreter implements SSAC } + @Override public IR getIR(CGNode node) { return getCFAInterpreter(node).getIR(node); } + @Override public int getNumberOfStatements(CGNode node) { return getCFAInterpreter(node).getNumberOfStatements(node); } @@ -75,10 +77,12 @@ public class DefaultSSAInterpreter extends DefaultRTAInterpreter implements SSAC return false; } + @Override public ControlFlowGraph getCFG(CGNode N) { return getCFAInterpreter(N).getCFG(N); } + @Override public DefUse getDU(CGNode node) { return getCFAInterpreter(node).getDU(node); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java index 4caaf7beb..6b737b1c3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/DelegatingSSAContextInterpreter.java @@ -44,6 +44,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr } } + @Override public IR getIR(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -54,6 +55,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr return B.getIR(node); } + @Override public int getNumberOfStatements(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -79,6 +81,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr return result; } + @Override public ControlFlowGraph getCFG(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -89,6 +92,7 @@ public class DelegatingSSAContextInterpreter extends DelegatingRTAContextInterpr return B.getCFG(node); } + @Override public DefUse getDU(CGNode node) { if (A != null) { if (A.understands(node)) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java index 69edb36f3..4dd136be3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/OneLevelSiteContextSelector.java @@ -37,6 +37,7 @@ public class OneLevelSiteContextSelector implements ContextSelector { this.baseSelector = baseSelector; } + @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (baseContext.equals(Everywhere.EVERYWHERE)) { @@ -46,6 +47,7 @@ public class OneLevelSiteContextSelector implements ContextSelector { } } + @Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { return baseSelector.getRelevantParameters(caller, site); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java index 982ff75e8..03c9ed271 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/cfa/ZeroXInstanceKeys.java @@ -181,6 +181,7 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { return (policy & CONSTANT_SPECIFIC) > 0; } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { if (allocation == null) { throw new IllegalArgumentException("allocation is null"); @@ -246,6 +247,7 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { return count; } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { if (allocationPolicy()) { return siteBased.getInstanceKeyForMultiNewArray(node, allocation, dim); @@ -254,6 +256,7 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { } } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { if (type == null) { throw new IllegalArgumentException("null type"); @@ -273,10 +276,12 @@ public class ZeroXInstanceKeys implements InstanceKeyFactory { * @see com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory#getInstanceKeyForPEI(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.ProgramCounter, com.ibm.wala.types.TypeReference) */ + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter pei, TypeReference type) { return classBased.getInstanceKeyForPEI(node, pei, type); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return classBased.getInstanceKeyForClassObject(type); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java index 5f24d36f8..daa08fa9d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/BasicRTABuilder.java @@ -149,6 +149,7 @@ public class BasicRTABuilder extends AbstractRTABuilder { System.err.println(("filtered value: " + value)); } IntSetAction action = new IntSetAction() { + @Override public void act(int ptr) { if (DEBUG) { System.err.println((" dispatch to ptr " + ptr)); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java index 901c6743f..c4727faef 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/ContextInsensitiveRTAInterpreter.java @@ -13,7 +13,6 @@ package com.ibm.wala.ipa.callgraph.propagation.rta; import java.util.Iterator; -import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.CodeScanner; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; @@ -40,6 +39,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv return analysisCache; } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -53,6 +53,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv } } + @Override public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -66,6 +67,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv } } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -79,6 +81,7 @@ public abstract class ContextInsensitiveRTAInterpreter extends ContextInsensitiv } } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java index f9344d3cc..bf78234cb 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DefaultRTAInterpreter.java @@ -52,6 +52,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { } } + @Override public Iterator iterateNewSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -59,6 +60,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateNewSites(node); } + @Override public Iterator iterateCallSites(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -66,6 +68,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateCallSites(node); } + @Override public Iterator iterateFieldsRead(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -73,6 +76,7 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateFieldsRead(node); } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -80,10 +84,12 @@ public class DefaultRTAInterpreter implements RTAContextInterpreter { return getNodeInterpreter(node).iterateFieldsWritten(node); } + @Override public boolean understands(CGNode node) { return true; } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { // not a factory type return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java index 118ef6329..2ee25879b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/DelegatingRTAContextInterpreter.java @@ -35,6 +35,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { } } + @Override public boolean understands(CGNode node) { if (A != null) { return A.understands(node) || B.understands(node); @@ -43,6 +44,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { } } + @Override public Iterator iterateNewSites(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -53,6 +55,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateNewSites(node); } + @Override public Iterator iterateCallSites(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -63,6 +66,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateCallSites(node); } + @Override public Iterator iterateFieldsRead(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -73,6 +77,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateFieldsRead(node); } + @Override public Iterator iterateFieldsWritten(CGNode node) { if (A != null) { if (A.understands(node)) { @@ -83,6 +88,7 @@ public class DelegatingRTAContextInterpreter implements RTAContextInterpreter { return B.iterateFieldsWritten(node); } + @Override public boolean recordFactoryType(CGNode node, IClass klass) { boolean result = false; if (A != null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java index a9dbdb57d..a2844d8e8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedHeapModel.java @@ -174,6 +174,7 @@ public class TypeBasedHeapModel implements HeapModel { return result; } + @Override @SuppressWarnings("unchecked") public Iterator iteratePointerKeys() { initAllPKeys(); @@ -185,18 +186,22 @@ public class TypeBasedHeapModel implements HeapModel { }).iterator(); } + @Override public IClassHierarchy getClassHierarchy() { return iKeyFactory.getClassHierarchy(); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) throws UnimplementedError { return iKeyFactory.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) throws UnimplementedError { return iKeyFactory.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, Object S) { return iKeyFactory.getInstanceKeyForConstant(type, S); } @@ -206,11 +211,13 @@ public class TypeBasedHeapModel implements HeapModel { return null; } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -222,6 +229,7 @@ public class TypeBasedHeapModel implements HeapModel { * * @see com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory#getPointerKeyForLocal(com.ibm.wala.ipa.callgraph.CGNode, int) */ + @Override public FilteredPointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { initPKeysForNode(node); PointerKey p = pointerKeys.getPointerKeyForLocal(node, valueNumber); @@ -250,28 +258,34 @@ public class TypeBasedHeapModel implements HeapModel { } } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return pointerKeys.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return pointerKeys.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return pointerKeys.getPointerKeyForStaticField(f); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { return pointerKeys.getPointerKeyForInstanceField(I, field); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { return pointerKeys.getPointerKeyForArrayContents(I); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java index e0da1ed9c..8e8a3b5ec 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/rta/TypeBasedPointerAnalysis.java @@ -83,6 +83,7 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis { return new TypeBasedPointerAnalysis(options, klasses, cg); } + @Override public OrdinalSet getPointsToSet(PointerKey key) throws IllegalArgumentException { if (key == null) { throw new IllegalArgumentException("key == null"); @@ -169,18 +170,22 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis { } } + @Override public HeapModel getHeapModel() { return heapModel; } + @Override public Collection getPointerKeys() { return Iterator2Collection.toSet(heapModel.iteratePointerKeys()); } + @Override public boolean isFiltered(PointerKey pk) { return false; } + @Override public IClassHierarchy getClassHierarchy() { return heapModel.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java index fb33cbe30..c16e6bd25 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/AbstractInterproceduralCFG.java @@ -390,6 +390,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.Graph#removeNodeAndEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(BasicBlockInContext N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -397,6 +398,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#iterateNodes() */ + @Override public Iterator> iterator() { if (WARN_ON_EAGER_CONSTRUCTION) { System.err.println("WARNING: forcing full ICFG construction by calling iterator()"); @@ -411,6 +413,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { if (WARN_ON_EAGER_CONSTRUCTION) { System.err.println("WARNING: forcing full ICFG construction by calling getNumberOfNodes()"); @@ -537,6 +540,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(BasicBlockInContext n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -544,6 +548,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.NodeManager#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(BasicBlockInContext n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -551,6 +556,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator> getPredNodes(BasicBlockInContext N) { initForPred(N); return g.getPredNodes(N); @@ -595,6 +601,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(BasicBlockInContext N) { initForPred(N); return g.getPredNodeCount(N); @@ -603,6 +610,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator> getSuccNodes(BasicBlockInContext N) { initForSucc(N); return g.getSuccNodes(N); @@ -611,6 +619,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(BasicBlockInContext N) { initForSucc(N); return g.getSuccNodeCount(N); @@ -619,10 +628,12 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, com.ibm.wala.util.graph.Node) */ + @Override public void addEdge(BasicBlockInContext src, BasicBlockInContext dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(BasicBlockInContext src, BasicBlockInContext dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -630,6 +641,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(BasicBlockInContext node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -642,6 +654,7 @@ public abstract class AbstractInterproceduralCFG imple /* * @see com.ibm.wala.util.graph.Graph#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(BasicBlockInContext N) { return g.containsNode(N); } @@ -709,14 +722,17 @@ public abstract class AbstractInterproceduralCFG imple return site; } + @Override public void removeIncomingEdges(BasicBlockInContext node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(BasicBlockInContext node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public boolean hasEdge(BasicBlockInContext src, BasicBlockInContext dst) { if (!addedSuccs.contains(getNumber(src))) { if (!src.getNode().equals(dst.getNode())) { @@ -747,15 +763,18 @@ public abstract class AbstractInterproceduralCFG imple return g.hasEdge(src, dst); } + @Override public int getNumber(BasicBlockInContext N) { addNodeForBasicBlockIfNeeded(N); return g.getNumber(N); } + @Override public BasicBlockInContext getNode(int number) throws UnimplementedError { return g.getNode(number); } + @Override public int getMaxNumber() { if (WARN_ON_EAGER_CONSTRUCTION) { System.err.println("WARNING: forcing full ICFG construction by calling getMaxNumber()"); @@ -767,16 +786,19 @@ public abstract class AbstractInterproceduralCFG imple return g.getMaxNumber(); } + @Override public Iterator> iterateNodes(IntSet s) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getSuccNodeNumbers(BasicBlockInContext node) { initForSucc(node); return g.getSuccNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(BasicBlockInContext node) { initForPred(node); return g.getPredNodeNumbers(node); @@ -812,6 +834,7 @@ public abstract class AbstractInterproceduralCFG imple // a successor node is a return site if it is in the same // procedure, and is not the entry() node. Filter isReturn = new Filter() { + @Override public boolean accepts(Object o) { BasicBlockInContext other = (BasicBlockInContext) o; return !other.isEntryBlock() && node.equals(other.getNode()); @@ -833,6 +856,7 @@ public abstract class AbstractInterproceduralCFG imple final CGNode node = returnBlock.getNode(); Filter dispatchFilter = new Filter() { + @Override public boolean accepts(T callBlock) { BasicBlockInContext bb = new BasicBlockInContext(node, callBlock); if (!hasCall(bb, cfg)) { @@ -848,6 +872,7 @@ public abstract class AbstractInterproceduralCFG imple it = new FilterIterator(it, dispatchFilter); Function> toContext = new Function>() { + @Override public BasicBlockInContext apply(T object) { T b = object; return new BasicBlockInContext(node, b); @@ -858,6 +883,7 @@ public abstract class AbstractInterproceduralCFG imple } private final Filter> isCall = new Filter>() { + @Override public boolean accepts(BasicBlockInContext o) { return hasCall(o); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java index d58d94a40..787cb7d46 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/BasicBlockInContext.java @@ -40,6 +40,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getFirstInstructionIndex() */ + @Override public int getFirstInstructionIndex() { return delegate.getFirstInstructionIndex(); } @@ -47,6 +48,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getLastInstructionIndex() */ + @Override public int getLastInstructionIndex() { return delegate.getLastInstructionIndex(); } @@ -54,6 +56,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#iterateAllInstructions() */ + @Override public Iterator iterator() { return delegate.iterator(); } @@ -61,6 +64,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getMethod() */ + @Override public IMethod getMethod() { return delegate.getMethod(); } @@ -68,6 +72,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#getNumber() */ + @Override public int getNumber() { return delegate.getNumber(); } @@ -75,6 +80,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#isCatchBlock() */ + @Override public boolean isCatchBlock() { return delegate.isCatchBlock(); } @@ -82,6 +88,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#isEntryBlock() */ + @Override public boolean isEntryBlock() { return delegate.isEntryBlock(); } @@ -89,6 +96,7 @@ public final class BasicBlockInContext extends NodeWit /* * @see com.ibm.wala.cfg.IBasicBlock#isExitBlock() */ + @Override public boolean isExitBlock() { return delegate.isExitBlock(); } @@ -137,18 +145,22 @@ public final class BasicBlockInContext extends NodeWit return delegate.toString(); } + @Override public Iterator getCaughtExceptionTypes() { return delegate.getCaughtExceptionTypes(); } + @Override public SSAInstruction getLastInstruction() { return delegate.getLastInstruction(); } + @Override public Iterator iteratePhis() { return delegate.iteratePhis(); } + @Override public Iterator iteratePis() { return delegate.iteratePis(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java index 6af6a3c33..d56bd172a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/ExceptionPrunedCFG.java @@ -25,10 +25,12 @@ public class ExceptionPrunedCFG { this.cfg = cfg; } + @Override public boolean hasNormalEdge(T src, T dst) { return cfg.getNormalSuccessors(src).contains(dst); } + @Override public boolean hasExceptionalEdge(T src, T dst) { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java index 4cd6d34d4..5a33e751a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cfg/PrunedCFG.java @@ -70,6 +70,7 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getExceptionalSuccessors(final T N) { return new FilterIterator(cfg.getExceptionalSuccessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasExceptionalEdge(N, o); } @@ -78,6 +79,7 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getNormalSuccessors(final T N) { return new FilterIterator(cfg.getNormalSuccessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasNormalEdge(N, o); } @@ -86,6 +88,7 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getExceptionalPredecessors(final T N) { return new FilterIterator(cfg.getExceptionalPredecessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasExceptionalEdge(o, N); } @@ -94,24 +97,29 @@ public class PrunedCFG> extends AbstractNumberedGrap public Iterator getNormalPredecessors(final T N) { return new FilterIterator(cfg.getNormalPredecessors(N).iterator(), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && filter.hasNormalEdge(o, N); } }); } + @Override public Iterator getSuccNodes(final T N) { return new FilterIterator(cfg.getSuccNodes(N), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && (filter.hasNormalEdge(N, o) || filter.hasExceptionalEdge(N, o)); } }); } + @Override public int getSuccNodeCount(T N) { return Iterator2Collection.toSet(getSuccNodes(N)).size(); } + @Override public IntSet getSuccNodeNumbers(T N) { MutableIntSet bits = IntSetUtil.make(); for (Iterator EE = getSuccNodes(N); EE.hasNext();) { @@ -121,18 +129,22 @@ public class PrunedCFG> extends AbstractNumberedGrap return bits; } + @Override public Iterator getPredNodes(final T N) { return new FilterIterator(cfg.getPredNodes(N), new Filter() { + @Override public boolean accepts(T o) { return currentCFGNodes.containsNode(o) && (filter.hasNormalEdge(o, N) || filter.hasExceptionalEdge(o, N)); } }); } + @Override public int getPredNodeCount(T N) { return Iterator2Collection.toSet(getPredNodes(N)).size(); } + @Override public IntSet getPredNodeNumbers(T N) { MutableIntSet bits = IntSetUtil.make(); for (Iterator EE = getPredNodes(N); EE.hasNext();) { @@ -142,6 +154,7 @@ public class PrunedCFG> extends AbstractNumberedGrap return bits; } + @Override public boolean hasEdge(T src, T dst) { for (Iterator EE = getSuccNodes(src); EE.hasNext();) { if (EE.next().equals(dst)) { @@ -152,22 +165,27 @@ public class PrunedCFG> extends AbstractNumberedGrap return false; } + @Override public void addEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeEdge(T src, T dst) { throw new UnsupportedOperationException(); } + @Override public void removeAllIncidentEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges(T node) { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(T node) { throw new UnsupportedOperationException(); } @@ -183,6 +201,7 @@ public class PrunedCFG> extends AbstractNumberedGrap this.subset = subset; } + @Override public int getNumber(T N) { if (subset.contains(N)) return nodes.getNumber(N); @@ -190,6 +209,7 @@ public class PrunedCFG> extends AbstractNumberedGrap return -1; } + @Override public T getNode(int number) { T N = nodes.getNode(number); if (subset.contains(N)) @@ -198,6 +218,7 @@ public class PrunedCFG> extends AbstractNumberedGrap throw new NoSuchElementException(); } + @Override public int getMaxNumber() { int max = -1; for (Iterator NS = nodes.iterator(); NS.hasNext();) { @@ -212,32 +233,39 @@ public class PrunedCFG> extends AbstractNumberedGrap private Iterator filterNodes(Iterator nodeIterator) { return new FilterIterator(nodeIterator, new Filter() { + @Override public boolean accepts(Object o) { return subset.contains(o); } }); } + @Override public Iterator iterateNodes(IntSet s) { return filterNodes(nodes.iterateNodes(s)); } + @Override public Iterator iterator() { return filterNodes(nodes.iterator()); } + @Override public int getNumberOfNodes() { return subset.size(); } + @Override public void addNode(T n) { throw new UnsupportedOperationException(); } + @Override public void removeNode(T n) { throw new UnsupportedOperationException(); } + @Override public boolean containsNode(T N) { return subset.contains(N); } @@ -283,6 +311,7 @@ public class PrunedCFG> extends AbstractNumberedGrap return edges; } + @Override public List getExceptionalSuccessors(final T N) { ArrayList result = new ArrayList(); for (Iterator it = edges.getExceptionalSuccessors(N); it.hasNext();) { @@ -291,42 +320,52 @@ public class PrunedCFG> extends AbstractNumberedGrap return result; } + @Override public Collection getNormalSuccessors(final T N) { return Iterator2Collection.toSet(edges.getNormalSuccessors(N)); } + @Override public Collection getExceptionalPredecessors(final T N) { return Iterator2Collection.toSet(edges.getExceptionalPredecessors(N)); } + @Override public Collection getNormalPredecessors(final T N) { return Iterator2Collection.toSet(edges.getNormalPredecessors(N)); } + @Override public T entry() { return cfg.entry(); } + @Override public T exit() { return cfg.exit(); } + @Override public T getBlockForInstruction(int index) { return cfg.getBlockForInstruction(index); } + @Override public I[] getInstructions() { return cfg.getInstructions(); } + @Override public int getProgramCounter(int index) { return cfg.getProgramCounter(index); } + @Override public IMethod getMethod() { return cfg.getMethod(); } + @Override public BitVector getCatchBlocks() { BitVector result = new BitVector(); BitVector blocks = cfg.getCatchBlocks(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java index 231e6e773..7da559fa6 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/cha/ClassHierarchy.java @@ -290,6 +290,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return true if the add succeeded; false if it failed for some reason * @throws IllegalArgumentException if klass is null */ + @Override public boolean addClass(IClass klass) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -389,6 +390,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the set of IMethods that this call can resolve to. * @throws IllegalArgumentException if ref is null */ + @Override public Set getPossibleTargets(MethodReference ref) { if (ref == null) { throw new IllegalArgumentException("ref is null"); @@ -437,6 +439,7 @@ public class ClassHierarchy implements IClassHierarchy { * @param ref method reference * @return the set of IMethods that this call can resolve to. */ + @Override public Set getPossibleTargets(IClass declaredClass, MethodReference ref) { if (ref.getName().equals(MethodReference.initAtom)) { @@ -504,6 +507,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return IMethod, or null if no appropriate receiver is found. * @throws IllegalArgumentException if m is null */ + @Override public IMethod resolveMethod(MethodReference m) { if (m == null) { throw new IllegalArgumentException("m is null"); @@ -520,6 +524,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the canonical IField that represents a given field , or null if none found * @throws IllegalArgumentException if f is null */ + @Override public IField resolveField(FieldReference f) { if (f == null) { throw new IllegalArgumentException("f is null"); @@ -536,6 +541,7 @@ public class ClassHierarchy implements IClassHierarchy { * @throws IllegalArgumentException if f is null * @throws IllegalArgumentException if klass is null */ + @Override public IField resolveField(IClass klass, FieldReference f) { if (klass == null) { throw new IllegalArgumentException("klass is null"); @@ -554,6 +560,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return Method resolved method abstraction * @throws IllegalArgumentException if receiverClass is null */ + @Override public IMethod resolveMethod(IClass receiverClass, Selector selector) { if (receiverClass == null) { throw new IllegalArgumentException("receiverClass is null"); @@ -723,6 +730,7 @@ public class ClassHierarchy implements IClassHierarchy { } + @Override public ClassLoaderFactory getFactory() { return factory; } @@ -730,6 +738,7 @@ public class ClassHierarchy implements IClassHierarchy { /** * @throws IllegalArgumentException if A is null */ + @Override public IClass getLeastCommonSuperclass(IClass a, IClass b) { assert (a.getClassLoader().getLanguage().equals(b.getClassLoader().getLanguage())); Language lang = a.getClassLoader().getLanguage(); @@ -791,6 +800,7 @@ public class ClassHierarchy implements IClassHierarchy { * @see com.ibm.wala.ipa.cha.IClassHierarchy#getLeastCommonSuperclass(com.ibm.wala.types.TypeReference, * com.ibm.wala.types.TypeReference) */ + @Override public TypeReference getLeastCommonSuperclass(TypeReference a, TypeReference b) { if (a == null) { throw new IllegalArgumentException("a is null"); @@ -818,6 +828,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the {@link IClass} for a if found; null if can't find the class. * @throws IllegalArgumentException if A is null */ + @Override public IClass lookupClass(TypeReference a) { if (a == null) { throw new IllegalArgumentException("a is null"); @@ -878,6 +889,7 @@ public class ClassHierarchy implements IClassHierarchy { * * @throws IllegalArgumentException if c is null */ + @Override public boolean isSubclassOf(IClass c, IClass t) { if (c == null) { throw new IllegalArgumentException("c is null"); @@ -943,6 +955,7 @@ public class ClassHierarchy implements IClassHierarchy { * * @return true iff i is an interface and c is a class that implements i, or c is an interface that extends i. */ + @Override public boolean implementsInterface(IClass c, IClass i) { if (i == null) { throw new IllegalArgumentException("Cannot ask implementsInterface with i == null"); @@ -970,6 +983,7 @@ public class ClassHierarchy implements IClassHierarchy { /** * Return set of all subclasses of type in the Class Hierarchy TODO: Tune this implementation. Consider caching if necessary. */ + @Override public Collection computeSubClasses(TypeReference type) { IClass t = lookupClass(type); if (t == null) { @@ -996,6 +1010,7 @@ public class ClassHierarchy implements IClassHierarchy { * * kind of ugly. a better scheme? */ + @Override public Collection getJavaLangErrorTypes() { if (subTypeRefsOfError == null) { computeSubClasses(TypeReference.JavaLangError); @@ -1013,6 +1028,7 @@ public class ClassHierarchy implements IClassHierarchy { * * kind of ugly. a better scheme? */ + @Override public Collection getJavaLangRuntimeExceptionTypes() { if (runtimeExceptionTypeRefs == null) { computeSubClasses(TypeReference.JavaLangRuntimeException); @@ -1045,6 +1061,7 @@ public class ClassHierarchy implements IClassHierarchy { return result; } + @Override public boolean isInterface(TypeReference type) { IClass T = lookupClass(type); assert T != null : "Null lookup for " + type; @@ -1057,6 +1074,7 @@ public class ClassHierarchy implements IClassHierarchy { * @param type an interface * @return Set of IClass that represent implementors of the interface */ + @Override public Set getImplementors(TypeReference type) { IClass T = lookupClass(type); Set result = implementors.get(T); @@ -1066,8 +1084,10 @@ public class ClassHierarchy implements IClassHierarchy { return Collections.unmodifiableSet(result); } + @Override public Iterator iterator() { Function toClass = new Function() { + @Override public IClass apply(Node n) { return n.klass; } @@ -1078,14 +1098,17 @@ public class ClassHierarchy implements IClassHierarchy { /** * @return The number of classes present in the class hierarchy. */ + @Override public int getNumberOfClasses() { return map.keySet().size(); } + @Override public IClassLoader[] getLoaders() { return loaders; } + @Override public IClassLoader getLoader(ClassLoaderReference loaderRef) { for (int i = 0; i < loaders.length; i++) { if (loaders[i].getReference().equals(loaderRef)) { @@ -1096,6 +1119,7 @@ public class ClassHierarchy implements IClassHierarchy { return null; } + @Override public AnalysisScope getScope() { return scope; } @@ -1104,6 +1128,7 @@ public class ClassHierarchy implements IClassHierarchy { * @return the number of classes that immediately extend klass. if klass is an array class A[][]...[], we return number of * immediate subclasses of A. If A is primitive, we return 0. */ + @Override public int getNumberOfImmediateSubclasses(IClass klass) { if (klass.isArrayClass()) { IClass innermost = getInnermostTypeOfArrayClass(klass); @@ -1118,11 +1143,13 @@ public class ClassHierarchy implements IClassHierarchy { * @return the classes that immediately extend klass. if klass is an array class A[][]...[], we return array classes B[][]...[] * (same dimensionality) where B is an immediate subclass of A. If A is primitive, we return the empty set. */ + @Override public Collection getImmediateSubclasses(IClass klass) { if (klass.isArrayClass()) { return getImmediateArraySubclasses((ArrayClass)klass); } Function node2Class = new Function() { + @Override public IClass apply(Node n) { return n.klass; } @@ -1219,10 +1246,12 @@ public class ClassHierarchy implements IClassHierarchy { return new ClassHierarchy(scope, factory, language, monitor); } + @Override public IClass getRootClass() { return root.getJavaClass(); } + @Override public boolean isRootClass(IClass c) throws IllegalArgumentException { if (c == null) { throw new IllegalArgumentException("c == null"); @@ -1230,6 +1259,7 @@ public class ClassHierarchy implements IClassHierarchy { return c.equals(root.getJavaClass()); } + @Override public int getNumber(IClass c) { return map.get(c.getReference()).left; } @@ -1267,6 +1297,7 @@ public class ClassHierarchy implements IClassHierarchy { * @throws IllegalArgumentException if c1 is null * @throws IllegalArgumentException if c2 is null */ + @Override public boolean isAssignableFrom(IClass c1, IClass c2) { if (c2 == null) { throw new IllegalArgumentException("c2 is null"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java index 91cedd96c..dbfd755b7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/DelegatingExtendedHeapModel.java @@ -38,30 +38,37 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { this.h = h; } + @Override public IClassHierarchy getClassHierarchy() { return h.getClassHierarchy(); } + @Override public FilteredPointerKey getFilteredPointerKeyForLocal(CGNode node, int valueNumber, FilteredPointerKey.TypeFilter filter) { return h.getFilteredPointerKeyForLocal(node, valueNumber, filter); } + @Override public InstanceKey getInstanceKeyForAllocation(CGNode node, NewSiteReference allocation) { return h.getInstanceKeyForAllocation(node, allocation); } + @Override public InstanceKey getInstanceKeyForClassObject(TypeReference type) { return h.getInstanceKeyForClassObject(type); } + @Override public InstanceKey getInstanceKeyForConstant(TypeReference type, T S) { return h.getInstanceKeyForConstant(type, S); } + @Override public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) { return h.getInstanceKeyForMultiNewArray(node, allocation, dim); } + @Override public InstanceKey getInstanceKeyForPEI(CGNode node, ProgramCounter instr, TypeReference type) { if (node == null) { throw new IllegalArgumentException("null node"); @@ -69,6 +76,7 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { return h.getInstanceKeyForPEI(node, instr, type); } + @Override public PointerKey getPointerKeyForArrayContents(InstanceKey I) { if (I == null) { throw new IllegalArgumentException("I is null"); @@ -76,10 +84,12 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { return h.getPointerKeyForArrayContents(I); } + @Override public PointerKey getPointerKeyForExceptionalReturnValue(CGNode node) { return h.getPointerKeyForExceptionalReturnValue(node); } + @Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { if (field == null) { throw new IllegalArgumentException("field is null"); @@ -87,22 +97,27 @@ public class DelegatingExtendedHeapModel implements ExtendedHeapModel { return h.getPointerKeyForInstanceField(I, field); } + @Override public PointerKey getPointerKeyForLocal(CGNode node, int valueNumber) { return h.getPointerKeyForLocal(node, valueNumber); } + @Override public PointerKey getPointerKeyForReturnValue(CGNode node) { return h.getPointerKeyForReturnValue(node); } + @Override public PointerKey getPointerKeyForStaticField(IField f) { return h.getPointerKeyForStaticField(f); } + @Override public Iterator iteratePointerKeys() { return h.iteratePointerKeys(); } + @Override public PointerKey getPointerKeyForArrayLength(InstanceKey I) { return new ArrayLengthKey(I); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java index 138c30eef..07e2d1e72 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/GenReach.java @@ -61,10 +61,12 @@ public class GenReach extends BitVectorFramework { this.gen = gen; } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(T node) { BitVector v = getGen(node); return new BitVectorUnionVector(v); @@ -83,14 +85,17 @@ public class GenReach extends BitVectorFramework { } } + @Override public boolean hasEdgeTransferFunctions() { return false; } + @Override public boolean hasNodeTransferFunctions() { return true; } + @Override public UnaryOperator getEdgeTransferFunction(T src, T dst) { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java index f20c98037..a5e1072d2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java @@ -105,6 +105,7 @@ public class ModRef { return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>() { + @Override public Collection apply(CGNode n) { return scanNodeForMod(n, pa, heapExclude); } @@ -120,6 +121,7 @@ public class ModRef { private Map> scanForRef(CallGraph cg, final PointerAnalysis pa, final HeapExclusions heapExclude) { return CallGraphTransitiveClosure.collectNodeResults(cg, new Function>() { + @Override public Collection apply(CGNode n) { return scanNodeForRef(n, pa, heapExclude); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java index 580281ea8..079d192ad 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ExceptionalReturnCaller.java @@ -23,6 +23,7 @@ public class ExceptionalReturnCaller extends StatementWithInstructionIndex imple super(node, callIndex); } + @Override public int getValueNumber() { return getInstruction().getException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java index 86015509f..56c20c607 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/HeapReachingDefs.java @@ -214,21 +214,25 @@ public class HeapReachingDefs { return delegate.toString(); } + @Override public void clear() { Assertions.UNREACHABLE(); delegate.clear(); } + @Override public boolean containsKey(Object key) { Assertions.UNREACHABLE(); return delegate.containsKey(key); } + @Override public boolean containsValue(Object value) { Assertions.UNREACHABLE(); return delegate.containsValue(value); } + @Override public Set>> entrySet() { Assertions.UNREACHABLE(); return delegate.entrySet(); @@ -240,6 +244,7 @@ public class HeapReachingDefs { return delegate.equals(o); } + @Override public OrdinalSet get(Object key) { return delegate.get(key); } @@ -250,35 +255,42 @@ public class HeapReachingDefs { return delegate.hashCode(); } + @Override public boolean isEmpty() { Assertions.UNREACHABLE(); return delegate.isEmpty(); } + @Override public Set keySet() { return delegate.keySet(); } + @Override public OrdinalSet put(Statement key, OrdinalSet value) { Assertions.UNREACHABLE(); return delegate.put(key, value); } + @Override public void putAll(Map> t) { Assertions.UNREACHABLE(); delegate.putAll(t); } + @Override public OrdinalSet remove(Object key) { Assertions.UNREACHABLE(); return delegate.remove(key); } + @Override public int size() { Assertions.UNREACHABLE(); return delegate.size(); } + @Override public Collection> values() { Assertions.UNREACHABLE(); return delegate.values(); @@ -505,6 +517,7 @@ public class HeapReachingDefs { } } + @Override public UnaryOperator getEdgeTransferFunction(IExplodedBasicBlock src, IExplodedBasicBlock dst) { if (DEBUG) { System.err.println("getEdgeXfer: " + src + " " + dst + " " + src.isEntryBlock()); @@ -546,18 +559,22 @@ public class HeapReachingDefs { } } + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } + @Override public UnaryOperator getNodeTransferFunction(IExplodedBasicBlock node) { return null; } + @Override public boolean hasEdgeTransferFunctions() { return true; } + @Override public boolean hasNodeTransferFunctions() { return false; } @@ -627,6 +644,7 @@ public class HeapReachingDefs { } else { // only static fields are actually killed Filter staticFilter = new Filter() { + @Override public boolean accepts(Object o) { return o instanceof StaticFieldKey; } @@ -638,6 +656,7 @@ public class HeapReachingDefs { } else { Filter f = new Filter() { // accept any statement which writes a killed location. + @Override public boolean accepts(Object o) { Statement s = (Statement) o; Collection m = getMod(s, node, h, pa, exclusions); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java index 7a2eed40a..3bdc8cfda 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/NormalReturnCaller.java @@ -23,6 +23,7 @@ public class NormalReturnCaller extends StatementWithInstructionIndex implements super(node, callIndex); } + @Override public int getValueNumber() { return getInstruction().getReturnValue(0); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java index 271052848..a10b5afa2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/PDG.java @@ -661,6 +661,7 @@ public class PDG implements NumberedGraph { // in reaching defs calculation, exclude heap statements that are // irrelevant. Filter f = new Filter() { + @Override public boolean accepts(Object o) { if (o instanceof HeapStatement) { HeapStatement h = (HeapStatement) o; @@ -753,6 +754,7 @@ public class PDG implements NumberedGraph { */ private Collection computeReturnStatements(final IR ir) { Filter filter = new Filter() { + @Override public boolean accepts(Object o) { if (o instanceof NormalStatement) { NormalStatement s = (NormalStatement) o; @@ -1073,12 +1075,14 @@ public class PDG implements NumberedGraph { return 103 * node.hashCode(); } + @Override public int getPredNodeCount(Statement N) throws UnimplementedError { populate(); Assertions.UNREACHABLE(); return delegate.getPredNodeCount(N); } + @Override public Iterator getPredNodes(Statement N) { populate(); if (!dOptions.isIgnoreHeap()) { @@ -1127,12 +1131,14 @@ public class PDG implements NumberedGraph { } } + @Override public int getSuccNodeCount(Statement N) throws UnimplementedError { populate(); Assertions.UNREACHABLE(); return delegate.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(Statement N) { populate(); if (!dOptions.isIgnoreHeap()) { @@ -1141,83 +1147,101 @@ public class PDG implements NumberedGraph { return delegate.getSuccNodes(N); } + @Override public boolean hasEdge(Statement src, Statement dst) throws UnimplementedError { populate(); return delegate.hasEdge(src, dst); } + @Override public void removeNodeAndEdges(Statement N) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void addNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(Statement N) { populate(); return delegate.containsNode(N); } + @Override public int getNumberOfNodes() { populate(); return delegate.getNumberOfNodes(); } + @Override public Iterator iterator() { populate(); return delegate.iterator(); } + @Override public void removeNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(Statement node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Statement src, Statement dst) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Statement node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Statement node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public int getMaxNumber() { populate(); return delegate.getMaxNumber(); } + @Override public Statement getNode(int number) { populate(); return delegate.getNode(number); } + @Override public int getNumber(Statement N) { populate(); return delegate.getNumber(N); } + @Override public Iterator iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getSuccNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java index 4ef8cb584..ec8b7f87f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCallee.java @@ -31,6 +31,7 @@ public class ParamCallee extends Statement implements ValueNumberCarrier { return Kind.PARAM_CALLEE; } + @Override public int getValueNumber() { return valueNumber; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java index 430d27636..52570bf57 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ParamCaller.java @@ -42,6 +42,7 @@ public class ParamCaller extends StatementWithInstructionIndex implements ValueN return super.toString() + " v" + getValueNumber(); } + @Override public int getValueNumber() { return valueNumber; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java index 5b803736a..9eabeca12 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/ReachabilityFunctions.java @@ -26,6 +26,7 @@ public class ReachabilityFunctions implements IFlowFunctionMap { public final static VectorGenFlowFunction FLOW_REACHES = VectorGenFlowFunction.make(SparseIntSet.singleton(0)); public final static IUnaryFlowFunction KILL_FLOW = new IUnaryFlowFunction() { + @Override public SparseIntSet getTargets(int d1) { // kill even the reachability predicate 0. return new SparseIntSet(); @@ -46,19 +47,23 @@ public class ReachabilityFunctions implements IFlowFunctionMap { /* * @see com.ibm.wala.dataflow.IFDS.IFlowFunctionMap#getCallNoneToReturnFlowFunction(java.lang.Object, java.lang.Object) */ + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(T src, T dest) { return FLOW_REACHES; } + @Override public IUnaryFlowFunction getCallToReturnFlowFunction(T src, T dest) { // force flow into callee and back. return KILL_FLOW; } + @Override public IUnaryFlowFunction getNormalFlowFunction(T src, T dest) { return FLOW_REACHES; } + @Override public IFlowFunction getReturnFlowFunction(T call, T src, T dest) { return FLOW_REACHES; } @@ -67,6 +72,7 @@ public class ReachabilityFunctions implements IFlowFunctionMap { return FLOW_REACHES; } + @Override public IUnaryFlowFunction getCallFlowFunction(T src, T dest, T ret) { return FLOW_REACHES; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java index 6ad7b1e5a..9f6fdd8e9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDG.java @@ -199,6 +199,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { * iterate over the nodes without constructing any new ones. Use with extreme care. May break graph traversals that * lazily add more nodes. */ + @Override public Iterator iterateLazyNodes() { return nodeMgr.iterateLazyNodes(); } @@ -279,14 +280,17 @@ public class SDG extends AbstractNumberedGraph implements ISDG { } private class Edges implements NumberedEdgeManager { + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(Statement N) { return IteratorUtil.count(getPredNodes(N)); } + @Override public Iterator getPredNodes(Statement N) { if (dOptions.isIgnoreExceptions()) { assert !N.getKind().equals(Kind.EXC_RET_CALLEE); @@ -441,10 +445,12 @@ public class SDG extends AbstractNumberedGraph implements ISDG { } } + @Override public int getSuccNodeCount(Statement N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public Iterator getSuccNodes(Statement N) { if (dOptions.isTerminateAtCast() && isUninformativeForReflection(N.getNode())) { return EmptyIterator.instance(); @@ -607,6 +613,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return false; } + @Override public boolean hasEdge(Statement src, Statement dst) { addPDGStatementNodes(src.getNode()); addPDGStatementNodes(dst.getNode()); @@ -723,26 +730,31 @@ public class SDG extends AbstractNumberedGraph implements ISDG { } } + @Override public void removeAllIncidentEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public IntSet getPredNodeNumbers(Statement node) { // TODO: optimize me. MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); @@ -753,6 +765,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return result; } + @Override public IntSet getSuccNodeNumbers(Statement node) { // TODO: optimize me. MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); @@ -774,6 +787,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return nodeMgr; } + @Override public PDG getPDG(CGNode node) { PDG result = pdgMap.get(node); if (result == null) { @@ -787,6 +801,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return result; } + @Override public ControlDependenceOptions getCOptions() { return cOptions; } @@ -799,6 +814,7 @@ public class SDG extends AbstractNumberedGraph implements ISDG { return cg; } + @Override public IClassHierarchy getClassHierarchy() { return cg.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java index dc9ff6cb0..b4a94f77f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SDGSupergraph.java @@ -40,6 +40,7 @@ class SDGSupergraph implements ISupergraph { this.backward = backward; } + @Override public Graph getProcedureGraph() { Assertions.UNREACHABLE(); return null; @@ -53,6 +54,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#classifyEdge(java.lang.Object, java.lang.Object) */ + @Override public byte classifyEdge(Statement src, Statement dest) { Assertions.UNREACHABLE(); return 0; @@ -61,6 +63,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCallSites(java.lang.Object) */ + @Override public Iterator getCallSites(Statement r, PDG callee) { switch (r.getKind()) { case EXC_RET_CALLER: { @@ -90,10 +93,12 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getCalledNodes(java.lang.Object) */ + @Override public Iterator getCalledNodes(Statement call) { switch (call.getKind()) { case NORMAL: Filter f = new Filter() { + @Override public boolean accepts(Object o) { Statement s = (Statement) o; return isEntry(s); @@ -112,6 +117,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getEntriesForProcedure(java.lang.Object) */ + @Override public Statement[] getEntriesForProcedure(PDG procedure) { Statement[] normal = procedure.getParamCalleeStatements(); Statement[] result = new Statement[normal.length + 1]; @@ -123,6 +129,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getExitsForProcedure(java.lang.Object) */ + @Override public Statement[] getExitsForProcedure(PDG procedure) { Statement[] normal = procedure.getReturnStatements(); Statement[] result = new Statement[normal.length + 1]; @@ -134,6 +141,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlock(java.lang.Object, int) */ + @Override public Statement getLocalBlock(PDG procedure, int i) { return procedure.getNode(i); } @@ -141,6 +149,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getLocalBlockNumber(java.lang.Object) */ + @Override public int getLocalBlockNumber(Statement n) { PDG pdg = getProcOf(n); return pdg.getNumber(n); @@ -149,6 +158,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getNormalSuccessors(java.lang.Object) */ + @Override public Iterator getNormalSuccessors(Statement call) { if (!backward) { return EmptyIterator.instance(); @@ -161,6 +171,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getNumberOfBlocks(java.lang.Object) */ + @Override public int getNumberOfBlocks(PDG procedure) { Assertions.UNREACHABLE(); return 0; @@ -169,6 +180,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getProcOf(java.lang.Object) */ + @Override public PDG getProcOf(Statement n) { CGNode node = n.getNode(); PDG result = sdg.getPDG(node); @@ -181,6 +193,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#getReturnSites(java.lang.Object) */ + @Override public Iterator getReturnSites(Statement call, PDG callee) { switch (call.getKind()) { case PARAM_CALLER: { @@ -210,6 +223,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.dataflow.IFDS.ISupergraph#isCall(java.lang.Object) */ + @Override public boolean isCall(Statement n) { switch (n.getKind()) { case EXC_RET_CALLEE: @@ -242,6 +256,7 @@ class SDGSupergraph implements ISupergraph { } } + @Override public boolean isEntry(Statement n) { switch (n.getKind()) { case PARAM_CALLEE: @@ -267,6 +282,7 @@ class SDGSupergraph implements ISupergraph { } } + @Override public boolean isExit(Statement n) { switch (n.getKind()) { case PARAM_CALLEE: @@ -293,6 +309,7 @@ class SDGSupergraph implements ISupergraph { } } + @Override public boolean isReturn(Statement n) { switch (n.getKind()) { case EXC_RET_CALLER: @@ -318,98 +335,119 @@ class SDGSupergraph implements ISupergraph { } } + @Override public void removeNodeAndEdges(Statement N) { Assertions.UNREACHABLE(); } + @Override public void addNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(Statement N) { return sdg.containsNode(N); } + @Override public int getNumberOfNodes() { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator iterator() { return sdg.iterator(); } + @Override public void removeNode(Statement n) { Assertions.UNREACHABLE(); } + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(Statement N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getPredNodes(Statement N) { return sdg.getPredNodes(N); } + @Override public int getSuccNodeCount(Statement N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getSuccNodes(Statement N) { return sdg.getSuccNodes(N); } + @Override public boolean hasEdge(Statement src, Statement dst) { return sdg.hasEdge(src, dst); } + @Override public void removeAllIncidentEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Statement node) { Assertions.UNREACHABLE(); } + @Override public int getMaxNumber() { return sdg.getMaxNumber(); } + @Override public Statement getNode(int number) { return sdg.getNode(number); } + @Override public int getNumber(Statement N) { return sdg.getNumber(N); } + @Override public Iterator iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(Statement node) { return sdg.getPredNodeNumbers(node); } @@ -417,6 +455,7 @@ class SDGSupergraph implements ISupergraph { /* * @see com.ibm.wala.util.graph.NumberedEdgeManager#getSuccNodeNumbers(java.lang.Object) */ + @Override public IntSet getSuccNodeNumbers(Statement node) { return sdg.getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java index 104fcd28d..e480ebc83 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/SliceFunctions.java @@ -21,10 +21,12 @@ import com.ibm.wala.util.debug.Assertions; */ public class SliceFunctions implements IPartiallyBalancedFlowFunctions { + @Override public IUnaryFlowFunction getCallFlowFunction(Statement src, Statement dest, Statement ret) { return ReachabilityFunctions.createReachabilityFunctions().getCallFlowFunction(src, dest, ret); } + @Override public IUnaryFlowFunction getCallNoneToReturnFlowFunction(Statement src, Statement dest) { if (src == null) { throw new IllegalArgumentException("src is null"); @@ -61,14 +63,17 @@ public class SliceFunctions implements IPartiallyBalancedFlowFunctions getDomain() { // a dummy return new UnorderedDomain(); @@ -263,6 +264,7 @@ public class Slicer { /* * @see com.ibm.wala.dataflow.IFDS.TabulationProblem#getFunctionMap() */ + @Override public IPartiallyBalancedFlowFunctions getFunctionMap() { return f; } @@ -270,6 +272,7 @@ public class Slicer { /* * @see com.ibm.wala.dataflow.IFDS.TabulationProblem#getMergeFunction() */ + @Override public IMergeFunction getMergeFunction() { return null; } @@ -277,10 +280,12 @@ public class Slicer { /* * @see com.ibm.wala.dataflow.IFDS.TabulationProblem#getSupergraph() */ + @Override public ISupergraph getSupergraph() { return supergraph; } + @Override public Collection> initialSeeds() { if (backward) { Collection> result = HashSetFactory.make(); @@ -299,6 +304,7 @@ public class Slicer { } } + @Override public Statement getFakeEntry(Statement node) { return backward ? new MethodExitStatement(node.getNode()) : new MethodEntryStatement(node.getNode()); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java index 574689098..cbfe20899 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/slicer/thin/CISDG.java @@ -71,16 +71,19 @@ public class CISDG implements ISDG { invRef = MapUtil.inverseMap(ref); } + @Override public void addEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); noHeap.addEdge(src, dst); } + @Override public void addNode(Statement n) { Assertions.UNREACHABLE(); noHeap.addNode(n); } + @Override public boolean containsNode(Statement N) { return noHeap.containsNode(N); } @@ -91,42 +94,51 @@ public class CISDG implements ISDG { return noHeap.equals(obj); } + @Override public ControlDependenceOptions getCOptions() { Assertions.UNREACHABLE(); return noHeap.getCOptions(); } + @Override public int getMaxNumber() { return noHeap.getMaxNumber(); } + @Override public Statement getNode(int number) { Assertions.UNREACHABLE(); return noHeap.getNode(number); } + @Override public int getNumber(Statement N) { return noHeap.getNumber(N); } + @Override public int getNumberOfNodes() { return noHeap.getNumberOfNodes(); } + @Override public PDG getPDG(CGNode node) { Assertions.UNREACHABLE(); return noHeap.getPDG(node); } + @Override public int getPredNodeCount(Statement N) { return IteratorUtil.count(getPredNodes(N)); } + @Override public IntSet getPredNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return noHeap.getPredNodeNumbers(node); } + @Override public Iterator getPredNodes(Statement N) { if (DEBUG) { System.err.println("getPredNodes " + N); @@ -145,15 +157,18 @@ public class CISDG implements ISDG { } } + @Override public int getSuccNodeCount(Statement N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public IntSet getSuccNodeNumbers(Statement node) { Assertions.UNREACHABLE(); return noHeap.getSuccNodeNumbers(node); } + @Override public Iterator getSuccNodes(Statement N) { if (DEBUG) { System.err.println("getSuccNodes " + N); @@ -172,6 +187,7 @@ public class CISDG implements ISDG { } } + @Override public boolean hasEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); return noHeap.hasEdge(src, dst); @@ -184,45 +200,54 @@ public class CISDG implements ISDG { } + @Override public Iterator iterateLazyNodes() { Assertions.UNREACHABLE(); return noHeap.iterateLazyNodes(); } + @Override public Iterator iterator() { return noHeap.iterator(); } + @Override public Iterator iterateNodes(IntSet s) { Assertions.UNREACHABLE(); return noHeap.iterateNodes(s); } + @Override public void removeAllIncidentEdges(Statement node) { Assertions.UNREACHABLE(); noHeap.removeAllIncidentEdges(node); } + @Override public void removeEdge(Statement src, Statement dst) { Assertions.UNREACHABLE(); noHeap.removeEdge(src, dst); } + @Override public void removeIncomingEdges(Statement node) { Assertions.UNREACHABLE(); noHeap.removeIncomingEdges(node); } + @Override public void removeNode(Statement n) { Assertions.UNREACHABLE(); noHeap.removeNode(n); } + @Override public void removeNodeAndEdges(Statement N) { Assertions.UNREACHABLE(); noHeap.removeNodeAndEdges(N); } + @Override public void removeOutgoingEdges(Statement node) { Assertions.UNREACHABLE(); noHeap.removeOutgoingEdges(node); @@ -234,6 +259,7 @@ public class CISDG implements ISDG { return noHeap.toString(); } + @Override public IClassHierarchy getClassHierarchy() { return noHeap.getClassHierarchy(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java index 2924aab92..f679c07b5 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassClassTargetSelector.java @@ -66,6 +66,7 @@ public class BypassClassTargetSelector implements ClassTargetSelector { * @see com.ibm.wala.ipa.callgraph.ClassTargetSelector#getAllocatedTarget(com.ibm.wala.ipa.callgraph.CGNode, * com.ibm.wala.classLoader.NewSiteReference) */ + @Override public IClass getAllocatedTarget(CGNode caller, NewSiteReference site) { if (site == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java index 1cd466b76..21d6b0a9f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassMethodTargetSelector.java @@ -100,6 +100,7 @@ public class BypassMethodTargetSelector implements MethodTargetSelector { * * @throws IllegalArgumentException if site is null */ + @Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass dispatchType) { if (site == null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java index 2b6d121c8..67f4ee0cd 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClass.java @@ -73,6 +73,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getSuperclass() */ + @Override public IClass getSuperclass() { if (realType.isInterface()) { IClass result = loader.lookupClass(TypeReference.JavaLangObject.getName()); @@ -88,6 +89,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInterfaces() */ + @Override public Collection getAllImplementedInterfaces() { Collection realIfaces = realType.getAllImplementedInterfaces(); if (realType.isInterface()) { @@ -102,6 +104,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IMethod getMethod(Selector selector) { return realType.getMethod(selector); } @@ -109,6 +112,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ + @Override public IField getField(Atom name) { return realType.getField(name); } @@ -124,6 +128,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ + @Override public IMethod getClassInitializer() { return null; } @@ -131,6 +136,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ + @Override public Collection getDeclaredMethods() { return realType.getDeclaredMethods(); } @@ -138,6 +144,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredInstanceFields() */ + @Override public Collection getDeclaredInstanceFields() { return realType.getDeclaredInstanceFields(); } @@ -145,6 +152,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ + @Override public Collection getDeclaredStaticFields() { return realType.getDeclaredStaticFields(); } @@ -185,6 +193,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getModifiers() */ + @Override public int getModifiers() throws UnimplementedError { Assertions.UNREACHABLE(); return 0; @@ -193,6 +202,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#isReferenceType() */ + @Override public boolean isReferenceType() { return getReference().isReferenceType(); } @@ -200,6 +210,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getDirectInterfaces() */ + @Override public Collection getDirectInterfaces() throws UnimplementedError { Assertions.UNREACHABLE(); return null; @@ -208,6 +219,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllInstanceFields() */ + @Override public Collection getAllInstanceFields() { return realType.getAllInstanceFields(); } @@ -215,6 +227,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ + @Override public Collection getAllStaticFields(){ return realType.getAllStaticFields(); } @@ -222,6 +235,7 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllMethods() */ + @Override public Collection getAllMethods() { return realType.getAllMethods(); } @@ -229,14 +243,17 @@ public class BypassSyntheticClass extends SyntheticClass { /* * @see com.ibm.wala.classLoader.IClass#getAllFields() */ + @Override public Collection getAllFields() { return realType.getAllFields(); } + @Override public boolean isPublic() { return realType.isPublic(); } + @Override public boolean isPrivate() { return realType.isPrivate(); } @@ -246,6 +263,7 @@ public class BypassSyntheticClass extends SyntheticClass { return null; } + @Override public Collection getAnnotations() { return Collections.emptySet(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java index 73b4ebab3..10a9918e7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/BypassSyntheticClassLoader.java @@ -91,6 +91,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { return me.getName().toString(); } + @Override public IClass lookupClass(TypeName className) { IClass pc = parent.lookupClass(className); if (pc == null) { @@ -112,6 +113,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * Return the ClassLoaderReference for this class loader. */ + @Override public ClassLoaderReference getReference() { return me; } @@ -119,6 +121,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @return an Iterator of all classes loaded by this loader */ + @Override public Iterator iterateAllClasses() { return syntheticClasses.values().iterator(); } @@ -126,6 +129,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @return the number of classes in scope to be loaded by this loader */ + @Override public int getNumberOfClasses() { return syntheticClasses.size(); } @@ -133,6 +137,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @return the unique name that identifies this class loader. */ + @Override public Atom getName() { return me.getName(); } @@ -141,6 +146,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { * @return the unique name that identifies the programming language * from which this class loader loads code. */ + @Override public Language getLanguage() { return Language.JAVA; } @@ -148,6 +154,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getNumberOfMethods() */ + @Override public int getNumberOfMethods() { // TODO Auto-generated method stub return 0; @@ -156,6 +163,7 @@ public class BypassSyntheticClassLoader implements IClassLoader { /* * @see com.ibm.wala.classLoader.IClassLoader#getSourceFileName(com.ibm.wala.classLoader.IClass) */ + @Override public String getSourceFileName(IClass klass) { return null; } @@ -163,16 +171,19 @@ public class BypassSyntheticClassLoader implements IClassLoader { /** * @see com.ibm.wala.classLoader.IClassLoader#getParent() */ + @Override public IClassLoader getParent() { return parent; } + @Override public void init(List modules) throws IOException { } /* * @see com.ibm.wala.classLoader.IClassLoader#removeAll(java.util.Collection) */ + @Override public void removeAll(Collection toRemove) { if (toRemove == null) { throw new IllegalArgumentException("toRemove is null"); @@ -183,18 +194,22 @@ public class BypassSyntheticClassLoader implements IClassLoader { } } + @Override public InputStream getSource(IClass klass) { return null; } + @Override public SSAInstructionFactory getInstructionFactory() { return getLanguage().instructionFactory(); } + @Override public InputStream getSource(IMethod method, int offset) { return null; } + @Override public String getSourceFileName(IMethod method, int offset) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java index a67114b8d..e339127c4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/summaries/SyntheticIRFactory.java @@ -26,6 +26,7 @@ public class SyntheticIRFactory implements IRFactory { return method.makeControlFlowGraph(method.getStatements()); } + @Override public IR makeIR(SyntheticMethod method, Context C, SSAOptions options) { if (method == null) { throw new IllegalArgumentException("method is null"); @@ -33,6 +34,7 @@ public class SyntheticIRFactory implements IRFactory { return method.makeIR(C, options); } + @Override public boolean contextIsIrrelevant(SyntheticMethod method) { // conservatively return false .. the context might matter. return false; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java index cd9fa478f..5d3b7abe2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/CompoundPiPolicy.java @@ -46,6 +46,7 @@ public class CompoundPiPolicy implements SSAPiNodePolicy { /* * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAConditionalBranchInstruction, com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAConditionalBranchInstruction cond, SSAInstruction def1, SSAInstruction def2, SymbolTable symbolTable) { Pair result = p1.getPi(cond, def1, def2, symbolTable); @@ -59,6 +60,7 @@ public class CompoundPiPolicy implements SSAPiNodePolicy { /* * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAAbstractInvokeInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAAbstractInvokeInstruction call, SymbolTable symbolTable) { Pair result = p1.getPi(call, symbolTable); if (result != null) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java index 84cecfefd..f6f3c4c28 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/ConstantValue.java @@ -44,6 +44,7 @@ public class ConstantValue implements Value { /* * @see com.ibm.wala.ssa.Value#isStringConstant() */ + @Override public boolean isStringConstant() { return constant instanceof String; } @@ -73,6 +74,7 @@ public class ConstantValue implements Value { /** * @return true iff this constant is "null" */ + @Override public boolean isNullConstant() { return (constant == null); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java index 330ad57ba..8b5495aff 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefUse.java @@ -163,14 +163,17 @@ public class DefUse { it = uses.intIterator(); } + @Override public boolean hasNext() { return it.hasNext(); } + @Override public SSAInstruction next() { return allInstructions.get(it.next()); } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java index 6393f59c5..e7f6b640b 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/DefaultIRFactory.java @@ -53,6 +53,7 @@ public class DefaultIRFactory implements IRFactory { * @see com.ibm.wala.ssa.IRFactory#makeIR(com.ibm.wala.classLoader.IMethod, com.ibm.wala.ipa.callgraph.Context, * com.ibm.wala.ipa.cha.IClassHierarchy, com.ibm.wala.ssa.SSAOptions, com.ibm.wala.util.warnings.WarningSet) */ + @Override public IR makeIR(IMethod method, Context c, SSAOptions options) throws IllegalArgumentException { if (method == null) { throw new IllegalArgumentException("method cannot be null"); @@ -70,6 +71,7 @@ public class DefaultIRFactory implements IRFactory { /** * Is the {@link Context} irrelevant as to structure of the {@link IR} for a particular {@link IMethod}? */ + @Override public boolean contextIsIrrelevant(IMethod method) { if (method == null) { throw new IllegalArgumentException("null method"); diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java index df8480222..da9bbd008 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/IR.java @@ -313,10 +313,12 @@ public abstract class IR { } } + @Override public boolean hasNext() { return currentBlockIndex != -1; } + @Override public SSAInstruction next() { SSAInstruction result = currentBlockIterator.next(); if (!currentBlockIterator.hasNext()) { @@ -325,6 +327,7 @@ public abstract class IR { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -405,10 +408,12 @@ public abstract class IR { } } + @Override public boolean hasNext() { return currentBlockIndex != -1; } + @Override public SSAInstruction next() { ExceptionHandlerBasicBlock bb = (ExceptionHandlerBasicBlock) cfg.getNode(currentBlockIndex); SSAInstruction result = bb.getCatchInstruction(); @@ -416,6 +421,7 @@ public abstract class IR { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -475,14 +481,17 @@ public abstract class IR { nextIndex = -1; } + @Override public boolean hasNext() { return nextIndex != -1; } + @Override public void remove() { Assertions.UNREACHABLE(); } + @Override public SSAInstruction next() { SSAInstruction result = instructions[nextIndex]; advanceIndex(nextIndex + 1); @@ -591,16 +600,19 @@ public abstract class IR { ; } + @Override public boolean hasNext() { return i <= limit; } + @Override public CallSiteReference next() { int index = callSiteMapping.getRelated(i).max(); advance(); return ((SSAAbstractInvokeInstruction) instructions[index]).getCallSite(); } + @Override public void remove() { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java index 4c6aee79a..57a583b61 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/ISSABasicBlock.java @@ -24,16 +24,19 @@ public interface ISSABasicBlock extends IBasicBlock { /** * Is this block a catch block */ + @Override public boolean isCatchBlock(); /** * Does this block represent the unique exit from a {@link ControlFlowGraph}? */ + @Override public boolean isExitBlock(); /** * Does this block represent the unique entry to a {@link ControlFlowGraph} */ + @Override public boolean isEntryBlock(); /** diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java index 959e87abe..1f7b35eec 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/InstanceOfPiPolicy.java @@ -41,6 +41,7 @@ public class InstanceOfPiPolicy implements SSAPiNodePolicy { * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAConditionalBranchInstruction, com.ibm.wala.ssa.SSAInstruction, * com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAConditionalBranchInstruction cond, SSAInstruction def1, SSAInstruction def2, SymbolTable symbolTable) { if (def1 instanceof SSAInstanceofInstruction) { @@ -69,6 +70,7 @@ public class InstanceOfPiPolicy implements SSAPiNodePolicy { /* * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAAbstractInvokeInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAAbstractInvokeInstruction call, SymbolTable symbolTable) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java index 38b570f17..60e1eca0c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/NullTestPiPolicy.java @@ -35,6 +35,7 @@ public class NullTestPiPolicy implements SSAPiNodePolicy { * @see com.ibm.wala.ssa.SSAPiNodePolicy#getPi(com.ibm.wala.ssa.SSAConditionalBranchInstruction, * com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SSAInstruction, com.ibm.wala.ssa.SymbolTable) */ + @Override public Pair getPi(SSAConditionalBranchInstruction cond, SSAInstruction def1, SSAInstruction def2, SymbolTable symbolTable) { if (symbolTable == null) { @@ -52,6 +53,7 @@ public class NullTestPiPolicy implements SSAPiNodePolicy { return null; } + @Override public Pair getPi(SSAAbstractInvokeInstruction call, SymbolTable symbolTable) { return null; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java index 2ea647585..72dc3b106 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/PhiValue.java @@ -44,6 +44,7 @@ class PhiValue implements Value { /* * @see com.ibm.wala.ssa.Value#isStringConstant() */ + @Override public boolean isStringConstant() { return false; } @@ -51,6 +52,7 @@ class PhiValue implements Value { /* * @see com.ibm.wala.ssa.Value#isNullConstant() */ + @Override public boolean isNullConstant() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java index eee4eda48..409ea9d54 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSABuilder.java @@ -131,6 +131,7 @@ public class SSABuilder extends AbstractIntStackMachine { this.shrikeCFG = shrikeCFG; } + @Override public int meetStack(int slot, int[] rhs, BasicBlock bb) { assert bb != null : "null basic block"; @@ -171,6 +172,7 @@ public class SSABuilder extends AbstractIntStackMachine { /** * @see com.ibm.wala.analysis.stackMachine.AbstractIntStackMachine.Meeter#meetLocal(int, int[], BasicBlock) */ + @Override public int meetLocal(int n, int[] rhs, BasicBlock bb) { if (allTheSame(rhs)) { for (int i = 0; i < rhs.length; i++) { @@ -232,6 +234,7 @@ public class SSABuilder extends AbstractIntStackMachine { /** * @see com.ibm.wala.analysis.stackMachine.AbstractIntStackMachine.Meeter#meetStackAtCatchBlock(BasicBlock) */ + @Override public int meetStackAtCatchBlock(BasicBlock bb) { int bbNumber = shrikeCFG.getNumber(bb); SSACFG.ExceptionHandlerBasicBlock newBB = (SSACFG.ExceptionHandlerBasicBlock) cfg.getNode(bbNumber); @@ -967,6 +970,7 @@ public class SSABuilder extends AbstractIntStackMachine { * @param index - index into IR instruction array * @param vn - value number */ + @Override public String[] getLocalNames(int index, int vn) { try { if (!shrikeCFG.getMethod().hasLocalVariableTable()) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java index 62ae97878..633a318c4 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSACFG.java @@ -206,6 +206,7 @@ public class SSACFG implements ControlFlowGraph * Get the basic block an instruction belongs to. Note: the instruction2Block array is filled in lazily. During initialization, * the mapping is set up only for the first instruction of each basic block. */ + @Override public SSACFG.BasicBlock getBlockForInstruction(int instructionIndex) { IBasicBlock N = delegate.getBlockForInstruction(instructionIndex); int number = delegate.getNumber(N); @@ -219,6 +220,7 @@ public class SSACFG implements ControlFlowGraph * * @return an array containing the SSA instructions. */ + @Override public SSAInstruction[] getInstructions() { return instructions; } @@ -272,6 +274,7 @@ public class SSACFG implements ControlFlowGraph this.number = number; } + @Override public int getNumber() { return number; } @@ -279,6 +282,7 @@ public class SSACFG implements ControlFlowGraph /** * Method getFirstInstructionIndex. */ + @Override public int getFirstInstructionIndex() { IBasicBlock B = delegate.getNode(number); return B.getFirstInstructionIndex(); @@ -287,10 +291,12 @@ public class SSACFG implements ControlFlowGraph /** * Is this block marked as a catch block? */ + @Override public boolean isCatchBlock() { return delegate.getCatchBlocks().get(getNumber()); } + @Override public int getLastInstructionIndex() { IBasicBlock B = delegate.getNode(number); return B.getLastInstructionIndex(); @@ -299,6 +305,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.ssa.ISSABasicBlock#iteratePhis() */ + @Override public Iterator iteratePhis() { compressPhis(); if (stackSlotPhis == null) { @@ -459,6 +466,7 @@ public class SSACFG implements ControlFlowGraph blockPiInstructions.add(pi); } + @Override public Iterator iteratePis() { return blockPiInstructions.iterator(); } @@ -474,10 +482,12 @@ public class SSACFG implements ControlFlowGraph return new Iterator() { private int start = dummy; + @Override public boolean hasNext() { return (start <= end); } + @Override public SSAInstruction next() { SSAInstruction i = instructions[start]; start++; @@ -487,6 +497,7 @@ public class SSACFG implements ControlFlowGraph return i; } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -563,6 +574,7 @@ public class SSACFG implements ControlFlowGraph return result; } + @Override public Iterator iterator() { return getAllInstructions().iterator(); } @@ -577,6 +589,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.INodeWithNumber#getGraphNodeId() */ + @Override public int getGraphNodeId() { return number; } @@ -584,6 +597,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.INodeWithNumber#setGraphNodeId(int) */ + @Override public void setGraphNodeId(int number) { // TODO Auto-generated method stub } @@ -619,6 +633,7 @@ public class SSACFG implements ControlFlowGraph } } + @Override public IMethod getMethod() { return method; } @@ -631,6 +646,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.IBasicBlock#isExitBlock() */ + @Override public boolean isExitBlock() { return this == SSACFG.this.exit(); } @@ -638,10 +654,12 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.IBasicBlock#isEntryBlock() */ + @Override public boolean isEntryBlock() { return this == SSACFG.this.entry(); } + @Override public SSAInstruction getLastInstruction() { return instructions[getLastInstructionIndex()]; } @@ -651,6 +669,7 @@ public class SSACFG implements ControlFlowGraph * * @see com.ibm.wala.ssa.ISSABasicBlock#getCaughtExceptionTypes() */ + @Override public Iterator getCaughtExceptionTypes() { return EmptyIterator.instance(); } @@ -689,14 +708,17 @@ public class SSACFG implements ControlFlowGraph return new Iterator() { int next = 0; + @Override public boolean hasNext() { return next < nExceptionTypes; } + @Override public TypeReference next() { return exceptionTypes[next++]; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -752,6 +774,7 @@ public class SSACFG implements ControlFlowGraph return s.toString(); } + @Override public BitVector getCatchBlocks() { return delegate.getCatchBlocks(); } @@ -768,6 +791,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#entry() */ + @Override public SSACFG.BasicBlock entry() { return basicBlocks[0]; } @@ -775,6 +799,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#exit() */ + @Override public SSACFG.BasicBlock exit() { return exit; } @@ -782,6 +807,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("N == null"); @@ -792,6 +818,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#getNode(int) */ + @Override public BasicBlock getNode(int number) { return basicBlocks[number]; } @@ -799,6 +826,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#getMaxNumber() */ + @Override public int getMaxNumber() { return basicBlocks.length - 1; } @@ -806,6 +834,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#iterateNodes() */ + @Override public Iterator iterator() { ArrayList list = new ArrayList(); for (BasicBlock b : basicBlocks) { @@ -817,6 +846,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } @@ -824,6 +854,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getPredNodes(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -831,16 +862,19 @@ public class SSACFG implements ControlFlowGraph IBasicBlock n = delegate.getNode(b.getNumber()); final Iterator i = delegate.getPredNodes(n); return new Iterator() { + @Override public boolean hasNext() { return i.hasNext(); } + @Override public BasicBlock next() { IBasicBlock n = (IBasicBlock) i.next(); int number = n.getNumber(); return basicBlocks[number]; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -850,6 +884,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -861,6 +896,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getSuccNodes(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -868,16 +904,19 @@ public class SSACFG implements ControlFlowGraph IBasicBlock n = delegate.getNode(b.getNumber()); final Iterator i = delegate.getSuccNodes(n); return new Iterator() { + @Override public boolean hasNext() { return i.hasNext(); } + @Override public ISSABasicBlock next() { IBasicBlock n = (IBasicBlock) i.next(); int number = n.getNumber(); return basicBlocks[number]; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -887,6 +926,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -898,14 +938,17 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedGraph#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(ISSABasicBlock n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void addEdge(ISSABasicBlock src, ISSABasicBlock dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(ISSABasicBlock src, ISSABasicBlock dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -913,6 +956,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(ISSABasicBlock node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -920,6 +964,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(ISSABasicBlock N) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -927,6 +972,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(ISSABasicBlock n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -934,6 +980,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getProgramCounter(int) */ + @Override public int getProgramCounter(int index) { // delegate to incoming cfg. return delegate.getProgramCounter(index); @@ -942,6 +989,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.Graph#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(ISSABasicBlock N) { if (N instanceof BasicBlock) { return basicBlocks[getNumber(N)] == N; @@ -953,6 +1001,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getMethod() */ + @Override public IMethod getMethod() { return method; } @@ -960,6 +1009,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public List getExceptionalSuccessors(final ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -977,12 +1027,14 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getExceptionalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public Collection getExceptionalPredecessors(ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); } IBasicBlock n = delegate.getNode(b.getNumber()); Function, ISSABasicBlock> f = new Function, ISSABasicBlock>() { + @Override public ISSABasicBlock apply(IBasicBlock object) { return basicBlocks[delegate.getNumber(object)]; } @@ -1030,6 +1082,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public Collection getNormalSuccessors(ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -1047,6 +1100,7 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.cfg.ControlFlowGraph#getNormalSuccessors(com.ibm.wala.cfg.IBasicBlock) */ + @Override public Collection getNormalPredecessors(ISSABasicBlock b) { if (b == null) { throw new IllegalArgumentException("b is null"); @@ -1064,22 +1118,27 @@ public class SSACFG implements ControlFlowGraph /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } + @Override public void removeIncomingEdges(ISSABasicBlock node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(ISSABasicBlock node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public boolean hasEdge(ISSABasicBlock src, ISSABasicBlock dst) throws UnimplementedError { return getSuccNodeNumbers(src).contains(getNumber(dst)); } + @Override public IntSet getSuccNodeNumbers(ISSABasicBlock b) throws IllegalArgumentException { if (b == null) { throw new IllegalArgumentException("b == null"); @@ -1088,6 +1147,7 @@ public class SSACFG implements ControlFlowGraph return delegate.getSuccNodeNumbers(n); } + @Override public IntSet getPredNodeNumbers(ISSABasicBlock node) throws UnimplementedError { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java index 9f58a5802..23ae24a8e 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSAInstruction.java @@ -116,72 +116,95 @@ public abstract class SSAInstruction { * A base visitor implementation that does nothing. */ public static abstract class Visitor implements IVisitor { + @Override public void visitGoto(SSAGotoInstruction instruction) { } + @Override public void visitArrayLoad(SSAArrayLoadInstruction instruction) { } + @Override public void visitArrayStore(SSAArrayStoreInstruction instruction) { } + @Override public void visitBinaryOp(SSABinaryOpInstruction instruction) { } + @Override public void visitUnaryOp(SSAUnaryOpInstruction instruction) { } + @Override public void visitConversion(SSAConversionInstruction instruction) { } + @Override public void visitComparison(SSAComparisonInstruction instruction) { } + @Override public void visitConditionalBranch(SSAConditionalBranchInstruction instruction) { } + @Override public void visitSwitch(SSASwitchInstruction instruction) { } + @Override public void visitReturn(SSAReturnInstruction instruction) { } + @Override public void visitGet(SSAGetInstruction instruction) { } + @Override public void visitPut(SSAPutInstruction instruction) { } + @Override public void visitInvoke(SSAInvokeInstruction instruction) { } + @Override public void visitNew(SSANewInstruction instruction) { } + @Override public void visitArrayLength(SSAArrayLengthInstruction instruction) { } + @Override public void visitThrow(SSAThrowInstruction instruction) { } + @Override public void visitMonitor(SSAMonitorInstruction instruction) { } + @Override public void visitCheckCast(SSACheckCastInstruction instruction) { } + @Override public void visitInstanceof(SSAInstanceofInstruction instruction) { } + @Override public void visitPhi(SSAPhiInstruction instruction) { } + @Override public void visitPi(SSAPiInstruction instruction) { } + @Override public void visitGetCaughtException(SSAGetCaughtExceptionInstruction instruction) { } + @Override public void visitLoadMetadata(SSALoadMetadataInstruction instruction) { } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java index fa679f0f3..139909d8f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/SSASwitchInstruction.java @@ -112,10 +112,12 @@ public class SSASwitchInstruction extends SSAInstruction { return new IntIterator() { private int i = 0; + @Override public boolean hasNext() { return i < casesAndLabels.length; } + @Override public int next() { int v = casesAndLabels[i]; i += 2; diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java index c05af11d0..f28435d20 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/ShrikeIndirectionData.java @@ -68,6 +68,7 @@ public class ShrikeIndirectionData implements SSAIndirectionData(2); @@ -92,6 +95,7 @@ public class ShrikeIndirectionData implements SSAIndirectionData(2); @@ -100,6 +104,7 @@ public class ShrikeIndirectionData implements SSAIndirectionData getNames() { HashSet result = new HashSet(); for (int i = 0; i < uses.length; i++) { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java index f702434cc..0766b4551 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ssa/analysis/ExplodedControlFlowGraph.java @@ -89,14 +89,17 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getExceptionalPredecessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -133,6 +138,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getExceptionalSuccessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -155,14 +161,17 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getNormalPredecessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -191,6 +200,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getNormalSuccessors(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -220,38 +230,47 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iterator() { return allNodes.iterator(); } + @Override public void removeNode(IExplodedBasicBlock n) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void addEdge(IExplodedBasicBlock src, IExplodedBasicBlock dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public int getPredNodeCount(IExplodedBasicBlock bb) throws IllegalArgumentException { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; if (eb == null) { @@ -274,6 +293,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getPredNodes(IExplodedBasicBlock bb) throws IllegalArgumentException { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; if (eb == null) { @@ -310,6 +330,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getSuccNodes(IExplodedBasicBlock bb) { ExplodedBasicBlock eb = (ExplodedBasicBlock) bb; assert eb != null; @@ -350,32 +372,39 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iterateNodes(IntSet s) throws UnimplementedError { Assertions.UNREACHABLE(); return null; } + @Override public IntSet getPredNodeNumbers(IExplodedBasicBlock node) { MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); for (Iterator it = getPredNodes(node); it.hasNext();) { @@ -406,6 +438,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph getCaughtExceptionTypes() { if (original instanceof ExceptionHandlerBasicBlock) { ExceptionHandlerBasicBlock eb = (ExceptionHandlerBasicBlock) original; @@ -442,18 +476,22 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iterator() { if (isEntryBlock() || isExitBlock() || getInstruction() == null) { return EmptyIterator.instance(); @@ -532,6 +577,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iteratePhis() { if (isEntryBlock() || isExitBlock() || instructionIndex != original.getFirstInstructionIndex()) { return EmptyIterator.instance(); @@ -556,6 +604,7 @@ public class ExplodedControlFlowGraph implements ControlFlowGraph iteratePis() { if (isEntryBlock() || isExitBlock() || instructionIndex != original.getLastInstructionIndex()) { return EmptyIterator.instance(); diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java b/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java index a6546f4c4..8c6e10f6c 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/scope/JUnitEntryPoints.java @@ -69,6 +69,7 @@ public class JUnitEntryPoints { } } return new Iterable() { + @Override public Iterator iterator() { return result.iterator(); } @@ -128,6 +129,7 @@ public class JUnitEntryPoints { e.printStackTrace(); } return new Iterable() { + @Override public Iterator iterator() { return entryPts.iterator(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java b/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java index 0652e5787..cdd80d2d2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java +++ b/com.ibm.wala.core/src/com/ibm/wala/util/warnings/Warning.java @@ -46,6 +46,7 @@ public abstract class Warning implements Comparable { * * @throws ClassCastException if o is not a Warning */ + @Override public int compareTo(Object o) throws ClassCastException { if (o == null) { return -1; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java b/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java index d4486a26a..a18c95572 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/PDFViewUtil.java @@ -80,6 +80,7 @@ public class PDFViewUtil { labelMap.put(bb, getNodeLabel(ir, bb)); } NodeDecorator labels = new NodeDecorator() { + @Override public String getLabel(Object o) { return labelMap.get(o); } @@ -101,6 +102,7 @@ public class PDFViewUtil { this.B = B; } + @Override public String getLabel(Object o) throws WalaException { return A.getLabel(o) + B.getLabel(o); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java index cb3c01ef6..726be8c15 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/CgPanel.java @@ -45,6 +45,7 @@ public class CgPanel extends JSplitPane{ this.setRightComponent(irViewer.getComponent()); tree.addTreeSelectionListener(new TreeSelectionListener() { + @Override public void valueChanged(TreeSelectionEvent e) { TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); if (null == newLeadSelectionPath){ @@ -76,6 +77,7 @@ public class CgPanel extends JSplitPane{ tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override public void treeExpanded(TreeExpansionEvent event) { TreePath path = event.getPath(); if (path == null) { @@ -85,6 +87,7 @@ public class CgPanel extends JSplitPane{ expandNode(lastNode); } + @Override public void treeCollapsed(TreeExpansionEvent event) { } diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java index 6a39cb66e..07c8e02ba 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/ChaPanel.java @@ -44,6 +44,7 @@ public class ChaPanel extends JSplitPane { this.setRightComponent(methodList); tree.addTreeSelectionListener(new TreeSelectionListener(){ + @Override public void valueChanged(TreeSelectionEvent e) { TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); if (null == newLeadSelectionPath){ @@ -69,6 +70,7 @@ public class ChaPanel extends JSplitPane { tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override public void treeExpanded(TreeExpansionEvent event) { TreePath path = event.getPath(); if (path == null) { @@ -78,6 +80,7 @@ public class ChaPanel extends JSplitPane { expandNode(lastNode); } + @Override public void treeCollapsed(TreeExpansionEvent event) { } diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java index 831f17f72..e4bc0b061 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/DualTreeCellRenderer.java @@ -47,6 +47,7 @@ class DualTreeCellRenderer implements TreeCellRenderer { pkTreeCellRenderer.setLeafIcon(createImageIcon("images/pk_leaf.png")); } + @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { TreeCellRenderer delegate = getTreeCellRenderer(value); diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java index c085c3c74..46a5fd1ce 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrAndSourceViewer.java @@ -45,6 +45,7 @@ public class IrAndSourceViewer { irViewer.addSelectedPcListner(new SelectedPcListner(){ + @Override public void valueChanged(int pc) { IMethod method = ir.getMethod(); int sourceLineNumber = IrViewer.NA; diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java index acc22daf5..14871d72f 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/IrViewer.java @@ -58,6 +58,7 @@ public class IrViewer extends JPanel{ irLines.addListSelectionListener(new ListSelectionListener() { + @Override public void valueChanged(ListSelectionEvent e) { int index = irLines.getSelectedIndex(); Integer pc = lineToPc.get(index); diff --git a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java index 7c1e4ec8d..c192a5775 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java +++ b/com.ibm.wala.core/src/com/ibm/wala/viz/viewer/PaPanel.java @@ -102,6 +102,7 @@ public class PaPanel extends JSplitPane { heapTree.addTreeExpansionListener(new TreeExpansionListener() { + @Override public void treeExpanded(TreeExpansionEvent event) { TreePath path = event.getPath(); if (path == null) { @@ -111,12 +112,14 @@ public class PaPanel extends JSplitPane { expandNodeRec(lastNode, 2); } + @Override public void treeCollapsed(TreeExpansionEvent event) { } }); heapTree.addTreeSelectionListener(new TreeSelectionListener() { + @Override public void valueChanged(TreeSelectionEvent e) { TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); if (null == newLeadSelectionPath){ diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java index d026d2231..eb9e5a120 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/jdt/test/Activator.java @@ -62,6 +62,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -72,6 +73,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java index 09fffd24b..637860f61 100644 --- a/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java +++ b/com.ibm.wala.ide.jdt.test/source/com/ibm/wala/cast/java/test/TypeInferenceAssertion.java @@ -30,6 +30,7 @@ final class TypeInferenceAssertion implements IRAssertion { } // For now just check things in the main method + @Override public void check(CallGraph cg) { IR ir = getIR(cg, typeName, "main", "[Ljava/lang/String;", "V"); AstJavaTypeInference inference = new AstJavaTypeInference(ir, cg.getClassHierarchy(), true); diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java index 2f8a19b1e..257946756 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/FakeExceptionTypeBinding.java @@ -76,11 +76,13 @@ public class FakeExceptionTypeBinding implements ITypeBinding { this.exceptionBinaryName = exceptionBinaryName; } + @Override public boolean isAssignmentCompatible(ITypeBinding variableType) { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean equals(Object o) { if (o instanceof FakeExceptionTypeBinding) return this == o; @@ -91,211 +93,253 @@ public class FakeExceptionTypeBinding implements ITypeBinding { // --- rest not needed + @Override public ITypeBinding createArrayType(int dimension) { Assertions.UNREACHABLE("FakeExceptionTypeBinding createArrayType"); return null; } + @Override public String getBinaryName() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getBound() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getComponentType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IVariableBinding[] getDeclaredFields() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IMethodBinding[] getDeclaredMethods() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getDeclaredModifiers() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public ITypeBinding[] getDeclaredTypes() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getDeclaringClass() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IMethodBinding getDeclaringMethod() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getDimensions() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public ITypeBinding getElementType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getErasure() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getInterfaces() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getModifiers() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public String getName() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IPackageBinding getPackage() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public String getQualifiedName() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getSuperclass() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getTypeArguments() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getTypeBounds() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getTypeDeclaration() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding[] getTypeParameters() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public ITypeBinding getWildcard() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public boolean isAnnotation() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isAnonymous() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isArray() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isCapture() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isCastCompatible(ITypeBinding type) { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isClass() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isEnum() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isFromSource() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isGenericType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isInterface() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isLocal() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isMember() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isNested() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isNullType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isParameterizedType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isPrimitive() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isRawType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isSubTypeCompatible(ITypeBinding type) { String name = type.getBinaryName(); if (exceptionBinaryName.endsWith("Error;")) { @@ -313,70 +357,84 @@ public class FakeExceptionTypeBinding implements ITypeBinding { return false; } + @Override public boolean isTopLevel() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isTypeVariable() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isUpperbound() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isWildcardType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public IAnnotationBinding[] getAnnotations() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public IJavaElement getJavaElement() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public String getKey() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getKind() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; } + @Override public boolean isDeprecated() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isEqualTo(IBinding binding) { return this.equals(binding); } + @Override public boolean isRecovered() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public boolean isSynthetic() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return false; } + @Override public ITypeBinding getGenericTypeOfWildcardType() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return null; } + @Override public int getRank() { Assertions.UNREACHABLE("FakeExceptionTypeBinding "); return 0; diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java index aa2ee5224..426ac79a1 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTClassLoaderFactory.java @@ -60,6 +60,7 @@ public class JDTClassLoaderFactory extends ClassLoaderFactoryImpl { super(exclusions); } + @Override protected IClassLoader makeNewClassLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, IClassLoader parent, AnalysisScope scope) throws IOException { if (classLoaderReference.equals(JavaSourceAnalysisScope.SOURCE)) { diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java index 21603eb39..4e4f00466 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTJava2CAstTranslator.java @@ -53,7 +53,6 @@ import org.eclipse.core.resources.IFile; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; -import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; @@ -294,75 +293,92 @@ public class JDTJava2CAstTranslator { } - public int getKind() { + @Override + public int getKind() { return TYPE_ENTITY; } + @Override public String getName() { return fName; // unqualified? } + @Override public String getSignature() { return "L" + fName.replace('.', '/') + ";"; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public CAstNode getAST() { // This entity has no AST nodes, really. return null; } + @Override public Map> getAllScopedEntities() { return Collections.singletonMap(null, fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("Non-AST-bearing entity (ClassEntity) asked for scoped entities related to a given AST node"); return null; } + @Override public CAstControlFlowMap getControlFlow() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap getSourceMap() { // This entity has no AST nodes, really. return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return fSourcePosition; } + @Override public CAstNodeTypeMap getNodeTypeMap() { // This entity has no AST nodes, really. return new CAstNodeTypeMap() { + @Override public CAstType getNodeType(CAstNode node) { throw new UnsupportedOperationException(); } - public Collection getMappedNodes() { + @Override + public Collection getMappedNodes() { throw new UnsupportedOperationException(); } }; } + @Override public Collection getQualifiers() { return fQuals; } + @Override public CAstType getType() { // return new JdtJavaType(fCT, getTypeDict(), fTypeSystem); return fTypeDict.new JdtJavaType(fJdtType); @@ -826,10 +842,12 @@ public class JDTJava2CAstTranslator { // From Code Body Entity private final Map> fEntities; + @Override public Map> getAllScopedEntities() { return Collections.unmodifiableMap(fEntities); } + @Override public Iterator getScopedEntities(CAstNode construct) { if (fEntities.containsKey(construct)) { return (fEntities.get(construct)).iterator(); @@ -838,6 +856,7 @@ public class JDTJava2CAstTranslator { } } + @Override public String getSignature() { return Util.methodEntityToSelector(this).toString(); } @@ -937,14 +956,17 @@ public class JDTJava2CAstTranslator { return annotations; } - public String toString() { + @Override + public String toString() { return fDecl == null ? "" : fDecl.toString(); } + @Override public int getKind() { return CAstEntity.FUNCTION_ENTITY; } + @Override public String getName() { if (fDecl == null) return MethodReference.clinitName.toString(); @@ -957,10 +979,12 @@ public class JDTJava2CAstTranslator { /** * INCLUDING first parameter 'this' (for non-static methods) */ + @Override public String[] getArgumentNames() { return fParameterNames; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } @@ -968,30 +992,37 @@ public class JDTJava2CAstTranslator { /** * INCLUDING first parameter 'this' (for non-static methods) */ + @Override public int getArgumentCount() { return fParameterNames.length; } + @Override public CAstNode getAST() { return fAst; } + @Override public CAstControlFlowMap getControlFlow() { return fContext.cfg(); } + @Override public CAstSourcePositionMap getSourceMap() { return fContext.pos(); } + @Override public CAstSourcePositionMap.Position getPosition() { return fDecl==null? getSourceMap().getPosition(fAst): makePosition(fDecl); } + @Override public CAstNodeTypeMap getNodeTypeMap() { return fContext.getNodeTypeMap(); } + @Override public Collection getQualifiers() { if (fDecl == null) return JDT2CAstUtils.mapModifiersToQualifiers(Modifier.STATIC, false, false); // static init @@ -999,10 +1030,12 @@ public class JDTJava2CAstTranslator { return JDT2CAstUtils.mapModifiersToQualifiers(fModifiers, false, false); } + @Override public CAstType getType() { return new CAstType.Method() { private Collection fExceptionTypes = null; + @Override @SuppressWarnings("deprecation") public CAstType getReturnType() { if (fReturnType != null) @@ -1017,6 +1050,7 @@ public class JDTJava2CAstTranslator { /** * NOT INCLUDING first parameter 'this' (for non-static methods) */ + @Override public List getArgumentTypes() { return fParameterTypes; } @@ -1024,20 +1058,24 @@ public class JDTJava2CAstTranslator { /** * NOT INCLUDING first parameter 'this' (for non-static methods) */ + @Override public int getArgumentCount() { return fDecl == null ? 0 : fParameterTypes.size(); } + @Override public String getName() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getName() called???"); return "?"; } + @Override public Collection getSupertypes() { Assertions.UNREACHABLE("CAstType.FunctionImpl#getSupertypes() called???"); return null; } + @Override public Collection/* */getExceptionTypes() { if (fExceptionTypes == null) { fExceptionTypes = new LinkedHashSet(); @@ -1048,6 +1086,7 @@ public class JDTJava2CAstTranslator { return fExceptionTypes; } + @Override public CAstType getDeclaringType() { return fTypeDict.getCAstTypeFor(fType); } @@ -1122,70 +1161,85 @@ public class JDTJava2CAstTranslator { return annotations; } - public int getKind() { + @Override + public int getKind() { return CAstEntity.FIELD_ENTITY; } + @Override public String getName() { return name; } + @Override public String getSignature() { return name + fIdentityMapper.typeToTypeID(type); } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public Iterator getScopedEntities(CAstNode construct) { return EmptyIterator.instance(); } + @Override public Map> getAllScopedEntities() { return Collections.emptyMap(); } + @Override public CAstNode getAST() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstControlFlowMap getControlFlow() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap getSourceMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return position; } + @Override public CAstNodeTypeMap getNodeTypeMap() { // No AST for a field decl; initializers folded into // constructor processing... return null; } + @Override public Collection getQualifiers() { return quals; } + @Override public CAstType getType() { return fTypeDict.getCAstTypeFor(type); } @@ -2906,67 +2960,82 @@ public class JDTJava2CAstTranslator { return null; } - public int getKind() { + @Override + public int getKind() { return FILE_ENTITY; } + @Override public String getName() { return fName; } + @Override public String getSignature() { Assertions.UNREACHABLE(); return null; } + @Override public String[] getArgumentNames() { return new String[0]; } + @Override public CAstNode[] getArgumentDefaults() { return new CAstNode[0]; } + @Override public int getArgumentCount() { return 0; } + @Override public Map> getAllScopedEntities() { return Collections.singletonMap(null, fTopLevelDecls); } + @Override public Iterator getScopedEntities(CAstNode construct) { Assertions.UNREACHABLE("CompilationUnitEntity asked for AST-related entities, but it has no AST."); return null; } + @Override public CAstNode getAST() { return null; } + @Override public CAstControlFlowMap getControlFlow() { Assertions.UNREACHABLE("CompilationUnitEntity.getControlFlow()"); return null; } + @Override public CAstSourcePositionMap getSourceMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getSourceMap()"); return null; } + @Override public CAstSourcePositionMap.Position getPosition() { return null; } + @Override public CAstNodeTypeMap getNodeTypeMap() { Assertions.UNREACHABLE("CompilationUnitEntity.getNodeTypeMap()"); return null; } + @Override public Collection getQualifiers() { return Collections.EMPTY_LIST; } + @Override public CAstType getType() { Assertions.UNREACHABLE("CompilationUnitEntity.getType()"); return null; @@ -3001,15 +3070,18 @@ public class JDTJava2CAstTranslator { super(parent); } + @Override public Collection> getCatchTargets(ITypeBinding type) { return parent.getCatchTargets(type); } + @Override public Map getLabelMap() { return parent.getLabelMap(); } - public boolean needLValue() { + @Override + public boolean needLValue() { return parent.needLValue(); } } @@ -3018,16 +3090,19 @@ public class JDTJava2CAstTranslator { * Root context. Doesn't do anything. */ public static class RootContext extends TranslatorToCAst.RootContext implements WalkContext { - public Collection> getCatchTargets(ITypeBinding type) { + @Override + public Collection> getCatchTargets(ITypeBinding type) { Assertions.UNREACHABLE("RootContext.getCatchTargets()"); return null; } + @Override public Map getLabelMap() { Assertions.UNREACHABLE("RootContext.getLabelMap()"); return null; } + @Override public boolean needLValue() { Assertions.UNREACHABLE("Rootcontext.needLValue()"); return false; @@ -3040,6 +3115,7 @@ public class JDTJava2CAstTranslator { super(parent); } + @Override public boolean needLValue() { return true; } @@ -3059,6 +3135,7 @@ public class JDTJava2CAstTranslator { } } + @Override public Collection> getCatchTargets(ITypeBinding label) { // Look for all matching targets for this thrown type: // if supertpe match, then return only matches at this catch @@ -3098,6 +3175,7 @@ public class JDTJava2CAstTranslator { this.breakTo = breakTo; } + @Override public ASTNode getBreakFor(String label) { return (label == null || label.equals(this.label)) ? breakTo : super.getBreakFor(label); } @@ -3111,6 +3189,7 @@ public class JDTJava2CAstTranslator { this.continueTo = continueTo; } + @Override public ASTNode getContinueFor(String label) { return (label == null || label.equals(this.label)) ? continueTo : super.getContinueFor(label); } @@ -3127,6 +3206,7 @@ public class JDTJava2CAstTranslator { fEntities = entities; } + @Override public Map getLabelMap() { return labelMap; // labels are kept within a method. } @@ -3137,22 +3217,27 @@ public class JDTJava2CAstTranslator { final CAstNodeTypeMapRecorder fNodeTypeMap = new CAstNodeTypeMapRecorder(); + @Override public CAstControlFlowRecorder cfg() { return fCFG; } + @Override public void addScopedEntity(CAstNode node, CAstEntity entity) { fEntities.put(node, entity); } + @Override public CAstSourcePositionRecorder pos() { return fSourceMap; } + @Override public CAstNodeTypeMapRecorder getNodeTypeMap() { return fNodeTypeMap; } + @Override public Collection> getCatchTargets(ITypeBinding label) { // TAGALONG (need fRuntimeExcType) // Why do we seemingly catch a RuntimeException in every method? this won't catch the RuntimeException above where @@ -3162,6 +3247,7 @@ public class JDTJava2CAstTranslator { return result; } + @Override public boolean needLValue() { return false; } @@ -3397,6 +3483,7 @@ public class JDTJava2CAstTranslator { // constants are unsorted by default Collections.sort(constants, new Comparator() { + @Override public int compare(IVariableBinding arg0, IVariableBinding arg1) { return arg0.getVariableId() - arg1.getVariableId(); } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java index 77d299886..2e38e7366 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTSourceLoaderImpl.java @@ -53,6 +53,7 @@ public class JDTSourceLoaderImpl extends JavaSourceLoaderImpl { super(loaderRef, parent, exclusions, cha); } + @Override protected SourceModuleTranslator getTranslator() { return new JDTSourceModuleTranslator(cha.getScope(), this); } 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 275e1f82f..55d1cccc0 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 @@ -113,6 +113,7 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { * Project -> AST code from org.eclipse.jdt.core.tests.performance */ + @Override public void loadAllSources(Set modules) { // TODO: we might need one AST (-> "Object" class) for all files. // TODO: group by project and send 'em in @@ -137,6 +138,7 @@ public class JDTSourceModuleTranslator implements SourceModuleTranslator { Set units = proj.getValue().keySet(); parser.createASTs(units.toArray(new ICompilationUnit[units.size()]), new String[0], new ASTRequestor() { + @Override public void acceptAST(ICompilationUnit source, CompilationUnit ast) { try { diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java index a59b60363..d83121ffc 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/cast/java/translator/jdt/JDTTypeDictionary.java @@ -69,6 +69,7 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fIdentityMapper = identityMapper; } + @Override public CAstType getCAstTypeFor(Object astType) { ITypeBinding jdtType = JDT2CAstUtils.getErasedType((ITypeBinding) astType, fAst); @@ -104,18 +105,22 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fEltCAstType = getCAstTypeFor(fEltJdtType); } + @Override public int getNumDimensions() { return 1; // always 1 for Java } + @Override public CAstType getElementType() { return fEltCAstType; } + @Override public String getName() { return "[" + fEltCAstType.getName(); } + @Override @SuppressWarnings("unchecked") public Collection getSupertypes() { if (fEltJdtType.isPrimitive()) @@ -139,6 +144,7 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { private Collection fSuperTypes = null; + @Override public String toString() { return super.toString() + ":" + getName(); } @@ -148,10 +154,12 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fType = type; } + @Override public String getName() { return fIdentityMapper.getTypeRef(fType).getName().toString(); } + @Override @SuppressWarnings("unchecked") public Collection getSupertypes() { if (fSuperTypes == null) { @@ -175,10 +183,12 @@ public class JDTTypeDictionary extends CAstTypeDictionaryImpl { fSuperTypes.add(getCAstTypeFor(t)); } + @Override public Collection getQualifiers() { return JDT2CAstUtils.mapModifiersToQualifiers(fType.getModifiers(), fType.isInterface(), fType.isAnnotation()); } + @Override public boolean isInterface() { return fType.isInterface(); } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java index 6c044f1f3..e9c0a42d7 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/AbstractJavaAnalysisAction.java @@ -59,6 +59,7 @@ public abstract class AbstractJavaAnalysisAction implements IObjectActionDelegat /* * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart) */ + @Override public void setActivePart(IAction action, IWorkbenchPart targetPart) { } @@ -190,6 +191,7 @@ public abstract class AbstractJavaAnalysisAction implements IObjectActionDelegat /* * @see IActionDelegate#run(IAction) */ + @Override public void run(IAction action) { IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); try { @@ -205,6 +207,7 @@ public abstract class AbstractJavaAnalysisAction implements IObjectActionDelegat /* * @see IActionDelegate#selectionChanged(IAction, ISelection) */ + @Override public void selectionChanged(IAction action, ISelection selection) { currentSelection = selection; } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java index b954afbad..67cc47497 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/jdt/Activator.java @@ -34,7 +34,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -43,7 +44,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } diff --git a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java index 0913be3bb..861eddfb2 100644 --- a/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java +++ b/com.ibm.wala.ide.jdt/source/com/ibm/wala/ide/util/JdtPosition.java @@ -40,26 +40,32 @@ public final class JdtPosition implements Position { this.eclipseFile = eclipseFile; } + @Override public int getFirstCol() { return -1; } + @Override public int getFirstLine() { return firstLine; } + @Override public InputStream getInputStream() throws IOException { return null; } + @Override public int getLastCol() { return -1; } + @Override public int getLastLine() { return lastLine; } + @Override public URL getURL() { try { return new URL("file:" + path); @@ -69,6 +75,7 @@ public final class JdtPosition implements Position { } } + @Override public int compareTo(Object arg0) { if (arg0 instanceof JdtPosition) { if (firstOffset != ((JdtPosition)arg0).firstOffset) { @@ -81,14 +88,17 @@ public final class JdtPosition implements Position { return 0; } + @Override public int getFirstOffset() { return firstOffset; } + @Override public int getLastOffset() { return lastOffset; } + @Override public String toString() { return "[offset " + firstOffset + ":" + lastOffset + "]"; } diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java index a12ba2a07..2e5a74261 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/jsdt/Activator.java @@ -34,7 +34,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ - public void start(BundleContext context) throws Exception { + @Override + public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -43,7 +44,8 @@ public class Activator extends AbstractUIPlugin { * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ - public void stop(BundleContext context) throws Exception { + @Override + public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java index e7943c5fc..3f2a36d99 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JavaScriptHeadlessUtil.java @@ -21,7 +21,8 @@ public class JavaScriptHeadlessUtil extends HeadlessUtil { public static IJavaScriptProject getJavaScriptProjectFromWorkspace(final String projectName) { IJavaScriptProject jp = getProjectFromWorkspace(new Function() { - public IJavaScriptProject apply(IProject p) { + @Override + public IJavaScriptProject apply(IProject p) { try { if (p.hasNature(JavaScriptCore.NATURE_ID)) { IJavaScriptProject jp = JavaScriptCore.create(p); diff --git a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java index 5e35c5b61..c2d4e6d4f 100644 --- a/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java +++ b/com.ibm.wala.ide.jsdt/source/com/ibm/wala/ide/util/JsdtUtil.java @@ -82,17 +82,21 @@ public class JsdtUtil { public static CGInfo buildJSDTCallGraph(Set mes) { final CGInfo info = new CGInfo(); HeadlessUtil.parseModules(mes, new EclipseCompiler() { + @Override public IJavaScriptUnit getCompilationUnit(IFile file) { return JavaScriptCore.createCompilationUnitFrom(file); } + @Override public Parser getParser() { return new Parser() { IJavaScriptProject project; + @Override public void setProject(IProject project) { this.project = JavaScriptCore.create(project); } + @Override public void processASTs(Map files, Function errors) { final ASTVisitor visitor = new ASTVisitor() { private final CallHierarchy ch = CallHierarchy.getDefault(); diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java index ad6b680b5..03fb285f3 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/eclipse/headless/Main.java @@ -30,6 +30,7 @@ import com.ibm.wala.ide.util.JdtUtil; */ public class Main implements IApplication { + @Override public Object start(IApplicationContext context) throws Exception { Collection jp = JdtUtil.getWorkspaceJavaProjects(); for (IJavaProject p : jp) { @@ -40,6 +41,7 @@ public class Main implements IApplication { return null; } + @Override public void stop() { } } diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java index 52a42fe7f..78edbb101 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/examples/drivers/SWTTypeHierarchy.java @@ -107,6 +107,7 @@ public class SWTTypeHierarchy { */ static Graph pruneForAppLoader(Graph g) throws WalaException { Filter f = new Filter() { + @Override public boolean accepts(IClass c) { return (c.getClassLoader().getReference().equals(ClassLoaderReference.Application)); } diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java index ba7c0803f..b8a7b423e 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/test/Activator.java @@ -62,6 +62,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -72,6 +73,7 @@ public class Activator extends Plugin { * * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java index 71e9cfc05..d03518881 100644 --- a/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java +++ b/com.ibm.wala.ide.tests/src/com/ibm/wala/ide/tests/util/EclipseTestUtil.java @@ -87,6 +87,7 @@ public class EclipseTestUtil { IPath containerPath = getWorkspacePath().append(projectName).addTrailingSeparator(); ImportOperation importOp = new ImportOperation(containerPath, provider.getRoot(), provider, new IOverwriteQuery() { + @Override public String queryOverwrite(String pathString) { return IOverwriteQuery.ALL; } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/classloader/EclipseSourceFileModule.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/classloader/EclipseSourceFileModule.java index a364b5dc1..b73a1ec25 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/classloader/EclipseSourceFileModule.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/classloader/EclipseSourceFileModule.java @@ -31,7 +31,7 @@ public class EclipseSourceFileModule extends SourceFileModule { } private EclipseSourceFileModule(IFile f) { - super(new File(f.getLocation().toOSString()),f.getLocation().lastSegment()); + super(new File(f.getLocation().toOSString()),f.getLocation().lastSegment(), null); this.f = f; } public IFile getIFile() { diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java index ac97194ff..80f84daf2 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectAnalysisEngine.java @@ -45,6 +45,7 @@ abstract public class EclipseProjectAnalysisEngine

    extends AbstractAnalysisEn abstract protected EclipseProjectPath createProjectPath(P project) throws IOException, CoreException; + @Override abstract protected CallGraphBuilder getCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache); abstract protected AnalysisScope makeAnalysisScope(); diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java index 660f710ec..4f9f00747 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/client/EclipseProjectSourceAnalysisEngine.java @@ -61,6 +61,7 @@ abstract public class EclipseProjectSourceAnalysisEngine

    extends EclipseProje * we don't provide a default implementation of this method to avoid * introducing a dependence on com.ibm.wala.cast from this project */ + @Override public abstract AnalysisCache makeDefaultCache(); protected abstract ClassLoaderReference getSourceLoader(); @@ -71,6 +72,7 @@ abstract public class EclipseProjectSourceAnalysisEngine

    extends EclipseProje SSAOptions ssaOptions = new SSAOptions(); ssaOptions.setDefaultValues(new SSAOptions.DefaultValues() { + @Override public int getDefaultValue(SymbolTable symtab, int valueNumber) { return symtab.getDefaultValue(valueNumber); } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java index ff8cebdbd..fe33fc903 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/SWTTreeViewer.java @@ -109,6 +109,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { // run the code on the UI thread Display d = PlatformUI.getWorkbench().getDisplay(); Runnable r = new Runnable() { + @Override public void run() { try { w.open(); @@ -130,6 +131,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { Display.getCurrent().dispose(); } else { Runnable r = new Runnable() { + @Override public void run() { w.open(); Display.getCurrent().dispose(); @@ -218,6 +220,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ + @Override public void dispose() { // do nothing for now } @@ -226,6 +229,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ + @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // for now do nothing, since we're not dealing with listeners } @@ -233,6 +237,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ + @Override public Object[] getChildren(Object parentElement) { Object[] result = new Object[graph.getSuccNodeCount(parentElement)]; @@ -246,6 +251,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ + @Override public Object getParent(Object element) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -255,6 +261,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ + @Override public boolean hasChildren(Object element) { return graph.getSuccNodeCount(element) > 0; } @@ -262,6 +269,7 @@ public class SWTTreeViewer extends AbstractJFaceRunner { /* * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ + @Override public Object[] getElements(Object inputElement) { Collection roots = getRootsInput(); Assertions.productionAssertion(roots != null); diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java index 7a7a6a800..3d3d1eae4 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/ViewIFDSLocalAction.java @@ -108,6 +108,7 @@ public class ViewIFDSLocalAction extends Action { this.result = result; } + @Override @SuppressWarnings("unchecked") public String getLabel(Object o) throws WalaException { T t = (T) o; @@ -176,6 +177,7 @@ public class ViewIFDSLocalAction extends Action { try { final P proc = getProcedureForSelection(); Filter filter = new Filter() { + @Override public boolean accepts(T o) { return supergraph.getProcOf(o).equals(proc); } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java index f37b3e0f3..fa7beb106 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/EclipseProjectPath.java @@ -88,6 +88,7 @@ public abstract class EclipseProjectPath { this.ref = ref; } + @Override public ClassLoaderReference ref() { return ref; } diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java index 043446130..0e52c6643 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/HeadlessUtil.java @@ -104,6 +104,7 @@ public class HeadlessUtil { for (final Map.Entry> proj : projectsFiles.entrySet()) { parser.setProject(proj.getKey()); parser.processASTs(proj.getValue(), new Function() { + @Override public Boolean apply(Object[] problems) { int length = problems.length; if (length > 0) { diff --git a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java index 4ceb30041..072f00da2 100644 --- a/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java +++ b/com.ibm.wala.ide/src/com/ibm/wala/ide/util/ProgressMonitorDelegate.java @@ -30,19 +30,23 @@ public class ProgressMonitorDelegate implements IProgressMonitor { this.delegate = d; } + @Override public void beginTask(String task, int totalWork) { delegate.beginTask(task, totalWork); } + @Override public boolean isCanceled() { return delegate.isCanceled(); } + @Override public void done() { delegate.done(); } + @Override public void worked(int units) { delegate.worked(units); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java index c517ddba7..1deaa3f87 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrike/copywriter/CopyWriter.java @@ -95,6 +95,7 @@ public class CopyWriter { instrumenter = new OfflineInstrumenter(); instrumenter.setManifestBuilder(new OfflineInstrumenter.ManifestBuilder() { + @Override public void addEntry(ZipEntry ze) { entries.add(ze); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java index 89019b559..276dca550 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLengthInstruction.java @@ -59,6 +59,7 @@ final public class ArrayLengthInstruction extends Instruction { return "ArrayLength()"; } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java index c4725dab4..9bd000b87 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayLoadInstruction.java @@ -90,6 +90,7 @@ final public class ArrayLoadInstruction extends Instruction implements IArrayLoa return Util.getWordSize(getType()); } + @Override public String getType() { return Constants.indexedTypes[opcode - OP_iaload]; } @@ -99,6 +100,7 @@ final public class ArrayLoadInstruction extends Instruction implements IArrayLoa v.visitArrayLoad(this); } + @Override public boolean isPEI() { return true; } @@ -107,6 +109,7 @@ final public class ArrayLoadInstruction extends Instruction implements IArrayLoa * Java bytecode does not permit this. * @see com.ibm.wala.shrikeBT.IMemoryOperation#isAddressOf() */ + @Override public boolean isAddressOf() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java index b2de46772..e91bda969 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ArrayStoreInstruction.java @@ -57,6 +57,7 @@ final public class ArrayStoreInstruction extends Instruction implements IArraySt return 3; } + @Override public String getType() { return Decoder.indexedTypes[opcode - OP_iastore]; } @@ -71,6 +72,7 @@ final public class ArrayStoreInstruction extends Instruction implements IArraySt v.visitArrayStore(this); } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java index 5db0f757b..c67fdba77 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/BinaryOpInstruction.java @@ -70,6 +70,7 @@ final public class BinaryOpInstruction extends Instruction implements IBinaryOpI } } + @Override public Operator getOperator() { if (opcode < OP_iand) { // For these opcodes, there are 4 variants (i,l,f,d) @@ -101,6 +102,7 @@ final public class BinaryOpInstruction extends Instruction implements IBinaryOpI return Util.getWordSize(getType()); } + @Override public String getType() { int t; if (opcode < OP_iand) { @@ -121,14 +123,17 @@ final public class BinaryOpInstruction extends Instruction implements IBinaryOpI return "BinaryOp(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return opcode == Constants.OP_idiv || opcode == Constants.OP_ldiv || opcode == Constants.OP_irem || opcode == Constants.OP_lrem; } + @Override public boolean throwsExceptionOnOverflow() { return false; } + @Override public boolean isUnsigned() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java index b12c341fe..1e46b26e5 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/CheckCastInstruction.java @@ -51,6 +51,7 @@ final public class CheckCastInstruction extends Instruction implements ITypeTest /** * @return the type to which the operand is cast */ + @Override public String[] getTypes() { return new String[]{ type }; } @@ -78,10 +79,12 @@ final public class CheckCastInstruction extends Instruction implements ITypeTest return "CheckCast(" + type + ")"; } + @Override public boolean isPEI() { return true; } + @Override public boolean firstClassTypes() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java index 8f0d856aa..a35585d56 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ComparisonInstruction.java @@ -64,6 +64,7 @@ final public class ComparisonInstruction extends Instruction implements ICompari /** * @return OPR_cmp (for long), OPR_cmpl, or OPR_cmpg (for float and double) */ + @Override public Operator getOperator() { switch (opcode) { case OP_lcmp: @@ -79,6 +80,7 @@ final public class ComparisonInstruction extends Instruction implements ICompari } } + @Override public String getType() { switch (opcode) { case OP_lcmp: @@ -124,6 +126,7 @@ final public class ComparisonInstruction extends Instruction implements ICompari return "Comparison(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java index 7eaadcf7b..0e4c3f33f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConditionalBranchInstruction.java @@ -73,6 +73,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I return r; } + @Override public int getTarget() { return label; } @@ -89,6 +90,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I } } + @Override public Operator getOperator() { if (opcode < OP_if_acmpeq) { return Operator.values()[opcode - OP_if_icmpeq]; @@ -97,6 +99,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I } } + @Override public String getType() { return opcode < OP_if_acmpeq ? TYPE_int : TYPE_Object; } @@ -119,6 +122,7 @@ public final class ConditionalBranchInstruction extends Instruction implements I v.visitConditionalBranch(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java index 8fd447e55..e9ef8552e 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConstantInstruction.java @@ -660,6 +660,7 @@ public abstract class ConstantInstruction extends Instruction { return "Constant(" + getType() + "," + quote(getValue()) + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java index 0561567e9..4569f5fae 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ConversionInstruction.java @@ -69,6 +69,7 @@ public final class ConversionInstruction extends Instruction implements IConvers return 1; } + @Override public String getFromType() { return fromType; } @@ -77,6 +78,7 @@ public final class ConversionInstruction extends Instruction implements IConvers return a < b ? a : a + 1; } + @Override public String getToType() { return toType; } @@ -116,10 +118,12 @@ public final class ConversionInstruction extends Instruction implements IConvers v.visitConversion(this); } + @Override public boolean isPEI() { return false; } + @Override public boolean throwsExceptionOnOverflow() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java index a5d4822a1..19a5a18a1 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/DupInstruction.java @@ -105,6 +105,7 @@ public final class DupInstruction extends Instruction { v.visitDup(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java index c5c25b662..382b1fa96 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GetInstruction.java @@ -104,18 +104,22 @@ public class GetInstruction extends Instruction implements IGetInstruction { } } + @Override public String getClassType() { return classType; } + @Override public String getFieldName() { return fieldName; } + @Override public String getFieldType() { return type; } + @Override final public boolean isStatic() { return opcode == OP_getstatic; } @@ -154,6 +158,7 @@ public class GetInstruction extends Instruction implements IGetInstruction { v.visitGet(this); } + @Override public boolean isPEI() { return !isStatic(); } @@ -161,6 +166,7 @@ public class GetInstruction extends Instruction implements IGetInstruction { /** * Java does not permit this */ + @Override public boolean isAddressOf() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java index f7c513091..187099de1 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/GotoInstruction.java @@ -94,6 +94,7 @@ public final class GotoInstruction extends Instruction { v.visitGoto(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java index c50b8d34d..d32b57e46 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInstruction.java @@ -149,6 +149,7 @@ public interface IInstruction { /** * Subclasses must implement toString. */ + @Override public String toString(); /** diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java index 7cd60989d..7469e1c45 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/IInvokeInstruction.java @@ -42,6 +42,7 @@ public interface IInvokeInstruction extends IInstruction { } }; + @Override public boolean hasImplicitThis() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java index f9c58db2b..d9413edbb 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InstanceofInstruction.java @@ -48,6 +48,7 @@ public final class InstanceofInstruction extends Instruction implements IInstanc return 1; } + @Override public String getType() { return type; } @@ -75,10 +76,12 @@ public final class InstanceofInstruction extends Instruction implements IInstanc return "Instanceof(" + type + ")"; } + @Override public boolean isPEI() { return false; } + @Override public boolean firstClassType() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java index 84c5b7a21..398e747bd 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/Instruction.java @@ -54,6 +54,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * @return true if the instruction can "fall through" to the following instruction */ + @Override public boolean isFallThrough() { return true; } @@ -62,6 +63,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction * @return an array containing the labels this instruction can branch to (not including the following instruction if this * instruction 'falls through') */ + @Override public int[] getBranchTargets() { return noInstructions; } @@ -69,6 +71,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * @return an Instruction equivalent to this one but with any branch labels updated by looking them up in the targetMap array */ + @Override public IInstruction redirectTargets(int[] targetMap) { return this; } @@ -76,6 +79,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * @return the number of values this instruction pops off the working stack */ + @Override public int getPoppedCount() { return 0; } @@ -93,6 +97,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction * @param poppedTypesToCheck the types of the data popped off the stack by this instruction; if poppedTypes is null, then we don't * know the incoming stack types and the result of this method may be less accurate */ + @Override public String getPushedType(String[] poppedTypesToCheck) { return null; } @@ -101,6 +106,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction * @return the JVM word size of the value this instruction pushes onto the stack, or 0 if this instruction doesn't push anything * onto the stack. */ + @Override public byte getPushedWordSize() { return 0; } @@ -108,6 +114,7 @@ public abstract class Instruction implements Constants, Cloneable, IInstruction /** * Apply a Visitor to this instruction. We invoke the appropriate Visitor method according to the type of this instruction. */ + @Override public abstract void visit(IInstruction.Visitor v); /** diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java index 5e291ff88..e75978635 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/InvokeInstruction.java @@ -127,14 +127,17 @@ public class InvokeInstruction extends Instruction implements IInvokeInstruction } } + @Override public String getClassType() { return classType; } + @Override public String getMethodName() { return methodName; } + @Override public String getMethodSignature() { return type; } @@ -195,10 +198,12 @@ public class InvokeInstruction extends Instruction implements IInvokeInstruction return "Invoke(" + getInvocationModeString() + "," + getClassType() + "," + getMethodName() + "," + getMethodSignature() + ")"; } + @Override public boolean isPEI() { return true; } + @Override public Dispatch getInvocationCode() { switch (opcode) { case Constants.OP_invokestatic: diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java index cc950dc35..8189ab227 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/LoadInstruction.java @@ -51,10 +51,12 @@ public final class LoadInstruction extends Instruction implements ILoadInstructi /** * @return the index of the local variable loaded */ + @Override public int getVarIndex() { return index; } + @Override public String getType() { if (opcode < OP_iload_0) { return indexedTypes[opcode - OP_iload]; @@ -98,6 +100,7 @@ public final class LoadInstruction extends Instruction implements ILoadInstructi return "LocalLoad(" + getType() + "," + index + ")"; } + @Override public boolean isPEI() { return false; } @@ -106,6 +109,7 @@ public final class LoadInstruction extends Instruction implements ILoadInstructi * Java does not permit this. * @see com.ibm.wala.shrikeBT.IMemoryOperation#isAddressOf() */ + @Override public boolean isAddressOf() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java index bda34c9c6..a85838fd4 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/MonitorInstruction.java @@ -63,6 +63,7 @@ public final class MonitorInstruction extends Instruction { return "Monitor(" + (isEnter() ? "ENTER" : "EXIT") + ")"; } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java index 3df1885c9..5d2e8c680 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/NewInstruction.java @@ -113,6 +113,7 @@ public final class NewInstruction extends Instruction { v.visitNew(this); } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java index 8865bd33d..ef939415f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PopInstruction.java @@ -65,6 +65,7 @@ public final class PopInstruction extends Instruction { return "Pop(" + size + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java index 897b19c54..14b1f3438 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/PutInstruction.java @@ -104,18 +104,22 @@ public class PutInstruction extends Instruction implements IPutInstruction { } } + @Override public String getClassType() { return classType; } + @Override public String getFieldType() { return type; } + @Override public String getFieldName() { return fieldName; } + @Override final public boolean isStatic() { return opcode == OP_putstatic; } @@ -141,6 +145,7 @@ public class PutInstruction extends Instruction implements IPutInstruction { v.visitPut(this); } + @Override public boolean isPEI() { return !isStatic(); } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java index 28ef30b6b..c38eb8fdd 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ReturnInstruction.java @@ -84,6 +84,7 @@ public final class ReturnInstruction extends Instruction { return "Return(" + getType() + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java index a57c50200..2f2ed98cd 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ShiftInstruction.java @@ -51,6 +51,7 @@ public final class ShiftInstruction extends Instruction implements IShiftInstruc } } + @Override public Operator getOperator() { return Operator.values()[(opcode - OP_ishl) / 2]; } @@ -75,6 +76,7 @@ public final class ShiftInstruction extends Instruction implements IShiftInstruc return Util.getWordSize(getType()); } + @Override public String getType() { return indexedTypes[(opcode - OP_ishl) & 1]; } @@ -89,10 +91,12 @@ public final class ShiftInstruction extends Instruction implements IShiftInstruc return "Shift(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return false; } + @Override public boolean isUnsigned() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java index d88b4e0a8..4f3f107e9 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/StoreInstruction.java @@ -51,10 +51,12 @@ public final class StoreInstruction extends Instruction implements IStoreInstruc /** * @return the index of the local variable stored */ + @Override public int getVarIndex() { return index; } + @Override public String getType() { if (opcode < OP_istore_0) { return indexedTypes[opcode - OP_istore]; @@ -93,6 +95,7 @@ public final class StoreInstruction extends Instruction implements IStoreInstruc v.visitLocalStore(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java index 8d7d6e30b..7eafd4988 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwapInstruction.java @@ -53,6 +53,7 @@ public final class SwapInstruction extends Instruction { v.visitSwap(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java index 8e5a1b52c..f38aa33b6 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/SwitchInstruction.java @@ -147,6 +147,7 @@ public final class SwitchInstruction extends Instruction { v.visitSwitch(this); } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java index 3d334bd24..2f37950c4 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/ThrowInstruction.java @@ -70,6 +70,7 @@ public final class ThrowInstruction extends Instruction { return "Throw()"; } + @Override public boolean isPEI() { return true; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java index 7b3cbcaf0..a119eb987 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/UnaryOpInstruction.java @@ -46,6 +46,7 @@ public final class UnaryOpInstruction extends Instruction implements IUnaryOpIns } } + @Override public IUnaryOpInstruction.Operator getOperator() { return IUnaryOpInstruction.Operator.NEG; } @@ -70,6 +71,7 @@ public final class UnaryOpInstruction extends Instruction implements IUnaryOpIns return Util.getWordSize(getType()); } + @Override public String getType() { return indexedTypes[opcode - OP_ineg]; } @@ -84,6 +86,7 @@ public final class UnaryOpInstruction extends Instruction implements IUnaryOpIns return "UnaryOp(" + getType() + "," + getOperator() + ")"; } + @Override public boolean isPEI() { return false; } diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java index c5028f497..969fcfd68 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/analysis/ClassHierarchyStore.java @@ -81,6 +81,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /** * @see ClassHierarchyProvider#getSuperClass(String) */ + @Override public String getSuperClass(String cl) { ClassInfo info = contents.get(cl); return info == null ? null : info.superClass; @@ -89,6 +90,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /* * @see ClassHierarchyProvider#getSuperInterfaces(String) */ + @Override public String[] getSuperInterfaces(String cl) { ClassInfo info = contents.get(cl); return info == null ? null : info.superInterfaces; @@ -97,6 +99,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /* * @see ClassHierarchyProvider#getSubClasses(String) */ + @Override public String[] getSubClasses(String cl) { ClassInfo info = contents.get(cl); return (info == null || !info.isFinal) ? null : noClasses; @@ -105,6 +108,7 @@ public final class ClassHierarchyStore implements ClassHierarchyProvider { /* * @see ClassHierarchyProvider#isInterface(String) */ + @Override public int isInterface(String cl) { ClassInfo info = contents.get(cl); return info == null ? Constants.MAYBE : (info.isInterface ? Constants.YES : Constants.NO); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java index f60c72c8b..03a01118b 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/InstructionTypeCounter.java @@ -275,6 +275,7 @@ public class InstructionTypeCounter implements MethodData.Results { * * This is not to be called by clients. */ + @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { // just throw this away and we'll recalculate from scratch if necessary diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java index 39e5c498c..35071c4ff 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/LocalAllocator.java @@ -68,6 +68,7 @@ public class LocalAllocator implements MethodData.Results { /** * This should not be called by clients. */ + @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { return false; diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java index 6631e3831..21d0d3374 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/info/ThisAssignmentChecker.java @@ -48,6 +48,7 @@ public class ThisAssignmentChecker implements MethodData.Results { /** * This should not be called by any client. */ + @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { // just throw this away and we'll recalculate from scratch if necessary diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java index 119d3c677..154b9332f 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/AddSerialVersion.java @@ -118,6 +118,7 @@ public class AddSerialVersion { } } Arrays.sort(fields, 0, fieldCount, new Comparator() { + @Override public int compare(Integer o1, Integer o2) { String name1 = fieldNames[o1.intValue()]; String name2 = fieldNames[o2.intValue()]; @@ -153,6 +154,7 @@ public class AddSerialVersion { } } Arrays.sort(methods, 0, methodCount, new Comparator() { + @Override public int compare(Integer o1, Integer o2) { int m1 = o1.intValue(); int m2 = o2.intValue(); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java index ef2bfc861..2d16fda4a 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/tools/OfflineInstrumenterBase.java @@ -239,6 +239,7 @@ public abstract class OfflineInstrumenterBase { throw new IllegalArgumentException("d is null"); } File[] fs = d.listFiles(new FileFilter() { + @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".class"); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java b/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java index d7609b3e2..bc24e923a 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java +++ b/com.ibm.wala.util/src/com/ibm/wala/dataflow/graph/BasicFramework.java @@ -30,6 +30,7 @@ public class BasicFramework implements IKilldallFramewor /* * @see com.ibm.wala.dataflow.graph.IKilldallFramework#getFlowGraph() */ + @Override public Graph getFlowGraph() { return flowGraph; } @@ -37,6 +38,7 @@ public class BasicFramework implements IKilldallFramewor /* * @see com.ibm.wala.dataflow.graph.IKilldallFramework#getTransferFunctionMap() */ + @Override public ITransferFunctionProvider getTransferFunctionProvider() { return transferFunctionProvider; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java index d5fe1dd4d..29def0776 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/AbstractFixedPointSolver.java @@ -127,6 +127,7 @@ public abstract class AbstractFixedPointSolver> implement * * @return true iff the evaluation of some equation caused a change in the value of some variable. */ + @Override @SuppressWarnings("unchecked") public boolean solve(IProgressMonitor monitor) throws CancelException { @@ -171,6 +172,7 @@ public abstract class AbstractFixedPointSolver> implement return globalChange; } + @Override public void performVerboseAction() { System.err.println("Evaluated " + nEvaluated); System.err.println("Created " + nCreated); diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java index cace0111f..c2647c820 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSolver.java @@ -35,6 +35,7 @@ public abstract class DefaultFixedPointSolver> extends Ab graph = new DefaultFixedPointSystem(); } + @Override public IFixedPointSystem getFixedPointSystem() { return graph; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java index 825ce9b54..338319251 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/DefaultFixedPointSystem.java @@ -87,19 +87,23 @@ public class DefaultFixedPointSystem> implements IFixedPo return graph.toString(); } + @Override public void removeStatement(IFixedPointStatement s) { graph.removeNodeAndEdges(s); } + @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public Iterator getStatements() { return new FilterIterator(graph.iterator(), new Filter() { + @Override public boolean accepts(Object x) { return x instanceof AbstractStatement; } }); } + @Override @SuppressWarnings("rawtypes") public void addStatement(IFixedPointStatement statement) throws IllegalArgumentException, UnimplementedError { if (statement == null) { @@ -197,6 +201,7 @@ public class DefaultFixedPointSystem> implements IFixedPo return (AbstractStatement) graph.getNode(number); } + @Override public void reorder() { if (DEBUG) { checkGraph(); @@ -226,10 +231,12 @@ public class DefaultFixedPointSystem> implements IFixedPo } } + @Override public Iterator getStatementsThatUse(T v) { return (graph.containsNode(v) ? graph.getSuccNodes(v) : EmptyIterator.instance()); } + @Override public Iterator getStatementsThatDef(T v) { return (graph.containsNode(v) ? graph.getPredNodes(v) : EmptyIterator.instance()); } @@ -239,16 +246,20 @@ public class DefaultFixedPointSystem> implements IFixedPo return (T) graph.getNode(n); } + @Override public int getNumberOfStatementsThatUse(T v) { return (graph.containsNode(v) ? graph.getSuccNodeCount(v) : 0); } + @Override public int getNumberOfStatementsThatDef(T v) { return (graph.containsNode(v) ? graph.getPredNodeCount(v) : 0); } + @Override public Iterator getVariables() { return new FilterIterator(graph.iterator(), new Filter() { + @Override public boolean accepts(T x) { return x instanceof IVariable; } @@ -268,10 +279,12 @@ public class DefaultFixedPointSystem> implements IFixedPo return graph.getPredNodeCount(n); } + @Override public boolean containsStatement(IFixedPointStatement s) { return equations.contains(s); } + @Override public boolean containsVariable(T v) { return variables.contains(v); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java index f60f98717..0cfbfb06b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/GeneralStatement.java @@ -32,6 +32,7 @@ public abstract class GeneralStatement> extends AbstractS * * @return true if the lhs value changed. false otherwise */ + @Override public byte evaluate() { return operator.evaluate(lhs, rhs); } @@ -41,6 +42,7 @@ public abstract class GeneralStatement> extends AbstractS * * @return the lattice cell this equation computes */ + @Override public T getLHS() { return lhs; } @@ -54,6 +56,7 @@ public abstract class GeneralStatement> extends AbstractS * @param cell the cell in question * @return true or false */ + @Override public boolean hasVariable(T cell) { if (lhs == cell) { return true; @@ -209,6 +212,7 @@ public abstract class GeneralStatement> extends AbstractS return operator; } + @Override public T[] getRHS() { return rhs; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java index 19703db87..af342b542 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixedpoint/impl/NullaryStatement.java @@ -31,6 +31,7 @@ public abstract class NullaryStatement extends AbstractStat * * @return true if the lhs value changed. false otherwise */ + @Override public byte evaluate() { NullaryOperator op = getOperator(); return op.evaluate(lhs); @@ -41,6 +42,7 @@ public abstract class NullaryStatement extends AbstractStat * * @return the lattice cell this equation computes */ + @Override public T getLHS() { return lhs; } @@ -50,6 +52,7 @@ public abstract class NullaryStatement extends AbstractStat * @param cell the cell in question * @return true or false */ + @Override public boolean hasVariable(T cell) { return lhs == cell; } @@ -99,6 +102,7 @@ public abstract class NullaryStatement extends AbstractStat return result; } + @Override public T[] getRHS() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java index d74678ca4..d34213f07 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/AbstractVariable.java @@ -52,10 +52,12 @@ public abstract class AbstractVariable extends NodeW return hashCode; } + @Override public int getOrderNumber() { return orderNumber; } + @Override public void setOrderNumber(int orderNumber) { this.orderNumber = orderNumber; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java index 4956e8377..9b6826792 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BitVectorVariable.java @@ -28,6 +28,7 @@ public class BitVectorVariable extends AbstractVariable { /* * @see com.ibm.wala.fixpoint.IVariable#copyState(com.ibm.wala.fixpoint.IVariable) */ + @Override public void copyState(BitVectorVariable other) { if (other == null) { throw new IllegalArgumentException("null other"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java index 2bd4e9059..9237b38ee 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/BooleanVariable.java @@ -28,6 +28,7 @@ public class BooleanVariable extends AbstractVariable { this.B = b; } + @Override public void copyState(BooleanVariable other) { if (other == null) { throw new IllegalArgumentException("other null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java index b76a74b0d..5955e6538 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/IntSetVariable.java @@ -24,6 +24,7 @@ public abstract class IntSetVariable extends AbstractV private MutableIntSet V; + @Override public void copyState(T other) { if (V == null) { if (other.V == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java index 95ef48cc8..aa9439d61 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java +++ b/com.ibm.wala.util/src/com/ibm/wala/fixpoint/UnaryStatement.java @@ -30,6 +30,7 @@ public abstract class UnaryStatement extends AbstractStatem * * @return true if the lhs value changed. false otherwise */ + @Override public byte evaluate() { UnaryOperator op = getOperator(); return op.evaluate(lhs, rhs); @@ -40,6 +41,7 @@ public abstract class UnaryStatement extends AbstractStatem * * @return the lattice cell this equation computes */ + @Override public T getLHS() { return lhs; } @@ -66,6 +68,7 @@ public abstract class UnaryStatement extends AbstractStatem * @param cell the cell in question * @return true or false */ + @Override public boolean hasVariable(T cell) { if (lhs == cell) return true; @@ -152,6 +155,7 @@ public abstract class UnaryStatement extends AbstractStatem return result; } + @Override public T[] getRHS() throws UnsupportedOperationException { // This should never be called ...use the more efficient getRightHandSide instead throw new UnsupportedOperationException(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java b/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java index 511aca236..d246b671d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/ProgressMaster.java @@ -44,6 +44,7 @@ public class ProgressMaster implements IProgressMonitor { return new ProgressMaster(monitor); } + @Override public synchronized void beginTask(String name, int totalWork) { delegate.beginTask(name, totalWork); startNanny(); @@ -72,6 +73,7 @@ public class ProgressMaster implements IProgressMonitor { return timedOut; } + @Override public synchronized void done() { killNanny(); delegate.done(); @@ -88,6 +90,7 @@ public class ProgressMaster implements IProgressMonitor { } } + @Override public boolean isCanceled() { return delegate.isCanceled() || timedOut; } @@ -96,6 +99,7 @@ public class ProgressMaster implements IProgressMonitor { killNanny(); } + @Override public synchronized void worked(int work) { killNanny(); delegate.worked(work); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java index c1711aec6..ec483e96c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/AbstractMultiMap.java @@ -60,6 +60,7 @@ abstract class AbstractMultiMap implements MultiMap { } + @Override public Set get(K key) { Set ret = map.get(key); if (ret == null) { @@ -78,6 +79,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#put(K, V) */ + @Override public boolean put(K key, V val) { Set vals = map.get(key); if (vals == null) { @@ -92,6 +94,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#remove(K, V) */ + @Override public boolean remove(K key, V val) { Set elems = map.get(key); if (elems == null) @@ -103,6 +106,7 @@ abstract class AbstractMultiMap implements MultiMap { return ret; } + @Override public Set removeAll(K key) { return map.remove(key); } @@ -112,6 +116,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#keys() */ + @Override public Set keySet() { return map.keySet(); } @@ -121,6 +126,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#containsKey(java.lang.Object) */ + @Override public boolean containsKey(K key) { return map.containsKey(key); } @@ -130,6 +136,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#size() */ + @Override public int size() { int ret = 0; for (K key : keySet()) { @@ -153,6 +160,7 @@ abstract class AbstractMultiMap implements MultiMap { * * @see AAA.util.MultiMap#putAll(K, java.util.Set) */ + @Override public boolean putAll(K key, Collection vals) { Set edges = map.get(key); if (edges == null) { @@ -162,10 +170,12 @@ abstract class AbstractMultiMap implements MultiMap { return edges.addAll(vals); } + @Override public void clear() { map.clear(); } + @Override public boolean isEmpty() { return map.isEmpty(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java index 9f8b0e0eb..afa0cb471 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArrayIterator.java @@ -76,10 +76,12 @@ public class ArrayIterator implements Iterator { this.last = last; } + @Override public boolean hasNext() { return _cnt <= last; } + @Override public T next() throws NoSuchElementException { if (_cnt >= _elts.length) { throw new NoSuchElementException(); @@ -87,6 +89,7 @@ public class ArrayIterator implements Iterator { return _elts[_cnt++]; } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java index f604f4d30..43b9d1b74 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ArraySet.java @@ -228,14 +228,17 @@ public class ArraySet extends AbstractSet { public ArraySetIterator() { } + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return ind < setSize; } + @Override public T next() { if (ind >= setSize) { throw new NoSuchElementException(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java index 701e3dc4e..16a2966e0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/BimodalMap.java @@ -44,6 +44,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#size() */ + @Override public int size() { return (backingStore == null) ? 0 : backingStore.size(); } @@ -51,6 +52,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#isEmpty() */ + @Override public boolean isEmpty() { return (backingStore == null) ? true : backingStore.isEmpty(); } @@ -58,6 +60,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#containsKey(java.lang.Object) */ + @Override public boolean containsKey(Object key) { return (backingStore == null) ? false : backingStore.containsKey(key); } @@ -65,6 +68,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#containsValue(java.lang.Object) */ + @Override public boolean containsValue(Object value) { return (backingStore == null) ? false : backingStore.containsValue(value); } @@ -72,6 +76,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#get(java.lang.Object) */ + @Override public V get(Object key) { return (backingStore == null) ? null : backingStore.get(key); } @@ -79,6 +84,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ + @Override public V put(K key, V value) { if (backingStore == null) { backingStore = new SmallMap(); @@ -114,6 +120,7 @@ public class BimodalMap implements Map { /** * @throws UnsupportedOperationException if the backingStore doesn't support remove */ + @Override public V remove(Object key) { return (backingStore == null) ? null : backingStore.remove(key); } @@ -121,6 +128,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#putAll(java.util.Map) */ + @Override @SuppressWarnings("unchecked") public void putAll(Map t) throws UnsupportedOperationException { if (t == null) { @@ -157,6 +165,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#clear() */ + @Override public void clear() { backingStore = null; } @@ -164,6 +173,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#keySet() */ + @Override @SuppressWarnings("unchecked") public Set keySet() { return (Set) ((backingStore == null) ? Collections.emptySet() : backingStore.keySet()); @@ -172,6 +182,7 @@ public class BimodalMap implements Map { /* * @see java.util.Map#values() */ + @Override @SuppressWarnings("unchecked") public Collection values() { return (Collection) ((backingStore == null) ? Collections.emptySet() : backingStore.values()); @@ -180,6 +191,7 @@ public class BimodalMap implements Map { /** * @throws UnimplementedError if the backingStore implementation does */ + @Override @SuppressWarnings("unchecked") public Set> entrySet() { return (Set>) ((backingStore == null) ? Collections.emptySet() : backingStore.entrySet()); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java index b5f4d7b1d..feb63ebff 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CollectionFilter.java @@ -31,6 +31,7 @@ public class CollectionFilter implements Filter { /* * @see com.ibm.wala.util.Filter#accepts(java.lang.Object) */ + @Override public boolean accepts(T o) { return S.contains(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java index 56b46277c..04e76da8c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ComposedIterator.java @@ -38,14 +38,17 @@ public abstract class ComposedIterator implements Iterator { public abstract Iterator makeInner(O outer); + @Override public void remove() throws UnsupportedOperationException{ throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return (inner != null); } + @Override public I next() { I result = inner.next(); if (!inner.hasNext()) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java index 273890489..35e7a8dc0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIntIterator.java @@ -40,11 +40,13 @@ public class CompoundIntIterator implements IntIterator { } + @Override public boolean hasNext() { return A.hasNext() || B.hasNext(); } + @Override public int next() { if (A.hasNext()) { return A.next(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java index ae59f965a..8ca0968ea 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/CompoundIterator.java @@ -28,10 +28,12 @@ public class CompoundIterator implements Iterator { this.B = B; } + @Override public boolean hasNext() { return A.hasNext() || B.hasNext(); } + @Override public T next() throws NoSuchElementException { if (A.hasNext()) { return A.next(); @@ -43,6 +45,7 @@ public class CompoundIterator implements Iterator { /** * @see java.util.Iterator#remove() */ + @Override public void remove() { } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java index 87f9b4a6c..f69e21399 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIntIterator.java @@ -32,10 +32,12 @@ public final class EmptyIntIterator implements IntIterator { private EmptyIntIterator() { } + @Override public boolean hasNext() { return false; } + @Override public int next() throws NoSuchElementException { throw new NoSuchElementException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java index 59138cebb..f053dbbed 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/EmptyIterator.java @@ -33,14 +33,17 @@ public final class EmptyIterator implements Iterator { private EmptyIterator() { } + @Override public boolean hasNext() { return false; } + @Override public T next() { throw new NoSuchElementException(); } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java index b935e4143..d96095532 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/FilterIterator.java @@ -58,6 +58,7 @@ public class FilterIterator implements java.util.Iterator { done = true; } + @Override public T next() throws NoSuchElementException { if (done) { throw new java.util.NoSuchElementException(); @@ -67,10 +68,12 @@ public class FilterIterator implements java.util.Iterator { return o; } + @Override public boolean hasNext() { return !done; } + @Override public void remove() throws UnsupportedOperationException { throw new java.lang.UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java index 4c141bc86..5bac2669c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Filtersection.java @@ -30,6 +30,7 @@ public class Filtersection implements Filter { } } + @Override public boolean accepts(T o) { return a.accepts(o) && b.accepts(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java index 0c85fe286..ed310f08b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/HashCodeComparator.java @@ -23,6 +23,7 @@ public class HashCodeComparator implements Comparator { /* * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ + @Override public int compare(T o1, T o2) throws NullPointerException { // by convention null is less than non-null if (o1 == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java index 60832aa22..f2a89ab22 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ImmutableStack.java @@ -250,7 +250,8 @@ public class ImmutableStack implements Iterable { return new ImmutableStack(tmpEntries); } - public Iterator iterator() { + @Override + public Iterator iterator() { if (entries.length == 0) { return EmptyIterator.instance(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java index 966f24f2e..7963e8320 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IndiscriminateFilter.java @@ -24,6 +24,7 @@ public class IndiscriminateFilter implements Filter { /* * @see com.ibm.wala.util.Filter#accepts(java.lang.Object) */ + @Override public boolean accepts(Object o) { return true; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java index 83d0f1fc5..441cf70e4 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IntMapIterator.java @@ -34,14 +34,17 @@ public class IntMapIterator implements Iterator { this.f = f; } + @Override public T next() { return f.apply(i.next()); } + @Override public boolean hasNext() { return i.hasNext(); } + @Override public void remove() throws UnsupportedOperationException { throw new java.lang.UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java index b10c0036d..22ebc90df 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Collection.java @@ -54,6 +54,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#size() */ + @Override public int size() { return getDelegate().size(); } @@ -61,6 +62,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#clear() */ + @Override public void clear() { getDelegate().clear(); } @@ -68,6 +70,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#isEmpty() */ + @Override public boolean isEmpty() { return getDelegate().isEmpty(); } @@ -75,6 +78,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#toArray() */ + @Override public Object[] toArray() { return getDelegate().toArray(); } @@ -82,6 +86,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#add(java.lang.Object) */ + @Override public boolean add(T arg0) { return getDelegate().add(arg0); } @@ -89,6 +94,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#contains(java.lang.Object) */ + @Override public boolean contains(Object arg0) { return getDelegate().contains(arg0); } @@ -96,6 +102,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#remove(java.lang.Object) */ + @Override public boolean remove(Object arg0) { return getDelegate().remove(arg0); } @@ -103,6 +110,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#addAll(java.util.Collection) */ + @Override public boolean addAll(Collection arg0) { return getDelegate().addAll(arg0); } @@ -110,6 +118,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#containsAll(java.util.Collection) */ + @Override public boolean containsAll(Collection arg0) { return getDelegate().containsAll(arg0); } @@ -117,6 +126,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#removeAll(java.util.Collection) */ + @Override public boolean removeAll(Collection arg0) { return getDelegate().removeAll(arg0); } @@ -124,6 +134,7 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#retainAll(java.util.Collection) */ + @Override public boolean retainAll(Collection arg0) { return getDelegate().retainAll(arg0); } @@ -131,10 +142,12 @@ public abstract class Iterator2Collection implements Collection { /* * @see java.util.Collection#iterator() */ + @Override public Iterator iterator() { return getDelegate().iterator(); } + @Override @SuppressWarnings("hiding") public T[] toArray(T[] a) { return getDelegate().toArray(a); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java index fc9cd17c0..ba5b756c3 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2Iterable.java @@ -27,6 +27,7 @@ public class Iterator2Iterable implements Iterable { this.iter = iter; } + @Override public Iterator iterator() { return iter; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java index 48d21d068..aef864745 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Iterator2List.java @@ -26,42 +26,52 @@ public class Iterator2List extends Iterator2Collection implements List } } + @Override public void add(int index, T element) { delegate.add(index, element); } + @Override public boolean addAll(int index, Collection c) { return delegate.addAll(index, c); } + @Override public T get(int index) { return delegate.get(index); } + @Override public int indexOf(Object o) { return delegate.indexOf(o); } + @Override public int lastIndexOf(Object o) { return delegate.lastIndexOf(o); } + @Override public ListIterator listIterator() { return delegate.listIterator(); } + @Override public ListIterator listIterator(int index) { return delegate.listIterator(index); } + @Override public T remove(int index) { return delegate.remove(index); } + @Override public T set(int index, T element) { return delegate.set(index, element); } + @Override public List subList(int fromIndex, int toIndex) { return delegate.subList(fromIndex, toIndex); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java index decb755a8..c9a5166e7 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusOne.java @@ -33,10 +33,12 @@ public class IteratorPlusOne implements Iterator { this.xtra = xtra; } + @Override public boolean hasNext() { return it.hasNext() || (xtra != null); } + @Override public T next() { if (it.hasNext()) { return it.next(); @@ -47,6 +49,7 @@ public class IteratorPlusOne implements Iterator { } } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java index 8831b76e3..5fe2b0364 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/IteratorPlusTwo.java @@ -30,10 +30,12 @@ public class IteratorPlusTwo implements Iterator { this.xtra2 = xtra2; } + @Override public boolean hasNext() { return it.hasNext() || (xtra1 != null) || (xtra2 != null); } + @Override public T next() { if (it.hasNext()) { return it.next(); @@ -48,6 +50,7 @@ public class IteratorPlusTwo implements Iterator { } } + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java index 11f9686d1..9cff3e485 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MapIterator.java @@ -30,14 +30,17 @@ public class MapIterator implements Iterator { this.f = f; } + @Override public Y next() { return f.apply(i.next()); } + @Override public boolean hasNext() { return i.hasNext(); } + @Override public void remove() throws UnsupportedOperationException { throw new java.lang.UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java index b72067f51..759fb55e0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/MultiMap.java @@ -54,6 +54,7 @@ public interface MultiMap { public int size(); + @Override public String toString(); public boolean putAll(K key, Collection vals); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java index b46ebbf7d..2e8c0305f 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/NonNullSingletonIterator.java @@ -31,10 +31,12 @@ public class NonNullSingletonIterator implements Iterator { this.it = o; } + @Override public boolean hasNext() { return it != null; } + @Override public T next() { if (it == null) { throw new NoSuchElementException(); @@ -45,6 +47,7 @@ public class NonNullSingletonIterator implements Iterator { } } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java index 1c78becab..8fd99a79b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ObjectArrayMapping.java @@ -40,6 +40,7 @@ public class ObjectArrayMapping implements OrdinalSetMapping { } } + @Override public T getMappedObject(int n) throws NoSuchElementException { try { return array[n]; @@ -48,6 +49,7 @@ public class ObjectArrayMapping implements OrdinalSetMapping { } } + @Override public int getMappedIndex(Object o) { if (map.get(o) == null) { return -1; @@ -55,23 +57,28 @@ public class ObjectArrayMapping implements OrdinalSetMapping { return map.get(o).intValue(); } + @Override public boolean hasMappedIndex(Object o) { return map.get(o) != null; } + @Override public Iterator iterator() { return map.keySet().iterator(); } + @Override public int add(Object o) throws UnimplementedError { Assertions.UNREACHABLE(); return 0; } + @Override public int getMaximumIndex() { return array.length - 1; } + @Override public int getSize() { return map.size(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java index 96751699d..963231bde 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/OrFilter.java @@ -30,6 +30,7 @@ public class OrFilter implements Filter { this.b = b; } + @Override public boolean accepts(T o) { return a.accepts(o) || b.accepts(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java index 2f70da11b..bf2c8272d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/Pair.java @@ -48,10 +48,12 @@ public class Pair { return new Iterator() { byte next = 1; + @Override public boolean hasNext() { return next > 0; } + @Override public Object next() { switch (next) { case 1 : @@ -65,6 +67,7 @@ public class Pair { } } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java index 2647dd5a1..e89a2d788 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ReverseIterator.java @@ -38,10 +38,12 @@ public class ReverseIterator implements Iterator { nextIndex = list.size() - 1; } + @Override public boolean hasNext() { return nextIndex > -1; } + @Override public T next() throws NoSuchElementException { if (!hasNext()) { throw new NoSuchElementException(); @@ -49,6 +51,7 @@ public class ReverseIterator implements Iterator { return list.get(nextIndex--); } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java index 783466c0b..9ceef764b 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SimpleVector.java @@ -32,6 +32,7 @@ public class SimpleVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#get(int) */ + @Override @SuppressWarnings("unchecked") public T get(int x) { if (x < 0) { @@ -47,6 +48,7 @@ public class SimpleVector implements IVector { /* * @see com.ibm.wala.util.intset.IVector#set(int, int) */ + @Override public void set(int x, T value) { if (x < 0) { throw new IllegalArgumentException("illegal x value " + x); @@ -81,6 +83,7 @@ public class SimpleVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#reportStats() */ + @Override public void performVerboseAction() { System.err.println(("size: " + store.length)); System.err.println(("occupancy: " + computeOccupancy())); @@ -100,6 +103,7 @@ public class SimpleVector implements IVector { } + @Override @SuppressWarnings("unchecked") public Iterator iterator() { ArrayList result = new ArrayList(); @@ -109,6 +113,7 @@ public class SimpleVector implements IVector { return result.iterator(); } + @Override public int getMaxIndex() { return maxIndex; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java index 51d5861c1..c14c9fd50 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SmallMap.java @@ -35,6 +35,7 @@ public class SmallMap implements Map { /* */ + @Override public int size() { if (keysAndValues == null) { return 0; @@ -79,6 +80,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#isEmpty() */ + @Override public boolean isEmpty() { return (keysAndValues == null); } @@ -86,6 +88,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#containsKey(java.lang.Object) */ + @Override public boolean containsKey(Object key) { for (int i = 0; i < size(); i++) { if (keysAndValues[i].equals(key)) { @@ -98,6 +101,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#containsValue(java.lang.Object) */ + @Override public boolean containsValue(Object value) { if (keysAndValues == null) { return false; @@ -120,6 +124,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#get(java.lang.Object) */ + @Override @SuppressWarnings("unchecked") public V get(Object key) { @@ -149,6 +154,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ + @Override @SuppressWarnings({ "unchecked", "unused" }) public V put(Object key, Object value) { if (key == null) { @@ -173,6 +179,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#remove(java.lang.Object) */ + @Override public V remove(Object key) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -180,6 +187,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#putAll(java.util.Map) */ + @Override public void putAll(Map t) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @@ -187,6 +195,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#clear() */ + @Override public void clear() { keysAndValues = null; } @@ -194,6 +203,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#keySet() */ + @Override @SuppressWarnings("unchecked") public Set keySet() { // TODO: use a better set implementation, SOON!! @@ -207,6 +217,7 @@ public class SmallMap implements Map { /* * @see java.util.Map#values() */ + @Override @SuppressWarnings("unchecked") public Collection values() { int s = size(); @@ -223,6 +234,7 @@ public class SmallMap implements Map { /** * @throws UnimplementedError */ + @Override public Set> entrySet() throws UnimplementedError { Assertions.UNREACHABLE("must implement entrySet"); return null; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java index a530f07b7..82e75aba2 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/SparseVector.java @@ -53,6 +53,7 @@ public class SparseVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#get(int) */ + @Override @SuppressWarnings("unchecked") public T get(int x) { int index = indices.getIndex(x); @@ -68,6 +69,7 @@ public class SparseVector implements IVector { * * @see com.ibm.wala.util.intset.IntVector#set(int, int) */ + @Override public void set(int x, T value) { int index = indices.getIndex(x); if (index == -1) { @@ -92,6 +94,7 @@ public class SparseVector implements IVector { /* * @see com.ibm.wala.util.debug.VerboseAction#performVerboseAction() */ + @Override public void performVerboseAction() { System.err.println((getClass() + " stats: ")); System.err.println(("data.length " + data.length)); @@ -102,15 +105,18 @@ public class SparseVector implements IVector { /* * @see com.ibm.wala.util.intset.IVector#iterator() */ + @Override public Iterator iterator() { return new Iterator() { int i = 0; + @Override public boolean hasNext() { return i < indices.size(); } + @Override @SuppressWarnings("unchecked") public T next() { if (!hasNext()) { @@ -119,6 +125,7 @@ public class SparseVector implements IVector { return (T) data[i++]; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -130,6 +137,7 @@ public class SparseVector implements IVector { /** * @return max i s.t get(i) != null */ + @Override public int getMaxIndex() throws IllegalStateException { return indices.max(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java index 42c2397c0..161fc3d19 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/ToStringComparator.java @@ -25,6 +25,7 @@ public class ToStringComparator implements Comparator { /* * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ + @Override public int compare(T o1, T o2) throws NullPointerException { // by convention, null is the least element if (o1 == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java b/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java index d28e8f29a..26c59d53c 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/collections/TwoLevelVector.java @@ -36,6 +36,7 @@ public class TwoLevelVector implements IVector { /* * @see com.ibm.wala.util.intset.IntVector#get(int) */ + @Override public T get(int x) { if (x < 0) { throw new IllegalArgumentException("invalid x: " + x); @@ -65,6 +66,7 @@ public class TwoLevelVector implements IVector { * * @see com.ibm.wala.util.intset.IntVector#set(int, int) */ + @Override public void set(int x, T value) { if (x < 0) { throw new IllegalArgumentException("illegal x: " + x); @@ -100,6 +102,7 @@ public class TwoLevelVector implements IVector { /* * @see com.ibm.wala.util.debug.VerboseAction#performVerboseAction() */ + @Override public void performVerboseAction() { // do nothing; } @@ -107,6 +110,7 @@ public class TwoLevelVector implements IVector { /* * @see com.ibm.wala.util.intset.IVector#iterator() */ + @Override public Iterator iterator() { return new Iterator() { final Iterator> outer = data.iterator(); @@ -125,10 +129,12 @@ public class TwoLevelVector implements IVector { } } + @Override public boolean hasNext() { return inner != null; } + @Override public T next() { T result = inner.next(); if (!inner.hasNext()) { @@ -147,6 +153,7 @@ public class TwoLevelVector implements IVector { return result; } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -154,6 +161,7 @@ public class TwoLevelVector implements IVector { }; } + @Override public int getMaxIndex() { if (maxPage == -1) { return -1; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java index da0aeeea0..94b8d9253 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractGraph.java @@ -30,6 +30,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.Graph#iterateNodes() */ + @Override public Iterator iterator() { return getNodeManager().iterator(); } @@ -37,6 +38,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.Graph#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return getNodeManager().getNumberOfNodes(); } @@ -44,6 +46,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(java.lang.Object) */ + @Override public int getPredNodeCount(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("n cannot be null"); @@ -54,6 +57,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(java.lang.Object) */ + @Override public Iterator getPredNodes(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("n cannot be null"); @@ -64,6 +68,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(java.lang.Object) */ + @Override public int getSuccNodeCount(T n) throws IllegalArgumentException { if (!containsNode(n) || n == null) { throw new IllegalArgumentException("node not in graph " + n); @@ -74,6 +79,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(java.lang.Object) */ + @Override public Iterator getSuccNodes(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("n cannot be null"); @@ -84,6 +90,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(T n) { getNodeManager().addNode(n); } @@ -92,6 +99,7 @@ public abstract class AbstractGraph implements Graph { * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, * com.ibm.wala.util.graph.Node) */ + @Override public void addEdge(T src, T dst) throws IllegalArgumentException { getEdgeManager().addEdge(src, dst); } @@ -99,6 +107,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdge(java.lang.Object, java.lang.Object) */ + @Override public void removeEdge(T src, T dst) throws IllegalArgumentException { getEdgeManager().removeEdge(src, dst); } @@ -106,6 +115,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#hasEdge(java.lang.Object, java.lang.Object) */ + @Override public boolean hasEdge(T src, T dst) { if (src == null) { throw new IllegalArgumentException("src is null"); @@ -119,6 +129,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -129,6 +140,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -139,6 +151,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -149,6 +162,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.Graph#removeNode(com.ibm.wala.util.graph.Node) */ + @Override public void removeNodeAndEdges(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -160,6 +174,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) throws IllegalArgumentException { if (n == null) { throw new IllegalArgumentException("N cannot be null"); @@ -187,6 +202,7 @@ public abstract class AbstractGraph implements Graph { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T n) { if (n == null) { throw new IllegalArgumentException("n cannot be null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java index ed630b9cc..431a1756d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/AbstractNumberedGraph.java @@ -23,16 +23,19 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /** * @return the object which manages nodes in the graph */ + @Override protected abstract NumberedNodeManager getNodeManager(); /** * @return the object which manages edges in the graph */ + @Override protected abstract NumberedEdgeManager getEdgeManager(); /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getMaxNumber() */ + @Override public int getMaxNumber() { return getNodeManager().getMaxNumber(); } @@ -40,6 +43,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNode(int) */ + @Override public T getNode(int number) { return getNodeManager().getNode(number); } @@ -47,6 +51,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedNodeManager#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(T N) { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -57,6 +62,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(final IntSet s) { return new NumberedNodeIterator(s, this); } @@ -64,6 +70,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedEdgeManager#getPredNodeNumbers(java.lang.Object) */ + @Override public IntSet getPredNodeNumbers(T node) throws IllegalArgumentException { assert getEdgeManager() != null; return getEdgeManager().getPredNodeNumbers(node); @@ -72,6 +79,7 @@ public abstract class AbstractNumberedGraph extends AbstractGraph implemen /* * @see com.ibm.wala.util.graph.NumberedEdgeManager#getSuccNodeNumbers(java.lang.Object) */ + @Override public IntSet getSuccNodeNumbers(T node) throws IllegalArgumentException { return getEdgeManager().getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java index bc91b0ae8..4fa778937 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/EdgeFilteredNumberedGraph.java @@ -49,51 +49,62 @@ public class EdgeFilteredNumberedGraph extends AbstractNumberedGraph { private final class Edges implements NumberedEdgeManager { + @Override public void addEdge(T src, T dst) { Assertions.UNREACHABLE(); } + @Override public int getPredNodeCount(T N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getPredNodes(T N) { Assertions.UNREACHABLE(); return null; } + @Override public int getSuccNodeCount(T N) { Assertions.UNREACHABLE(); return 0; } + @Override public Iterator getSuccNodes(T N) { Assertions.UNREACHABLE(); return null; } + @Override public boolean hasEdge(T src, T dst) { Assertions.UNREACHABLE(); return false; } + @Override public void removeAllIncidentEdges(T node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeEdge(T src, T dst) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(T node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(T node) throws UnsupportedOperationException { Assertions.UNREACHABLE(); } + @Override public IntSet getPredNodeNumbers(T node) { IntSet s = delegate.getPredNodeNumbers(node); MutableIntSet result = MutableSparseIntSet.makeEmpty(); @@ -106,6 +117,7 @@ public class EdgeFilteredNumberedGraph extends AbstractNumberedGraph { return result; } + @Override public IntSet getSuccNodeNumbers(T node) { Assertions.UNREACHABLE(); return null; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java index 7ff21d2ba..0885de27e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphReachability.java @@ -94,6 +94,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#getNodeTransferFunction(java.lang.Object) */ + @Override public UnaryOperator getNodeTransferFunction(T n) { int index = domain.getMappedIndex(n); if (index > -1) { @@ -106,6 +107,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#hasNodeTransferFunctions() */ + @Override public boolean hasNodeTransferFunctions() { return true; } @@ -113,6 +115,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#getEdgeTransferFunction(java.lang.Object, java.lang.Object) */ + @Override public UnaryOperator getEdgeTransferFunction(Object from, Object to) { Assertions.UNREACHABLE(); return null; @@ -121,6 +124,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#hasEdgeTransferFunctions() */ + @Override public boolean hasEdgeTransferFunctions() { return false; } @@ -128,6 +132,7 @@ public class GraphReachability { /* * @see com.ibm.wala.dataflow.graph.ITransferFunctionProvider#getMeetOperator() */ + @Override public AbstractMeetOperator getMeetOperator() { return BitVectorUnion.instance(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java index 755adaa45..0028ff087 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/GraphSlicer.java @@ -82,10 +82,12 @@ public class GraphSlicer { final NodeManager n = new NodeManager() { int nodeCount = -1; + @Override public Iterator iterator() { return Predicate.filter(g.iterator(), p).iterator(); } + @Override public int getNumberOfNodes() { if (nodeCount == -1) { nodeCount = IteratorUtil.count(iterator()); @@ -93,14 +95,17 @@ public class GraphSlicer { return nodeCount; } + @Override public void addNode(T n) { Assertions.UNREACHABLE(); } + @Override public void removeNode(T n) { Assertions.UNREACHABLE(); } + @Override public boolean containsNode(T n) { return p.test(n) && g.containsNode(n); } @@ -108,42 +113,52 @@ public class GraphSlicer { }; final EdgeManager e = new EdgeManager() { + @Override public Iterator getPredNodes(T n) { return Predicate.filter(g.getPredNodes(n), p).iterator(); } + @Override public int getPredNodeCount(T n) { return IteratorUtil.count(getPredNodes(n)); } + @Override public Iterator getSuccNodes(T n) { return Predicate.filter(g.getSuccNodes(n), p).iterator(); } + @Override public int getSuccNodeCount(T N) { return IteratorUtil.count(getSuccNodes(N)); } + @Override public void addEdge(T src, T dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(T src, T dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(T node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(T node) { Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(T node) { Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(T src, T dst) { return g.hasEdge(src, dst) && p.test(src) && p.test(dst); } @@ -170,14 +185,17 @@ public class GraphSlicer { final NodeManager nodeManager = new NodeManager() { private int count = -1; + @Override public void addNode(E n) { throw new UnsupportedOperationException(); } + @Override public boolean containsNode(E N) { return G.containsNode(N) && fmember.accepts(N); } + @Override public int getNumberOfNodes() { if (count == -1) { count = IteratorUtil.count(iterator()); @@ -185,10 +203,12 @@ public class GraphSlicer { return count; } + @Override public Iterator iterator() { return new FilterIterator(G.iterator(), fmember); } + @Override public void removeNode(E n) { throw new UnsupportedOperationException(); } @@ -229,6 +249,7 @@ public class GraphSlicer { private void setPredNodes(E N) { preds.put(N, getConnected(N, new Function>() { + @Override public Iterator apply(E object) { return G.getPredNodes(object); } @@ -237,12 +258,14 @@ public class GraphSlicer { private void setSuccNodes(E N) { succs.put(N, getConnected(N, new Function>() { + @Override public Iterator apply(E object) { return G.getSuccNodes(object); } })); } + @Override public int getPredNodeCount(E N) { if (!preds.containsKey(N)) { setPredNodes(N); @@ -250,6 +273,7 @@ public class GraphSlicer { return preds.get(N).size(); } + @Override public Iterator getPredNodes(E N) { if (!preds.containsKey(N)) { setPredNodes(N); @@ -257,6 +281,7 @@ public class GraphSlicer { return preds.get(N).iterator(); } + @Override public int getSuccNodeCount(E N) { if (!succs.containsKey(N)) { setSuccNodes(N); @@ -264,6 +289,7 @@ public class GraphSlicer { return succs.get(N).size(); } + @Override public Iterator getSuccNodes(E N) { if (!succs.containsKey(N)) { setSuccNodes(N); @@ -271,6 +297,7 @@ public class GraphSlicer { return succs.get(N).iterator(); } + @Override public boolean hasEdge(E src, E dst) { if (!preds.containsKey(dst)) { setPredNodes(dst); @@ -278,22 +305,27 @@ public class GraphSlicer { return preds.get(dst).contains(src); } + @Override public void addEdge(E src, E dst) { throw new UnsupportedOperationException(); } + @Override public void removeAllIncidentEdges(E node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeEdge(E src, E dst) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeIncomingEdges(E node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } + @Override public void removeOutgoingEdges(E node) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java index 7464546c6..26d255933 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/NodeManager.java @@ -26,6 +26,7 @@ public interface NodeManager extends Iterable { /** * @return an {@link Iterator} of the nodes in this graph */ + @Override public Iterator iterator(); /** diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java index 3e3b5ddfd..3ccc5f868 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/dominators/Dominators.java @@ -116,14 +116,17 @@ public abstract class Dominators { return new Iterator() { private T current = node; + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return current != null; } + @Override public T next() { if (current == null) throw new NoSuchElementException(); @@ -165,6 +168,7 @@ public abstract class Dominators { } } + @Override public Iterator getPredNodes(T N) { if (N == root) return EmptyIterator.instance(); @@ -172,10 +176,12 @@ public abstract class Dominators { return new NonNullSingletonIterator(getIdom(N)); } + @Override public int getPredNodeCount(Object N) { return (N == root) ? 0 : 1; } + @Override public Iterator getSuccNodes(Object N) { if (nextMap.containsKey(N)) return nextMap.get(N).iterator(); @@ -183,6 +189,7 @@ public abstract class Dominators { return EmptyIterator.instance(); } + @Override public int getSuccNodeCount(Object N) { if (nextMap.containsKey(N)) return nextMap.get(N).size(); @@ -190,30 +197,36 @@ public abstract class Dominators { return 0; } + @Override public void addEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeEdge(Object src, Object dst) { Assertions.UNREACHABLE(); } + @Override public void removeAllIncidentEdges(Object node) { Assertions.UNREACHABLE(); } + @Override public void removeIncomingEdges(Object node) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } + @Override public void removeOutgoingEdges(Object node) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); } + @Override public boolean hasEdge(Object src, Object dst) { // TODO Auto-generated method stub Assertions.UNREACHABLE(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java index a67954686..aee118f10 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicNodeManager.java @@ -24,6 +24,7 @@ public class BasicNodeManager implements NodeManager { final private HashSet nodes = HashSetFactory.make(); + @Override public Iterator iterator() { return nodes.iterator(); } @@ -31,6 +32,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return nodes.size(); } @@ -38,6 +40,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#addNode(com.ibm.wala.util.graph.Node) */ + @Override public void addNode(T n) { nodes.add(n); } @@ -45,6 +48,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) { nodes.remove(n); } @@ -52,6 +56,7 @@ public class BasicNodeManager implements NodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T N) { return nodes.contains(N); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java index 27a483d8c..4b95f7266 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/BasicOrderedMultiGraph.java @@ -40,6 +40,7 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { /** * Add this edge, unconditionally setting it as the next successor. */ + @Override public void addEdge(T src, T dst) throws IllegalArgumentException { delegate.addEdge(src, dst); SimpleVector s = successorEdges.get(src); @@ -50,6 +51,7 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { s.set(s.getMaxIndex() + 1, dst); } + @Override public void addEdge(int i, T src, T dst) throws IllegalArgumentException { delegate.addEdge(src, dst); SimpleVector s = successorEdges.get(src); @@ -60,18 +62,22 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { s.set(i, dst); } + @Override public void addNode(T n) { delegate.addNode(n); } + @Override public boolean containsNode(T N) { return delegate.containsNode(N); } + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException { return delegate.getPredNodeCount(N); } @@ -79,56 +85,68 @@ public class BasicOrderedMultiGraph implements OrderedMultiGraph { /** * For now, this returns nodes in no particular order! Fix this when needed. */ + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { return delegate.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException { return delegate.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException { return delegate.getSuccNodes(N); } + @Override public boolean hasEdge(T src, T dst) { return delegate.hasEdge(src, dst); } + @Override public Iterator iterator() { return delegate.iterator(); } + @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeAllIncidentEdges(node); } + @Override public void removeEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeEdge(src, dst); } + @Override public void removeIncomingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeIncomingEdges(node); } + @Override public void removeNode(T n) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeNode(n); } + @Override public void removeNodeAndEdges(T N) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeNodeAndEdges(N); } + @Override public void removeOutgoingEdges(T node) throws UnimplementedError { Assertions.UNREACHABLE(); delegate.removeOutgoingEdges(node); } + @Override public T getSuccessor(T node, int i) throws IllegalArgumentException { SimpleVector s = successorEdges.get(node); if (s == null) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java index 024e55583..56c8dca27 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingGraph.java @@ -28,18 +28,22 @@ public class DelegatingGraph implements Graph { this.delegate = delegate; } + @Override public void addEdge(T src, T dst) throws IllegalArgumentException { delegate.addEdge(src, dst); } + @Override public void addNode(T n) { delegate.addNode(n); } + @Override public boolean containsNode(T N) { return delegate.containsNode(N); } + @Override public int getNumberOfNodes() { return delegate.getNumberOfNodes(); } @@ -49,50 +53,62 @@ public class DelegatingGraph implements Graph { return delegate.toString(); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException { return delegate.getPredNodeCount(N); } + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { return delegate.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException { return delegate.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException { return delegate.getSuccNodes(N); } + @Override public boolean hasEdge(T src, T dst) { return delegate.hasEdge(src, dst); } + @Override public Iterator iterator() { return delegate.iterator(); } + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { delegate.removeAllIncidentEdges(node); } + @Override public void removeEdge(T src, T dst) throws IllegalArgumentException { delegate.removeEdge(src, dst); } + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException { delegate.removeIncomingEdges(node); } + @Override public void removeNode(T n) { delegate.removeNode(n); } + @Override public void removeNodeAndEdges(T N) throws IllegalArgumentException { delegate.removeNodeAndEdges(N); } + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { delegate.removeOutgoingEdges(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java index ff2baaafd..38ff3e9f1 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedEdgeManager.java @@ -44,14 +44,17 @@ public class DelegatingNumberedEdgeManager imp this.delegate = delegate; } + @Override public boolean hasNext() { return delegate.hasNext(); } + @Override public T next() { return nodeManager.getNode(delegate.next()); } + @Override public void remove() { // TODO Auto-generated method stub Assertions.UNREACHABLE(); @@ -61,6 +64,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -71,6 +75,7 @@ public class DelegatingNumberedEdgeManager imp return (pred == null) ? empty : (Iterator) new IntSetNodeIterator(pred.intIterator()); } + @Override public IntSet getPredNodeNumbers(T node) { if (node == null) { throw new IllegalArgumentException("N cannot be null"); @@ -83,6 +88,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getPredNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getPredNodeCount(T N) throws IllegalArgumentException { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -99,6 +105,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodes(com.ibm.wala.util.graph.Node) */ + @Override public Iterator getSuccNodes(T N) { if (N == null) { throw new IllegalArgumentException("N cannot be null"); @@ -112,6 +119,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#getSuccNodeCount(com.ibm.wala.util.graph.Node) */ + @Override public int getSuccNodeCount(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -124,6 +132,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#addEdge(com.ibm.wala.util.graph.Node, com.ibm.wala.util.graph.Node) */ + @Override public void addEdge(T src, T dst) { if (dst == null || src == null) { throw new IllegalArgumentException("parameter is null"); @@ -132,6 +141,7 @@ public class DelegatingNumberedEdgeManager imp dst.addPred(src.getGraphNodeId()); } + @Override public void removeEdge(T src, T dst) throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } @@ -139,6 +149,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeAllIncidentEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node is null"); @@ -150,6 +161,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeIncomingEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -161,6 +173,7 @@ public class DelegatingNumberedEdgeManager imp /* * @see com.ibm.wala.util.graph.EdgeManager#removeEdges(com.ibm.wala.util.graph.Node) */ + @Override public void removeOutgoingEdges(T node) throws UnimplementedError { if (node == null) { throw new IllegalArgumentException("node cannot be null"); @@ -169,6 +182,7 @@ public class DelegatingNumberedEdgeManager imp n.removeOutgoingEdges(); } + @Override public boolean hasEdge(T src, T dst) throws IllegalArgumentException { if (dst == null) { throw new IllegalArgumentException("dst == null"); @@ -176,6 +190,7 @@ public class DelegatingNumberedEdgeManager imp return getSuccNodeNumbers(src).contains(dst.getGraphNodeId()); } + @Override public IntSet getSuccNodeNumbers(T node) { if (node == null) { throw new IllegalArgumentException("node cannot be null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java index 09542fe8c..9f23fec37 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/DelegatingNumberedNodeManager.java @@ -35,6 +35,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NumberedGraph#getNumber(com.ibm.wala.util.graph.Node) */ + @Override public int getNumber(T N) { if (N == null) { throw new IllegalArgumentException("N is null"); @@ -43,6 +44,7 @@ public class DelegatingNumberedNodeManager implements return n.getGraphNodeId(); } + @Override @SuppressWarnings("unchecked") public T getNode(int number) { try { @@ -55,6 +57,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NumberedGraph#getMaxNumber() */ + @Override public int getMaxNumber() { return maxNumber; } @@ -62,6 +65,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.Graph#iterateNodes() */ + @Override public Iterator iterator() { final INodeWithNumber[] arr = nodes; return new Iterator() { @@ -80,10 +84,12 @@ public class DelegatingNumberedNodeManager implements next = -1; } + @Override public boolean hasNext() { return next != -1; } + @Override @SuppressWarnings("unchecked") public T next() { if (hasNext()) { @@ -95,6 +101,7 @@ public class DelegatingNumberedNodeManager implements } } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -104,6 +111,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.Graph#getNumberOfNodes() */ + @Override public int getNumberOfNodes() { return numberOfNodes; } @@ -114,6 +122,7 @@ public class DelegatingNumberedNodeManager implements * @see com.ibm.wala.util.graph.NodeManager#addNode(java.lang.Object) * @throws IllegalArgumentException if n is null */ + @Override public void addNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -152,6 +161,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -183,6 +193,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -208,6 +219,7 @@ public class DelegatingNumberedNodeManager implements /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java index 7b4f2ea0a..96c5e1de8 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingEdgeManager.java @@ -28,43 +28,53 @@ public class InvertingEdgeManager implements EdgeManager { this.original = original; } + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException { return original.getSuccNodes(N); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException{ return original.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException{ return original.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException{ return original.getPredNodeCount(N); } + @Override public void addEdge(T src, T dst)throws IllegalArgumentException { original.addEdge(dst, src); } + @Override public void removeEdge(T src, T dst) throws IllegalArgumentException{ original.removeEdge(dst, src); } + @Override public boolean hasEdge(T src, T dst) { return original.hasEdge(dst, src); } + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { original.removeAllIncidentEdges(node); } + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException{ original.removeOutgoingEdges(node); } + @Override public void removeOutgoingEdges(T node)throws IllegalArgumentException { original.removeIncomingEdges(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java index 2931a8400..fff03b480 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/InvertingNumberedEdgeManager.java @@ -29,50 +29,62 @@ public class InvertingNumberedEdgeManager implements NumberedEdgeManager { this.original = original; } + @Override public Iterator getPredNodes(T N) throws IllegalArgumentException{ return original.getSuccNodes(N); } + @Override public int getPredNodeCount(T N) throws IllegalArgumentException{ return original.getSuccNodeCount(N); } + @Override public Iterator getSuccNodes(T N) throws IllegalArgumentException{ return original.getPredNodes(N); } + @Override public int getSuccNodeCount(T N) throws IllegalArgumentException{ return original.getPredNodeCount(N); } + @Override public void addEdge(T src, T dst) throws IllegalArgumentException{ original.addEdge(dst, src); } + @Override public void removeEdge(T src, T dst)throws IllegalArgumentException { original.removeEdge(dst, src); } + @Override public boolean hasEdge(T src, T dst) { return original.hasEdge(dst, src); } + @Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException{ original.removeAllIncidentEdges(node); } + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException{ original.removeOutgoingEdges(node); } + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException{ original.removeIncomingEdges(node); } + @Override public IntSet getSuccNodeNumbers(T node) throws IllegalArgumentException{ return original.getPredNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(T node) throws IllegalArgumentException{ return original.getSuccNodeNumbers(node); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java index 0fefceb43..5b33cb183 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumber.java @@ -26,10 +26,12 @@ public class NodeWithNumber implements INodeWithNumber { /** * @return the number which identifies this node in the numbered graph */ + @Override public int getGraphNodeId() { return number; } + @Override public void setGraphNodeId(int i) { number = i; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java index 07d33688f..44f6b6d73 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NodeWithNumberedEdges.java @@ -25,10 +25,12 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu private BimodalMutableIntSet succNumbers; + @Override public IntSet getSuccNumbers() { return succNumbers; } + @Override public IntSet getPredNumbers() { return predNumbers; } @@ -39,6 +41,7 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu * @param eqNumber * the equation number */ + @Override public void addSucc(int eqNumber) { if (succNumbers == null) { succNumbers = new BimodalMutableIntSet(); @@ -54,6 +57,7 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu * @param eqNumber * the equation number */ + @Override public void addPred(int eqNumber) { if (predNumbers == null) { predNumbers = new BimodalMutableIntSet(); @@ -95,15 +99,18 @@ public class NodeWithNumberedEdges extends NodeWithNumber implements INodeWithNu /* * @see com.ibm.wala.util.graph.INodeWithNumberedEdges#removeAllIncidentEdges() */ + @Override public void removeAllIncidentEdges() throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } + @Override public void removeIncomingEdges() throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); } + @Override public void removeOutgoingEdges() throws UnimplementedError { Assertions.UNREACHABLE("Implement me"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java index fba3fc791..2d9156693 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/NumberedNodeIterator.java @@ -35,10 +35,12 @@ public class NumberedNodeIterator implements Iterator { this.nodeManager = nodeManager; } + @Override public boolean hasNext() { return numbers.hasNext(); } + @Override public T next() throws NoSuchElementException { int i = numbers.next(); T result = nodeManager.getNode(i); @@ -46,6 +48,7 @@ public class NumberedNodeIterator implements Iterator { return result; } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java index e921728bd..685130f8d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SlowNumberedNodeManager.java @@ -27,11 +27,13 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { final private MutableMapping map = MutableMapping.make(); + @Override public int getNumber(T obj) { return map.getMappedIndex(obj); } + @Override public T getNode(int number) { if (number < 0) { throw new IllegalArgumentException("number must be >= 0"); @@ -43,20 +45,24 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NumberedGraph#getMaxNumber() */ + @Override public int getMaxNumber() { return map.getMaximumIndex(); } + @Override public Iterator iterator() { return map.iterator(); } + @Override public int getNumberOfNodes() { return map.getSize(); } + @Override public void addNode(T n) { if (n == null) { throw new IllegalArgumentException("n is null"); @@ -67,6 +73,7 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#remove(com.ibm.wala.util.graph.Node) */ + @Override public void removeNode(T n) { map.deleteMappedObject(n); } @@ -85,6 +92,7 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NodeManager#containsNode(com.ibm.wala.util.graph.Node) */ + @Override public boolean containsNode(T N) { return getNumber(N) != -1; } @@ -92,6 +100,7 @@ public class SlowNumberedNodeManager implements NumberedNodeManager { /* * @see com.ibm.wala.util.graph.NumberedNodeManager#iterateNodes(com.ibm.wala.util.intset.IntSet) */ + @Override public Iterator iterateNodes(IntSet s) { return new NumberedNodeIterator(s, this); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java index 3050bbfb9..cc96bf775 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/impl/SparseNumberedEdgeManager.java @@ -84,6 +84,7 @@ public final class SparseNumberedEdgeManager implements NumberedEdgeManager getPredNodes(T N) throws IllegalArgumentException { int number = nodeManager.getNumber(N); if (number < 0) { @@ -97,6 +98,7 @@ public final class SparseNumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager getSuccNodes(T N) throws IllegalArgumentException { int number = nodeManager.getNumber(N); if (number == -1) { @@ -127,6 +130,7 @@ public final class SparseNumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager implements NumberedEdgeManager extends AbstractGraph implem @Override protected abstract LabeledEdgeManager getEdgeManager(); + @Override public void addEdge(T src, T dst, U label) { getEdgeManager().addEdge(src, dst, label); } + @Override public Iterator getPredLabels(T N) { return getEdgeManager().getPredLabels(N); } + @Override public int getPredNodeCount(T N, U label) { return getEdgeManager().getPredNodeCount(N, label); } + @Override public Iterator getPredNodes(T N, U label) { return getEdgeManager().getPredNodes(N, label); } + @Override public Iterator getSuccLabels(T N) { return getEdgeManager().getSuccLabels(N); } + @Override public int getSuccNodeCount(T N, U label) { return getEdgeManager().getSuccNodeCount(N, label); } + @Override public Iterator getSuccNodes(T N, U label) { return getEdgeManager().getSuccNodes(N, label); } + @Override public boolean hasEdge(T src, T dst, U label) { return getEdgeManager().hasEdge(src, dst, label); } + @Override public void removeEdge(T src, T dst, U label) { getEdgeManager().removeEdge(src, dst, label); } + @Override public Set getEdgeLabels(T src, T dst) { return getEdgeManager().getEdgeLabels(src, dst); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java index dc07ab309..c9221664e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/AbstractNumberedLabeledGraph.java @@ -24,30 +24,37 @@ public abstract class AbstractNumberedLabeledGraph extends AbstractNumbere @Override protected abstract NumberedLabeledEdgeManager getEdgeManager(); + @Override public void addEdge(T src, T dst, U label) { getEdgeManager().addEdge(src, dst, label); } + @Override public Iterator getPredLabels(T N) { return getEdgeManager().getPredLabels(N); } + @Override public int getPredNodeCount(T N, U label) { return getEdgeManager().getPredNodeCount(N, label); } + @Override public Iterator getPredNodes(T N, U label) { return getEdgeManager().getPredNodes(N, label); } + @Override public Iterator getSuccLabels(T N) { return getEdgeManager().getSuccLabels(N); } + @Override public int getSuccNodeCount(T N, U label) { return getEdgeManager().getSuccNodeCount(N, label); } + @Override public Iterator getSuccNodes(T N, U label) { return getEdgeManager().getSuccNodes(N, label); } @@ -60,18 +67,22 @@ public abstract class AbstractNumberedLabeledGraph extends AbstractNumbere return getEdgeManager().getSuccNodeNumbers(node, label); } + @Override public boolean hasEdge(T src, T dst, U label) { return getEdgeManager().hasEdge(src, dst, label); } + @Override public void removeEdge(T src, T dst, U label) { getEdgeManager().removeEdge(src, dst, label); } + @Override public Set getEdgeLabels(T src, T dst) { return getEdgeManager().getEdgeLabels(src, dst); } + @Override public U getDefaultLabel() { return getEdgeManager().getDefaultLabel(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java index a2688ffbd..73115b033 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/labeled/SparseNumberedLabeledEdgeManager.java @@ -95,6 +95,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#addEdge(java.lang.Object, java.lang.Object, * java.lang.Object) */ + @Override public void addEdge(T src, T dst, U label) { nodeToSuccLabels.put(src, label); nodeToPredLabels.put(dst, label); @@ -105,6 +106,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getPredNodeCount(java.lang.Object, * java.lang.Object) */ + @Override public int getPredNodeCount(T N, U label) { return getManagerForLabel(label).getPredNodeCount(N); } @@ -113,6 +115,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getPredNodes(java.lang.Object, * java.lang.Object) */ + @Override public Iterator getPredNodes(T N, U label) { return getManagerForLabel(label).getPredNodes(N); } @@ -121,6 +124,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getSuccNodeCount(java.lang.Object, * java.lang.Object) */ + @Override public int getSuccNodeCount(T N, U label) { return getManagerForLabel(label).getSuccNodeCount(N); } @@ -129,6 +133,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#getSuccNodes(java.lang.Object, * java.lang.Object) */ + @Override public Iterator getSuccNodes(T N, U label) { return getManagerForLabel(label).getSuccNodes(N); } @@ -137,6 +142,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#hasEdge(java.lang.Object, java.lang.Object, * java.lang.Object) */ + @Override public boolean hasEdge(T src, T dst, U label) { return getManagerForLabel(label).hasEdge(src, dst); } @@ -146,6 +152,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * * @see util.LabelledEdgeManager#removeAllIncidentEdges(java.lang.Object) */ + @Override public void removeAllIncidentEdges(T node) { removeIncomingEdges(node); removeOutgoingEdges(node); @@ -155,6 +162,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd * @see util.LabelledEdgeManager#removeEdge(java.lang.Object, * java.lang.Object, java.lang.Object) */ + @Override public void removeEdge(T src, T dst, U label) throws IllegalArgumentException { getManagerForLabel(label).removeEdge(src, dst); } @@ -162,6 +170,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd /* * @see util.LabelledEdgeManager#removeIncomingEdges(java.lang.Object) */ + @Override public void removeIncomingEdges(T node) throws IllegalArgumentException { for (Iterator inLabelIter = nodeToPredLabels.get(node).iterator(); inLabelIter.hasNext();) { U label = inLabelIter.next(); @@ -173,6 +182,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd /* * @see util.LabelledEdgeManager#removeOutgoingEdges(java.lang.Object) */ + @Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { for (Iterator outLabelIter = nodeToSuccLabels.get(node).iterator(); outLabelIter.hasNext();) { U label = outLabelIter.next(); @@ -193,14 +203,17 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd } } + @Override public Iterator getPredLabels(T N) { return nodeToPredLabels.get(N).iterator(); } + @Override public Iterator getSuccLabels(T N) { return nodeToSuccLabels.get(N).iterator(); } + @Override public Set getEdgeLabels(T src, T dst) { Set labels = HashSetFactory.make(); @@ -213,10 +226,12 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return labels; } + @Override public void addEdge(T src, T dst) { addEdge(src, dst, defaultLabel); } + @Override public int getPredNodeCount(T N) { int count = 0; for (U label : nodeToPredLabels.get(N)) { @@ -225,6 +240,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return count; } + @Override public Iterator getPredNodes(T N) { Collection preds = HashSetFactory.make(); for (U label : nodeToPredLabels.get(N)) { @@ -233,6 +249,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return preds.iterator(); } + @Override public int getSuccNodeCount(T N) { int count = 0; for (U label : nodeToSuccLabels.get(N)) { @@ -241,6 +258,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return count; } + @Override public Iterator getSuccNodes(T N) { Collection succs = HashSetFactory.make(); for (U label : nodeToSuccLabels.get(N)) { @@ -249,26 +267,32 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return succs.iterator(); } + @Override public boolean hasEdge(T src, T dst) { return hasEdge(src, dst, defaultLabel); } + @Override public void removeEdge(T src, T dst) throws UnsupportedOperationException { removeEdge(src, dst, defaultLabel); } + @Override public U getDefaultLabel() { return defaultLabel; } + @Override public IntSet getPredNodeNumbers(T node, U label) throws IllegalArgumentException { return getManagerForLabel(label).getPredNodeNumbers(node); } + @Override public IntSet getSuccNodeNumbers(T node, U label) throws IllegalArgumentException { return getManagerForLabel(label).getSuccNodeNumbers(node); } + @Override public IntSet getPredNodeNumbers(T node) { BitVectorIntSet preds = new BitVectorIntSet(); @@ -279,6 +303,7 @@ public class SparseNumberedLabeledEdgeManager implements NumberedLabeledEd return preds; } + @Override public IntSet getSuccNodeNumbers(T node) { BitVectorIntSet succs = new BitVectorIntSet(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java index 407121b7b..4c6346603 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSIterator.java @@ -119,6 +119,7 @@ public class BFSIterator implements Iterator { * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (Q.size() > index); } @@ -128,6 +129,7 @@ public class BFSIterator implements Iterator { * * @return the next graph node in discover time order. */ + @Override public T next() throws NoSuchElementException { if (index >= Q.size()) { throw new NoSuchElementException(); @@ -155,6 +157,7 @@ public class BFSIterator implements Iterator { /** * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java index 409036e21..7ecb4c2b9 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BFSPathFinder.java @@ -84,6 +84,7 @@ public class BFSPathFinder { throw new IllegalArgumentException("src is not in graph " + src); } this.filter = new Filter() { + @Override public boolean accepts(T o) { return target.equals(o); } @@ -108,6 +109,7 @@ public class BFSPathFinder { this.roots = new NonNullSingletonIterator(src); this.filter = new Filter() { + @Override public boolean accepts(T o) { return ts.contains(o); } @@ -129,6 +131,7 @@ public class BFSPathFinder { this.G = G; this.roots = sources; this.filter = new Filter() { + @Override public boolean accepts(T o) { return target.equals(o); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java index 0a0b1e1f5..b69ac43d6 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/BoundedBFSIterator.java @@ -141,6 +141,7 @@ public class BoundedBFSIterator implements Iterator { * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (Q.size() > index); } @@ -150,6 +151,7 @@ public class BoundedBFSIterator implements Iterator { * * @return the next graph node in discover time order. */ + @Override public T next() throws NoSuchElementException { if (!hasNext()) { throw new NoSuchElementException(); @@ -180,6 +182,7 @@ public class BoundedBFSIterator implements Iterator { /** * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java index 8dfb72873..2869b5a9e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFS.java @@ -126,6 +126,7 @@ public class DFS { this.order = order; } + @Override public int compare(T o1, T o2) { // throws an exception if either argument is not a Node object if (o1 == o2) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java index bdbc00866..7fca8996d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSDiscoverTimeIterator.java @@ -56,6 +56,7 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (!empty()); } @@ -69,6 +70,7 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite * * @return the next graph node in discover time order. */ + @Override public T next() throws NoSuchElementException { if (empty()) { @@ -122,6 +124,7 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite */ abstract protected Iterator getConnected(T n); + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java index 3b38a8371..040e226d2 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSFinishTimeIterator.java @@ -58,6 +58,7 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera * * @return true if there nodes left to enumerate. */ + @Override public boolean hasNext() { return (!empty() || (theNextElement != null && getPendingChildren(theNextElement) == null)); } @@ -71,6 +72,7 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera * * @return the next graph node in finishing time order. */ + @Override @SuppressWarnings("unchecked") public T next() throws NoSuchElementException { if (!hasNext()) { @@ -122,6 +124,7 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera /** * @see java.util.Iterator#remove() */ + @Override public void remove() throws UnimplementedError { throw new UnimplementedError(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java index ca342959e..25b03fab2 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/FloydWarshall.java @@ -22,6 +22,13 @@ import com.ibm.wala.util.intset.IntSetAction; import com.ibm.wala.util.intset.IntSetUtil; import com.ibm.wala.util.intset.MutableIntSet; +/** + * Floyd-Warshall algorithm to compute all-pairs shortest path in graph with no negative cycles. + * + * TODO: this API should be cleaned up. + * + * @param node type in the graph + */ public class FloydWarshall { public interface GetPath { @@ -46,7 +53,7 @@ public class FloydWarshall { } - int[][] allPairsShortestPaths() { + public int[][] allPairsShortestPaths() { final int[][] result = new int[G.getNumberOfNodes()][G.getNumberOfNodes()]; for(int i = 0; i < result.length; i++) { @@ -59,6 +66,7 @@ public class FloydWarshall { final int fn = G.getNumber(from); IntSet tos = G.getSuccNodeNumbers(from); tos.foreach(new IntSetAction() { + @Override public void act(int x) { result[fn][x] = edgeCost(fn, x); } @@ -107,6 +115,7 @@ public class FloydWarshall { final int[][] paths = allPairsShortestPaths(); return new GetPath() { + @Override public List getPath(T from, T to) { int fn = G.getNumber(from); int tn = G.getNumber(to); @@ -145,7 +154,8 @@ public class FloydWarshall { private GetPaths doit() { final int[][] paths = allPairsShortestPaths(); return new GetPaths() { - public Set> getPaths(final T from, final T to) { + @Override + public Set> getPaths(final T from, final T to) { int fn = G.getNumber(from); int tn = G.getNumber(to); if (paths[fn][tn] == Integer.MAX_VALUE) { @@ -159,6 +169,7 @@ public class FloydWarshall { final Set> result = new HashSet>(); intermediate.foreach(new IntSetAction() { + @Override public void act(int x) { T in = G.getNode(x); for(List pre : getPaths(from, in)) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java index eea0aee7b..b82367242 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/SCCIterator.java @@ -57,6 +57,7 @@ public class SCCIterator implements Iterator> { /** * Determine whether there are any more SCCs remaining in this enumeration. */ + @Override public boolean hasNext() { return rev.hasNext(); } @@ -64,6 +65,7 @@ public class SCCIterator implements Iterator> { /** * Find the next SCC in this enumeration */ + @Override public Set next() throws NoSuchElementException { Set currentSCC = HashSetFactory.make(); @@ -78,6 +80,7 @@ public class SCCIterator implements Iterator> { } + @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java b/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java index 9ad8c6f85..ee2c2d24e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/heapTrace/HeapTracer.java @@ -698,7 +698,8 @@ public class HeapTracer { * @see java.util.Comparator#compare(java.lang.Object, * java.lang.Object) */ - public int compare(Object o1, Object o2) { + @Override + public int compare(Object o1, Object o2) { Integer i1 = sizeCount.get(o1); Integer i2 = sizeCount.get(o2); return i2.intValue() - i1.intValue(); @@ -803,7 +804,8 @@ public class HeapTracer { * @see java.util.Comparator#compare(java.lang.Object, * java.lang.Object) */ - public int compare(Field o1, Field o2) { + @Override + public int compare(Field o1, Field o2) { Demographics d1 = roots.get(o1); Demographics d2 = roots.get(o2); return d2.getTotalSize() - d1.getTotalSize(); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java index d3a40f059..d3e06c52e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BasicNaturalRelation.java @@ -122,6 +122,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { * * @return true iff the relation changes as a result of this call. */ + @Override public boolean add(int x, int y) throws IllegalArgumentException { if (x < 0) { throw new IllegalArgumentException("illegal x: " + x); @@ -173,6 +174,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { return smallStore[0].get(x) == DELEGATE_CODE; } + @Override public Iterator iterator() { return new TotalIterator(); } @@ -223,10 +225,12 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public boolean hasNext() { return nextX != -1; } + @Override public IntPair next() { IntPair result = null; if (nextIndex == smallStore.length) { @@ -246,6 +250,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } @@ -260,6 +265,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { * @param x * @return true iff there exists pair (x,y) for some y */ + @Override public boolean anyRelated(int x) { return smallStore[0].get(x) != EMPTY_CODE; } @@ -267,6 +273,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { /* * @see com.ibm.wala.util.intset.IBinaryNonNegativeIntRelation#getRelated(int) */ + @Override public IntSet getRelated(int x) { if (DEBUG) { assert x >= 0; @@ -310,6 +317,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { /* * @see com.ibm.wala.util.intset.IBinaryNonNegativeIntRelation#getRelatedCount(int) */ + @Override public int getRelatedCount(int x) throws IllegalArgumentException { if (x < 0) { throw new IllegalArgumentException("x must be greater than zero"); @@ -332,6 +340,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public void remove(int x, int y) { if (x < 0) { throw new IllegalArgumentException("illegal x: " + x); @@ -365,6 +374,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public void removeAll(int x) { for (int i = 0; i < smallStore.length; i++) { smallStore[i].set(x, EMPTY_CODE); @@ -375,6 +385,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { /* * @see com.ibm.wala.util.debug.VerboseAction#performVerboseAction() */ + @Override public void performVerboseAction() { if (VERBOSE) { System.err.println((getClass() + " stats:")); @@ -401,6 +412,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { return result; } + @Override public boolean contains(int x, int y) { if (x < 0) { throw new IllegalArgumentException("invalid x: " + x); @@ -420,6 +432,7 @@ public final class BasicNaturalRelation implements IBinaryNaturalRelation { } } + @Override public int maxKeyValue() { return maxX; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java index 7a50ea1c4..c8e6efc85 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSet.java @@ -23,6 +23,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#copySet(com.ibm.wala.util.intset.IntSet) */ + @Override public void copySet(IntSet set) { if (set == null) { throw new IllegalArgumentException("null set"); @@ -56,6 +57,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAll(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation @@ -71,6 +73,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAll(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation @@ -117,6 +120,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#add(int) */ + @Override public boolean add(int i) { boolean result = impl.add(i); if (result) { @@ -128,6 +132,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#remove(int) */ + @Override public boolean remove(int i) { boolean result = impl.remove(i); maybeChangeRepresentation(); @@ -137,6 +142,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#intersectWith(com.ibm.wala.util.intset.IntSet) */ + @Override public void intersectWith(IntSet set) throws UnimplementedError { if (set == null) { throw new IllegalArgumentException("null set"); @@ -152,6 +158,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#contains(int) */ + @Override public boolean contains(int i) { return impl.contains(i); } @@ -159,6 +166,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intersection(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet intersection(IntSet that) throws UnimplementedError { if (that instanceof BimodalMutableIntSet) { BimodalMutableIntSet b = (BimodalMutableIntSet) that; @@ -174,6 +182,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { BimodalMutableIntSet temp = new BimodalMutableIntSet(); temp.addAll(this); @@ -185,6 +194,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isEmpty() */ + @Override public boolean isEmpty() { return impl.isEmpty(); } @@ -192,6 +202,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#size() */ + @Override public int size() { return impl.size(); } @@ -199,6 +210,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#iterator() */ + @Override public IntIterator intIterator() { return impl.intIterator(); } @@ -206,6 +218,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreach(IntSetAction action) { impl.foreach(action); } @@ -213,6 +226,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreachExcluding(com.ibm.wala.util.intset.IntSet, com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { impl.foreachExcluding(X, action); } @@ -220,6 +234,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#max() */ + @Override public int max() throws IllegalStateException { return impl.max(); } @@ -259,6 +274,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ + @Override public void clear() { impl = MutableSparseIntSet.makeEmpty(); } @@ -278,6 +294,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#sameValue(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean sameValue(IntSet that) { return impl.sameValue(that); } @@ -285,6 +302,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isSubset(com.ibm.wala.util.intset.SparseIntSet) */ + @Override public boolean isSubset(IntSet that) throws IllegalArgumentException { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -316,6 +334,7 @@ public class BimodalMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#containsAny(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean containsAny(IntSet that) throws IllegalArgumentException, UnimplementedError { if (that == null) { throw new IllegalArgumentException("that == null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java index dde8b860f..02143a90e 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BimodalMutableIntSetFactory.java @@ -22,6 +22,7 @@ public class BimodalMutableIntSetFactory implements MutableIntSetFactory { } } + @Override public boolean hasNext() { return (next != -1); } + @Override public T next() { T result = map.getMappedObject(next); int start = next + 1; @@ -172,6 +174,7 @@ public final class BitSet { return result; } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java index c1bd4747a..59442bd83 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSet.java @@ -48,6 +48,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ + @Override public void clear() { bitVector.clearAll(); populationCount = 0; @@ -56,6 +57,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#copySet(com.ibm.wala.util.intset.IntSet) */ + @Override public void copySet(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -93,6 +95,7 @@ public final class BitVectorIntSet implements MutableIntSet { } + @Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet) { BitVector B = ((BitVectorIntSet) set).bitVector; @@ -128,6 +131,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#add(int) */ + @Override public boolean add(int i) { if (bitVector.get(i)) { return false; @@ -142,6 +146,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#remove(int) */ + @Override public boolean remove(int i) { if (contains(i)) { populationCount--; @@ -156,6 +161,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#intersectWith(com.ibm.wala.util.intset.IntSet) */ + @Override public void intersectWith(IntSet set) { if (!(set instanceof BitVectorIntSet)) { set = new BitVectorIntSet(set); @@ -168,6 +174,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intersection(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet intersection(IntSet that) { BitVectorIntSet newbie = new BitVectorIntSet(); newbie.copySet(this); @@ -178,6 +185,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { BitVectorIntSet temp = new BitVectorIntSet(); temp.addAll(this); @@ -189,6 +197,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isEmpty() */ + @Override public boolean isEmpty() { return size() == 0; } @@ -196,6 +205,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#size() */ + @Override public int size() { populationCount = (populationCount == UNDEFINED) ? bitVector.populationCount() : populationCount; return populationCount; @@ -204,6 +214,7 @@ public final class BitVectorIntSet implements MutableIntSet { /** * Use with extreme care; doesn't detect ConcurrentModificationExceptions */ + @Override public IntIterator intIterator() { populationCount = (populationCount == UNDEFINED) ? bitVector.populationCount() : populationCount; return new IntIterator() { @@ -211,10 +222,12 @@ public final class BitVectorIntSet implements MutableIntSet { int last = 0; + @Override public boolean hasNext() { return count < populationCount; } + @Override public int next() { count++; last = nextSetBit(last) + 1; @@ -226,6 +239,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreach(IntSetAction action) { if (action == null) { throw new IllegalArgumentException("null action"); @@ -252,6 +266,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { if (X instanceof BitVectorIntSet) { fastForeachExcluding((BitVectorIntSet) X, action); @@ -309,6 +324,7 @@ public final class BitVectorIntSet implements MutableIntSet { } } + @Override public boolean contains(int i) { if (i < 0) { throw new IllegalArgumentException("invalid i: " + i) ; @@ -316,6 +332,7 @@ public final class BitVectorIntSet implements MutableIntSet { return bitVector.get(i); } + @Override public int max() { return bitVector.max(); } @@ -335,6 +352,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#sameValue(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean sameValue(IntSet that) throws IllegalArgumentException, UnimplementedError { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -373,6 +391,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isSubset(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean isSubset(IntSet that) { if (that instanceof BitVectorIntSet) { return bitVector.isSubset(((BitVectorIntSet) that).bitVector); @@ -427,6 +446,7 @@ public final class BitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#containsAny(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean containsAny(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -449,6 +469,7 @@ public final class BitVectorIntSet implements MutableIntSet { * @see com.ibm.wala.util.intset.MutableIntSet#addAllInIntersection(com.ibm.wala.util.intset.IntSet, * com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) throws IllegalArgumentException { if (other == null) { throw new IllegalArgumentException("other == null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java index 2fdd4404a..aa3467463 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorIntSetFactory.java @@ -21,6 +21,7 @@ public class BitVectorIntSetFactory implements MutableIntSetFactorythis has the same value as that. */ + @Override public boolean sameValue(IntSet that) { if (that instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) that; @@ -176,6 +187,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * @return true iff this is a subset of that. */ + @Override public boolean isSubset(IntSet that) { if (that instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) that; @@ -194,6 +206,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Set the value of this to be the same as the value of set */ + @Override public void copySet(IntSet set) { if (set instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) set; @@ -211,6 +224,7 @@ class DebuggingMutableIntSet implements MutableIntSet { * * @return true iff the value of this changes. */ + @Override public boolean addAll(IntSet set) { if (set instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) set; @@ -236,6 +250,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Intersect this with another set. */ + @Override public void intersectWith(IntSet set) { if (set instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) set; @@ -252,6 +267,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /** */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other instanceof DebuggingMutableIntSet && filter instanceof DebuggingMutableIntSet) { DebuggingMutableIntSet db = (DebuggingMutableIntSet) other; @@ -271,6 +287,7 @@ class DebuggingMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intIterator() */ + @Override public IntIterator intIterator() { MutableSparseIntSet bits = MutableSparseIntSet.makeEmpty(); for (IntIterator pi = primaryImpl.intIterator(); pi.hasNext();) { @@ -291,15 +308,18 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Invoke an action on each element of the Set */ + @Override public void foreach(IntSetAction action) { final Set bits = HashSetFactory.make(); primaryImpl.foreach(new IntSetAction() { + @Override public void act(int x) { assert !bits.contains(new Integer(x)); bits.add(new Integer(x)); } }); secondaryImpl.foreach(new IntSetAction() { + @Override public void act(int x) { assert bits.contains(new Integer(x)); bits.remove(new Integer(x)); @@ -313,15 +333,18 @@ class DebuggingMutableIntSet implements MutableIntSet { /** * Invoke an action on each element of the Set, excluding elements of Set X */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { final Set bits = HashSetFactory.make(); primaryImpl.foreachExcluding(X, new IntSetAction() { + @Override public void act(int x) { assert !bits.contains(new Integer(x)); bits.add(new Integer(x)); } }); secondaryImpl.foreachExcluding(X, new IntSetAction() { + @Override public void act(int x) { assert bits.contains(new Integer(x)); bits.remove(new Integer(x)); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java index a993a0ec3..2286a1747 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/DebuggingMutableIntSetFactory.java @@ -38,6 +38,7 @@ public class DebuggingMutableIntSetFactory implements MutableIntSetFactory implements OrdinalSetMapping { nextIndex = 0; } + @Override @SuppressWarnings("unchecked") public T getMappedObject(int n) { try { @@ -69,6 +70,7 @@ public class MutableMapping implements OrdinalSetMapping { } } + @Override public int getMappedIndex(T o) { Integer I = map.get(o); if (I == null) { @@ -79,6 +81,7 @@ public class MutableMapping implements OrdinalSetMapping { } + @Override public boolean hasMappedIndex(T o) { return map.get(o) != null; } @@ -88,6 +91,7 @@ public class MutableMapping implements OrdinalSetMapping { * * @return the integer to which the object is mapped. */ + @Override public int add(T o) { Integer I = map.get(o); if (I != null) { @@ -116,6 +120,7 @@ public class MutableMapping implements OrdinalSetMapping { /* * @see com.ibm.wala.util.intset.OrdinalSetMapping#iterator() */ + @Override public Iterator iterator() { return map.keySet().iterator(); } @@ -175,10 +180,12 @@ public class MutableMapping implements OrdinalSetMapping { } + @Override public int getMaximumIndex() { return nextIndex - 1; } + @Override public int getSize() { return map.size(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java index e06dda492..c69aa9917 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSet.java @@ -163,6 +163,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#contains(int) */ + @Override public boolean contains(int i) { if (privatePart != null && privatePart.contains(i)) { return true; @@ -176,6 +177,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#intersection(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet intersection(IntSet that) { if (that == null) { throw new IllegalArgumentException("null that"); @@ -204,6 +206,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { MutableSharedBitVectorIntSet temp = new MutableSharedBitVectorIntSet(); temp.addAll(this); @@ -228,6 +231,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isEmpty() */ + @Override public boolean isEmpty() { return privatePart == null && sharedPart == null; } @@ -235,6 +239,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#size() */ + @Override public int size() { int result = 0; result += (privatePart == null) ? 0 : privatePart.size(); @@ -245,6 +250,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#iterator() */ + @Override public IntIterator intIterator() { if (privatePart == null) { return (sharedPart == null) ? EmptyIntIterator.instance() : sharedPart.intIterator(); @@ -257,6 +263,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreach(com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreach(IntSetAction action) { if (privatePart != null) { privatePart.foreach(action); @@ -269,6 +276,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#foreachExcluding(com.ibm.wala.util.intset.IntSet, com.ibm.wala.util.intset.IntSetAction) */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { if (X instanceof MutableSharedBitVectorIntSet) { foreachExcludingInternal((MutableSharedBitVectorIntSet) X, action); @@ -315,6 +323,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#max() */ + @Override public int max() { int result = -1; if (privatePart != null && privatePart.size() > 0) { @@ -329,6 +338,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#sameValue(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean sameValue(IntSet that) throws IllegalArgumentException, UnimplementedError { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -461,6 +471,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#isSubset(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean isSubset(IntSet that) { if (that == null) { throw new IllegalArgumentException("null that"); @@ -572,6 +583,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#copySet(com.ibm.wala.util.intset.IntSet) */ + @Override public void copySet(IntSet set) { if (set instanceof MutableSharedBitVectorIntSet) { MutableSharedBitVectorIntSet other = (MutableSharedBitVectorIntSet) set; @@ -595,6 +607,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAll(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAll(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -775,6 +788,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#add(int) */ + @Override public boolean add(int i) { if (privatePart == null) { if (sharedPart == null) { @@ -810,6 +824,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#remove(int) */ + @Override public boolean remove(int i) { if (privatePart != null) { if (privatePart.contains(i)) { @@ -838,6 +853,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#intersectWith(com.ibm.wala.util.intset.IntSet) */ + @Override public void intersectWith(IntSet set) { if (set instanceof MutableSharedBitVectorIntSet) { intersectWithInternal((MutableSharedBitVectorIntSet) set); @@ -978,6 +994,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#containsAny(com.ibm.wala.util.intset.IntSet) */ + @Override public boolean containsAny(IntSet set) { if (set instanceof MutableSharedBitVectorIntSet) { MutableSharedBitVectorIntSet other = (MutableSharedBitVectorIntSet) set; @@ -1009,6 +1026,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#addAllExcluding(com.ibm.wala.util.intset.IntSet, com.ibm.wala.util.intset.IntSet) */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other instanceof MutableSharedBitVectorIntSet) { return addAllInIntersectionInternal((MutableSharedBitVectorIntSet) other, filter); @@ -1089,6 +1107,7 @@ public class MutableSharedBitVectorIntSet implements MutableIntSet { } } + @Override public void clear() { privatePart = null; sharedPart = null; diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java index 5b3391395..e51bb6235 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSharedBitVectorIntSetFactory.java @@ -21,6 +21,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#make(int[]) */ + @Override public MutableSharedBitVectorIntSet make(int[] set) { SparseIntSet s = (SparseIntSet) sparseFactory.make(set); return new MutableSharedBitVectorIntSet(s); @@ -29,6 +30,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#parse(java.lang.String) */ + @Override public MutableSharedBitVectorIntSet parse(String string) throws NumberFormatException { SparseIntSet s = (SparseIntSet) sparseFactory.parse(string); return new MutableSharedBitVectorIntSet(s); @@ -37,6 +39,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#makeCopy(com.ibm.wala.util.intset.IntSet) */ + @Override public MutableSharedBitVectorIntSet makeCopy(IntSet x) throws IllegalArgumentException { if (x == null) { throw new IllegalArgumentException("x == null"); @@ -62,6 +65,7 @@ public class MutableSharedBitVectorIntSetFactory implements MutableIntSetFactory /* * @see com.ibm.wala.util.intset.MutableIntSetFactory#make() */ + @Override public MutableSharedBitVectorIntSet make() { return new MutableSharedBitVectorIntSet(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java index ae06469da..22232cada 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSet.java @@ -69,13 +69,15 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ - public void clear() { + @Override + public void clear() { size = 0; } /** */ - public boolean remove(int value) { + @Override + public boolean remove(int value) { if (elements != null) { int remove; for (remove = 0; remove < size; remove++) { @@ -117,7 +119,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * @param value * @return true iff this value changes */ - @SuppressWarnings("unused") + @Override + @SuppressWarnings("unused") public boolean add(int value) { if (elements == null) { elements = new int[getInitialNonEmptySize()]; @@ -176,7 +179,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * @throws IllegalArgumentException * if that == null */ - @SuppressWarnings("unused") + @Override + @SuppressWarnings("unused") public void copySet(IntSet that) throws IllegalArgumentException { if (that == null) { throw new IllegalArgumentException("that == null"); @@ -201,7 +205,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { that.foreach(new IntSetAction() { private int index = 0; - public void act(int i) { + @Override + public void act(int i) { elements[index++] = i; } }); @@ -211,7 +216,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { } } - public void intersectWith(IntSet set) { + @Override + public void intersectWith(IntSet set) { if (set == null) { throw new IllegalArgumentException("null set"); } @@ -307,7 +313,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * @throws IllegalArgumentException * if set == null */ - @SuppressWarnings("unused") + @Override + @SuppressWarnings("unused") public boolean addAll(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -317,7 +324,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { } else { int oldSize = size; set.foreach(new IntSetAction() { - public void act(int i) { + @Override + public void act(int i) { if (!contains(i)) add(i); } @@ -474,7 +482,8 @@ public class MutableSparseIntSet extends SparseIntSet implements MutableIntSet { * com.ibm.wala.util.intset.MutableIntSet#addAllInIntersection(com.ibm.wala * .util.intset.IntSet, com.ibm.wala.util.intset.IntSet) */ - public boolean addAllInIntersection(IntSet other, IntSet filter) { + @Override + public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other == null) { throw new IllegalArgumentException("other is null"); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java index 2d976d963..dfcbb3bca 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/MutableSparseIntSetFactory.java @@ -21,6 +21,7 @@ public class MutableSparseIntSetFactory implements MutableIntSetFactory implements OrdinalSetMapping { this.offset = offset; } + @Override public int getMaximumIndex() { return offset + delegate.getMaximumIndex(); } + @Override public int getSize() { return delegate.getSize(); } @@ -47,10 +49,12 @@ public class OffsetOrdinalSetMapping implements OrdinalSetMapping { return new OffsetOrdinalSetMapping(m, offset); } + @Override public int add(T o) { return offset + delegate.add(o); } + @Override public int getMappedIndex(T o) { if (delegate.getMappedIndex(o) == -1) { return -1; @@ -58,14 +62,17 @@ public class OffsetOrdinalSetMapping implements OrdinalSetMapping { return offset + delegate.getMappedIndex(o); } + @Override public T getMappedObject(int n) throws NoSuchElementException { return delegate.getMappedObject(n - offset); } + @Override public boolean hasMappedIndex(T o) { return delegate.hasMappedIndex(o); } + @Override public Iterator iterator() { return delegate.iterator(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java index 34188c78f..af6d63451 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/OrdinalSet.java @@ -58,6 +58,7 @@ public class OrdinalSet implements Iterable { return (S == null) ? 0 : S.size(); } + @Override public Iterator iterator() { if (S == null) { return EmptyIterator.instance(); @@ -66,14 +67,17 @@ public class OrdinalSet implements Iterable { return new Iterator() { IntIterator it = S.intIterator(); + @Override public boolean hasNext() { return it.hasNext(); } + @Override public T next() { return mapping.getMappedObject(it.next()); } + @Override public void remove() { Assertions.UNREACHABLE(); } diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java index 9563e942a..4b6968399 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSet.java @@ -227,6 +227,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.MutableIntSet#clear() */ + @Override public void clear() { sparsePart.clear(); densePart = null; @@ -236,6 +237,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @param i * @return true iff this set contains integer i */ + @Override public boolean contains(int i) { if (densePart != null && inDenseRange(i)) { return densePart.contains(i); @@ -247,6 +249,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return true iff this set contains integer i */ + @Override public boolean containsAny(IntSet set) { if (set == null) { throw new IllegalArgumentException("null set"); @@ -273,6 +276,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @return a new IntSet which is the intersection of this and that */ + @Override public IntSet intersection(IntSet that) { if (that == null) { throw new IllegalArgumentException("null that"); @@ -290,6 +294,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /* * @see com.ibm.wala.util.intset.IntSet#union(com.ibm.wala.util.intset.IntSet) */ + @Override public IntSet union(IntSet that) { SemiSparseMutableIntSet temp = new SemiSparseMutableIntSet(); temp.addAll(this); @@ -301,6 +306,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return true iff this set is empty */ + @Override public boolean isEmpty() { return sparsePart.isEmpty() && (densePart == null || densePart.isZero()); } @@ -308,6 +314,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return the number of elements in this set */ + @Override public int size() { return sparsePart.size() + (densePart == null ? 0 : densePart.populationCount()); } @@ -315,14 +322,17 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return a perhaps more efficient iterator */ + @Override public IntIterator intIterator() { class DensePartIterator implements IntIterator { private int i = -1; + @Override public boolean hasNext() { return densePart.nextSetBit(i + 1) != -1; } + @Override public int next() { int next = densePart.nextSetBit(i + 1); i = next; @@ -349,6 +359,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * Invoke an action on each element of the Set */ + @Override public void foreach(IntSetAction action) { if (action == null) { throw new IllegalArgumentException("null action"); @@ -366,6 +377,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @param action */ + @Override public void foreachExcluding(IntSet X, IntSetAction action) { sparsePart.foreachExcluding(X, action); if (densePart != null) { @@ -380,6 +392,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @return maximum integer in this set. */ + @Override public int max() throws IllegalStateException { if (densePart == null) { return sparsePart.max(); @@ -392,6 +405,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @return true iff this has the same value as that. * @throws IllegalArgumentException if that is null */ + @Override public boolean sameValue(IntSet that) { if (that == null) { throw new IllegalArgumentException("that is null"); @@ -418,6 +432,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @return true iff this is a subset of that. * @throws IllegalArgumentException if that is null */ + @Override public boolean isSubset(IntSet that) { if (that == null) { throw new IllegalArgumentException("that is null"); @@ -448,6 +463,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @throws IllegalArgumentException if set == null */ + @Override public void copySet(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -479,6 +495,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @return true iff the value of this changes. * @throws IllegalArgumentException if set == null */ + @Override public boolean addAll(IntSet set) throws IllegalArgumentException { if (set == null) { throw new IllegalArgumentException("set == null"); @@ -556,6 +573,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @param i integer to add * @return true iff the value of this changes. */ + @Override public boolean add(int i) { if (densePart != null && inDenseRange(i)) { if (!densePart.get(i)) { @@ -579,6 +597,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * @param i integer to remove * @return true iff the value of this changes. */ + @Override public boolean remove(int i) { if (densePart != null && densePart.get(i)) { densePart.clear(i); @@ -599,6 +618,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { * * @param set */ + @Override public void intersectWith(IntSet set) { sparsePart.intersectWith(set); if (densePart != null) { @@ -613,6 +633,7 @@ public class SemiSparseMutableIntSet implements MutableIntSet { /** * @throws IllegalArgumentException if other is null */ + @Override public boolean addAllInIntersection(IntSet other, IntSet filter) { if (other == null) { throw new IllegalArgumentException("other is null"); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java index 945ed3eee..cd3df1b8d 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/SemiSparseMutableIntSetFactory.java @@ -21,6 +21,7 @@ public class SemiSparseMutableIntSetFactory implements MutableIntSetFactory= data.size()) { @@ -69,6 +70,7 @@ public class TwoLevelIntVector implements IntVector { * * @see com.ibm.wala.util.intset.IntVector#set(int, int) */ + @Override public void set(int x, int value) { maxIndex = Math.max(maxIndex, x); int page = getPageNumber(x); @@ -101,6 +103,7 @@ public class TwoLevelIntVector implements IntVector { System.err.println(("data: size = " + data.size())); } + @Override public int getMaxIndex() { return maxIndex; } diff --git a/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java b/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java index 890f56ab6..85fbe9574 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java +++ b/com.ibm.wala.util/src/com/ibm/wala/viz/NodeDecorator.java @@ -17,6 +17,7 @@ import com.ibm.wala.util.WalaException; public interface NodeDecorator { public static final NodeDecorator DEFAULT = new NodeDecorator() { + @Override public String getLabel(Object o) { return o.toString(); } }; From 00c095ae28ca9fc03f9b71100f2a3bf85e19a105 Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Tue, 25 Jun 2013 13:29:37 -0400 Subject: [PATCH 183/187] turn off debugging output --- .../com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 6e95fd98d..0ff35c0cd 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -698,7 +698,6 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { public void worked(int units) { } }); - CAstCallGraphUtil.AVOID_DUMP = false; CAstCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); } @@ -706,7 +705,6 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { public void testTutorialExample() throws IllegalArgumentException, IOException, CancelException, WalaException { PropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "tutorial-example.js"); CallGraph CG = B.makeCallGraph(B.getOptions()); - CAstCallGraphUtil.AVOID_DUMP = false; CAstCallGraphUtil.dumpCG(B.getPointerAnalysis(), CG); // verifyGraphAssertions(CG, assertionsForDateProperty); } From 6597641ca095b9c84ed9b70647343649e5ec96f8 Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Tue, 25 Jun 2013 13:30:01 -0400 Subject: [PATCH 184/187] new test --- .../examples-src/tests/tutorial-example.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 com.ibm.wala.cast.js.test.data/examples-src/tests/tutorial-example.js diff --git a/com.ibm.wala.cast.js.test.data/examples-src/tests/tutorial-example.js b/com.ibm.wala.cast.js.test.data/examples-src/tests/tutorial-example.js new file mode 100644 index 000000000..c5e53913b --- /dev/null +++ b/com.ibm.wala.cast.js.test.data/examples-src/tests/tutorial-example.js @@ -0,0 +1,13 @@ +function outer(s) { + var x = arguments[0]; + if (s.indexOf('o') > 0) { + + function inner(y) { + var t = ".suffix"; + var arr = [ x + t, y ]; + this.data = arr; + } + return new inner(s); + } +} +var outerProp = outer("outer").data; From 8b09512edb1fb5452a83cf5becca99c97ae570e9 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 25 Jun 2013 15:50:24 -0400 Subject: [PATCH 185/187] fix .classpath error; should refer to rhino-1.7R3.jar --- com.ibm.wala.cast.js.rhino/.classpath | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.js.rhino/.classpath b/com.ibm.wala.cast.js.rhino/.classpath index 42121f797..41ccd7f97 100644 --- a/com.ibm.wala.cast.js.rhino/.classpath +++ b/com.ibm.wala.cast.js.rhino/.classpath @@ -3,6 +3,6 @@ - + From 31d3bf835e8bf94b5a195fd373966f19ddafcb7d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 25 Jun 2013 15:58:23 -0400 Subject: [PATCH 186/187] other build fixes --- com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF | 2 +- com.ibm.wala.cast.js.rhino/build.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF index 35ce3fb27..c0fa3d389 100644 --- a/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.js.rhino/META-INF/MANIFEST.MF @@ -36,4 +36,4 @@ Export-Package: com.ibm.wala.cast.js.translator, org.mozilla.javascript.xml.impl.xmlbeans, org.mozilla.javascript.xmlimpl Bundle-ClassPath: ., - lib/js.jar + lib/rhino-1.7R3.jar diff --git a/com.ibm.wala.cast.js.rhino/build.properties b/com.ibm.wala.cast.js.rhino/build.properties index 49aa09ae1..2986328a0 100644 --- a/com.ibm.wala.cast.js.rhino/build.properties +++ b/com.ibm.wala.cast.js.rhino/build.properties @@ -2,5 +2,5 @@ source.. = source/ output.. = bin/ bin.includes = META-INF/,\ .,\ - lib/js.jar + lib/rhino-1.7R3.jar jars.extra.classpath = lib/rhino-1.7R3.jar From b984760100e3be325d458f61b0d556f479701c95 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 28 Jun 2013 11:00:31 -0400 Subject: [PATCH 187/187] support for reading method parameter annotations from Java bytecodes --- .../annotations/ParameterAnnotations1.java | 31 ++++++ .../wala/core/tests/ir/AnnotationTest.java | 39 ++++++++ .../ibm/wala/classLoader/ShrikeCTMethod.java | 66 ++++++++----- .../com/ibm/wala/classLoader/ShrikeClass.java | 98 +++++++------------ .../wala/types/annotations/Annotation.java | 37 +++++-- .../shrikeBT/shrikeCT/tools/ClassPrinter.java | 9 +- .../ibm/wala/shrikeCT/AnnotationsReader.java | 72 +++++++++++++- .../RuntimeInvisibleAnnotationsReader.java | 25 ----- .../RuntimeVisibleAnnotationsReader.java | 25 ----- 9 files changed, 246 insertions(+), 156 deletions(-) create mode 100644 com.ibm.wala.core.testdata/src/annotations/ParameterAnnotations1.java delete mode 100644 com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeInvisibleAnnotationsReader.java delete mode 100644 com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeVisibleAnnotationsReader.java diff --git a/com.ibm.wala.core.testdata/src/annotations/ParameterAnnotations1.java b/com.ibm.wala.core.testdata/src/annotations/ParameterAnnotations1.java new file mode 100644 index 000000000..49c668646 --- /dev/null +++ b/com.ibm.wala.core.testdata/src/annotations/ParameterAnnotations1.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * 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 annotations; + +public class ParameterAnnotations1 { + + public static void foo(@RuntimeVisableAnnotation String s) { + } + + public static void bar(@AnnotationWithParams(enumParam=AnnotationEnum.VAL1,strArrParam={"biz","boz"},annotParam=@AnnotationWithSingleParam("sdfevs"),strParam="sdfsevs",intParam=25,klassParam=Integer.class) Integer i) { + + } + + public static void foo2(@RuntimeVisableAnnotation String s, @RuntimeInvisableAnnotation Integer i) { + } + + public void foo3(@RuntimeVisableAnnotation String s, @RuntimeInvisableAnnotation Integer i) { + } + + public void foo4(@RuntimeInvisableAnnotation @RuntimeVisableAnnotation String s, Integer i) { + + } +} diff --git a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java index 9ea80fc99..e259cfa49 100644 --- a/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java +++ b/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/AnnotationTest.java @@ -172,4 +172,43 @@ public class AnnotationTest extends WalaTestCase { annots.toString()); } + + @Test + public void testParamAnnotations1() throws Exception { + + TypeReference typeRef = TypeReference.findOrCreate(ClassLoaderReference.Application, "Lannotations/ParameterAnnotations1"); + + checkParameterAnnots(typeRef, "foo(Ljava/lang/String;)V", + "[Annotation type ]"); + checkParameterAnnots( + typeRef, + "bar(Ljava/lang/Integer;)V", + "[Annotation type {enumParam=EnumElementValue [type=Lannotations/AnnotationEnum;, val=VAL1], strArrParam=ArrayElementValue [vals=[biz, boz]], annotParam=AnnotationElementValue [type=Lannotations/AnnotationWithSingleParam;, elementValues={value=sdfevs}], strParam=sdfsevs, intParam=25, klassParam=Ljava/lang/Integer;}]"); + checkParameterAnnots(typeRef, "foo2(Ljava/lang/String;Ljava/lang/Integer;)V", + "[Annotation type ]", + "[Annotation type ]"); + checkParameterAnnots(typeRef, "foo3(Ljava/lang/String;Ljava/lang/Integer;)V", + "[Annotation type ]", + "[Annotation type ]"); + checkParameterAnnots(typeRef, "foo4(Ljava/lang/String;Ljava/lang/Integer;)V", + "[Annotation type , Annotation type ]", + "[]"); + + } + + protected void checkParameterAnnots(TypeReference typeRef, String selector, String... expected) { + MethodReference methodRefUnderTest = MethodReference.findOrCreate(typeRef, Selector.make(selector)); + + IMethod methodUnderTest = cha.resolveMethod(methodRefUnderTest); + Assert.assertNotNull(methodRefUnderTest.toString() + " not found", methodUnderTest); + Assert.assertTrue(methodUnderTest instanceof ShrikeCTMethod); + ShrikeCTMethod shrikeCTMethodUnderTest = (ShrikeCTMethod) methodUnderTest; + + Collection[] parameterAnnotations = shrikeCTMethodUnderTest.getParameterAnnotations(); + Assert.assertEquals(expected.length, parameterAnnotations.length); + for (int i = 0; i < expected.length; i++) { + Assert.assertEquals(expected[i], parameterAnnotations[i].toString()); + } + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java index 67d166db7..29e579b2d 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeCTMethod.java @@ -17,6 +17,7 @@ import com.ibm.wala.shrikeBT.Decoder; import com.ibm.wala.shrikeBT.IndirectionData; import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder; import com.ibm.wala.shrikeCT.AnnotationsReader; +import com.ibm.wala.shrikeCT.AnnotationsReader.AnnotationType; import com.ibm.wala.shrikeCT.ClassReader; import com.ibm.wala.shrikeCT.ClassReader.AttrIterator; import com.ibm.wala.shrikeCT.CodeReader; @@ -24,9 +25,8 @@ import com.ibm.wala.shrikeCT.ExceptionsReader; import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.shrikeCT.LineNumberTableReader; import com.ibm.wala.shrikeCT.LocalVariableTableReader; -import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader; -import com.ibm.wala.shrikeCT.RuntimeVisibleAnnotationsReader; import com.ibm.wala.shrikeCT.SignatureReader; +import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.TypeReference; import com.ibm.wala.types.annotations.Annotation; import com.ibm.wala.types.generics.MethodTypeSignature; @@ -273,30 +273,11 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet return result; } - private AnnotationsReader getAnnotationsReader(boolean runtimeInvisible) { + private AnnotationsReader getAnnotationsReader(AnnotationType type) { ClassReader.AttrIterator iter = new AttrIterator(); getClassReader().initMethodAttributeIterator(shrikeMethodIndex, iter); - // search for the desired attribute - AnnotationsReader result = null; - try { - for (; iter.isValid(); iter.advance()) { - if (runtimeInvisible) { - if (iter.getName().equals(RuntimeInvisibleAnnotationsReader.attrName)) { - result = new RuntimeInvisibleAnnotationsReader(iter); - break; - } - } else { - if (iter.getName().equals(RuntimeVisibleAnnotationsReader.attrName)) { - result = new RuntimeVisibleAnnotationsReader(iter); - break; - } - } - } - } catch (InvalidClassFileException e) { - Assertions.UNREACHABLE(); - } - return result; + return AnnotationsReader.getReaderForAnnotation(type, iter); } private String computeGenericsSignature() throws InvalidClassFileException { @@ -353,7 +334,8 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet } public Collection getAnnotations(boolean runtimeInvisible) throws InvalidClassFileException { - AnnotationsReader r = getAnnotationsReader(runtimeInvisible); + AnnotationsReader r = getAnnotationsReader(runtimeInvisible ? AnnotationType.RuntimeInvisibleAnnotations + : AnnotationType.RuntimeVisibleAnnotations); return Annotation.getAnnotationsFromReader(r, getDeclaringClass().getClassLoader().getReference()); } @@ -369,6 +351,42 @@ public final class ShrikeCTMethod extends ShrikeBTMethod implements IBytecodeMet return result; } + /** + * get annotations on parameters as an array of Collections, where each array + * element gives the annotations on the corresponding parameter. Note that the + * 'this' parameter for an instance method cannot have annotations. + */ + public Collection[] getParameterAnnotations() { + int numAnnotatedParams = isStatic() ? getNumberOfParameters() : getNumberOfParameters() - 1; + @SuppressWarnings("unchecked") + Collection[] result = new Collection[numAnnotatedParams]; + for (int i = 0; i < result.length; i++) { + result[i] = HashSetFactory.make(); + } + try { + ClassLoaderReference reference = getDeclaringClass().getClassLoader().getReference(); + AnnotationsReader r = getAnnotationsReader(AnnotationType.RuntimeInvisibleParameterAnnotations); + Collection[] paramAnnots = Annotation.getParameterAnnotationsFromReader(r, reference); + if (paramAnnots != null) { + assert paramAnnots.length == result.length : paramAnnots.length + " != " + result.length; + for (int i = 0; i < result.length; i++) { + result[i].addAll(paramAnnots[i]); + } + } + r = getAnnotationsReader(AnnotationType.RuntimeVisibleParameterAnnotations); + paramAnnots = Annotation.getParameterAnnotationsFromReader(r, reference); + if (paramAnnots != null) { + assert paramAnnots.length == result.length; + for (int i = 0; i < result.length; i++) { + result[i].addAll(paramAnnots[i]); + } + } + } catch (InvalidClassFileException e) { + e.printStackTrace(); + } + return result; + } + private static final IndirectionData NO_INDIRECTIONS = new IndirectionData() { private final int[] NOTHING = new int[0]; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java index fc1061ff6..80e246ead 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/ShrikeClass.java @@ -18,13 +18,12 @@ import java.util.List; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.shrikeBT.Constants; import com.ibm.wala.shrikeCT.AnnotationsReader; +import com.ibm.wala.shrikeCT.AnnotationsReader.AnnotationType; import com.ibm.wala.shrikeCT.ClassConstants; import com.ibm.wala.shrikeCT.ClassReader; import com.ibm.wala.shrikeCT.ClassReader.AttrIterator; import com.ibm.wala.shrikeCT.InnerClassesReader; import com.ibm.wala.shrikeCT.InvalidClassFileException; -import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader; -import com.ibm.wala.shrikeCT.RuntimeVisibleAnnotationsReader; import com.ibm.wala.shrikeCT.SignatureReader; import com.ibm.wala.types.TypeName; import com.ibm.wala.types.TypeReference; @@ -47,9 +46,10 @@ public final class ShrikeClass extends JVMClass { * The Shrike object that knows how to read the class file */ private final ShrikeClassReaderHandle reader; - + /** - * @throws IllegalArgumentException if reader is null + * @throws IllegalArgumentException + * if reader is null */ public ShrikeClass(ShrikeClassReaderHandle reader, IClassLoader loader, IClassHierarchy cha) throws InvalidClassFileException { super(loader, cha); @@ -70,7 +70,8 @@ public final class ShrikeClass extends JVMClass { /** * Compute the fields declared by this class * - * @throws InvalidClassFileException iff Shrike fails to read the class file correctly + * @throws InvalidClassFileException + * iff Shrike fails to read the class file correctly */ private void computeFields() throws InvalidClassFileException { ClassReader cr = reader.get(); @@ -82,7 +83,7 @@ public final class ShrikeClass extends JVMClass { int accessFlags = cr.getFieldAccessFlags(i); Atom name = Atom.findOrCreateUnicodeAtom(cr.getFieldName(i)); ImmutableByteArray b = ImmutableByteArray.make(cr.getFieldType(i)); - Collection annotations = HashSetFactory.make(); + Collection annotations = HashSetFactory.make(); annotations.addAll(getRuntimeInvisibleAnnotations(i)); annotations.addAll(getRuntimeVisibleAnnotations(i)); annotations = annotations.isEmpty() ? null : annotations; @@ -111,9 +112,11 @@ public final class ShrikeClass extends JVMClass { modifiers = reader.get().getAccessFlags(); } - /** - * Note that this is called from the constructor, at which point this class is not yet ready to actually load the superclass. - * Instead, we pull out the name of the superclass and cache it here, to avoid hitting the reader later. + /** + * Note that this is called from the constructor, at which point this class is + * not yet ready to actually load the superclass. Instead, we pull out the + * name of the superclass and cache it here, to avoid hitting the reader + * later. */ private void computeSuperName() { try { @@ -127,8 +130,10 @@ public final class ShrikeClass extends JVMClass { } /** - * Note that this is called from the constructor, at which point this class is not yet ready to actually load the interfaces. - * Instead, we pull out the name of the interfaces and cache it here, to avoid hitting the reader later. + * Note that this is called from the constructor, at which point this class is + * not yet ready to actually load the interfaces. Instead, we pull out the + * name of the interfaces and cache it here, to avoid hitting the reader + * later. */ private void computeInterfaceNames() { try { @@ -161,11 +166,11 @@ public final class ShrikeClass extends JVMClass { return result; } - /** * initialize the TypeReference field for this instance * - * @throws InvalidClassFileException iff Shrike can't read this class + * @throws InvalidClassFileException + * iff Shrike can't read this class */ private void computeTypeReference() throws InvalidClassFileException { String className = "L" + reader.get().getName(); @@ -174,7 +179,6 @@ public final class ShrikeClass extends JVMClass { typeReference = TypeReference.findOrCreate(getClassLoader().getReference(), TypeName.findOrCreate(name)); } - /** * @see java.lang.Object#equals(Object) */ @@ -198,7 +202,7 @@ public final class ShrikeClass extends JVMClass { return null; } } - + /** * Clear all optional cached data associated with this class */ @@ -227,7 +231,7 @@ public final class ShrikeClass extends JVMClass { public Collection getRuntimeVisibleAnnotations() throws InvalidClassFileException { return getAnnotations(false); } - + @Override public Collection getAnnotations() { Collection result = HashSetFactory.make(); @@ -235,7 +239,7 @@ public final class ShrikeClass extends JVMClass { result.addAll(getAnnotations(true)); result.addAll(getAnnotations(false)); } catch (InvalidClassFileException e) { - + } return result; } @@ -250,29 +254,10 @@ public final class ShrikeClass extends JVMClass { ClassReader.AttrIterator attrs = new ClassReader.AttrIterator(); r.initClassAttributeIterator(attrs); - // search for the desired attribute - AnnotationsReader result = null; - try { - for (; attrs.isValid(); attrs.advance()) { - if (runtimeInvisable){ - if (attrs.getName().equals(RuntimeInvisibleAnnotationsReader.attrName)) { - result = new RuntimeInvisibleAnnotationsReader(attrs); - break; - } - } else { - if (attrs.getName().equals(RuntimeVisibleAnnotationsReader.attrName)) { - result = new RuntimeVisibleAnnotationsReader(attrs); - break; - } - } - } - } catch (InvalidClassFileException e) { - Assertions.UNREACHABLE(); - } - return result; + return AnnotationsReader.getReaderForAnnotation(runtimeInvisable ? AnnotationType.RuntimeInvisibleAnnotations + : AnnotationType.RuntimeVisibleAnnotations, attrs); } - private InnerClassesReader getInnerClassesReader() throws InvalidClassFileException { ClassReader r = reader.get(); ClassReader.AttrIterator attrs = new ClassReader.AttrIterator(); @@ -297,26 +282,8 @@ public final class ShrikeClass extends JVMClass { ClassReader.AttrIterator iter = new AttrIterator(); reader.get().initFieldAttributeIterator(fieldIndex, iter); - // search for the desired attribute - AnnotationsReader result = null; - try { - for (; iter.isValid(); iter.advance()) { - if (runtimeInvisible) { - if (iter.getName().equals(RuntimeInvisibleAnnotationsReader.attrName)) { - result = new RuntimeInvisibleAnnotationsReader(iter); - break; - } - } else { - if (iter.getName().equals(RuntimeVisibleAnnotationsReader.attrName)) { - result = new RuntimeVisibleAnnotationsReader(iter); - break; - } - } - } - } catch (InvalidClassFileException e) { - Assertions.UNREACHABLE(); - } - return result; + return AnnotationsReader.getReaderForAnnotation(runtimeInvisible ? AnnotationType.RuntimeInvisibleAnnotations + : AnnotationType.RuntimeVisibleAnnotations, iter); } /** @@ -332,7 +299,7 @@ public final class ShrikeClass extends JVMClass { public Collection getRuntimeVisibleAnnotations(int fieldIndex) throws InvalidClassFileException { return getFieldAnnotations(fieldIndex, false); } - + protected Collection getFieldAnnotations(int fieldIndex, boolean runtimeInvisible) throws InvalidClassFileException { AnnotationsReader r = getFieldAnnotationsReader(runtimeInvisible, fieldIndex); return Annotation.getAnnotationsFromReader(r, getClassLoader().getReference()); @@ -373,7 +340,8 @@ public final class ShrikeClass extends JVMClass { } /** - * Does the class file indicate that this class is a member of some other class? + * Does the class file indicate that this class is a member of some other + * class? * * @throws InvalidClassFileException */ @@ -411,10 +379,11 @@ public final class ShrikeClass extends JVMClass { } return false; } - + /** - * If this is an inner class, return the outer class. Else return null. - * @throws InvalidClassFileException + * If this is an inner class, return the outer class. Else return null. + * + * @throws InvalidClassFileException */ public TypeReference getOuterClass() throws InvalidClassFileException { if (!isInnerClass()) { @@ -431,7 +400,8 @@ public final class ShrikeClass extends JVMClass { } return null; } - + + @Override public Module getContainer() { return reader.getModuleEntry().getContainer(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/types/annotations/Annotation.java b/com.ibm.wala.core/src/com/ibm/wala/types/annotations/Annotation.java index ecf28572f..2080b3cf8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/types/annotations/Annotation.java +++ b/com.ibm.wala.core/src/com/ibm/wala/types/annotations/Annotation.java @@ -73,13 +73,7 @@ public class Annotation { public static Collection getAnnotationsFromReader(AnnotationsReader r, ClassLoaderReference clRef) throws InvalidClassFileException { if (r != null) { AnnotationAttribute[] allAnnotations = r.getAllAnnotations(); - Collection result = HashSetFactory.make(); - for (AnnotationAttribute annot : allAnnotations) { - String type = annot.type; - type = type.replaceAll(";", ""); - TypeReference t = TypeReference.findOrCreate(clRef, type); - result.add(makeWithNamed(t, annot.elementValues)); - } + Collection result = convertToAnnotations(clRef, allAnnotations); return result; } else { return Collections.emptySet(); @@ -87,6 +81,35 @@ public class Annotation { } + /** + * If r != null, return parameter annotations as an array with length equal to + * number of annotatable parameters. Otherwise, return null. + */ + @SuppressWarnings("unchecked") + public static Collection[] getParameterAnnotationsFromReader(AnnotationsReader r, ClassLoaderReference clRef) throws InvalidClassFileException { + if (r != null) { + AnnotationAttribute[][] allAnnots = r.getAllParameterAnnotations(); + Collection[] result = new Collection[allAnnots.length]; + for (int i = 0; i < result.length; i++) { + result[i] = convertToAnnotations(clRef, allAnnots[i]); + } + return result; + } else { + return null; + } + } + + protected static Collection convertToAnnotations(ClassLoaderReference clRef, AnnotationAttribute[] allAnnotations) { + Collection result = HashSetFactory.make(); + for (AnnotationAttribute annot : allAnnotations) { + String type = annot.type; + type = type.replaceAll(";", ""); + TypeReference t = TypeReference.findOrCreate(clRef, type); + result.add(makeWithNamed(t, annot.elementValues)); + } + return result; + } + @Override public String toString() { StringBuffer sb = new StringBuffer("Annotation type " + type); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/ClassPrinter.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/ClassPrinter.java index f51bbcb3e..8da0a1432 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/ClassPrinter.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeBT/shrikeCT/tools/ClassPrinter.java @@ -32,8 +32,6 @@ import com.ibm.wala.shrikeCT.ConstantValueReader; import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.shrikeCT.LineNumberTableReader; import com.ibm.wala.shrikeCT.LocalVariableTableReader; -import com.ibm.wala.shrikeCT.RuntimeInvisibleAnnotationsReader; -import com.ibm.wala.shrikeCT.RuntimeVisibleAnnotationsReader; import com.ibm.wala.shrikeCT.SignatureReader; import com.ibm.wala.shrikeCT.SourceFileReader; @@ -266,11 +264,8 @@ public class ClassPrinter { } else if (name.equals("Signature")) { SignatureReader sr = new SignatureReader(attrs); w.write(" signature: " + cr.getCP().getCPUtf8(sr.getSignatureCPIndex()) + "\n"); - } else if (name.equals(RuntimeInvisibleAnnotationsReader.attrName)) { - AnnotationsReader r = new RuntimeInvisibleAnnotationsReader(attrs); - printAnnotations(cr, attrs, r); - } else if (name.equals(RuntimeVisibleAnnotationsReader.attrName)) { - AnnotationsReader r = new RuntimeVisibleAnnotationsReader(attrs); + } else if (AnnotationsReader.isKnownAnnotation(name)) { + AnnotationsReader r = new AnnotationsReader(attrs, name); printAnnotations(cr, attrs, r); } else { int len = attrs.getDataSize(); diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/AnnotationsReader.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/AnnotationsReader.java index 2a0faafdf..cae7cc491 100644 --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/AnnotationsReader.java +++ b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/AnnotationsReader.java @@ -15,6 +15,7 @@ import java.util.Map; import com.ibm.wala.util.collections.HashMapFactory; import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.debug.Assertions; /** * This class reads Annotations attributes, e.g., RuntimeInvisibleAnnotations. @@ -74,6 +75,7 @@ public class AnnotationsReader extends AttributeReader { * @see AnnotationsReader#readElementValueAndSize(int) * */ + @SuppressWarnings("javadoc") public static interface ElementValue { } @@ -104,12 +106,12 @@ public class AnnotationsReader extends AttributeReader { * Represents enum constant annotation arguments. */ public static class EnumElementValue implements ElementValue { - + /** * the name of the enum type */ public final String enumType; - + /** * the enum value */ @@ -151,7 +153,7 @@ public class AnnotationsReader extends AttributeReader { } /** - * get all the annotations declared in this attribute. + * get all the annotations declared in this attribute. * * @throws InvalidClassFileException */ @@ -167,6 +169,37 @@ public class AnnotationsReader extends AttributeReader { return result; } + /** + *
    +   * param_annotations {
    +   *   u2 attribute_name_index;
    +   *   u4 attribute_length;
    +   *   u1 num_parameters;
    +   *   {
    +   *     u2 num_annotations;
    +   *     annotation annotations[num_annotations];
    +   *   } parameter_annotations[num_parameters];
    +   * 
    + */ + public AnnotationAttribute[][] getAllParameterAnnotations() throws InvalidClassFileException { + int numParamOffset = beginOffset + 6; + checkSize(numParamOffset, 1); + int paramCount = cr.getByte(numParamOffset); + AnnotationAttribute[][] result = new AnnotationAttribute[paramCount][]; + // skip attribute_name_index, attribute_length, and num_parameters + int offset = beginOffset + 7; + for (int i = 0; i < result.length; i++) { + checkSize(offset, 2); + result[i] = new AnnotationAttribute[cr.getUShort(offset)]; + offset += 2; + for (int j = 0; j < result[i].length; j++) { + Pair attributeAndSize = getAttributeAndSize(offset); + result[i][j] = attributeAndSize.fst; + offset += attributeAndSize.snd; + } + } + return result; + } /** *
        * annotation { 
    @@ -302,7 +335,7 @@ public class AnnotationsReader extends AttributeReader {
           }
           return Pair. make(new ArrayElementValue(vals), numArrayBytes);
         case '@': // annotation
    -      Pair attributeAndSize = getAttributeAndSize(offset+1);
    +      Pair attributeAndSize = getAttributeAndSize(offset + 1);
           // add 1 to size for the tag
           return Pair. make(attributeAndSize.fst, attributeAndSize.snd + 1);
         default:
    @@ -311,4 +344,35 @@ public class AnnotationsReader extends AttributeReader {
         }
       }
     
    +  // //////////////
    +  // utility methods for reading well-known annotation types
    +  // //////////////
    +
    +  public static enum AnnotationType {
    +    RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations
    +  }
    +  
    +  public static boolean isKnownAnnotation(String name) {
    +    for (AnnotationType t : AnnotationType.values()) {
    +      if (t.name().equals(name)) {
    +        return true;
    +      }
    +    }
    +    return false;
    +  }
    +  
    +  public static AnnotationsReader getReaderForAnnotation(AnnotationType type, ClassReader.AttrIterator iter) {
    +    // search for the desired attribute
    +    final String attrName = type.toString();
    +    try {
    +      for (; iter.isValid(); iter.advance()) {
    +        if (iter.getName().equals(attrName)) {
    +          return new AnnotationsReader(iter, attrName);
    +        }
    +      }
    +    } catch (InvalidClassFileException e) {
    +      Assertions.UNREACHABLE();
    +    }
    +    return null;
    +  }
     }
    \ No newline at end of file
    diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeInvisibleAnnotationsReader.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeInvisibleAnnotationsReader.java
    deleted file mode 100644
    index 0f2ee8a52..000000000
    --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeInvisibleAnnotationsReader.java
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -/*******************************************************************************
    - * Copyright (c) 2002,2006 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.shrikeCT;
    -
    -/**
    - * This class reads RuntimeInvisibleAnnotations attributes.
    - * 
    - * @author sjfink
    - */
    -public final class RuntimeInvisibleAnnotationsReader extends AnnotationsReader {
    -
    -  public static final String attrName = "RuntimeInvisibleAnnotations";
    -
    -  public RuntimeInvisibleAnnotationsReader(ClassReader.AttrIterator iter) throws InvalidClassFileException {
    -    super(iter, attrName);
    -  }
    -}
    \ No newline at end of file
    diff --git a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeVisibleAnnotationsReader.java b/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeVisibleAnnotationsReader.java
    deleted file mode 100644
    index 8ae3d7ea7..000000000
    --- a/com.ibm.wala.shrike/src/com/ibm/wala/shrikeCT/RuntimeVisibleAnnotationsReader.java
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -/*******************************************************************************
    - * Copyright (c) 2002,2006 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.shrikeCT;
    -
    -/**
    - * This class reads RuntimeVisibleAnnotations attributes.
    - * 
    - * @author sjfink
    - */
    -public final class RuntimeVisibleAnnotationsReader extends AnnotationsReader {
    -
    -  public final static String attrName = "RuntimeVisibleAnnotations";
    -
    -  public RuntimeVisibleAnnotationsReader(ClassReader.AttrIterator iter) throws InvalidClassFileException {
    -    super(iter, attrName);
    -  }
    -}
    \ No newline at end of file
    

  • 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