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 3cd49addf..c940e502f 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 @@ -99,7 +99,7 @@ public class PropertyNameContextSelector implements ContextSelector { @Override public ContextItem get(ContextKey key) { if (INSTANCE_KEY_KEY.equals(key)) { - return ((SingleInstanceFilter)super.get(ContextKey.PARAMETERS[index])).getInstance(); + return ContextItem.Value.make(((SingleInstanceFilter)super.get(ContextKey.PARAMETERS[index])).getInstance()); } else { final ContextItem contextItem = super.get(key); return (contextItem instanceof SingleInstanceFilter) ? null : contextItem; 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 fa5289d03..af9210925 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 @@ -338,6 +338,7 @@ public abstract class AstMethod implements IMethod { return debugInfo.getCodeBodyPosition(); } + @Override public Position getSourcePosition(int instructionIndex) { return debugInfo.getInstructionPosition(instructionIndex); } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstNode.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstNode.java index 36a3af603..8f16af2a1 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstNode.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/CAstNode.java @@ -157,9 +157,10 @@ public interface CAstNode { public static final int TYPE_LITERAL_EXPR = 127; public static final int IS_DEFINED_EXPR = 128; public static final int MACRO_VAR = 129; + public static final int NARY_EXPR = 130; // new nodes with an explicit enclosing argument, e.g. "outer.new Inner()". They are mostly treated the same, except in JavaCAst2IRTranslator.doNewObject - public static final int NEW_ENCLOSING = 130; + public static final int NEW_ENCLOSING = 131; // explicit lexical scopes public static final int LOCAL_SCOPE = 200; 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 847cc711e..192668fdb 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 @@ -71,6 +71,7 @@ public class CAstOperator implements CAstNode { public final static CAstOperator OP_LSH = new CAstOperator("<<"); public final static CAstOperator OP_MOD = new CAstOperator("%"); public final static CAstOperator OP_MUL = new CAstOperator("*"); + public final static CAstOperator OP_POW = new CAstOperator("^^^"); public final static CAstOperator OP_RSH = new CAstOperator(">>"); public final static CAstOperator OP_URSH = new CAstOperator(">>>"); public final static CAstOperator OP_SUB = new CAstOperator("-"); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java index 7ce3eb437..f62b837ef 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstPrinter.java @@ -91,6 +91,7 @@ public class CAstPrinter { case CAstNode.LIST_EXPR: return "LIST_EXPR"; case CAstNode.EMPTY_LIST_EXPR: return "EMPTY_LIST_EXPR"; case CAstNode.IS_DEFINED_EXPR: return "IS_DEFINED_EXPR"; + case CAstNode.NARY_EXPR: return "NARY_EXPR"; // explicit lexical scopes case CAstNode.LOCAL_SCOPE: return "SCOPE"; 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 fbbf69c9d..d5b6c6028 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 @@ -13,12 +13,14 @@ package com.ibm.wala.core.tests.basic; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Set; import org.junit.Assert; import org.junit.Test; +import com.ibm.wala.core.tests.util.WalaTestCase; import com.ibm.wala.util.graph.INodeWithNumberedEdges; import com.ibm.wala.util.graph.NumberedGraph; import com.ibm.wala.util.graph.impl.DelegatingNumberedGraph; @@ -29,7 +31,7 @@ import com.ibm.wala.util.intset.IntSet; import com.ibm.wala.util.intset.IntSetUtil; import com.ibm.wala.util.intset.MutableIntSet; -public class FloydWarshallTest { +public class FloydWarshallTest extends WalaTestCase { public static class Node implements INodeWithNumberedEdges { private final int number; @@ -87,11 +89,16 @@ public class FloydWarshallTest { @Override public String toString() { - return "["+number+"]"; + return "<"+number+">"; + } + + @Override + public boolean equals(Object o) { + return this == o; } } - private static NumberedGraph makeGraph() { + public static NumberedGraph makeGraph() { NumberedGraph G = new DelegatingNumberedGraph(); for(int i = 0; i <= 8; i++) { @@ -142,19 +149,29 @@ public class FloydWarshallTest { @Test public void TestShortestPath() { GetPath result = FloydWarshall.allPairsShortestPath(G); - Assert.assertEquals(result.getPath(G.getNode(1), G.getNode(3)), Collections.singletonList(G.getNode(2))); - Assert.assertEquals(result.getPath(G.getNode(5), G.getNode(8)), Collections.singletonList(G.getNode(7))); - Assert.assertEquals(result.getPath(G.getNode(1), G.getNode(7)), Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(5))); - Assert.assertEquals(result.getPath(G.getNode(1), G.getNode(6)), Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(4))); + assertEquals(result.getPath(G.getNode(1), G.getNode(3)), Collections.singletonList(G.getNode(2))); + assertEquals(result.getPath(G.getNode(5), G.getNode(8)), Collections.singletonList(G.getNode(7))); + assertEquals(result.getPath(G.getNode(1), G.getNode(7)), Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(5))); + assertEquals(result.getPath(G.getNode(1), G.getNode(6)), Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(4))); } @Test public void TestShortestPaths() { GetPaths result = FloydWarshall.allPairsShortestPaths(G); + Set> expectedPaths = expectedPaths(G); + Set> resultPaths = result.getPaths(G.getNode(1), G.getNode(8)); + + assertEquals(resultPaths.size(), expectedPaths.size()); + for(List rp : resultPaths) { + Assert.assertTrue(expectedPaths.contains(rp)); + } + } + + public static Set> expectedPaths(NumberedGraph G) { Set> paths = new HashSet>(); - paths.add(Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(4),G.getNode(6))); - paths.add(Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(5),G.getNode(7))); - Assert.assertEquals(result.getPaths(G.getNode(1), G.getNode(8)), paths); + paths.add(new LinkedList(Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(4),G.getNode(6)))); + paths.add(new LinkedList(Arrays.asList(G.getNode(2),G.getNode(3),G.getNode(5),G.getNode(7)))); + return paths; } } 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 6f5e77037..3a5e310f2 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 @@ -106,7 +106,7 @@ public class GraphDataflowTest extends WalaTestCase { /** * @return a graph with the expected structure */ - private static Graph buildGraph() { + public static Graph buildGraph() { Graph G = SlowSparseNumberedGraph.make(); for (int i = 0; i < nodeNames.length(); i++) { String n = nodeNames.substring(i, i + 1); @@ -126,10 +126,10 @@ public class GraphDataflowTest extends WalaTestCase { * Solve the dataflow system and return the result as a string * @throws CancelException */ - private static String solveNodeOnly(Graph G) throws CancelException { + public static String solveNodeOnly(Graph G) throws CancelException { final OrdinalSetMapping values = new MutableMapping(nodes); ITransferFunctionProvider functions = new ITransferFunctionProvider() { - + @Override public UnaryOperator getNodeTransferFunction(String node) { return new BitVectorUnionConstant(values.getMappedIndex(node)); @@ -164,7 +164,7 @@ public class GraphDataflowTest extends WalaTestCase { return result2String(s); } - private static String solveNodeEdge(Graph G) throws CancelException { + public static String solveNodeEdge(Graph G) throws CancelException { final OrdinalSetMapping values = new MutableMapping(nodes); ITransferFunctionProvider functions = new ITransferFunctionProvider() { 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 d976d8f25..b5214a9b5 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 @@ -13,6 +13,7 @@ package com.ibm.wala.core.tests.util; import java.io.IOException; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.runner.JUnitCore; @@ -83,4 +84,7 @@ public abstract class WalaTestCase { JUnitCore.runClasses(testClass); } + protected void assertEquals(T x, T y) { + Assert.assertEquals("Expecting " + x + ", but got " + y, x, y); + } } 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 bc9a8bce6..87130f7e2 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 @@ -63,6 +63,7 @@ public class ScopeFileCallGraph { String scopeFile = p.getProperty("scopeFile"); String entryClass = p.getProperty("entryClass"); String mainClass = p.getProperty("mainClass"); + String dump = p.getProperty("dump"); if (mainClass != null && entryClass != null) { throw new IllegalArgumentException("only specify one of mainClass or entryClass"); } @@ -87,6 +88,9 @@ public class ScopeFileCallGraph { CallGraph cg = builder.makeCallGraph(options, null); long end = System.currentTimeMillis(); System.out.println("done"); + if (dump != null) { + System.err.println(cg); + } 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/propagation/PropagationGraph.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/PropagationGraph.java index ef549b44d..d78ea2078 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 @@ -439,7 +439,7 @@ public class PropagationGraph implements IFixedPointSystem public void reorder() { VariableGraphView graph = new VariableGraphView(); - Iterator order = Topological.makeTopologicalIter(graph); + Iterator order = Topological.makeTopologicalIter(graph).iterator(); int number = 0; while (order.hasNext()) { 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 c9be12f0d..344f82b0a 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 @@ -556,11 +556,15 @@ public class SDG extends AbstractNumberedGraph case PARAM_CALLER: { ParamCaller pac = (ParamCaller) N; SSAAbstractInvokeInstruction call = pac.getInstruction(); + int numParamsPassed = call.getNumberOfUses(); Collection result = HashSetFactory.make(5); if (!dOptions.equals(DataDependenceOptions.NONE)) { // data dependence successors for (CGNode t : cg.getPossibleTargets(N.getNode(), call.getCallSite())) { - for (int i = 0; i < t.getMethod().getNumberOfParameters(); i++) { + // in some languages (*cough* JavaScript *cough*) you can pass + // fewer parameters than the number of formals. So, only loop + // over the parameters actually being passed here + for (int i = 0; i < t.getMethod().getNumberOfParameters() && i < numParamsPassed; i++) { if (dOptions.isTerminateAtCast() && call.isDispatch() && pac.getValueNumber() == call.getReceiver()) { // a virtual dispatch is just like a cast. continue; diff --git a/com.ibm.wala.dalvik.test/build.xml b/com.ibm.wala.dalvik.test/build.xml index ff034f05d..5bbece6b9 100644 --- a/com.ibm.wala.dalvik.test/build.xml +++ b/com.ibm.wala.dalvik.test/build.xml @@ -64,6 +64,7 @@ + diff --git a/com.ibm.wala.dalvik/build.xml b/com.ibm.wala.dalvik/build.xml index fa4bc6276..8dfd5a3ae 100755 --- a/com.ibm.wala.dalvik/build.xml +++ b/com.ibm.wala.dalvik/build.xml @@ -51,14 +51,7 @@ - - - - - - - - + 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 7c29c7eb8..8eaa67ffc 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 @@ -208,7 +208,7 @@ public class DefaultFixedPointSystem> implements IFixedPo checkGraph(); } - Iterator order = Topological.makeTopologicalIter(graph); + Iterator order = Topological.makeTopologicalIter(graph).iterator(); int number = 0; while (order.hasNext()) { Object elt = order.next(); 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 1f0faee63..64e630c48 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 @@ -47,21 +47,21 @@ public class Pair implements Serializable { public Iterator iterator() { return new Iterator() { - byte next = 1; + byte nextFlag = 1; @Override public boolean hasNext() { - return next > 0; + return nextFlag > 0; } @Override public Object next() { - switch (next) { + switch (nextFlag) { case 1 : - next++; + nextFlag++; return fst; case 2 : - next = 0; + nextFlag = 0; return snd; default : throw new NoSuchElementException(); 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 d679ce3ed..f773dfb9f 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 @@ -69,31 +69,31 @@ public class DelegatingNumberedNodeManager implements public Iterator iterator() { final INodeWithNumber[] arr = nodes; return new Iterator() { - int next = -1; + int nextCounter = -1; { advance(); } void advance() { - for (int i = next + 1; i < arr.length; i++) { + for (int i = nextCounter + 1; i < arr.length; i++) { if (arr[i] != null) { - next = i; + nextCounter = i; return; } } - next = -1; + nextCounter = -1; } @Override public boolean hasNext() { - return next != -1; + return nextCounter != -1; } @Override @SuppressWarnings("unchecked") public T next() { if (hasNext()) { - int r = next; + int r = nextCounter; advance(); return (T) arr[r]; } else { 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 7fca8996d..b76ac8dcc 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 @@ -10,6 +10,7 @@ *******************************************************************************/ package com.ibm.wala.util.graph.traverse; +import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Stack; @@ -24,7 +25,7 @@ import com.ibm.wala.util.graph.NumberedGraph; * increasing discover time. This class follows the outNodes of the graph nodes to define the graph, but this behavior can be * changed by overriding the getConnected method. */ -public abstract class DFSDiscoverTimeIterator extends Stack implements Iterator { +public abstract class DFSDiscoverTimeIterator extends ArrayList implements Iterator { /** * an enumeration of all nodes to search from @@ -136,4 +137,23 @@ public abstract class DFSDiscoverTimeIterator extends Stack implements Ite protected void visitEdge(T from, T to) { // do nothing. subclasses will override. } + + private boolean empty() { + return size() == 0; + } + + private void push(T elt) { + add(elt); + } + + private T peek() { + return get(size()-1); + } + + private T pop() { + T e = get(size()-1); + remove(size()-1); + return e; + } + } 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 040e226d2..1cfff85d7 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 @@ -10,9 +10,9 @@ *******************************************************************************/ package com.ibm.wala.util.graph.traverse; +import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; -import java.util.Stack; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.debug.UnimplementedError; @@ -23,7 +23,7 @@ import com.ibm.wala.util.graph.Graph; * finishing time. This class follows the outNodes of the graph nodes to define the graph, but this behavior can be changed by * overriding the getConnected method. */ -public abstract class DFSFinishTimeIterator extends Stack implements Iterator { +public abstract class DFSFinishTimeIterator extends ArrayList implements Iterator { /** * the current next element in finishing time order @@ -53,6 +53,10 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera theNextElement = roots.next(); } + private boolean empty() { + return size() == 0; + } + /** * Return whether there are any more nodes left to enumerate. * @@ -67,6 +71,20 @@ public abstract class DFSFinishTimeIterator extends Stack implements Itera abstract void setPendingChildren(T v, Iterator iterator); + private void push(T elt) { + add(elt); + } + + private T peek() { + return get(size()-1); + } + + private T pop() { + T e = get(size()-1); + remove(size()-1); + return e; + } + /** * Find the next graph node in finishing time order. * diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSPathFinder.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSPathFinder.java index a29c9b6b4..fe8951ea0 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSPathFinder.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/DFSPathFinder.java @@ -28,7 +28,7 @@ import com.ibm.wala.util.graph.Graph; * This class follows the outNodes of the graph nodes to define the graph, but this behavior can be changed by overriding the * getConnected method. */ -public class DFSPathFinder extends Stack { +public class DFSPathFinder extends ArrayList { public static final long serialVersionUID = 9939900773328288L; /** @@ -208,4 +208,23 @@ public class DFSPathFinder extends Stack { protected Iterator getConnected(T n) { return G.getSuccNodes(n); } + + private boolean empty() { + return size() == 0; + } + + private void push(T elt) { + add(elt); + } + + private T peek() { + return get(size()-1); + } + + private T pop() { + T e = get(size()-1); + remove(size()-1); + return e; + } + } 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 25b03fab2..220a8c39c 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 @@ -10,6 +10,7 @@ *******************************************************************************/ package com.ibm.wala.util.graph.traverse; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; @@ -100,7 +101,7 @@ public class FloydWarshall { public static GetPath allPairsShortestPath(final NumberedGraph G) { return new FloydWarshall(G) { int[][] next = new int[G.getNumberOfNodes()][G.getNumberOfNodes()]; - + @Override protected void pathCallback(int i, int j, int k) { next[i][j] = k; @@ -115,6 +116,22 @@ public class FloydWarshall { final int[][] paths = allPairsShortestPaths(); return new GetPath() { + + @Override + public String toString() { + String s = ""; + for(int i = 0; i <= G.getMaxNumber(); i++) { + for(int j = 0; j <= G.getMaxNumber(); j++) { + try { + s += getPath(G.getNode(i), G.getNode(j)); + } catch (UnsupportedOperationException e) { + + } + } + } + return s; + } + @Override public List getPath(T from, T to) { int fn = G.getNumber(from); @@ -154,7 +171,23 @@ public class FloydWarshall { private GetPaths doit() { final int[][] paths = allPairsShortestPaths(); return new GetPaths() { - @Override + + @Override + public String toString() { + List>> x = new ArrayList>>(); + for(int i = 0; i <= G.getMaxNumber(); i++) { + for(int j = 0; j <= G.getMaxNumber(); j++) { + try { + x.add(getPaths(G.getNode(i), G.getNode(j))); + } catch (UnsupportedOperationException e) { + + } + } + } + return x.toString(); + } + + @Override public Set> getPaths(final T from, final T to) { int fn = G.getNumber(from); int tn = G.getNumber(to); diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/Topological.java b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/Topological.java index 172a8671e..19f975523 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/Topological.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/graph/traverse/Topological.java @@ -26,29 +26,33 @@ public class Topological { * * @throws IllegalArgumentException if graph == null */ - public static Iterator makeTopologicalIter(Graph graph) throws IllegalArgumentException { - // the following code ensures a topological order over SCCs. - // note that the first two lines of the following give a topological - // order for dags, but that can get screwed up by cycles. so - // instead, we use Tarjan's SCC algorithm, which happens to - // visit nodes in an order consistent with a top. order over SCCs. - + public static Iterable makeTopologicalIter(final Graph graph) throws IllegalArgumentException { if (graph == null) { throw new IllegalArgumentException("graph == null"); } - // finish time is post-order - // note that if you pay attention only to the first representative - // of each SCC discovered, we have a top. order of these SCC - // representatives - Iterator finishTime = DFS.iterateFinishTime(graph); - // reverse postorder is usual topological sort. - Iterator rev = ReverseIterator.reverse(finishTime); - // the following statement helps out the GC; note that finishTime holds - // on to a large array - finishTime = null; - Graph G_T = GraphInverter.invert(graph); - Iterator order = DFS.iterateFinishTime(G_T, rev); - return order; - } -} + return new Iterable() { + @Override + public Iterator iterator() { + // the following code ensures a topological order over SCCs. + // note that the first two lines of the following give a topological + // order for dags, but that can get screwed up by cycles. so + // instead, we use Tarjan's SCC algorithm, which happens to + // visit nodes in an order consistent with a top. order over SCCs. + + // finish time is post-order + // note that if you pay attention only to the first representative + // of each SCC discovered, we have a top. order of these SCC + // representatives + Iterator finishTime = DFS.iterateFinishTime(graph); + // reverse postorder is usual topological sort. + Iterator rev = ReverseIterator.reverse(finishTime); + // the following statement helps out the GC; note that finishTime holds + // on to a large array + finishTime = null; + Graph G_T = GraphInverter.invert(graph); + return DFS.iterateFinishTime(G_T, rev); + }; + }; + } +} \ No newline at end of file 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 080133da9..d86ffee34 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 @@ -17,10 +17,9 @@ import java.util.SortedSet; import java.util.TreeSet; import com.ibm.wala.util.collections.HashMapFactory; -import com.ibm.wala.util.graph.INodeWithNumber; import com.ibm.wala.util.graph.NumberedGraph; -public class WelshPowell { +public class WelshPowell { public static class ColoredVertices { private final boolean fullColoring; @@ -59,6 +58,10 @@ public class WelshPowell { this.numColors = numColors; } + @Override + public String toString() { + return colors.toString(); + } } public static Comparator defaultComparator(final NumberedGraph G) { @@ -101,29 +104,29 @@ public class WelshPowell { int colored = 0; for(T n : vertices) { - int id = n.getGraphNodeId(); + int id = G.getNumber(n); if (colors[id] == -1) { colors[id] = currentColor; colored++; for(T m : vertices) { - if (colors[m.getGraphNodeId()] == -1) { + if (colors[G.getNumber(m)] == -1) { color_me: { for(Iterator ps = G.getPredNodes(m); ps.hasNext(); ) { T p = ps.next(); - if (colors[ p.getGraphNodeId() ] == currentColor) { + if (colors[ G.getNumber(p) ] == currentColor) { break color_me; } } for(Iterator ss = G.getSuccNodes(m); ss.hasNext(); ) { T s = ss.next(); - if (colors[s.getGraphNodeId()] == currentColor) { + if (colors[G.getNumber(s)] == currentColor) { break color_me; } } - colors[m.getGraphNodeId()] = currentColor; + colors[G.getNumber(m)] = currentColor; colored++; if (currentColor == maxColors - 1) { diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitSet.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitSet.java index 4ef7279d1..741c24fb5 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitSet.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitSet.java @@ -145,11 +145,11 @@ public final class BitSet { */ public Iterator iterator() { return new Iterator() { - private int next = -1; + private int nextCounter = -1; { for (int i = 0; i < vector.length(); i++) { if (vector.get(i)) { - next = i; + nextCounter = i; break; } } @@ -157,17 +157,17 @@ public final class BitSet { @Override public boolean hasNext() { - return (next != -1); + return (nextCounter != -1); } @Override public T next() { - T result = map.getMappedObject(next); - int start = next + 1; - next = -1; + T result = map.getMappedObject(nextCounter); + int start = nextCounter + 1; + nextCounter = -1; for (int i = start; i < vector.length(); i++) { if (vector.get(i)) { - next = i; + nextCounter = i; break; } }