org.objectweb.asm.tree.analysis

## Class Analyzer<V extends Value>

- java.lang.Object
- - org.objectweb.asm.tree.analysis.Analyzer<V>

- Type Parameters:
    `V` - type of the Value used for the analysis.
  All Implemented Interfaces:
    Opcodes

      public class Analyzer<V extends Value>
      extends Object
      implements Opcodes

  A semantic bytecode analyzer. This class does not fully check that JSR and RET instructions are valid.
  Author:
    Eric Bruneton

- - ### Field Summary

    - ### 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_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM4, ASM5, 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, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `Analyzer(Interpreter<V> interpreter)` Constructs a new `Analyzer`.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `Frame<V>[]` | `analyze(String owner, MethodNode m)` Analyzes the given method.
    `Frame<V>[]` | `getFrames()` Returns the symbolic stack frame for each instruction of the last recently analyzed method.
    `List<TryCatchBlockNode>` | `getHandlers(int insn)` Returns the exception handlers for the given instruction.
    `protected void` | `init(String owner, MethodNode m)` Initializes this analyzer.
    `protected void` | `newControlFlowEdge(int insn, int successor)` Creates a control flow graph edge.
    `protected boolean` | `newControlFlowExceptionEdge(int insn, int successor)` Creates a control flow graph edge corresponding to an exception handler.
    `protected boolean` | `newControlFlowExceptionEdge(int insn, TryCatchBlockNode tcb)` Creates a control flow graph edge corresponding to an exception handler.
    `protected Frame<V>` | `newFrame(Frame<? extends V> src)` Constructs a new frame that is identical to the given frame.
    `protected Frame<V>` | `newFrame(int nLocals, int nStack)` Constructs a new frame with the given size.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### Analyzer

          public Analyzer(Interpreter<V> interpreter)

      Constructs a new `Analyzer`.
      Parameters:
        `interpreter` - the interpreter to be used to symbolically interpret the bytecode instructions.

  - ### Method Detail

    - #### analyze

          public Frame<V>[] analyze(String owner,
                                    MethodNode m)
                             throws AnalyzerException

      Analyzes the given method.
      Parameters:
        `owner` - the internal name of the class to which the method belongs.
        `m` - the method to be analyzed.
      Returns:
        the symbolic state of the execution stack frame at each bytecode instruction of the method. The size of the returned array is equal to the number of instructions (and labels) of the method. A given frame is `null` if and only if the corresponding instruction cannot be reached (dead code).
      Throws:
        `AnalyzerException` - if a problem occurs during the analysis.

    - #### getFrames

          public Frame<V>[] getFrames()

      Returns the symbolic stack frame for each instruction of the last recently analyzed method.
      Returns:
        the symbolic state of the execution stack frame at each bytecode instruction of the method. The size of the returned array is equal to the number of instructions (and labels) of the method. A given frame is `null` if the corresponding instruction cannot be reached, or if an error occured during the analysis of the method.

    - #### getHandlers

          public List<TryCatchBlockNode> getHandlers(int insn)

      Returns the exception handlers for the given instruction.
      Parameters:
        `insn` - the index of an instruction of the last recently analyzed method.
      Returns:
        a list of `TryCatchBlockNode` objects.

    - #### init

          protected void init(String owner,
                              MethodNode m)
                       throws AnalyzerException

      Initializes this analyzer. This method is called just before the execution of control flow analysis loop in #analyze. The default implementation of this method does nothing.
      Parameters:
        `owner` - the internal name of the class to which the method belongs.
        `m` - the method to be analyzed.
      Throws:
        `AnalyzerException` - if a problem occurs.

    - #### newFrame

          protected Frame<V> newFrame(int nLocals,
                                      int nStack)

      Constructs a new frame with the given size.
      Parameters:
        `nLocals` - the maximum number of local variables of the frame.
        `nStack` - the maximum stack size of the frame.
      Returns:
        the created frame.

    - #### newFrame

          protected Frame<V> newFrame(Frame<? extends V> src)

      Constructs a new frame that is identical to the given frame.
      Parameters:
        `src` - a frame.
      Returns:
        the created frame.

    - #### newControlFlowEdge

          protected void newControlFlowEdge(int insn,
                                            int successor)

      Creates a control flow graph edge. The default implementation of this method does nothing. It can be overriden in order to construct the control flow graph of a method (this method is called by the `analyze` method during its visit of the method's code).
      Parameters:
        `insn` - an instruction index.
        `successor` - index of a successor instruction.

    - #### newControlFlowExceptionEdge

          protected boolean newControlFlowExceptionEdge(int insn,
                                                        int successor)

      Creates a control flow graph edge corresponding to an exception handler. The default implementation of this method does nothing. It can be overridden in order to construct the control flow graph of a method (this method is called by the `analyze` method during its visit of the method's code).
      Parameters:
        `insn` - an instruction index.
        `successor` - index of a successor instruction.
      Returns:
        true if this edge must be considered in the data flow analysis performed by this analyzer, or false otherwise. The default implementation of this method always returns true.

    - #### newControlFlowExceptionEdge

          protected boolean newControlFlowExceptionEdge(int insn,
                                                        TryCatchBlockNode tcb)

      Creates a control flow graph edge corresponding to an exception handler. The default implementation of this method delegates to `newControlFlowExceptionEdge(int, int)`. It can be overridden in order to construct the control flow graph of a method (this method is called by the `analyze` method during its visit of the method's code).
      Parameters:
        `insn` - an instruction index.
        `tcb` - TryCatchBlockNode corresponding to this edge.
      Returns:
        true if this edge must be considered in the data flow analysis performed by this analyzer, or false otherwise. The default implementation of this method delegates to `newControlFlowExceptionEdge(int, int)`.