at.dms.kjc
Class CAbstractBodyContext

java.lang.Object
  |
  +--at.dms.util.Utils
        |
        +--at.dms.kjc.CContext
              |
              +--at.dms.kjc.CAbstractBodyContext
All Implemented Interfaces:
Constants, Constants
Direct Known Subclasses:
CBlockContext, CBodyContext, CLabeledContext, CLoopContext, CSwitchBodyContext, CTryContext

public class CAbstractBodyContext
extends CContext

Abstract base class for different BodyContexts. It follows the control flow and maintains assignment information about local variables and fields, which uncaught exceptions can occur at each point in the block. It also verify that code is still reachable.

See Also:
CContext, CCompilationUnitContext, CClassContext, CMethodContext, CConstructorContext, CInitializerContext, CBodyContext, CBlockContext

Field Summary
protected  CVariableInfo fieldInfo
          Field assignment information.
static int FLOW_BREAKED
          Control flow is breaked from this point on.
static int FLOW_CONTINUED
          Control flow is continued from this point on.
static int FLOW_INLOOP
          Control flow is inside a loop construct.
static int FLOW_INSWITCH
          Control flow is inside a switch construct.
static int FLOW_UNREACHABLE
          Code Unreachable at this point in control flow.
protected  int flowState
          Control flow analysis info.
protected  java.util.Set throwables
          Exceptions that can be thrown from this at a point in the source code.
protected  CVariableInfo variableInfo
          Local variable assignment information.
 
Fields inherited from class at.dms.kjc.CContext
cunit, parent
 
Fields inherited from class at.dms.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
Fields inherited from interface at.dms.kjc.Constants
CMP_VERSION, JAV_CLASS, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_THIS, JAV_THROWABLE, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LE, OPE_LNOT, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_SHORT, TID_VOID
 
Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_NBR_FLAGS, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_EXCEPTIONS, ATT_GENERIC, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_SOURCEFILE, ATT_SYNTHETIC, 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_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_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_ldc_w, opc_ldc2_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
protected CAbstractBodyContext(CAbstractBodyContext parent)
          Construct a block context, it supports local variable allocation throw statement and return statement.
protected CAbstractBodyContext(CMethodContext parent)
          Construct a block context, it supports local variable allocation throw statement and return statement.
 
Method Summary
 void addBreak()
          Makes code in this flow unreachable after this point, and marks the flow as "breaked".
 void addBreak(JStatement breakTo, CBodyContext from)
          Adds a break from within this context to the specified statement.
 void addContinue()
          Makes code in this flow unreachable after this point, and marks the flow as "continued".
 void addContinue(JStatement continueTo, CBodyContext from)
          Adds a continue from within this context to the specified statement.
 void addFieldInfo(int index, int info)
          Adds new assignment info to existing assignment info.
protected  void addForwardedBreak(JStatement breakTo, CBodyContext from)
          Adds a break from within this context to the specified statement.
protected  void addForwardedContinue(JStatement continueTo, CBodyContext from)
          Adds a continue from within this context to the specified statement.
 void addReturn()
          Makes code in this flow unreachable after this point.
 void addThrowable(CThrowableInfo throwable)
          Adds one throwable to the set that can be thrown from this context.
 void addThrowables(java.util.Set newThrowables)
          Adds throwables to the set that can be thrown from this context.
 void addVariableInfo(int index, int info)
          Adds new assignment info to existing assignment info.
 void close(TokenReference ref)
          Verify everything is okay at the end of this context.
 int getFieldInfo(int index)
           
 int getFlowState()
          Return the current flow state.
 JLabeledStatement getLabeledStatement(java.lang.String label)
          Returns the statement with the specified label.
 int getMaxLocalsPosition()
          ...
 JStatement getNearestBreakableStatement()
          Returns the nearest breakable statement.
 JStatement getNearestContinuableStatement()
          Returns the nearest continuable statement.
 java.util.Set getThrowables()
           
 int getVariableInfo(int index)
           
 void informParent()
          Verify everything is okay at the end of this context.
 boolean isBreaked()
          Returns true if current point in control flow is after a break statement.
 boolean isContinued()
          Returns true if current point in control flow is after a continue statement.
 boolean isInLoop()
          Returns true if current control flow is inside a loop construct.
 boolean isReachable()
          Returns true if current point in control flow is ever reachable.
 CField lookupField(java.lang.String ident)
          lookupField
 JLocalVariable lookupLocalVariable(java.lang.String ident)
          lookupLocalVariable
 JExpression lookupOuterLocalVariable(TokenReference ref, java.lang.String ident)
          lookupOuterLocalVariable
 void setFieldInfo(int index, int info)
          Replaces old assignment info with new info.
 void setReachable(boolean reachable)
          Returns true if current control flow is ever reachable.
 void setVariableInfo(int index, int info)
          Replaces old assignment info with new info.
 
