JML

org.multijava.mjc
Class JLocalVariable

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JLocalVariable
All Implemented Interfaces:
Cloneable, Constants, Constants, PhylumType, VariableDescriptor
Direct Known Subclasses:
JFormalParameter, JGeneratedLocalVariable, JVariableDefinition

public abstract class JLocalVariable
extends JPhylum
implements VariableDescriptor

This class represents a local variable declaration in the AST.


Field Summary
private  boolean assigned
           
static int DES_CATCH_PARAMETER
           
static int DES_GENERATED
           
static int DES_LOCAL_VAR
           
static int DES_PARAMETER
           
private  int desc
           
protected  JExpression expr
           
private  int index
           
private  boolean loopVariable
           
protected  long modifiers
           
protected  String name
           
private  int position
           
protected  CType type
           
private  boolean used
           
 
Fields inherited from class org.multijava.mjc.JPhylum
EMPTY
 
Fields inherited from class org.multijava.util.compiler.Phylum
 
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
JLocalVariable(TokenReference where, long modifiers, int desc, CType type, String name, JExpression expr)
          Constructs a local variable definition AST node.
 
Method Summary
 boolean equals(Object o)
          Returns true if the given object should be consider equal to this.
 JExpression expr()
           
private  boolean exprIsArrayExpression()
           
 void genLoad(CodeSequence code)
          Generates a sequence of bytecode to load the value of the variable on the stack
 void genStore(CodeSequence code)
          Generates a sequence of bytecodes
 int getDescription()
           
 int getPosition()
          Returns the index of this variable in the stack frame for the method in which it is declared.
 CType getType()
           
 JExpression getValue()
           
 int hashCode()
           
 String ident()
          Returns the (unqualified) identifier for the slot.
 int index()
          Returns the index of this variable in the local block in which it is declared.
 boolean isAssigned()
           
 boolean isConstant()
           
 boolean isDeclaredNonNull()
           
 boolean isFinal()
          Returns if this variable is final
private  boolean isFinalNonNull()
           
 boolean isGenerated()
          Returns the variable definied by this formal parameter
 boolean isLoopVariable()
           
 boolean isNonNull(CContextType context)
           
 boolean isStatic()
          Returns if this variable is static
 boolean isUsed()
           
 long modifiers()
           
 void setAssigned(TokenReference ref, CContextType context)
          Records that this variable is assigned to and reports a warning if the assignment is to a for-loop variable in a location other than the increment of the loop.
 void setIdent(String name)
          Sets the identifier of this local variable.
 void setIndex(int index)
          Sets the index of this variable in the local block in which it is declared.
 void setIsLoopVariable()
          Registers that this variable is an index variable for a for-loop.
 void setModifiers(long modifiers)
          set the modifiers of this variable
 void setNonNull()
          Make this declarator (implicitly) non-null.
 void setPosition(int position)
          Sets the index of this variable in the stack frame for the method in which it is declared.
 void setUsed()
           
 void setValue(JExpression expr)
          Sets the initialization expression for this local variable.
 String toString()
           
 void typecheck(CFlowControlContextType context)
          Typechecks the local variable and mutates the context to record information gathered during typechecking.
 void unsetIsLoopVariable()
          De-registers that this variable is an index variable for a for-loop.
 
Methods inherited from class org.multijava.mjc.JPhylum
accept, check, check, check, check, fail, fail, fail, warn, warn, warn, warn
 
Methods inherited from class org.multijava.util.compiler.Phylum
getTokenReference, setTokenReference
 
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, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

DES_LOCAL_VAR

public static final int DES_LOCAL_VAR

DES_PARAMETER

public static final int DES_PARAMETER

DES_CATCH_PARAMETER

public static final int DES_CATCH_PARAMETER

DES_GENERATED

public static final int DES_GENERATED

desc

private int desc

used

private boolean used

assigned

private boolean assigned

loopVariable

private boolean loopVariable

modifiers

protected long modifiers

name

protected String name

type

protected CType type

expr

protected JExpression expr

index

private int index

position

private int position
Constructor Detail

JLocalVariable

