Package io.ebean.enhance.asm.commons
Class GeneratorAdapter
java.lang.Object
io.ebean.enhance.asm.MethodVisitor
io.ebean.enhance.asm.commons.LocalVariablesSorter
io.ebean.enhance.asm.commons.GeneratorAdapter
- Direct Known Subclasses:
AdviceAdapter
A
MethodVisitor with convenient methods to generate code. For example, using this
adapter, the class below
public class Example {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
can be generated as follows:
ClassWriter cw = new ClassWriter(0);
cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
Method m = Method.getMethod("void <init> ()");
GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw);
mg.loadThis();
mg.invokeConstructor(Type.getType(Object.class), m);
mg.returnValue();
mg.endMethod();
m = Method.getMethod("void main (String[])");
mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
mg.push("Hello world!");
mg.invokeVirtual(Type.getType(PrintStream.class),
Method.getMethod("void println (String)"));
mg.returnValue();
mg.endMethod();
cw.visitEnd();
- Author:
- Juozas Baliuka, Chris Nokleberg, Eric Bruneton, Prashant Deva
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.static final intConstant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.static final intConstant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.static final intConstant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.static final intConstant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method.static final intConstant for themath(int, io.ebean.enhance.asm.Type)method. -
Constructor Summary
ConstructorsConstructorDescriptionGeneratorAdapter(int access, Method method, MethodVisitor methodVisitor) Constructs a newGeneratorAdapter.GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor classVisitor) Constructs a newGeneratorAdapter.GeneratorAdapter(MethodVisitor methodVisitor, int access, String name, String descriptor) Constructs a newGeneratorAdapter. -
Method Summary
Modifier and TypeMethodDescriptionvoidGenerates the instruction to compute the length of an array.voidGenerates the instruction to load an element from an array.voidarrayStore(Type type) Generates the instruction to store an element in an array.voidGenerates the instructions to box the top stack value.voidGenerates the instructions to cast a numerical value from one type to another.voidcatchException(Label start, Label end, Type exception) Marks the start of an exception handler.voidGenerates the instruction to check that the top stack value is of the given type.voiddup()Generates a DUP instruction.voiddup2()Generates a DUP2 instruction.voiddup2X1()Generates a DUP2_X1 instruction.voiddup2X2()Generates a DUP2_X2 instruction.voiddupX1()Generates a DUP_X1 instruction.voiddupX2()Generates a DUP_X2 instruction.voidMarks the end of the visited method.intType[]voidGenerates the instruction to push the value of a non static field on the stack.getLocalType(int local) Returns the type of the given local variable.getName()voidGenerates the instruction to push the value of a static field on the stack.voidGenerates the instruction to jump to the given label.voidGenerates the instructions to jump to a label based on the comparison of the top two stack values.voidGenerates the instructions to jump to a label based on the comparison of the top two integer stack values.voidGenerates the instruction to jump to the given label if the top stack value is not null.voidGenerates the instruction to jump to the given label if the top stack value is null.voidGenerates the instructions to jump to a label based on the comparison of the top integer stack value with zero.voidiinc(int local, int amount) Generates the instruction to increment the given local variable.voidinstanceOf(Type type) Generates the instruction to test if the top stack value is of the given type.voidinvokeConstructor(Type type, Method method) Generates the instruction to invoke a constructor.voidinvokeDynamic(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) Generates an invokedynamic instruction.voidinvokeInterface(Type owner, Method method) Generates the instruction to invoke an interface method.voidinvokeStatic(Type owner, Method method) Generates the instruction to invoke a static method.voidinvokeVirtual(Type owner, Method method) Generates the instruction to invoke a normal method.voidloadArg(int arg) Generates the instruction to load the given method argument on the stack.voidGenerates the instructions to load all the method arguments on the stack, as a single object array.voidloadArgs()Generates the instructions to load all the method arguments on the stack.voidloadArgs(int arg, int count) Generates the instructions to load the given method arguments on the stack.voidloadLocal(int local) Generates the instruction to load the given local variable on the stack.voidGenerates the instruction to load the given local variable on the stack.voidloadThis()Generates the instruction to load 'this' on the stack.mark()Marks the current code position with a new label.voidMarks the current code position with the given label.voidGenerates the instruction to do the specified mathematical or logical operation.voidGenerates the instruction to get the monitor of the top stack value.voidGenerates the instruction to release the monitor of the top stack value.voidGenerates the instruction to create a new array.voidnewInstance(Type type) Generates the instruction to create a new object.newLabel()Constructs a newLabel.voidnot()Generates the instructions to compute the bitwise negation of the top stack value.voidpop()Generates a POP instruction.voidpop2()Generates a POP2 instruction.voidpush(boolean value) Generates the instruction to push the given value on the stack.voidpush(double value) Generates the instruction to push the given value on the stack.voidpush(float value) Generates the instruction to push the given value on the stack.voidpush(int value) Generates the instruction to push the given value on the stack.voidpush(long value) Generates the instruction to push the given value on the stack.voidpush(ConstantDynamic constantDynamic) Generates the instruction to push a constant dynamic on the stack.voidGenerates the instruction to push a handle on the stack.voidGenerates the instruction to push the given value on the stack.voidGenerates the instruction to push the given value on the stack.voidGenerates the instruction to store the top stack value in a non static field.voidGenerates the instruction to store the top stack value in a static field.voidret(int local) Generates a RET instruction.voidGenerates the instruction to return the top stack value to the caller.voidstoreArg(int arg) Generates the instruction to store the top stack value in the given method argument.voidstoreLocal(int local) Generates the instruction to store the top stack value in the given local variable.voidstoreLocal(int local, Type type) Generates the instruction to store the top stack value in the given local variable.voidswap()Generates a SWAP instruction.voidGenerates the instructions to swap the top two stack values.voidtableSwitch(int[] keys, TableSwitchGenerator generator) Generates the instructions for a switch statement.voidtableSwitch(int[] keys, TableSwitchGenerator generator, boolean useTable) Generates the instructions for a switch statement.voidGenerates the instruction to throw an exception.voidthrowException(Type type, String message) Generates the instructions to create and throw an exception.voidGenerates the instructions to unbox the top stack value.voidGenerates the instructions to box the top stack value using Java 5's valueOf() method.Methods inherited from class io.ebean.enhance.asm.commons.LocalVariablesSorter
newLocal, visitFrame, visitIincInsn, visitLocalVariable, visitLocalVariableAnnotation, visitMaxs, visitVarInsnMethods inherited from class io.ebean.enhance.asm.MethodVisitor
visitAnnotableParameterCount, visitAnnotation, visitAnnotationDefault, visitAttribute, visitCode, visitEnd, visitFieldInsn, visitInsn, visitInsnAnnotation, visitIntInsn, visitInvokeDynamicInsn, visitJumpInsn, visitLabel, visitLdcInsn, visitLineNumber, visitLookupSwitchInsn, visitMethodInsn, visitMethodInsn, visitMultiANewArrayInsn, visitParameter, visitParameterAnnotation, visitTableSwitchInsn, visitTryCatchAnnotation, visitTryCatchBlock, visitTypeAnnotation, visitTypeInsn
-
Field Details
-
ADD
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
SUB
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
MUL
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
DIV
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
REM
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
NEG
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
SHL
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
SHR
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
USHR
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
AND
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
OR
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
XOR
Constant for themath(int, io.ebean.enhance.asm.Type)method.- See Also:
-
EQ
Constant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.- See Also:
-
NE
Constant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.- See Also:
-
LT
Constant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.- See Also:
-
GE
Constant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.- See Also:
-
GT
Constant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.- See Also:
-
LE
Constant for theifCmp(io.ebean.enhance.asm.Type, int, io.ebean.enhance.asm.Label)method.- See Also:
-
-
Constructor Details
-
GeneratorAdapter
Constructs a newGeneratorAdapter. Subclasses must not use this constructor. Instead, they must use theGeneratorAdapter(int, MethodVisitor, int, String, String)version.- Parameters:
methodVisitor- the method visitor to which this adapter delegates calls.access- the method's access flags (seeOpcodes).name- the method's name.descriptor- the method's descriptor (seeType).- Throws:
IllegalStateException- if a subclass calls this constructor.
-
GeneratorAdapter
Constructs a newGeneratorAdapter. Subclasses must not use this constructor. Instead, they must use theGeneratorAdapter(int, MethodVisitor, int, String, String)version.- Parameters:
access- access flags of the adapted method.method- the adapted method.methodVisitor- the method visitor to which this adapter delegates calls.
-
GeneratorAdapter
public GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor classVisitor) Constructs a newGeneratorAdapter. Subclasses must not use this constructor. Instead, they must use theGeneratorAdapter(int, MethodVisitor, int, String, String)version.- Parameters:
access- access flags of the adapted method.method- the adapted method.signature- the signature of the adapted method (may be null).exceptions- the exceptions thrown by the adapted method (may be null).classVisitor- the class visitor to which this adapter delegates calls.
-
-
Method Details
-
getAccess
-
getName
-
getReturnType
-
getArgumentTypes
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack.
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack.
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack.
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack.
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack.
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack. May be null.
-
push
Generates the instruction to push the given value on the stack.- Parameters:
value- the value to be pushed on the stack.
-
push
Generates the instruction to push a handle on the stack.- Parameters:
handle- the handle to be pushed on the stack.
-
push
Generates the instruction to push a constant dynamic on the stack.- Parameters:
constantDynamic- the constant dynamic to be pushed on the stack.
-
loadThis
Generates the instruction to load 'this' on the stack. -
loadArg
Generates the instruction to load the given method argument on the stack.- Parameters:
arg- the index of a method argument.
-
loadArgs
Generates the instructions to load the given method arguments on the stack.- Parameters:
arg- the index of the first method argument to be loaded.count- the number of method arguments to be loaded.
-
loadArgs
Generates the instructions to load all the method arguments on the stack. -
loadArgArray
Generates the instructions to load all the method arguments on the stack, as a single object array. -
storeArg
Generates the instruction to store the top stack value in the given method argument.- Parameters:
arg- the index of a method argument.
-
getLocalType
Returns the type of the given local variable.- Parameters:
local- a local variable identifier, as returned byLocalVariablesSorter.newLocal(Type).- Returns:
- the type of the given local variable.
-
loadLocal
Generates the instruction to load the given local variable on the stack.- Parameters:
local- a local variable identifier, as returned byLocalVariablesSorter.newLocal(Type).
-
loadLocal
Generates the instruction to load the given local variable on the stack.- Parameters:
local- a local variable identifier, as returned byLocalVariablesSorter.newLocal(Type).type- the type of this local variable.
-
storeLocal
Generates the instruction to store the top stack value in the given local variable.- Parameters:
local- a local variable identifier, as returned byLocalVariablesSorter.newLocal(Type).
-
storeLocal
Generates the instruction to store the top stack value in the given local variable.- Parameters:
local- a local variable identifier, as returned byLocalVariablesSorter.newLocal(Type).type- the type of this local variable.
-
arrayLoad
Generates the instruction to load an element from an array.- Parameters:
type- the type of the array element to be loaded.
-
arrayStore
Generates the instruction to store an element in an array.- Parameters:
type- the type of the array element to be stored.
-
pop
Generates a POP instruction. -
pop2
Generates a POP2 instruction. -
dup
Generates a DUP instruction. -
dup2
Generates a DUP2 instruction. -
dupX1
Generates a DUP_X1 instruction. -
dupX2
Generates a DUP_X2 instruction. -
dup2X1
Generates a DUP2_X1 instruction. -
dup2X2
Generates a DUP2_X2 instruction. -
swap
Generates a SWAP instruction. -
swap
Generates the instructions to swap the top two stack values.- Parameters:
prev- type of the top - 1 stack value.type- type of the top stack value.
-
math
Generates the instruction to do the specified mathematical or logical operation.- Parameters:
op- a mathematical or logical operation. Must be one of ADD, SUB, MUL, DIV, REM, NEG, SHL, SHR, USHR, AND, OR, XOR.type- the type of the operand(s) for this operation.
-
not
Generates the instructions to compute the bitwise negation of the top stack value. -
iinc
Generates the instruction to increment the given local variable.- Parameters:
local- the local variable to be incremented.amount- the amount by which the local variable must be incremented.
-
cast
Generates the instructions to cast a numerical value from one type to another.- Parameters:
from- the type of the top stack valueto- the type into which this value must be cast.
-
box
Generates the instructions to box the top stack value. This value is replaced by its boxed equivalent on top of the stack.- Parameters:
type- the type of the top stack value.
-
valueOf
Generates the instructions to box the top stack value using Java 5's valueOf() method. This value is replaced by its boxed equivalent on top of the stack.- Parameters:
type- the type of the top stack value.
-
unbox
Generates the instructions to unbox the top stack value. This value is replaced by its unboxed equivalent on top of the stack.- Parameters:
type- the type of the top stack value.
-
newLabel
Constructs a newLabel.- Returns:
- a new
Label.
-
mark
Marks the current code position with the given label.- Parameters:
label- a label.
-
mark
Marks the current code position with a new label.- Returns:
- the label that was created to mark the current code position.
-
ifCmp
Generates the instructions to jump to a label based on the comparison of the top two stack values.- Parameters:
type- the type of the top two stack values.mode- how these values must be compared. One of EQ, NE, LT, GE, GT, LE.label- where to jump if the comparison result is true.
-
ifICmp
Generates the instructions to jump to a label based on the comparison of the top two integer stack values.- Parameters:
mode- how these values must be compared. One of EQ, NE, LT, GE, GT, LE.label- where to jump if the comparison result is true.
-
ifZCmp
Generates the instructions to jump to a label based on the comparison of the top integer stack value with zero.- Parameters:
mode- how these values must be compared. One of EQ, NE, LT, GE, GT, LE.label- where to jump if the comparison result is true.
-
ifNull
Generates the instruction to jump to the given label if the top stack value is null.- Parameters:
label- where to jump if the condition is true.
-
ifNonNull
Generates the instruction to jump to the given label if the top stack value is not null.- Parameters:
label- where to jump if the condition is true.
-
goTo
Generates the instruction to jump to the given label.- Parameters:
label- where to jump if the condition is true.
-
ret
Generates a RET instruction.- Parameters:
local- a local variable identifier, as returned byLocalVariablesSorter.newLocal(Type).
-
tableSwitch
Generates the instructions for a switch statement.- Parameters:
keys- the switch case keys.generator- a generator to generate the code for the switch cases.
-
tableSwitch
Generates the instructions for a switch statement.- Parameters:
keys- the switch case keys.generator- a generator to generate the code for the switch cases.useTable- true to use a TABLESWITCH instruction, or false to use a LOOKUPSWITCH instruction.
-
returnValue
Generates the instruction to return the top stack value to the caller. -
getStatic
Generates the instruction to push the value of a static field on the stack.- Parameters:
owner- the class in which the field is defined.name- the name of the field.type- the type of the field.
-
putStatic
Generates the instruction to store the top stack value in a static field.- Parameters:
owner- the class in which the field is defined.name- the name of the field.type- the type of the field.
-
getField
Generates the instruction to push the value of a non static field on the stack.- Parameters:
owner- the class in which the field is defined.name- the name of the field.type- the type of the field.
-
putField
Generates the instruction to store the top stack value in a non static field.- Parameters:
owner- the class in which the field is defined.name- the name of the field.type- the type of the field.
-
invokeVirtual
Generates the instruction to invoke a normal method.- Parameters:
owner- the class in which the method is defined.method- the method to be invoked.
-
invokeConstructor
Generates the instruction to invoke a constructor.- Parameters:
type- the class in which the constructor is defined.method- the constructor to be invoked.
-
invokeStatic
Generates the instruction to invoke a static method.- Parameters:
owner- the class in which the method is defined.method- the method to be invoked.
-
invokeInterface
Generates the instruction to invoke an interface method.- Parameters:
owner- the class in which the method is defined.method- the method to be invoked.
-
invokeDynamic
public void invokeDynamic(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) Generates an invokedynamic instruction.- Parameters:
name- the method's name.descriptor- the method's descriptor (seeType).bootstrapMethodHandle- the bootstrap method.bootstrapMethodArguments- the bootstrap method constant arguments. Each argument must be anInteger,Float,Long,Double,String,TypeorHandlevalue. This method is allowed to modify the content of the array so a caller should expect that this array may change.
-
newInstance
Generates the instruction to create a new object.- Parameters:
type- the class of the object to be created.
-
newArray
Generates the instruction to create a new array.- Parameters:
type- the type of the array elements.
-
arrayLength
Generates the instruction to compute the length of an array. -
throwException
Generates the instruction to throw an exception. -
throwException
Generates the instructions to create and throw an exception. The exception class must have a constructor with a single String argument.- Parameters:
type- the class of the exception to be thrown.message- the detailed message of the exception.
-
checkCast
Generates the instruction to check that the top stack value is of the given type.- Parameters:
type- a class or interface type.
-
instanceOf
Generates the instruction to test if the top stack value is of the given type.- Parameters:
type- a class or interface type.
-
monitorEnter
Generates the instruction to get the monitor of the top stack value. -
monitorExit
Generates the instruction to release the monitor of the top stack value. -
endMethod
Marks the end of the visited method. -
catchException
Marks the start of an exception handler.- Parameters:
start- beginning of the exception handler's scope (inclusive).end- end of the exception handler's scope (exclusive).exception- internal name of the type of exceptions handled by the handler.
-