]> source.dussan.org Git - javassist.git/commitdiff
fixed JIRA JASSIST-28?
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Wed, 1 Nov 2006 02:45:05 +0000 (02:45 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Wed, 1 Nov 2006 02:45:05 +0000 (02:45 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@326 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/ClassPool.java
src/main/javassist/bytecode/AttributeInfo.java
src/main/javassist/bytecode/StackMapTable.java
src/main/javassist/util/proxy/FactoryHelper.java
src/main/javassist/util/proxy/ProxyFactory.java

index 5db629f4e00e40f225d9bc4f37a6ae09ac837ce7..1a487cd31bfe372dfd34fe836f70dee7e1facf55 100644 (file)
@@ -20,6 +20,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.Method;
 import java.net.URL;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
@@ -893,11 +894,8 @@ public class ClassPool {
                 args = new Object[] { ct.getName(), b, new Integer(0),
                     new Integer(b.length), domain};
             }
-                
-            method.setAccessible(true);
-            Class clazz = (Class)method.invoke(loader, args);
-            method.setAccessible(false);
-            return clazz;
+
+            return toClass2(method, loader, args);
         }
         catch (RuntimeException e) {
             throw e;
@@ -909,4 +907,14 @@ public class ClassPool {
             throw new CannotCompileException(e);
         }
     }
+
+    private static synchronized Class toClass2(Method method,
+            ClassLoader loader, Object[] args)
+        throws Exception
+    {
+        method.setAccessible(true);
+        Class clazz = (Class)method.invoke(loader, args);
+        method.setAccessible(false);
+        return clazz;
+    }
 }
index 174ad00ddfacf04a7785e71d0e9a92a43db14f91..3393be169ffcfcc8c7ae4cbcaa215d9a16265f15 100644 (file)
@@ -96,8 +96,10 @@ public class AttributeInfo {
                      || nameStr.equals(LocalVariableAttribute.typeTag))
                 return new LocalVariableAttribute(cp, name, in);
             else if (nameStr.equals(AnnotationsAttribute.visibleTag)
-                     || nameStr.equals(AnnotationsAttribute.invisibleTag))
+                     || nameStr.equals(AnnotationsAttribute.invisibleTag)) {
+                // RuntimeVisibleAnnotations or RuntimeInvisibleAnnotations
                 return new AnnotationsAttribute(cp, name, in);
+            }
             else if (nameStr.equals(ParameterAnnotationsAttribute.visibleTag)
                 || nameStr.equals(ParameterAnnotationsAttribute.invisibleTag))
                 return new ParameterAnnotationsAttribute(cp, name, in);
index 6318104f44020c8b49b463eb7bcf001aed56bad0..7a56c63314d70495edbce2e14aac907064f4e1b6 100644 (file)
@@ -19,6 +19,7 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.Map;
+import java.util.ArrayList;
 
 /**
  * <code>stack_map</code> attribute.
@@ -33,7 +34,7 @@ public class StackMapTable extends AttributeInfo {
      */
     public static final String tag = "StackMapTable";
 
-    private StackMapFrame[] entries;    // may be null
+    private ArrayList entries;    // ArrayList<StackMapFrame>.  may be null.
 
     /**
      * Constructs a <code>stack_map</code> attribute.
@@ -73,7 +74,12 @@ public class StackMapTable extends AttributeInfo {
     private void parseMap() {
         byte[] data = info;
         int n = ByteArray.readU16bit(data, 0);
-        entries = new StackMapFrame[n];
+        entries = new ArrayList(n);
+        int offset = 2;
+        while (n-- > 0) {
+            int frameType;
+        }
+
     }
 
     private void toByteArray(boolean clear) {
@@ -82,9 +88,21 @@ public class StackMapTable extends AttributeInfo {
     }
 
     /**
-     * <code>union stack_map_frame</code>
+     * <code>union stack_map_frame</code>.
+     * <p><code>verification_type_info</code> is represented
+     * by a pair of two <code>int</code> values.  No class
+     * for represening <code>verification_type_ 
      */
-    public static class StackMapFrame {} 
+    public static class StackMapFrame {
+        /**
+         * <code>u2 offset_delta</code>.
+         * If <code>offset_delta</code> is not included
+         * (i.e. <code>same_frame</code>), the value of
+         * this field is computed from other members such
+         * as <code>frame_type</code>. 
+         */
+        public int offsetDelta;
+    } 
 
     /*
      * verification_type_info is represented by a pair of
@@ -138,24 +156,22 @@ public class StackMapTable extends AttributeInfo {
 
     /**
      * <code>same_frame</code>.
-     * The frame has exactly the same locals as the previous
-     * stack map frame.
+     * <code>frame_type</code> is not included.
+     * It is computed by <code>offsetDelta</code>. 
      */
     public static class SameFrame extends StackMapFrame {
         /**
          * The maximum value of <code>SAME</code>.
          */
         public static final int FRAME_TYPE_MAX = 63;
-
-        /**
-         * <code>u1 frame_type</code>.
-         */
-        public int frameType;
     }
 
     /**
      * <code>same_locals_1_stack_item_frame</code> or 
-     * <code>same_locals_1_stack_item_frame_extended</code>. 
+     * <code>same_locals_1_stack_item_frame_extended</code>.
+     *
+     * <p><code>frame_type</code> is not included.
+     * It is computed by <code>offsetDelta</code>. 
      */
     public static class SameLocals extends StackMapFrame {
         /**
@@ -173,15 +189,6 @@ public class StackMapTable extends AttributeInfo {
          */
         public static final int FRAME_TYPE_EXTENDED = 247;
 
-        /*
-         * <code>frame_type</code> is computed by offsetDelta.
-         */
-
-        /**
-         * <code>u2 offset_delta</code>.
-         */
-        public int offsetDelta;
-
         /**
          * <code>stack[0].tag</code>.
          */
@@ -211,11 +218,6 @@ public class StackMapTable extends AttributeInfo {
          * <code>u1 frame_type</code>.
          */
         public int frameType;
-
-        /**
-         * <code>u2 offset_delta</code>.
-         */
-        public int offsetDelta;
     }
 
     /**
@@ -226,11 +228,6 @@ public class StackMapTable extends AttributeInfo {
          * <code>SAME_FRAME_EXTENDED</code>.
          */
         public static final int FRAME_TYPE = 251;
-
-        /**
-         * <code>u2 offset_delta</code>.
-         */
-        public int offsetDelta;
     }
 
     /**
@@ -252,18 +249,17 @@ public class StackMapTable extends AttributeInfo {
          */
         public int frameType;
 
