public class CodeAttribute extends Attribute
Modifier and Type | Field and Description |
---|---|
private java.util.List<Attribute> |
attributes |
private ConstPool |
constPool |
private StackFrame |
currentFrame |
private int |
currentOffset |
private java.io.DataOutputStream |
data |
private java.util.List<ExceptionHandler> |
exceptionTable |
private java.io.ByteArrayOutputStream |
finalDataBytes |
private java.util.Map<java.lang.Integer,java.lang.Integer> |
jumpLocations
maps bytecode offsets to jump locations.
|
private java.util.Map<java.lang.Integer,java.lang.Integer> |
jumpLocations32
maps bytecode offsets to jump locations.
|
private int |
maxLocals |
private int |
maxStackDepth |
private ClassMethod |
method |
static java.lang.String |
NAME |
private java.util.LinkedHashMap<java.lang.Integer,StackFrame> |
stackFrames |
private boolean |
stackMapAttributeValid |
private StackMapTableAttribute |
stackMapTableAttribute |
Constructor and Description |
---|
CodeAttribute(ClassMethod method,
ConstPool constPool) |
Modifier and Type | Method and Description |
---|---|
void |
aaload() |
void |
aastore() |
void |
aconstNull() |
private void |
addIf(CodeLocation location,
int opcode,
java.lang.String name) |
private BranchEnd |
addIf(int opcode,
java.lang.String name) |
private void |
addIfIcmp(CodeLocation location,
int opcode,
java.lang.String name) |
private BranchEnd |
addIfIcmp(int opcode,
java.lang.String name) |
private void |
addNullComparison(CodeLocation location,
int opcode,
java.lang.String name) |
private BranchEnd |
addNullComparison(int opcode,
java.lang.String name) |
private void |
advanceFrame(StackFrame frame) |
void |
aload(int no) |
void |
anewarray(java.lang.String arrayType) |
void |
arraylength() |
void |
assertNotWideOnStack(int position,
java.lang.String message) |
void |
assertNotWideOnStack(java.lang.String message) |
void |
assertTypeOnStack(int position,
StackEntryType type,
java.lang.String message) |
void |
assertTypeOnStack(StackEntryType type,
java.lang.String message) |
void |
astore(int no) |
void |
athrow() |
void |
baload() |
void |
bastore() |
void |
bipush(byte value) |
void |
branchEnd(BranchEnd end)
marks the end of a branch.
|
void |
caload() |
void |
castore() |
void |
checkcast(java.lang.Class<?> clazz) |
void |
checkcast(java.lang.String className)
Do not use Descriptor format (e.g.
|
void |
d2f() |
void |
d2i() |
void |
d2l() |
void |
dadd() |
void |
daload() |
void |
dastore() |
void |
dcmpg() |
void |
dcmpl() |
void |
dconst(double value)
Adds the appropriate dconst instruction.
|
void |
ddiv() |
void |
dload(int no) |
void |
dmul() |
void |
dneg() |
void |
drem() |
void |
dstore(int no) |
void |
dsub() |
void |
dup() |
void |
dup2() |
void |
dup2X1() |
void |
dup2X2() |
private void |
duplicateFrame()
Adds a duplicate of the current frame to the current position.
|
void |
dupX1() |
void |
dupX2() |
void |
exceptionBlockEnd(ExceptionHandler handler)
Mark the end of an exception handler block.
|
ExceptionHandler |
exceptionBlockStart(java.lang.String exceptionType)
Begin writing an exception handler block.
|
void |
exceptionHandlerStart(ExceptionHandler handler)
Marks the current code location as the exception handler and adds the handler to the exception handler table;
|
void |
f2d() |
void |
f2i() |
void |
f2l() |
void |
fadd() |
void |
faload() |
void |
fastore() |
void |
fcmpg() |
void |
fcmpl() |
void |
fconst(float value)
Adds the appropriate fconst instruction.
|
void |
fdiv() |
void |
fload(int no) |
void |
fmul() |
void |
fneg() |
void |
frem() |
void |
fstore(int no) |
void |
fsub() |
ConstPool |
getConstPool() |
void |
getfield(java.lang.String className,
java.lang.String field,
java.lang.Class<?> fieldType) |
void |
getfield(java.lang.String className,
java.lang.String field,
java.lang.String descriptor) |
private LocalVariableState |
getLocalVars() |
private StackState |
getStack() |
java.util.LinkedHashMap<java.lang.Integer,StackFrame> |
getStackFrames() |
void |
getstatic(java.lang.String className,
java.lang.String field,
java.lang.Class<?> fieldType) |
void |
getstatic(java.lang.String className,
java.lang.String field,
java.lang.String descriptor) |
BranchEnd |
gotoInstruction()
writes a goto instruction.
|
void |
gotoInstruction(CodeLocation location)
writes a goto instruction.
|
void |
i2b() |
void |
i2c() |
void |
i2d() |
void |
i2f() |
void |
i2l() |
void |
i2s() |
void |
iadd() |
void |
iaload() |
void |
iand() |
void |
iastore() |
void |
iconst(int value)
Adds the appropriate iconst instruction.
|
void |
idiv() |
BranchEnd |
ifAcmpeq() |
void |
ifAcmpeq(CodeLocation location) |
BranchEnd |
ifAcmpne() |
void |
ifAcmpne(CodeLocation location) |
BranchEnd |
ifeq() |
void |
ifEq(CodeLocation location) |
BranchEnd |
ifge() |
void |
ifge(CodeLocation location) |
BranchEnd |
ifgt() |
void |
ifgt(CodeLocation location) |
BranchEnd |
ifIcmpeq() |
void |
ifIcmpeq(CodeLocation location) |
BranchEnd |
ifIcmpge() |
void |
ifIcmpge(CodeLocation location) |
BranchEnd |
ifIcmpgt() |
void |
ifIcmpgt(CodeLocation location) |
BranchEnd |
ifIcmple() |
void |
ifIcmple(CodeLocation location) |
BranchEnd |
ifIcmplt() |
void |
ifIcmplt(CodeLocation location) |
BranchEnd |
ifIcmpne() |
void |
ifIcmpne(CodeLocation location) |
BranchEnd |
ifle() |
void |
ifle(CodeLocation location) |
BranchEnd |
iflt() |
void |
iflt(CodeLocation location) |
BranchEnd |
ifne() |
void |
ifne(CodeLocation location) |
BranchEnd |
ifnotnull() |
void |
ifnotnull(CodeLocation location) |
BranchEnd |
ifnull()
Jump to the given location if the reference type on the top of the stack is null.
|
void |
ifnull(CodeLocation location)
Jump to the given location if the reference type on the top of the stack is null
|
void |
iinc(int local,
int amount) |
void |
iload(int no) |
void |
imul() |
void |
ineg() |
void |
instanceofInstruction(java.lang.String className) |
void |
invokeinterface(java.lang.reflect.Method method) |
void |
invokeinterface(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor) |
void |
invokeinterface(java.lang.String className,
java.lang.String methodName,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
private void |
invokeinterface(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
void |
invokespecial(java.lang.reflect.Constructor<?> constructor) |
void |
invokespecial(java.lang.reflect.Method method) |
void |
invokespecial(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor) |
void |
invokespecial(java.lang.String className,
java.lang.String methodName,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
private void |
invokespecial(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
void |
invokestatic(java.lang.reflect.Method method) |
void |
invokestatic(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor) |
void |
invokestatic(java.lang.String className,
java.lang.String methodName,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
private void |
invokestatic(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
void |
invokevirtual(java.lang.reflect.Method method) |
void |
invokevirtual(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor) |
void |
invokevirtual(java.lang.String className,
java.lang.String methodName,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
private void |
invokevirtual(java.lang.String className,
java.lang.String methodName,
java.lang.String descriptor,
java.lang.String returnType,
java.lang.String[] parameterTypes) |
void |
ior() |
void |
irem() |
void |
ishl() |
void |
ishr() |
void |
istore(int no) |
void |
isub() |
void |
iushr() |
void |
ixor() |
void |
l2d() |
void |
l2f() |
void |
l2i() |
void |
ladd() |
void |
laload() |
void |
land() |
void |
lastore() |
void |
lcmp() |
void |
lconst(long value)
Adds the appropriate lconst instruction.
|
void |
ldc(float value)
Adds an ldc instruction for float
|
void |
ldc(int value)
Adds an ldc instruction for an int.
|
void |
ldc(java.lang.String value)
Adds an ldc instruction for a String
To load a class literal using ldc use the @{link #loadType(String)} method.
|
void |
ldc2(double value)
Adds an ldc2_w instruction for double
|
void |
ldc2(long value)
Adds an ldc2_w instruction for long
|
private void |
ldcInternal(int index)
Adds an ldc instruction for an int.
|
void |
ldiv() |
void |
lload(int no) |
void |
lmul() |
void |
lneg() |
void |
load(java.lang.Class<?> type,
int no)
Generates the apprpriate load instruction for the given type
|
void |
load(java.lang.String descriptor,
int no)
Generates the apprpriate load instruction for the given type
|
void |
loadClass(java.lang.String className) |
void |
loadMethodParameters()
loads all parameters onto the stack.
|
void |
loadType(java.lang.String descriptor)
Loads a java.lang.Class for the given descriptor into the stack.
|
void |
lookupswitch(LookupSwitchBuilder lookupSwitchBuilder)
Adds a lookup switch statement
|
void |
lor() |
void |
lrem() |
void |
lshl() |
void |
lshr() |
void |
lstore(int no) |
void |
lsub() |
void |
lushr() |
void |
lxor() |
CodeLocation |
mark()
Gets the location object for the current location in the bytecode.
|
private void |
mergeStackFrames(StackFrame stackFrame)
Merge the stack frames.
|
void |
monitorenter() |
void |
monitorexit() |
void |
multianewarray(java.lang.String arrayType,
int dimensions) |
void |
newarray(java.lang.Class<?> arrayType)
arrayType must be a
Class object that represents a primitive type |
void |
newInstruction(java.lang.Class<?> clazz) |
void |
newInstruction(java.lang.String classname) |
void |
nop() |
private void |
overwriteInt(byte[] bytecode,
int offset,
int value)
overwrites a 32 bit value in the already written bytecode data
|
private void |
overwriteShort(byte[] bytecode,
int offset,
int value)
overwrites a 16 bit value in the already written bytecode data
|
void |
pop() |
void |
pop2() |
void |
putfield(java.lang.String className,
java.lang.String field,
java.lang.Class<?> fieldType) |
void |
putfield(java.lang.String className,
java.lang.String field,
java.lang.String descriptor) |
void |
putstatic(java.lang.String className,
java.lang.String field,
java.lang.Class<?> fieldType) |
void |
putstatic(java.lang.String className,
java.lang.String field,
java.lang.String descriptor) |
void |
returnInstruction()
Adds the appropriate return instruction for the methods return type.
|
void |
saload() |
void |
sastore() |
void |
setupFrame(java.lang.String... types) |
void |
sipush(short value) |
void |
swap() |
void |
tableswitch(TableSwitchBuilder builder) |
private void |
updateMaxValues() |
private void |
writeByte(int n) |
void |
writeData(ByteArrayDataOutputStream stream) |
private void |
writeInt(int n) |
private void |
writeShort(int n) |
public static final java.lang.String NAME
private final ClassMethod method
private final ConstPool constPool
private final java.io.ByteArrayOutputStream finalDataBytes
private final java.io.DataOutputStream data
private int maxLocals
private int maxStackDepth
private final java.util.LinkedHashMap<java.lang.Integer,StackFrame> stackFrames
private final java.util.Map<java.lang.Integer,java.lang.Integer> jumpLocations
private final java.util.Map<java.lang.Integer,java.lang.Integer> jumpLocations32
private StackFrame currentFrame
private int currentOffset
private final java.util.List<Attribute> attributes
private boolean stackMapAttributeValid
private final StackMapTableAttribute stackMapTableAttribute
private final java.util.List<ExceptionHandler> exceptionTable
public CodeAttribute(ClassMethod method, ConstPool constPool)
public void writeData(ByteArrayDataOutputStream stream) throws java.io.IOException
public void aaload()
public void aastore()
public void aconstNull()
public void aload(int no)
public void anewarray(java.lang.String arrayType)
public void arraylength()
public void astore(int no)
public void athrow()
public void baload()
public void bastore()
public void caload()
public void castore()
public void bipush(byte value)
public void branchEnd(BranchEnd end)
public void checkcast(java.lang.String className)
public void checkcast(java.lang.Class<?> clazz)
public void d2f()
public void d2i()
public void d2l()
public void dadd()
public void daload()
public void dastore()
public void dcmpg()
public void dcmpl()
public void dconst(double value)
public void ddiv()
public void dload(int no)
public void dmul()
public void dneg()
public void drem()
public void dstore(int no)
public void dsub()
public void dup()
public void dupX1()
public void dupX2()
public void dup2()
public void dup2X1()
public void dup2X2()
public ExceptionHandler exceptionBlockStart(java.lang.String exceptionType)
public void exceptionBlockEnd(ExceptionHandler handler)
public void exceptionHandlerStart(ExceptionHandler handler)
public void f2d()
public void f2i()
public void f2l()
public void fadd()
public void faload()
public void fastore()
public void fcmpg()
public void fcmpl()
public void fconst(float value)
public void fdiv()
public void fload(int no)
public void fmul()
public void fneg()
public void frem()
public void fstore(int no)
public void fsub()
public void getfield(java.lang.String className, java.lang.String field, java.lang.Class<?> fieldType)
public void getfield(java.lang.String className, java.lang.String field, java.lang.String descriptor)
public void getstatic(java.lang.String className, java.lang.String field, java.lang.Class<?> fieldType)
public void getstatic(java.lang.String className, java.lang.String field, java.lang.String descriptor)
public void gotoInstruction(CodeLocation location)
public BranchEnd gotoInstruction()
public void i2b()
public void i2c()
public void i2d()
public void i2f()
public void i2l()
public void i2s()
public void iadd()
public void iaload()
public void iand()
public void iastore()
public void iconst(int value)
value
- public void idiv()
public void ifAcmpeq(CodeLocation location)
public BranchEnd ifAcmpeq()
public void ifAcmpne(CodeLocation location)
public BranchEnd ifAcmpne()
public void ifIcmpeq(CodeLocation location)
public BranchEnd ifIcmpeq()
public void ifIcmpne(CodeLocation location)
public BranchEnd ifIcmpne()
public void ifIcmplt(CodeLocation location)
public BranchEnd ifIcmplt()
public void ifIcmple(CodeLocation location)
public BranchEnd ifIcmple()
public void ifIcmpgt(CodeLocation location)
public BranchEnd ifIcmpgt()
public void ifIcmpge(CodeLocation location)
public BranchEnd ifIcmpge()
public void ifEq(CodeLocation location)
public BranchEnd ifeq()
public void ifne(CodeLocation location)
public BranchEnd ifne()
public void iflt(CodeLocation location)
public BranchEnd iflt()
public void ifle(CodeLocation location)
public BranchEnd ifle()
public void ifgt(CodeLocation location)
public BranchEnd ifgt()
public void ifge(CodeLocation location)
public BranchEnd ifge()
public void ifnotnull(CodeLocation location)
public BranchEnd ifnotnull()
public void ifnull(CodeLocation location)
public BranchEnd ifnull()
BranchEnd
returned from this method is used to set the end point to a future point in the bytecode streampublic void iinc(int local, int amount)
public void iload(int no)
public void imul()
public void ineg()
public void instanceofInstruction(java.lang.String className)
public void invokespecial(java.lang.String className, java.lang.String methodName, java.lang.String descriptor)
public void invokespecial(java.lang.String className, java.lang.String methodName, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokespecial(java.lang.reflect.Constructor<?> constructor)
public void invokespecial(java.lang.reflect.Method method)
private void invokespecial(java.lang.String className, java.lang.String methodName, java.lang.String descriptor, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokestatic(java.lang.String className, java.lang.String methodName, java.lang.String descriptor)
public void invokestatic(java.lang.String className, java.lang.String methodName, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokestatic(java.lang.reflect.Method method)
private void invokestatic(java.lang.String className, java.lang.String methodName, java.lang.String descriptor, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokevirtual(java.lang.String className, java.lang.String methodName, java.lang.String descriptor)
public void invokevirtual(java.lang.String className, java.lang.String methodName, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokevirtual(java.lang.reflect.Method method)
private void invokevirtual(java.lang.String className, java.lang.String methodName, java.lang.String descriptor, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokeinterface(java.lang.String className, java.lang.String methodName, java.lang.String descriptor)
public void invokeinterface(java.lang.String className, java.lang.String methodName, java.lang.String returnType, java.lang.String[] parameterTypes)
public void invokeinterface(java.lang.reflect.Method method)
private void invokeinterface(java.lang.String className, java.lang.String methodName, java.lang.String descriptor, java.lang.String returnType, java.lang.String[] parameterTypes)
public void ior()
public void irem()
public void ishl()
public void ishr()
public void istore(int no)
public void isub()
public void iushr()
public void ixor()
public void l2d()
public void l2f()
public void l2i()
public void ladd()
public void laload()
public void land()
public void lastore()
public void lcmp()
public void lconst(long value)
public void ldc(int value)
value
- public void ldc(float value)
public void ldc(java.lang.String value)
private void ldcInternal(int index)
public void ldc2(double value)
public void ldc2(long value)
public void ldiv()
public void lload(int no)
public void lmul()
public void lneg()
public void load(java.lang.Class<?> type, int no)
type
- The type of variableno
- local variable numberpublic void load(java.lang.String descriptor, int no)
descriptor
- The descriptor of the variableno
- local variable numberpublic void loadClass(java.lang.String className)
public void loadType(java.lang.String descriptor)
public void lookupswitch(LookupSwitchBuilder lookupSwitchBuilder)
lookupSwitchBuilder
- public void lor()
public void lrem()
public void lshl()
public void lshr()
public void lstore(int no)
public void lsub()
public void lushr()
public void lxor()
public CodeLocation mark()
public void monitorenter()
public void monitorexit()
public void multianewarray(java.lang.String arrayType, int dimensions)
public void newInstruction(java.lang.String classname)
public void newInstruction(java.lang.Class<?> clazz)
public void newarray(java.lang.Class<?> arrayType)
Class
object that represents a primitive typepublic void nop()
public void pop()
public void pop2()
public void putfield(java.lang.String className, java.lang.String field, java.lang.Class<?> fieldType)
public void putfield(java.lang.String className, java.lang.String field, java.lang.String descriptor)
public void putstatic(java.lang.String className, java.lang.String field, java.lang.Class<?> fieldType)
public void putstatic(java.lang.String className, java.lang.String field, java.lang.String descriptor)
public void returnInstruction()
public void saload()
public void sastore()
public void sipush(short value)
public void swap()
public void tableswitch(TableSwitchBuilder builder)
public void loadMethodParameters()
private void writeByte(int n)
private void writeShort(int n)
private void writeInt(int n)
private void overwriteShort(byte[] bytecode, int offset, int value)
private void overwriteInt(byte[] bytecode, int offset, int value)
public java.util.LinkedHashMap<java.lang.Integer,StackFrame> getStackFrames()
public void setupFrame(java.lang.String... types)
public ConstPool getConstPool()
private void duplicateFrame()
private void advanceFrame(StackFrame frame)
private void updateMaxValues()
private LocalVariableState getLocalVars()
private StackState getStack()
public void assertTypeOnStack(int position, StackEntryType type, java.lang.String message)
public void assertTypeOnStack(StackEntryType type, java.lang.String message)
public void assertNotWideOnStack(int position, java.lang.String message)
public void assertNotWideOnStack(java.lang.String message)
private void mergeStackFrames(StackFrame stackFrame)
InvalidBytecodeException
is thrown. If the frames cannot be properly
merged then the stack map is marked as invalidprivate void addIfIcmp(CodeLocation location, int opcode, java.lang.String name)
private BranchEnd addIfIcmp(int opcode, java.lang.String name)
private void addIf(CodeLocation location, int opcode, java.lang.String name)
private BranchEnd addIf(int opcode, java.lang.String name)
private void addNullComparison(CodeLocation location, int opcode, java.lang.String name)
private BranchEnd addNullComparison(int opcode, java.lang.String name)