src/share/classes/jdk/internal/org/objectweb/asm/tree/TryCatchBlockNode.java

Print this page

        

*** 56,65 **** --- 56,67 ---- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ package jdk.internal.org.objectweb.asm.tree; + import java.util.List; + import jdk.internal.org.objectweb.asm.MethodVisitor; /** * A node that represents a try catch block. *
*** 87,123 **** * <tt>null</tt> to catch any exceptions (for "finally" blocks). */ public String type; /** * 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 <tt>null</tt> to catch any exceptions (for "finally" ! * blocks). */ ! public TryCatchBlockNode( ! final LabelNode start, ! final LabelNode end, ! final LabelNode handler, ! final String type) ! { this.start = start; this.end = end; this.handler = handler; this.type = type; } /** * Makes the given visitor visit this try catch block. * ! * @param mv a method visitor. */ public void accept(final MethodVisitor mv) { ! mv.visitTryCatchBlock(start.getLabel(), end.getLabel(), handler == null ! ? null ! : handler.getLabel(), type); } } --- 89,182 ---- * <tt>null</tt> to catch any exceptions (for "finally" blocks). */ public String type; /** + * The runtime visible type annotations on the exception handler type. This + * list is a list of {@link TypeAnnotationNode} objects. May be + * <tt>null</tt>. + * + * @associates jdk.internal.org.objectweb.asm.tree.TypeAnnotationNode + * @label visible + */ + public List<TypeAnnotationNode> visibleTypeAnnotations; + + /** + * The runtime invisible type annotations on the exception handler type. + * This list is a list of {@link TypeAnnotationNode} objects. May be + * <tt>null</tt>. + * + * @associates jdk.internal.org.objectweb.asm.tree.TypeAnnotationNode + * @label invisible + */ + public List<TypeAnnotationNode> 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 <tt>null</tt> to catch any exceptions (for ! * "finally" blocks). */ ! public TryCatchBlockNode(final LabelNode start, final LabelNode end, ! final LabelNode handler, final String type) { this.start = start; this.end = end; this.handler = handler; this.type = type; } /** + * 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. */ public void accept(final MethodVisitor mv) { ! 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)); + } + } }