JML

org.multijava.mjc
Class CSwitchGroupContext

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

public class CSwitchGroupContext
extends CFlowControlContext

This class represents the context for a switch group during checking passes. An instance of this is always the child context of a CSwitchBodyContext. This context maintains independent definite assignment and reachability information from its parent context but delegates variable declaration information to the parent context. This reflects the fact that the scope of a variable declaration in the body of a switch statement is the entire remainder of the body, regardless of any intervening case labels.

Version:
$Revision: 1.8 $
Author:
Curtis Clifton

Field Summary
 
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
(package private) CSwitchGroupContext(CSwitchBodyContext parent, CSwitchGroupContext previousContext, TokenReference where)
          Construct a context for checking control flow through a switch group where fall through from the previous group is possible.
(package private) CSwitchGroupContext(CSwitchBodyContext parent, TokenReference where)
          Construct a context for checking control flow through a switch group where fall through from the previous group is not possible.
 
Method Summary
 void addDefault()
          Adds a default label to this switch.
 void addLabel(JOrdinalLiteral lit)
          Add a label to this switch and check that it is a new one.
 void addLocalClass(CClass clazz)
          Adds to this context a class declared via a type declaration statement.
 void addSyntheticThisParameter()
          Records that a variable slot must be reserved for a synthetic this parameter.
 void addThisVariable()
          Records that the Java keyword this is used in this block.
 void addVariable(JLocalVariable var)
          Adds a local variable to this block
 boolean declares(JLocalVariable var)
          Returns true if the given local variable is declared exactly in this context, i.e., it is not declared in an outer context.
 int localsPosition()
          Returns the number of stack positions required to store the local variables encountered thus far in this context.
 CClass lookupClass(String name)
          Searches for a class with the given simple name according the procedure in JLS2 6.5.5.
 JLocalVariable lookupLocalVariable(String ident)
          Returns the variable referred to by the given name in this context, recursing to surrounding contexts as appropriate.
 int numberOfLocalVars()
           
 
Methods inherited from class org.multijava.mjc.CFlowControlContext
addThrowable, adopt, adoptParallelContexts, cachedParent, checkAssignmentToFinals, checkingComplete, checkLocalVarUsage, cloneContext, createExpressionContext, createFinallyContext, createFlowControlContext, createFlowControlContext, createLabeledContext, createLoopContext, createParallelContexts, createSwitchBodyContext, createTryContext, declaredOutsideOfLoop, fieldCount, fieldIdent, fieldInfo, getFlowControlContext, getLabeledStatement, getNearestBreakableStatement, getNearestContinuableStatement, getTokenReference, initializeField, initializeVariable, isFieldDefinitelyAssigned, isFieldFinal, isFreshVariableName, isReachable, isVarDefinitelyAssigned, isVarDefinitelyUnassigned, isVarFinal, localsIndex, localVars, merge, 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, isInLoop, 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, isInLoop, isPure, isStatic, lookupField, lookupField, lookupMethod, lookupMethod, lookupMethodOrSet, lookupMethodOrSet, lookupOuterField, lookupOuterField, lookupOuterLocalVariable, lookupTypeVariable, mergeNullityInfo, modUtil, registerGFDecl, registerVisibleMethod, registerVisibleType, removeAllFANullity, removeFANonNull, reportTrouble, resolveMaybeExtMethodRef
 

Constructor Detail

CSwitchGroupContext

CSwitchGroupContext(CSwitchBodyContext parent,
                    TokenReference where)
Construct a context for checking control flow through a switch group where fall through from the previous group is not possible. Clients should not call this but should instead call CSwitchBodyContext.createSwitchGroupContext.

 requires (* \caller instanceof CContextType *);
 ensures cachedParent != null && 
         cachedParent instanceof CSwitchBodyContext;
 

See Also:
CSwitchBodyContext#createSwitchGroupContext(CSwitchGroupContext)

CSwitchGroupContext

CSwitchGroupContext(CSwitchBodyContext parent,
                    CSwitchGroupContext previousContext,
                    TokenReference where)
Construct a context for checking control flow through a switch group where fall through from the previous group is possible. Clients should not call this but should instead call CSwitchBodyContext.createSwitchGroupContext.

 requires (* \caller instanceof CContextType *);
 requires previousContext != null && previousContext.isReachable();
 ensures cachedParent != null && 
         cachedParent instanceof CSwitchBodyContext;
 

See Also:
CSwitchBodyContext#createSwitchGroupContext(CSwitchGroupContext)
Method Detail

addVariable

public void addVariable(JLocalVariable var)
                 throws UnpositionedError
Adds a local variable to this block

Specified by:
addVariable in interface CFlowControlContextType
Overrides:
addVariable in class CFlowControlContext
Parameters:
var - the name of the variable
Throws:
UnpositionedError - if the variable is a redeclaration

addThisVariable

public void addThisVariable()
Records that the Java keyword this is used in this block.

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

addSyntheticThisParameter

public void addSyntheticThisParameter()
Records that a variable slot must be reserved for a synthetic this parameter. Recall that this is passed as a parameter for external methods.

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

localsPosition

public int localsPosition()
Returns the number of stack positions required to store the local variables encountered thus far in this context.

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

numberOfLocalVars

public int numberOfLocalVars()
Specified by:
numberOfLocalVars in interface CFlowControlContextType
Overrides:
numberOfLocalVars in class CFlowControlContext

declares

public boolean declares(JLocalVariable var)
Returns true if the given local variable is declared exactly in this context, i.e., it is not declared in an outer context.

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

addLocalClass

public void addLocalClass(CClass clazz)
                   throws UnpositionedError
Adds to this context a class declared via a type declaration statement.

Specified by:
addLocalClass in interface CFlowControlContextType
Overrides:
addLocalClass in class CFlowControlContext
Parameters:
clazz - the clazz to add
Throws:
UnpositionedError - if duplicate class exists in this lexical context

lookupClass

public CClass lookupClass(String name)
                   throws UnpositionedError
Searches for a class with the given simple name according the procedure in JLS2 6.5.5. This method checks the first bullet point of that section: "If the simple type name occurs within the scope of a visible local class declaration with that name, then the simple type name denotes that local class type." If no match is found, then this method calls to the surrounding context to check the remaining bullet points.

Specified by:
lookupClass in interface CFlowControlContextType
Overrides:
lookupClass in class CFlowControlContext
Parameters:
name - the class name, without qualifiers
Returns:
the class if found, null otherwise
Throws:
UnpositionedError - if search fails

lookupLocalVariable

public JLocalVariable lookupLocalVariable(String ident)
Returns the variable referred to by the given name in this context, recursing to surrounding contexts as appropriate. If no variable of the given name is found then null is returned.

Specified by:
lookupLocalVariable in interface CContextType
Overrides:
lookupLocalVariable in class CFlowControlContext
Parameters:
ident - the name of the variable
Returns:
a variable from an ident in current context

addDefault

public void addDefault()
                throws UnpositionedError
Adds a default label to this switch.

Throws:
UnpositionedError - if a default label already exists

addLabel

public void addLabel(JOrdinalLiteral lit)
              throws UnpositionedError
Add a label to this switch and check that it is a new one.

Parameters:
lit - the literal value of this label
Throws:
UnpositionedError - if the label is bad

JML

JML is Copyright (C) 1998-2002 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. This release depends on code from the MultiJava project and is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.