org.cojen.classfile
Interface CodeAssembler

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

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.
 LocalVariable createLocalVariable(TypeDesc type)
          Creates an unnamed LocalVariable.
 void dup()
          Generates code for the dup instruction, which duplicates the top word on the stack.
 void dup2()
          Generates code for the dup2 instruction, which duplicates the top pair of words on the stack.
 void dup2X1()
          Generates code for the dup2_x1 instruction, which duplicates the top pair of words on the stack and puts it three levels down.
 void dup2X2()
          Generates code for the dup2_x2 instruction, which duplicates the top pair of words on the stack and puts it four levels down.
 void dupX1()
          Generates code for the dup_x1 instruction, which duplicates the top word on the stack and puts it two levels down.
 void dupX2()
          Generates code for the dup_x2 instruction, which duplicates the top word on the stack and puts it three levels down.
 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 method input parameter by a zero-based index.
 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, which simply discards the top word on the stack.
 void pop2()
          Generates code for the pop2 instruction, which simply discards the top two words on the stack.
 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, which swaps to the top two words on the stack.
 void swap2()
          Generates code for a swap2 instruction, which swaps to the top two pair of words on the stack.
 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 method input parameter by a zero-based index. Parameter zero always refers to the first parameter in the method signature. If defining a non-static method, the "this" variable is accessed by calling loadThis().

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.

createLocalVariable

LocalVariable createLocalVariable(TypeDesc type)
Creates an unnamed LocalVariable.

Parameters:
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, which duplicates the top word on the stack. For duplicating double and long types, use the dup2 instruction.


dupX1

void dupX1()
Generates code for the dup_x1 instruction, which duplicates the top word on the stack and puts it two levels down. For duplicating double and long types, use the dup2_x1 instruction.


dupX2

void dupX2()
Generates code for the dup_x2 instruction, which duplicates the top word on the stack and puts it three levels down. For duplicating double and long types, use the dup2_x2 instruction.


dup2

void dup2()
Generates code for the dup2 instruction, which duplicates the top pair of words on the stack. For duplicating single-word types, like int and object references, use the dup instruction.


dup2X1

void dup2X1()
Generates code for the dup2_x1 instruction, which duplicates the top pair of words on the stack and puts it three levels down. For duplicating single-word types, like int and object references, use the dup_x1 instruction.


dup2X2

void dup2X2()
Generates code for the dup2_x2 instruction, which duplicates the top pair of words on the stack and puts it four levels down. For duplicating single-word types, like int and object references, use the dup_x2 instruction.


pop

void pop()
Generates code for the pop instruction, which simply discards the top word on the stack. For popping double and long types, use the pop2 instruction.


pop2

void pop2()
Generates code for the pop2 instruction, which simply discards the top two words on the stack. For popping single-word types, like int and object references, use the pop instruction.


swap

void swap()
Generates code for the swap instruction, which swaps to the top two words on the stack. For swapping double and long types, use the swap2 pseudo instruction.


swap2

void swap2()
Generates code for a swap2 instruction, which swaps to the top two pair of words on the stack. For swapping single-word types, like int and object references, use the swap 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 one of the following math opcodes:
 IADD  - add top two int operands
 ISUB  - subtract top two int operands (topmost is subtrahend)
 IMUL  - multiply top two int operands
 IDIV  - divide top two int operands (topmost is divisor)
 IREM  - remainder of top two int operands (topmost is divisor)
 INEG  - negate top int operand
 IAND  - logical 'and' of top two int operands
 IOR   - logical 'or' of top two int operands
 IXOR  - logical 'exclusive or' of top two int operands
 ISHL  - shift left of int operand by topmost int shift amount
 ISHR  - signed shift right of int operand by topmost int shift amount
 IUSHR - unsigned shift right of int operand by topmost int shift amount

 LADD  - add top two long operands
 LSUB  - subtract top two long operands (topmost is subtrahend)
 LMUL  - multiply top two long operands
 LDIV  - divide top two long operands (topmost is divisor)
 LREM  - remainder of top two long operands (topmost is divisor)
 LNEG  - negate top long operand
 LAND  - logical 'and' of top two long operands
 LOR   - logical 'or' of top two long operands
 LXOR  - logical 'exclusive or' of top two long operands
 LSHL  - shift left of long operand by topmost int shift amount
 LSHR  - signed shift right of long operand by topmost int shift amount
 LUSHR - unsigned shift right of long operand by topmost int shift amount

 FADD  - add top two float operands
 FSUB  - subtract top two float operands (topmost is subtrahend)
 FMUL  - multiply top two float operands
 FDIV  - divide top two float operands (topmost is divisor)
 FREM  - remainder of top two float operands (topmost is divisor)
 FNEG  - negate top float operand

 DADD  - add top two double operands
 DSUB  - subtract top two double operands (topmost is subtrahend)
 DMUL  - multiply top two double operands
 DDIV  - divide top two double operands (topmost is divisor)
 DREM  - remainder of top two double operands (topmost is divisor)
 DNEG  - negate top double operand

 LCMP  - compare top two long operands, yielding an int -1, 0 or 1
 FCMPG - compare top two float operands, yielding an int -1, 0 or 1 (NaN -> 1)
 FCMPL - compare top two float operands, yielding an int -1, 0 or 1 (NaN -> -1)
 DCMPG - compare top two double operands, yielding an int -1, 0 or 1 (NaN -> 1)
 DCMPL - compare top two double operands, yielding an int -1, 0 or 1 (NaN -> -1)
 
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.