Web Site

org.codehaus.janino
Class CodeContext

java.lang.Object
  extended byorg.codehaus.janino.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.


Nested Class Summary
static interface CodeContext.FixUp
          A throw-in interface that marks CodeContext.Offsets as "fix-ups": During the execution of fixUp(), all "fix-ups" are invoked and can do last touches to the code attribute.
 class CodeContext.Inserter
          A class that implements an insertion point into a "Code" attribute.
 class CodeContext.LineNumberOffset
           
 class CodeContext.Offset
          A class that represents an offset within a "Code" attribute.
 
Constructor Summary
CodeContext(ClassFile classFile)
          Create an empty "Code" attribute.
 
Method Summary
 void addExceptionTableEntry(CodeContext.Offset startPC, CodeContext.Offset endPC, CodeContext.Offset handlerPC, java.lang.String catchTypeFD)
          Add another entry to the "exception_table" of this code attribute (see JVMS 4.7.3).
 short allocateLocalVariable(short size)
          Allocate space for a local variable of the given size (1 or 2) on the local variable array.
 CodeContext.Inserter currentInserter()
           
 void fixUp()
          Fix up all offsets.
 void flowAnalysis(java.lang.String functionName)
          Checks the code for consistency; updates the "maxStack" member.
 ClassFile getClassFile()
           
 CodeContext.Inserter newInserter()
          Allocate an CodeContext.Inserter, set it to the current offset, and insert it before the current offset.
 CodeContext.Offset newOffset()
           
 void popInserter()
          Replace the current CodeContext.Inserter with the remembered one (see pushInserter(CodeContext.Inserter)).
 void pushInserter(CodeContext.Inserter ins)
          Remember the current CodeContext.Inserter, then replace it with the new one.
 void relocate()
           
 void restoreLocalVariables()
          Restore the previous size of the local variables array.
 void saveLocalVariables()
          Remember the current size of the local variables array.
protected  void storeCodeAttributeBody(java.io.DataOutputStream dos, short lineNumberTableAttributeNameIndex)
           
 void write(short lineNumber, byte[] b)
          Inserts a sequence of bytes at the current insertion position.
 void writeBranch(short lineNumber, int opcode, CodeContext.Offset dst)
           
 void writeOffset(short lineNumber, CodeContext.Offset src, CodeContext.Offset dst)
           
 void writeShort(short lineNumber, int v)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

CodeContext

public CodeContext(ClassFile classFile)
Create an empty "Code" attribute.

Method Detail

getClassFile

public ClassFile getClassFile()

allocateLocalVariable

public short allocateLocalVariable(short size)
Allocate 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().


saveLocalVariables

public void saveLocalVariables()
Remember the current size of the local variables array.


restoreLocalVariables

public void restoreLocalVariables()
Restore the previous size of the local variables array.


storeCodeAttributeBody

protected void storeCodeAttributeBody(java.io.DataOutputStream dos,
                                      short lineNumberTableAttributeNameIndex)
                               throws java.io.IOException
Parameters:
dos -
lineNumberTableAttributeNameIndex - 0 == don't generate a "LineNumberTable" attribute
Throws:
java.io.IOException

flowAnalysis

public void flowAnalysis(java.lang.String functionName)
Checks the code for consistency; updates the "maxStack" member. Notice: On inconsistencies, a "RuntimeException" is thrown (KLUDGE).


fixUp

public void fixUp()
Fix up all offsets.


relocate

public void relocate()

write

public void write(short lineNumber,
                  byte[] b)
Inserts a sequence of bytes at the current insertion position. Creates CodeContext.LineNumberOffsets as necessary.

Parameters:
lineNumber - The line number that corresponds to the byte code, or -1
b -

writeShort

public void writeShort(short lineNumber,
                       int v)
Parameters:
lineNumber - The line number that corresponds to the byte code, or -1

writeBranch

public void writeBranch(short lineNumber,
                        int opcode,
                        CodeContext.Offset dst)
Parameters:
lineNumber - The line number that corresponds to the byte code, or -1

writeOffset

public void writeOffset(short lineNumber,
                        CodeContext.Offset src,
                        CodeContext.Offset dst)

newOffset

public CodeContext.Offset newOffset()

newInserter

public CodeContext.Inserter newInserter()
Allocate an CodeContext.Inserter, set it to the current offset, and insert it before the current offset. In clear text, this means that you can continue writing to the "Code" attribute, then pushInserter(CodeContext.Inserter) the CodeContext.Inserter, then write again (which inserts bytes into the "Code" attribute at the previously remembered position), and then popInserter().


currentInserter

public CodeContext.Inserter currentInserter()

pushInserter

public void pushInserter(CodeContext.Inserter ins)
Remember the current CodeContext.Inserter, then replace it with the new one.


popInserter

public void popInserter()
Replace the current CodeContext.Inserter with the remembered one (see pushInserter(CodeContext.Inserter)).


addExceptionTableEntry

public void addExceptionTableEntry(CodeContext.Offset startPC,
                                   CodeContext.Offset endPC,
                                   CodeContext.Offset handlerPC,
                                   java.lang.String catchTypeFD)
Add another entry to the "exception_table" of this code attribute (see JVMS 4.7.3).

Parameters:
startPC -
endPC -
handlerPC -
catchTypeFD -

Web Site