org.multijava.mjc
Class CSwitchGroupContext
java.lang.Object
org.multijava.util.Utils
org.multijava.mjc.CContext
org.multijava.mjc.CFlowControlContext
org.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
| 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 |
| 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 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 |
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)
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
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.