mjc

org.multijava.mjc
Class CodeSequence

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CodeSequence
All Implemented Interfaces:
Cloneable, Constants

public final class CodeSequence
extends Utils
implements Constants


Field Summary
private  Stack contexts
           
private  boolean discardValue
           
private  ArrayList handlers
           
private  Instruction[] instructions
           
private  boolean labelAtEnd
           
private  int lastLine
           
private  int lineNumber
           
private  ArrayList lines
           
private  int pc
           
private static Stack stack
           
 
Fields inherited from class org.multijava.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
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
private CodeSequence()
          Constructs a code attribute.
 
Method Summary
 void addExceptionHandler(HandlerInfo info)
          Add an exception handler to this code
private  void addLocalVarInfo(LocalVarInstruction insn, JLocalVariable var)
          Add a local variable name information
 boolean discardValue()
           
 void ensureFinalReturn()
          Ensures that the code block ends with a no-argument return statement.
static CodeSequence getCodeSequence()
          Constructs a code sequence.
 HandlerInfo[] getHandlers()
          Returns an array of all exception handler
 Instruction[] getInstructionArray()
          Return the instruction as a list WARNING: AFTER a call to release() this array will be reused
 Instruction getInstructionAt(int pc)
          Returns the instruction at a given position
 LineNumberInfo[] getLineNumbers()
           
 LocalVariableInfo[] getLocalVariableInfos()
           
 int getPC()
          Gets the location in code sequence
static void initSession()
           
 void plantBreak(JStatement top)
          Ask the code handler to generate the necessary code to call every finally and monitorexit
 void plantInstruction(Instruction insn)
          Adds an instruction to the code of the current method.
 void plantLabel(CodeLabel label)
          Adds an instruction to the code of the current method.
 void plantLabelRef(int opcode, CodeLabel label)
          Adds an instruction to the code of the current method.
 void plantLoadThis()
          Adds a load of this (local var 0)
 void plantLocalVar(int opcode, JLocalVariable var)
          Adds a local var instruction to the code of the current method.
 void plantReturn(JReturnStatement ret)
          Ask the code handler to generate the necessary code to call every finally clause of all try statements
 void plantSwap()
          Plants a swap instruction on the end of this code sequence.
 void popContext(JStatement stmt)
          Informs the code handlers that we exit a breakable code.
 void pushContext(JStatement stmt)
          Informs the code handlers that we begin a portion of breakable code.
 void release()
          Release a code sequence
private  void resolveLabels()
           
 void setDiscardValue(boolean discardValue)
           
 void setLineNumber(int lineNumber)
           
 int size()
          Returns the actual size of code (number of instruction)
 
Methods inherited from class org.multijava.util.Utils
assertTrue, assertTrue, combineArrays, escapeString, escapeString, fail, fail, getFilePath, hasFlag, hasOtherFlags, parsePathParts, relativePathTo, splitQualifiedName, splitQualifiedName, stripJavaModifiers, stripNonJavaModifiers, stripPrivateModifier, unescapeString, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

instructions

private Instruction[] instructions

handlers

private ArrayList handlers

lines

private ArrayList lines

pc

private int pc

discardValue

private boolean discardValue

labelAtEnd

private boolean labelAtEnd

lineNumber

private int lineNumber

lastLine

private int lastLine

contexts

private Stack contexts

stack

private static final Stack stack
Constructor Detail

CodeSequence

private CodeSequence()
Constructs a code attribute.

Method Detail

getCodeSequence

public static CodeSequence getCodeSequence()
Constructs a code sequence.


release

public void release()
Release a code sequence


initSession

public static void initSession()

plantInstruction

public final void plantInstruction(Instruction insn)
Adds an instruction to the code of the current method.

Parameters:
insn - the instruction to append

plantLocalVar

public final void plantLocalVar(int opcode,
                                JLocalVariable var)
Adds a local var instruction to the code of the current method.


plantLoadThis

public final void plantLoadThis()
Adds a load of this (local var 0)


plantLabelRef

public final void plantLabelRef(int opcode,
                                CodeLabel label)
Adds an instruction to the code of the current method.


plantLabel

public final void plantLabel(CodeLabel label)
Adds an instruction to the code of the current method.


plantSwap

public final void plantSwap()
Plants a swap instruction on the end of this code sequence.


setLineNumber

public final void setLineNumber(int lineNumber)
Parameters:
lineNumber - the current line number in source code

getLineNumbers

public final LineNumberInfo[] getLineNumbers()
Returns:
an array of line number information

getLocalVariableInfos

public final LocalVariableInfo[] getLocalVariableInfos()
Returns:
an array of local vars information

setDiscardValue

public final void setDiscardValue(boolean discardValue)
Parameters:
discardValue - set if the value of subexpression should be discarded

discardValue

public final boolean discardValue()
Returns:
true if super expression use value of sub expression

plantReturn

public final void plantReturn(JReturnStatement ret)
Ask the code handler to generate the necessary code to call every finally clause of all try statements


plantBreak

public final void plantBreak(JStatement top)
Ask the code handler to generate the necessary code to call every finally and monitorexit


ensureFinalReturn

public final void ensureFinalReturn()
Ensures that the code block ends with a no-argument return statement. This method should be called as the last step of code generation for the body of a method with a return type of void.


pushContext

public final void pushContext(JStatement stmt)
Informs the code handlers that we begin a portion of breakable code.


popContext

public final void popContext(JStatement stmt)
Informs the code handlers that we exit a breakable code. Checks that contexts match.


addExceptionHandler

public final void addExceptionHandler(HandlerInfo info)
Add an exception handler to this code


getHandlers

public final HandlerInfo[] getHandlers()
Returns an array of all exception handler


getPC

public final int getPC()
Gets the location in code sequence


size

public final int size()
Returns the actual size of code (number of instruction)


getInstructionAt

public final Instruction getInstructionAt(int pc)
Returns the instruction at a given position


getInstructionArray

public Instruction[] getInstructionArray()
Return the instruction as a list WARNING: AFTER a call to release() this array will be reused


resolveLabels

private void resolveLabels()

addLocalVarInfo

private final void addLocalVarInfo(LocalVarInstruction insn,
                                   JLocalVariable var)
Add a local variable name information


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.