-        /**
-         * <code>u2 offset_delta</code>.
-         */
-        public int offsetDelta;
-
         /**
          * <code>locals[?].tag</code>.
+         * <code>typeTags.length</code> and <code>typeValues.length</code>
+         * are equal to <code>number_of_locals</code>.
          */
         public int[] typeTags;
 
         /**
          * <code>locals[?].cpool_index</code> or <code>locals[?].offset</code>.
+         * <code>typeTags.length</code> and <code>typeValues.length</code>
+         * are equal to <code>number_of_locals</code>.
          */
         public int[] typeValues;
     }
@@ -277,38 +273,31 @@ public class StackMapTable extends AttributeInfo {
          */
         public static final int FRAME_TYPE = 255;
 
-        /**
-         * <code>u2 offset_delta</code>.
-         */
-        public int offsetDelta;
-
-        /**
-         * <code>u2 number_of_locals</code>.
-         */
-        public int numOfLocals;
-
         /**
          * <code>locals[?].tag</code>.
+         * <code>typeTags.length</code> and <code>typeValues.length</code>
+         * are equal to <code>number_of_locals</code>.
          */
         public int[] typeTags;
 
         /**
          * <code>locals[?].cpool_index</code> or <code>locals[?].offset</code>.
+         * <code>typeTags.length</code> and <code>typeValues.length</code>
+         * are equal to <code>number_of_locals</code>.
          */
         public int[] typeValues;
 
-        /**
-         * <code>u2 number_of_stack_items</code>.
-         */
-        public int numOfStackItems;
-
         /**
          * <code>stack[?].tag</code>.
+         * <code>stackTypeTags.length</code> and <code>stackTypeValues.length</code>
+         * are equal to <code>number_of_stack_items</code>.
          */
         public int[] stackTypeTags;
 
         /**
          * <code>stack[?].cpool_index</code> or <code>locals[?].offset</code>.
+         * <code>stackTypeTags.length</code> and <code>stackTypeValues.length</code>
+         * are equal to <code>number_of_stack_items</code>.
          */
         public int[] stackTypeValues;
     }
index 4579f04e9894cf7c153abd8de49009ab45af6bc9..aea9d88f18c9293e269f82049507e9ee5c434ae2 100644 (file)
@@ -15,6 +15,7 @@
 
 package javassist.util.proxy;
 
+import java.lang.reflect.Method;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
@@ -142,7 +143,7 @@ public class FactoryHelper {
     {
         try {
             byte[] b = toBytecode(cf);
-            java.lang.reflect.Method method;
+            Method method;
             Object[] args;
             if (domain == null) {
                 method = defineClass1;
@@ -155,10 +156,7 @@ public class FactoryHelper {
                         new Integer(b.length), domain };
             }
 
-            method.setAccessible(true);
-            Class clazz = (Class)method.invoke(loader, args);
-            method.setAccessible(false);
-            return clazz;
+            return toClass2(method, loader, args);
         }
         catch (RuntimeException e) {
             throw e;
@@ -171,6 +169,16 @@ public class FactoryHelper {
         }
     }
 
+    private static synchronized Class toClass2(Method method,
+                                        ClassLoader loader, Object[] args)
+        throws Exception
+    {
+        method.setAccessible(true);
+        Class clazz = (Class)method.invoke(loader, args);
+        method.setAccessible(false);
+        return clazz;
+    }
+
     private static byte[] toBytecode(ClassFile cf) throws IOException {
         ByteArrayOutputStream barray = new ByteArrayOutputStream();
         DataOutputStream out = new DataOutputStream(barray);
index fe1ce0f8ea98aec7503949687bf735410f1f62d2..566b809d4bd4e0474ecdf306201b861968d0e98b 100644 (file)
@@ -309,6 +309,10 @@ public class ProxyFactory {
 
     private static int counter = 0;
 
+    private static synchronized String makeProxyName(String classname) {
+        return classname + "_$$_javassist_" + counter++;
+    }
+
     private ClassFile make() throws CannotCompileException {
         String superName, classname;
         if (interfaces == null)
@@ -328,8 +332,7 @@ public class ProxyFactory {
         if (Modifier.isFinal(superClass.getModifiers()))
             throw new CannotCompileException(superName + " is final");
 
-        // generate a proxy name.
-        classname = classname + "_$$_javassist_" + counter++;
+        classname = makeProxyName(classname);
         if (classname.startsWith("java."))
             classname = "org.javassist.tmp." + classname;