Class CodeContext


  • public class CodeContext
    extends java.lang.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.
    • Constructor Detail

      • CodeContext

        public CodeContext​(ClassFile classFile)
        Creates an empty "Code" attribute.
    • Method Detail

      • getClassFile

        public ClassFile getClassFile()
        The ClassFile this context is related to.
      • 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 later restoreLocalVariables().

        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
                                                            java.lang.String name,
                                                            @Nullable
                                                            IType 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 later restoreLocalVariables().

        Parameters:
        size - Number of slots to use (1 or 2)
        name - The variable name; if null, then the variable won't be written to the LocalVariableTable
        type - The variable type; if the name is not null, then the type is needed to write to the LocalVariableTable
      • saveLocalVariables

        public java.util.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.
      • newCodeAttribute

        public ClassFile.CodeAttribute newCodeAttribute​(int initialLocalsCount,
                                                        boolean debugLines,
                                                        boolean debugVars)
        Parameters:
        initialLocalsCount - The number of parameters, plus one iff there is a "this" parameter
      • 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. Creates CodeContext.LineNumberOffsets as necessary.
      • write

        public void write​(byte b1)
        Inserts a byte at the current insertion position. Creates CodeContext.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. Creates CodeContext.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. Creates CodeContext.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. Creates CodeContext.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,
                          byte b5)
        Inserts bytes at the current insertion position. Creates CodeContext.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, creates CodeContext.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 of Opcode.GOTO, Opcode.JSR and Opcode.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.
      • addExceptionTableEntry

        public void addExceptionTableEntry​(CodeContext.Offset startPc,
                                           CodeContext.Offset endPc,
                                           CodeContext.Offset handlerPc,
                                           @Nullable
                                           java.lang.String catchTypeFd)
        Adds another entry to the "exception_table" of this code attribute (see JVMS 4.7.3).
        Parameters:
        catchTypeFd - null means finally clause
      • getAllLocalVars

        public java.util.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 any CodeContext.Relocatables existing in that range.
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • pushOperand

        public void pushOperand​(java.lang.String fieldDescriptor)
        Pushes one object_variable_info, integer_variable_info, double_variable_info, float_variable_info or long_variable_info entry 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​(java.lang.String fieldDescriptor)
      • 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
      • popOperand

        public void popOperand​(java.lang.String expectedFd)
        Pops the top operand, asserts that it is an integer_variable_info, long_variable_info, float_variable_info, double_variable_info or variable_object_info, and asserts that it matches the given field descriptor.
      • popOperandAssignableTo

        public void popOperandAssignableTo​(java.lang.String declaredFd)
      • popIntOperand

        public void popIntOperand()
        Asserts that the top operand is an integer_variable_info and pops it.
      • popLongOperand

        public void popLongOperand()
        Asserts that the top operand is a long_variable_info and pops it.
      • popUninitializedThisOperand

        public void popUninitializedThisOperand()
        Asserts that the top operand is an uninitializedThis_variable_info and pops it.
      • popUninitializedVariableOperand

        public void popUninitializedVariableOperand()
        Asserts that the top operand is an uninitialized_variable_info and pops it.
      • popReferenceOperand

        public void popReferenceOperand()
        Asserts that the top operand is an object_variable_info or a null_variable_info and pops it.
      • popNullOperand

        public void popNullOperand()
      • popObjectOperand

        public java.lang.String popObjectOperand()
        Asserts that the top operand is an object_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 an object_variable_info, uninitialized_variable_info or uninitializedThis_variable_info, and pops it.