--- old/src/share/classes/jdk/internal/org/objectweb/asm/tree/TryCatchBlockNode.java Thu Apr 25 10:10:42 2013 +++ new/src/share/classes/jdk/internal/org/objectweb/asm/tree/TryCatchBlockNode.java Thu Apr 25 10:10:41 2013 @@ -58,6 +58,8 @@ */ package jdk.internal.org.objectweb.asm.tree; +import java.util.List; + import jdk.internal.org.objectweb.asm.MethodVisitor; /** @@ -89,21 +91,41 @@ public String type; /** + * The runtime visible type annotations on the exception handler type. This + * list is a list of {@link TypeAnnotationNode} objects. May be + * null. + * + * @associates jdk.internal.org.objectweb.asm.tree.TypeAnnotationNode + * @label visible + */ + public List visibleTypeAnnotations; + + /** + * The runtime invisible type annotations on the exception handler type. + * This list is a list of {@link TypeAnnotationNode} objects. May be + * null. + * + * @associates jdk.internal.org.objectweb.asm.tree.TypeAnnotationNode + * @label invisible + */ + public List invisibleTypeAnnotations; + + /** * Constructs a new {@link TryCatchBlockNode}. * - * @param start beginning of the exception handler's scope (inclusive). - * @param end end of the exception handler's scope (exclusive). - * @param handler beginning of the exception handler's code. - * @param type internal name of the type of exceptions handled by the - * handler, or null to catch any exceptions (for "finally" - * blocks). + * @param start + * beginning of the exception handler's scope (inclusive). + * @param end + * end of the exception handler's scope (exclusive). + * @param handler + * beginning of the exception handler's code. + * @param type + * internal name of the type of exceptions handled by the + * handler, or null to catch any exceptions (for + * "finally" blocks). */ - public TryCatchBlockNode( - final LabelNode start, - final LabelNode end, - final LabelNode handler, - final String type) - { + public TryCatchBlockNode(final LabelNode start, final LabelNode end, + final LabelNode handler, final String type) { this.start = start; this.end = end; this.handler = handler; @@ -111,13 +133,50 @@ } /** + * Updates the index of this try catch block in the method's list of try + * catch block nodes. This index maybe stored in the 'target' field of the + * type annotations of this block. + * + * @param index + * the new index of this try catch block in the method's list of + * try catch block nodes. + */ + public void updateIndex(final int index) { + int newTypeRef = 0x42000000 | (index << 8); + if (visibleTypeAnnotations != null) { + for (TypeAnnotationNode tan : visibleTypeAnnotations) { + tan.typeRef = newTypeRef; + } + } + if (invisibleTypeAnnotations != null) { + for (TypeAnnotationNode tan : invisibleTypeAnnotations) { + tan.typeRef = newTypeRef; + } + } + } + + /** * Makes the given visitor visit this try catch block. * - * @param mv a method visitor. + * @param mv + * a method visitor. */ public void accept(final MethodVisitor mv) { - mv.visitTryCatchBlock(start.getLabel(), end.getLabel(), handler == null - ? null - : handler.getLabel(), type); + mv.visitTryCatchBlock(start.getLabel(), end.getLabel(), + handler == null ? null : handler.getLabel(), type); + int n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations + .size(); + for (int i = 0; i < n; ++i) { + TypeAnnotationNode an = visibleTypeAnnotations.get(i); + an.accept(mv.visitTryCatchAnnotation(an.typeRef, an.typePath, + an.desc, true)); + } + n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations + .size(); + for (int i = 0; i < n; ++i) { + TypeAnnotationNode an = invisibleTypeAnnotations.get(i); + an.accept(mv.visitTryCatchAnnotation(an.typeRef, an.typePath, + an.desc, false)); + } } }