at.dms.kjc
Class JClassFieldExpression

java.lang.Object
  |
  +--at.dms.util.Utils
        |
        +--at.dms.compiler.Phylum
              |
              +--at.dms.kjc.JPhylum
                    |
                    +--at.dms.kjc.JExpression
                          |
                          +--at.dms.kjc.JClassFieldExpression
All Implemented Interfaces:
CInitializable, Constants, Constants

public class JClassFieldExpression
extends JExpression
implements CInitializable

A field access ('getExpression().t' or 't'). XXX: note: why is it necessary to private a CContext subclass object in the check* methods; why not set the context once when it is know, so that it is still available in the genCode methods etc.? - EJB


Fields inherited from class at.dms.kjc.JExpression
EMPTY
 
Fields inherited from class at.dms.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
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_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_SHORT, TID_VOID
 
Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_NBR_FLAGS, 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
JClassFieldExpression(TokenReference where, JExpression prefix, java.lang.String ident)
          Construct a node in the parsing tree.
JClassFieldExpression(TokenReference where, java.lang.String ident)
          Construct a node in the parsing tree.
 
Method Summary
 void accept(KjcVisitor p)
          Accepts the specified visitor
 void checkAccess(CClass local, CExpressionContext context)
          Checks is access to prefix is okay.
 JExpression checkExpression(CExpressionContext context)
          Check expression and evaluate and alter context.
 boolean equals(java.lang.Object o)
           
protected  void findPrefix(CClass local, CExpressionContext context)
          Find the type of the prefix.
 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
 CField getField()
          Returns the field-export that this expression refers to.
 java.lang.String getIdent()
          Returns the name of the classfield that this expression refers to.
 JLiteral getLiteral()
          Returns the literal value of this field, if this is a constant expression.
 CType getType()
          Compute the type of this expression.
 void initialize(CBodyContext context)
          Signals that this field will receive a value.
 boolean isConstant()
          Checks whether this JLS says that this expression is a constant.
 boolean isInitialized(CExpressionContext context)
          Returns true if this field is already initialized.
 boolean isLValue(CExpressionContext context)
          Returns true if this field (still) accepts assignment.
 
Methods inherited from class at.dms.kjc.JExpression
checkExpression, convertType, fail, genBranch, getBooleanLiteral, getNumberLiteral, getOrdinalLiteral, getRealLiteral, getStringLiteral, isAssignableTo, isLiteral, isStatementExpression, isSubTypePossible, setConstant, unParenthesize
 
Methods inherited from class at.dms.kjc.JPhylum
check, check, check, check
 
Methods inherited from class at.dms.compiler.Phylum
getTokenReference, setTokenReference
 
Methods inherited from class at.dms.util.Utils
assert, assert, fail, fail, hasFlag, hasMoreThanOneFlag, hasOtherFlags, splitQualifiedName, splitQualifiedName, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
, clone, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

JClassFieldExpression

public JClassFieldExpression(TokenReference where,
                             JExpression prefix,
                             java.lang.String ident)
Construct a node in the parsing tree.
Parameters:
where - The line of this node in the source code.

JClassFieldExpression

public JClassFieldExpression(TokenReference where,
                             java.lang.String ident)
Construct a node in the parsing tree.
Parameters:
where - The line of this node in the source code.
Method Detail

getIdent

public java.lang.String getIdent()
Returns the name of the classfield that this expression refers to.

getType

public CType getType()
Compute the type of this expression. Should be called after parsing.
Overrides:
getType in class JExpression
Returns:
the type of this expression.

isConstant

public boolean isConstant()
Checks whether this JLS says that this expression is a constant. Quating JLS 15.28:
A compile-time constant expression is an expression denoting a value of primitive type or a String that is composed using only the following:
  • ...
  • Simple names that refer to final variables whose initializers are constant expressions.
  • Qualified names of the form TypeName . Identifier that refer to final variables whose initializers are constant expressions.
    Overrides:
    isConstant in class JExpression
    Returns:
    Whether this expression is constant.

isLValue

public boolean isLValue(CExpressionContext context)
Returns true if this field (still) accepts assignment. A final field only accepts assignment while it is definitely unassigned.
Specified by:
isLValue in interface CInitializable
Following copied from interface: at.dms.kjc.CInitializable
Returns:
true if this expression is an LValue at call time. Note: a final variable is a lvalue until it is initialized.

isInitialized

public boolean isInitialized(CExpressionContext context)
Returns true if this field is already initialized.
Specified by:
isInitialized in interface CInitializable
Following copied from interface: at.dms.kjc.CInitializable
Returns:
true if this expression is a variable that is already initialized.

initialize

public void initialize(CBodyContext context)
Signals that this field will receive a value.
Specified by:
initialize in interface CInitializable
Following copied from interface: at.dms.kjc.CInitializable
Throws:
UnpositionedError - An error if this object can't actually be assigned. This may happen with final variables.

getField

public CField getField()
Returns the field-export that this expression refers to.

getLiteral

public JLiteral getLiteral()
Returns the literal value of this field, if this is a constant expression.
Overrides:
getLiteral in class JExpression

checkExpression

public JExpression checkExpression(CExpressionContext context)
                            throws PositionedError
Check expression and evaluate and alter context.
Overrides:
checkExpression in class JExpression
Parameters:
context - The actual context of analyse.
Returns:
A pure java expression including promote node.
Throws:
PositionedError - If the check fails.

findPrefix

protected void findPrefix(CClass local,
                          CExpressionContext context)
                   throws PositionedError
Find 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 caught as soon as possible.

equals

public boolean equals(java.lang.Object o)
Overrides:
equals in class java.lang.Object

accept

public void accept(KjcVisitor p)
Accepts the specified visitor
Overrides:
accept in class JExpression
Parameters:
p - the visitor

genCode

public void genCode(CodeSequence code)
Generates a sequence of bytecodes
Overrides:
genCode in class JExpression
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