JML

org.multijava.mjc
Class JClassFieldExpression

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JExpression
                  extended byorg.multijava.mjc.JClassFieldExpression
All Implemented Interfaces:
CInitializable, Cloneable, Constants, Constants, PhylumType

public class JClassFieldExpression
extends JExpression
implements CInitializable

This class represents the AST node for a field access, e.g. getExpression().t or t.


Field Summary
private  CFieldAccessor field
           
private  CUniverse field_universe
           
private  CType fieldtype
           
private  String ident
           
private  JExpression prefix
           
private  CUniverse prefix_universe
           
private  boolean prefixWasBlank
          If true, indicates that this was a simple field reference without an explicit prefix.
private  CUniverse result_universe
           
private  JNameExpression sourceName
          the name of this field reference as originally appeared in the source file.
 
Fields inherited from class org.multijava.mjc.JExpression
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
JClassFieldExpression(TokenReference where, String ident)
          Construct a node in the parsing tree.
JClassFieldExpression(TokenReference where, String ident, JNameExpression sourceName)
          Construct a node in the parsing tree.
JClassFieldExpression(TokenReference where, JExpression prefix, String ident)
          Construct a node in the parsing tree.
JClassFieldExpression(TokenReference where, JExpression prefix, String ident, JNameExpression sourceName)
          Construct a node in the parsing tree.
 
Method Summary
 void accept(MjcVisitor p)
          Accepts the specified visitor
private  void checkAccess(CMemberHost localHost, CExpressionContextType context)
          Verifies that the field is accessible in this context.
 boolean equals(Object o)
           
private  void findPrefixAndField(CMemberHost localHost, CExpressionContextType context)
          Finds the type of the prefix as part of typechecking.
 void genCode(CodeSequence code)
          Generates a sequence of bytecodes
 void genEndStoreCode(CodeSequence code, boolean discardValue)
          Generates a sequence of bytecodes
 void genStartStoreCode(CodeSequence code)
          Generates a sequence of bytecodes
 CFieldAccessor getField()
          Returns the CField represented by this expression.
 JLiteral getLiteral()
          Returns the literal value of this field.
 CType getType()
          Compute the type of this expression (called after parsing)
private  void handlePossibleRawTypeAccess(CExpressionContextType context)
          If a non-static field is accessed as a member of a raw type, the following actions are performed (see JLS3 4.8): Replace the type of the field access expression by its erasure.
 int hashCode()
          Throws a runtime exception because hashCode isn't properly implemented yet.
 String ident()
           
 void initialize(CContextType context)
          Records that this field is initialized in the given context.
 boolean isConstant()
           
 boolean isDeclaredNonNull()
          Returns true iff the variable, field or method represente by this expression was declared non_null.
 boolean isDefinitelyAssigned(CContextType context)
          Returns true if this field is already initialized
private  boolean isFinalNonNull()
           
 boolean isLValue(CExpressionContextType context)
          Returns true if this field accepts assignment.
 boolean isMaybeInitializable()
          Indicates whether this expression can appear on the left-hand side of an assignment or in an increment or decrement operation.
 boolean isNonNull(CContextType context)
          Returns true iff the value represented by this expression is non-null
 JExpression prefix()
           
 boolean prefixWasBlank()
          Returns true if the prefix was blank.
 void setField(CFieldAccessor field)
           
 void setType(CType type)
           
 JNameExpression sourceName()
          Returns the name of this field reference as originally appeared in the source file.
 String toString()
           
 JExpression typecheck(CExpressionContextType context)
          Typechecks the expression and mutates the context to record information gathered during typechecking.
private  void typecheckUniverse(CExpressionContextType context)
          Performs all the checks whether the class field expression is valid according to the universe type system.
 
Methods inherited from class org.multijava.mjc.JExpression
buildUniverseDynChecks, clone, convertType, dumpArray, fail, genBranch, genUniverseDynCheckCode, getApparentType, getBooleanLiteral, getFANonNulls, getFANulls, getNumberLiteral, getOrdinalLiteral, getRealLiteral, getStringLiteral, isAssignableTo, isBooleanLiteral, isLiteral, isOrdinalLiteral, isRealLiteral, isStatementExpression, isStringLiteral, typecheck, unParenthesize
 
Methods inherited from class org.multijava.mjc.JPhylum
check, check, check, check, 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
finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

prefix

private JExpression prefix

ident

private String ident

field

private CFieldAccessor field

fieldtype

private CType fieldtype

prefix_universe

private CUniverse prefix_universe

field_universe

private CUniverse field_universe

result_universe

private CUniverse result_universe

prefixWasBlank

private boolean prefixWasBlank
If true, indicates that this was a simple field reference without an explicit prefix.


sourceName

private JNameExpression sourceName
the name of this field reference as originally appeared in the source file. It may be null if generated by the system.

Constructor Detail

JClassFieldExpression

public JClassFieldExpression(TokenReference where,
                             JExpression prefix,
                             String ident,
                             JNameExpression sourceName)
Construct a node in the parsing tree.

Parameters:
where - the line of this node in the source code
prefix - the expression preceding the field name
ident - the field name
sourceName - the name of this reference as originally appeared in source file. It may be null if generated.

 requires prefix != null;
 ensures !prefixWasBlank;
 

JClassFieldExpression

