at.dms.kjc
Class JFieldAccessExpression

java.lang.Object
  extended by at.dms.util.Utils
      extended by at.dms.compiler.Phylum
          extended by at.dms.kjc.JPhylum
              extended by at.dms.kjc.JExpression
                  extended by at.dms.kjc.JFieldAccessExpression
All Implemented Interfaces:
Constants, DeepCloneable, Finalizable, Serializable

public class JFieldAccessExpression
extends JExpression

JLS 15.11 Field Access Expression. A field access expression may access a field of an object or array.

See Also:
Serialized Form

Field Summary
protected  CField field
           
protected  String ident
           
protected  JExpression prefix
           
 
Fields inherited from class at.dms.kjc.JExpression
EMPTY
 
Fields inherited from class at.dms.util.Utils
EMPTY_LIST, getForLoopCallers
 
Fields inherited from interface at.dms.kjc.Constants
CMP_VERSION, JAV_CLASS, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_THIS, JAV_THROWABLE, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LE, OPE_LNOT, 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_BIT, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_SHORT, TID_VECTOR, TID_VOID, VECTOR_EMPTY
 
Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INLINE, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_EXCEPTIONS, ATT_GENERIC, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_SOURCEFILE, ATT_SYNTHETIC, 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_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_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_ldc_w, opc_ldc2_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 JFieldAccessExpression()
           
  JFieldAccessExpression(JExpression prefix, String ident)
           
  JFieldAccessExpression(String ident)
           
  JFieldAccessExpression(TokenReference where, JExpression prefix, String ident)
          Construct a node in the parsing tree
  JFieldAccessExpression(TokenReference where, JExpression prefix, String ident, CField field)
          You usually don't know the cfield--this is mostly for constructing new accesses from old accesses within the ir.
  JFieldAccessExpression(TokenReference where, String ident)
          Construct a node in the parsing tree
 
Method Summary
 Object accept(AttributeVisitor p)
          Accepts the specified attribute visitor
<S,T> S
accept(ExpressionVisitor<S,T> p, T o)
          Accepts the specified visitor
 void accept(KjcVisitor p)
          Accepts the specified visitor
 JExpression analyse(CExpressionContext context)
          Analyses the expression (semantically).
 void checkAccess(CClass local, CExpressionContext context)
          Checks is access to prefix is okay
 Object deepClone()
          Returns a deep clone of this object.
protected  void deepCloneInto(JFieldAccessExpression other)
          Clones all fields of this into
 boolean equals(Object o)
           
protected  void findPrefix(CClass local, CExpressionContext context)
          Finds the type of the prefix.
 void genCode(CodeSequence code, boolean discardValue)
          Generates JVM bytecode to evaluate this expression.
 void genEndStoreCode(CodeSequence code, boolean discardValue)
          Generates JVM bytecode to store a value into the storage location denoted by this expression.
 void genStartStoreCode(CodeSequence code)
          Generates JVM bytecode to store a value into the storage location denoted by this expression.
 CField getField()
          Returns the exported field.
 String getIdent()
          Returns the simple name of the field.
 JLiteral getLiteral()
          Returns the literal value of this field.
 JExpression getPrefix()
          Returns the left-hand-side of the expression.
 CType getType()
          Returns the type of the expression.
 boolean isConstant()
          Tests whether this expression denotes a compile-time constant (JLS 15.28).
 boolean isFinal()
          Returns true if there must be exactly one initialization of the field.
 boolean isInitialized(CExpressionContext context)
          Returns true iff this field is already initialized.
 boolean isLValue(CExpressionContext context)
          Returns true if this field accepts assignments.
 boolean isThisAccess()
          (bft: I think...) Returns whether or not this field access is on the
 void setIdent(String _ident)
          Allows setting of Ident to rename a field in place.
 void setInitialized(CExpressionContext context)
          Declares this variable to be initialized.
 void setPrefix(JExpression exp)
          Sets the prefix expression of this to
 void setType(CType type)
          Set type: delegates to the CField, or creates a new CSourceField if none.
 String toString()
          Returns a string representation of this expression.
 
Methods inherited from class at.dms.kjc.JExpression
booleanValue, byteValue, charValue, convertType, convertType, deepCloneInto, doubleValue, fail, floatValue, genBranch, intValue, isAssignableTo, isDynamic, isStatementExpression, longValue, shortValue, stringValue
 
Methods inherited from class at.dms.kjc.JPhylum
assertMutable, check, check, check, check, deepCloneInto, setLineNumber
 
Methods inherited from class at.dms.compiler.Phylum
deepCloneInto, getTokenReference, setTokenReference
 
Methods inherited from class at.dms.util.Utils
asPercent, cellMathEquivalent, cMathEquivalent, cppMathEquivalent, deepCloneInto, equalArrays, fail, getEnvironmentVariable, getExpression, hasPeeks, initArray, initArray, initLiteralArray, intArrayToList, isMathMethod, isUniform, kopi_assert, kopi_assert, makeCountdownForLoop, makeDotFileName, makeForLoop, makeForLoop, makeForLoop, makeForLoopFieldIndex, makeForLoopLocalIndex, nextPow2, passThruParens, peelMarkers, popBeforePeek, readFile, removeUnusedPops, replaceAll, setupDotFileName, simplifyMathMethod, splitQualifiedName, splitQualifiedName, toArray, toIntArray, toVector, voidToInt, writeFile
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

prefix

protected JExpression prefix

