final class MethodWriter extends MethodVisitor
MethodVisitor
that generates a corresponding 'method_info' structure, as defined in the
Java Virtual Machine Specification (JVMS).Modifier and Type | Field and Description |
---|---|
private int |
accessFlags
The access_flags field of the method_info JVMS structure.
|
private ByteVector |
code
The 'code' field of the Code attribute.
|
private int |
compute
Indicates what must be computed.
|
(package private) static int |
COMPUTE_ALL_FRAMES
Indicates that all the stack map frames must be computed.
|
(package private) static int |
COMPUTE_INSERTED_FRAMES
Indicates that the stack map frames of type F_INSERT must be computed.
|
(package private) static int |
COMPUTE_MAX_STACK_AND_LOCAL
Indicates that the maximum stack size and the maximum number of local variables must be
computed, from scratch.
|
(package private) static int |
COMPUTE_MAX_STACK_AND_LOCAL_FROM_FRAMES
Indicates that the maximum stack size and the maximum number of local variables must be
computed, from the existing stack map frames.
|
(package private) static int |
COMPUTE_NOTHING
Indicates that nothing must be computed.
|
private Label |
currentBasicBlock
The current basic block, i.e.
|
private int[] |
currentFrame
The current stack map frame.
|
private int |
currentLocals
The number of local variables in the last visited stack map frame.
|
private ByteVector |
defaultValue
The default_value field of the AnnotationDefault attribute, or null.
|
private java.lang.String |
descriptor
The descriptor of this method.
|
private int |
descriptorIndex
The descriptor_index field of the method_info JVMS structure.
|
private int[] |
exceptionIndexTable
The exception_index_table array of the Exceptions attribute, or null.
|
private Attribute |
firstAttribute
The first non standard attribute of this method.
|
private Label |
firstBasicBlock
The first basic block of the method.
|
private Attribute |
firstCodeAttribute
The first non standard attribute of the Code attribute.
|
private Handler |
firstHandler
The first element in the exception handler list (used to generate the exception_table of the
Code attribute).
|
private boolean |
hasAsmInstructions
Whether the bytecode of this method contains ASM specific instructions.
|
private boolean |
hasSubroutines
Whether this method contains subroutines.
|
private int |
invisibleAnnotableParameterCount
The number of method parameters that can have runtime visible annotations, or 0.
|
private Label |
lastBasicBlock
The last basic block of the method (in bytecode offset order).
|
private int |
lastBytecodeOffset
The start offset of the last visited instruction.
|
private AnnotationWriter |
lastCodeRuntimeInvisibleTypeAnnotation
The last runtime invisible type annotation of the Code attribute.
|
private AnnotationWriter |
lastCodeRuntimeVisibleTypeAnnotation
The last runtime visible type annotation of the Code attribute.
|
private Handler |
lastHandler
The last element in the exception handler list (used to generate the exception_table of the
Code attribute).
|
private AnnotationWriter |
lastRuntimeInvisibleAnnotation
The last runtime invisible annotation of this method.
|
private AnnotationWriter[] |
lastRuntimeInvisibleParameterAnnotations
The runtime invisible parameter annotations of this method.
|
private AnnotationWriter |
lastRuntimeInvisibleTypeAnnotation
The last runtime invisible type annotation of this method.
|
private AnnotationWriter |
lastRuntimeVisibleAnnotation
The last runtime visible annotation of this method.
|
private AnnotationWriter[] |
lastRuntimeVisibleParameterAnnotations
The runtime visible parameter annotations of this method.
|
private AnnotationWriter |
lastRuntimeVisibleTypeAnnotation
The last runtime visible type annotation of this method.
|
private ByteVector |
lineNumberTable
The line_number_table array of the LineNumberTable code attribute, or null.
|
private int |
lineNumberTableLength
The line_number_table_length field of the LineNumberTable code attribute.
|
private ByteVector |
localVariableTable
The local_variable_table array of the LocalVariableTable code attribute, or null.
|
private int |
localVariableTableLength
The local_variable_table_length field of the LocalVariableTable code attribute.
|
private ByteVector |
localVariableTypeTable
The local_variable_type_table array of the LocalVariableTypeTable code attribute, or null.
|
private int |
localVariableTypeTableLength
The local_variable_type_table_length field of the LocalVariableTypeTable code attribute.
|
private int |
maxLocals
The max_locals field of the Code attribute.
|
private int |
maxRelativeStackSize
The maximum relative stack size after the last visited instruction.
|
private int |
maxStack
The max_stack field of the Code attribute.
|
private static int |
NA
Indicates that
STACK_SIZE_DELTA is not applicable (not constant or never used). |
private java.lang.String |
name
The name of this method.
|
private int |
nameIndex
The name_index field of the method_info JVMS structure.
|
private int |
numberOfExceptions
The number_of_exceptions field of the Exceptions attribute.
|
private ByteVector |
parameters
The 'parameters' array of the MethodParameters attribute, or null.
|
private int |
parametersCount
The parameters_count field of the MethodParameters attribute.
|
private int[] |
previousFrame
The last frame that was written in
stackMapTableEntries . |
private int |
previousFrameOffset
The bytecode offset of the last frame that was written in
stackMapTableEntries . |
private int |
relativeStackSize
The relative stack size after the last visited instruction.
|
private int |
signatureIndex
The signature_index field of the Signature attribute.
|
private int |
sourceLength
The length in bytes in
SymbolTable.getSource() which must be copied to get the
method_info for this method (excluding its first 6 bytes for access_flags, name_index and
descriptor_index). |
private int |
sourceOffset
The offset in bytes in
SymbolTable.getSource() from which the method_info for this method
(excluding its first 6 bytes) must be copied, or 0. |
private static int[] |
STACK_SIZE_DELTA
The stack size variation corresponding to each JVM opcode.
|
private ByteVector |
stackMapTableEntries
The 'entries' array of the StackMapTable code attribute.
|
private int |
stackMapTableNumberOfEntries
The number_of_entries field of the StackMapTable code attribute.
|
private SymbolTable |
symbolTable
Where the constants used in this MethodWriter must be stored.
|
private int |
visibleAnnotableParameterCount
The number of method parameters that can have runtime visible annotations, or 0.
|
api, mv
Constructor and Description |
---|
MethodWriter(SymbolTable symbolTable,
int access,
java.lang.String name,
java.lang.String descriptor,
java.lang.String signature,
java.lang.String[] exceptions,
int compute)
Constructs a new
MethodWriter . |
Modifier and Type | Method and Description |
---|---|
private void |
addSuccessorToCurrentBasicBlock(int info,
Label successor)
Adds a successor to
currentBasicBlock in the control flow graph. |
(package private) boolean |
canCopyMethodAttributes(ClassReader source,
boolean hasSyntheticAttribute,
boolean hasDeprecatedAttribute,
int descriptorIndex,
int signatureIndex,
int exceptionsOffset)
Returns whether the attributes of this method can be copied from the attributes of the given
method (assuming there is no method visitor between the given ClassReader and this
MethodWriter).
|
(package private) void |
collectAttributePrototypes(Attribute.Set attributePrototypes)
Collects the attributes of this method into the given set of attribute prototypes.
|
private void |
computeAllFrames()
Computes all the stack map frames of the method, from scratch.
|
private void |
computeMaxStackAndLocal()
Computes the maximum stack size of the method.
|
(package private) int |
computeMethodInfoSize()
Returns the size of the method_info JVMS structure generated by this MethodWriter.
|
private void |
endCurrentBasicBlockWithNoSuccessor()
Ends the current basic block.
|
(package private) boolean |
hasAsmInstructions() |
(package private) boolean |
hasFrames() |
private void |
putAbstractTypes(int start,
int end)
Puts some abstract types of
currentFrame in stackMapTableEntries , using the
JVMS verification_type_info format used in StackMapTable attributes. |
private void |
putFrame()
Compresses and writes
currentFrame in a new StackMapTable entry. |
private void |
putFrameType(java.lang.Object type)
Puts the given public API frame element type in
stackMapTableEntries , using the JVMS
verification_type_info format used in StackMapTable attributes. |
(package private) void |
putMethodInfo(ByteVector output)
Puts the content of the method_info JVMS structure generated by this MethodWriter into the
given ByteVector.
|
(package private) void |
setMethodAttributesSource(int methodInfoOffset,
int methodInfoLength)
Sets the source from which the attributes of this method will be copied.
|
(package private) void |
visitAbstractType(int frameIndex,
int abstractType)
Sets an abstract type in
currentFrame . |
void |
visitAnnotableParameterCount(int parameterCount,
boolean visible)
Visits the number of method parameters that can have annotations.
|
AnnotationVisitor |
visitAnnotation(java.lang.String descriptor,
boolean visible)
Visits an annotation of this method.
|
AnnotationVisitor |
visitAnnotationDefault()
Visits the default value of this annotation interface method.
|
void |
visitAttribute(Attribute attribute)
Visits a non standard attribute of this method.
|
void |
visitCode()
Starts the visit of the method's code, if any (i.e.
|
void |
visitEnd()
Visits the end of the method.
|
void |
visitFieldInsn(int opcode,
java.lang.String owner,
java.lang.String name,
java.lang.String descriptor)
Visits a field instruction.
|
void |
visitFrame(int type,
int numLocal,
java.lang.Object[] local,
int numStack,
java.lang.Object[] stack)
Visits the current state of the local variables and operand stack elements.
|
(package private) void |
visitFrameEnd()
Ends the visit of
currentFrame by writing it in the StackMapTable entries and by
updating the StackMapTable number_of_entries (except if the current frame is the first one,
which is implicit in StackMapTable). |
(package private) int |
visitFrameStart(int offset,
int numLocal,
int numStack)
Starts the visit of a new stack map frame, stored in
currentFrame . |
void |
visitIincInsn(int var,
int increment)
Visits an IINC instruction.
|
void |
visitInsn(int opcode)
Visits a zero operand instruction.
|
AnnotationVisitor |
visitInsnAnnotation(int typeRef,
TypePath typePath,
java.lang.String descriptor,
boolean visible)
Visits an annotation on an instruction.
|
void |
visitIntInsn(int opcode,
int operand)
Visits an instruction with a single int operand.
|
void |
visitInvokeDynamicInsn(java.lang.String name,
java.lang.String descriptor,
Handle bootstrapMethodHandle,
java.lang.Object... bootstrapMethodArguments)
Visits an invokedynamic instruction.
|
void |
visitJumpInsn(int opcode,
Label label)
Visits a jump instruction.
|
void |
visitLabel(Label label)
Visits a label.
|
void |
visitLdcInsn(java.lang.Object value)
Visits a LDC instruction.
|
void |
visitLineNumber(int line,
Label start)
Visits a line number declaration.
|
void |
visitLocalVariable(java.lang.String name,
java.lang.String descriptor,
java.lang.String signature,
Label start,
Label end,
int index)
Visits a local variable declaration.
|
AnnotationVisitor |
visitLocalVariableAnnotation(int typeRef,
TypePath typePath,
Label[] start,
Label[] end,
int[] index,
java.lang.String descriptor,
boolean visible)
Visits an annotation on a local variable type.
|
void |
visitLookupSwitchInsn(Label dflt,
int[] keys,
Label[] labels)
Visits a LOOKUPSWITCH instruction.
|
void |
visitMaxs(int maxStack,
int maxLocals)
Visits the maximum stack size and the maximum number of local variables of the method.
|
void |
visitMethodInsn(int opcode,
java.lang.String owner,
java.lang.String name,
java.lang.String descriptor,
boolean isInterface)
Visits a method instruction.
|
void |
visitMultiANewArrayInsn(java.lang.String descriptor,
int numDimensions)
Visits a MULTIANEWARRAY instruction.
|
void |
visitParameter(java.lang.String name,
int access)
Visits a parameter of this method.
|
AnnotationVisitor |
visitParameterAnnotation(int parameter,
java.lang.String annotationDescriptor,
boolean visible)
Visits an annotation of a parameter this method.
|
private void |
visitSwitchInsn(Label dflt,
Label[] labels) |
void |
visitTableSwitchInsn(int min,
int max,
Label dflt,
Label... labels)
Visits a TABLESWITCH instruction.
|
AnnotationVisitor |
visitTryCatchAnnotation(int typeRef,
TypePath typePath,
java.lang.String descriptor,
boolean visible)
Visits an annotation on an exception handler type.
|
void |
visitTryCatchBlock(Label start,
Label end,
Label handler,
java.lang.String type)
Visits a try catch block.
|
AnnotationVisitor |
visitTypeAnnotation(int typeRef,
TypePath typePath,
java.lang.String descriptor,
boolean visible)
Visits an annotation on a type in the method signature.
|
void |
visitTypeInsn(int opcode,
java.lang.String type)
Visits a type instruction.
|
void |
visitVarInsn(int opcode,
int var)
Visits a local variable instruction.
|
visitMethodInsn
static final int COMPUTE_NOTHING
static final int COMPUTE_MAX_STACK_AND_LOCAL
static final int COMPUTE_MAX_STACK_AND_LOCAL_FROM_FRAMES
COMPUTE_MAX_STACK_AND_LOCAL
, by using a linear
scan of the bytecode instructions.static final int COMPUTE_INSERTED_FRAMES
static final int COMPUTE_ALL_FRAMES
private static final int NA
STACK_SIZE_DELTA
is not applicable (not constant or never used).private static final int[] STACK_SIZE_DELTA
private final SymbolTable symbolTable
private final int accessFlags
Opcodes.ACC_DEPRECATED
, which are removed when generating the
ClassFile structure.private final int nameIndex
private final java.lang.String name
private final int descriptorIndex
private final java.lang.String descriptor
private int maxStack
private int maxLocals
private final ByteVector code
private Handler firstHandler
Handler.nextHandler
field. May
be null.private Handler lastHandler
Handler.nextHandler
field. May
be null.private int lineNumberTableLength
private ByteVector lineNumberTable
private int localVariableTableLength
private ByteVector localVariableTable
private int localVariableTypeTableLength
private ByteVector localVariableTypeTable
private int stackMapTableNumberOfEntries
private ByteVector stackMapTableEntries
private AnnotationWriter lastCodeRuntimeVisibleTypeAnnotation
AnnotationWriter.previousAnnotation
field. May be null.private AnnotationWriter lastCodeRuntimeInvisibleTypeAnnotation
AnnotationWriter.previousAnnotation
field. May be null.private Attribute firstCodeAttribute
Attribute.nextAttribute
field. May be null.
WARNING: this list stores the attributes in the reverse order of their visit.
firstAttribute is actually the last attribute visited in visitAttribute(org.springframework.asm.Attribute)
. The putMethodInfo(org.springframework.asm.ByteVector)
method writes the attributes in the order defined by this list, i.e. in the
reverse order specified by the user.
private final int numberOfExceptions
private final int[] exceptionIndexTable
private final int signatureIndex
private AnnotationWriter lastRuntimeVisibleAnnotation
AnnotationWriter.previousAnnotation
field. May be null.private AnnotationWriter lastRuntimeInvisibleAnnotation
AnnotationWriter.previousAnnotation
field. May be null.private int visibleAnnotableParameterCount
private AnnotationWriter[] lastRuntimeVisibleParameterAnnotations
AnnotationWriter.previousAnnotation
field). May be null.private int invisibleAnnotableParameterCount
private AnnotationWriter[] lastRuntimeInvisibleParameterAnnotations
AnnotationWriter.previousAnnotation
field). May be null.private AnnotationWriter lastRuntimeVisibleTypeAnnotation
AnnotationWriter.previousAnnotation
field. May be null.private AnnotationWriter lastRuntimeInvisibleTypeAnnotation
AnnotationWriter.previousAnnotation
field. May be null.private ByteVector defaultValue
private int parametersCount
private ByteVector parameters
private Attribute firstAttribute
Attribute.nextAttribute
field. May be null.
WARNING: this list stores the attributes in the reverse order of their visit.
firstAttribute is actually the last attribute visited in visitAttribute(org.springframework.asm.Attribute)
. The putMethodInfo(org.springframework.asm.ByteVector)
method writes the attributes in the order defined by this list, i.e. in the
reverse order specified by the user.
private final int compute
COMPUTE_ALL_FRAMES
, COMPUTE_INSERTED_FRAMES
, COMPUTE_MAX_STACK_AND_LOCAL
or COMPUTE_NOTHING
.private Label firstBasicBlock
Label.nextBasicBlock
field.private Label lastBasicBlock
private Label currentBasicBlock
compute
is equal to COMPUTE_MAX_STACK_AND_LOCAL
or COMPUTE_ALL_FRAMES
, this
field is null for unreachable code. When compute
is equal to COMPUTE_MAX_STACK_AND_LOCAL_FROM_FRAMES
or COMPUTE_INSERTED_FRAMES
, this field stays
unchanged throughout the whole method (i.e. the whole code is seen as a single basic block;
indeed, the existing frames are sufficient by hypothesis to compute any intermediate frame -
and the maximum stack size as well - without using any control flow graph).private int relativeStackSize
currentBasicBlock
, i.e. the true stack size after the last visited
instruction is equal to the Label.inputStackSize
of the current basic block plus relativeStackSize
. When compute
is equal to COMPUTE_MAX_STACK_AND_LOCAL_FROM_FRAMES
, currentBasicBlock
is always the start of
the method, so this relative size is also equal to the absolute stack size after the last
visited instruction.private int maxRelativeStackSize
currentBasicBlock
, i.e. the true maximum stack size after the last
visited instruction is equal to the Label.inputStackSize
of the current basic block
plus maxRelativeStackSize
.When compute
is equal to COMPUTE_MAX_STACK_AND_LOCAL_FROM_FRAMES
, currentBasicBlock
is always the start of
the method, so this relative size is also equal to the absolute maximum stack size after the
last visited instruction.private int currentLocals
private int previousFrameOffset
stackMapTableEntries
.private int[] previousFrame
stackMapTableEntries
. This field has the same
format as currentFrame
.private int[] currentFrame
Frame
,
but restricted to Frame.CONSTANT_KIND
, Frame.REFERENCE_KIND
or Frame.UNINITIALIZED_KIND
abstract types. Long and double types use only one array entry.private boolean hasSubroutines
private boolean hasAsmInstructions
private int lastBytecodeOffset
private int sourceOffset
SymbolTable.getSource()
from which the method_info for this method
(excluding its first 6 bytes) must be copied, or 0.private int sourceLength
SymbolTable.getSource()
which must be copied to get the
method_info for this method (excluding its first 6 bytes for access_flags, name_index and
descriptor_index).MethodWriter(SymbolTable symbolTable, int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.String[] exceptions, int compute)
MethodWriter
.symbolTable
- where the constants used in this AnnotationWriter must be stored.access
- the method's access flags (see Opcodes
).name
- the method's name.descriptor
- the method's descriptor (see Type
).signature
- the method's signature. May be null.exceptions
- the internal names of the method's exceptions. May be null.compute
- indicates what must be computed (see #compute).boolean hasFrames()
boolean hasAsmInstructions()
public void visitParameter(java.lang.String name, int access)
MethodVisitor
visitParameter
in class MethodVisitor
name
- parameter name or null if none is provided.access
- the parameter's access flags, only ACC_FINAL
, ACC_SYNTHETIC
or/and ACC_MANDATED
are allowed (see Opcodes
).public AnnotationVisitor visitAnnotationDefault()
MethodVisitor
visitAnnotationDefault
in class MethodVisitor
public AnnotationVisitor visitAnnotation(java.lang.String descriptor, boolean visible)
MethodVisitor
visitAnnotation
in class MethodVisitor
descriptor
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, java.lang.String descriptor, boolean visible)
MethodVisitor
visitTypeAnnotation
in class MethodVisitor
typeRef
- a reference to the annotated type. The sort of this type reference must be
TypeReference.METHOD_TYPE_PARAMETER
, TypeReference.METHOD_TYPE_PARAMETER_BOUND
, TypeReference.METHOD_RETURN
, TypeReference.METHOD_RECEIVER
, TypeReference.METHOD_FORMAL_PARAMETER
or TypeReference.THROWS
. See TypeReference
.typePath
- the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole.descriptor
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.public void visitAnnotableParameterCount(int parameterCount, boolean visible)
MethodVisitor
visitAnnotableParameterCount
in class MethodVisitor
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).visible
- true to define the number of method parameters that can have
annotations visible at runtime, false to define the number of method parameters
that can have annotations invisible at runtime.public AnnotationVisitor visitParameterAnnotation(int parameter, java.lang.String annotationDescriptor, boolean visible)
MethodVisitor
visitParameterAnnotation
in class MethodVisitor
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 MethodVisitor.visitAnnotableParameterCount(int, boolean)
. Important note: a parameter index i
is not required to correspond to the i'th parameter descriptor in the method
descriptor, in particular in case of synthetic parameters (see
https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18).annotationDescriptor
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.public void visitAttribute(Attribute attribute)
MethodVisitor
visitAttribute
in class MethodVisitor
attribute
- an attribute.public void visitCode()
MethodVisitor
visitCode
in class MethodVisitor
public void visitFrame(int type, int numLocal, java.lang.Object[] local, int numStack, java.lang.Object[] stack)
MethodVisitor
Opcodes.V1_6
. Opcodes.F_SAME
representing frame with exactly the same locals as the
previous frame and with the empty stack.
Opcodes.F_SAME1
representing frame with exactly the same locals as the
previous frame and with single value on the stack ( numStack
is 1 and
stack[0]
contains value for the type of the stack item).
Opcodes.F_APPEND
representing frame with current locals are the same as the
locals in the previous frame, except that additional locals are defined (
numLocal
is 1, 2 or 3 and local
elements contains values
representing added types).
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 (numLocal
is 1, 2 or 3).
Opcodes.F_FULL
representing complete frame data.
visitFrame
in class MethodVisitor
type
- the type of this stack map frame. Must be Opcodes.F_NEW
for expanded
frames, or Opcodes.F_FULL
, Opcodes.F_APPEND
, Opcodes.F_CHOP
, Opcodes.F_SAME
or Opcodes.F_APPEND
, Opcodes.F_SAME1
for compressed frames.numLocal
- the number of local variables in the visited frame.local
- the local variable types in this frame. This array must not be modified. Primitive
types are represented by Opcodes.TOP
, Opcodes.INTEGER
, Opcodes.FLOAT
, Opcodes.LONG
, Opcodes.DOUBLE
, Opcodes.NULL
or
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).numStack
- the number of operand stack elements in the visited frame.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 void visitInsn(int opcode)
MethodVisitor
visitInsn
in class MethodVisitor
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 void visitIntInsn(int opcode, int operand)
MethodVisitor
visitIntInsn
in class MethodVisitor
opcode
- the opcode of the instruction to be visited. This opcode is either BIPUSH, SIPUSH
or NEWARRAY.operand
- the operand of the instruction to be visited.Opcodes.T_BOOLEAN
, Opcodes.T_CHAR
, Opcodes.T_FLOAT
, Opcodes.T_DOUBLE
, Opcodes.T_BYTE
,
Opcodes.T_SHORT
, Opcodes.T_INT
or Opcodes.T_LONG
.public void visitVarInsn(int opcode, int var)
MethodVisitor
visitVarInsn
in class MethodVisitor
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.var
- the operand of the instruction to be visited. This operand is the index of a local
variable.public void visitTypeInsn(int opcode, java.lang.String type)
MethodVisitor
visitTypeInsn
in class MethodVisitor
opcode
- the opcode of the type instruction to be visited. This opcode is either NEW,
ANEWARRAY, CHECKCAST or INSTANCEOF.type
- the operand of the instruction to be visited. This operand must be the internal
name of an object or array class (see Type.getInternalName()
).public void visitFieldInsn(int opcode, java.lang.String owner, java.lang.String name, java.lang.String descriptor)
MethodVisitor
visitFieldInsn
in class MethodVisitor
opcode
- the opcode of the type instruction to be visited. This opcode is either
GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.owner
- the internal name of the field's owner class (see Type.getInternalName()
).name
- the field's name.descriptor
- the field's descriptor (see Type
).public void visitMethodInsn(int opcode, java.lang.String owner, java.lang.String name, java.lang.String descriptor, boolean isInterface)
MethodVisitor
visitMethodInsn
in class MethodVisitor
opcode
- the opcode of the type instruction to be visited. This opcode is either
INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.owner
- the internal name of the method's owner class (see Type.getInternalName()
).name
- the method's name.descriptor
- the method's descriptor (see Type
).isInterface
- if the method's owner class is an interface.public void visitInvokeDynamicInsn(java.lang.String name, java.lang.String descriptor, Handle bootstrapMethodHandle, java.lang.Object... bootstrapMethodArguments)
MethodVisitor
visitInvokeDynamicInsn
in class MethodVisitor
name
- the method's name.descriptor
- the method's descriptor (see Type
).bootstrapMethodHandle
- the bootstrap method.bootstrapMethodArguments
- the bootstrap method constant arguments. Each argument must be
an Integer
, Float
, Long
, Double
, String
, Type
, Handle
or ConstantDynamic
value. This method is allowed to modify
the content of the array so a caller should expect that this array may change.public void visitJumpInsn(int opcode, Label label)
MethodVisitor
visitJumpInsn
in class MethodVisitor
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.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 void visitLabel(Label label)
MethodVisitor
visitLabel
in class MethodVisitor
label
- a Label
object.public void visitLdcInsn(java.lang.Object value)
MethodVisitor
if (cst instanceof Integer) { // ... } else if (cst instanceof Float) { // ... } else if (cst instanceof Long) { // ... } else if (cst instanceof Double) { // ... } else if (cst instanceof String) { // ... } else if (cst instanceof Type) { int sort = ((Type) cst).getSort(); if (sort == Type.OBJECT) { // ... } else if (sort == Type.ARRAY) { // ... } else if (sort == Type.METHOD) { // ... } else { // throw an exception } } else if (cst instanceof Handle) { // ... } else if (cst instanceof ConstantDynamic) { // ... } else { // throw an exception }
visitLdcInsn
in class MethodVisitor
value
- the constant to be loaded on the stack. This parameter must be a non null Integer
, a Float
, a Long
, a Double
, a String
, a Type
of OBJECT or ARRAY sort for .class
constants, for classes whose version is
49, a Type
of METHOD sort for MethodType, a Handle
for MethodHandle
constants, for classes whose version is 51 or a ConstantDynamic
for a constant
dynamic for classes whose version is 55.public void visitIincInsn(int var, int increment)
MethodVisitor
visitIincInsn
in class MethodVisitor
var
- index of the local variable to be incremented.increment
- amount to increment the local variable by.public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels)
MethodVisitor
visitTableSwitchInsn
in class MethodVisitor
min
- the minimum key value.max
- the maximum key value.dflt
- beginning of the default handler block.labels
- beginnings of the handler blocks. labels[i]
is the beginning of the
handler block for the min + i
key.public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)
MethodVisitor
visitLookupSwitchInsn
in class MethodVisitor
dflt
- beginning of the default handler block.keys
- the values of the keys.labels
- beginnings of the handler blocks. labels[i]
is the beginning of the
handler block for the keys[i]
key.public void visitMultiANewArrayInsn(java.lang.String descriptor, int numDimensions)
MethodVisitor
visitMultiANewArrayInsn
in class MethodVisitor
descriptor
- an array type descriptor (see Type
).numDimensions
- the number of dimensions of the array to allocate.public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, java.lang.String descriptor, boolean visible)
MethodVisitor
visitInsnAnnotation
in class MethodVisitor
typeRef
- a reference to the annotated type. The sort of this type reference must be
TypeReference.INSTANCEOF
, TypeReference.NEW
, TypeReference.CONSTRUCTOR_REFERENCE
, TypeReference.METHOD_REFERENCE
, TypeReference.CAST
, TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
, TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT
, TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
, or TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT
. See TypeReference
.typePath
- the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole.descriptor
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.public void visitTryCatchBlock(Label start, Label end, Label handler, java.lang.String type)
MethodVisitor
visitTryCatchBlock
in class MethodVisitor
start
- the beginning of the exception handler's scope (inclusive).end
- the end of the exception handler's scope (exclusive).handler
- the beginning of the exception handler's code.type
- the internal name of the type of exceptions handled by the handler, or null to catch any exceptions (for "finally" blocks).public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, java.lang.String descriptor, boolean visible)
MethodVisitor
MethodVisitor.visitTryCatchBlock(org.springframework.asm.Label, org.springframework.asm.Label, org.springframework.asm.Label, java.lang.String)
for the annotated exception handler. It can be called several times
for the same exception handler.visitTryCatchAnnotation
in class MethodVisitor
typeRef
- a reference to the annotated type. The sort of this type reference must be
TypeReference.EXCEPTION_PARAMETER
. See TypeReference
.typePath
- the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole.descriptor
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.public void visitLocalVariable(java.lang.String name, java.lang.String descriptor, java.lang.String signature, Label start, Label end, int index)
MethodVisitor
visitLocalVariable
in class MethodVisitor
name
- the name of a local variable.descriptor
- the type descriptor of this local variable.signature
- the type signature of this local variable. May be null if the local
variable type does not use generic types.start
- the first instruction corresponding to the scope of this local variable
(inclusive).end
- the last instruction corresponding to the scope of this local variable (exclusive).index
- the local variable's index.public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, java.lang.String descriptor, boolean visible)
MethodVisitor
visitLocalVariableAnnotation
in class MethodVisitor
typeRef
- a reference to the annotated type. The sort of this type reference must be
TypeReference.LOCAL_VARIABLE
or TypeReference.RESOURCE_VARIABLE
. See TypeReference
.typePath
- the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole.start
- the fist instructions corresponding to the continuous ranges that make the scope
of this local variable (inclusive).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.index
- the local variable's index in each range. This array must have the same size as
the 'start' array.descriptor
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.public void visitLineNumber(int line, Label start)
MethodVisitor
visitLineNumber
in class MethodVisitor
line
- a line number. This number refers to the source file from which the class was
compiled.start
- the first instruction corresponding to this line number.public void visitMaxs(int maxStack, int maxLocals)
MethodVisitor
visitMaxs
in class MethodVisitor
maxStack
- maximum stack size of the method.maxLocals
- maximum number of local variables for the method.private void computeAllFrames()
private void computeMaxStackAndLocal()
public void visitEnd()
MethodVisitor
visitEnd
in class MethodVisitor
private void addSuccessorToCurrentBasicBlock(int info, Label successor)
currentBasicBlock
in the control flow graph.info
- information about the control flow edge to be added.successor
- the successor block to be added to the current basic block.private void endCurrentBasicBlockWithNoSuccessor()
WARNING: this method must be called after the currently visited instruction has been put in
code
(if frames are computed, this method inserts a new Label to start a new basic
block after the current instruction).
int visitFrameStart(int offset, int numLocal, int numStack)
currentFrame
.offset
- the bytecode offset of the instruction to which the frame corresponds.numLocal
- the number of local variables in the frame.numStack
- the number of stack elements in the frame.void visitAbstractType(int frameIndex, int abstractType)
currentFrame
.frameIndex
- the index of the element to be set in currentFrame
.abstractType
- an abstract type.void visitFrameEnd()
currentFrame
by writing it in the StackMapTable entries and by
updating the StackMapTable number_of_entries (except if the current frame is the first one,
which is implicit in StackMapTable). Then resets currentFrame
to null.private void putFrame()
currentFrame
in a new StackMapTable entry.private void putAbstractTypes(int start, int end)
currentFrame
in stackMapTableEntries
, using the
JVMS verification_type_info format used in StackMapTable attributes.start
- index of the first type in currentFrame
to write.end
- index of last type in currentFrame
to write (exclusive).private void putFrameType(java.lang.Object type)
stackMapTableEntries
, using the JVMS
verification_type_info format used in StackMapTable attributes.type
- a frame element type described using the same format as in MethodVisitor.visitFrame(int, int, java.lang.Object[], int, java.lang.Object[])
, i.e. either Opcodes.TOP
, Opcodes.INTEGER
, Opcodes.FLOAT
, Opcodes.LONG
, Opcodes.DOUBLE
, Opcodes.NULL
, or
Opcodes.UNINITIALIZED_THIS
, or the internal name of a class, or a Label designating
a NEW instruction (for uninitialized types).boolean canCopyMethodAttributes(ClassReader source, boolean hasSyntheticAttribute, boolean hasDeprecatedAttribute, int descriptorIndex, int signatureIndex, int exceptionsOffset)
source
- the source ClassReader from which the attributes of this method might be copied.hasSyntheticAttribute
- whether the method_info JVMS structure from which the attributes
of this method might be copied contains a Synthetic attribute.hasDeprecatedAttribute
- whether the method_info JVMS structure from which the attributes
of this method might be copied contains a Deprecated attribute.descriptorIndex
- the descriptor_index field of the method_info JVMS structure from which
the attributes of this method might be copied.signatureIndex
- the constant pool index contained in the Signature attribute of the
method_info JVMS structure from which the attributes of this method might be copied, or 0.exceptionsOffset
- the offset in 'source.b' of the Exceptions attribute of the method_info
JVMS structure from which the attributes of this method might be copied, or 0.void setMethodAttributesSource(int methodInfoOffset, int methodInfoLength)
methodInfoOffset
- the offset in 'symbolTable.getSource()' of the method_info JVMS
structure from which the attributes of this method will be copied.methodInfoLength
- the length in 'symbolTable.getSource()' of the method_info JVMS
structure from which the attributes of this method will be copied.int computeMethodInfoSize()
void putMethodInfo(ByteVector output)
output
- where the method_info structure must be put.final void collectAttributePrototypes(Attribute.Set attributePrototypes)
attributePrototypes
- a set of attribute prototypes.