public class StackAwareMethodVisitor extends 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.
Important: It is not always possible to apply this method visitor if it is applied to a class file compiled
for Java 5 or earlier, or if frames are computed by ASM and not passed to this visitor, if a method also contains
Opcodes.GOTO
instructions. In the latter case, the stack is assumed empty after the instruction. If this
is a problem, stack adjustment can be disabled by setting UNADJUSTED_PROPERTY
to
true
. With this setting, Byte Buddy does no longer attempt draining non-empty stacks and skips this visitor
in all cases. This might however lead to verification problems if stacks are left non-empty. As the latter happens
more common and since this visitor is applied defensively, using this wrapper is considered the more sensible default.
Modifier and Type | Field and Description |
---|---|
static boolean |
UNADJUSTED
true if stack adjustment is disabled. |
static String |
UNADJUSTED_PROPERTY
A property to disable stack adjustment.
|
api, mv
Modifier | Constructor and Description |
---|---|
protected |
StackAwareMethodVisitor(MethodVisitor methodVisitor,
MethodDescription instrumentedMethod)
Creates a new stack aware method visitor.
|
Modifier and Type | Method and Description |
---|---|
void |
drainStack()
Pops all values currently on the stack.
|
int |
drainStack(int store,
int load,
StackSize size)
Drains the stack to only contain the top value.
|
static MethodVisitor |
of(MethodVisitor methodVisitor,
MethodDescription instrumentedMethod)
Wraps the provided method visitor within a stack aware method visitor.
|
void |
register(Label label,
List<StackSize> stackSizes)
Explicitly registers a label to define a given stack state.
|
void |
visitFieldInsn(int opcode,
String owner,
String name,
String descriptor) |
void |
visitFrame(int type,
int localVariableLength,
Object[] localVariable,
int stackSize,
Object[] stack) |
void |
visitInsn(int opcode) |
void |
visitIntInsn(int opcode,
int operand) |
void |
visitInvokeDynamicInsn(String name,
String descriptor,
Handle bootstrap,
Object... bootstrapArguments) |
void |
visitJumpInsn(int opcode,
Label label) |
void |
visitLabel(Label label) |
void |
visitLdcInsn(Object value) |
void |
visitLineNumber(int line,
Label start) |
void |
visitLookupSwitchInsn(Label defaultOption,
int[] key,
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,
Label defaultOption,
Label... option) |
void |
visitTryCatchBlock(Label start,
Label end,
Label handler,
String type) |
void |
visitTypeInsn(int opcode,
String type) |
void |
visitVarInsn(int opcode,
int variable) |
getDelegate, visitAnnotableParameterCount, visitAnnotation, visitAnnotationDefault, visitAttribute, visitCode, visitEnd, visitIincInsn, visitInsnAnnotation, visitLocalVariable, visitLocalVariableAnnotation, visitMaxs, visitMethodInsn, visitParameter, visitParameterAnnotation, visitTryCatchAnnotation, visitTypeAnnotation
public static final String UNADJUSTED_PROPERTY
public static final boolean UNADJUSTED
true
if stack adjustment is disabled.protected StackAwareMethodVisitor(MethodVisitor methodVisitor, MethodDescription instrumentedMethod)
methodVisitor
- The method visitor to delegate operations to.instrumentedMethod
- The method description for which this method visitor is applied.public static MethodVisitor of(MethodVisitor methodVisitor, MethodDescription instrumentedMethod)
methodVisitor
- The method visitor to delegate operations to.instrumentedMethod
- The method description for which this method visitor is applied.public void drainStack()
public int drainStack(int store, int load, StackSize size)
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.public void register(Label label, List<StackSize> stackSizes)
label
- The label to register a stack state for.stackSizes
- The stack sizes to assume when reaching the supplied label.public void visitInsn(int opcode)
visitInsn
in class MethodVisitor
public void visitIntInsn(int opcode, int operand)
visitIntInsn
in class MethodVisitor
public void visitVarInsn(int opcode, int variable)
visitVarInsn
in class MethodVisitor
public void visitTypeInsn(int opcode, String type)
visitTypeInsn
in class MethodVisitor
public void visitFieldInsn(int opcode, String owner, String name, String descriptor)
visitFieldInsn
in class MethodVisitor
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
visitMethodInsn
in class MethodVisitor
public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrap, Object... bootstrapArguments)
visitInvokeDynamicInsn
in class MethodVisitor
public void visitLdcInsn(Object value)
visitLdcInsn
in class MethodVisitor
public void visitMultiANewArrayInsn(String descriptor, int dimension)
visitMultiANewArrayInsn
in class MethodVisitor
public void visitJumpInsn(int opcode, Label label)
visitJumpInsn
in class MethodVisitor
public void visitLabel(Label label)
visitLabel
in class MethodVisitor
public void visitLineNumber(int line, Label start)
visitLineNumber
in class MethodVisitor
public void visitTableSwitchInsn(int minimum, int maximum, Label defaultOption, Label... option)
visitTableSwitchInsn
in class MethodVisitor
public void visitLookupSwitchInsn(Label defaultOption, int[] key, Label[] option)
visitLookupSwitchInsn
in class MethodVisitor
public void visitTryCatchBlock(Label start, Label end, Label handler, @MaybeNull String type)
visitTryCatchBlock
in class MethodVisitor
public void visitFrame(int type, int localVariableLength, @MaybeNull Object[] localVariable, int stackSize, @MaybeNull Object[] stack)
visitFrame
in class MethodVisitor
Copyright © 2014–2023. All rights reserved.