123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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) {
- assertEquals(incoming.length, b.incomings());
- int i = 0;
- for (int index: incoming)
- assertEquals(index, b.incoming(i++).position());
- i = 0;
- assertEquals(outgoing.length, b.exits());
- 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 ;
- }
- }
-
- public void testDomtree2() throws Exception {
- ControlFlow cf = new ControlFlow(pool.get(DomTreeTest.class.getName()).getDeclaredMethod("test2"));
- Block[] blocks = cf.basicBlocks();
- // for (int i = 0; i < blocks.length; i++)
- // System.out.println(i + ": " + blocks[i]);
- testBlock(blocks[0], new int[] { 7 }, new int[] { 14, 7 } );
- testBlock(blocks[1], new int[] { 0 }, new int[] { 0, 12 } );
- testBlock(blocks[2], new int[] { 7 }, new int[] {});
- testBlock(blocks[3], new int[] { 0 }, new int[] {});
-
- Node[] dom = cf.dominatorTree();
- assertNull(dom[0].parent());
- assertEquals(0, dom[1].parent().block().position());
- assertEquals(7, dom[2].parent().block().position());
- assertEquals(0, dom[3].parent().block().position());
-
- Node[] pdom = cf.postDominatorTree();
- assertNull(pdom[0].parent());
- assertNull(pdom[1].parent());
- assertNull(pdom[2].parent());
- assertNull(pdom[3].parent());
- }
-
- public int test2(int i){
- while (i-- > 0)
- if (i == 3)
- return 1;
-
- return i + 3;
- }
-
- public void testDomtree3() throws Exception {
- ControlFlow cf = new ControlFlow(pool.get(DomTreeTest.class.getName()).getDeclaredMethod("test3"));
- Block[] blocks = cf.basicBlocks();
- for (int i = 0; i < blocks.length; i++)
- System.out.println(blocks[i]);
- }
-
- public int test3(int i, int j) {
- while (i > 0) {
- try {
- j++;
- }
- catch (Throwable t) {
- j = 0;
- }
- i--;
- }
-
- return j;
- }
- }
|