org.cojen.classfile
Interface CodeAssembler

All Known Implementing Classes:
AbstractCodeAssembler, CodeAssemblerPrinter, CodeBuilder, DelegatedCodeAssembler

public interface CodeAssembler

CodeAssembler is a high-level interface for assembling Java Virtual Machine byte code. It can also be used as a visitor to a disassembler.

Author:
Brian S O'Neill

Field Summary
static int CONVERT_FP_BITS
          Convert floating point values as bits (NaN is canonicalized)
static int CONVERT_FP_NORMAL
          Convert floating point values as normal
static int CONVERT_FP_RAW_BITS
          Convert floating point values as raw bits
 
Method Summary
 void arrayLength()
          Generates code for an arraylength instruction.
 void branch(Location location)
          Generates code that performs an unconditional branch to the specified location.
 void breakpoint()
          Generates a breakpoint instruction for use in a debugging environment.
 void checkCast(TypeDesc type)
          Generates code that performs an object cast operation.
 void convert(TypeDesc fromType, TypeDesc toType)
          Generates code that converts the value of a primitive type already on the stack.
 void convert(TypeDesc fromType, TypeDesc toType, int fpConvertMode)
          Generates code that converts the value of a primitive type already on the stack.
 Label createLabel()
          Creates a label, whose location must be set.
 LocalVariable createLocalVariable(String name, TypeDesc type)
          Creates a LocalVariable reference from a name and type.
 void dup()
          Generates code for the dup instruction.
 void dup2()
          Generates code for the dup2 instruction.
 void dup2X1()
          Generates code for the dup2_x1 instruction.
 void dup2X2()
          Generates code for the dup2_x2 instruction.
 void dupX1()
          Generates code for the dup_x1 instruction.
 void dupX2()
          Generates code for the dup_x2 instruction.
 void exceptionHandler(Location startLocation, Location endLocation, String catchClassName)
          Sets up an exception handler located here, the location of the next code to be generated.
 LocalVariable getParameter(int index)
          Returns a specific parameter, whose index lies within 0 to getParameterCount() - 1.
 int getParameterCount()
          Returns the amount of parameters that are accepted by the method being built, not including any "this" reference.
 void ifComparisonBranch(Location location, String choice)
          Generates code the performs a conditional branch based on a comparison between two int values on the stack.
 void ifComparisonBranch(Location location, String choice, TypeDesc type)
          Generates code the performs a conditional branch based on a comparison between two values of the given type on the stack.
 void ifEqualBranch(Location location, boolean choice)
          Generates code that performs a conditional branch based on the value of two object references on the stack.
 void ifNullBranch(Location location, boolean choice)
          Generates code that performs a conditional branch based on the value of an object on the stack.
 void ifZeroComparisonBranch(Location location, String choice)
          Generates code the performs a conditional branch based on a comparison between an int value on the stack and zero.
 void inline(Object code)
          Allows code to disassembled and copied straight in.
 void instanceOf(TypeDesc type)
          Generates code that performs an instanceof operation.
 void integerIncrement(LocalVariable local, int amount)
          Generates code that increments a local integer variable by a signed constant amount.
 void invoke(Constructor constructor)
          Generates code to invoke a class constructor in any class.
 void invoke(Method method)
          Generates code to invoke a method.
 void invokeConstructor(String className, TypeDesc[] params)
          Generates code to invoke a class constructor in any class.
 void invokeConstructor(TypeDesc[] params)
          Generates code to invoke a class constructor in this class.
 void invokeConstructor(TypeDesc classDesc, TypeDesc[] params)
          Generates code to invoke a class constructor in any class.
 void invokeInterface(String className, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke an interface method in any class.
 void invokeInterface(TypeDesc classDesc, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke an interface method in any class.
 void invokePrivate(String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a private method in this class.
 void invokeStatic(String className, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a static method in any class.
 void invokeStatic(String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a static method in this class.
 void invokeStatic(TypeDesc classDesc, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a static method in any class.
 void invokeSuper(Method method)
          Generates code to invoke a method in the super class.
 void invokeSuper(String superClassName, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a method in the super class.
 void invokeSuper(TypeDesc superClassDesc, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a method in the super class.
 void invokeSuperConstructor(TypeDesc[] params)
          Generates code to invoke a super class constructor.
 void invokeVirtual(String className, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a virtual method in any class.
 void invokeVirtual(String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a virtual method in this class.
 void invokeVirtual(TypeDesc classDesc, String methodName, TypeDesc ret, TypeDesc[] params)
          Generates code to invoke a virtual method in any class.
 void jsr(Location location)
          Generates code that performs a subroutine branch to the specified location.
 void loadConstant(boolean value)
          Generates code that loads a constant boolean value onto the stack.
 void loadConstant(double value)
          Generates code that loads a constant double value onto the stack.
 void loadConstant(float value)
          Generates code that loads a constant float value onto the stack.
 void loadConstant(int value)
          Generates code that loads a constant int, char, short or byte value onto the stack.
 void loadConstant(long value)
          Generates code that loads a constant long value onto the stack.
 void loadConstant(String value)
          Generates code that loads a constant string value onto the stack.
 void loadConstant(TypeDesc type)
          Generates code that loads a constant class value onto the stack.
 void loadField(String className, String fieldName, TypeDesc type)
          Generates code that loads a value from a field from any class.
 void loadField(String fieldName, TypeDesc type)
          Generates code that loads a value from a field from this class.
 void loadField(TypeDesc classDesc, String fieldName, TypeDesc type)
          Generates code that loads a value from a field from any class.
 void loadFromArray(TypeDesc type)
          Generates code that loads a value from an array.
 void loadLocal(LocalVariable local)
          Generates code that loads a local variable onto the stack.
 void loadNull()
          Generates code that loads a null reference onto the stack.
 void loadStaticField(String className, String fieldName, TypeDesc type)
          Generates code that loads a value from a static field from any class.
 void loadStaticField(String fieldName, TypeDesc type)
          Generates code that loads a value from a static field from this class.
 void loadStaticField(TypeDesc classDesc, String fieldName, TypeDesc type)
          Generates code that loads a value from a static field from any class.
 void loadThis()
          Loads a reference to "this" onto the stack.
 void mapLineNumber(int lineNumber)
          Map the location of the next code to be generated to a line number in source code.
 void math(byte opcode)
          Generates code for either a unary or binary math operation on one or two values pushed on the stack.
 void monitorEnter()
          Generates code to enter the monitor on an object loaded on the stack.
 void monitorExit()
          Generates code to exit the monitor on an object loaded on the stack.
 void newObject(TypeDesc type)
          Generates code to create a new object.
 void newObject(TypeDesc type, int dimensions)
          Generates code to create a new array.
 void nop()
          Generates an instruction that does nothing.
 void pop()
          Generates code for the pop instruction.
 void pop2()
          Generates code for the pop2 instruction.
 void ret(LocalVariable local)
          Generates code that returns from a subroutine invoked by jsr.
 void returnValue(TypeDesc type)
          Generates code that returns an object or primitive type.
 void returnVoid()
          Generates code that returns void.
 void storeField(String className, String fieldName, TypeDesc type)
          Generates code that stores a value into a field from any class.
 void storeField(String fieldName, TypeDesc type)
          Generates code that stores a value into a field from this class.
 void storeField(TypeDesc classDesc, String fieldName, TypeDesc type)
          Generates code that stores a value into a field from any class.
 void storeLocal(LocalVariable local)
          Generates code that pops a value off of the stack into a local variable.
 void storeStaticField(String className, String fieldName, TypeDesc type)
          Generates code that stores a value into a field from any class.
 void storeStaticField(String fieldName, TypeDesc type)
          Generates code that stores a value into a field from this class.
 void storeStaticField(TypeDesc classDesc, String fieldName, TypeDesc type)
          Generates code that stores a value into a field from any class.
 void storeToArray(TypeDesc type)
          Generates code that stores a value to an array.
 void swap()
          Generates code for the swap instruction.
 void swap2()
          Generates code for a swap2 instruction.
 void switchBranch(int[] cases, Location[] locations, Location defaultLocation)
          Generates code for a switch statement.
 void throwObject()
          Generates code that throws an exception.
 

Field Detail

CONVERT_FP_NORMAL

static final int CONVERT_FP_NORMAL
Convert floating point values as normal

See Also:
Constant Field Values

CONVERT_FP_BITS

static final int CONVERT_FP_BITS
Convert floating point values as bits (NaN is canonicalized)

See Also:
Constant Field Values

CONVERT_FP_RAW_BITS

static final int CONVERT_FP_RAW_BITS
Convert floating point values as raw bits

See Also:
Constant Field Values
Method Detail

getParameterCount

int getParameterCount()
Returns the amount of parameters that are accepted by the method being built, not including any "this" reference.


getParameter

LocalVariable getParameter(int index)
                           throws IndexOutOfBoundsException
Returns a specific parameter, whose index lies within 0 to getParameterCount() - 1. The names of the LocalVariables returned by this method are initially set to null. It is encouraged that a name be provided.

Throws:
IndexOutOfBoundsException

createLocalVariable

LocalVariable createLocalVariable(String name,
                                  TypeDesc type)
Creates a LocalVariable reference from a name and type. Although name is optional, it is encouraged that a name be provided. Names do not need to be unique.

Parameters:
name - Optional name for the LocalVariable.
type - The type of data that the requested LocalVariable can store.

createLabel

Label createLabel()
Creates a label, whose location must be set. To create a label and locate it here, the following example demonstrates how the call to setLocation can be chained:
 CodeBuilder builder;
 ...
 Label label = builder.createLabel().setLocation();
 

See Also:
Label.setLocation()

exceptionHandler

void exceptionHandler(Location startLocation,
                      Location endLocation,
                      String catchClassName)
Sets up an exception handler located here, the location of the next code to be generated.

Parameters:
startLocation - Location at the start of the section of code to be wrapped by an exception handler.
endLocation - Location directly after the end of the section of code.
catchClassName - The class name of exception to be caught; if null, then catch every object.

mapLineNumber

void mapLineNumber(int lineNumber)
Map the location of the next code to be generated to a line number in source code. This enables line numbers in a stack trace from the generated code.


inline

void inline(Object code)
            throws IllegalArgumentException,
                   MissingResourceException
Allows code to disassembled and copied straight in. The code object passed in must have a single method named "define" whose arguments match the type and order of values expected on the operand stack. If a return value is provided, it will pushed onto the stack. The define method can have any access modifier.

Throws:
IllegalArgumentException - if define method not found, or if multiple are found
MissingResourceException - if define code not found

loadNull

void loadNull()
Generates code that loads a null reference onto the stack.


loadConstant

void loadConstant(String value)
Generates code that loads a constant string value onto the stack. If value is null, the generated code loads a null onto the stack. Strings that exceed 65535 UTF encoded bytes in length are loaded by creating a StringBuffer (or a StringBuilder), appending substrings, and then converting it to a String.


loadConstant

void loadConstant(TypeDesc type)
                  throws IllegalStateException
Generates code that loads a constant class value onto the stack. If value is null, the generated code loads a null onto the stack.

Parameters:
type - any object or primitive type
Throws:
IllegalStateException - if class file target version does not support this feature

loadConstant

void loadConstant(boolean value)
Generates code that loads a constant boolean value onto the stack.


loadConstant

void loadConstant(int value)
Generates code that loads a constant int, char, short or byte value onto the stack.


loadConstant

void loadConstant(long value)
Generates code that loads a constant long value onto the stack.


loadConstant

void loadConstant(float value)
Generates code that loads a constant float value onto the stack.


loadConstant

void loadConstant(double value)
Generates code that loads a constant double value onto the stack.


loadLocal

void loadLocal(LocalVariable local)
Generates code that loads a local variable onto the stack. Parameters passed to a method and the "this" reference are all considered local variables, as well as any that were created.

Parameters:
local - The local variable reference

loadThis

void loadThis()
Loads a reference to "this" onto the stack. Static methods have no "this" reference, and an exception is thrown when attempting to generate "this" in a static method.


storeLocal

void storeLocal(LocalVariable local)
Generates code that pops a value off of the stack into a local variable. Parameters passed to a method and the "this" reference are all considered local variables, as well as any that were created.

Parameters:
local - The local variable reference
See Also:
getParameter(int), createLocalVariable(java.lang.String, org.cojen.classfile.TypeDesc)

loadFromArray

void loadFromArray(TypeDesc type)
Generates code that loads a value from an array. An array reference followed by an index must be on the stack. The array reference and index are replaced by the value retrieved from the array after the generated instruction has executed.

The type doesn't need to be an exact match for objects. TypeDesc.OBJECT works fine for all objects. For primitive types, use the appropriate TypeDesc. For an int, the type is TypeDesc.INT.

Parameters:
type - The type of data stored in the array.

storeToArray

void storeToArray(TypeDesc type)
Generates code that stores a value to an array. An array reference followed by an index, followed by a value (or two if a long or double) must be on the stack. All items on the stack are gone after the generated instruction has executed.

The type doesn't need to be an exact match for objects. TypeDesc.OBJECT works fine for all objects. For primitive types, use the appropriate TypeDesc. For an int, the type is TypeDesc.INT.

Parameters:
type - The type of data stored in the array.

loadField

void loadField(String fieldName,
               TypeDesc type)
Generates code that loads a value from a field from this class. An object reference must be on the stack. After the generated code has executed, the object reference is replaced by the value retrieved from the field.


loadField

void loadField(String className,
               String fieldName,
               TypeDesc type)
Generates code that loads a value from a field from any class. An object reference must be on the stack. After the generated code has executed, the object reference is replaced by the value retrieved from the field.


loadField

void loadField(TypeDesc classDesc,
               String fieldName,
               TypeDesc type)
Generates code that loads a value from a field from any class. An object reference must be on the stack. After the generated code has executed, the object reference is replaced by the value retrieved from the field.

Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

loadStaticField

void loadStaticField(String fieldName,
                     TypeDesc type)
Generates code that loads a value from a static field from this class. After the generated code has executed, the value retrieved is placed on the stack.


loadStaticField

void loadStaticField(String className,
                     String fieldName,
                     TypeDesc type)
Generates code that loads a value from a static field from any class. After the generated code has executed, the value retrieved is placed on the stack.


loadStaticField

void loadStaticField(TypeDesc classDesc,
                     String fieldName,
                     TypeDesc type)
Generates code that loads a value from a static field from any class. After the generated code has executed, the value retrieved is placed on the stack.

Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

storeField

void storeField(String fieldName,
                TypeDesc type)
Generates code that stores a value into a field from this class. An object reference and value must be on the stack. After the generated code has executed, the object reference and value are gone from the stack.


storeField

void storeField(String className,
                String fieldName,
                TypeDesc type)
Generates code that stores a value into a field from any class. An object reference and value must be on the stack. After the generated code has executed, the object reference and value are gone from the stack.


storeField

void storeField(TypeDesc classDesc,
                String fieldName,
                TypeDesc type)
Generates code that stores a value into a field from any class. An object reference and value must be on the stack. After the generated code has executed, the object reference and value are gone from the stack.

Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

storeStaticField

void storeStaticField(String fieldName,
                      TypeDesc type)
Generates code that stores a value into a field from this class. A value must be on the stack. After the generated code has executed, the value is gone from the stack.


storeStaticField

void storeStaticField(String className,
                      String fieldName,
                      TypeDesc type)
Generates code that stores a value into a field from any class. A value must be on the stack. After the generated code has executed, the value is gone from the stack.


storeStaticField

void storeStaticField(TypeDesc classDesc,
                      String fieldName,
                      TypeDesc type)
Generates code that stores a value into a field from any class. A value must be on the stack. After the generated code has executed, the value is gone from the stack.

Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

returnVoid

void returnVoid()
Generates code that returns void.


returnValue

void returnValue(TypeDesc type)
Generates code that returns an object or primitive type. The value to return must be on the stack.

The type doesn't need to be an exact match for objects. TypeDesc.OBJECT works fine for all objects. For primitive types, use the appropriate TypeDesc. For an int, the type is TypeDesc.INT.


convert

void convert(TypeDesc fromType,
             TypeDesc toType)
Generates code that converts the value of a primitive type already on the stack. Conversions between all primitive types are supported as well as boxing and unboxing conversions. Some example conversions:
 int to char
 byte to double
 Double to double
 Float to boolean
 long to Long
 Double to Short
 
In all, 240 conversions are supported.

Throws:
IllegalArgumentException - if conversion not supported

convert

void convert(TypeDesc fromType,
             TypeDesc toType,
             int fpConvertMode)
Generates code that converts the value of a primitive type already on the stack. Conversions between all primitive types are supported as well as boxing and unboxing conversions. Some example conversions:
 int to char
 byte to double
 Double to double
 Float to boolean
 long to Long
 Double to Short
 
In all, 240 conversions are supported.

Parameters:
fpConvertMode - controls floating point conversion if converting float <--> int or double <--> long
Throws:
IllegalArgumentException - if conversion not supported

invoke

void invoke(Method method)
Generates code to invoke a method. If the method is static, the method's argument(s) must be on the stack. If the method is non-static, then the object reference must also be on the stack, prior to the arguments.


invokeVirtual

void invokeVirtual(String methodName,
                   TypeDesc ret,
                   TypeDesc[] params)
Generates code to invoke a virtual method in this class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeVirtual

void invokeVirtual(String className,
                   String methodName,
                   TypeDesc ret,
                   TypeDesc[] params)
Generates code to invoke a virtual method in any class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeVirtual

void invokeVirtual(TypeDesc classDesc,
                   String methodName,
                   TypeDesc ret,
                   TypeDesc[] params)
Generates code to invoke a virtual method in any class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.
Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

invokeStatic

void invokeStatic(String methodName,
                  TypeDesc ret,
                  TypeDesc[] params)
Generates code to invoke a static method in this class. The method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeStatic

void invokeStatic(String className,
                  String methodName,
                  TypeDesc ret,
                  TypeDesc[] params)
Generates code to invoke a static method in any class. The method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeStatic

void invokeStatic(TypeDesc classDesc,
                  String methodName,
                  TypeDesc ret,
                  TypeDesc[] params)
Generates code to invoke a static method in any class. The method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.
Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

invokeInterface

void invokeInterface(String className,
                     String methodName,
                     TypeDesc ret,
                     TypeDesc[] params)
Generates code to invoke an interface method in any class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeInterface

void invokeInterface(TypeDesc classDesc,
                     String methodName,
                     TypeDesc ret,
                     TypeDesc[] params)
Generates code to invoke an interface method in any class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.
Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

invokePrivate

void invokePrivate(String methodName,
                   TypeDesc ret,
                   TypeDesc[] params)
Generates code to invoke a private method in this class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeSuper

void invokeSuper(Method method)
Generates code to invoke a method in the super class. The object reference and the method's argument(s) must be on the stack.


invokeSuper

void invokeSuper(String superClassName,
                 String methodName,
                 TypeDesc ret,
                 TypeDesc[] params)
Generates code to invoke a method in the super class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.

invokeSuper

void invokeSuper(TypeDesc superClassDesc,
                 String methodName,
                 TypeDesc ret,
                 TypeDesc[] params)
Generates code to invoke a method in the super class. The object reference and the method's argument(s) must be on the stack.

Parameters:
ret - May be null if method returns void.
params - May be null if method takes no parameters.
Throws:
IllegalArgumentException - if superClassDesc refers to an array or primitive type

invoke

void invoke(Constructor constructor)
Generates code to invoke a class constructor in any class. The object reference and the constructor's argument(s) must be on the stack.


invokeConstructor

void invokeConstructor(TypeDesc[] params)
Generates code to invoke a class constructor in this class. The object reference and the constructor's argument(s) must be on the stack.

Parameters:
params - May be null if constructor takes no parameters.

invokeConstructor

void invokeConstructor(String className,
                       TypeDesc[] params)
Generates code to invoke a class constructor in any class. The object reference and the constructor's argument(s) must be on the stack.

Parameters:
params - May be null if constructor takes no parameters.

invokeConstructor

void invokeConstructor(TypeDesc classDesc,
                       TypeDesc[] params)
Generates code to invoke a class constructor in any class. The object reference and the constructor's argument(s) must be on the stack.

Parameters:
params - May be null if constructor takes no parameters.
Throws:
IllegalArgumentException - if classDesc refers to an array or primitive type

invokeSuperConstructor

void invokeSuperConstructor(TypeDesc[] params)
Generates code to invoke a super class constructor. The object reference and the constructor's argument(s) must be on the stack.

Parameters:
params - May be null if constructor takes no parameters.

newObject

void newObject(TypeDesc type)
Generates code to create a new object. Unless the new object is an array, it is invalid until a constructor method is invoked on it.

If the specified type is an array, this call is equivalent to newObject(type, 1). The size of the dimension must be on the operand stack. To create multi-dimensional arrays, call newObject(type, dimensions).

See Also:
invokeConstructor(org.cojen.classfile.TypeDesc[])

newObject

void newObject(TypeDesc type,
               int dimensions)
Generates code to create a new array. The type descriptor specifies the type of array to create. The dimensions parameter specifies the amount of dimensions that will initialized, which may not be larger than the amount of dimensions specified in the type.

For each dimension, its size must be on the operand stack. If the specified dimensions is 0 and the type is not an array, then this call is equivalent to newObject(type).


dup

void dup()
Generates code for the dup instruction.


dupX1

void dupX1()
Generates code for the dup_x1 instruction.


dupX2

void dupX2()
Generates code for the dup_x2 instruction.


dup2

void dup2()
Generates code for the dup2 instruction.


dup2X1

void dup2X1()
Generates code for the dup2_x1 instruction.


dup2X2

void dup2X2()
Generates code for the dup2_x2 instruction.


pop

void pop()
Generates code for the pop instruction.


pop2

void pop2()
Generates code for the pop2 instruction.


swap

void swap()
Generates code for the swap instruction.


swap2

void swap2()
Generates code for a swap2 instruction.


branch

void branch(Location location)
Generates code that performs an unconditional branch to the specified location.

Parameters:
location - The location to branch to

ifNullBranch

void ifNullBranch(Location location,
                  boolean choice)
Generates code that performs a conditional branch based on the value of an object on the stack. A branch is performed based on whether the object reference on the stack is null or not.

The generated instruction consumes the value on the stack.

Parameters:
location - The location to branch to
choice - If true, do branch when null, else branch when not null

ifEqualBranch

void ifEqualBranch(Location location,
                   boolean choice)
Generates code that performs a conditional branch based on the value of two object references on the stack. A branch is performed based on whether the two objects are exactly the same.

The generated instruction consumes the two values on the stack.

Parameters:
location - The location to branch to
choice - If true, branch when equal, else branch when not equal

ifZeroComparisonBranch

void ifZeroComparisonBranch(Location location,
                            String choice)
                            throws IllegalArgumentException
Generates code the performs a conditional branch based on a comparison between an int value on the stack and zero. The int value on the stack is on the left side of the comparison expression.

The generated instruction consumes the value on the stack.

Parameters:
location - The location to branch to
choice - One of "==", "!=", "<", ">=", ">" or "<="
Throws:
IllegalArgumentException - When the choice is not valid

ifComparisonBranch

void ifComparisonBranch(Location location,
                        String choice)
                        throws IllegalArgumentException
Generates code the performs a conditional branch based on a comparison between two int values on the stack. The first int value on the stack is on the left side of the comparison expression.

The generated instruction consumes the two values on the stack.

Parameters:
location - The location to branch to
choice - One of "==", "!=", "<", ">=", ">" or "<="
Throws:
IllegalArgumentException - When the choice is not valid

ifComparisonBranch

void ifComparisonBranch(Location location,
                        String choice,
                        TypeDesc type)
                        throws IllegalArgumentException
Generates code the performs a conditional branch based on a comparison between two values of the given type on the stack. The first int value on the stack is on the left side of the comparison expression. When comparing objects, only an identity comparison is performed.

When comparing floating point values, treatment of NaN requires special attention. Ordinarily, it is assumed that the branch location represents the target of a comparison failure, and that the code to handle the "true" condition immediately follows the comparison. If this is not the case, append a 't' suffix to the choice to indicate that the target location is reached for a "true" condition. This suffix is ignored if the type is not a float or double.

The generated instruction(s) consumes the two values on the stack.

Parameters:
location - The location to branch to
choice - One of "==", "!=", "<", ">=", ">", "<=", "==t", "!=t", "=t", ">t", or "<=t". Object types can only be compared for equality.
type - Type to expect on the stack
Throws:
IllegalArgumentException - When the choice is not valid

switchBranch

void switchBranch(int[] cases,
                  Location[] locations,
                  Location defaultLocation)
Generates code for a switch statement. The generated code is either a lookupswitch or tableswitch. The choice of which switch type to generate is made based on the amount of bytes to be generated. A tableswitch is usually smaller, unless the cases are sparse.

The key value to switch on must already be on the stack when this instruction executes. It is consumed by the instruction.

Parameters:
cases - The values to match on. The array length must be the same as for locations.
locations - The locations to branch to for each case. The array length must be the same as for cases.
defaultLocation - The location to branch to if the key on the stack was not matched.

jsr

void jsr(Location location)
Generates code that performs a subroutine branch to the specified location. The instruction generated is either jsr or jsr_w. It is most often used for implementing a finally block.

Parameters:
location - The location to branch to

ret

void ret(LocalVariable local)
Generates code that returns from a subroutine invoked by jsr.

Parameters:
local - The local variable reference that contains the return address. The local variable must be of an object type.

math

void math(byte opcode)
Generates code for either a unary or binary math operation on one or two values pushed on the stack.

Pass in an opcode from the the Opcode class. The only valid math opcodes are:

 IADD, ISUB, IMUL, IDIV, IREM, INEG, IAND, IOR, IXOR, ISHL, ISHR, IUSHR
 LADD, LSUB, LMUL, LDIV, LREM, LNEG, LAND, LOR, LXOR, LSHL, LSHR, LUSHR
 FADD, FSUB, FMUL, FDIV, FREM, FNEG
 DADD, DSUB, DMUL, DDIV, DREM, DNEG

 LCMP
 FCMPG, FCMPL
 DCMPG, DCMPL
 
A not operation (~) is performed by doing a loadConstant with either -1 or -1L followed by math(Opcode.IXOR) or math(Opcode.LXOR).

Parameters:
opcode - An opcode from the Opcode class.
Throws:
IllegalArgumentException - When the opcode selected is not a math operation.
See Also:
Opcode

arrayLength

void arrayLength()
Generates code for an arraylength instruction. The object to get the length from must already be on the stack.


throwObject

void throwObject()
Generates code that throws an exception. The object to throw must already be on the stack.


checkCast

void checkCast(TypeDesc type)
Generates code that performs an object cast operation. The object to check must already be on the stack.


instanceOf

void instanceOf(TypeDesc type)
Generates code that performs an instanceof operation. The object to check must already be on the stack.


integerIncrement

void integerIncrement(LocalVariable local,
                      int amount)
Generates code that increments a local integer variable by a signed constant amount.


monitorEnter

void monitorEnter()
Generates code to enter the monitor on an object loaded on the stack.


monitorExit

void monitorExit()
Generates code to exit the monitor on an object loaded on the stack.


nop

void nop()
Generates an instruction that does nothing. (No-OPeration)


breakpoint

void breakpoint()
Generates a breakpoint instruction for use in a debugging environment.



Copyright © 2004-2011 Brian S O'Neill. All Rights Reserved.