Top Description Inners Fields Constructors Methods
org.objectweb.asm.util

public Class CheckMethodAdapter

extends MethodVisitor
Class Inheritance
Imports
java.io.PrintWriter, .StringWriter, java.util.ArrayList, .HashMap, .HashSet, .List, .Map, .Set, org.objectweb.asm.AnnotationVisitor, .Attribute, .ClassWriter, .ConstantDynamic, .Handle, .Label, .MethodVisitor, .Opcodes, .Type, .TypePath, .TypeReference, org.objectweb.asm.tree.MethodNode, org.objectweb.asm.tree.analysis.Analyzer, .AnalyzerException, .BasicValue, .BasicVerifier

A MethodVisitor that checks that its methods are properly used. More precisely this method adapter checks each instruction individually, i.e., each visit method checks some preconditions based only on its arguments - such as the fact that the given opcode is correct for a given visit method. This adapter can also perform some basic data flow checks (more precisely those that can be performed without the full class hierarchy - see org.objectweb.asm.tree.analysis.BasicVerifier). For instance in a method whose signature is void m (), the invalid instruction IRETURN, or the invalid sequence IADD L2I will be detected if the data flow checks are enabled. These checks are enabled by using the CheckMethodAdapter(int, String, String, MethodVisitor, Map) constructor. They are not performed if any other constructor is used.
Author
Eric Bruneton

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static enum
CheckMethodAdapter.Method

The 'generic' instruction visit methods (i.e. those that take an opcode argument).

pack-priv static class

Field Summary

Modifier and TypeField and Description
private int
access

The access flags of the visited method.

private static final String
private List<Label>
handlers

The exception handler ranges.

private int
insnCount

The number of visited instructions so far.

private static final String
private static final String
private static final String
private static final String
private int
invisibleAnnotableParameterCount

The number of method parameters that can have runtime invisible annotations.

private final Map<Label, Integer>
labelInsnIndices

The index of the instruction designated by each visited label.

private int
lastFrameInsnIndex

The index of the instruction corresponding to the last visited stack map frame.

private static final String
private int
numCompressedFrames

The number of visited frames in compressed form.

private int
numExpandedFrames

The number of visited frames in expanded form.

private static final CheckMethodAdapter.Method[]
OPCODE_METHODS

The method to use to visit each instruction.

private Set<Label>
referencedLabels

The labels referenced by the visited method.

private static final String
public int
version

The class version number.

private int
visibleAnnotableParameterCount

The number of method parameters that can have runtime visible annotations.

private boolean
visitCodeCalled

Whether the visitCode method has been called.

private boolean
visitEndCalled

Whether the visitEnd method has been called.

private boolean
visitMaxCalled

Whether the visitMaxs method has been called.

Inherited from org.objectweb.asm.MethodVisitor:
apimv

Constructor Summary

AccessConstructor and Description
public
CheckMethodAdapter(final MethodVisitor
the method visitor to which this adapter must delegate calls.
methodvisitor
)

Constructs a new CheckMethodAdapter object.

public
CheckMethodAdapter(final MethodVisitor
the method visitor to which this adapter must delegate calls.
methodVisitor
,
final Map<Label, Integer>
the index of the instruction designated by each visited label so far (in other methods). This map is updated with the labels from the visited method.
labelInsnIndices
)

Constructs a new CheckMethodAdapter object.

protected
CheckMethodAdapter(final int
the ASM API version implemented by this CheckMethodAdapter. Must be one of the ASMx values in Opcodes.
api
,
final MethodVisitor
the method visitor to which this adapter must delegate calls.
methodVisitor
,
final Map<Label, Integer>
the index of the instruction designated by each visited label so far (in other methods). This map is updated with the labels from the visited method.
labelInsnIndices
)

Constructs a new CheckMethodAdapter object.

public
CheckMethodAdapter(final int
the method's access flags.
access
,
final String
the method's name.
name
,
final String
the method's descriptor (see Type).
descriptor
,
final MethodVisitor
the method visitor to which this adapter must delegate calls.
methodVisitor
,
final Map<Label, Integer>
the index of the instruction designated by each visited label so far (in other methods). This map is updated with the labels from the visited method.
labelInsnIndices
)

Constructs a new CheckMethodAdapter object.

