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