public class GeneratorAdapter extends LocalVariablesSorter
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();
Modifier and Type | Field and Description |
---|---|
static int |
ADD
Constant for the
math(int, clojure.asm.Type) method. |
static int |
AND
Constant for the
math(int, clojure.asm.Type) method. |
static int |
DIV
Constant for the
math(int, clojure.asm.Type) method. |
static int |
EQ
Constant for the
ifCmp(clojure.asm.Type, int, clojure.asm.Label) method. |
static int |
GE
Constant for the
ifCmp(clojure.asm.Type, int, clojure.asm.Label) method. |
static int |
GT
Constant for the
ifCmp(clojure.asm.Type, int, clojure.asm.Label) method. |
static int |
LE
Constant for the
ifCmp(clojure.asm.Type, int, clojure.asm.Label) method. |
static int |
LT
Constant for the
ifCmp(clojure.asm.Type, int, clojure.asm.Label) method. |
static int |
MUL
Constant for the
math(int, clojure.asm.Type) method. |
static int |
NE
Constant for the
ifCmp(clojure.asm.Type, int, clojure.asm.Label) method. |
static int |
NEG
Constant for the
math(int, clojure.asm.Type) method. |
static int |
OR
Constant for the
math(int, clojure.asm.Type) method. |
static int |
REM
Constant for the
math(int, clojure.asm.Type) method. |
static int |
SHL
Constant for the
math(int, clojure.asm.Type) method. |
static int |
SHR
Constant for the
math(int, clojure.asm.Type) method. |
static int |
SUB
Constant for the
math(int, clojure.asm.Type) method. |
static int |
USHR
Constant for the
math(int, clojure.asm.Type) method. |
static int |
XOR
Constant for the
math(int, clojure.asm.Type) method. |
firstLocal, nextLocal
api, mv
Modifier | Constructor and Description |
---|---|
|
GeneratorAdapter(int access,
Method method,
MethodVisitor methodVisitor)
Constructs a new
GeneratorAdapter . |
|
GeneratorAdapter(int access,
Method method,
String signature,
Type[] exceptions,
ClassVisitor classVisitor)
Constructs a new
GeneratorAdapter . |
protected |
GeneratorAdapter(int api,
MethodVisitor methodVisitor,
int access,
String name,
String descriptor)
Constructs a new
GeneratorAdapter . |
|
GeneratorAdapter(MethodVisitor methodVisitor,
int access,
String name,
String descriptor)
Constructs a new
GeneratorAdapter . |
Modifier and Type | Method and Description |
---|---|
void |
arrayLength()
Generates the instruction to compute the length of an array.
|
void |
arrayLoad(Type type)
Generates the instruction to load an element from an array.
|
void |
arrayStore(Type type)
Generates the instruction to store an element in an array.
|
void |
box(Type type)
Generates the instructions to box the top stack value.
|
void |
cast(Type from,
Type to)
Generates the instructions to cast a numerical value from one type to another.
|
void |
catchException(Label start,
Label end,
Type exception)
Marks the start of an exception handler.
|
void |
checkCast(Type type)
Generates the instruction to check that the top stack value is of the given type.
|
void |
dup()
Generates a DUP instruction.
|
void |
dup2()
Generates a DUP2 instruction.
|
void |
dup2X1()
Generates a DUP2_X1 instruction.
|
void |
dup2X2()
Generates a DUP2_X2 instruction.
|
void |
dupX1()
Generates a DUP_X1 instruction.
|
void |
dupX2()
Generates a DUP_X2 instruction.
|
void |
endMethod()
Marks the end of the visited method.
|
int |
getAccess() |
Type[] |
getArgumentTypes() |
void |
getField(Type owner,
String name,
Type type)
Generates the instruction to push the value of a non static field on the stack.
|
Type |
getLocalType(int local)
Returns the type of the given local variable.
|
String |
getName() |
Type |
getReturnType() |
void |
getStatic(Type owner,
String name,
Type type)
Generates the instruction to push the value of a static field on the stack.
|
void |
goTo(Label label)
Generates the instruction to jump to the given label.
|
void |
ifCmp(Type type,
int mode,
Label label)
Generates the instructions to jump to a label based on the comparison of the top two stack
values.
|
void |
ifICmp(int mode,
Label label)
Generates the instructions to jump to a label based on the comparison of the top two integer
stack values.
|
void |
ifNonNull(Label label)
Generates the instruction to jump to the given label if the top stack value is not null.
|
void |
ifNull(Label label)
Generates the instruction to jump to the given label if the top stack value is null.
|
void |
ifZCmp(int mode,
Label label)
Generates the instructions to jump to a label based on the comparison of the top integer stack
value with zero.
|
void |
iinc(int local,
int amount)
Generates the instruction to increment the given local variable.
|
void |
instanceOf(Type type)
Generates the instruction to test if the top stack value is of the given type.
|
void |
invokeConstructor(Type type,
Method method)
Generates the instruction to invoke a constructor.
|
void |
invokeDynamic(String name,
String descriptor,
Handle bootstrapMethodHandle,
Object... bootstrapMethodArguments)
Generates an invokedynamic instruction.
|
void |
invokeInterface(Type owner,
Method method)
Generates the instruction to invoke an interface method.
|
void |
invokeStatic(Type owner,
Method method)
Generates the instruction to invoke a static method.
|
void |
invokeVirtual(Type owner,
Method method)
Generates the instruction to invoke a normal method.
|
void |
loadArg(int arg)
Generates the instruction to load the given method argument on the stack.
|
void |
loadArgArray()
Generates the instructions to load all the method arguments on the stack, as a single object
array.
|
void |
loadArgs()
Generates the instructions to load all the method arguments on the stack.
|
void |
loadArgs(int arg,
int count)
Generates the instructions to load the given method arguments on the stack.
|
void |
loadLocal(int local)
Generates the instruction to load the given local variable on the stack.
|
void |
loadLocal(int local,
Type type)
Generates the instruction to load the given local variable on the stack.
|
void |
loadThis()
Generates the instruction to load 'this' on the stack.
|
Label |
mark()
Marks the current code position with a new label.
|
void |
mark(Label label)
Marks the current code position with the given label.
|
void |
math(int op,
Type type)
Generates the instruction to do the specified mathematical or logical operation.
|
void |
monitorEnter()
Generates the instruction to get the monitor of the top stack value.
|
void |
monitorExit()
Generates the instruction to release the monitor of the top stack value.
|
void |
newArray(Type type)
Generates the instruction to create a new array.
|
void |
newInstance(Type type)
Generates the instruction to create a new object.
|
Label |
newLabel()
Constructs a new
Label . |
void |
not()
Generates the instructions to compute the bitwise negation of the top stack value.
|
void |
pop()
Generates a POP instruction.
|
void |
pop2()
Generates a POP2 instruction.
|
void |
push(boolean value)
Generates the instruction to push the given value on the stack.
|
void |
push(double value)
Generates the instruction to push the given value on the stack.
|
void |
push(float value)
Generates the instruction to push the given value on the stack.
|
void |
push(Handle handle)
Generates the instruction to push a handle on the stack.
|
void |
push(int value)
Generates the instruction to push the given value on the stack.
|
void |
push(long value)
Generates the instruction to push the given value on the stack.
|
void |
push(String value)
Generates the instruction to push the given value on the stack.
|
void |
push(Type value)
Generates the instruction to push the given value on the stack.
|
void |
putField(Type owner,
String name,
Type type)
Generates the instruction to store the top stack value in a non static field.
|
void |
putStatic(Type owner,
String name,
Type type)
Generates the instruction to store the top stack value in a static field.
|
void |
ret(int local)
Generates a RET instruction.
|
void |
returnValue()
Generates the instruction to return the top stack value to the caller.
|
protected void |
setLocalType(int local,
Type type)
Notifies subclasses that a local variable has been added or remapped.
|
void |
storeArg(int arg)
Generates the instruction to store the top stack value in the given method argument.
|
void |
storeLocal(int local)
Generates the instruction to store the top stack value in the given local variable.
|
void |
storeLocal(int local,
Type type)
Generates the instruction to store the top stack value in the given local variable.
|
void |
swap()
Generates a SWAP instruction.
|
void |
swap(Type prev,
Type type)
Generates the instructions to swap the top two stack values.
|
void |
tableSwitch(int[] keys,
TableSwitchGenerator generator)
Generates the instructions for a switch statement.
|
void |
tableSwitch(int[] keys,
TableSwitchGenerator generator,
boolean useTable)
Generates the instructions for a switch statement.
|
void |
throwException()
Generates the instruction to throw an exception.
|
void |
throwException(Type type,
String message)
Generates the instructions to create and throw an exception.
|
void |
unbox(Type type)
Generates the instructions to unbox the top stack value.
|
void |
valueOf(Type type)
Generates the instructions to box the top stack value using Java 5's valueOf() method.
|
newLocal, newLocalMapping, updateNewLocals, visitFrame, visitIincInsn, visitLocalVariable, visitLocalVariableAnnotation, visitMaxs, visitVarInsn
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
public static final int ADD
math(int, clojure.asm.Type)
method.public static final int SUB
math(int, clojure.asm.Type)
method.public static final int MUL
math(int, clojure.asm.Type)
method.public static final int DIV
math(int, clojure.asm.Type)
method.public static final int REM
math(int, clojure.asm.Type)
method.public static final int NEG
math(int, clojure.asm.Type)
method.public static final int SHL
math(int, clojure.asm.Type)
method.public static final int SHR
math(int, clojure.asm.Type)
method.public static final int USHR
math(int, clojure.asm.Type)
method.public static final int AND
math(int, clojure.asm.Type)
method.public static final int OR
math(int, clojure.asm.Type)
method.public static final int XOR
math(int, clojure.asm.Type)
method.public static final int EQ
ifCmp(clojure.asm.Type, int, clojure.asm.Label)
method.public static final int NE
ifCmp(clojure.asm.Type, int, clojure.asm.Label)
method.public static final int LT
ifCmp(clojure.asm.Type, int, clojure.asm.Label)
method.public static final int GE
ifCmp(clojure.asm.Type, int, clojure.asm.Label)
method.public static final int GT
ifCmp(clojure.asm.Type, int, clojure.asm.Label)
method.public static final int LE
ifCmp(clojure.asm.Type, int, clojure.asm.Label)
method.public GeneratorAdapter(MethodVisitor methodVisitor, int access, String name, String descriptor)
GeneratorAdapter
. Subclasses must not use this constructor.
Instead, they must use the GeneratorAdapter(int, MethodVisitor, int, String, String)
version.methodVisitor
- the method visitor to which this adapter delegates calls.access
- the method's access flags (see Opcodes
).name
- the method's name.descriptor
- the method's descriptor (see Type
).IllegalStateException
- if a subclass calls this constructor.protected GeneratorAdapter(int api, MethodVisitor methodVisitor, int access, String name, String descriptor)
GeneratorAdapter
.api
- the ASM API version implemented by this visitor. Must be one of Opcodes.ASM4
, Opcodes.ASM5
, Opcodes.ASM6
or Opcodes.ASM7_EXPERIMENTAL
.methodVisitor
- the method visitor to which this adapter delegates calls.access
- the method's access flags (see Opcodes
).name
- the method's name.descriptor
- the method's descriptor (see Type
).public GeneratorAdapter(int access, Method method, MethodVisitor methodVisitor)
GeneratorAdapter
. Subclasses must not use this constructor.
Instead, they must use the GeneratorAdapter(int, MethodVisitor, int, String, String)
version.access
- access flags of the adapted method.method
- the adapted method.methodVisitor
- the method visitor to which this adapter delegates calls.public GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor classVisitor)
GeneratorAdapter
. Subclasses must not use this constructor.
Instead, they must use the GeneratorAdapter(int, MethodVisitor, int, String, String)
version.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.public int getAccess()
public String getName()
public Type getReturnType()
public Type[] getArgumentTypes()
public void push(boolean value)
value
- the value to be pushed on the stack.public void push(int value)
value
- the value to be pushed on the stack.public void push(long value)
value
- the value to be pushed on the stack.public void push(float value)
value
- the value to be pushed on the stack.public void push(double value)
value
- the value to be pushed on the stack.public void push(String value)
value
- the value to be pushed on the stack. May be null.public void push(Type value)
value
- the value to be pushed on the stack.public void push(Handle handle)
handle
- the handle to be pushed on the stack.public void loadThis()
public void loadArg(int arg)
arg
- the index of a method argument.public void loadArgs(int arg, int count)
arg
- the index of the first method argument to be loaded.count
- the number of method arguments to be loaded.public void loadArgs()
public void loadArgArray()
public void storeArg(int arg)
arg
- the index of a method argument.public Type getLocalType(int local)
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(Type)
.protected void setLocalType(int local, Type type)
LocalVariablesSorter
setLocalType
in class LocalVariablesSorter
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(clojure.asm.Type)
.type
- the type of the value being stored in the local variable.public void loadLocal(int local)
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(Type)
.public void loadLocal(int local, Type type)
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(Type)
.type
- the type of this local variable.public void storeLocal(int local)
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(Type)
.public void storeLocal(int local, Type type)
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(Type)
.type
- the type of this local variable.public void arrayLoad(Type type)
type
- the type of the array element to be loaded.public void arrayStore(Type type)
type
- the type of the array element to be stored.public void pop()
public void pop2()
public void dup()
public void dup2()
public void dupX1()
public void dupX2()
public void dup2X1()
public void dup2X2()
public void swap()
public void swap(Type prev, Type type)
prev
- type of the top - 1 stack value.type
- type of the top stack value.public void math(int op, Type type)
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.public void not()
public void iinc(int local, int amount)
local
- the local variable to be incremented.amount
- the amount by which the local variable must be incremented.public void cast(Type from, Type to)
from
- the type of the top stack valueto
- the type into which this value must be cast.public void box(Type type)
type
- the type of the top stack value.public void valueOf(Type type)
type
- the type of the top stack value.public void unbox(Type type)
type
- the type of the top stack value.public void mark(Label label)
label
- a label.public Label mark()
public void ifCmp(Type type, int mode, Label label)
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.public void ifICmp(int mode, Label label)
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.public void ifZCmp(int mode, Label label)
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.public void ifNull(Label label)
label
- where to jump if the condition is true.public void ifNonNull(Label label)
label
- where to jump if the condition is true.public void goTo(Label label)
label
- where to jump if the condition is true.public void ret(int local)
local
- a local variable identifier, as returned by LocalVariablesSorter.newLocal(Type)
.public void tableSwitch(int[] keys, TableSwitchGenerator generator)
keys
- the switch case keys.generator
- a generator to generate the code for the switch cases.public void tableSwitch(int[] keys, TableSwitchGenerator generator, boolean useTable)
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.public void returnValue()
public void getStatic(Type owner, String name, Type type)
owner
- the class in which the field is defined.name
- the name of the field.type
- the type of the field.public void putStatic(Type owner, String name, Type type)
owner
- the class in which the field is defined.name
- the name of the field.type
- the type of the field.public void getField(Type owner, String name, Type type)
owner
- the class in which the field is defined.name
- the name of the field.type
- the type of the field.public void putField(Type owner, String name, Type type)
owner
- the class in which the field is defined.name
- the name of the field.type
- the type of the field.public void invokeVirtual(Type owner, Method method)
owner
- the class in which the method is defined.method
- the method to be invoked.public void invokeConstructor(Type type, Method method)
type
- the class in which the constructor is defined.method
- the constructor to be invoked.public void invokeStatic(Type owner, Method method)
owner
- the class in which the method is defined.method
- the method to be invoked.public void invokeInterface(Type owner, Method method)
owner
- the class in which the method is defined.method
- the method to be invoked.public void invokeDynamic(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments)
name
- the method's name.descriptor
- the method's descriptor (see Type
).bootstrapMethodHandle
- the bootstrap method.bootstrapMethodArguments
- the bootstrap method constant arguments. Each argument must be
an Integer
, Float
, Long
, Double
, String
, Type
or Handle
value. This method is allowed to modify the content of the array so
a caller should expect that this array may change.public void newInstance(Type type)
type
- the class of the object to be created.public void newArray(Type type)
type
- the type of the array elements.public void arrayLength()
public void throwException()
public void throwException(Type type, String message)
type
- the class of the exception to be thrown.message
- the detailed message of the exception.public void checkCast(Type type)
type
- a class or interface type.public void instanceOf(Type type)
type
- a class or interface type.public void monitorEnter()
public void monitorExit()
public void endMethod()
public void catchException(Label start, Label end, Type exception)
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.Copyright © 2024. All rights reserved.