java-callgraph

Various fixes, it almost runs now

6/12/2011 2:18:13 PM

Details

diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
index fec5a44..32b6d23 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
@@ -28,19 +28,32 @@
 
 package gr.gousiosg.javacg.dyn;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Stack;
 
 public class Graph {
 
+    static {
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            public void run() {
+                for (String key : callgraph.keySet()) {
+                    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 pushNode(String className, String methodName) {
-        String entry = className + ":" + methodName;
-        System.err.println(stack.peek() + " " + entry);
-        stack.push(entry);
+    public static void push(String callname) {
+        if (!stack.isEmpty())
+            callgraph.put(stack.peek(), callname);
+        stack.push(callname);
     }
 
-    public static void popNode() {
+    public static void pop() {
         stack.pop();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java b/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
index fe804ae..1db21d5 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Instrumenter.java
@@ -28,6 +28,8 @@
 
 package gr.gousiosg.javacg.dyn;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.Instrumentation;
 import java.util.ArrayList;
@@ -60,7 +62,7 @@ public class Instrumenter implements ClassFileTransformer {
 
         String[] tokens = argument.split(";");
 
-        if (tokens.length <= 1) {
+        if (tokens.length < 1) {
             err("Missing delimeter ;");
             return;
         }
@@ -83,13 +85,13 @@ public class Instrumenter implements ClassFileTransformer {
 
             for (String pattern : patterns) {
                 Pattern p = null;
-                err("Compiling " + argtype + " pattern:" + pattern);
+                err("Compiling " + argtype + " pattern:" + pattern + "$");
                 try {
-                    p = Pattern.compile(pattern);
+                    p = Pattern.compile(pattern + "$");
                 } catch (PatternSyntaxException pse) {
                     err("pattern: " + pattern + " not valid, ignoring");
                 }
-                if (argtype.equals("inc"))
+                if (argtype.equals("incl"))
                     pkgIncl.add(p);
                 else
                     pkgExcl.add(p);
@@ -104,7 +106,6 @@ public class Instrumenter implements ClassFileTransformer {
         boolean enhanceClass = false;
 
         String name = className.replace("/", ".");
-        err("Examining class: " + name);
 
         for (Pattern p : pkgIncl) {
             Matcher m = p.matcher(name);
@@ -117,6 +118,7 @@ public class Instrumenter implements ClassFileTransformer {
         for (Pattern p : pkgExcl) {
             Matcher m = p.matcher(name);
             if (m.matches()) {
+                err("Not enhansing class: " + name);
                 enhanceClass = false;
                 break;
             }
@@ -125,7 +127,6 @@ public class Instrumenter implements ClassFileTransformer {
         if (enhanceClass) {
             return enhanceClass(className, bytes);
         } else {
-            err("Examining class: " + name);
             return bytes;
         }
     }
@@ -134,8 +135,9 @@ public class Instrumenter implements ClassFileTransformer {
         ClassPool pool = ClassPool.getDefault();
         CtClass clazz = null;
         try {
-            clazz = pool.makeClass(new java.io.ByteArrayInputStream(b));
+            clazz = pool.makeClass(new ByteArrayInputStream(b));
             if (!clazz.isInterface()) {
+                err("Enhancing class: " + name);
                 CtBehavior[] methods = clazz.getDeclaredBehaviors();
                 for (int i = 0; i < methods.length; i++) {
                     if (!methods[i].isEmpty()) {
@@ -144,10 +146,14 @@ public class Instrumenter implements ClassFileTransformer {
                 }
                 b = clazz.toBytecode();
             }
-        } catch (Exception e) {
+        } catch (CannotCompileException e) {
             e.printStackTrace();
-            throw new RuntimeException("Could not instrument  " + name
-                    + ",  exception : " + e.getMessage());
+            err("Cannot compile: " + e.getMessage());
+        } catch (NotFoundException e) {
+            e.printStackTrace();
+            err("Cannot find: " + e.getMessage());
+        } catch (IOException e) {
+            err("Error writing: " + e.getMessage());
         } finally {
             if (clazz != null) {
                 clazz.detach();
@@ -158,9 +164,9 @@ public class Instrumenter implements ClassFileTransformer {
 
     private void enhanceMethod(CtBehavior method, String className)
             throws NotFoundException, CannotCompileException {
-        method.insertBefore("gr.gousiosg.javacg.dyn.push(\"" + className
-                + "\",\"" + method.getName() + "\");");
-        method.insertAfter("gr.gousiosg.javacg.dyn.pop();");
+        method.insertBefore("gr.gousiosg.javacg.dyn.Graph.push(\"" + className
+                + ":" + method.getName() + "\");");
+        method.insertAfter("gr.gousiosg.javacg.dyn.Graph.pop();");
     }
 
     private static void err(String msg) {