ident

protected String ident

field

protected CField field
Constructor Detail

JFieldAccessExpression

protected JFieldAccessExpression()

JFieldAccessExpression

public JFieldAccessExpression(TokenReference where,
                              JExpression prefix,
                              String ident,
                              CField field)
You usually don't know the cfield--this is mostly for constructing new accesses from old accesses within the ir. note that cfield goes missing otherwise.


JFieldAccessExpression

public JFieldAccessExpression(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 prefix denoting the object to search
ident - the simple name of the field

JFieldAccessExpression

public JFieldAccessExpression(JExpression prefix,
                              String ident)

JFieldAccessExpression

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

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

JFieldAccessExpression

public JFieldAccessExpression(String ident)
Method Detail

getIdent

public String getIdent()
Returns the simple name of the field.

Overrides:
getIdent in class JExpression
Returns:
the intentifier

setIdent

public void setIdent(String _ident)
Allows setting of Ident to rename a field in place. Please use cautiously.


getType

public CType getType()
Returns the type of the expression.

Specified by:
getType in class JExpression

setType

public void setType(CType type)
Set type: delegates to the CField, or creates a new CSourceField if none.

Specified by:
setType in class JExpression
Parameters:
type - the CType to set.

getPrefix

public JExpression getPrefix()
Returns the left-hand-side of the expression.


isConstant

public boolean isConstant()
Tests whether this expression denotes a compile-time constant (JLS 15.28).

Overrides:
isConstant in class JExpression
Returns:
true iff this expression is constant

isLValue

public boolean isLValue(CExpressionContext context)
Returns true if this field accepts assignments.

Overrides:
isLValue in class JExpression
Returns:
true iff this expression is an l-value

isFinal

public boolean isFinal()
Returns true if there must be exactly one initialization of the field.

Overrides:
isFinal in class JExpression
Returns:
true if the field is final.

isThisAccess

public boolean isThisAccess()
(bft: I think...) Returns whether or not this field access is on the
this
object. Will only work after semantic analysis has been done.


setPrefix

public void setPrefix(JExpression exp)
Sets the prefix expression of this to
exp
.


isInitialized

public boolean isInitialized(CExpressionContext context)
Returns true iff this field is already initialized.

Overrides:
isInitialized in class JExpression
Returns:
true if this expression is a variable already valued

setInitialized

public void setInitialized(CExpressionContext context)
Declares this variable to be initialized.

Overrides:
setInitialized in class JExpression
Throws:
UnpositionedError - an error if this object can't actually be assignated this may happen with final variables.

getField

public CField getField()
Returns the exported field.


getLiteral

public JLiteral getLiteral()
Returns the literal value of this field.

Overrides:
getLiteral in class JExpression

toString

public String toString()
Returns a string representation of this expression.

Overrides:
toString in class Object

analyse

public JExpression analyse(CExpressionContext context)
                    throws PositionedError
Analyses the expression (semantically).

Specified by:
analyse in class JExpression
Parameters:
context - the analysis context
Returns:
an equivalent, analysed expression
Throws:
PositionedError - the analysis detected an error

findPrefix

protected void findPrefix(CClass local,
                          CExpressionContext context)
                   throws PositionedError
Finds the type of the prefix.

Throws:
PositionedError - Error catched as soon as possible

checkAccess

public void checkAccess(CClass local,
                        CExpressionContext context)
                 throws PositionedError
Checks is access to prefix is okay

Throws:
PositionedError - Error catched as soon as possible

equals

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

accept

public void accept(KjcVisitor p)
Accepts the specified visitor

Specified by:
accept in class JExpression
Parameters:
p - the visitor

accept

public Object accept(AttributeVisitor p)
Accepts the specified attribute visitor

Specified by:
accept in class JExpression
Parameters:
p - the visitor
Returns:
data to pass back up

accept

public <S,T> S accept(ExpressionVisitor<S,T> p,
                      T o)
Accepts the specified visitor

Specified by:
accept in class JExpression
Type Parameters:
S - output type
T - auxilliary input type
Parameters:
p - the visitor
o - object containing extra data to be passed to visitor
Returns:
object containing data generated by visitor

genCode

public void genCode(CodeSequence code,
                    boolean discardValue)
Generates JVM bytecode to evaluate this expression.

Specified by:
genCode in class JExpression
Parameters:
code - the bytecode sequence
discardValue - discard the result of the evaluation ?

genStartStoreCode

public void genStartStoreCode(CodeSequence code)
Generates JVM bytecode to store a value into the storage location denoted by this expression. Storing is done in 3 steps : - prefix code for the storage location (may be empty), - code to determine the value to store, - suffix code for the storage location.

Overrides:
genStartStoreCode in class JExpression
Parameters:
code - the code list

genEndStoreCode

public void genEndStoreCode(CodeSequence code,
                            boolean discardValue)
Generates JVM bytecode to store a value into the storage location denoted by this expression. Storing is done in 3 steps : - prefix code for the storage location (may be empty), - code to determine the value to store, - suffix code for the storage location.

Overrides:
genEndStoreCode in class JExpression
Parameters:
code - the code list
discardValue - discard the result of the evaluation ?

deepClone

public Object deepClone()
Returns a deep clone of this object.

Specified by:
deepClone in interface DeepCloneable
Overrides:
deepClone in class JExpression

deepCloneInto

protected void deepCloneInto(JFieldAccessExpression other)
Clones all fields of this into
other