]> source.dussan.org Git - javassist.git/commitdiff
fixed JASSIST-127
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Sun, 21 Aug 2011 15:46:37 +0000 (15:46 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Sun, 21 Aug 2011 15:46:37 +0000 (15:46 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@588 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/util/proxy/ProxyFactory.java
src/main/javassist/util/proxy/RuntimeSupport.java

index 2e875a212c1c15d4072edf54601c71049557f0c2..07908f5b197ecda43a490eae98de37dc4145b8bd 100644 (file)
@@ -281,10 +281,15 @@ see javassist.Dump.
 
 <h2>Changes</h2>
 
+<p>-version 3.16
+<ul>
+       <li>JIRA JASSIST-127
+</ul>
+
 <p>-version 3.15 on July 8, 2011
 <ul>
        <li>The license was changed to MPL/LGPL/Apache triple.
-       <li>JIRA JASSIST-138 was fixed.
+       <li>JIRA JASSIST-138 and 142 were fixed.
 </ul>
 
 <p>-version 3.14 on October 5, 2010
index 2f0f07e0be365d794751291b6006ef7dc94963e0..721f58c83fdd27426f5e97ff88783f248f1623da 100644 (file)
@@ -912,7 +912,7 @@ public class ProxyFactory {
             int mod = meth.getModifiers();
             if (testBit(signature, index)) {
                 override(className, meth, prefix, index,
-                        keyToDesc(key), cf, cp);
+                         keyToDesc(key, meth), cf, cp);
             }
             index++;
         }
@@ -1013,27 +1013,34 @@ public class ProxyFactory {
 
     private static HashMap getMethods(Class superClass, Class[] interfaceTypes) {
         HashMap hash = new HashMap();
+        HashSet set = new HashSet();
         for (int i = 0; i < interfaceTypes.length; i++)
-            getMethods(hash, interfaceTypes[i]);
+            getMethods(hash, interfaceTypes[i], set);
 
-        getMethods(hash, superClass);
+        getMethods(hash, superClass, set);
         return hash;
     }
 
-    private static void getMethods(HashMap hash, Class clazz) {
+    private static void getMethods(HashMap hash, Class clazz, Set visitedClasses) {
+        // This both speeds up scanning by avoiding duplicate interfaces and is needed to
+        // ensure that superinterfaces are always scanned before subinterfaces.
+        if (!visitedClasses.add(clazz))
+            return;
+
         Class[] ifs = clazz.getInterfaces();
         for (int i = 0; i < ifs.length; i++)
-            getMethods(hash, ifs[i]);
+            getMethods(hash, ifs[i], visitedClasses);
 
         Class parent = clazz.getSuperclass();
         if (parent != null)
-            getMethods(hash, parent);
+            getMethods(hash, parent, visitedClasses);
 
         Method[] methods = SecurityActions.getDeclaredMethods(clazz);
         for (int i = 0; i < methods.length; i++)
             if (!Modifier.isPrivate(methods[i].getModifiers())) {
                 Method m = methods[i];
-                String key = m.getName() + ':' + RuntimeSupport.makeDescriptor(m);
+                // JIRA JASSIST-127 (covariant return types).
+                String key = m.getName() + ':' + RuntimeSupport.makeDescriptor(m.getParameterTypes(), null);
                 // JIRA JASSIST-85
                 // put the method to the cache, retrieve previous definition (if any) 
                 Method oldMethod = (Method)hash.put(key, methods[i]); 
@@ -1048,8 +1055,9 @@ public class ProxyFactory {
             }
     }
 
-    private static String keyToDesc(String key) {
-        return key.substring(key.indexOf(':') + 1);
+    private static String keyToDesc(String key, Method m) {
+        String params = key.substring(key.indexOf(':') + 1);
+        return RuntimeSupport.makeDescriptor(params, m.getReturnType());
     }
 
     private static MethodInfo makeConstructor(String thisClassName, Constructor cons,
index 3d8d5b729b83b4d0bd52fb93e2a1f7a451cf4ce7..c11c72d89071f060521200e4c701b41a3a9d4adf 100644 (file)
@@ -155,6 +155,20 @@ public class RuntimeSupport {
             makeDesc(sbuf, params[i]);
 
         sbuf.append(')');
+        if (retType != null)
+            makeDesc(sbuf, retType);
+
+        return sbuf.toString();
+    }
+
+    /**
+     * Makes a descriptor for a given method.
+     *
+     * @param params    the descriptor of parameter types.
+     * @param retType   return type.
+     */
+    public static String makeDescriptor(String params, Class retType) {
+        StringBuffer sbuf = new StringBuffer(params);
         makeDesc(sbuf, retType);
         return sbuf.toString();
     }