public class MethodAnalyzer<V extends org.objectweb.asm.tree.analysis.Value>
extends org.objectweb.asm.tree.analysis.Analyzer<V>
We need to be able to keep track of local variables that are assigned to each other so that we can infer their replaceability (for scalar replacement). In order to do that, we need to know when local variables are assigned (with the old value being overwritten) so that we can associate them with the new value, and hence determine whether they can also be replaced, or not.
In order to capture the assignment operation, we have to provide our own Frame<>, but ASM doesn't provide a direct way to do that. Here, we use the Analyzer's newFrame() methods as factories that will provide our own derivative of Frame<> which we use to detect
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, V18, V9
Constructor and Description |
---|
MethodAnalyzer(org.objectweb.asm.tree.analysis.Interpreter<V> interpreter) |
Modifier and Type | Method and Description |
---|---|
org.objectweb.asm.tree.analysis.Frame<V>[] |
analyze(String owner,
org.objectweb.asm.tree.MethodNode method) |
protected void |
newControlFlowEdge(int insnIndex,
int successorIndex) |
protected org.objectweb.asm.tree.analysis.Frame<V> |
newFrame(org.objectweb.asm.tree.analysis.Frame<? extends V> src) |
protected org.objectweb.asm.tree.analysis.Frame<V> |
newFrame(int maxLocals,
int maxStack) |
public MethodAnalyzer(org.objectweb.asm.tree.analysis.Interpreter<V> interpreter)
protected org.objectweb.asm.tree.analysis.Frame<V> newFrame(int maxLocals, int maxStack)
newFrame
in class org.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
protected org.objectweb.asm.tree.analysis.Frame<V> newFrame(org.objectweb.asm.tree.analysis.Frame<? extends V> src)
newFrame
in class org.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
protected void newControlFlowEdge(int insnIndex, int successorIndex)
newControlFlowEdge
in class org.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
public org.objectweb.asm.tree.analysis.Frame<V>[] analyze(String owner, org.objectweb.asm.tree.MethodNode method) throws org.objectweb.asm.tree.analysis.AnalyzerException
analyze
in class org.objectweb.asm.tree.analysis.Analyzer<V extends org.objectweb.asm.tree.analysis.Value>
org.objectweb.asm.tree.analysis.AnalyzerException
Copyright © 2022 The Apache Software Foundation. All rights reserved.