]> source.dussan.org Git - javassist.git/commitdiff
fixed JASSIST-128 and JASSIST-129
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 14 Sep 2010 14:38:43 +0000 (14:38 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 14 Sep 2010 14:38:43 +0000 (14:38 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@574 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/CtClass.java
src/main/javassist/bytecode/AnnotationsAttribute.java
src/main/javassist/bytecode/AttributeInfo.java
src/main/javassist/bytecode/ClassFile.java
src/main/javassist/bytecode/CodeAttribute.java
src/main/javassist/bytecode/ParameterAnnotationsAttribute.java
src/main/javassist/bytecode/SignatureAttribute.java

index 87b9e6342e1362e6036c405401587dc1acbe8b1e..8c7d0039d8f3b2296bacce3f3adad938047ece4b 100644 (file)
@@ -284,7 +284,7 @@ see javassist.Dump.
 <p>-version 3.14
 
 <ul>
-       <li>JIRA JASSIST-130, 131, 132.
+       <li>JIRA JASSIST-128, 129, 130, 131, 132.
 </ul>
 
 <p>-version 3.13 on July 19, 2010
index c3d41760bab76153f473fcdbbedf716d9b89b088..9742de44f5e383d8faa79eace0c3d8d01bc456d3 100644 (file)
@@ -428,7 +428,7 @@ public abstract class CtClass {
 
                 public void fix(String name) {}
             };
-            cf.renameClass(cm);
+            cf.getRefClasses(cm);
             return cm.values();
         }
         else
index 7e53ce0269961bd474401ea050ae1f93edc902ef..0d2ac0995fef5bf022f3ff8f192a0a542ac9173e 100644 (file)
@@ -285,6 +285,8 @@ public class AnnotationsAttribute extends AttributeInfo {
         }
     }
 
+    void getRefClasses(Map classnames) { renameClass(classnames); }
+
     /**
      * Returns a string representation of this object.
      */
index 29c950acc6f6a0b1b4a91341de2f334e21d02756..c5da7e1a03839c93ece7f75b57cdc6112c0bb063 100644 (file)
@@ -251,8 +251,9 @@ public class AttributeInfo {
 
     /* The following two methods are used to implement
      * ClassFile.renameClass().
-     * Only CodeAttribute, LocalVariableAttribute, and
-     * AnnotationsAttribute override these methods.
+     * Only CodeAttribute, LocalVariableAttribute,
+     * AnnotationsAttribute, and SignatureAttribute
+     * override these methods.
      */
     void renameClass(String oldname, String newname) {}
     void renameClass(Map classnames) {}
@@ -272,4 +273,14 @@ public class AttributeInfo {
             ai.renameClass(classnames);
         }
     }
+
+    void getRefClasses(Map classnames) {}
+
+    static void getRefClasses(List attributes, Map classnames) {
+        Iterator iterator = attributes.iterator();
+        while (iterator.hasNext()) {
+            AttributeInfo ai = (AttributeInfo)iterator.next();
+            ai.getRefClasses(classnames);
+        }
+    }
 }
index 7c0662c332b7eaf53fa4e567d2c52366e104e67f..d07d1088b830462c187a29ea240fed8a9d77694c 100644 (file)
@@ -465,6 +465,33 @@ public final class ClassFile {
         }
     }
 