Methods inherited from class at.dms.kjc.CContext
addSourceClass, check, check, check, fail, getBlockContext, getClassContext, getCompilationUnit, getCompiler, getMethodContext, getParentContext, lookupClass, lookupMethod, reportTrouble
 
Methods inherited from class at.dms.util.Utils
assert, assert, fail, fail, hasFlag, hasMoreThanOneFlag, hasOtherFlags, splitQualifiedName, splitQualifiedName, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

FLOW_UNREACHABLE

public static final int FLOW_UNREACHABLE
Code Unreachable at this point in control flow. Binary constant for flowState.

FLOW_BREAKED

public static final int FLOW_BREAKED
Control flow is breaked from this point on. Code just after break in same flow is not reachable. Binary constant for flowState.

FLOW_CONTINUED

public static final int FLOW_CONTINUED
Control flow is continued from this point on. Code just after continue in same flow is not reachable. Binary constant for flowState.

FLOW_INLOOP

public static final int FLOW_INLOOP
Control flow is inside a loop construct. Binary constant for flowState.

FLOW_INSWITCH

public static final int FLOW_INSWITCH
Control flow is inside a switch construct. Currently an alias for FLOW_INLOOP. Binary constant for flowState.
See Also:
FLOW_INLOOP

flowState

protected int flowState
Control flow analysis info.

variableInfo

protected CVariableInfo variableInfo
Local variable assignment information.

fieldInfo

protected CVariableInfo fieldInfo
Field assignment information.

throwables

protected java.util.Set throwables
Exceptions that can be thrown from this at a point in the source code.
Constructor Detail

CAbstractBodyContext

protected CAbstractBodyContext(CAbstractBodyContext parent)
Construct a block context, it supports local variable allocation throw statement and return statement. This starts a new context in a method.
Parameters:
parent - The parent context, it must be different than null except if called by the top level.

CAbstractBodyContext

protected CAbstractBodyContext(CMethodContext parent)
Construct a block context, it supports local variable allocation throw statement and return statement. This starts a new context in a method.
Parameters:
parent - The parent context, it must be different than null except if called by the top level.
Method Detail

close

public void close(TokenReference ref)
Verify everything is okay at the end of this context.

informParent

public void informParent()
Verify everything is okay at the end of this context.

addBreak

public final void addBreak(JStatement breakTo,
                           CBodyContext from)
                    throws PositionedError
Adds a break from within this context to the specified statement.

addContinue

public final void addContinue(JStatement continueTo,
                              CBodyContext from)
                       throws PositionedError
Adds a continue from within this context to the specified statement.

addForwardedBreak

protected void addForwardedBreak(JStatement breakTo,
                                 CBodyContext from)
                          throws PositionedError
Adds a break from within this context to the specified statement.

addForwardedContinue

protected void addForwardedContinue(JStatement continueTo,
                                    CBodyContext from)
                             throws PositionedError
Adds a continue from within this context to the specified statement.

