JML

org.multijava.mjc
Class JExpression

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JExpression
All Implemented Interfaces:
Cloneable, Constants, Constants, PhylumType
Direct Known Subclasses:
JArrayAccessExpression, JArrayInitializer, JArrayLengthExpression, JBinaryExpression, JCastExpression, JCheckedExpression, JClassExpression, JClassFieldExpression, JConditionalExpression, JExplicitConstructorInvocation, JInstanceofExpression, JLiteral, JLocalVariableExpression, JMethodCallExpression, JmlExpression, JmlPredicate, JmlSpecExpression, JNameExpression, JNewArrayExpression, JNewObjectExpression, JParenthesedExpression, JPostfixExpression, JPrefixExpression, JSuperExpression, JThisExpression, JTypeNameExpression, JUnaryExpression, JUnaryPromote, MJMathModeExpression, MJWarnExpression

public abstract class JExpression
extends JPhylum

This class is the root class for all classes representing expression nodes in the AST.


Field Summary
static 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
JExpression(TokenReference where)
          Construct a node in the parsing tree
 
Method Summary
abstract  void accept(MjcVisitor p)
          Accepts the specified visitor
 void buildUniverseDynChecks(CExpressionContextType context, JExpression var)
          Creates the expressions for the dynamic universe typechecks.
 Object clone()
           
 JExpression convertType(CType dest, CExpressionContextType context)
          Changes the type of this expression to the given type.
 void dumpArray(String msg, Object[] exprs)
          Print the message followed by the array's elements.
protected  void fail(CContextType context, MessageDescription key, 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
 void genUniverseDynCheckCode(CodeSequence code)
          Generate the code for the dynamic universe typechecks.
 CType getApparentType()
          Returns the type of this expression (called after parsing).
 JBooleanLiteral getBooleanLiteral()
          Returns a typed literal for this expression The expression must be a constant
 Object[] getFANonNulls(CContextType context)
          Returns a list of expressions known to be non-null if this evaluates to true.
 Object[] getFANulls(CContextType context)
          Returns a list of expressions known to be null if this evaluates to false.
 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)
          Is this type assignable to the given type by assignment type conversion [JLS2 5.2].
 boolean isBooleanLiteral()
          Does this expression represent a boolean literal?
 boolean isConstant()
           
 boolean isDeclaredNonNull()
          Returns true iff the variable, field or method represente by this expression was declared non_null.
 boolean isLiteral()
          Does this expression represent a literal?
 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
 boolean isOrdinalLiteral()
          Does this expression represent an ordinal literal?
 boolean isRealLiteral()
          Does this expression represent a real literal?
 boolean isStatementExpression()
          Returns true iff this expression can be used as a statement (JLS 14.7)
 boolean isStringLiteral()
          Does this expression represent a string literal?
abstract  JExpression typecheck(CExpressionContextType context)
          Typechecks the expression and mutates the context to record information gathered during typechecking.
 JExpression typecheck(CExpressionContextType context, boolean isIncDec, boolean isLeftSide, boolean discardValue)
          Typechecks the expression and mutates the context to record information gathered during typechecking.
 JExpression unParenthesize()
          Returns this with outer parentheses removed.
 
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
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

EMPTY

public static final JExpression[] EMPTY
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

clone

public Object clone()
Overrides:
clone in class Object

getType

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


isNonNull

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


isDeclaredNonNull

public boolean isDeclaredNonNull()
Returns true iff the variable, field or method represente by this expression was declared non_null.


getFANonNulls

public Object[] getFANonNulls(CContextType context)
Returns a list of expressions known to be non-null if this evaluates to true. Should only be called on boolean expressions. Returns a list of expressions known to be non-null (null) in this context


dumpArray

public void dumpArray(String msg,
                      Object[] exprs)
Print the message followed by the array's elements. Useful for debugging, e.g., when the array is getFANonNulls().


getFANulls

public Object[] getFANulls(CContextType context)
Returns a list of expressions known to be null if this evaluates to false. Should only be called on boolean expressions.


