diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
index 32b6d23..45b6f30 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
@@ -28,28 +28,48 @@
package gr.gousiosg.javacg.dyn;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Stack;
public class Graph {
+ private static Stack<String> stack = new Stack<String>();
+ private static Map<Pair<String, String>, Integer> callgraph = new HashMap<Pair<String,String>, Integer>();
+
static {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
- for (String key : callgraph.keySet()) {
+ //Sort by number of calls
+ List<Pair<String, String>> keys = new ArrayList<Pair<String, String>>();
+ keys.addAll(callgraph.keySet());
+ Collections.sort(keys, new Comparator<Object>() {
+ public int compare(Object o1, Object o2) {
+ Integer v1 = callgraph.get(o1);
+ Integer v2 = callgraph.get(o2);
+ return v1.compareTo(v2);
+ }
+ });
+
+ for (Pair<String, String> key : keys) {
System.err.println(key + " " + callgraph.get(key));
}
}
});
}
- private static Stack<String> stack = new Stack<String>();
- private static Map<String, String> callgraph = new HashMap<String, String>();
-
public static void push(String callname) {
- if (!stack.isEmpty())
- callgraph.put(stack.peek(), callname);
+ if (!stack.isEmpty()) {
+ Pair<String, String> p = new Pair<String, String>(stack.peek(), callname);
+ if (callgraph.containsKey(p))
+ callgraph.put(p, callgraph.get(p) + 1);
+ else
+ callgraph.put(p, 1);
+ }
stack.push(callname);
}
diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java b/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
index 1db21d5..9e9074b 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
@@ -170,6 +170,6 @@ public class Instrumenter implements ClassFileTransformer {
}
private static void err(String msg) {
- System.err.println("[JAVACG-DYN] " + msg);
+ //System.err.println("[JAVACG-DYN] " + msg);
}
}
\ No newline at end of file
diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Pair.java b/src/main/java/gr/gousiosg/javacg/dyn/Pair.java
new file mode 100644
index 0000000..2328b07
--- /dev/null
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Pair.java
@@ -0,0 +1,42 @@
+package gr.gousiosg.javacg.dyn;
+
+public class Pair<A, B> {
+
+ public A first;
+ public B second;
+
+ public Pair(A first, B second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer b = new StringBuffer(first.toString());
+ b.append(" ");
+ b.append(second);
+ return b.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null)
+ return false;
+ if (obj == this)
+ return true;
+ if (obj.getClass() != getClass())
+ return false;
+
+ Pair p = (Pair)obj;
+
+ return first.equals(p.first) && second.equals(p.second);
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 7;
+ hash = 31 * hash + (null == first ? 0 : first.hashCode());
+ hash = 31 * hash + (null == second ? 0 : second.hashCode());
+ return hash;
+ }
+}