at.dms.kjc
Class JExpression

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
All Implemented Interfaces:
Constants, DeepCloneable, Finalizable, Serializable
Direct Known Subclasses:
JArrayAccessExpression, JArrayInitializer, JArrayLengthExpression, JBinaryExpression, JCastExpression, JCheckedExpression, JClassExpression, JConditionalExpression, JConstructorCall, JEmittedTextExpression, JFieldAccessExpression, JInstanceofExpression, JLiteral, JLocalVariableExpression, JMethodCallExpression, JNameExpression, JNewArrayExpression, JParenthesedExpression, JPostfixExpression, JPrefixExpression, JQualifiedAnonymousCreation, JQualifiedInstanceCreation, JSuperExpression, JThisExpression, JTypeNameExpression, JUnaryExpression, JUnaryPromote, JUnqualifiedAnonymousCreation, JUnqualifiedInstanceCreation, JVectorLiteral, SIRCreatePortal, SIRDynamicToken, SIRInterfaceTable, SIRPeekExpression, SIRPopExpression, SIRPushExpression, SIRRangeExpression

public abstract class JExpression
extends JPhylum

Root class for all expressions

See Also:
Serialized Form

Field Summary
static 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 JExpression()
           
  JExpression(TokenReference where)
          Construct a node in the parsing tree
 
Method Summary
abstract  Object accept(AttributeVisitor p)
          Accepts the specified attribute visitor
abstract
<S,T> S
accept(ExpressionVisitor<S,T> p, T d)
          Accepts the specified expression visitor
abstract  void accept(KjcVisitor p)
          Accepts the specified visitor
abstract  JExpression analyse(CExpressionContext context)
          Analyses the expression (semantically).
 boolean booleanValue()
          Returns the constant value of the expression.
 byte byteValue()
          Returns the constant value of the expression.
 char charValue()
          Returns the constant value of the expression.
 JExpression convertType(CType dest)
          Analyse without a null context.
 JExpression convertType(CType dest, CExpressionContext context)
          convertType changes the type of this expression to an other
 Object deepClone()
          Returns a deep clone of this object.
protected  void deepCloneInto(JExpression other)
          Clones all fields of this into
 double doubleValue()
          Returns the constant value of the expression.
protected  void fail(CContext context, MessageDescription key, Object[] params)
          Adds a compiler error.
 float floatValue()
          Returns the constant value of the expression.
 void genBranch(boolean cond, CodeSequence code, at.dms.kjc.CodeLabel label)
          Generates a sequence of bytescodes to branch on a label This method helps to handle heavy optimizables conditions
abstract  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.
 String getIdent()
          Used in field access expressions, local variable expression ...
 JLiteral getLiteral()
          Returns the literal value of this field
abstract  CType getType()
          Returns the type of this expression (call after parsing only)
 int intValue()
          Returns the constant value of the expression.
 boolean isAssignableTo(CType dest)
          Can this expression be converted to the specified type by assignment conversion (JLS 5.2) ?
 boolean isConstant()
          Tests whether this expression denotes a compile-time constant (JLS 15.28).
 boolean isDynamic()
          Returns true only for SIRRangeExpressions, which represent a dynamic range of values.
 boolean isFinal()
          Tests whether this expression is final, like a variable, which is final.
 boolean isInitialized(CExpressionContext context)
           
 boolean isLValue(CExpressionContext context)
          Tests whether this expression can be at the left-hand side of an assignment, i.e.
 boolean isStatementExpression()
          Returns true iff this expression can be used as a statement (JLS 14.8)
 long longValue()
          Returns the constant value of the expression.
 void setInitialized(CExpressionContext context)
          Declares this variable to be initialized.
abstract  void setType(CType type)
          Set the type of this expression.
 short shortValue()
          Returns the constant value of the expression.
 String stringValue()
          Returns the constant value of the expression.
 
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, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

EMPTY

public static final JExpression[] EMPTY
Constructor Detail

JExpression

