Class CodeContext
- java.lang.Object
-
- org.codehaus.janino.CodeContext
-
public class CodeContext extends Object
The context of the compilation of a function (constructor or method). Manages generation of byte code, the exception table, generation of line number tables, allocation of local variables, determining of stack size and local variable table size and flow analysis.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceCodeContext.FixUpA throw-in interface that marksCodeContext.Offsets as "fix-ups": During the execution offixUp(), all "fix-ups" are invoked and can do last touches to the code attribute.classCodeContext.InserterA class that implements an insertion point into a "Code" attribute.classCodeContext.LineNumberOffsetAnCodeContext.Offsetwho's sole purpose is to later create a 'LineNumberTable' attribute.classCodeContext.OffsetA class that represents an offset within a "Code" attribute.
-
Constructor Summary
Constructors Constructor Description CodeContext(ClassFile classFile)Creates an empty "Code" attribute.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddExceptionTableEntry(CodeContext.Offset startPc, CodeContext.Offset endPc, CodeContext.Offset handlerPc, String catchTypeFd)Adds another entry to the "exception_table" of this code attribute (see JVMS 4.7.3).voidaddLineNumberOffset(int lineNumber)shortallocateLocalVariable(short size)Allocates space for a local variable of the given size (1 or 2) on the local variable array.Java.LocalVariableSlotallocateLocalVariable(short size, String name, IClass type)Allocates space for a local variable of the given size (1 or 2) on the local variable array.CodeContext.InsertercurrentInserter()voidfixUpAndRelocate()Fixes up all of the offsets and relocate() all relocatables.List<Java.LocalVariableSlot>getAllLocalVars()ClassFilegetClassFile()TheClassFilethis context is related to.intmakeSpace(int size)Inserts size NUL bytes at the current inserter's offset, advances the current inserter's offset by size, createsCodeContext.LineNumberOffsets as necessary, and returns the current inserter's original offset (the offset of the first NUL byte that was inserted).CodeContext.InserternewInserter()Allocates anCodeContext.Inserter, set it to the current offset, and inserts it before the current offset.CodeContext.OffsetnewOffset()Creates and inserts anCodeContext.Offsetat the current inserter's current position.booleanpeekNullOperand()booleanpeekObjectOperand()ClassFile.StackMapTableAttribute.VerificationTypeInfopeekOperand()voidpopInserter()Replaces the currentCodeContext.Inserterwith the remembered one (seepushInserter(CodeContext.Inserter)).voidpopIntOperand()Asserts that the top operand is aninteger_variable_infoand pops it.ClassFile.StackMapTableAttribute.VerificationTypeInfopopIntOrLongOperand()Asserts that the top operand is anint_variable_infoorlong_variable_info, then pops and returns it.voidpopLongOperand()Asserts that the top operand is along_variable_infoand pops it.StringpopObjectOperand()Asserts that the top operand is anobject_variable_info, and pops it.ClassFile.StackMapTableAttribute.VerificationTypeInfopopObjectOrUninitializedOrUninitializedThisOperand()Asserts that the top operand is anobject_variable_info,uninitialized_variable_infooruninitializedThis_variable_info, and pops it.ClassFile.StackMapTableAttribute.VerificationTypeInfopopOperand()Pops one entry from the current inserter's operand stack.voidpopOperand(String expectedFd)Pops the top operand, asserts that it is aninteger_variable_info,long_variable_info,float_variable_info,double_variable_infoorvariable_object_info, and asserts that it matches the given field descriptor.voidpopOperand(ClassFile.StackMapTableAttribute.VerificationTypeInfo expected)Pops the top entry from the operand stack and assert that it equals expected.voidpopOperandAssignableTo(String declaredFd)voidpopReferenceOperand()Asserts that the top operand is anobject_variable_infoor anull_variable_infoand pops it.voidpopUninitializedThisOperand()Asserts that the top operand is anuninitializedThis_variable_infoand pops it.voidpopUninitializedVariableOperand()Asserts that the top operand is anuninitialized_variable_infoand pops it.voidpushDoubleOperand()voidpushFloatOperand()voidpushInserter(CodeContext.Inserter ins)Remembers the currentCodeContext.Inserter, then replaces it with the new one.voidpushIntOperand()voidpushLongOperand()voidpushNullOperand()voidpushObjectOperand(String fieldDescriptor)voidpushOperand(String fieldDescriptor)Pushes oneobject_variable_info,integer_variable_info,double_variable_info,float_variable_infoorlong_variable_infoentry onto the current inserter's operand stack.voidpushOperand(ClassFile.StackMapTableAttribute.VerificationTypeInfo topOperand)voidpushTopOperand()voidpushUninitializedOperand()voidpushUninitializedThisOperand()voidremoveCode(CodeContext.Offset from, CodeContext.Offset to)Removes all code between from and to.voidrestoreLocalVariables()Restores the previous size of the local variables array.List<Java.LocalVariableSlot>saveLocalVariables()Remembers the current size of the local variables array.protected voidstoreCodeAttributeBody(DataOutputStream dos, short lineNumberTableAttributeNameIndex, short localVariableTableAttributeNameIndex, short stackMapTableAttributeNameIndex)protected ClassFile.AttributeInfostoreLocalVariableTable(DataOutputStream dos, short localVariableTableAttributeNameIndex)StringtoString()voidwrite(byte b1)Inserts a byte at the current insertion position.voidwrite(byte[] b)Inserts a sequence of bytes at the current insertion position.voidwrite(byte b1, byte b2)Inserts bytes at the current insertion position.voidwrite(byte b1, byte b2, byte b3)Inserts bytes at the current insertion position.voidwrite(byte b1, byte b2, byte b3, byte b4)Inserts bytes at the current insertion position.voidwriteBranch(int opcode, CodeContext.Offset dst)Generates a "branch" instruction.voidwriteOffset(CodeContext.Offset src, CodeContext.Offset dst)Writes a four-byte offset (as it is used in TABLESWITCH and LOOKUPSWITCH) into this code context.voidwriteShort(int v)
-
-
-
Constructor Detail
-
CodeContext
public CodeContext(ClassFile classFile)
Creates an empty "Code" attribute.
-
-
Method Detail
-
allocateLocalVariable
public short allocateLocalVariable(short size)
Allocates space for a local variable of the given size (1 or 2) on the local variable array.As a side effect, the "max_locals" field of the "Code" attribute is updated.
The only way to deallocate local variables is to
saveLocalVariables()and laterrestoreLocalVariables().- Parameters:
size- The number of slots to allocate (1 or 2)- Returns:
- The slot index of the allocated variable
-
allocateLocalVariable
public Java.LocalVariableSlot allocateLocalVariable(short size, @Nullable String name, @Nullable IClass type)
Allocates space for a local variable of the given size (1 or 2) on the local variable array. As a side effect, the "max_locals" field of the "Code" attribute is updated.The only way to deallocate local variables is to
saveLocalVariables()and laterrestoreLocalVariables().- Parameters:
size- Number of slots to use (1 or 2)name- The variable name; ifnull, then the variable won't be written to the LocalVariableTabletype- The variable type; if the name is not null, then the type is needed to write to the LocalVariableTable
-
saveLocalVariables
public List<Java.LocalVariableSlot> saveLocalVariables()
Remembers the current size of the local variables array.
-
restoreLocalVariables
public void restoreLocalVariables()
Restores the previous size of the local variables array. This MUST to be called for every call to saveLocalVariables as it closes the variable extent for all the active local variables in the current block.
-
storeCodeAttributeBody
protected void storeCodeAttributeBody(DataOutputStream dos, short lineNumberTableAttributeNameIndex, short localVariableTableAttributeNameIndex, short stackMapTableAttributeNameIndex) throws IOException
- Parameters:
lineNumberTableAttributeNameIndex- 0 == don't generate a "LineNumberTable" attribute- Throws:
IOException
-
storeLocalVariableTable
@Nullable protected ClassFile.AttributeInfo storeLocalVariableTable(DataOutputStream dos, short localVariableTableAttributeNameIndex)
- Returns:
- A
ClassFile.LocalVariableTableAttributefor thisCodeContext
-
fixUpAndRelocate
public void fixUpAndRelocate()
Fixes up all of the offsets and relocate() all relocatables.
-
write
public void write(byte[] b)
Inserts a sequence of bytes at the current insertion position. CreatesCodeContext.LineNumberOffsets as necessary.
-
write
public void write(byte b1)
Inserts a byte at the current insertion position. CreatesCodeContext.LineNumberOffsets as necessary.This method is an optimization to avoid allocating small byte[] and ease GC load.
-
write
public void write(byte b1, byte b2)Inserts bytes at the current insertion position. CreatesCodeContext.LineNumberOffsets as necessary.This method is an optimization to avoid allocating small byte[] and ease GC load.
-
write
public void write(byte b1, byte b2, byte b3)Inserts bytes at the current insertion position. CreatesCodeContext.LineNumberOffsets as necessary.This method is an optimization to avoid allocating small byte[] and ease GC load.
-
write
public void write(byte b1, byte b2, byte b3, byte b4)Inserts bytes at the current insertion position. CreatesCodeContext.LineNumberOffsets as necessary.This method is an optimization to avoid allocating small byte[] and ease GC load.
-
addLineNumberOffset
public void addLineNumberOffset(int lineNumber)
-
makeSpace
public int makeSpace(int size)
Inserts size NUL bytes at the current inserter's offset, advances the current inserter's offset by size, createsCodeContext.LineNumberOffsets as necessary, and returns the current inserter's original offset (the offset of the first NUL byte that was inserted).Because the class file format does not support line numbers greater than 65535, these are treated as 65535.
- Parameters:
size- The number of NUL bytes to inject- Returns:
- The offset of the first inserted byte
-
writeShort
public void writeShort(int v)
-
writeBranch
public void writeBranch(int opcode, CodeContext.Offset dst)Generates a "branch" instruction.- Parameters:
opcode- One ofOpcode.GOTO,Opcode.JSRandOpcode.IF*dst- Where to branch
-
writeOffset
public void writeOffset(CodeContext.Offset src, CodeContext.Offset dst)
Writes a four-byte offset (as it is used in TABLESWITCH and LOOKUPSWITCH) into this code context.
-
newOffset
public CodeContext.Offset newOffset()
Creates and inserts anCodeContext.Offsetat the current inserter's current position.
-
newInserter
public CodeContext.Inserter newInserter()
Allocates anCodeContext.Inserter, set it to the current offset, and inserts it before the current offset.In clear text, this means that you can continue writing to the "Code" attribute, then
pushInserter(CodeContext.Inserter)theCodeContext.Inserter, then write again (which inserts bytes into the "Code" attribute at the previously remembered position), and thenpopInserter().
-
currentInserter
public CodeContext.Inserter currentInserter()
- Returns:
- The current inserter
-
pushInserter
public void pushInserter(CodeContext.Inserter ins)
Remembers the currentCodeContext.Inserter, then replaces it with the new one.
-
popInserter
public void popInserter()
Replaces the currentCodeContext.Inserterwith the remembered one (seepushInserter(CodeContext.Inserter)).
-
addExceptionTableEntry
public void addExceptionTableEntry(CodeContext.Offset startPc, CodeContext.Offset endPc, CodeContext.Offset handlerPc, @Nullable String catchTypeFd)
Adds another entry to the "exception_table" of this code attribute (see JVMS 4.7.3).- Parameters:
catchTypeFd-nullmeansfinallyclause
-
getAllLocalVars
public List<Java.LocalVariableSlot> getAllLocalVars()
- Returns:
- All the local variables that are allocated in any block in this
CodeContext
-
removeCode
public void removeCode(CodeContext.Offset from, CodeContext.Offset to)
Removes all code between from and to. Also removes anyCodeContext.Relocatables existing in that range.
-
pushOperand
public void pushOperand(String fieldDescriptor)
Pushes oneobject_variable_info,integer_variable_info,double_variable_info,float_variable_infoorlong_variable_infoentry onto the current inserter's operand stack.
-
pushTopOperand
public void pushTopOperand()
-
pushIntOperand
public void pushIntOperand()
-
pushLongOperand
public void pushLongOperand()
-
pushFloatOperand
public void pushFloatOperand()
-
pushDoubleOperand
public void pushDoubleOperand()
-
pushNullOperand
public void pushNullOperand()
-
pushUninitializedThisOperand
public void pushUninitializedThisOperand()
-
pushUninitializedOperand
public void pushUninitializedOperand()
-
pushObjectOperand
public void pushObjectOperand(String fieldDescriptor)
-
pushOperand
public void pushOperand(ClassFile.StackMapTableAttribute.VerificationTypeInfo topOperand)
-
peekNullOperand
public boolean peekNullOperand()
- Returns:
- Whether the top operand is a
null_variable_info
-
peekObjectOperand
public boolean peekObjectOperand()
- Returns:
- Whether the top operand is a
object_variable_info
-
peekOperand
public ClassFile.StackMapTableAttribute.VerificationTypeInfo peekOperand()
- Returns:
- The verification type of the top operand
-
popOperand
public ClassFile.StackMapTableAttribute.VerificationTypeInfo popOperand()
Pops one entry from the current inserter's operand stack.
-
popOperand
public void popOperand(ClassFile.StackMapTableAttribute.VerificationTypeInfo expected)
Pops the top entry from the operand stack and assert that it equals expected.
-
popOperand
public void popOperand(String expectedFd)
Pops the top operand, asserts that it is aninteger_variable_info,long_variable_info,float_variable_info,double_variable_infoorvariable_object_info, and asserts that it matches the given field descriptor.
-
popOperandAssignableTo
public void popOperandAssignableTo(String declaredFd)
-
popIntOperand
public void popIntOperand()
Asserts that the top operand is aninteger_variable_infoand pops it.
-
popLongOperand
public void popLongOperand()
Asserts that the top operand is along_variable_infoand pops it.
-
popUninitializedThisOperand
public void popUninitializedThisOperand()
Asserts that the top operand is anuninitializedThis_variable_infoand pops it.
-
popUninitializedVariableOperand
public void popUninitializedVariableOperand()
Asserts that the top operand is anuninitialized_variable_infoand pops it.
-
popReferenceOperand
public void popReferenceOperand()
Asserts that the top operand is anobject_variable_infoor anull_variable_infoand pops it.
-
popObjectOperand
public String popObjectOperand()
Asserts that the top operand is anobject_variable_info, and pops it.- Returns:
- The field descriptor of the popped object operand
-
popObjectOrUninitializedOrUninitializedThisOperand
public ClassFile.StackMapTableAttribute.VerificationTypeInfo popObjectOrUninitializedOrUninitializedThisOperand()
Asserts that the top operand is anobject_variable_info,uninitialized_variable_infooruninitializedThis_variable_info, and pops it.
-
popIntOrLongOperand
public ClassFile.StackMapTableAttribute.VerificationTypeInfo popIntOrLongOperand()
Asserts that the top operand is anint_variable_infoorlong_variable_info, then pops and returns it.
-
-