at.dms.kjc
Class JExpression

java.lang.Object
  |
  +--at.dms.util.Utils
        |
        +--at.dms.compiler.Phylum
              |
              +--at.dms.kjc.JPhylum
                    |
                    +--at.dms.kjc.JExpression
All Implemented Interfaces:
Constants, Constants
Direct Known Subclasses:
JArrayAccessExpression, JArrayInitializer, JArrayLengthExpression, JBinaryExpression, JCastExpression, JCheckedExpression, JClassExpression, JClassFieldExpression, JConditionalExpression, JExplicitConstructorInvocation, JInstanceofExpression, JLiteral, JLocalVariableExpression, JMethodCallExpression, JNameExpression, JNewArrayExpression, JNewObjectExpression, JParenthesedExpression, JPostfixExpression, JPrefixExpression, JThisExpression, JTypeNameExpression, JUnaryExpression, JUnaryPromote

public abstract class JExpression
extends JPhylum

Root class for all expressions in the syntax tree.


Field Summary
static JExpression[] EMPTY
          Empty expression-list constant.
 
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
JExpression(TokenReference where)
          Construct a node in the parsing tree
 
Method Summary
abstract  void accept(KjcVisitor p)
          Accepts the specified visitor
abstract  JExpression checkExpression(CExpressionContext context)
          Check expression and evaluate and alter context.
 JExpression checkExpression(CExpressionContext context, boolean isLeftSide, boolean discardValue)
          Check expression and evaluate and alter context
 JExpression convertType(CType dest, CExpressionContext context)
          Changes the type of this expression to an other type.
protected  void fail(CContext context, MessageDescription key, java.lang.Object[] params)
          Adds a compiler error.
 void genBranch(boolean cond, CodeSequence code, CodeLabel label)
          Generates a sequence of bytecodes to branch on a label This method helps to handle heavy optimizables conditions
abstract  void genCode(CodeSequence code)
          Generates a sequence of bytecodes
 JBooleanLiteral getBooleanLiteral()
          Returns a typed literal for this expression The expression must be a constant
 JLiteral getLiteral()
          Returns the literal value of this expression.
 JNumberLiteral getNumberLiteral()
          Returns a typed literal for this expression The expression must be a constant
 JOrdinalLiteral getOrdinalLiteral()
          Returns a typed literal for this expression The expression must be a constant
 JRealLiteral getRealLiteral()
          Returns a typed literal for this expression The expression must be a constant
 JStringLiteral getStringLiteral()
          Returns a typed literal for this expression The expression must be a constant
abstract  CType getType()
          Returns the type of this expression (call after parsing only)
 boolean isAssignableTo(CType dest)
          Can this expression be converted to the specified type by assignment conversion (JLS 5.2) ?
 boolean isConstant()
          Returns true if this expression is constant according to the JLS.
 boolean isLiteral()
          Returns true if this expression is a literal.
 boolean isStatementExpression()
          Returns true iff this expression can be used as a statement (JLS 14.7)
 boolean isSubTypePossible()
          Returns whether this expression can result in subtypes of the type returned by the getType() method, or whether it always returns the exact type returned by getType().
 void setConstant(boolean constant)
          Change this JLS-constantness of this literal.
 JExpression 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, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

EMPTY

public static final JExpression[] EMPTY
Empty expression-list constant.
Constructor Detail

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)

isSubTypePossible

public boolean isSubTypePossible()
Returns whether this expression can result in subtypes of the type returned by the getType() method, or whether it always returns the exact type returned by getType(). The return value of this method has no meaning unless getType() returns a Class-type. (CType.isClassType())

isConstant

public boolean isConstant()
Returns true if this expression is constant according to the JLS. Some expression may be a literal, such as the NullLiteral or the result of ( true ? 10 : System.currentTimeMillis() ), but they're not constant as defined by the Java Language Specification, 2nd edition.
Returns:
true if this expression is constant

setConstant

public void setConstant(boolean constant)
Change this JLS-constantness of this literal.

isStatementExpression

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

isLiteral

public boolean isLiteral()
Returns true if this expression is a literal. Many literals are also constant (as defined by the JLS) but some aren't. The reverse is also true, some expressions may be constant but aren't literal. Currently I know only one such case, that of String constants larger than 65535 characters. They can only be represented as a runtime-evaluated concatenation expression, but they are JLS-constant.

In this particular case there is the added problem that the field cannot be stored in a classfile as a compile-time constant; a "final static String" constant larger than 65535 characters cannot be stored in the classes' constant pool. When compiling against the source of a file containing such a large constant, the compiler can ignore this problem. The problem appears when you try to compile another program against a class file with such a String constant, as the other program will not consider the field a compile-time constant. Some expression may be a literal, such as the NullLiteral or the result of ( true ? 10 : System.currentTimeMillis() ), but they're not constant as defined by the Java Language Specification, 2nd edition.

Returns:
true if this expression is literal.

getLiteral

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

getOrdinalLiteral

public final JOrdinalLiteral getOrdinalLiteral()
Returns a typed literal for this expression The expression must be a constant

getRealLiteral

public final JRealLiteral getRealLiteral()
Returns a typed literal for this expression The expression must be a constant

getBooleanLiteral

public final JBooleanLiteral getBooleanLiteral()
Returns a typed literal for this expression The expression must be a constant

getNumberLiteral

public final JNumberLiteral getNumberLiteral()
Returns a typed literal for this expression The expression must be a constant

getStringLiteral

public final JStringLiteral getStringLiteral()
Returns a typed literal for this expression The expression must be a constant

checkExpression

public abstract JExpression checkExpression(CExpressionContext context)
                                     throws PositionedError
Check expression and evaluate and alter context.
Parameters:
context - the actual context of analyse
Returns:
a pure java expression including promote node
Throws:
PositionedError - if the check fails
UnpositionedError - this error will be positioned soon

checkExpression

public final JExpression checkExpression(CExpressionContext context,
                                         boolean isLeftSide,
                                         boolean discardValue)
                                  throws PositionedError
Check expression and evaluate and alter context
Parameters:
context - the actual context of analyse
isLeftSide -  
discardValue -  
Returns:
a pure java expression including promote node
Throws:
PositionedError - if the check fails

fail

protected void fail(CContext context,
                    MessageDescription key,
                    java.lang.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

convertType

public JExpression convertType(CType dest,
                               CExpressionContext context)
                        throws PositionedError
Changes the type of this expression to an other type.
Parameters:
dest - The destination type.

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 casting conversion is valid

accept

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

genCode

public abstract void genCode(CodeSequence code)
Generates a sequence of bytecodes
Parameters:
code - the code list

genBranch

public void genBranch(boolean cond,
                      CodeSequence code,
                      CodeLabel label)
Generates a sequence of bytecodes to branch on a label This method helps to handle heavy optimizables conditions
Parameters:
code - the code list

unParenthesize

public JExpression unParenthesize()