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 2018/11/29 00:33:54 UTC
[07/46] tapestry-5 git commit: TAP5-2588: upgrading from ASM 6 to 7
for Java 9+ support
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
old mode 100644
new mode 100755
index 2dd644a..1dbdbbd
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
@@ -1,1256 +1,1255 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
package org.apache.tapestry5.internal.plastic.asm.util;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.tapestry5.internal.plastic.asm.Attribute;
+import org.apache.tapestry5.internal.plastic.asm.ClassReader;
+import org.apache.tapestry5.internal.plastic.asm.ConstantDynamic;
import org.apache.tapestry5.internal.plastic.asm.Handle;
import org.apache.tapestry5.internal.plastic.asm.Label;
import org.apache.tapestry5.internal.plastic.asm.Opcodes;
+import org.apache.tapestry5.internal.plastic.asm.Type;
import org.apache.tapestry5.internal.plastic.asm.TypePath;
/**
* An abstract converter from visit events to text.
- *
+ *
* @author Eric Bruneton
*/
public abstract class Printer {
- /**
- * The names of the Java Virtual Machine opcodes.
- */
- public static final String[] OPCODES;
-
- /**
- * The names of the for <code>operand</code> parameter values of the
- * {@link org.objectweb.asm.MethodVisitor#visitIntInsn} method when
- * <code>opcode</code> is <code>NEWARRAY</code>.
- */
- public static final String[] TYPES;
-
- /**
- * The names of the <code>tag</code> field values for
- * {@link org.objectweb.asm.Handle}.
- */
- public static final String[] HANDLE_TAG;
-
- static {
- String s = "NOP,ACONST_NULL,ICONST_M1,ICONST_0,ICONST_1,ICONST_2,"
- + "ICONST_3,ICONST_4,ICONST_5,LCONST_0,LCONST_1,FCONST_0,"
- + "FCONST_1,FCONST_2,DCONST_0,DCONST_1,BIPUSH,SIPUSH,LDC,,,"
- + "ILOAD,LLOAD,FLOAD,DLOAD,ALOAD,,,,,,,,,,,,,,,,,,,,,IALOAD,"
- + "LALOAD,FALOAD,DALOAD,AALOAD,BALOAD,CALOAD,SALOAD,ISTORE,"
- + "LSTORE,FSTORE,DSTORE,ASTORE,,,,,,,,,,,,,,,,,,,,,IASTORE,"
- + "LASTORE,FASTORE,DASTORE,AASTORE,BASTORE,CASTORE,SASTORE,POP,"
- + "POP2,DUP,DUP_X1,DUP_X2,DUP2,DUP2_X1,DUP2_X2,SWAP,IADD,LADD,"
- + "FADD,DADD,ISUB,LSUB,FSUB,DSUB,IMUL,LMUL,FMUL,DMUL,IDIV,LDIV,"
- + "FDIV,DDIV,IREM,LREM,FREM,DREM,INEG,LNEG,FNEG,DNEG,ISHL,LSHL,"
- + "ISHR,LSHR,IUSHR,LUSHR,IAND,LAND,IOR,LOR,IXOR,LXOR,IINC,I2L,"
- + "I2F,I2D,L2I,L2F,L2D,F2I,F2L,F2D,D2I,D2L,D2F,I2B,I2C,I2S,LCMP,"
- + "FCMPL,FCMPG,DCMPL,DCMPG,IFEQ,IFNE,IFLT,IFGE,IFGT,IFLE,"
- + "IF_ICMPEQ,IF_ICMPNE,IF_ICMPLT,IF_ICMPGE,IF_ICMPGT,IF_ICMPLE,"
- + "IF_ACMPEQ,IF_ACMPNE,GOTO,JSR,RET,TABLESWITCH,LOOKUPSWITCH,"
- + "IRETURN,LRETURN,FRETURN,DRETURN,ARETURN,RETURN,GETSTATIC,"
- + "PUTSTATIC,GETFIELD,PUTFIELD,INVOKEVIRTUAL,INVOKESPECIAL,"
- + "INVOKESTATIC,INVOKEINTERFACE,INVOKEDYNAMIC,NEW,NEWARRAY,"
- + "ANEWARRAY,ARRAYLENGTH,ATHROW,CHECKCAST,INSTANCEOF,"
- + "MONITORENTER,MONITOREXIT,,MULTIANEWARRAY,IFNULL,IFNONNULL,";
- OPCODES = new String[200];
- int i = 0;
- int j = 0;
- int l;
- while ((l = s.indexOf(',', j)) > 0) {
- OPCODES[i++] = j + 1 == l ? null : s.substring(j, l);
- j = l + 1;
- }
-
- s = "T_BOOLEAN,T_CHAR,T_FLOAT,T_DOUBLE,T_BYTE,T_SHORT,T_INT,T_LONG,";
- TYPES = new String[12];
- j = 0;
- i = 4;
- while ((l = s.indexOf(',', j)) > 0) {
- TYPES[i++] = s.substring(j, l);
- j = l + 1;
- }
-
- s = "H_GETFIELD,H_GETSTATIC,H_PUTFIELD,H_PUTSTATIC,"
- + "H_INVOKEVIRTUAL,H_INVOKESTATIC,H_INVOKESPECIAL,"
- + "H_NEWINVOKESPECIAL,H_INVOKEINTERFACE,";
- HANDLE_TAG = new String[10];
- j = 0;
- i = 1;
- while ((l = s.indexOf(',', j)) > 0) {
- HANDLE_TAG[i++] = s.substring(j, l);
- j = l + 1;
- }
- }
-
- /**
- * The ASM API version implemented by this class. The value of this field
- * must be one of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
- */
- protected final int api;
-
- /**
- * A buffer that can be used to create strings.
- */
- protected final StringBuffer buf;
-
- /**
- * The text to be printed. Since the code of methods is not necessarily
- * visited in sequential order, one method after the other, but can be
- * interlaced (some instructions from method one, then some instructions
- * from method two, then some instructions from method one again...), it is
- * not possible to print the visited instructions directly to a sequential
- * stream. A class is therefore printed in a two steps process: a string
- * tree is constructed during the visit, and printed to a sequential stream
- * at the end of the visit. This string tree is stored in this field, as a
- * string list that can contain other string lists, which can themselves
- * contain other string lists, and so on.
- */
- public final List<Object> text;
-
- /**
- * Constructs a new {@link Printer}.
- *
- * @param api
- * the ASM API version implemented by this printer. Must be one
- * of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
- */
- protected Printer(final int api) {
- this.api = api;
- this.buf = new StringBuffer();
- this.text = new ArrayList<Object>();
- }
-
- /**
- * Class header.
- * See {@link org.objectweb.asm.ClassVisitor#visit}.
- *
- * @param version
- * the class version.
- * @param access
- * the class's access flags (see {@link Opcodes}). This parameter
- * also indicates if the class is deprecated.
- * @param name
- * the internal name of the class (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- * @param signature
- * the signature of this class. May be <tt>null</tt> if the class
- * is not a generic one, and does not extend or implement generic
- * classes or interfaces.
- * @param superName
- * the internal of name of the super class (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- * For interfaces, the super class is {@link Object}. May be
- * <tt>null</tt>, but only for the {@link Object} class.
- * @param interfaces
- * the internal names of the class's interfaces (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- * May be <tt>null</tt>.
- */
- public abstract void visit(final int version, final int access,
- final String name, final String signature, final String superName,
- final String[] interfaces);
-
- /**
- * Class source.
- * See {@link org.objectweb.asm.ClassVisitor#visitSource}.
- *
- * @param source
- * the name of the source file from which the class was compiled.
- * May be <tt>null</tt>.
- * @param debug
- * additional debug information to compute the correspondance
- * between source and compiled elements of the class. May be
- * <tt>null</tt>.
- */
- public abstract void visitSource(final String source, final String debug);
-
-
- /**
- * Module.
- * See {@link org.objectweb.asm.ClassVisitor#visitModule(String, int)}.
- *
- * @param name
- * module name.
- * @param access
- * module flags, among {@code ACC_OPEN}, {@code ACC_SYNTHETIC}
- * and {@code ACC_MANDATED}.
- * @param version
- * module version or null.
- * @return
- */
- public Printer visitModule(String name, int access, String version) {
- throw new RuntimeException("Must be overriden");
- }
-
- /**
- * Class outer class.
- * See {@link org.objectweb.asm.ClassVisitor#visitOuterClass}.
- *
- * Visits the enclosing class of the class. This method must be called only
- * if the class has an enclosing class.
- *
- * @param owner
- * internal name of the enclosing class of the class.
- * @param name
- * the name of the method that contains the class, or
- * <tt>null</tt> if the class is not enclosed in a method of its
- * enclosing class.
- * @param desc
- * the descriptor of the method that contains the class, or
- * <tt>null</tt> if the class is not enclosed in a method of its
- * enclosing class.
- */
- public abstract void visitOuterClass(final String owner, final String name,
- final String desc);
-
- /**
- * Class annotation.
- * See {@link org.objectweb.asm.ClassVisitor#visitAnnotation}.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public abstract Printer visitClassAnnotation(final String desc,
- final boolean visible);
-
- /**
- * Class type annotation.
- * See {@link org.objectweb.asm.ClassVisitor#visitTypeAnnotation}.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be
- * {@link org.objectweb.asm.TypeReference#CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
- * {@link org.objectweb.asm.TypeReference#CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND}
- * or {@link org.objectweb.asm.TypeReference#CLASS_EXTENDS CLASS_EXTENDS}.
- * See {@link org.objectweb.asm.TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public Printer visitClassTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overriden");
- }
-
- /**
- * Class attribute.
- * See {@link org.objectweb.asm.ClassVisitor#visitAttribute}.
- *
- * @param attr
- * an attribute.
- */
- public abstract void visitClassAttribute(final Attribute attr);
-
- /**
- * Class inner name.
- * See {@link org.objectweb.asm.ClassVisitor#visitInnerClass}.
- *
- * @param name
- * the internal name of an inner class (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- * @param outerName
- * the internal name of the class to which the inner class
- * belongs (see {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- * May be <tt>null</tt> for not member classes.
- * @param innerName
- * the (simple) name of the inner class inside its enclosing
- * class. May be <tt>null</tt> for anonymous inner classes.
- * @param access
- * the access flags of the inner class as originally declared in
- * the enclosing class.
- */
- public abstract void visitInnerClass(final String name,
- final String outerName, final String innerName, final int access);
-
- /**
- * Class field.
- * See {@link org.objectweb.asm.ClassVisitor#visitField}.
- *
- * @param access
- * the field's access flags (see {@link Opcodes}). This parameter
- * also indicates if the field is synthetic and/or deprecated.
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link org.objectweb.asm.Type Type}).
- * @param signature
- * the field's signature. May be <tt>null</tt> if the field's
- * type does not use generic types.
- * @param value
- * the field's initial value. This parameter, which may be
- * <tt>null</tt> if the field does not have an initial value,
- * must be an {@link Integer}, a {@link Float}, a {@link Long}, a
- * {@link Double} or a {@link String} (for <tt>int</tt>,
- * <tt>float</tt>, <tt>long</tt> or <tt>String</tt> fields
- * respectively). <i>This parameter is only used for static
- * fields</i>. Its value is ignored for non static fields, which
- * must be initialized through bytecode instructions in
- * constructors or methods.
- * @return the printer
- */
- public abstract Printer visitField(final int access, final String name,
- final String desc, final String signature, final Object value);
-
- /**
- * Class method.
- * See {@link org.objectweb.asm.ClassVisitor#visitMethod}.
- *
- * @param access
- * the method's access flags (see {@link Opcodes}). This
- * parameter also indicates if the method is synthetic and/or
- * deprecated.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link org.objectweb.asm.Type Type}).
- * @param signature
- * the method's signature. May be <tt>null</tt> if the method
- * parameters, return type and exceptions do not use generic
- * types.
- * @param exceptions
- * the internal names of the method's exception classes (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}). May be
- * <tt>null</tt>.
- * @return the printer
- */
- public abstract Printer visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions);
-
- /**
- * Class end. See {@link org.objectweb.asm.ClassVisitor#visitEnd}.
- */
- public abstract void visitClassEnd();
-
- // ------------------------------------------------------------------------
- // Module
- // ------------------------------------------------------------------------
-
- public void visitMainClass(String mainClass) {
- throw new RuntimeException("Must be overriden");
- }
-
- public void visitPackage(String packaze) {
- throw new RuntimeException("Must be overriden");
- }
-
- public void visitRequire(String module, int access, String version) {
- throw new RuntimeException("Must be overriden");
- }
-
- public void visitExport(String packaze, int access, String... modules) {
- throw new RuntimeException("Must be overriden");
- }
-
- public void visitOpen(String packaze, int access, String... modules) {
- throw new RuntimeException("Must be overriden");
+ /** The names of the Java Virtual Machine opcodes. */
+ public static final String[] OPCODES = {
+ "NOP", // 0 (0x0)
+ "ACONST_NULL", // 1 (0x1)
+ "ICONST_M1", // 2 (0x2)
+ "ICONST_0", // 3 (0x3)
+ "ICONST_1", // 4 (0x4)
+ "ICONST_2", // 5 (0x5)
+ "ICONST_3", // 6 (0x6)
+ "ICONST_4", // 7 (0x7)
+ "ICONST_5", // 8 (0x8)
+ "LCONST_0", // 9 (0x9)
+ "LCONST_1", // 10 (0xa)
+ "FCONST_0", // 11 (0xb)
+ "FCONST_1", // 12 (0xc)
+ "FCONST_2", // 13 (0xd)
+ "DCONST_0", // 14 (0xe)
+ "DCONST_1", // 15 (0xf)
+ "BIPUSH", // 16 (0x10)
+ "SIPUSH", // 17 (0x11)
+ "LDC", // 18 (0x12)
+ "LDC_W", // 19 (0x13)
+ "LDC2_W", // 20 (0x14)
+ "ILOAD", // 21 (0x15)
+ "LLOAD", // 22 (0x16)
+ "FLOAD", // 23 (0x17)
+ "DLOAD", // 24 (0x18)
+ "ALOAD", // 25 (0x19)
+ "ILOAD_0", // 26 (0x1a)
+ "ILOAD_1", // 27 (0x1b)
+ "ILOAD_2", // 28 (0x1c)
+ "ILOAD_3", // 29 (0x1d)
+ "LLOAD_0", // 30 (0x1e)
+ "LLOAD_1", // 31 (0x1f)
+ "LLOAD_2", // 32 (0x20)
+ "LLOAD_3", // 33 (0x21)
+ "FLOAD_0", // 34 (0x22)
+ "FLOAD_1", // 35 (0x23)
+ "FLOAD_2", // 36 (0x24)
+ "FLOAD_3", // 37 (0x25)
+ "DLOAD_0", // 38 (0x26)
+ "DLOAD_1", // 39 (0x27)
+ "DLOAD_2", // 40 (0x28)
+ "DLOAD_3", // 41 (0x29)
+ "ALOAD_0", // 42 (0x2a)
+ "ALOAD_1", // 43 (0x2b)
+ "ALOAD_2", // 44 (0x2c)
+ "ALOAD_3", // 45 (0x2d)
+ "IALOAD", // 46 (0x2e)
+ "LALOAD", // 47 (0x2f)
+ "FALOAD", // 48 (0x30)
+ "DALOAD", // 49 (0x31)
+ "AALOAD", // 50 (0x32)
+ "BALOAD", // 51 (0x33)
+ "CALOAD", // 52 (0x34)
+ "SALOAD", // 53 (0x35)
+ "ISTORE", // 54 (0x36)
+ "LSTORE", // 55 (0x37)
+ "FSTORE", // 56 (0x38)
+ "DSTORE", // 57 (0x39)
+ "ASTORE", // 58 (0x3a)
+ "ISTORE_0", // 59 (0x3b)
+ "ISTORE_1", // 60 (0x3c)
+ "ISTORE_2", // 61 (0x3d)
+ "ISTORE_3", // 62 (0x3e)
+ "LSTORE_0", // 63 (0x3f)
+ "LSTORE_1", // 64 (0x40)
+ "LSTORE_2", // 65 (0x41)
+ "LSTORE_3", // 66 (0x42)
+ "FSTORE_0", // 67 (0x43)
+ "FSTORE_1", // 68 (0x44)
+ "FSTORE_2", // 69 (0x45)
+ "FSTORE_3", // 70 (0x46)
+ "DSTORE_0", // 71 (0x47)
+ "DSTORE_1", // 72 (0x48)
+ "DSTORE_2", // 73 (0x49)
+ "DSTORE_3", // 74 (0x4a)
+ "ASTORE_0", // 75 (0x4b)
+ "ASTORE_1", // 76 (0x4c)
+ "ASTORE_2", // 77 (0x4d)
+ "ASTORE_3", // 78 (0x4e)
+ "IASTORE", // 79 (0x4f)
+ "LASTORE", // 80 (0x50)
+ "FASTORE", // 81 (0x51)
+ "DASTORE", // 82 (0x52)
+ "AASTORE", // 83 (0x53)
+ "BASTORE", // 84 (0x54)
+ "CASTORE", // 85 (0x55)
+ "SASTORE", // 86 (0x56)
+ "POP", // 87 (0x57)
+ "POP2", // 88 (0x58)
+ "DUP", // 89 (0x59)
+ "DUP_X1", // 90 (0x5a)
+ "DUP_X2", // 91 (0x5b)
+ "DUP2", // 92 (0x5c)
+ "DUP2_X1", // 93 (0x5d)
+ "DUP2_X2", // 94 (0x5e)
+ "SWAP", // 95 (0x5f)
+ "IADD", // 96 (0x60)
+ "LADD", // 97 (0x61)
+ "FADD", // 98 (0x62)
+ "DADD", // 99 (0x63)
+ "ISUB", // 100 (0x64)
+ "LSUB", // 101 (0x65)
+ "FSUB", // 102 (0x66)
+ "DSUB", // 103 (0x67)
+ "IMUL", // 104 (0x68)
+ "LMUL", // 105 (0x69)
+ "FMUL", // 106 (0x6a)
+ "DMUL", // 107 (0x6b)
+ "IDIV", // 108 (0x6c)
+ "LDIV", // 109 (0x6d)
+ "FDIV", // 110 (0x6e)
+ "DDIV", // 111 (0x6f)
+ "IREM", // 112 (0x70)
+ "LREM", // 113 (0x71)
+ "FREM", // 114 (0x72)
+ "DREM", // 115 (0x73)
+ "INEG", // 116 (0x74)
+ "LNEG", // 117 (0x75)
+ "FNEG", // 118 (0x76)
+ "DNEG", // 119 (0x77)
+ "ISHL", // 120 (0x78)
+ "LSHL", // 121 (0x79)
+ "ISHR", // 122 (0x7a)
+ "LSHR", // 123 (0x7b)
+ "IUSHR", // 124 (0x7c)
+ "LUSHR", // 125 (0x7d)
+ "IAND", // 126 (0x7e)
+ "LAND", // 127 (0x7f)
+ "IOR", // 128 (0x80)
+ "LOR", // 129 (0x81)
+ "IXOR", // 130 (0x82)
+ "LXOR", // 131 (0x83)
+ "IINC", // 132 (0x84)
+ "I2L", // 133 (0x85)
+ "I2F", // 134 (0x86)
+ "I2D", // 135 (0x87)
+ "L2I", // 136 (0x88)
+ "L2F", // 137 (0x89)
+ "L2D", // 138 (0x8a)
+ "F2I", // 139 (0x8b)
+ "F2L", // 140 (0x8c)
+ "F2D", // 141 (0x8d)
+ "D2I", // 142 (0x8e)
+ "D2L", // 143 (0x8f)
+ "D2F", // 144 (0x90)
+ "I2B", // 145 (0x91)
+ "I2C", // 146 (0x92)
+ "I2S", // 147 (0x93)
+ "LCMP", // 148 (0x94)
+ "FCMPL", // 149 (0x95)
+ "FCMPG", // 150 (0x96)
+ "DCMPL", // 151 (0x97)
+ "DCMPG", // 152 (0x98)
+ "IFEQ", // 153 (0x99)
+ "IFNE", // 154 (0x9a)
+ "IFLT", // 155 (0x9b)
+ "IFGE", // 156 (0x9c)
+ "IFGT", // 157 (0x9d)
+ "IFLE", // 158 (0x9e)
+ "IF_ICMPEQ", // 159 (0x9f)
+ "IF_ICMPNE", // 160 (0xa0)
+ "IF_ICMPLT", // 161 (0xa1)
+ "IF_ICMPGE", // 162 (0xa2)
+ "IF_ICMPGT", // 163 (0xa3)
+ "IF_ICMPLE", // 164 (0xa4)
+ "IF_ACMPEQ", // 165 (0xa5)
+ "IF_ACMPNE", // 166 (0xa6)
+ "GOTO", // 167 (0xa7)
+ "JSR", // 168 (0xa8)
+ "RET", // 169 (0xa9)
+ "TABLESWITCH", // 170 (0xaa)
+ "LOOKUPSWITCH", // 171 (0xab)
+ "IRETURN", // 172 (0xac)
+ "LRETURN", // 173 (0xad)
+ "FRETURN", // 174 (0xae)
+ "DRETURN", // 175 (0xaf)
+ "ARETURN", // 176 (0xb0)
+ "RETURN", // 177 (0xb1)
+ "GETSTATIC", // 178 (0xb2)
+ "PUTSTATIC", // 179 (0xb3)
+ "GETFIELD", // 180 (0xb4)
+ "PUTFIELD", // 181 (0xb5)
+ "INVOKEVIRTUAL", // 182 (0xb6)
+ "INVOKESPECIAL", // 183 (0xb7)
+ "INVOKESTATIC", // 184 (0xb8)
+ "INVOKEINTERFACE", // 185 (0xb9)
+ "INVOKEDYNAMIC", // 186 (0xba)
+ "NEW", // 187 (0xbb)
+ "NEWARRAY", // 188 (0xbc)
+ "ANEWARRAY", // 189 (0xbd)
+ "ARRAYLENGTH", // 190 (0xbe)
+ "ATHROW", // 191 (0xbf)
+ "CHECKCAST", // 192 (0xc0)
+ "INSTANCEOF", // 193 (0xc1)
+ "MONITORENTER", // 194 (0xc2)
+ "MONITOREXIT", // 195 (0xc3)
+ "WIDE", // 196 (0xc4)
+ "MULTIANEWARRAY", // 197 (0xc5)
+ "IFNULL", // 198 (0xc6)
+ "IFNONNULL" // 199 (0xc7)
+ };
+
+ /**
+ * The names of the {@code operand} values of the {@link
+ * org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitIntInsn} method when {@code opcode} is {@code NEWARRAY}.
+ */
+ public static final String[] TYPES = {
+ "",
+ "",
+ "",
+ "",
+ "T_BOOLEAN",
+ "T_CHAR",
+ "T_FLOAT",
+ "T_DOUBLE",
+ "T_BYTE",
+ "T_SHORT",
+ "T_INT",
+ "T_LONG"
+ };
+
+ /** The names of the {@code tag} field values for {@link org.apache.tapestry5.internal.plastic.asm.Handle}. */
+ public static final String[] HANDLE_TAG = {
+ "",
+ "H_GETFIELD",
+ "H_GETSTATIC",
+ "H_PUTFIELD",
+ "H_PUTSTATIC",
+ "H_INVOKEVIRTUAL",
+ "H_INVOKESTATIC",
+ "H_INVOKESPECIAL",
+ "H_NEWINVOKESPECIAL",
+ "H_INVOKEINTERFACE"
+ };
+
+ /** Message of the UnsupportedOperationException thrown by methods which must be overridden. */
+ private static final String UNSUPPORTED_OPERATION = "Must be overridden";
+
+ /**
+ * The ASM API version implemented by this class. The value of this field must be one of {@link
+ * Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+ */
+ protected final int api;
+
+ /**
+ * A buffer that can be used to create strings.
+ *
+ * @deprecated use {@link #stringBuilder} instead.
+ */
+ @Deprecated protected final StringBuffer buf;
+
+ /** The builder used to build strings in the various visit methods. */
+ protected final StringBuilder stringBuilder;
+
+ /**
+ * The text to be printed. Since the code of methods is not necessarily visited in sequential
+ * order, one method after the other, but can be interlaced (some instructions from method one,
+ * then some instructions from method two, then some instructions from method one again...), it is
+ * not possible to print the visited instructions directly to a sequential stream. A class is
+ * therefore printed in a two steps process: a string tree is constructed during the visit, and
+ * printed to a sequential stream at the end of the visit. This string tree is stored in this
+ * field, as a string list that can contain other string lists, which can themselves contain other
+ * string lists, and so on.
+ */
+ public final List<Object> text;
+
+ // -----------------------------------------------------------------------------------------------
+ // Constructor
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Constructs a new {@link Printer}.
+ *
+ * @param api the ASM API version implemented by this printer. Must be one of {@link
+ * Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+ */
+ protected Printer(final int api) {
+ this.api = api;
+ this.buf = null;
+ this.stringBuilder = new StringBuilder();
+ this.text = new ArrayList<Object>();
+ }
+
+ // -----------------------------------------------------------------------------------------------
+ // Classes
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Class header. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visit}.
+ *
+ * @param version the class version. The minor version is stored in the 16 most significant bits,
+ * and the major version in the 16 least significant bits.
+ * @param access the class's access flags (see {@link Opcodes}). This parameter also indicates if
+ * the class is deprecated.
+ * @param name the internal name of the class (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
+ * @param signature the signature of this class. May be {@literal null} if the class is not a
+ * generic one, and does not extend or implement generic classes or interfaces.
+ * @param superName the internal of name of the super class (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}). For interfaces, the super class is {@link
+ * Object}. May be {@literal null}, but only for the {@link Object} class.
+ * @param interfaces the internal names of the class's interfaces (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}). May be {@literal null}.
+ */
+ public abstract void visit(
+ int version,
+ int access,
+ String name,
+ String signature,
+ String superName,
+ String[] interfaces);
+
+ /**
+ * Class source. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitSource}.
+ *
+ * @param source the name of the source file from which the class was compiled. May be {@literal
+ * null}.
+ * @param debug additional debug information to compute the correspondence between source and
+ * compiled elements of the class. May be {@literal null}.
+ */
+ public abstract void visitSource(String source, String debug);
+
+ /**
+ * Module. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitModule}.
+ *
+ * @param name the fully qualified name (using dots) of the module.
+ * @param access the module access flags, among {@code ACC_OPEN}, {@code ACC_SYNTHETIC} and {@code
+ * ACC_MANDATED}.
+ * @param version the module version, or {@literal null}.
+ * @return the printer.
+ */
+ public Printer visitModule(final String name, final int access, final String version) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Visits the nest host class of the class. A nest is a set of classes of the same package that
+ * share access to their private members. One of these classes, called the host, lists the other
+ * members of the nest, which in turn should link to the host of their nest. This method must be
+ * called only once and only if the visited class is a non-host member of a nest. A class is
+ * implicitly its own nest, so it's invalid to call this method with the visited class name as
+ * argument.
+ *
+ * @param nestHost the internal name of the host class of the nest.
+ */
+ public void visitNestHost(final String nestHost) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Class outer class. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitOuterClass}.
+ *
+ * @param owner internal name of the enclosing class of the class.
+ * @param name the name of the method that contains the class, or {@literal null} if the class is
+ * not enclosed in a method of its enclosing class.
+ * @param descriptor the descriptor of the method that contains the class, or {@literal null} if
+ * the class is not enclosed in a method of its enclosing class.
+ */
+ public abstract void visitOuterClass(String owner, String name, String descriptor);
+
+ /**
+ * Class annotation. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitAnnotation}.
+ *
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public abstract Printer visitClassAnnotation(String descriptor, boolean visible);
+
+ /**
+ * Class type annotation. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitTypeAnnotation}.
+ *
+ * @param typeRef a reference to the annotated type. The sort of this type reference must be
+ * {@link org.apache.tapestry5.internal.plastic.asm.TypeReference#CLASS_TYPE_PARAMETER}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#CLASS_TYPE_PARAMETER_BOUND} or {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#CLASS_EXTENDS}. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference}.
+ * @param typePath the path to the annotated type argument, wildcard bound, array element type, or
+ * static inner type within 'typeRef'. May be {@literal null} if the annotation targets
+ * 'typeRef' as a whole.
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public Printer visitClassTypeAnnotation(
+ final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Class attribute. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitAttribute}.
+ *
+ * @param attribute an attribute.
+ */
+ public abstract void visitClassAttribute(Attribute attribute);
+
+ /**
+ * Visits a member of the nest. A nest is a set of classes of the same package that share access
+ * to their private members. One of these classes, called the host, lists the other members of the
+ * nest, which in turn should link to the host of their nest. This method must be called only if
+ * the visited class is the host of a nest. A nest host is implicitly a member of its own nest, so
+ * it's invalid to call this method with the visited class name as argument.
+ *
+ * @param nestMember the internal name of a nest member.
+ */
+ public void visitNestMember(final String nestMember) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Class inner name. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitInnerClass}.
+ *
+ * @param name the internal name of an inner class (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
+ * @param outerName the internal name of the class to which the inner class belongs (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}). May be {@literal null} for not member classes.
+ * @param innerName the (simple) name of the inner class inside its enclosing class. May be
+ * {@literal null} for anonymous inner classes.
+ * @param access the access flags of the inner class as originally declared in the enclosing
+ * class.
+ */
+ public abstract void visitInnerClass(String name, String outerName, String innerName, int access);
+
+ /**
+ * Class field. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitField}.
+ *
+ * @param access the field's access flags (see {@link Opcodes}). This parameter also indicates if
+ * the field is synthetic and/or deprecated.
+ * @param name the field's name.
+ * @param descriptor the field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ * @param signature the field's signature. May be {@literal null} if the field's type does not use
+ * generic types.
+ * @param value the field's initial value. This parameter, which may be {@literal null} if the
+ * field does not have an initial value, must be an {@link Integer}, a {@link Float}, a {@link
+ * Long}, a {@link Double} or a {@link String} (for {@code int}, {@code float}, {@code long}
+ * or {@code String} fields respectively). <i>This parameter is only used for static
+ * fields</i>. Its value is ignored for non static fields, which must be initialized through
+ * bytecode instructions in constructors or methods.
+ * @return the printer.
+ */
+ public abstract Printer visitField(
+ int access, String name, String descriptor, String signature, Object value);
+
+ /**
+ * Class method. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitMethod}.
+ *
+ * @param access the method's access flags (see {@link Opcodes}). This parameter also indicates if
+ * the method is synthetic and/or deprecated.
+ * @param name the method's name.
+ * @param descriptor the method's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ * @param signature the method's signature. May be {@literal null} if the method parameters,
+ * return type and exceptions do not use generic types.
+ * @param exceptions the internal names of the method's exception classes (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}). May be {@literal null}.
+ * @return the printer.
+ */
+ public abstract Printer visitMethod(
+ int access, String name, String descriptor, String signature, String[] exceptions);
+
+ /** Class end. See {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitEnd}. */
+ public abstract void visitClassEnd();
+
+ // -----------------------------------------------------------------------------------------------
+ // Modules
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Module main class. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitMainClass}.
+ *
+ * @param mainClass the internal name of the main class of the current module.
+ */
+ public void visitMainClass(final String mainClass) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Module package. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitPackage}.
+ *
+ * @param packaze the internal name of a package.
+ */
+ public void visitPackage(final String packaze) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Module require. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitRequire}.
+ *
+ * @param module the fully qualified name (using dots) of the dependence.
+ * @param access the access flag of the dependence among {@code ACC_TRANSITIVE}, {@code
+ * ACC_STATIC_PHASE}, {@code ACC_SYNTHETIC} and {@code ACC_MANDATED}.
+ * @param version the module version at compile time, or {@literal null}.
+ */
+ public void visitRequire(final String module, final int access, final String version) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Module export. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitExport}.
+ *
+ * @param packaze the internal name of the exported package.
+ * @param access the access flag of the exported package, valid values are among {@code
+ * ACC_SYNTHETIC} and {@code ACC_MANDATED}.
+ * @param modules the fully qualified names (using dots) of the modules that can access the public
+ * classes of the exported package, or {@literal null}.
+ */
+ public void visitExport(final String packaze, final int access, final String... modules) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Module open. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitOpen}.
+ *
+ * @param packaze the internal name of the opened package.
+ * @param access the access flag of the opened package, valid values are among {@code
+ * ACC_SYNTHETIC} and {@code ACC_MANDATED}.
+ * @param modules the fully qualified names (using dots) of the modules that can use deep
+ * reflection to the classes of the open package, or {@literal null}.
+ */
+ public void visitOpen(final String packaze, final int access, final String... modules) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Module use. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitUse}.
+ *
+ * @param service the internal name of the service.
+ */
+ public void visitUse(final String service) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Module provide. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitProvide}.
+ *
+ * @param service the internal name of the service.
+ * @param providers the internal names of the implementations of the service (there is at least
+ * one provider).
+ */
+ public void visitProvide(final String service, final String... providers) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /** Module end. See {@link org.apache.tapestry5.internal.plastic.asm.ModuleVisitor#visitEnd}. */
+ public void visitModuleEnd() {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ // -----------------------------------------------------------------------------------------------
+ // Annotations
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Annotation value. See {@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor#visit}.
+ *
+ * @param name the value name.
+ * @param value the actual value, whose type must be {@link Byte}, {@link Boolean}, {@link
+ * Character}, {@link Short}, {@link Integer} , {@link Long}, {@link Float}, {@link Double},
+ * {@link String} or {@link org.apache.tapestry5.internal.plastic.asm.Type} of {@link org.apache.tapestry5.internal.plastic.asm.Type#OBJECT}
+ * or {@link org.apache.tapestry5.internal.plastic.asm.Type#ARRAY} sort. This value can also be an array of byte,
+ * boolean, short, char, int, long, float or double values (this is equivalent to using {@link
+ * #visitArray} and visiting each array element in turn, but is more convenient).
+ */
+ // DontCheck(OverloadMethodsDeclarationOrder): overloads are semantically different.
+ public abstract void visit(String name, Object value);
+
+ /**
+ * Annotation enum value. See {@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor#visitEnum}.
+ *
+ * @param name the value name.
+ * @param descriptor the class descriptor of the enumeration class.
+ * @param value the actual enumeration value.
+ */
+ public abstract void visitEnum(String name, String descriptor, String value);
+
+ /**
+ * Nested annotation value. See {@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor#visitAnnotation}.
+ *
+ * @param name the value name.
+ * @param descriptor the class descriptor of the nested annotation class.
+ * @return the printer.
+ */
+ public abstract Printer visitAnnotation(String name, String descriptor);
+
+ /**
+ * Annotation array value. See {@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor#visitArray}.
+ *
+ * @param name the value name.
+ * @return the printer.
+ */
+ public abstract Printer visitArray(String name);
+
+ /** Annotation end. See {@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor#visitEnd}. */
+ public abstract void visitAnnotationEnd();
+
+ // -----------------------------------------------------------------------------------------------
+ // Fields
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Field annotation. See {@link org.apache.tapestry5.internal.plastic.asm.FieldVisitor#visitAnnotation}.
+ *
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public abstract Printer visitFieldAnnotation(String descriptor, boolean visible);
+
+ /**
+ * Field type annotation. See {@link org.apache.tapestry5.internal.plastic.asm.FieldVisitor#visitTypeAnnotation}.
+ *
+ * @param typeRef a reference to the annotated type. The sort of this type reference must be
+ * {@link org.apache.tapestry5.internal.plastic.asm.TypeReference#FIELD}. See {@link org.apache.tapestry5.internal.plastic.asm.TypeReference}.
+ * @param typePath the path to the annotated type argument, wildcard bound, array element type, or
+ * static inner type within 'typeRef'. May be {@literal null} if the annotation targets
+ * 'typeRef' as a whole.
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public Printer visitFieldTypeAnnotation(
+ final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Field attribute. See {@link org.apache.tapestry5.internal.plastic.asm.FieldVisitor#visitAttribute}.
+ *
+ * @param attribute an attribute.
+ */
+ public abstract void visitFieldAttribute(Attribute attribute);
+
+ /** Field end. See {@link org.apache.tapestry5.internal.plastic.asm.FieldVisitor#visitEnd}. */
+ public abstract void visitFieldEnd();
+
+ // -----------------------------------------------------------------------------------------------
+ // Methods
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Method parameter. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitParameter(String, int)}.
+ *
+ * @param name parameter name or null if none is provided.
+ * @param access the parameter's access flags, only {@code ACC_FINAL}, {@code ACC_SYNTHETIC}
+ * or/and {@code ACC_MANDATED} are allowed (see {@link Opcodes}).
+ */
+ public void visitParameter(final String name, final int access) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method default annotation. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitAnnotationDefault}.
+ *
+ * @return the printer.
+ */
+ public abstract Printer visitAnnotationDefault();
+
+ /**
+ * Method annotation. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitAnnotation}.
+ *
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public abstract Printer visitMethodAnnotation(String descriptor, boolean visible);
+
+ /**
+ * Method type annotation. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitTypeAnnotation}.
+ *
+ * @param typeRef a reference to the annotated type. The sort of this type reference must be
+ * {@link org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_TYPE_PARAMETER}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_TYPE_PARAMETER_BOUND}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_RETURN}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_RECEIVER}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_FORMAL_PARAMETER} or {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#THROWS}. See {@link org.apache.tapestry5.internal.plastic.asm.TypeReference}.
+ * @param typePath the path to the annotated type argument, wildcard bound, array element type, or
+ * static inner type within 'typeRef'. May be {@literal null} if the annotation targets
+ * 'typeRef' as a whole.
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public Printer visitMethodTypeAnnotation(
+ final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Number of method parameters that can have annotations. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitAnnotableParameterCount}.
+ *
+ * @param parameterCount the number of method parameters than can have annotations. This number
+ * must be less or equal than the number of parameter types in the method descriptor. It can
+ * be strictly less when a method has synthetic parameters and when these parameters are
+ * ignored when computing parameter indices for the purpose of parameter annotations (see
+ * https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18).
+ * @param visible {@literal true} to define the number of method parameters that can have
+ * annotations visible at runtime, {@literal false} to define the number of method parameters
+ * that can have annotations invisible at runtime.
+ * @return the printer.
+ */
+ public Printer visitAnnotableParameterCount(final int parameterCount, final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method parameter annotation. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitParameterAnnotation}.
+ *
+ * @param parameter the parameter index. This index must be strictly smaller than the number of
+ * parameters in the method descriptor, and strictly smaller than the parameter count
+ * specified in {@link #visitAnnotableParameterCount}. Important note: <i>a parameter index i
+ * is not required to correspond to the i'th parameter descriptor in the method
+ * descriptor</i>, in particular in case of synthetic parameters (see
+ * https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18).
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public abstract Printer visitParameterAnnotation(
+ int parameter, String descriptor, boolean visible);
+
+ /**
+ * Method attribute. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitAttribute}.
+ *
+ * @param attribute an attribute.
+ */
+ public abstract void visitMethodAttribute(Attribute attribute);
+
+ /** Method start. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitCode}. */
+ public abstract void visitCode();
+
+ /**
+ * Method stack frame. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitFrame}.
+ *
+ * @param type the type of this stack map frame. Must be {@link Opcodes#F_NEW} for expanded
+ * frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP}, {@link
+ * Opcodes#F_SAME} or {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed frames.
+ * @param numLocal the number of local variables in the visited frame.
+ * @param local the local variable types in this frame. This array must not be modified. Primitive
+ * types are represented by {@link Opcodes#TOP}, {@link Opcodes#INTEGER}, {@link
+ * Opcodes#FLOAT}, {@link Opcodes#LONG}, {@link Opcodes#DOUBLE}, {@link Opcodes#NULL} or
+ * {@link Opcodes#UNINITIALIZED_THIS} (long and double are represented by a single element).
+ * Reference types are represented by String objects (representing internal names), and
+ * uninitialized types by Label objects (this label designates the NEW instruction that
+ * created this uninitialized value).
+ * @param numStack the number of operand stack elements in the visited frame.
+ * @param stack the operand stack types in this frame. This array must not be modified. Its
+ * content has the same format as the "local" array.
+ */
+ public abstract void visitFrame(
+ int type, int numLocal, Object[] local, int numStack, Object[] stack);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitInsn}
+ *
+ * @param opcode the opcode of the instruction to be visited. This opcode is either NOP,
+ * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5,
+ * LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD,
+ * FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE,
+ * AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2,
+ * SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV,
+ * FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR,
+ * LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I,
+ * D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
+ * DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or MONITOREXIT.
+ */
+ public abstract void visitInsn(int opcode);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitIntInsn}.
+ *
+ * @param opcode the opcode of the instruction to be visited. This opcode is either BIPUSH, SIPUSH
+ * or NEWARRAY.
+ * @param operand the operand of the instruction to be visited.<br>
+ * When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and Byte.MAX_VALUE.
+ * <br>
+ * When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and Short.MAX_VALUE.
+ * <br>
+ * When opcode is NEWARRAY, operand value should be one of {@link Opcodes#T_BOOLEAN}, {@link
+ * Opcodes#T_CHAR}, {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE}, {@link Opcodes#T_BYTE},
+ * {@link Opcodes#T_SHORT}, {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
+ */
+ public abstract void visitIntInsn(int opcode, int operand);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitVarInsn}.
+ *
+ * @param opcode the opcode of the local variable instruction to be visited. This opcode is either
+ * ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
+ * @param var the operand of the instruction to be visited. This operand is the index of a local
+ * variable.
+ */
+ public abstract void visitVarInsn(int opcode, int var);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitTypeInsn}.
+ *
+ * @param opcode the opcode of the type instruction to be visited. This opcode is either NEW,
+ * ANEWARRAY, CHECKCAST or INSTANCEOF.
+ * @param type the operand of the instruction to be visited. This operand must be the internal
+ * name of an object or array class (see {@link org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
+ */
+ public abstract void visitTypeInsn(int opcode, String type);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitFieldInsn}.
+ *
+ * @param opcode the opcode of the type instruction to be visited. This opcode is either
+ * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
+ * @param owner the internal name of the field's owner class (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
+ * @param name the field's name.
+ * @param descriptor the field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ */
+ public abstract void visitFieldInsn(int opcode, String owner, String name, String descriptor);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitMethodInsn}.
+ *
+ * @param opcode the opcode of the type instruction to be visited. This opcode is either
+ * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
+ * @param owner the internal name of the method's owner class (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
+ * @param name the method's name.
+ * @param descriptor the method's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ * @deprecated use {@link #visitMethodInsn(int, String, String, String, boolean)} instead.
+ */
+ @Deprecated
+ public void visitMethodInsn(
+ final int opcode, final String owner, final String name, final String descriptor) {
+ if (api >= Opcodes.ASM5) {
+ boolean isInterface = opcode == Opcodes.INVOKEINTERFACE;
+ visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+ return;
}
-
- public void visitUse(String service) {
- throw new RuntimeException("Must be overriden");
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitMethodInsn}.
+ *
+ * @param opcode the opcode of the type instruction to be visited. This opcode is either
+ * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
+ * @param owner the internal name of the method's owner class (see {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
+ * @param name the method's name.
+ * @param descriptor the method's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ * @param isInterface if the method's owner class is an interface.
+ */
+ public void visitMethodInsn(
+ final int opcode,
+ final String owner,
+ final String name,
+ final String descriptor,
+ final boolean isInterface) {
+ if (api < Opcodes.ASM5) {
+ if (isInterface != (opcode == Opcodes.INVOKEINTERFACE)) {
+ throw new IllegalArgumentException("INVOKESPECIAL/STATIC on interfaces require ASM 5");
+ }
+ visitMethodInsn(opcode, owner, name, descriptor);
+ return;
}
-
- public void visitProvide(String service, String... providers) {
- throw new RuntimeException("Must be overriden");
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitInvokeDynamicInsn}.
+ *
+ * @param name the method's name.
+ * @param descriptor the method's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ * @param bootstrapMethodHandle the bootstrap method.
+ * @param bootstrapMethodArguments the bootstrap method constant arguments. Each argument must be
+ * an {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.Type} or {@link Handle} value. This method is allowed to modify the
+ * content of the array so a caller should expect that this array may change.
+ */
+ public abstract void visitInvokeDynamicInsn(
+ String name,
+ String descriptor,
+ Handle bootstrapMethodHandle,
+ Object... bootstrapMethodArguments);
+
+ /**
+ * Method jump instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitJumpInsn}.
+ *
+ * @param opcode the opcode of the type instruction to be visited. This opcode is either IFEQ,
+ * IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT,
+ * IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
+ * @param label the operand of the instruction to be visited. This operand is a label that
+ * designates the instruction to which the jump instruction may jump.
+ */
+ public abstract void visitJumpInsn(int opcode, Label label);
+
+ /**
+ * Method label. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitLabel}.
+ *
+ * @param label a {@link Label} object.
+ */
+ public abstract void visitLabel(Label label);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitLdcInsn}.
+ *
+ * @param value the constant to be loaded on the stack. This parameter must be a non null {@link
+ * Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a {@link String}, a {@link
+ * Type} of OBJECT or ARRAY sort for {@code .class} constants, for classes whose version is
+ * 49, a {@link Type} of METHOD sort for MethodType, a {@link Handle} for MethodHandle
+ * constants, for classes whose version is 51 or a {@link ConstantDynamic} for a constant
+ * dynamic for classes whose version is 55.
+ */
+ public abstract void visitLdcInsn(Object value);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitIincInsn}.
+ *
+ * @param var index of the local variable to be incremented.
+ * @param increment amount to increment the local variable by.
+ */
+ public abstract void visitIincInsn(int var, int increment);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitTableSwitchInsn}.
+ *
+ * @param min the minimum key value.
+ * @param max the maximum key value.
+ * @param dflt beginning of the default handler block.
+ * @param labels beginnings of the handler blocks. {@code labels[i]} is the beginning of the
+ * handler block for the {@code min + i} key.
+ */
+ public abstract void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitLookupSwitchInsn}.
+ *
+ * @param dflt beginning of the default handler block.
+ * @param keys the values of the keys.
+ * @param labels beginnings of the handler blocks. {@code labels[i]} is the beginning of the
+ * handler block for the {@code keys[i]} key.
+ */
+ public abstract void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels);
+
+ /**
+ * Method instruction. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitMultiANewArrayInsn}.
+ *
+ * @param descriptor an array type descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+ * @param numDimensions the number of dimensions of the array to allocate.
+ */
+ public abstract void visitMultiANewArrayInsn(String descriptor, int numDimensions);
+
+ /**
+ * Instruction type annotation. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitInsnAnnotation}.
+ *
+ * @param typeRef a reference to the annotated type. The sort of this type reference must be
+ * {@link org.apache.tapestry5.internal.plastic.asm.TypeReference#INSTANCEOF}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#NEW}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#CONSTRUCTOR_REFERENCE}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_REFERENCE}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#CAST}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_INVOCATION_TYPE_ARGUMENT}, {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#METHOD_REFERENCE_TYPE_ARGUMENT}. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference}.
+ * @param typePath the path to the annotated type argument, wildcard bound, array element type, or
+ * static inner type within 'typeRef'. May be {@literal null} if the annotation targets
+ * 'typeRef' as a whole.
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public Printer visitInsnAnnotation(
+ final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method exception handler. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitTryCatchBlock}.
+ *
+ * @param start the beginning of the exception handler's scope (inclusive).
+ * @param end the end of the exception handler's scope (exclusive).
+ * @param handler the beginning of the exception handler's code.
+ * @param type the internal name of the type of exceptions handled by the handler, or {@literal
+ * null} to catch any exceptions (for "finally" blocks).
+ */
+ public abstract void visitTryCatchBlock(Label start, Label end, Label handler, String type);
+
+ /**
+ * Try catch block type annotation. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitTryCatchAnnotation}.
+ *
+ * @param typeRef a reference to the annotated type. The sort of this type reference must be
+ * {@link org.apache.tapestry5.internal.plastic.asm.TypeReference#EXCEPTION_PARAMETER}. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference}.
+ * @param typePath the path to the annotated type argument, wildcard bound, array element type, or
+ * static inner type within 'typeRef'. May be {@literal null} if the annotation targets
+ * 'typeRef' as a whole.
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public Printer visitTryCatchAnnotation(
+ final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method debug info. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitLocalVariable}.
+ *
+ * @param name the name of a local variable.
+ * @param descriptor the type descriptor of this local variable.
+ * @param signature the type signature of this local variable. May be {@literal null} if the local
+ * variable type does not use generic types.
+ * @param start the first instruction corresponding to the scope of this local variable
+ * (inclusive).
+ * @param end the last instruction corresponding to the scope of this local variable (exclusive).
+ * @param index the local variable's index.
+ */
+ public abstract void visitLocalVariable(
+ String name, String descriptor, String signature, Label start, Label end, int index);
+
+ /**
+ * Local variable type annotation. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitTryCatchAnnotation}.
+ *
+ * @param typeRef a reference to the annotated type. The sort of this type reference must be
+ * {@link org.apache.tapestry5.internal.plastic.asm.TypeReference#LOCAL_VARIABLE} or {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference#RESOURCE_VARIABLE}. See {@link
+ * org.apache.tapestry5.internal.plastic.asm.TypeReference}.
+ * @param typePath the path to the annotated type argument, wildcard bound, array element type, or
+ * static inner type within 'typeRef'. May be {@literal null} if the annotation targets
+ * 'typeRef' as a whole.
+ * @param start the fist instructions corresponding to the continuous ranges that make the scope
+ * of this local variable (inclusive).
+ * @param end the last instructions corresponding to the continuous ranges that make the scope of
+ * this local variable (exclusive). This array must have the same size as the 'start' array.
+ * @param index the local variable's index in each range. This array must have the same size as
+ * the 'start' array.
+ * @param descriptor the class descriptor of the annotation class.
+ * @param visible {@literal true} if the annotation is visible at runtime.
+ * @return the printer.
+ */
+ public Printer visitLocalVariableAnnotation(
+ final int typeRef,
+ final TypePath typePath,
+ final Label[] start,
+ final Label[] end,
+ final int[] index,
+ final String descriptor,
+ final boolean visible) {
+ throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);
+ }
+
+ /**
+ * Method debug info. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitLineNumber}.
+ *
+ * @param line a line number. This number refers to the source file from which the class was
+ * compiled.
+ * @param start the first instruction corresponding to this line number.
+ */
+ public abstract void visitLineNumber(int line, Label start);
+
+ /**
+ * Method max stack and max locals. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitMaxs}.
+ *
+ * @param maxStack maximum stack size of the method.
+ * @param maxLocals maximum number of local variables for the method.
+ */
+ public abstract void visitMaxs(int maxStack, int maxLocals);
+
+ /** Method end. See {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitEnd}. */
+ public abstract void visitMethodEnd();
+
+ // -----------------------------------------------------------------------------------------------
+ // Print and utility methods
+ // -----------------------------------------------------------------------------------------------
+
+ /**
+ * Returns the text constructed by this visitor.
+ *
+ * @return the text constructed by this visitor. See {@link #text}.
+ */
+ public List<Object> getText() {
+ return text;
+ }
+
+ /**
+ * Prints the text constructed by this visitor.
+ *
+ * @param printWriter the print writer to be used.
+ */
+ public void print(final PrintWriter printWriter) {
+ printList(printWriter, text);
+ }
+
+ /**
+ * Prints the given string tree.
+ *
+ * @param printWriter the writer to be used to print the tree.
+ * @param list a string tree, i.e., a string list that can contain other string lists, and so on
+ * recursively.
+ */
+ static void printList(final PrintWriter printWriter, final List<?> list) {
+ for (Object o : list) {
+ if (o instanceof List) {
+ printList(printWriter, (List<?>) o);
+ } else {
+ printWriter.print(o.toString());
+ }
}
-
- /**
- * Module end. See {@link org.objectweb.asm.ModuleVisitor#visitEnd}.
- */
- public void visitModuleEnd() {
- throw new RuntimeException("Must be overriden");
- }
-
- // ------------------------------------------------------------------------
- // Annotations
- // ------------------------------------------------------------------------
-
- /**
- * Annotation value.
- * See {@link org.objectweb.asm.AnnotationVisitor#visit}.
- *
- * @param name
- * the value name.
- * @param value
- * the actual value, whose type must be {@link Byte},
- * {@link Boolean}, {@link Character}, {@link Short},
- * {@link Integer} , {@link Long}, {@link Float}, {@link Double},
- * {@link String} or {@link org.objectweb.asm.Type}
- * or OBJECT or ARRAY sort.
- * This value can also be an array of byte, boolean, short, char, int,
- * long, float or double values (this is equivalent to using
- * {@link #visitArray visitArray} and visiting each array element
- * in turn, but is more convenient).
- */
- public abstract void visit(final String name, final Object value);
-
- /**
- * Annotation enum value.
- * See {@link org.objectweb.asm.AnnotationVisitor#visitEnum}.
- *
- * Visits an enumeration value of the annotation.
- *
- * @param name
- * the value name.
- * @param desc
- * the class descriptor of the enumeration class.
- * @param value
- * the actual enumeration value.
- */
- public abstract void visitEnum(final String name, final String desc,
- final String value);
-
- /**
- * Nested annotation value.
- * See {@link org.objectweb.asm.AnnotationVisitor#visitAnnotation}.
- *
- * @param name
- * the value name.
- * @param desc
- * the class descriptor of the nested annotation class.
- * @return the printer
- */
- public abstract Printer visitAnnotation(final String name, final String desc);
-
- /**
- * Annotation array value.
- * See {@link org.objectweb.asm.AnnotationVisitor#visitArray}.
- *
- * Visits an array value of the annotation. Note that arrays of primitive
- * types (such as byte, boolean, short, char, int, long, float or double)
- * can be passed as value to {@link #visit visit}. This is what
- * {@link org.objectweb.asm.ClassReader} does.
- *
- * @param name
- * the value name.
- * @return the printer
- */
- public abstract Printer visitArray(final String name);
-
- /**
- * Annotation end. See {@link org.objectweb.asm.AnnotationVisitor#visitEnd}.
- */
- public abstract void visitAnnotationEnd();
-
- // ------------------------------------------------------------------------
- // Fields
- // ------------------------------------------------------------------------
-
- /**
- * Field annotation.
- * See {@link org.objectweb.asm.FieldVisitor#visitAnnotation}.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public abstract Printer visitFieldAnnotation(final String desc,
- final boolean visible);
-
- /**
- * Field type annotation.
- * See {@link org.objectweb.asm.FieldVisitor#visitTypeAnnotation}.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link org.objectweb.asm.TypeReference#FIELD FIELD}.
- * See {@link org.objectweb.asm.TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public Printer visitFieldTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overriden");
- }
-
- /**
- * Field attribute.
- * See {@link org.objectweb.asm.FieldVisitor#visitAttribute}.
- *
- * @param attr
- * an attribute.
- */
- public abstract void visitFieldAttribute(final Attribute attr);
-
- /**
- * Field end.
- * See {@link org.objectweb.asm.FieldVisitor#visitEnd}.
- */
- public abstract void visitFieldEnd();
-
- // ------------------------------------------------------------------------
- // Methods
- // ------------------------------------------------------------------------
-
- /**
- * Method parameter.
- * See {@link org.objectweb.asm.MethodVisitor#visitParameter(String, int)}.
- *
- * @param name
- * parameter name or null if none is provided.
- * @param access
- * the parameter's access flags, only <tt>ACC_FINAL</tt>,
- * <tt>ACC_SYNTHETIC</tt> or/and <tt>ACC_MANDATED</tt> are
- * allowed (see {@link Opcodes}).
- */
- public void visitParameter(String name, int access) {
- throw new RuntimeException("Must be overriden");
- }
-
- /**
- * Method default annotation.
- * See {@link org.objectweb.asm.MethodVisitor#visitAnnotationDefault}.
- *
- * @return the printer
- */
- public abstract Printer visitAnnotationDefault();
-
- /**
- * Method annotation.
- * See {@link org.objectweb.asm.MethodVisitor#visitAnnotation}.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public abstract Printer visitMethodAnnotation(final String desc,
- final boolean visible);
-
- /**
- * Method type annotation.
- * See {@link org.objectweb.asm.MethodVisitor#visitTypeAnnotation}.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link org.objectweb.asm.TypeReference#FIELD FIELD}.
- * See {@link org.objectweb.asm.TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public Printer visitMethodTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overriden");
- }
-
- /**
- * Method parameter annotation.
- * See {@link org.objectweb.asm.MethodVisitor#visitParameterAnnotation}.
- *
- * @param parameter
- * the parameter index.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return the printer
- */
- public abstract Printer visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible);
-
- /**
- * Method attribute.
- * See {@link org.objectweb.asm.MethodVisitor#visitAttribute}.
- *
- * @param attr
- * an attribute.
- */
- public abstract void visitMethodAttribute(final Attribute attr);
-
- /**
- * Method start.
- * See {@link org.objectweb.asm.MethodVisitor#visitCode}.
- */
- public abstract void visitCode();
-
- /**
- * Method stack frame.
- * See {@link org.objectweb.asm.MethodVisitor#visitFrame}.
- *
- * Visits the current state of the local variables and operand stack
- * elements. This method must(*) be called <i>just before</i> any
- * instruction <b>i</b> that follows an unconditional branch instruction
- * such as GOTO or THROW, that is the target of a jump instruction, or that
- * starts an exception handler block. The visited types must describe the
- * values of the local variables and of the operand stack elements <i>just
- * before</i> <b>i</b> is executed.<br>
- * <br>
- * (*) this is mandatory only for classes whose version is greater than or
- * equal to {@link Opcodes#V1_6 V1_6}. <br>
- * <br>
- * The frames of a method must be given either in expanded form, or in
- * compressed form (all frames must use the same format, i.e. you must not
- * mix expanded and compressed frames within a single method):
- * <ul>
- * <li>In expanded form, all frames must have the F_NEW type.</li>
- * <li>In compressed form, frames are basically "deltas" from the state of
- * the previous frame:
- * <ul>
- * <li>{@link Opcodes#F_SAME} representing frame with exactly the same
- * locals as the previous frame and with the empty stack.</li>
- * <li>{@link Opcodes#F_SAME1} representing frame with exactly the same
- * locals as the previous frame and with single value on the stack (
- * <code>nStack</code> is 1 and <code>stack[0]</code> contains value for the
- * type of the stack item).</li>
- * <li>{@link Opcodes#F_APPEND} representing frame with current locals are
- * the same as the locals in the previous frame, except that additional
- * locals are defined (<code>nLocal</code> is 1, 2 or 3 and
- * <code>local</code> elements contains values representing added types).</li>
- * <li>{@link Opcodes#F_CHOP} representing frame with current locals are the
- * same as the locals in the previous frame, except that the last 1-3 locals
- * are absent and with the empty stack (<code>nLocals</code> is 1, 2 or 3).</li>
- * <li>{@link Opcodes#F_FULL} representing complete frame data.</li>
- * </ul>
- * </li>
- * </ul>
- * <br>
- * In both cases the first frame, corresponding to the method's parameters
- * and access flags, is implicit and must not be visited. Also, it is
- * illegal to visit two or more frames for the same code location (i.e., at
- * least one instruction must be visited between two calls to visitFrame).
- *
- * @param type
- * the type of this stack map frame. Must be
- * {@link Opcodes#F_NEW} for expanded frames, or
- * {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
- * {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
- * {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
- * compressed frames.
- * @param nLocal
- * the number of local variables in the visited frame.
- * @param local
- * the local variable types in this frame. This array must not be
- * modified. Primitive types are represented by
- * {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
- * {@link Opcodes#FLOAT}, {@link Opcodes#LONG},
- * {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or
- * {@link Opcodes#UNINITIALIZED_THIS} (long and double are
- * represented by a single element). Reference types are
- * represented by String objects (representing internal names),
- * and uninitialized types by Label objects (this label
- * designates the NEW instruction that created this uninitialized
- * value).
- * @param nStack
- * the number of operand stack elements in the visited frame.
- * @param stack
- * the operand stack types in this frame. This array must not be
- * modified. Its content has the same format as the "local"
- * array.
- * @throws IllegalStateException
- * if a frame is visited just after another one, without any
- * instruction between the two (unless this frame is a
- * Opcodes#F_SAME frame, in which case it is silently ignored).
- */
- public abstract void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack);
-
- /**
- * Method instruction.
- * See {@link org.objectweb.asm.MethodVisitor#visitInsn}
- *
- * @param opcode
- * the opcode of the instruction to be visited. This opcode is
- * either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
- * ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
- * FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
- * LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
- * IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
- * SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
- * DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
- * IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
- * FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
- * IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
- * L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
- * LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
- * DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
- * or MONITOREXIT.
- */
- public abstract void visitInsn(final int opcode);
-
- /**
- * Method instruction.
- * See {@link org.objectweb.asm.MethodVisitor#visitIntInsn}.
- *
- * @param opcode
- * the opcode of the instruction to be visited. This opcode is
- * either BIPUSH, SIPUSH or NEWARRAY.
- * @param operand
- * the operand of the instruction to be visited.<br>
- * When opcode is BIPUSH, operand value should be between
- * Byte.MIN_VALUE and Byte.MAX_VALUE.<br>
- * When opcode is SIPUSH, operand value should be between
- * Short.MIN_VALUE and Short.MAX_VALUE.<br>
- * When opcode is NEWARRAY, operand value should be one of
- * {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR},
- * {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
- * {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
- * {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
- */
- public abstract void visitIntInsn(final int opcode, final int operand);
-
- /**
- * Method instruction.
- * See {@link org.objectweb.asm.MethodVisitor#visitVarInsn}.
- *
- * @param opcode
- * the opcode of the local variable instruction to be visited.
- * This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD,
- * ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
- * @param var
- * the operand of the instruction to be visited. This operand is
- * the index of a local variable.
- */
- public abstract void visitVarInsn(final int opcode, final int var);
-
- /**
- * Method instruction.
- * See {@link org.objectweb.asm.MethodVisitor#visitTypeInsn}.
- *
- /**
- * Visits a type instruction. A type instruction is an instruction that
- * takes the internal name of a class as parameter.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
- * @param type
- * the operand of the instruction to be visited. This operand
- * must be the internal name of an object or array class (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- */
- public abstract void visitTypeInsn(final int opcode, final String type);
-
- /**
- * Method instruction.
- * See {@link org.objectweb.asm.MethodVisitor#visitFieldInsn}.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
- * @param owner
- * the internal name of the field's owner class (see
- * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link org.objectweb.asm.Type Type}).
- */
- public abstract void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc);
-
- /**
- * Method instruction.
- * See {@link org.objectweb.asm.MethodVisitor#visitMethodInsn}.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
- * INVOKEINTERFACE.
- * @param owner
- * the internal name of the method's owner class (see
- * {@link org.objectweb.asm.Type#getInternalName() getInt
<TRUNCATED>