getApparentType

public CType getApparentType()
Returns the type of this expression (called after parsing). This method typically returns the same type as returned by getType(); but for nodes such as JNewAnonymousClassExpression, it returns the type written by the programmer, e.g., T in new T(...) {...}.

Returns:
the apparent type of this expression
See Also:
getType()

isConstant

public boolean isConstant()
Returns:
true if this expression is constant

isStatementExpression

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


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. Default value is false. This method should be overridden in subclasses that implement CInitializable. This allows us to eliminate instanceof checks in several places during typechecking.

 ensures \result ==> (this instanceof CInitializable);
 
The converse is not true.

See Also:
JParenthesedExpression

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


isLiteral

public boolean isLiteral()
Does this expression represent a literal?


isOrdinalLiteral

public boolean isOrdinalLiteral()
Does this expression represent an ordinal literal?


isRealLiteral

public boolean isRealLiteral()
Does this expression represent a real literal?


isBooleanLiteral

public boolean isBooleanLiteral()
Does this expression represent a boolean literal?


isStringLiteral

public boolean isStringLiteral()
Does this expression represent a string literal?


typecheck

public abstract JExpression typecheck(CExpressionContextType context)
                               throws PositionedError
Typechecks the expression and mutates the context to record information gathered during typechecking. Returns a Java expression that has been simplified for direct conversion to bytecode. The simplifications include evaluating compile-time constant expressions, performing necessary conversions (JLS 5), and desugaring compound-assignment.

Parameters:
context - the context in which this expression appears
Returns:
a desugared Java expression
Throws:
PositionedError - if the check fails

typecheck

public final JExpression typecheck(CExpressionContextType context,
                                   boolean isIncDec,
                                   boolean isLeftSide,
                                   boolean discardValue)
                            throws PositionedError

Typechecks the expression and mutates the context to record information gathered during typechecking. This overloaded method is used when the expression is an increment/decrement or appears as one entire side of an assignment. While at first glance it appears that the last two boolean arguments would vary together (either both true or both false) in the case of compound assignments, like x += 3, the expression for x is on the left side but its value is not discarded.

The context tracks the boolean values of these flags so subexpressions have access to this information. These flags in the current context are reset to their old values at the conclusion of this method.

Parameters:
context - the context in which this expression appears
isIncDec - indicates whether this expression appears in an increment or decrement expression
isLeftSide - indicates whether this expression appears on the left side of an assignment
discardValue - indicates whether the result of an expression should be discarded
Returns:
a desugared Java expression (see JExpression.typecheck())
Throws:
PositionedError - if the check fails

fail

protected void fail(CContextType 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,
                               CExpressionContextType context)
                        throws PositionedError
Changes the type of this expression to the given type. The caller is responsible for using isAssignableTo to verify that the conversion is valid.

Parameters:
dest - the destination type
context - the context in which this expression appears
Throws:
PositionedError - if a type promotion is required and the promotion fails to typecheck !FIXME! it seems like this will never happen

isAssignableTo

public boolean isAssignableTo(CType dest)
Is this type assignable to the given type by assignment type conversion [JLS2 5.2]. This method is overridden for literals to implement primitive narrowing conversion.

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

accept

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

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()
Returns this with outer parentheses removed.


buildUniverseDynChecks

public void buildUniverseDynChecks(CExpressionContextType context,
                                   JExpression var)
                            throws PositionedError
Creates the expressions for the dynamic universe typechecks. This method is declared here to make the code simpler. Instead of using a lot of if's etc. dynamic binding can be used.

Parameters:
context - context used to typecheck the expressions created
var - the variable where the new object is found
Throws:
PositionedError - By scdaniel.

genUniverseDynCheckCode

public void genUniverseDynCheckCode(CodeSequence code)
Generate the code for the dynamic universe typechecks. This method is declared here to make the code simpler. Instead of using a lot of if's etc. dynamic binding can be used.

Parameters:
code - the CodeSequence for the codegeneration By scdaniel.

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.