Class LocalVariablesSorter
java.lang.Object
org.objectweb.asm.MethodAdapter
org.objectweb.asm.commons.LocalVariablesSorter
- All Implemented Interfaces:
MethodVisitor
- Direct Known Subclasses:
GeneratorAdapter, RemappingMethodAdapter
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 Summary
FieldsModifier and TypeFieldDescriptionprotected final intIndex of the first local variable, after formal parameters.protected intIndex of the next local variable to be created bynewLocal(Type).Fields inherited from class MethodAdapter
mv -
Constructor Summary
ConstructorsConstructorDescriptionLocalVariablesSorter(int access, String desc, MethodVisitor mv) Creates a newLocalVariablesSorter. -
Method Summary
Modifier and TypeMethodDescriptionintCreates a new local variable of the given type.protected intnewLocalMapping(Type type) protected voidsetLocalType(int local, Type type) Sets the current type of the given local variable.voidvisitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) Visits the current state of the local variables and operand stack elements.voidvisitIincInsn(int var, int increment) Visits an IINC instruction.voidVisits a local variable declaration.voidvisitMaxs(int maxStack, int maxLocals) Visits the maximum stack size and the maximum number of local variables of the method.voidvisitVarInsn(int opcode, int var) Visits a local variable instruction.Methods inherited from class MethodAdapter
visitAnnotation, visitAnnotationDefault, visitAttribute, visitCode, visitEnd, visitFieldInsn, visitInsn, visitIntInsn, visitJumpInsn, visitLabel, visitLdcInsn, visitLineNumber, visitLookupSwitchInsn, visitMethodInsn, visitMultiANewArrayInsn, visitParameterAnnotation, visitTableSwitchInsn, visitTryCatchBlock, visitTypeInsn
-
Field Details
-
firstLocal
protected final int firstLocalIndex of the first local variable, after formal parameters. -
nextLocal
protected int nextLocalIndex of the next local variable to be created bynewLocal(Type).
-
-
Constructor Details
-
LocalVariablesSorter
Creates a newLocalVariablesSorter.- Parameters:
access- access flags of the adapted method.desc- the method's descriptor (seeType).mv- the method visitor to which this adapter delegates calls.
-
-
Method Details
-
visitVarInsn
public void visitVarInsn(int opcode, int var) Description copied from interface:MethodVisitorVisits a local variable instruction. A local variable instruction is an instruction that loads or stores the value of a local variable.- Specified by:
visitVarInsnin interfaceMethodVisitor- Overrides:
visitVarInsnin classMethodAdapter- 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:MethodVisitorVisits an IINC instruction.- Specified by:
visitIincInsnin interfaceMethodVisitor- Overrides:
visitIincInsnin classMethodAdapter- 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:MethodVisitorVisits the maximum stack size and the maximum number of local variables of the method.- Specified by:
visitMaxsin interfaceMethodVisitor- Overrides:
visitMaxsin classMethodAdapter- 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:MethodVisitorVisits a local variable declaration.- Specified by:
visitLocalVariablein interfaceMethodVisitor- Overrides:
visitLocalVariablein classMethodAdapter- 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
Description copied from interface:MethodVisitorVisits 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 toV1_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_SAMErepresenting frame with exactly the same locals as the previous frame and with the empty stack.Opcodes.F_SAME1representing frame with exactly the same locals as the previous frame and with single value on the stack (nStackis 1 andstack[0]contains value for the type of the stack item).Opcodes.F_APPENDrepresenting frame with current locals are the same as the locals in the previous frame, except that additional locals are defined (nLocalis 1, 2 or 3 andlocalelements contains values representing added types).Opcodes.F_CHOPrepresenting 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 (nLocalsis 1, 2 or 3).Opcodes.F_FULLrepresenting complete frame data.
- Specified by:
visitFramein interfaceMethodVisitor- Overrides:
visitFramein classMethodAdapter- Parameters:
type- the type of this stack map frame. Must beOpcodes.F_NEWfor expanded frames, orOpcodes.F_FULL,Opcodes.F_APPEND,Opcodes.F_CHOP,Opcodes.F_SAMEorOpcodes.F_APPEND,Opcodes.F_SAME1for 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 byOpcodes.TOP,Opcodes.INTEGER,Opcodes.FLOAT,Opcodes.LONG,Opcodes.DOUBLE,Opcodes.NULLorOpcodes.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
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
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 bynewLocal().type- the type of the value being stored in the local variable
-
newLocalMapping
-