mjc

org.multijava.mjc
Class CLoopContext

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CContext
          extended byorg.multijava.mjc.CFlowControlContext
              extended byorg.multijava.mjc.CLoopContext
All Implemented Interfaces:
CContextType, CFlowControlContextType, Cloneable, Constants, Constants

public class CLoopContext
extends CFlowControlContext

This class represents the context for a loop statement during checking passes (checkInterface, checkInitializers, typecheck). It stores the loop statement and include methods for calculating to where breaks and continues inside this loop should be directed.

See Also:
CContextType

Field Summary
private  boolean bodyChecksCompleted
          Indicates that checks have been performed on this context between the completion of the loop body and the merging of break and continuation contexts.
private  JLoopStatement self
           
 
Fields inherited from class org.multijava.mjc.CFlowControlContext
cachedParent, fieldInfo, isReachable, methodContext, variableInfo
 
Fields inherited from class org.multijava.mjc.CContext
contextNullity, cunit, parent
 
Fields inherited from class org.multijava.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
Fields inherited from interface org.multijava.mjc.Constants
ACC_MODIFIER_FLAGS_MASK, ACC_NON_NULL, ACC_NON_NULL_BY_DEFAULT, ACC_NULLABLE, ACC_NULLABLE_BY_DEFAULT, ACC_PURE, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, AMID_JAVA_MATH, AMID_MAX, AMID_SAFE_MATH, CMP_VERSION, IMPLICITLY_NON_NULL, JAV_ASSERTION_ERROR, JAV_CLASS, JAV_CLASSLOADER, JAV_CLASSNOTFOUND_EXCEPTION, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_NOCLASSDEFFOUND_ERROR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RMJ_RUNTIME_EXCEPTION, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_SERIALIZABLE, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_SUPER, JAV_THIS, JAV_THROWABLE, MJ_ANCHOR, NULLITY_MODS, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LAND, OPE_LE, OPE_LNOT, OPE_LOR, 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_MAX, TID_SHORT, TID_VOID, UNIV_ARRAY_TMP, UNIV_TMP
 
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, 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
protected CLoopContext(CFlowControlContextType cachedParent, CLoopContext clone)
          Used by cloneContext.
(package private) CLoopContext(CFlowControlContextType parent, JLoopStatement self)
          Construct a block context, it supports local variable allocation throw statement and return statement
 
Method Summary
 void checkingComplete()
          Registers that this context is no longer needed.
 CFlowControlContextType cloneContext()
          Create a clone of this context to handle divergent paths in the control flow.
 boolean declaredOutsideOfLoop(JLocalVariable var)
          Indicates whether this context is enclosed in a loop and the given variable is declared outside the inner-most loop context.
 void doneWithCheckingBody()
          Performs final checks on the main body of the loop, i.e., on the context that represents a full execution of the loop body (without break or continue statements).
 JStatement getNearestBreakableStatement()
          Get the nearest breakable statement
 JStatement getNearestContinuableStatement()
          Get the nearest continuable statement.
 boolean isInLoop()
          Indicates whether this context is in a loop.
 
Methods inherited from class org.multijava.mjc.CFlowControlContext
addLocalClass, addSyntheticThisParameter, addThisVariable, addThrowable, addVariable, adopt, adoptParallelContexts, cachedParent, checkAssignmentToFinals, checkLocalVarUsage, createExpressionContext, createFinallyContext, createFlowControlContext, createFlowControlContext, createLabeledContext, createLoopContext, createParallelContexts, createSwitchBodyContext, createTryContext, declares, fieldCount, fieldIdent, fieldInfo, getFlowControlContext, getLabeledStatement, getTokenReference, initializeField, initializeVariable, isFieldDefinitelyAssigned, isFieldFinal, isFreshVariableName, isReachable, isVarDefinitelyAssigned, isVarDefinitelyUnassigned, isVarFinal, localsIndex, localsPosition, localVars, lookupClass, lookupLocalVariable, merge, numberOfLocalVars, parentIndex, replaceFieldInfoUpTo, replaceVariableInfoUpTo, setReachable, toString, variableInfo, varIdent
 
