mjc

org.multijava.util.classfile
Class Instruction

java.lang.Object
  extended byorg.multijava.util.classfile.AbstractInstructionAccessor
      extended byorg.multijava.util.classfile.Instruction
All Implemented Interfaces:
Constants, InstructionAccessor
Direct Known Subclasses:
ClassRefInstruction, FieldRefInstruction, IincInstruction, InvokeinterfaceInstruction, JumpInstruction, LocalVarInstruction, MethodRefInstruction, MultiarrayInstruction, NewarrayInstruction, NoArgInstruction, PushLiteralInstruction, SwitchInstruction

public abstract class Instruction
extends AbstractInstructionAccessor
implements Constants

Root class for instructions. An instruction is defined by its opcode and its arguments.


Field Summary
private  int address
           
private  int opcode
           
 
Fields inherited from interface org.multijava.util.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, ATT_ANCHOR, ATT_BRIDGE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_DISPATCHER, ATT_EXCEPTIONS, ATT_GENERIC, ATT_GENERIC_FUNCTIONS, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_MM_BODY, ATT_REDIRECTOR, ATT_RMJ_GLUE, ATT_RMJ_SIGNATURE, ATT_RUNTIME_VISIBLE_ANNOTATIONS, ATT_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATT_SIGNATURE, ATT_SOURCEFILE, ATT_SYNTHETIC, ATT_UNIVERSE_FIELD, ATT_UNIVERSE_METHOD, ATT_UNIVERSE_VERSION, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_dup_x1, opc_dup_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc2_w, opc_ldc_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
Instruction(int opcode)
          Constructs a new instruction
 
Method Summary
abstract  boolean canComplete()
          Returns true iff control flow can reach the next instruction in textual order after executing this instruction.
(package private)  void check(CodeEnv env, int curStack)
          Verifies the enclosed instruction and computes the stack height.
(package private)  void computeEndAddress(CodePosition position)
          Computes the address of the end of the instruction.
 void dump()
           
(package private)  int getAddress()
          Returns the offset in bytes of the instruction from the beginning of the method code (ie classfile).
(package private)  int getLocalVar()
          Returns the maximum index of local vars used by this instruction.
 int getOpcode()
          Returns the opcode of the instruction
 int getPoppedFromStack()
          Returns the size of data pushed on the stack by this instruction
abstract  int getPushedOnStack()
          Returns the size of data pushed on the stack by this instruction
abstract  byte getReturnType()
          Returns the type pushed on the stack
(package private) abstract  int getSize()
          Returns the number of bytes used by the the instruction in the code array.
abstract  int getStack()
          Returns the amount of stack (positive or negative) used by this instruction.
 boolean isLiteral()
          Returns true iff this instruction is a literal.
(package private) abstract  void resolveConstants(ConstantPool cp)
          Inserts or checks location of constant value in constant pool
(package private)  void setAddress(int address)
          Sets the the offset in bytes of the instruction from the beginning of the method code
(package private)  void setOpcode(int opcode)
          Returns the opcode of the instruction Needed by PushLiteralInstruction
(package private) abstract  void write(ConstantPool cp, DataOutput out)
          Write this class into the the file (out) getting data position from the constant pool
 
Methods inherited from class org.multijava.util.classfile.AbstractInstructionAccessor
transform
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

opcode

private int opcode

address

private int address
Constructor Detail

Instruction

public Instruction(int opcode)
Constructs a new instruction

Parameters:
opcode - the opcode of the instruction
Method Detail

getOpcode

public final int getOpcode()
Returns the opcode of the instruction


setOpcode

final void setOpcode(int opcode)
Returns the opcode of the instruction Needed by PushLiteralInstruction


getAddress

final int getAddress()
Returns the offset in bytes of the instruction from the beginning of the method code (ie classfile).


setAddress

final void setAddress(int address)
Sets the the offset in bytes of the instruction from the beginning of the method code


getSize

abstract int getSize()
Returns the number of bytes used by the the instruction in the code array.


getLocalVar

int getLocalVar()
Returns the maximum index of local vars used by this instruction.


check

void check(CodeEnv env,
           int curStack)
     throws ClassFileFormatException
Verifies the enclosed instruction and computes the stack height.

Parameters:
env - the check environment
curStack - the stack height at the end of the execution of the instruction
Returns:
true iff the next instruction in textual order needs to be checked, i.e. this instruction has not been checked before and it can complete normally
Throws:
ClassFileFormatException - a problem was detected

computeEndAddress

void computeEndAddress(CodePosition position)
Computes the address of the end of the instruction.

Parameters:
position - the minimum and maximum address of the begin of this instruction. This parameter is changed to the minimum and maximum address of the end of this instruction.

getReturnType

public abstract byte getReturnType()
Returns the type pushed on the stack


getStack

public abstract int getStack()
Returns the amount of stack (positive or negative) used by this instruction.


getPushedOnStack

public abstract int getPushedOnStack()
Returns the size of data pushed on the stack by this instruction


getPoppedFromStack

public final int getPoppedFromStack()
Returns the size of data pushed on the stack by this instruction


isLiteral

public boolean isLiteral()
Returns true iff this instruction is a literal.


canComplete

public abstract boolean canComplete()
Returns true iff control flow can reach the next instruction in textual order after executing this instruction.


resolveConstants

abstract void resolveConstants(ConstantPool cp)
Inserts or checks location of constant value in constant pool

Parameters:
cp - the constant pool for this class

write

abstract void write(ConstantPool cp,
                    DataOutput out)
             throws IOException
Write this class into the the file (out) getting data position from the constant pool

Parameters:
cp - the constant pool that contain all data
out - the file where to write this object info
Throws:
IOException - an io problem has occured

dump

public void dump()

mjc

mjc is Copyright (C) 2000-2004 by Iowa State University and is distributed under the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. mjc is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.