V
- type of the Value used for the analysis.public abstract class Interpreter<V extends Value> extends Object
Analyzer
to work
with various semantic interpreters, without needing to duplicate the code to simulate the
transfer of values.Modifier and Type | Field and Description |
---|---|
protected int |
api
The ASM API version supported by this interpreter.
|
Modifier | Constructor and Description |
---|---|
protected |
Interpreter(int api)
Constructs a new
Interpreter . |
Modifier and Type | Method and Description |
---|---|
abstract V |
binaryOperation(AbstractInsnNode insn,
V value1,
V value2)
Interprets a bytecode instruction with two arguments.
|
abstract V |
copyOperation(AbstractInsnNode insn,
V value)
Interprets a bytecode instruction that moves a value on the stack or to or from local
variables.
|
abstract V |
merge(V value1,
V value2)
Merges two values.
|
abstract V |
naryOperation(AbstractInsnNode insn,
List<? extends V> values)
Interprets a bytecode instruction with a variable number of arguments.
|
V |
newEmptyValue(int local)
Creates a new uninitialized value for a local variable.
|
V |
newExceptionValue(TryCatchBlockNode tryCatchBlockNode,
Frame<V> handlerFrame,
Type exceptionType)
Creates a new value that represents the given exception type.
|
abstract V |
newOperation(AbstractInsnNode insn)
Interprets a bytecode instruction without arguments.
|
V |
newParameterValue(boolean isInstanceMethod,
int local,
Type type)
Creates a new value that represents the given parameter type.
|
V |
newReturnTypeValue(Type type)
Creates a new value that represents the given return type.
|
abstract V |
newValue(Type type)
Creates a new value that represents the given type.
|
abstract void |
returnOperation(AbstractInsnNode insn,
V value,
V expected)
Interprets a bytecode return instruction.
|
abstract V |
ternaryOperation(AbstractInsnNode insn,
V value1,
V value2,
V value3)
Interprets a bytecode instruction with three arguments.
|
abstract V |
unaryOperation(AbstractInsnNode insn,
V value)
Interprets a bytecode instruction with a single argument.
|
protected final int api
Opcodes.ASM4
, Opcodes.ASM5
, Opcodes.ASM6
or Opcodes.ASM7
.protected Interpreter(int api)
Interpreter
.api
- the ASM API version supported by this interpreter. Must be one of Opcodes.ASM4
, Opcodes.ASM5
, Opcodes.ASM6
or Opcodes.ASM7
.public abstract V newValue(Type type)
Called for method parameters (including this
), exception handler variable and
with null
type for variables reserved by long and double types.
An interpreter may choose to implement one or more of newReturnTypeValue(Type)
, newParameterValue(boolean, int,
Type)
, newEmptyValue(int)
, newExceptionValue(TryCatchBlockNode, Frame, Type)
to distinguish different types
of new value.
type
- a primitive or reference type, or null to represent an uninitialized
value.public V newParameterValue(boolean isInstanceMethod, int local, Type type)
By default, calls newValue(type)
.
isInstanceMethod
- true if the method is non-static.local
- the local variable index.type
- a primitive or reference type.public V newReturnTypeValue(Type type)
By default, calls newValue(type)
.
type
- a primitive or reference type.public V newEmptyValue(int local)
By default, calls newValue(null)
.
local
- the local variable index.public V newExceptionValue(TryCatchBlockNode tryCatchBlockNode, Frame<V> handlerFrame, Type exceptionType)
By default, calls newValue(exceptionType)
.
tryCatchBlockNode
- the exception handler.handlerFrame
- the exception handler frame.exceptionType
- the exception type handled by this handler.exceptionType
. The size of the returned value
must be equal to 1.public abstract V newOperation(AbstractInsnNode insn) throws AnalyzerException
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, JSR, GETSTATIC, NEW
insn
- the bytecode instruction to be interpreted.AnalyzerException
- if an error occurred during the interpretation.public abstract V copyOperation(AbstractInsnNode insn, V value) throws AnalyzerException
ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP
insn
- the bytecode instruction to be interpreted.value
- the value that must be moved by the instruction.equal
to the given value.AnalyzerException
- if an error occurred during the interpretation.public abstract V unaryOperation(AbstractInsnNode insn, V value) throws AnalyzerException
INEG, LNEG, FNEG, DNEG, IINC, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, TABLESWITCH, LOOKUPSWITCH, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, PUTSTATIC, GETFIELD, NEWARRAY, ANEWARRAY, ARRAYLENGTH, ATHROW, CHECKCAST, INSTANCEOF, MONITORENTER, MONITOREXIT, IFNULL, IFNONNULL
insn
- the bytecode instruction to be interpreted.value
- the argument of the instruction to be interpreted.AnalyzerException
- if an error occurred during the interpretation.public abstract V binaryOperation(AbstractInsnNode insn, V value1, V value2) throws AnalyzerException
IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, PUTFIELD
insn
- the bytecode instruction to be interpreted.value1
- the first argument of the instruction to be interpreted.value2
- the second argument of the instruction to be interpreted.AnalyzerException
- if an error occurred during the interpretation.public abstract V ternaryOperation(AbstractInsnNode insn, V value1, V value2, V value3) throws AnalyzerException
IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE
insn
- the bytecode instruction to be interpreted.value1
- the first argument of the instruction to be interpreted.value2
- the second argument of the instruction to be interpreted.value3
- the third argument of the instruction to be interpreted.AnalyzerException
- if an error occurred during the interpretation.public abstract V naryOperation(AbstractInsnNode insn, List<? extends V> values) throws AnalyzerException
INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE, MULTIANEWARRAY and INVOKEDYNAMIC
insn
- the bytecode instruction to be interpreted.values
- the arguments of the instruction to be interpreted.AnalyzerException
- if an error occurred during the interpretation.public abstract void returnOperation(AbstractInsnNode insn, V value, V expected) throws AnalyzerException
IRETURN, LRETURN, FRETURN, DRETURN, ARETURN
insn
- the bytecode instruction to be interpreted.value
- the argument of the instruction to be interpreted.expected
- the expected return type of the analyzed method.AnalyzerException
- if an error occurred during the interpretation.public abstract V merge(V value1, V value2)
value1
- a value.value2
- another value.value1
, this method
must return value1
.Copyright © 2018. All rights reserved.