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;
+
+ }
}