Methods inherited from class org.multijava.mjc.CContext
addFANonNull, addFANonNulls, addFANull, addFANulls, adoptNullityInfo, arithmeticMode, catchUp, check, check, check, check, classToGenerate, createClassContext, createExtMethodContext, createInterfaceContext, dumpNonNulls, fail, fail, findNearestHost, getClassContext, getCMethod, getCompilationUnit, getCompiler, getFANonNulls, getFANulls, getMethodContext, getParentContext, isBeforeSuperConstructorCall, isFANonNull, isInConstructor, isInInitializer, isPure, isStatic, lookupField, lookupField, lookupMethod, lookupMethod, lookupMethodOrSet, lookupMethodOrSet, lookupOuterField, lookupOuterField, lookupOuterLocalVariable, lookupTypeVariable, mergeNullityInfo, modUtil, registerGFDecl, registerVisibleMethod, registerVisibleType, removeAllFANullity, removeFANonNull, reportTrouble, resolveMaybeExtMethodRef
 
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, wait, wait, wait
 
Methods inherited from interface org.multijava.mjc.CContextType
addFANonNull, addFANonNulls, addFANull, addFANulls, adoptNullityInfo, arithmeticMode, catchUp, check, check, check, check, classToGenerate, createClassContext, createExtMethodContext, createInterfaceContext, dumpNonNulls, fail, fail, findNearestHost, getClassContext, getCMethod, getCompilationUnit, getCompiler, getFANonNulls, getFANulls, getMethodContext, getParentContext, isBeforeSuperConstructorCall, isFANonNull, isInConstructor, isInInitializer, isPure, isStatic, lookupField, lookupField, lookupMethod, lookupMethod, lookupMethodOrSet, lookupMethodOrSet, lookupOuterField, lookupOuterField, lookupOuterLocalVariable, lookupTypeVariable, mergeNullityInfo, modUtil, registerGFDecl, registerVisibleMethod, registerVisibleType, removeAllFANullity, removeFANonNull, reportTrouble, resolveMaybeExtMethodRef
 

Field Detail

self

private final JLoopStatement self

bodyChecksCompleted

private boolean bodyChecksCompleted
Indicates that checks have been performed on this context between the completion of the loop body and the merging of break and continuation contexts.

Constructor Detail

CLoopContext

CLoopContext(CFlowControlContextType parent,
             JLoopStatement self)
Construct a block context, it supports local variable allocation throw statement and return statement

Parameters:
parent - the parent context, it must be different than null except if called by the top level

CLoopContext

protected CLoopContext(CFlowControlContextType cachedParent,
                       CLoopContext clone)
Used by cloneContext. Should not be called by clients.

Method Detail

checkingComplete

public final void checkingComplete()

Registers that this context is no longer needed. Passes information collected by this context to the parent context.

Passes this context's field information to the surrounding context; passes local variable information to the surrounding context if that context is one which maintains local variable information.

Checks that local variables are used and issues warnings if not.

This should only be called on a linearly nested context! !FIXME!10/26 If we refactor the context creation code as planned (to lock the parent context) then this method is called to unlock the parent context when we exit a linearly nested context.

Specified by:
checkingComplete in interface CFlowControlContextType
Overrides:
checkingComplete in class CFlowControlContext

doneWithCheckingBody

public final void doneWithCheckingBody()
Performs final checks on the main body of the loop, i.e., on the context that represents a full execution of the loop body (without break or continue statements). Checks that the loop body does not assign to final variables and fields within code that might be repeated.


cloneContext

public CFlowControlContextType cloneContext()
Create a clone of this context to handle divergent paths in the control flow.

Specified by:
cloneContext in interface CFlowControlContextType
Overrides:
cloneContext in class CFlowControlContext

getNearestBreakableStatement

public JStatement getNearestBreakableStatement()
Get the nearest breakable statement

Specified by:
getNearestBreakableStatement in interface CFlowControlContextType
Overrides:
getNearestBreakableStatement in class CFlowControlContext

getNearestContinuableStatement

public JStatement getNearestContinuableStatement()
Get the nearest continuable statement.

Specified by:
getNearestContinuableStatement in interface CFlowControlContextType
Overrides:
getNearestContinuableStatement in class CFlowControlContext

isInLoop

public final boolean isInLoop()
Indicates whether this context is in a loop.

Specified by:
isInLoop in interface CContextType
Overrides:
isInLoop in class CContext

declaredOutsideOfLoop

public boolean declaredOutsideOfLoop(JLocalVariable var)
Indicates whether this context is enclosed in a loop and the given variable is declared outside the inner-most loop context.

Specified by:
declaredOutsideOfLoop in interface CContextType
Overrides:
declaredOutsideOfLoop in class CFlowControlContext

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.