]> source.dussan.org Git - javassist.git/commitdiff
fixed JASSIST-160
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 19 Oct 2012 07:17:44 +0000 (07:17 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 19 Oct 2012 07:17:44 +0000 (07:17 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@674 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

javassist.jar
src/main/javassist/bytecode/MethodInfo.java
src/main/javassist/bytecode/StackMap.java
src/main/javassist/bytecode/StackMapTable.java
src/test/javassist/bytecode/StackMapTest.java

index d0a93f28bf086f79d3766fe026e9a650afda55df..dd1d584399dad3bd6a92e0a464213dc551501910 100644 (file)
Binary files a/javassist.jar and b/javassist.jar differ
index 4ca4e90d2bf027bf7ba3cc36a1c43d55e5f66927..1db524ce031f6863c73313d416f0baf23853a36d 100644 (file)
@@ -431,7 +431,7 @@ public class MethodInfo {
      * include a code attribute, nothing happens.
      *
      * @param pool          used for making type hierarchy.
-     * @see StackMapTable
+     * @see StackMap
      * @since 3.12
      */
     public void rebuildStackMapForME(ClassPool pool) throws BadBytecode {
index fe3655fd6cad1b85e7ad31a3a0e4c29a9b8c72c0..1abdc40f31a1f4e14dfb0279c7569352c45fef28 100644 (file)
@@ -396,6 +396,11 @@ public class StackMap extends AttributeInfo {
 
             return super.locals(pos, offset, num);
         }
+
+        public void uninitialized(int pos, int offset) {
+            if (where <= offset)
+                ByteArray.write16bit(offset + gap, info, pos + 1);
+        }
     }
 
     /**
index 4518ef36b231ce92715317e61b40d6cae91af9ea..08770afcca1a79f5900d627cbb74891574696dc2 100644 (file)
@@ -28,7 +28,7 @@ import javassist.CannotCompileException;
  * <code>stack_map</code> attribute.
  *
  * <p>This is an entry in the attributes table of a Code attribute.
- * It was introduced by J2SE 6 for the process of verification by
+ * It was introduced by J2SE 6 for the verification by
  * typechecking.
  *
  * @see StackMap
@@ -244,6 +244,7 @@ public class StackMapTable extends AttributeInfo {
             int data = 0;
             if (tag == OBJECT || tag == UNINIT) {
                 data = ByteArray.readU16bit(info, pos + 2);
+                objectOrUninitialized(tag, data, pos + 2);
                 pos += 2;
             }
 
@@ -286,6 +287,7 @@ public class StackMapTable extends AttributeInfo {
                 tags[i] = tag;
                 if (tag == OBJECT || tag == UNINIT) {
                     data[i] = ByteArray.readU16bit(info, p + 1);
+                    objectOrUninitialized(tag, data[i], p + 1);
                     p += 3;
                 }
                 else {
@@ -346,12 +348,23 @@ public class StackMapTable extends AttributeInfo {
                 tags[i] = tag;
                 if (tag == OBJECT || tag == UNINIT) {
                     data[i] = ByteArray.readU16bit(info, pos);
+                    objectOrUninitialized(tag, data[i], pos);
                     pos += 2;
                 }
             }
 
             return pos;
         }
+
+        /**
+         * Invoked if <code>Object_variable_info</code>
+         * or <code>Uninitialized_variable_info</code> is visited.
+         *
+         * @param tag          <code>OBJECT</code> or <code>UNINIT</code>.
+         * @param data         the value of <code>cpool_index</code> or <code>offset</code>.
+         * @param pos          the position of <code>cpool_index</code> or <code>offset</code>.
+         */
+        public void objectOrUninitialized(int tag, int data, int pos) {}
     }
 
     static class SimpleCopy extends Walker {
@@ -791,9 +804,26 @@ public class StackMapTable extends AttributeInfo {
     void shiftPc(int where, int gapSize, boolean exclusive)
         throws BadBytecode
     {
+       new OffsetShifter(this, where, gapSize).parse();
         new Shifter(this, where, gapSize, exclusive).doit();
     }
 
+    static class OffsetShifter extends Walker {
+       int where, gap;
+
+       public OffsetShifter(StackMapTable smt, int where, int gap) {
+               super(smt);
+               this.where = where;
+               this.gap = gap;
+       }
+
+       public void objectOrUninitialized(int tag, int data, int pos) {
+               if (tag == UNINIT)
+                       if (where <= data)
+                               ByteArray.write16bit(data + gap, info, pos);
+       }
+    }
+
     static class Shifter extends Walker {
         private StackMapTable stackMap;
         int where, gap;
index 4714f7aa7cab1e073b67f1156ac75a87a665a59c..876b335e26cfaa2490a9668a99a67bd40dee3c9b 100644 (file)
@@ -622,6 +622,31 @@ public class StackMapTest extends TestCase {
         }
     }
 
+    public void testConstructor3() throws Exception {
+        CtClass cc = loader.get("javassist.bytecode.StackMapTest$C4");
+        MethodInfo mi = cc.getDeclaredMethod("foo").getMethodInfo();
+        mi.rebuildStackMapForME(loader);
+        CodeIterator ci = mi.getCodeAttribute().iterator();
+        ci.insertGap(0, 7);
+        cc.writeFile();
+        Object t1 = make(cc.getName());
+        assertEquals(6, invoke(t1, "test"));
+    }
+
+    public static class C4 {
+        public int test() { return foo(3); }
+        public int foo(int i) {
+            String s = new String(i > 0 ? "pos" : "negative");
+            System.out.println("2nd stage");
+            int len = 0;
+            if (i > 0) {
+                String t =  new String(i > 0 ? "pos" : "negative");
+                len = t.length();
+            }
+            return s.length() + len;
+        }
+    }
+
     public void tstCtClassType() throws Exception {
         ClassPool cp = ClassPool.getDefault();
         CtClass cc = cp.get("javassist.CtClassType");