]> source.dussan.org Git - javassist.git/commitdiff
a correct fix of HIBERNATE-37 (ProxyFactory could not handle a bridge method). Pleas...
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 18 Jul 2006 17:51:04 +0000 (17:51 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Tue, 18 Jul 2006 17:51:04 +0000 (17:51 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@302 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/bytecode/ClassFile.java
src/main/javassist/util/proxy/ProxyFactory.java

index efa53ce4a564be0a9eca51e100ba4637327c8e44..f650a2152e12068cb55397b41673c7a5f33e8195 100644 (file)
@@ -283,6 +283,9 @@ see javassist.Dump.
 
 <p>-version 3.3
 <ul>
+    <li>CtClass#getAvailableAnnotations() etc. have been implemented.
+    <li>A bug related to a way of dealing with a bridge method was fixed
+    (<a href="http://jira.jboss.com/jira/browse/HIBERNATE-37">HIBERNATE-37</a>).
     <li>javassist.scopedpool package was added.
 </ul>
 
@@ -298,11 +301,11 @@ see javassist.Dump.
 <ul>
    <li>A bug of replace(String,ExprEditor) in javassist.expr.Expr has been fixed.
   <li>Updated ProxyFactory getClassLoader to choose the javassit class loader
-   when the proxy superclass has a null class loader (a jdk/endorsed class).
-   <a href='http://jira.jboss.com/jira/browse/JASSIST-18'>JASSIST-18</a>
+   when the proxy superclass has a null class loader (a jdk/endorsed class)
+   (<a href='http://jira.jboss.com/jira/browse/JASSIST-18'>JASSIST-18</a>).
   <li>Updated the throws clause of the javassist.util.proxy.MethodHandler
-   to be Throwable rather than Exception.
-   <a href='http://jira.jboss.com/jira/browse/JASSIST-16'>JASSIST-16</a>
+   to be Throwable rather than Exception
+   (<a href='http://jira.jboss.com/jira/browse/JASSIST-16'>JASSIST-16</a>).
 </ul>
 
 <p>- version 3.2.0.CR1 on March 18, 2006
index 831a9608a18ec765a1be2f699394001aaad2bef0..5e3230007a497d0740b954336f0353e2db389cd2 100644 (file)
@@ -525,7 +525,7 @@ public final class ClassFile {
      * Appends a method to the class.
      */
     public void addMethod(MethodInfo minfo) throws CannotCompileException {
-        testExistingMethod(minfo.getName(), minfo.getDescriptor());
+        testExistingMethod(minfo);
         methods.add(minfo);
     }
 
@@ -533,18 +533,28 @@ public final class ClassFile {
         methods.add(minfo);
     }
 
-    private void testExistingMethod(String name, String descriptor)
-            throws CannotCompileException {
+    private void testExistingMethod(MethodInfo newMinfo)
+        throws CannotCompileException
+    {
+        String name = newMinfo.getName();
+        String descriptor = newMinfo.getDescriptor();
         ListIterator it = methods.listIterator(0);
         while (it.hasNext()) {
             MethodInfo minfo = (MethodInfo)it.next();
             if (minfo.getName().equals(name)
+                    && notBridgeMethod(minfo) && notBridgeMethod(newMinfo)
                     && Descriptor.eqParamTypes(minfo.getDescriptor(),
-                            descriptor))
+                                               descriptor))
                 throw new CannotCompileException("duplicate method: " + name);
         }
     }
 
+    /* For a bridge method, see Sec. 15.12.4.5 of JLS 3rd Ed.
+     */
+    private boolean notBridgeMethod(MethodInfo minfo) {
+        return (minfo.getAccessFlags() & AccessFlag.BRIDGE) == 0;
+    }
+
     /**
      * Returns all the attributes.  The returned <code>List</code> object
      * is shared with this object.  If you add a new attribute to the list,
index 19321e61ec43fc209ac71059a5923f1c6b456037..bf29e5392e087c7c7090327aa0e234c25dfd5ca4 100644 (file)
@@ -363,6 +363,8 @@ public class ProxyFactory {
         else {
             MethodInfo delegator
                 = makeDelegator(meth, desc, cp, declClass, delegatorName);
+            // delegator is not a bridge method.  See Sec. 15.12.4.5 of JLS 3rd Ed.
+            delegator.setAccessFlags(delegator.getAccessFlags() & ~AccessFlag.BRIDGE);
             cf.addMethod(delegator);
         }
 
@@ -417,8 +419,6 @@ public class ProxyFactory {
      * @param mod       the modifiers of the method. 
      */
     private static boolean isVisible(int mod, String from, Member meth) {
-        if ((mod & Modifier.VOLATILE) != 0)
-         return false;
         if ((mod & Modifier.PRIVATE) != 0)
             return false;
         else if ((mod & (Modifier.PUBLIC | Modifier.PROTECTED)) != 0)