|
|||||||||
| Home >> All >> org >> apache >> derby >> iapi >> services >> [ compiler overview ] | PREV CLASS NEXT CLASS | ||||||||
SUMMARY: JAVADOC | SOURCE | DOWNLOAD | NESTED | FIELD | CONSTR | METHOD |
DETAIL: FIELD | CONSTR | METHOD | ||||||||
org.apache.derby.iapi.services.compiler
Interface MethodBuilder

- public interface MethodBuilder
MethodBuilder is used to generate the code for a method.
The code for a method is built in a way that corresponds to the layout of the stack machine that is the Java Virtual Machine. Values are pushed on the stack, moved about on the stack and then popped off the stack by operations such as method calls. An understanding of hoe the JVM operates is useful before using this class.
All the method descriptions below are generating bytecode to achieved the desired behaviour when the generated class is loaded. None of this class's methods calls actually invoke methods or create objects described by the callers.
| Method Summary | |
void |
addThrownException(java.lang.String exceptionClass)
Declare the method throws an exception. |
int |
callMethod(java.lang.Object methodDescriptor)
Call a method previously described by describeMethod(). |
int |
callMethod(short type,
java.lang.String declaringClass,
java.lang.String methodName,
java.lang.String returnType,
int numArgs)
Call a method. |
void |
callSuper()
Call super(). |
void |
cast(java.lang.String className)
Cast the top stack value. |
void |
complete()
Indicate the method is complete. |
void |
completeConditional()
Complete the a ?: operator which completes the false code path. |
void |
conditionalIf()
Initiate a sequence that corresponds to the Java language ' value ? ... |
void |
conditionalIfNull()
Initiate a sequence that corresponds to the Java language 'ref == null ? ... |
java.lang.Object |
describeMethod(short opcode,
java.lang.String declaringClass,
java.lang.String methodName,
java.lang.String returnType)
Return an object that efficiently (to the implementation) describes a zero-argument method and can be used with the single argument callMethod(). |
void |
dup()
Duplicate the top value on the stack. |
void |
endStatement()
End a statement. |
void |
getArrayElement(int element)
Pop an array refrence off the stack and push an element from that array. |
void |
getField(LocalField field)
Push the contents of the local field onto the stack. |
void |
getField(java.lang.String declaringClass,
java.lang.String fieldName,
java.lang.String fieldType)
Push the contents of the described field onto the stack. |
java.lang.String |
getName()
return the name of the method. |
void |
getParameter(int id)
Push a parameter value. |
void |
getStaticField(java.lang.String declaringClass,
java.lang.String fieldName,
java.lang.String fieldType)
Push the contents of the described static field onto the stack. |
void |
isInstanceOf(java.lang.String className)
Pop the top stack value and push a boolean that is the result of an instanceof check on the popped reference. |
void |
methodReturn()
Return from a method, optionally with a value. |
void |
pop()
Pop the top value off the stack |
void |
push(boolean value)
Push a boolean constant onto the stack |
void |
push(byte value)
Push a byte constant onto the stack |
void |
push(double value)
Push a double constant onto the stack |
void |
push(float value)
Push a float constant onto the stack |
void |
push(int value)
Push a int constant onto the stack |
void |
push(long value)
Push a long constant onto the stack |
void |
push(short value)
Push a short constant onto the stack |
void |
push(java.lang.String value)
Push a String constant onto the stack |
void |
pushNewArray(java.lang.String className,
int size)
Create an instance of an array and push it onto the stack. |
void |
pushNewComplete(int numArgs)
Complete the sequence that was started with pushNewStart(). |
void |
pushNewStart(java.lang.String className)
Initiate a sequence that calls a constructor, equivalent to the new operator in Java. |
void |
pushNull(java.lang.String className)
Push a typed null onto the stack |
void |
pushThis()
Push this onto the stack. |
void |
putField(LocalField field)
Pop the top stack value and store it in the local field. |
void |
putField(java.lang.String fieldName,
java.lang.String fieldType)
Pop the top stack value and store it in the instance field of this class. |
void |
putField(java.lang.String declaringClass,
java.lang.String fieldName,
java.lang.String fieldType)
Pop the top stack value and store it in the field. |
void |
setArrayElement(int element)
Pop an array reference off the stack, store a value in the array at the passed in offset. |
void |
setField(LocalField field)
Pop the top stack value and store it in the local field. |
void |
startElseCode()
Complete the true code path of a ?: operator. |
boolean |
statementNumHitLimit(int noStatementsAdded)
Tell if statement number in this method builder hits limit. |
void |
swap()
Swap the top two values on the stack. |
void |
upCast(java.lang.String className)
Upcast the top stack value. |
| Method Detail |
addThrownException
public void addThrownException(java.lang.String exceptionClass)
- Declare the method throws an exception.
Must be called before any code is added
to the method.
getName
public java.lang.String getName()
- return the name of the method.
complete
public void complete()
- Indicate the method is complete. Once this
call has been made the caller must discard
the reference to this object.
getParameter
public void getParameter(int id)
- Push a parameter value.
Stack ... => ...,param_value
push
public void push(byte value)
- Push a byte constant onto the stack
Stack ... => ...,byte_value
push
public void push(boolean value)
- Push a boolean constant onto the stack
Stack ... => ...,boolean_value
push
public void push(short value)
- Push a short constant onto the stack
Stack ... => ...,short_value
push
public void push(int value)
- Push a int constant onto the stack
Stack ... => ...,int_value
push
public void push(long value)
- Push a long constant onto the stack
Stack ... => ...,long_value
push
public void push(float value)
- Push a float constant onto the stack
Stack ... => ...,float_value
push
public void push(double value)
- Push a double constant onto the stack
Stack ... => ...,double_value
push
public void push(java.lang.String value)
- Push a String constant onto the stack
Stack ... => ...,String_value
pushNull
public void pushNull(java.lang.String className)
- Push a typed null onto the stack
Stack ... => ...,null
getField
public void getField(LocalField field)
- Push the contents of the local field onto the stack.
This call pushes the this instance required to access the field itself.
Stack ... => ...,field_value
getField
public void getField(java.lang.String declaringClass, java.lang.String fieldName, java.lang.String fieldType)
- Push the contents of the described field onto the stack.
This call requires the instance (reference) to be pushed by the caller.
Stack ...,field_ref => ...,field_value
getStaticField
public void getStaticField(java.lang.String declaringClass, java.lang.String fieldName, java.lang.String fieldType)
- Push the contents of the described static field onto the stack.
Stack ... => ...,field_value
setField
public void setField(LocalField field)
- Pop the top stack value and store it in the local field.
This call pushes the this instance required to access the field itself.
This call does not leave any value on the stack.
Stack ...,value => ...
putField
public void putField(LocalField field)
- Pop the top stack value and store it in the local field.
This call pushes the this instance required to access the field itself.
Like the Java language 'field = value', this leaves the value on the stack.
Stack ...,value => ...,value
putField
public void putField(java.lang.String fieldName, java.lang.String fieldType)
- Pop the top stack value and store it in the instance field of this class.
This call pushes the this instance required to access the field itself.
Like the Java language 'field = value', this leaves the value on the stack.
Stack ...,value => ...,value
putField
public void putField(java.lang.String declaringClass, java.lang.String fieldName, java.lang.String fieldType)
- Pop the top stack value and store it in the field.
This call requires the instance to be pushed by the caller.
Like the Java language 'field = value', this leaves the value on the stack.
Stack ...,field_ref,value => ...,value
pushNewStart
public void pushNewStart(java.lang.String className)
- Initiate a sequence that calls a constructor, equivalent to the new operator in Java.
After this call, the caller must push any arguments and then complete the
construction with a call to pushNewComplete(). Only arguments to the constructor
can be pushed onto the stack between the pushNewStart() and pushNewComplete() method
calls.
Stack ... => [unchanged] ...
pushNewComplete
public void pushNewComplete(int numArgs)
- Complete the sequence that was started with pushNewStart().
Pop the arguments to the constructor and push the reference
to the newly created object.
Stack ...,value* => [numArgs number of values will be popped] ...,new_ref
pushNewArray
public void pushNewArray(java.lang.String className, int size)
- Create an instance of an array and push it onto the stack.
Stack ... => ...,array_ref
pushThis
public void pushThis()
- Push this onto the stack.
Stack ... => ...,this_ref
upCast
public void upCast(java.lang.String className)
- Upcast the top stack value. This is used for correct method resolution
by upcasting method parameters. It does not put any casting code into the
byte code stream. Can only be used for refrences.
Stack ...,ref => ...,ref
cast
public void cast(java.lang.String className)
- Cast the top stack value. Correctly down-casts a reference or casts
a primitive type (e.g. int to short).
Stack ...,value => ...,cast_value
isInstanceOf
public void isInstanceOf(java.lang.String className)
- Pop the top stack value and push a boolean that is the result of
an instanceof check on the popped reference.
Stack ...,ref => ...,boolean_value.
pop
public void pop()
- Pop the top value off the stack
Stack ..., value => ....
endStatement
public void endStatement()
- End a statement.
Pops the top-word of the stack, if any.
Must only be called if zero or one item exists
on the stack.
Stack value => :empty: or Stack :empty: => :empty:.
methodReturn
public void methodReturn()
- Return from a method, optionally with a value.
Must only be called if zero or one item exists
on the stack. If the stack contains a single
value then that is popped and used as the returned value.
Stack value => :empty: or Stack :empty: => :empty:.
conditionalIfNull
public void conditionalIfNull()
- Initiate a sequence that corresponds to the Java language 'ref == null ? ... : ...'.
The top value on the stack (a reference) is popped and compared to 'null'.
If the value is null then the code following this call until the startElseCode()
will be executed at runtime, otherwise the code following startElseCode() until
the completeConditional() is called.
E.g.mb.callMethod(...); // pushes an object onto the stack mb.conditionalIfNull(); mb.push(3); mb.startElseCode(); mb.push(5); mb.completeConditional(); // at this point 3 or 5 will be on the stackEach path through the ?: statement must leave the stack at the same depth as the other.Stack ...,ref => ....
conditionalIf
public void conditionalIf()
- Initiate a sequence that corresponds to the Java language ' value ? ... : ...'.
The top value on the stack must be a boolean and will be popped. If it
is true then the code following this call until the startElseCode()
will be executed at runtime, otherwise the code following startElseCode() until
the completeConditional() is called. See conditionalIfNull() for example.
Stack ...,boolean_value => ....
startElseCode
public void startElseCode()
- Complete the true code path of a ?: operator.
completeConditional
public void completeConditional()
- Complete the a ?: operator which completes the false code path.
callMethod
public int callMethod(short type,
java.lang.String declaringClass,
java.lang.String methodName,
java.lang.String returnType,
int numArgs)
- Call a method. The instance (receiver or reference) for non-static methods
must be pushed by the caller. The instance (for non-static) and the arguments
are popped of the stack, and the return value (if any) is pushed onto the stack.
The type needs to be one of:- VMOpcode.INVOKESTATIC - call a static method
- VMOpcode.INVOKEVIRTUAL - call method declared in the class or super-class.
- VMOpcode.INVOKEINTERFACE - call a method declared in an interface
static methods Stack ...,value* => [numArgs number of values will be popped] ...,return_value [void methods will not push a value] non-static methods Stack ...,ref,value* => [numArgs number of values will be popped] ...,return_value [void methods will not push a value]
The type of the arguments to the methods must exactly match the declared types of the parameters to the methods. If a argument is of the incorrect type the caller must up cast it or down cast it.
describeMethod
public java.lang.Object describeMethod(short opcode, java.lang.String declaringClass, java.lang.String methodName, java.lang.String returnType)
- Return an object that efficiently (to the implementation) describes a zero-argument method and
can be used with the single argument callMethod(). Descriptions for the parameters to this
method are the same as the five argument callMethod(). This allows the caller to cache frequently
used methods. The returned object is only valid for use by this MethodBuilder.
This call does not affect the Stack.
callMethod
public int callMethod(java.lang.Object methodDescriptor)
- Call a method previously described by describeMethod().
static methods Stack ...,value* => [numArgs number of values will be popped] ...,return_value [void methods will not push a value] non-static methods Stack ...,ref,value* => [numArgs number of values will be popped] ...,return_value [void methods will not push a value]
callSuper
public void callSuper()
- Call super(). Caller must only add this to a constructor.
Stack ... => ...
getArrayElement
public void getArrayElement(int element)
- Pop an array refrence off the stack and push an element from that array.
Stack ...,array_ref => ...,value
setArrayElement
public void setArrayElement(int element)
- Pop an array reference off the stack, store a value in the array at the passed in offset.
Stack ...,array_ref, value => ...
swap
public void swap()
- Swap the top two values on the stack.
Stack ...,valueA,valueB => ...,valueB,valueA
dup
public void dup()
- Duplicate the top value on the stack.
Stack ...,value => ...,value,value
statementNumHitLimit
public boolean statementNumHitLimit(int noStatementsAdded)
- Tell if statement number in this method builder hits limit. This
method builder keeps a counter of how many statements are added to it.
Caller should call this function every time it tries to add a statement
to this method builder (counter is increased by 1), then the function
returns whether the accumulated statement number hits a limit.
The reason of doing this is that Java compiler has a limit of 64K code
size for each method. We might hit this limit if an extremely long
insert statement is issued, for example (see beetle 4293). Counting
statement number is an approximation without too much overhead.
|
|||||||||
| Home >> All >> org >> apache >> derby >> iapi >> services >> [ compiler overview ] | PREV CLASS NEXT CLASS | ||||||||
SUMMARY: JAVADOC | SOURCE | DOWNLOAD | NESTED | FIELD | CONSTR | METHOD |
DETAIL: FIELD | CONSTR | METHOD | ||||||||
JAVADOC