protected
CheckMethodAdapter(final int
the ASM API version implemented by this CheckMethodAdapter. Must be one of the ASMx values in Opcodes.
api
,
final int
the method's access flags.
access
,
final String
the method's name.
name
,
final String
the method's descriptor (see Type).
descriptor
,
final MethodVisitor
the method visitor to which this adapter must delegate calls.
methodVisitor
,
final Map<Label, Integer>
the index of the instruction designated by each visited label so far (in other methods). This map is updated with the labels from the visited method.
labelInsnIndices
)

Constructs a new CheckMethodAdapter object.

Method Summary

Modifier and TypeMethod and Description
pack-priv static void
checkConstant(final Object
the value to be checked.
value
)

Checks that the given value is an Integer, Float, Long, Double or String value.

pack-priv static void
checkDescriptor(final int
the class version.
version
,
final String
the string to be checked.
descriptor
,
final boolean
true if V can be considered valid.
canBeVoid
)

Checks that the given string is a valid type descriptor.

private static int

Returns:

the index of the last character of the type descriptor, plus one.
checkDescriptor
(final int
the class version.
version
,
final String
the string to be checked.
descriptor
,
final int
the index of the first character of the type descriptor (inclusive).
startPos
,
final boolean
whether V can be considered valid.
canBeVoid
)

Checks that the given substring is a valid type descriptor.

private void
checkFrameValue(final Object
the value to be checked.
value
)

Checks a stack frame value.

pack-priv static void
checkIdentifier(final int
the class version.
version
,
final String
the string to be checked.
name
,
final int
the index of the first character of the identifier (inclusive).
startPos
,
final int
the index of the last character of the identifier (exclusive). -1 is equivalent to name.length() if name is not null.
endPos
,
final String
the message to use in case of error.
message
)

Checks that the given substring is a valid Java identifier.

private static void
checkInternalClassName(final int
the class version.
version
,
final String
the string to be checked.
name
,
final String
the message to use in case of error.
message
)

Checks that the given string is a valid internal class name.

pack-priv static void
checkInternalName(final int
the class version.
version
,
final String
the string to be checked.
name
,
final String
the message to use in case of error.
message
)

Checks that the given string is a valid internal class name or array type descriptor.

private void
checkLabel(final Label
the label to be checked.
label
,
final boolean
whether to check that the label has been visited.
checkVisited
,
final String
the message to use in case of error.
message
)

Checks that the given label is not null.

private void
checkLdcConstant(final Object
the value to be checked.
value
)

Checks that the given value is a valid operand for the LDC instruction.

pack-priv static void
checkMethodDescriptor(final int
the class version.
version
,
final String
the string to be checked.
descriptor
)

Checks that the given string is a valid method descriptor.

pack-priv static void
checkMethodIdentifier(final int
the class version.
version
,
final String
the string to be checked.
name
,
final String
the message to use in case of error.
message
)

Checks that the given string is a valid Java identifier.

private static void
checkOpcodeMethod(final int
the opcode to be checked.
opcode
,
final CheckMethodAdapter.Method
the expected visit method.
method
)

Checks that the method to visit the given opcode is equal to the given method.

private static void
checkSignedByte(final int
the value to be checked.
value
,
final String
the message to use in case of error.
message
)

Checks that the given value is a signed byte.

private static void
checkSignedShort(final int
the value to be checked.
value
,
final String
the message to use in case of error.
message
)

Checks that the given value is a signed short.

pack-priv static void
checkUnqualifiedName(final int
the class version.
version
,
final String
the string to be checked.
name
,
final String
the message to use in case of error.
message
)

Checks that the given string is a valid unqualified name.

private static void
checkUnsignedShort(final int
the value to be checked.
value
,
final String
the message to use in case of error.
message
)

Checks that the given value is an unsigned short.

private void
checkVisitCodeCalled()

Checks that the visitCode method has been called.

private void
checkVisitEndNotCalled()

Checks that the visitEnd method has not been called.

private void
checkVisitMaxsNotCalled()

Checks that the visitMaxs method has not been called.

public void
visitAnnotableParameterCount(final int
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).
parameterCount
,
final boolean
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.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitAnnotableParameterCount.

