]> source.dussan.org Git - javassist.git/commitdiff
fixed JASSIST-168
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 5 Jun 2012 14:53:58 +0000 (14:53 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 5 Jun 2012 14:53:58 +0000 (14:53 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@631 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

build.xml
src/main/javassist/bytecode/analysis/ControlFlow.java
src/test/javassist/JvstTest.java
src/test/test/javassist/bytecode/analysis/DomTreePrinter.java
src/test/test/javassist/bytecode/analysis/DomTreeTest.java [new file with mode: 0644]

index 6e7ef88b23e711f6ff5497b04fd4972256024a6a..3e7c9b9a3f9a81c5963a7492cf40bb10001834f6 100644 (file)
--- a/build.xml
+++ b/build.xml
   <property name="target-src.jar" value="javassist-src.jar"/>
   <property name="lib.dir" value="${basedir}/lib"/>
   <property name="src.dir" value="${basedir}/src/main"/>
-  <property name="build.dir" value="${basedir}/build"/>
+  <property name="build.dir" value="${basedir}/target"/>
   <property name="build.classes.dir" value="${build.dir}/classes"/>
   <property name="test.src.dir" value="${basedir}/src/test"/>
-  <property name="test.build.dir" value="${basedir}/build/test-classes"/>
+  <property name="test.build.dir" value="${build.dir}/test-classes"/>
   <property name="test.run.dir" value="${basedir}/runtest"/>
-  <property name="test.reports.dir" value = "${basedir}/build/test-output"/>
+  <property name="test.reports.dir" value = "${build.dir}/test-output"/>
 
   <property name="run.dir" value="${build.classes.dir}"/>
 
index 38b59130d5c3a92f9008a234fdc0d21f1005fec7..0560be6b8233f1c24cc49121c0c9a9349aa8644a 100644 (file)
@@ -149,12 +149,10 @@ public class ControlFlow {
             BasicBlock[] entrances(Node n) { return n.block.entrances; }
         };
         nodes[0].makeDepth1stTree(null, visited, 0, distance, access);
-        for (int i = 0; i < size; i++)
-            visited[i] = false;
-
-        while (nodes[0].makeDominatorTree(visited, distance, access))
-            ;
-
+        do {
+            for (int i = 0; i < size; i++)
+                visited[i] = false;
+        } while (nodes[0].makeDominatorTree(visited, distance, access));
         Node.setChildren(nodes);
         return nodes;
     }
@@ -202,11 +200,11 @@ public class ControlFlow {
             if (nodes[i].block.exits() == 0)
                 counter = nodes[i].makeDepth1stTree(null, visited, counter, distance, access);
 
-        for (int i = 0; i < size; i++)
-            visited[i] = false;
-
         boolean changed;
         do {
+            for (int i = 0; i < size; i++)
+                visited[i] = false;
+
             changed = false;
             for (int i = 0; i < size; i++)
                 if (nodes[i].block.exits() == 0)
@@ -245,7 +243,7 @@ public class ControlFlow {
 
         protected void toString2(StringBuffer sbuf) {
             super.toString2(sbuf);
-            sbuf.append(", incomping{");
+            sbuf.append(", incoming{");
             for (int i = 0; i < entrances.length; i++)
                 sbuf.append(entrances[i].position).append(", ");
 
@@ -280,7 +278,7 @@ public class ControlFlow {
         public int incomings() { return incoming; }
 
         /**
-         * Returns the blocks that the control may jump into this block from.
+         * Returns the block that the control may jump into this block from.
          */
         public Block incoming(int n) {
             return entrances[n];
index f4ccaf6c16aca7605e3a2404809ca3e85d4c6f68..f646506bef9c63c1c78856455cf4165b5b274a63 100644 (file)
@@ -1126,6 +1126,9 @@ public class JvstTest extends JvstTestRoot {
         suite.addTestSuite(test.javassist.proxy.ProxyFactoryCompatibilityTest.class);
         suite.addTestSuite(test.javassist.proxy.ProxySerializationTest.class);
         suite.addTestSuite(test.javassist.proxy.ProxySimpleTest.class);
+        suite.addTestSuite(test.javassist.bytecode.analysis.AnalyzerTest.class);
+        suite.addTestSuite(test.javassist.convert.ArrayAccessReplaceTest.class);
+        suite.addTestSuite(test.javassist.bytecode.analysis.DomTreeTest.class);
         return suite;
     }
 }
index 481c8abb853a26ea9876e4902c758f5d008e6df9..2ada4acdf99fb7c4d932120065d971d9a170eefe 100644 (file)
@@ -20,7 +20,6 @@ public class DomTreePrinter {
         Node[] pdom = cf.postDominatorTree();
         for (int i = 0; i < pdom.length; i++)
             System.out.println(i + ": " + pdom[i]);
-
     }
 
     public int dummy(int n, int[] array) {
diff --git a/src/test/test/javassist/bytecode/analysis/DomTreeTest.java b/src/test/test/javassist/bytecode/analysis/DomTreeTest.java
new file mode 100644 (file)
index 0000000..dd348d0
--- /dev/null
@@ -0,0 +1,59 @@
+package test.javassist.bytecode.analysis;
+
+import javassist.ClassPool;
+import javassist.bytecode.analysis.ControlFlow;
+import javassist.bytecode.analysis.ControlFlow.Block;
+import javassist.bytecode.analysis.ControlFlow.Node;
+import junit.framework.TestCase;
+
+public class DomTreeTest extends TestCase {
+    private ClassPool pool = ClassPool.getDefault();
+
+    public void testDomtree() throws Exception {
+        ControlFlow cf = new ControlFlow(pool.get(DomTreeTest.class.getName()).getDeclaredMethod("test1"));
+        Block[] blocks = cf.basicBlocks();
+        // for (int i = 0; i < blocks.length; i++)
+        //    System.out.println(i + ": " + blocks[i]);
+        testBlock(blocks[0], new int[] {}, new int[] { 11, 6 } );
+        testBlock(blocks[1], new int[] { 0 }, new int[] { 17, 11 } );
+        testBlock(blocks[2], new int[] { 0, 6 }, new int[] { 19, 17 });
+        testBlock(blocks[3], new int[] { 6, 11 }, new int[] { 19 });
+        testBlock(blocks[4], new int[] { 11, 17 }, new int[] {});
+
+        Node[] dom = cf.dominatorTree();
+        assertNull(dom[0].parent());
+        assertEquals(0, dom[1].parent().block().position());
+        assertEquals(0, dom[2].parent().block().position());
+        assertEquals(0, dom[3].parent().block().position());
+        assertEquals(0, dom[4].parent().block().position());
+
+        Node[] pdom = cf.postDominatorTree();
+        assertEquals(19, pdom[0].parent().block().position());
+        assertEquals(19, pdom[1].parent().block().position());
+        assertEquals(19, pdom[2].parent().block().position());
+        assertEquals(19, pdom[3].parent().block().position());
+        assertNull(pdom[4].parent());
+    }
+
+    private void testBlock(Block b, int[] incoming, int[] outgoing) {
+        int i = 0;
+        for (int index: incoming)
+            assertEquals(index, b.incoming(i++).position());
+        i = 0;
+        for (int index: outgoing)
+            assertEquals(index, b.exit(i++).position());
+    }
+
+    private void testNode(Node n, int[] incoming, int[] outgoing) {
+        int i = 0;
+        for (int index: incoming)
+            assertEquals(index, n.parent().block().index());
+    }
+
+    public void test1(){
+        int k=0;
+        if (k != 0 && k!=2 || k < 7) {
+            k = 3 ;
+        }
+    }
+}