You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by th...@apache.org on 2014/01/03 13:43:47 UTC

git commit: TAP5-2029: fixes a ClassFormatError (Illegal exception table range)

Updated Branches:
  refs/heads/master 28df9e51c -> 821183960


TAP5-2029: fixes a ClassFormatError (Illegal exception table range)


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/82118396
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/82118396
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/82118396

Branch: refs/heads/master
Commit: 8211839603d67ec19e7aecf670f79417808d17b3
Parents: 28df9e5
Author: Thiago H. de Paula Figueiredo <th...@apache.org>
Authored: Fri Jan 3 10:43:17 2014 -0200
Committer: Thiago H. de Paula Figueiredo <th...@apache.org>
Committed: Fri Jan 3 10:43:17 2014 -0200

----------------------------------------------------------------------
 .../plastic/asm/tree/AnnotationNode.java        |  2 +-
 .../internal/plastic/PlasticClassImpl.java      | 61 +++++++++++++++++---
 .../internal/plastic/PlasticClassPool.java      |  5 +-
 .../NonAnnotatedServiceInterfaceImpl.java       | 26 +++++++--
 4 files changed, 77 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/82118396/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
index 2fe5b77..901dff4 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
@@ -198,7 +198,7 @@ public class AnnotationNode extends AnnotationVisitor
      * @param name the value name.
      * @param value the actual value.
      */
-    static void accept(
+    public static void accept(
         final AnnotationVisitor av,
         final String name,
         final Object value)

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/82118396/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
----------------------------------------------------------------------
diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
index e12ef71..eab2882 100644
--- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
+++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry5.internal.plastic;
 
+import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor;
 import org.apache.tapestry5.internal.plastic.asm.ClassReader;
 import org.apache.tapestry5.internal.plastic.asm.Opcodes;
 import org.apache.tapestry5.internal.plastic.asm.Type;
@@ -335,7 +336,7 @@ public class PlasticClassImpl extends Lockable implements PlasticClass, Internal
         return annotationAccess.getAnnotation(annotationType);
     }
     