public JLocalVariable(TokenReference where,
                      long modifiers,
                      int desc,
                      CType type,
                      String name,
                      JExpression expr)
Constructs a local variable definition AST node.

Parameters:
where - the location of the declaration of this variable
modifiers - the modifiers on this variable
desc - the sort of variable this is (see constants)
type - the type of this variable
name - the name of this variable
expr - the initializing expression for this variable
Method Detail

isFinal

public boolean isFinal()
Returns if this variable is final

Specified by:
isFinal in interface VariableDescriptor

isStatic

public boolean isStatic()
Returns if this variable is static


isGenerated

public boolean isGenerated()
Returns the variable definied by this formal parameter


modifiers

public long modifiers()
Returns:
the modifiers of this variable

setModifiers

public void setModifiers(long modifiers)
set the modifiers of this variable


ident

public String ident()
Description copied from interface: VariableDescriptor
Returns the (unqualified) identifier for the slot.

Specified by:
ident in interface VariableDescriptor
Returns:
the name of this variable

setIdent

public void setIdent(String name)
Sets the identifier of this local variable.


getType

public CType getType()
Returns:
the type of this variable

isNonNull

public boolean isNonNull(CContextType context)

isDeclaredNonNull

public boolean isDeclaredNonNull()

isFinalNonNull

private boolean isFinalNonNull()

exprIsArrayExpression

private boolean exprIsArrayExpression()

setNonNull

public void setNonNull()
Make this declarator (implicitly) non-null.


setValue

public void setValue(JExpression expr)
Sets the initialization expression for this local variable.


getValue

public JExpression getValue()
Returns:
the value of this local variable at initialization $$$ why not dynamically...

isConstant

public boolean isConstant()
Returns:
true if this variable is constant

index

public int index()
Returns the index of this variable in the local block in which it is declared.

Specified by:
index in interface VariableDescriptor

setIndex

public void setIndex(int index)
Sets the index of this variable in the local block in which it is declared.


getDescription

public int getDescription()

getPosition

public int getPosition()
Returns the index of this variable in the stack frame for the method in which it is declared.


setPosition

public void setPosition(int position)
Sets the index of this variable in the stack frame for the method in which it is declared.


setUsed

public void setUsed()

isUsed

public boolean isUsed()

setAssigned

public void setAssigned(TokenReference ref,
                        CContextType context)
Records that this variable is assigned to and reports a warning if the assignment is to a for-loop variable in a location other than the increment of the loop.

See Also:
setIsLoopVariable(), unsetIsLoopVariable(), setAssigned(TokenReference,CContextType)

isAssigned

public boolean isAssigned()

setIsLoopVariable

public void setIsLoopVariable()
Registers that this variable is an index variable for a for-loop. This is used to warn if the variable is assigned to apart from in the increment operation of the loop.

See Also:
unsetIsLoopVariable(), setAssigned(TokenReference,CContextType)

unsetIsLoopVariable

public void unsetIsLoopVariable()
De-registers that this variable is an index variable for a for-loop.

See Also:
setIsLoopVariable(), setAssigned(TokenReference,CContextType)

isLoopVariable

public boolean isLoopVariable()

equals

public boolean equals(Object o)
Returns true if the given object should be consider equal to this. Be warned that the equality comparison is true if o is any instance of JLocalVariable with the same index as this. Thus "false positives" may result if this method is called on two JLocalVariables from different lexical contexts. !FIXME!

Overrides:
equals in class Object
Parameters:
o - the object to compare against
Returns:
something reasonably useful if handled with care

hashCode

public int hashCode()
Overrides:
hashCode in class Object

expr

public JExpression expr()

typecheck

public void typecheck(CFlowControlContextType context)
               throws PositionedError
Typechecks the local variable and mutates the context to record information gathered during typechecking.

Parameters:
context - the context in which this expression appears
Throws:
PositionedError - if the check fails

genLoad

public void genLoad(CodeSequence code)
Generates a sequence of bytecode to load the value of the variable on the stack

Parameters:
code - the code sequence

genStore

public void genStore(CodeSequence code)
Generates a sequence of bytecodes

Parameters:
code - the code sequence

toString

public String toString()
Overrides:
toString in class Object

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.