Class LocalVariablesSorter

java.lang.Object
org.objectweb.asm.MethodAdapter
org.objectweb.asm.commons.LocalVariablesSorter
All Implemented Interfaces:
MethodVisitor
Direct Known Subclasses:
GeneratorAdapter, RemappingMethodAdapter

public class LocalVariablesSorter extends MethodAdapter
A MethodAdapter that renumbers local variables in their order of appearance. This adapter allows one to easily add new local variables to a method. It may be used by inheriting from this class, but the preferred way of using it is via delegation: the next visitor in the chain can indeed add new locals when needed by calling newLocal(Type) on this adapter (this requires a reference back to this LocalVariablesSorter).
Author:
Chris Nokleberg, Eugene Kuleshov, Eric Bruneton
  • Field Details

    • firstLocal

      protected final int firstLocal
      Index of the first local variable, after formal parameters.
    • nextLocal

      protected int nextLocal
      Index of the next local variable to be created by newLocal(Type).
  • Constructor Details

    • LocalVariablesSorter

      public LocalVariablesSorter(int access, String desc, MethodVisitor mv)
      Creates a new LocalVariablesSorter.
      Parameters:
      access - access flags of the adapted method.
      desc - the method's descriptor (see Type).
      mv - the method visitor to which this adapter delegates calls.
  • Method Details

    • visitVarInsn

      public void visitVarInsn(int opcode, int var)
      Description copied from interface: MethodVisitor
      Visits a local variable instruction. A local variable instruction is an instruction that loads or stores the value of a local variable.
      Specified by:
      visitVarInsn in interface MethodVisitor
      Overrides:
      visitVarInsn in class MethodAdapter
      Parameters:
      opcode - 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.
      var - the operand of the instruction to be visited. This operand is the index of a local variable.
    • visitIincInsn

      public void visitIincInsn(int var, int increment)
      Description copied from interface: MethodVisitor
      Visits an IINC instruction.
      Specified by:
      visitIincInsn in interface MethodVisitor
      Overrides:
      visitIincInsn in class MethodAdapter
      Parameters:
      var - index of the local variable to be incremented.
      increment - amount to increment the local variable by.
    • visitMaxs

      public void visitMaxs(int maxStack, int maxLocals)
      Description copied from interface: MethodVisitor
      Visits the maximum stack size and the maximum number of local variables of the method.
      Specified by:
      visitMaxs in interface MethodVisitor
      Overrides:
      visitMaxs in class MethodAdapter
      Parameters:
      maxStack - maximum stack size of the method.
      maxLocals - maximum number of local variables for the method.
    • visitLocalVariable

      public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index)
      Description copied from interface: MethodVisitor
      Visits a local variable declaration.
      Specified by:
      visitLocalVariable in interface MethodVisitor
      Overrides:
      visitLocalVariable in class MethodAdapter
      Parameters:
      name - the name of a local variable.
      desc - the type descriptor of this local variable.
      signature - the type signature of this local variable. May be null if the local variable type does not use generic types.
      start - the first instruction corresponding to the scope of this local variable (inclusive).
      end - the last instruction corresponding to the scope of this local variable (exclusive).
      index - the local variable's index.
    • visitFrame

      public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack)
      Description copied from interface: MethodVisitor
      Visits the current state of the local variables and operand stack elements. This method must(*) be called just before any instruction i that follows an unconditional branch instruction such as GOTO or THROW, that is the target of a jump instruction, or that starts an exception handler block. The visited types must describe the values of the local variables and of the operand stack elements just before i is executed.

      (*) this is mandatory only for classes whose version is greater than or equal to V1_6.

      Packed frames are basically "deltas" from the state of the previous frame (very first frame is implicitly defined by the method's parameters and access flags):
      • Opcodes.F_SAME representing frame with exactly the same locals as the previous frame and with the empty stack.
      • Opcodes.F_SAME1 representing frame with exactly the same locals as the previous frame and with single value on the stack (nStack is 1 and stack[0] contains value for the type of the stack item).
      • Opcodes.F_APPEND representing frame with current locals are the same as the locals in the previous frame, except that additional locals are defined (nLocal is 1, 2 or 3 and local elements contains values representing added types).
      • Opcodes.F_CHOP representing frame with current locals are the same as the locals in the previous frame, except that the last 1-3 locals are absent and with the empty stack (nLocals is 1, 2 or 3).
      • Opcodes.F_FULL representing complete frame data.
      Specified by:
      visitFrame in interface MethodVisitor
      Overrides:
      visitFrame in class MethodAdapter
      Parameters:
      type - 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.
      nLocal - the number of local variables in the visited frame.
      local - 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), and uninitialized types by Label objects (this label designates the NEW instruction that created this uninitialized value).
      nStack - the number of operand stack elements in the visited frame.
      stack - the operand stack types in this frame. This array must not be modified. Its content has the same format as the "local" array.
    • newLocal

      public int newLocal(Type type)
      Creates a new local variable of the given type.
      Parameters:
      type - the type of the local variable to be created.
      Returns:
      the identifier of the newly created local variable.
    • setLocalType

      protected void setLocalType(int local, Type type)
      Sets the current type of the given local variable. The default implementation of this method does nothing.
      Parameters:
      local - a local variable identifier, as returned by newLocal().
      type - the type of the value being stored in the local variable
    • newLocalMapping

      protected int newLocalMapping(Type type)