Package org.objectweb.asm.tree.analysis
Class SimpleVerifier
- java.lang.Object
-
- org.objectweb.asm.tree.analysis.Interpreter<BasicValue>
-
- org.objectweb.asm.tree.analysis.BasicInterpreter
-
- org.objectweb.asm.tree.analysis.BasicVerifier
-
- org.objectweb.asm.tree.analysis.SimpleVerifier
-
- All Implemented Interfaces:
Opcodes
public class SimpleVerifier extends BasicVerifier
An extendedBasicVerifier
that performs more precise verifications. This verifier computes exact class types, instead of using a single "object reference" type (as done inBasicVerifier
).
-
-
Field Summary
Fields Modifier and Type Field Description private Type
currentClass
The type of the class that is verified.private java.util.List<Type>
currentClassInterfaces
The types of the interfaces directly implemented by the class that is verified.private Type
currentSuperClass
The type of the super class of the class that is verified.private boolean
isInterface
Whether the class that is verified is an interface.private java.lang.ClassLoader
loader
The loader to use to load the referenced classes.-
Fields inherited from class org.objectweb.asm.tree.analysis.BasicInterpreter
NULL_TYPE
-
Fields inherited from class org.objectweb.asm.tree.analysis.Interpreter
api
-
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V9
-
-
Constructor Summary
Constructors Modifier Constructor Description SimpleVerifier()
Constructs a newSimpleVerifier
.protected
SimpleVerifier(int api, Type currentClass, Type currentSuperClass, java.util.List<Type> currentClassInterfaces, boolean isInterface)
Constructs a newSimpleVerifier
to verify a specific class.SimpleVerifier(Type currentClass, Type currentSuperClass, boolean isInterface)
Constructs a newSimpleVerifier
to verify a specific class.SimpleVerifier(Type currentClass, Type currentSuperClass, java.util.List<Type> currentClassInterfaces, boolean isInterface)
Constructs a newSimpleVerifier
to verify a specific class.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected java.lang.Class<?>
getClass(Type type)
Loads the class corresponding to the given type.protected BasicValue
getElementValue(BasicValue objectArrayValue)
Returns the value corresponding to the type of the elements of the given array reference value.protected Type
getSuperClass(Type type)
Returns the type corresponding to the super class of the given type.protected boolean
isArrayValue(BasicValue value)
Returns whether the given value corresponds to an array reference.protected boolean
isAssignableFrom(Type type1, Type type2)
Returns whether the class corresponding to the first argument is either the same as, or is a superclass or superinterface of the class corresponding to the second argument.protected boolean
isInterface(Type type)
Returns whether the given type corresponds to the type of an interface.protected boolean
isSubTypeOf(BasicValue value, BasicValue expected)
Returns whether the type corresponding to the first argument is a subtype of the type corresponding to the second argument.BasicValue
merge(BasicValue value1, BasicValue value2)
Merges two values.private BasicValue
newArrayValue(Type type, int dimensions)
BasicValue
newValue(Type type)
Creates a new value that represents the given type.void
setClassLoader(java.lang.ClassLoader loader)
Sets theClassLoader
to be used ingetClass(org.objectweb.asm.Type)
.-
Methods inherited from class org.objectweb.asm.tree.analysis.BasicVerifier
binaryOperation, copyOperation, naryOperation, returnOperation, ternaryOperation, unaryOperation
-
Methods inherited from class org.objectweb.asm.tree.analysis.BasicInterpreter
newOperation
-
Methods inherited from class org.objectweb.asm.tree.analysis.Interpreter
newEmptyValue, newExceptionValue, newParameterValue, newReturnTypeValue
-
-
-
-
Field Detail
-
currentClass
private final Type currentClass
The type of the class that is verified.
-
currentSuperClass
private final Type currentSuperClass
The type of the super class of the class that is verified.
-
currentClassInterfaces
private final java.util.List<Type> currentClassInterfaces
The types of the interfaces directly implemented by the class that is verified.
-
isInterface
private final boolean isInterface
Whether the class that is verified is an interface.
-
loader
private java.lang.ClassLoader loader
The loader to use to load the referenced classes.
-
-
Constructor Detail
-
SimpleVerifier
public SimpleVerifier()
Constructs a newSimpleVerifier
. Subclasses must not use this constructor. Instead, they must use theSimpleVerifier(int, Type, Type, List, boolean)
version.
-
SimpleVerifier
public SimpleVerifier(Type currentClass, Type currentSuperClass, boolean isInterface)
Constructs a newSimpleVerifier
to verify a specific class. This class will not be loaded into the JVM since it may be incorrect. Subclasses must not use this constructor. Instead, they must use theSimpleVerifier(int, Type, Type, List, boolean)
version.- Parameters:
currentClass
- the type of the class to be verified.currentSuperClass
- the type of the super class of the class to be verified.isInterface
- whether the class to be verifier is an interface.
-
SimpleVerifier
public SimpleVerifier(Type currentClass, Type currentSuperClass, java.util.List<Type> currentClassInterfaces, boolean isInterface)
Constructs a newSimpleVerifier
to verify a specific class. This class will not be loaded into the JVM since it may be incorrect. Subclasses must not use this constructor. Instead, they must use theSimpleVerifier(int, Type, Type, List, boolean)
version.- Parameters:
currentClass
- the type of the class to be verified.currentSuperClass
- the type of the super class of the class to be verified.currentClassInterfaces
- the types of the interfaces directly implemented by the class to be verified.isInterface
- whether the class to be verifier is an interface.
-
SimpleVerifier
protected SimpleVerifier(int api, Type currentClass, Type currentSuperClass, java.util.List<Type> currentClassInterfaces, boolean isInterface)
Constructs a newSimpleVerifier
to verify a specific class. This class will not be loaded into the JVM since it may be incorrect.- Parameters:
api
- the ASM API version supported by this verifier. Must be one ofOpcodes.ASM4
,Opcodes.ASM5
,Opcodes.ASM6
,Opcodes.ASM7
,Opcodes.ASM8
or orOpcodes.ASM9
.currentClass
- the type of the class to be verified.currentSuperClass
- the type of the super class of the class to be verified.currentClassInterfaces
- the types of the interfaces directly implemented by the class to be verified.isInterface
- whether the class to be verifier is an interface.
-
-
Method Detail
-
setClassLoader
public void setClassLoader(java.lang.ClassLoader loader)
Sets theClassLoader
to be used ingetClass(org.objectweb.asm.Type)
.- Parameters:
loader
- theClassLoader
to use.
-
newValue
public BasicValue newValue(Type type)
Description copied from class:Interpreter
Creates a new value that represents the given type.Called for method parameters (including
this
), exception handler variable and withnull
type for variables reserved by long and double types.An interpreter may choose to implement one or more of
Interpreter.newReturnTypeValue(Type)
,Interpreter.newParameterValue(boolean, int, Type)
,Interpreter.newEmptyValue(int)
,Interpreter.newExceptionValue(TryCatchBlockNode, Frame, Type)
to distinguish different types of new value.- Overrides:
newValue
in classBasicInterpreter
- Parameters:
type
- a primitive or reference type, or null to represent an uninitialized value.- Returns:
- a value that represents the given type. The size of the returned value must be equal to the size of the given type.
-
isArrayValue
protected boolean isArrayValue(BasicValue value)
Description copied from class:BasicVerifier
Returns whether the given value corresponds to an array reference.- Overrides:
isArrayValue
in classBasicVerifier
- Parameters:
value
- a value.- Returns:
- whether 'value' corresponds to an array reference.
-
getElementValue
protected BasicValue getElementValue(BasicValue objectArrayValue) throws AnalyzerException
Description copied from class:BasicVerifier
Returns the value corresponding to the type of the elements of the given array reference value.- Overrides:
getElementValue
in classBasicVerifier
- Parameters:
objectArrayValue
- a value corresponding to array of object (or array) references.- Returns:
- the value corresponding to the type of the elements of 'objectArrayValue'.
- Throws:
AnalyzerException
- if objectArrayValue does not correspond to an array type.
-
isSubTypeOf
protected boolean isSubTypeOf(BasicValue value, BasicValue expected)
Description copied from class:BasicVerifier
Returns whether the type corresponding to the first argument is a subtype of the type corresponding to the second argument.- Overrides:
isSubTypeOf
in classBasicVerifier
- Parameters:
value
- a value.expected
- another value.- Returns:
- whether the type corresponding to 'value' is a subtype of the type corresponding to 'expected'.
-
merge
public BasicValue merge(BasicValue value1, BasicValue value2)
Description copied from class:Interpreter
Merges two values. The merge operation must return a value that represents both values (for instance, if the two values are two types, the merged value must be a common super type of the two types. If the two values are integer intervals, the merged value must be an interval that contains the previous ones. Likewise for other types of values).- Overrides:
merge
in classBasicInterpreter
- Parameters:
value1
- a value.value2
- another value.- Returns:
- the merged value. If the merged value is equal to
value1
, this method must returnvalue1
.
-
newArrayValue
private BasicValue newArrayValue(Type type, int dimensions)
-
isInterface
protected boolean isInterface(Type type)
Returns whether the given type corresponds to the type of an interface. The default implementation of this method loads the class and uses the reflection API to return its result (unless the given type corresponds to the class being verified).- Parameters:
type
- a type.- Returns:
- whether 'type' corresponds to an interface.
-
getSuperClass
protected Type getSuperClass(Type type)
Returns the type corresponding to the super class of the given type. The default implementation of this method loads the class and uses the reflection API to return its result (unless the given type corresponds to the class being verified).- Parameters:
type
- a type.- Returns:
- the type corresponding to the super class of 'type'.
-
isAssignableFrom
protected boolean isAssignableFrom(Type type1, Type type2)
Returns whether the class corresponding to the first argument is either the same as, or is a superclass or superinterface of the class corresponding to the second argument. The default implementation of this method loads the classes and uses the reflection API to return its result (unless the result can be computed from the class being verified, and the types of its super classes and implemented interfaces).- Parameters:
type1
- a type.type2
- another type.- Returns:
- whether the class corresponding to 'type1' is either the same as, or is a superclass or superinterface of the class corresponding to 'type2'.
-
getClass
protected java.lang.Class<?> getClass(Type type)
Loads the class corresponding to the given type. The class is loaded with the class loader specified withsetClassLoader(java.lang.ClassLoader)
, or with the class loader of this class if no class loader was specified.- Parameters:
type
- a type.- Returns:
- the class corresponding to 'type'.
-
-