Visits the number of method parameters that can have annotations.
public AnnotationVisitor
visitAnnotation(final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitAnnotation.

Visits an annotation of this method.
public AnnotationVisitor
visitAnnotationDefault()

Overrides org.objectweb.asm.MethodVisitor.visitAnnotationDefault.

Visits the default value of this annotation interface method.
public void
visitAttribute(final Attribute
an attribute.
attribute
)

Overrides org.objectweb.asm.MethodVisitor.visitAttribute.

Visits a non standard attribute of this method.
public void
visitCode()

Overrides org.objectweb.asm.MethodVisitor.visitCode.

Starts the visit of the method's code, if any (i.e. non abstract method).
public void
visitEnd()

Overrides org.objectweb.asm.MethodVisitor.visitEnd.

Visits the end of the method.
public void
visitFieldInsn(final int
the opcode of the type instruction to be visited. This opcode is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
opcode
,
final String
the internal name of the field's owner class (see Type#getInternalName()).
owner
,
final String
the field's name.
name
,
final String
the field's descriptor (see Type).
descriptor
)

Overrides org.objectweb.asm.MethodVisitor.visitFieldInsn.

Visits a field instruction.
public void
visitFrame(final int
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.
type
,
final int
the number of local variables in the visited frame. Long and double values count for one variable.
numLocal
,
final Object[]
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, see Type#getInternalName()), and uninitialized types by Label objects (this label designates the NEW instruction that created this uninitialized value).
local
,
final int
the number of operand stack elements in the visited frame. Long and double values count for one stack element.
numStack
,
final Object[]
the operand stack types in this frame. This array must not be modified. Its content has the same format as the "local" array.
stack
)

Overrides org.objectweb.asm.MethodVisitor.visitFrame.

Visits the current state of the local variables and operand stack elements.
public void
visitIincInsn(final int
index of the local variable to be incremented.
varIndex
,
final int
amount to increment the local variable by.
increment
)

Overrides org.objectweb.asm.MethodVisitor.visitIincInsn.

Visits an IINC instruction.
public void
visitInsn(final int
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.
opcode
)

Overrides org.objectweb.asm.MethodVisitor.visitInsn.

Visits a zero operand instruction.
public AnnotationVisitor
visitInsnAnnotation(final int typeRef, final 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.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitInsnAnnotation.

Visits an annotation on an instruction.
public void
visitIntInsn(final int
the opcode of the instruction to be visited. This opcode is either BIPUSH, SIPUSH or NEWARRAY.
opcode
,
final int
the operand of the instruction to be visited.
When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and Byte.MAX_VALUE.
When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and Short.MAX_VALUE.
When opcode is NEWARRAY, operand value should be one of 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.
operand
)

Overrides org.objectweb.asm.MethodVisitor.visitIntInsn.

Visits an instruction with a single int operand.
public void
visitInvokeDynamicInsn(final String
the method's name.
name
,
final String
the method's descriptor (see Type).
descriptor
,
final Handle
the bootstrap method.
bootstrapMethodHandle
,
final Object...
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.
bootstrapMethodArguments
)

Overrides org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn.

Visits an invokedynamic instruction.
public void
visitJumpInsn(final int
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.
opcode
,
final 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.
label
)

Overrides org.objectweb.asm.MethodVisitor.visitJumpInsn.

Visits a jump instruction.
public void
visitLabel(final Label
a Label object.
label
)

Overrides org.objectweb.asm.MethodVisitor.visitLabel.

Visits a label.
public void
visitLdcInsn(final Object
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.
value
)

Overrides org.objectweb.asm.MethodVisitor.visitLdcInsn.

Visits a LDC instruction.
public void
visitLineNumber(final int
a line number. This number refers to the source file from which the class was compiled.
line
,
final Label
the first instruction corresponding to this line number.
start
)

Overrides org.objectweb.asm.MethodVisitor.visitLineNumber.

Visits a line number declaration.
public void
visitLocalVariable(final String
the name of a local variable.
name
,
final String
the type descriptor of this local variable.
descriptor
,
final String
the type signature of this local variable. May be null if the local variable type does not use generic types.
signature
,
final Label
the first instruction corresponding to the scope of this local variable (inclusive).
start
,
final Label
the last instruction corresponding to the scope of this local variable (exclusive).
end
,
final int
the local variable's index.
index
)

Overrides org.objectweb.asm.MethodVisitor.visitLocalVariable.

Visits a local variable declaration.
public AnnotationVisitor
visitLocalVariableAnnotation(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#LOCAL_VARIABLE or TypeReference#RESOURCE_VARIABLE. See TypeReference.
typeRef
,
final 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.
typePath
,
final Label[]
the fist instructions corresponding to the continuous ranges that make the scope of this local variable (inclusive).
start
,
final Label[]
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.
end
,
final int[]
the local variable's index in each range. This array must have the same size as the 'start' array.
index
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitLocalVariableAnnotation.

Visits an annotation on a local variable type.
public void
visitLookupSwitchInsn(final Label
beginning of the default handler block.
dflt
,
final int[]
the values of the keys.
keys
,
final Label[]
beginnings of the handler blocks. labels[i] is the beginning of the handler block for the keys[i] key.
labels
)

Overrides org.objectweb.asm.MethodVisitor.visitLookupSwitchInsn.

Visits a LOOKUPSWITCH instruction.
public void
visitMaxs(final int
maximum stack size of the method.
maxStack
,
final int
maximum number of local variables for the method.
maxLocals
)

Overrides org.objectweb.asm.MethodVisitor.visitMaxs.

Visits the maximum stack size and the maximum number of local variables of the method.
public void
visitMethodInsn(final int
the opcode of the type instruction to be visited. This opcode is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
opcodeAndSource
,
final String
the internal name of the method's owner class (see Type#getInternalName()).
owner
,
final String
the method's name.
name
,
final String
the method's descriptor (see Type).
descriptor
,
final boolean
if the method's owner class is an interface.
isInterface
)

Overrides org.objectweb.asm.MethodVisitor.visitMethodInsn.

Visits a method instruction.
public void
visitMultiANewArrayInsn(final String
an array type descriptor (see Type).
descriptor
,
final int
the number of dimensions of the array to allocate.
numDimensions
)

Overrides org.objectweb.asm.MethodVisitor.visitMultiANewArrayInsn.

Visits a MULTIANEWARRAY instruction.
public void
visitParameter(final String
parameter name or null if none is provided.
name
,
final int
the parameter's access flags, only ACC_FINAL, ACC_SYNTHETIC or/and ACC_MANDATED are allowed (see Opcodes).
access
)

Overrides org.objectweb.asm.MethodVisitor.visitParameter.

Visits a parameter of this method.
public AnnotationVisitor
visitParameterAnnotation(final int
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 visitAnnotableParameterCount.

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).

parameter
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitParameterAnnotation.

Visits an annotation of a parameter this method.
public void
visitTableSwitchInsn(final int
the minimum key value.
min
,
final int
the maximum key value.
max
,
final Label
beginning of the default handler block.
dflt
,
final Label...
beginnings of the handler blocks. labels[i] is the beginning of the handler block for the min + i key.
labels
)

Overrides org.objectweb.asm.MethodVisitor.visitTableSwitchInsn.

Visits a TABLESWITCH instruction.
public AnnotationVisitor
visitTryCatchAnnotation(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#EXCEPTION_PARAMETER. See TypeReference.
typeRef
,
final 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.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitTryCatchAnnotation.

Visits an annotation on an exception handler type.
public void
visitTryCatchBlock(final Label
the beginning of the exception handler's scope (inclusive).
start
,
final Label
the end of the exception handler's scope (exclusive).
end
,
final Label
the beginning of the exception handler's code.
handler
,
final String
the internal name of the type of exceptions handled by the handler (see Type#getInternalName()), or null to catch any exceptions (for "finally" blocks).
type
)

Overrides org.objectweb.asm.MethodVisitor.visitTryCatchBlock.

Visits a try catch block.
public AnnotationVisitor
visitTypeAnnotation(final int typeRef, final 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.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Overrides org.objectweb.asm.MethodVisitor.visitTypeAnnotation.

Visits an annotation on a type in the method signature.
public void
visitTypeInsn(final int
the opcode of the type instruction to be visited. This opcode is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
opcode
,
final String
the operand of the instruction to be visited. This operand must be the internal name of an object or array class (see Type#getInternalName()).
type
)

Overrides org.objectweb.asm.MethodVisitor.visitTypeInsn.

Visits a type instruction.
public void
visitVarInsn(final int
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.
opcode
,
final int
the operand of the instruction to be visited. This operand is the index of a local variable.
varIndex
)

Overrides org.objectweb.asm.MethodVisitor.visitVarInsn.

Visits a local variable instruction.
Inherited from org.objectweb.asm.MethodVisitor:
getDelegatevisitMethodInsn