isInLoop

public boolean isInLoop()
Returns true if current control flow is inside a loop construct.

setReachable

public void setReachable(boolean reachable)
Returns true if current control flow is ever reachable.

addReturn

public void addReturn()
Makes code in this flow unreachable after this point.

addBreak

public void addBreak()
Makes code in this flow unreachable after this point, and marks the flow as "breaked".

addContinue

public void addContinue()
Makes code in this flow unreachable after this point, and marks the flow as "continued".

isReachable

public boolean isReachable()
Returns true if current point in control flow is ever reachable.

isBreaked

public boolean isBreaked()
Returns true if current point in control flow is after a break statement.

isContinued

public boolean isContinued()
Returns true if current point in control flow is after a continue statement.

getFlowState

public int getFlowState()
Return the current flow state.
Returns:
A bit-structure containing different information in different bits.

getMaxLocalsPosition

public int getMaxLocalsPosition()
...

getLabeledStatement

public JLabeledStatement getLabeledStatement(java.lang.String label)
Returns the statement with the specified label.

getNearestBreakableStatement

public JStatement getNearestBreakableStatement()
Returns the nearest breakable statement.

getNearestContinuableStatement

public JStatement getNearestContinuableStatement()
Returns the nearest continuable statement.

addVariableInfo

public void addVariableInfo(int index,
                            int info)
Adds new assignment info to existing assignment info.
Parameters:
index - The variable position in method array of local vars.
info - The assignment information to set. We make it a local copy of this information and at the end of this context we will transfer it to the parent context according to controlFlow.

setVariableInfo

public void setVariableInfo(int index,
                            int info)
Replaces old assignment info with new info.
Parameters:
index - The variable position in method array of local vars.
info - The assignment information to set. We make it a local copy of this information and at the end of this context we will transfer it to the parent context according to controlFlow.

getVariableInfo

public int getVariableInfo(int index)
Parameters:
var - the definition of a variable
Returns:
all informations we have about this variable

addFieldInfo

public void addFieldInfo(int index,
                         int info)
Adds new assignment info to existing assignment info.
Overrides:
addFieldInfo in class CContext
Parameters:
index - The field position.
info - The assignment information to add. We make it a local copy of this information and at the end of this context we will transfert it to the parent context according to controlFlow.

setFieldInfo

public void setFieldInfo(int index,
                         int info)
Replaces old assignment info with new info.
Parameters:
index - The field position.
info - The assignment information to set. We make it a local copy of this information and at the end of this context we will transfert it to the parent context according to controlFlow.

getFieldInfo

public int getFieldInfo(int index)
Overrides:
getFieldInfo in class CContext
Parameters:
var - the definition of a field
Returns:
all informations we have about this field

lookupField

public CField lookupField(java.lang.String ident)
                   throws UnpositionedError
lookupField
Overrides:
lookupField in class CContext
Parameters:
ident - the name of the field
Returns:
a variable from an ident in current context
Throws:
UnpositionedError - this error will be positioned soon

lookupLocalVariable

public JLocalVariable lookupLocalVariable(java.lang.String ident)
lookupLocalVariable
Overrides:
lookupLocalVariable in class CContext
Parameters:
ident - the name of the variable
Returns:
a variable from an ident in current context

lookupOuterLocalVariable

public JExpression lookupOuterLocalVariable(TokenReference ref,
                                            java.lang.String ident)
lookupOuterLocalVariable
Parameters:
ident - the name of the variable
Returns:
a variable from an ident in upperclass context

addThrowable

public void addThrowable(CThrowableInfo throwable)
Adds one throwable to the set that can be thrown from this context.
Parameters:
throwable - The type of the new throwable.

addThrowables

public void addThrowables(java.util.Set newThrowables)
Adds throwables to the set that can be thrown from this context.

getThrowables

public java.util.Set getThrowables()
Returns:
the list of exception that may be thrown