-    private static void copyAnnotationsFromServiceImplementation(MethodNode methodNode, ClassNode source)
+    private static void addMethodAndParameterAnnotationsFromExistingClass(MethodNode methodNode, ClassNode source)
     {
         if (source != null)
         {
@@ -345,11 +346,57 @@ public class PlasticClassImpl extends Lockable implements PlasticClass, Internal
                 // Find corresponding method in the implementation class MethodNode
                 if (methodNode.name.equals(implementationNode.name) && methodNode.desc.equals(implementationNode.desc))
                 {
-                    implementationNode.accept(methodNode);
                     
-                    // We want to copy just annotations, not code.
-                    methodNode.instructions.clear();
-                    methodNode.instructions.resetLabels();
+                    // Copied and adapted from MethodNode.accept(). We want annotation info, but not code nor attributes
+                    // Otherwise, we get ClassFormatError (Illegal exception table range) later
+
+                    // visits the method attributes
+                    int i, j, n;
+                    if (implementationNode.annotationDefault != null) {
+                        AnnotationVisitor av = methodNode.visitAnnotationDefault();
+                        AnnotationNode.accept(av, null, implementationNode.annotationDefault);
+                        if (av != null) {
+                            av.visitEnd();
+                        }
+                    }
+                    n = implementationNode.visibleAnnotations == null ? 0 : implementationNode.visibleAnnotations.size();
+                    for (i = 0; i < n; ++i) {
+                        AnnotationNode an = implementationNode.visibleAnnotations.get(i);
+                        an.accept(methodNode.visitAnnotation(an.desc, true));
+                    }
+                    n = implementationNode.invisibleAnnotations == null ? 0 : implementationNode.invisibleAnnotations.size();
+                    for (i = 0; i < n; ++i) {
+                        AnnotationNode an = implementationNode.invisibleAnnotations.get(i);
+                        an.accept(methodNode.visitAnnotation(an.desc, false));
+                    }
+                    n = implementationNode.visibleParameterAnnotations == null
+                            ? 0
+                            : implementationNode.visibleParameterAnnotations.length;
+                    for (i = 0; i < n; ++i) {
+                        List<?> l = implementationNode.visibleParameterAnnotations[i];
+                        if (l == null) {
+                            continue;
+                        }
+                        for (j = 0; j < l.size(); ++j) {
+                            AnnotationNode an = (AnnotationNode) l.get(j);
+                            an.accept(methodNode.visitParameterAnnotation(i, an.desc, true));
+                        }
+                    }
+                    n = implementationNode.invisibleParameterAnnotations == null
+                            ? 0
+                            : implementationNode.invisibleParameterAnnotations.length;
+                    for (i = 0; i < n; ++i) {
+                        List<?> l = implementationNode.invisibleParameterAnnotations[i];
+                        if (l == null) {
+                            continue;
+                        }
+                        for (j = 0; j < l.size(); ++j) {
+                            AnnotationNode an = (AnnotationNode) l.get(j);
+                            an.accept(methodNode.visitParameterAnnotation(i, an.desc, false));
+                        }
+                    }
+                    
+                    methodNode.visitEnd();
                     
                     break;
                     
@@ -735,8 +782,8 @@ public class PlasticClassImpl extends Lockable implements PlasticClass, Internal
         boolean isOverride = inheritanceData.isImplemented(methodNode.name, desc);
         
         if (!isOverride) {
-            copyAnnotationsFromServiceImplementation(methodNode, interfaceClassNode);
-            copyAnnotationsFromServiceImplementation(methodNode, implementationClassNode);
+            addMethodAndParameterAnnotationsFromExistingClass(methodNode, interfaceClassNode);
+            addMethodAndParameterAnnotationsFromExistingClass(methodNode, implementationClassNode);
         }
 
         if (isOverride)

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/82118396/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
----------------------------------------------------------------------
diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
index 41ce961..edf3840 100644
--- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
+++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
@@ -547,13 +547,12 @@ public class PlasticClassPool implements ClassLoaderDelegate, Opcodes, PlasticCl
     static ClassNode readClassNode(String className, ClassLoader classLoader) throws IOException
     {
         ClassNode classNode = new ClassNode();
-        ClassReader classReader = new ClassReader(className);
         final String location = PlasticInternalUtils.toInternalName(className) + ".class";
         InputStream inputStream = classLoader.getResourceAsStream(location);
         BufferedInputStream bis = new BufferedInputStream(inputStream);
-        classReader = new ClassReader(inputStream);
-        bis.close();
+        ClassReader classReader = new ClassReader(inputStream);
         inputStream.close();
+        bis.close();
         classReader.accept(classNode, 0);
         return classNode;
         

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/82118396/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/NonAnnotatedServiceInterfaceImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/NonAnnotatedServiceInterfaceImpl.java b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/NonAnnotatedServiceInterfaceImpl.java
index efa408d..5470c24 100644
--- a/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/NonAnnotatedServiceInterfaceImpl.java
+++ b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/NonAnnotatedServiceInterfaceImpl.java
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,11 +18,25 @@ import org.apache.tapestry5.ioc.annotations.Advise;
 import org.apache.tapestry5.ioc.annotations.IntermediateType;
 
 @ReorderProperties("reorder") // no meaning, just for testing whether the proxy will have it
-public class NonAnnotatedServiceInterfaceImpl implements NonAnnotatedServiceInterface {
+public class NonAnnotatedServiceInterfaceImpl implements NonAnnotatedServiceInterface
+{
 
-	@Advise(id = "id", serviceInterface = NonAnnotatedServiceInterface.class)
-	public String execute(@IntermediateType(String.class) int i) { // annotation just for checking too
-		return null;
-	}
+    @Advise(id = "id", serviceInterface = NonAnnotatedServiceInterface.class)
+    public String execute(@IntermediateType(String.class) int i) // annotation just for checking too
+    { 
+
+        // a try/catch block, as it caused some troubles with proxy class generation
+        try
+        {
+            System.out.println();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+
+        return null;
+
+    }
 
 }