+    /**
+     * Internal-use only.
+     * <code>CtClass.getRefClasses()</code> calls this method. 
+     */
+    public final void getRefClasses(Map classnames) {
+        constPool.renameClass(classnames);
+
+        AttributeInfo.getRefClasses(attributes, classnames);
+        ArrayList list = methods;
+        int n = list.size();
+        for (int i = 0; i < n; ++i) {
+            MethodInfo minfo = (MethodInfo)list.get(i);
+            String desc = minfo.getDescriptor();
+            Descriptor.rename(desc, classnames);
+            AttributeInfo.getRefClasses(minfo.getAttributes(), classnames);
+        }
+
+        list = fields;
+        n = list.size();
+        for (int i = 0; i < n; ++i) {
+            FieldInfo finfo = (FieldInfo)list.get(i);
+            String desc = finfo.getDescriptor();
+            Descriptor.rename(desc, classnames);
+            AttributeInfo.getRefClasses(finfo.getAttributes(), classnames);
+        }
+    }
+
     /**
      * Returns the names of the interfaces implemented by the class.
      * The returned array is read only.
index 4705d2bbe925f2170a5b6b7cb4eb5fc89132c594..99dca1d6431abaf629ab497e293c1142ee9cb801 100644 (file)
@@ -200,6 +200,10 @@ public class CodeAttribute extends AttributeInfo implements Opcode {
         AttributeInfo.renameClass(attributes, classnames);
     }
 
+    void getRefClasses(Map classnames) {
+        AttributeInfo.getRefClasses(attributes, classnames);
+    }
+
     /**
      * Returns the name of the class declaring the method including
      * this code attribute.
index 6638642921b46c99ef893a4aa7dea90d1969f6cb..246afc1c1a47bdeabf7d878f929af15b100228f3 100644 (file)
@@ -186,6 +186,8 @@ public class ParameterAnnotationsAttribute extends AttributeInfo {
         }
     }
 
+    void getRefClasses(Map classnames) { renameClass(classnames); }
+
     /**
      * Returns a string representation of this object.
      */
index 267098f81d339a287ec9224818a7730fc4690e01..958e93f650fdfb77f28d3dcdf91f55959a1d63a4 100644 (file)
@@ -96,54 +96,16 @@ public class SignatureAttribute extends AttributeInfo {
     }
 
     static String renameClass(String desc, String oldname, String newname) {
-        if (desc.indexOf(oldname) < 0)
-            return desc;
-
-        StringBuffer newdesc = new StringBuffer();
-        int head = 0;
-        int i = 0;
-        for (;;) {
-            int j = desc.indexOf('L', i);
-            if (j < 0)
-                break;
-
-            int k = j;
-            int p = 0;
-            char c;
-            boolean match = true;
-            try {
-                int len = oldname.length();
-                while (isNamePart(c = desc.charAt(++k)))
-                    if (p >= len || c != oldname.charAt(p++))
-                        match = false;
-            }
-            catch (IndexOutOfBoundsException e) { break; }
-            i = k + 1;
-            if (match && p == oldname.length()) {
-                newdesc.append(desc.substring(head, j));
-                newdesc.append('L');
-                newdesc.append(newname);
-                newdesc.append(c);
-                head = i;
-            }
-        }
-
-        if (head == 0)
-            return desc;
-        else {
-            int len = desc.length();
-            if (head < len)
-                newdesc.append(desc.substring(head, len));
-
-            return newdesc.toString();
-        }
+        Map map = new java.util.HashMap();
+        map.put(oldname, newname);
+        return renameClass(desc, map);
     }
 
     static String renameClass(String desc, Map map) {
         if (map == null)
             return desc;
 
-        StringBuffer newdesc = new StringBuffer();
+        StringBuilder newdesc = new StringBuilder();
         int head = 0;
         int i = 0;
         for (;;) {
@@ -151,12 +113,19 @@ public class SignatureAttribute extends AttributeInfo {
             if (j < 0)
                 break;
 
-            StringBuffer nameBuf = new StringBuffer();
+            StringBuilder nameBuf = new StringBuilder();
             int k = j;
             char c;
             try {
-                while (isNamePart(c = desc.charAt(++k)))
+                while ((c = desc.charAt(++k)) != ';') {
                     nameBuf.append(c);
+                    if (c == '<') {
+                        while ((c = desc.charAt(++k)) != '>')
+                            nameBuf.append(c);
+
+                        nameBuf.append(c);
+                    }
+                }
             }
             catch (IndexOutOfBoundsException e) { break; }
             i = k + 1;