protected JExpression()

JExpression

public JExpression(TokenReference where)
Construct a node in the parsing tree

Parameters:
where - the line of this node in the source code
Method Detail

getType

public abstract CType getType()
Returns the type of this expression (call after parsing only)


setType

public abstract void setType(CType type)
Set the type of this expression. Added 2006-12-20 Use with extreme caution Currently used when recreating expressions to copy type from old expression to recreated expression.

Parameters:
type - the CType to set.

isConstant

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

Returns:
true iff this expression is constant

isStatementExpression

public boolean isStatementExpression()
Returns true iff this expression can be used as a statement (JLS 14.8)


getLiteral

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


booleanValue

public boolean booleanValue()
Returns the constant value of the expression. The expression must be a literal.


byteValue

public byte byteValue()
Returns the constant value of the expression. The expression must be a literal.


charValue

public char charValue()
Returns the constant value of the expression. The expression must be a literal.


doubleValue

public double doubleValue()
Returns the constant value of the expression. The expression must be a literal.


floatValue

public float floatValue()
Returns the constant value of the expression. The expression must be a literal.


intValue

public int intValue()
Returns the constant value of the expression. The expression must be a literal.


longValue

public long longValue()
Returns the constant value of the expression. The expression must be a literal.


shortValue

public short shortValue()
Returns the constant value of the expression. The expression must be a literal.


stringValue

public String stringValue()
Returns the constant value of the expression. The expression must be a literal.


isDynamic

public boolean isDynamic()
Returns true only for SIRRangeExpressions, which represent a dynamic range of values.


isLValue

public boolean isLValue(CExpressionContext context)
Tests whether this expression can be at the left-hand side of an assignment, i.e. denotes a variable at call time. Note : a final variable is an l-value until it is initialized.

Returns:
true iff this expression is an l-value

isFinal

public boolean isFinal()
Tests whether this expression is final, like a variable, which is final. Used in loops to intentify assignments to final vaiables.

Returns:
true iff this expression is final

getIdent

public String getIdent()
Used in field access expressions, local variable expression ...

Returns:
the intentifier

setInitialized

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

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

isInitialized

public boolean isInitialized(CExpressionContext context)
Returns:
true if this expression is a variable already valued

analyse

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

Parameters:
context - the analysis context
Returns:
an equivalent, analysed expression
Throws:
PositionedError - the analysis detected an error

fail

protected void fail(CContext context,
                    MessageDescription key,
                    Object[] params)
             throws PositionedError
Adds a compiler error.

Overrides:
fail in class JPhylum
Parameters:
context - the context in which the error occurred
key - the message ident to be displayed
params - the array of parameters
Throws:
PositionedError

convertType

public JExpression convertType(CType dest)
Analyse without a null context.


convertType

public JExpression convertType(CType dest,
                               CExpressionContext context)
                        throws PositionedError
convertType changes the type of this expression to an other

Parameters:
dest - the destination type
Throws:
PositionedError

isAssignableTo

public boolean isAssignableTo(CType dest)
Can this expression be converted to the specified type by assignment conversion (JLS 5.2) ?

Parameters:
dest - the destination type
Returns:
true iff the conversion is valid

accept

public abstract void accept(KjcVisitor p)
Accepts the specified visitor

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

accept

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

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

accept

public abstract <S,T> S accept(ExpressionVisitor<S,T> p,
                               T d)
Accepts the specified expression visitor

Type Parameters:
S - output type
T - auxilliary input type
Parameters:
p - the visitor
d - data passed through to sub-visits
Returns:
data to pass back up

genCode

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

Parameters:
code - the code list
discardValue - discard the result of the evaluation ?

genBranch

public void genBranch(boolean cond,
                      CodeSequence code,
                      at.dms.kjc.CodeLabel label)
Generates a sequence of bytescodes to branch on a label This method helps to handle heavy optimizables conditions

Parameters:
code - the code list

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.

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.

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 JPhylum

deepCloneInto

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