public JClassFieldExpression(TokenReference where,
                             String ident,
                             JNameExpression sourceName)
Construct a node in the parsing tree.

Parameters:
where - the line of this node in the source code
ident - the field name
sourceName - the name of this reference as originally appeared in source file. It may be null if generated.

 ensures prefixWasBlank;
 

JClassFieldExpression

public JClassFieldExpression(TokenReference where,
                             JExpression prefix,
                             String ident)
Construct a node in the parsing tree.

Parameters:
where - the line of this node in the source code
prefix - the expression preceding the field name
ident - the field name

 requires prefix != null;
 ensures !prefixWasBlank;
 

JClassFieldExpression

public JClassFieldExpression(TokenReference where,
                             String ident)
Construct a node in the parsing tree.

Parameters:
where - the line of this node in the source code
ident - the field name

 ensures prefixWasBlank;
 
Method Detail

sourceName

public JNameExpression sourceName()
Returns the name of this field reference as originally appeared in the source file. The return value may be null if this field reference was built by the system.


prefixWasBlank

public boolean prefixWasBlank()
Returns true if the prefix was blank.

 ensures \result == prefixWasBlank;
 


prefix

public JExpression prefix()

ident

public String ident()

getType

public CType getType()
Compute the type of this expression (called after parsing)

Returns:
the type of this expression

setType

public void setType(CType type)

isNonNull

public boolean isNonNull(CContextType context)
Returns true iff the value represented by this expression is non-null

Overrides:
isNonNull in class JExpression

isDeclaredNonNull

public boolean isDeclaredNonNull()
Description copied from class: JExpression
Returns true iff the variable, field or method represente by this expression was declared non_null.

Overrides:
isDeclaredNonNull in class JExpression

isFinalNonNull

private boolean isFinalNonNull()

isConstant

public boolean isConstant()
Overrides:
isConstant in class JExpression
Returns:
is this expression constant ?

isMaybeInitializable

public boolean isMaybeInitializable()
Indicates whether this expression can appear on the left-hand side of an assignment or in an increment or decrement operation.

 also ensures true;
 

Overrides:
isMaybeInitializable in class JExpression

isLValue

public boolean isLValue(CExpressionContextType context)
Returns true if this field accepts assignment. WMD: additional checks for the universe modifiers and whether we are in a pure context are necessary.

Specified by:
isLValue in interface CInitializable
Returns:
true if this expression is an LValue at call time a final variable is a lvalue until it is initialized

isDefinitelyAssigned

public boolean isDefinitelyAssigned(CContextType context)
Returns true if this field is already initialized

Specified by:
isDefinitelyAssigned in interface CInitializable
Returns:
true if this expression is a variable already valued

initialize

public void initialize(CContextType context)
                throws UnpositionedError
Records that this field is initialized in the given context.

Specified by:
initialize in interface CInitializable
Throws:
UnpositionedError - if this is a final field and has already been assigned to

getField

public CFieldAccessor getField()
Returns the CField represented by this expression.


setField

public void setField(CFieldAccessor field)

getLiteral

public JLiteral getLiteral()
Returns the literal value of this field. Will fail with a class-cast exception if this field is not representable as a literal.

Overrides:
getLiteral in class JExpression

toString

public String toString()
Overrides:
toString in class Object

typecheck

public JExpression typecheck(CExpressionContextType context)
                      throws PositionedError
Typechecks the expression and mutates the context to record information gathered during typechecking.

Parameters:
context - the context in which this expression appears
Returns:
a desugared Java expression (see JExpression.typecheck())
Throws:
PositionedError - if the check fails

findPrefixAndField

private void findPrefixAndField(CMemberHost localHost,
                                CExpressionContextType context)
                         throws PositionedError
Finds the type of the prefix as part of typechecking. Sets field to the signature of the field referenced.

Throws:
PositionedError

handlePossibleRawTypeAccess

private void handlePossibleRawTypeAccess(CExpressionContextType context)
                                  throws PositionedError
If a non-static field is accessed as a member of a raw type, the following actions are performed (see JLS3 4.8):

Parameters:
context - The typechecking context.
Throws:
PositionedError - if an error occurs during typechecking.

checkAccess

private void checkAccess(CMemberHost localHost,
                         CExpressionContextType context)
                  throws PositionedError
Verifies that the field is accessible in this context.

Throws:
PositionedError - if a check fails

equals

public boolean equals(Object o)
Overrides:
equals in class Object

hashCode

public int hashCode()
Throws a runtime exception because hashCode isn't properly implemented yet.

Overrides:
hashCode in class Object

typecheckUniverse

private void typecheckUniverse(CExpressionContextType context)
                        throws PositionedError
Performs all the checks whether the class field expression is valid according to the universe type system. Also sets fieldtype_with_universe to a clone of the original field type and sets the correct result universe. By WMD.

Throws:
PositionedError

accept

public void accept(MjcVisitor p)
Accepts the specified visitor

Parameters:
p - the visitor

genCode

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

Parameters:
code - the code list

genStartStoreCode

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

Specified by:
genStartStoreCode in interface CInitializable
Parameters:
code - the code list

genEndStoreCode

public void genEndStoreCode(CodeSequence code,
                            boolean discardValue)
Generates a sequence of bytecodes

Specified by:
genEndStoreCode in interface CInitializable
Parameters:
code - the code list

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.