Package net.bytebuddy.utility.visitor
Class StackAwareMethodVisitor
java.lang.Object
org.objectweb.asm.MethodVisitor
net.bytebuddy.utility.visitor.StackAwareMethodVisitor
public class StackAwareMethodVisitor
extends org.objectweb.asm.MethodVisitor
A method visitor that is aware of the current size of the operand stack at all times. Additionally, this method takes
care of maintaining an index for the next currently unused index of the local variable array.
-
Field Summary
FieldsModifier and TypeFieldDescriptionA list of the current elements on the operand stack.private int
The next index of the local variable array that is available.private static final int[]
An array mapping any opcode to its size impact onto the operand stack.A mapping of labels to the operand stack size that is expected at this label.Fields inherited from class org.objectweb.asm.MethodVisitor
api, mv
-
Constructor Summary
ConstructorsConstructorDescriptionStackAwareMethodVisitor
(org.objectweb.asm.MethodVisitor methodVisitor, MethodDescription instrumentedMethod) Creates a new stack aware method visitor. -
Method Summary
Modifier and TypeMethodDescriptionprivate void
adjustStack
(int delta) Adjusts the current state of the operand stack.private void
adjustStack
(int delta, int offset) Adjusts the current state of the operand stack.private void
Drains all supplied elements of the operand stack.void
Pops all values currently on the stack.int
drainStack
(int store, int load, StackSize size) Drains the stack to only contain the top value.void
Explicitly registers a label to define a given stack state.void
visitFieldInsn
(int opcode, String owner, String name, String descriptor) void
visitInsn
(int opcode) void
visitIntInsn
(int opcode, int operand) void
visitInvokeDynamicInsn
(String name, String descriptor, org.objectweb.asm.Handle bootstrap, Object... bootstrapArguments) void
visitJumpInsn
(int opcode, org.objectweb.asm.Label label) void
visitLabel
(org.objectweb.asm.Label label) void
visitLdcInsn
(Object value) void
visitLineNumber
(int line, org.objectweb.asm.Label start) void
visitLookupSwitchInsn
(org.objectweb.asm.Label defaultOption, int[] key, org.objectweb.asm.Label[] option) void
visitMethodInsn
(int opcode, String owner, String name, String descriptor, boolean isInterface) void
visitMultiANewArrayInsn
(String descriptor, int dimension) void
visitTableSwitchInsn
(int minimum, int maximum, org.objectweb.asm.Label defaultOption, org.objectweb.asm.Label... option) void
visitTryCatchBlock
(org.objectweb.asm.Label start, org.objectweb.asm.Label end, org.objectweb.asm.Label handler, String type) void
visitTypeInsn
(int opcode, String type) void
visitVarInsn
(int opcode, int variable) Methods inherited from class org.objectweb.asm.MethodVisitor
visitAnnotableParameterCount, visitAnnotation, visitAnnotationDefault, visitAttribute, visitCode, visitEnd, visitFrame, visitIincInsn, visitInsnAnnotation, visitLocalVariable, visitLocalVariableAnnotation, visitMaxs, visitMethodInsn, visitParameter, visitParameterAnnotation, visitTryCatchAnnotation, visitTypeAnnotation
-
Field Details
-
SIZE_CHANGE
private static final int[] SIZE_CHANGEAn array mapping any opcode to its size impact onto the operand stack. This mapping is taken fromFrame
with the difference that theOpcodes.JSR
instruction is mapped to a size of0
as it does not impact the stack after returning from the instruction. -
current
A list of the current elements on the operand stack. -
sizes
A mapping of labels to the operand stack size that is expected at this label. Lists stored in this map must not be mutated. -
freeIndex
private int freeIndexThe next index of the local variable array that is available.
-
-
Constructor Details
-
StackAwareMethodVisitor
public StackAwareMethodVisitor(org.objectweb.asm.MethodVisitor methodVisitor, MethodDescription instrumentedMethod) Creates a new stack aware method visitor.- Parameters:
methodVisitor
- The method visitor to delegate operations to.instrumentedMethod
- The method description for which this method visitor is applied.
-
-
Method Details
-
adjustStack
private void adjustStack(int delta) Adjusts the current state of the operand stack.- Parameters:
delta
- The change of the current operation of the operand stack. Must not be larger than2
.
-
adjustStack
private void adjustStack(int delta, int offset) Adjusts the current state of the operand stack.- Parameters:
delta
- The change of the current operation of the operand stack. Must not be larger than2
.offset
- The offset of the value within the operand stack. Must be bigger then0
and smaller than the current stack size. Only permitted if the supplieddelta
is positive.
-
drainStack
public void drainStack()Pops all values currently on the stack. -
drainStack
Drains the stack to only contain the top value. For this, the value on top of the stack is temporarily stored in the local variable array until all values on the stack are popped off. Subsequently, the top value is pushed back onto the operand stack.- Parameters:
store
- The opcode used for storing the top value.load
- The opcode used for loading the top value.size
- The size of the value on top of the operand stack.- Returns:
- The minimal size of the local variable array that is required to perform the operation.
-
doDrain
Drains all supplied elements of the operand stack.- Parameters:
stackSizes
- The stack sizes of the elements to drain.
-
register
Explicitly registers a label to define a given stack state.- Parameters:
label
- The label to register a stack state for.stackSizes
- The stack sizes to assume when reaching the supplied label.
-
visitInsn
public void visitInsn(int opcode) - Overrides:
visitInsn
in classorg.objectweb.asm.MethodVisitor
-
visitIntInsn
public void visitIntInsn(int opcode, int operand) - Overrides:
visitIntInsn
in classorg.objectweb.asm.MethodVisitor
-
visitVarInsn
public void visitVarInsn(int opcode, int variable) - Overrides:
visitVarInsn
in classorg.objectweb.asm.MethodVisitor
-
visitTypeInsn
- Overrides:
visitTypeInsn
in classorg.objectweb.asm.MethodVisitor
-
visitFieldInsn
- Overrides:
visitFieldInsn
in classorg.objectweb.asm.MethodVisitor
-
visitMethodInsn
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) - Overrides:
visitMethodInsn
in classorg.objectweb.asm.MethodVisitor
-
visitInvokeDynamicInsn
public void visitInvokeDynamicInsn(String name, String descriptor, org.objectweb.asm.Handle bootstrap, Object... bootstrapArguments) - Overrides:
visitInvokeDynamicInsn
in classorg.objectweb.asm.MethodVisitor
-
visitLdcInsn
- Overrides:
visitLdcInsn
in classorg.objectweb.asm.MethodVisitor
-
visitMultiANewArrayInsn
- Overrides:
visitMultiANewArrayInsn
in classorg.objectweb.asm.MethodVisitor
-
visitJumpInsn
public void visitJumpInsn(int opcode, org.objectweb.asm.Label label) - Overrides:
visitJumpInsn
in classorg.objectweb.asm.MethodVisitor
-
visitLabel
public void visitLabel(org.objectweb.asm.Label label) - Overrides:
visitLabel
in classorg.objectweb.asm.MethodVisitor
-
visitLineNumber
public void visitLineNumber(int line, org.objectweb.asm.Label start) - Overrides:
visitLineNumber
in classorg.objectweb.asm.MethodVisitor
-
visitTableSwitchInsn
public void visitTableSwitchInsn(int minimum, int maximum, org.objectweb.asm.Label defaultOption, org.objectweb.asm.Label... option) - Overrides:
visitTableSwitchInsn
in classorg.objectweb.asm.MethodVisitor
-
visitLookupSwitchInsn
public void visitLookupSwitchInsn(org.objectweb.asm.Label defaultOption, int[] key, org.objectweb.asm.Label[] option) - Overrides:
visitLookupSwitchInsn
in classorg.objectweb.asm.MethodVisitor
-
visitTryCatchBlock
public void visitTryCatchBlock(org.objectweb.asm.Label start, org.objectweb.asm.Label end, org.objectweb.asm.Label handler, String type) - Overrides:
visitTryCatchBlock
in classorg.objectweb.asm.MethodVisitor
-