mjc

org.multijava.mjc
Class JNewObjectExpression

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JExpression
                  extended byorg.multijava.mjc.JNewObjectExpression
All Implemented Interfaces:
Cloneable, Constants, Constants, PhylumType
Direct Known Subclasses:
JNewAnonymousClassExpression

public class JNewObjectExpression
extends JExpression

This class represents an object instantiation expression 'new type(...)'


Nested Class Summary
protected static class JNewObjectExpression.ArgTypes
          This nested class is used to track the argument types of the actual constructor call.
 
Field Summary
protected  CMethod constructor
          The specific constructor that is called in this object instantiation expression.
protected  JExpression explicitThis
          The primary expression qualifying this class instance creation expression, or null if this is an unqualified class instance creation expression.
protected  CClass hostClass
          A reference to the host class of this expression.
private  String originalTypeName
          Stores the actual text following the new and preceding the parameters.
protected  JExpression outerThisParam
          Stores the expression to generate a possible synthetic outer this parameter to the constructor call.
protected  CClass owner
          A reference to the logical owner of this expression.
protected  JExpression[] params
          The expressions that, when evaluated, yield the actual parameters for the constructor invocation.
private  JMethodCallExpression setAnonymousOwner
           
private  JMethodCallExpression setConstructorData
           
private  JMethodCallExpression setOwner
           
private  JLocalVariable tmpLocalVar
           
protected  CClassType type
          The type of object instantiated by this expression.
 
Fields inherited from class org.multijava.mjc.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
JNewObjectExpression(TokenReference where, CClassType objectType, JExpression explicitThis, JExpression[] params)
          Construct a node in the parsing tree.
 
Method Summary
 void accept(MjcVisitor p)
          Accepts the specified visitor
private static JMethodCallExpression[] buildNewObjectUniverseDynChecks(CExpressionContextType context, CClassType type, JExpression var)
          Creates the expressions for the dynamic universe typechecks.
 void buildUniverseDynChecks(CExpressionContextType context, JExpression var)
          Creates the expressions for the dynamic universe typechecks.
protected  JExpression checkCall(CExpressionContextType context, JNewObjectExpression.ArgTypes argTypes)
          Typechecks the invocation of the actual constructor of the object instantiated.
private  void checkForUncheckedWarnings(JNewObjectExpression.ArgTypes argTypes, CExpressionContextType context)
          Issues unchecked warnings for the actual parameters which need unchecked conversion (JLS3 5.1.9) to conform to their corresponding formal parameters.
protected  JNewObjectExpression.ArgTypes checkTypes(CExpressionContextType context)
          Resolves and checks the types of the actual parameters to the constructor.
 CMethod constructor()
          Returns the specific constructor by this object nstantiation expression.
 void genCode(CodeSequence code)
          Generates a sequence of bytecodes
 void genUniverseDynCheckCode(CodeSequence code)
          Generate the code for the dynamic universe typechecks.
 CType getType()
          Returns the type of this expression (called after parsing).
 boolean isStatementExpression()
          Returns true iff this expression can be used as a statement (JLS 14.7)
 String originalTypeName()
          Returns the actual text following the "new" and preceding the parameters.
 JExpression[] params()
           
 JExpression thisExpr()
          Returns the JExpression that is the explicit-this portion of the new Object construct.
 JExpression typecheck(CExpressionContextType context)
          Typechecks the expression and mutates the context to record information gathered during typechecking.
 
Methods inherited from class org.multijava.mjc.JExpression
clone, convertType, dumpArray, fail, genBranch, getApparentType, getBooleanLiteral, getFANonNulls, getFANulls, getLiteral, getNumberLiteral, getOrdinalLiteral, getRealLiteral, getStringLiteral, isAssignableTo, isBooleanLiteral, isConstant, isDeclaredNonNull, isLiteral, isMaybeInitializable, isNonNull, isOrdinalLiteral, isRealLiteral, isStringLiteral, typecheck, unParenthesize
 
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

explicitThis

protected JExpression explicitThis
The primary expression qualifying this class instance creation expression, or null if this is an unqualified class instance creation expression.


params

protected JExpression[] params
The expressions that, when evaluated, yield the actual parameters for the constructor invocation.


type

protected CClassType type
The type of object instantiated by this expression. Initially this is just the parser's best guess. The valued stored in this field changes during the typechecking pass when the optional leading primary expression (stored in explicitThis is considered and when the declaration AST for an anonymous classes is defined.

See Also:
explicitThis, JNewAnonymousClassExpression

hostClass

protected CClass hostClass
A reference to the host class of this expression.


owner

protected CClass owner
A reference to the logical owner of this expression.


constructor

protected CMethod constructor
The specific constructor that is called in this object instantiation expression.


originalTypeName

private final String originalTypeName
Stores the actual text following the new and preceding the parameters.


outerThisParam

protected JExpression outerThisParam
Stores the expression to generate a possible synthetic outer this parameter to the constructor call.


setOwner

private JMethodCallExpression setOwner

setConstructorData

private JMethodCallExpression setConstructorData

tmpLocalVar

private JLocalVariable tmpLocalVar

setAnonymousOwner

private JMethodCallExpression setAnonymousOwner
Constructor Detail

JNewObjectExpression

public JNewObjectExpression(TokenReference where,
                            CClassType objectType,
                            JExpression explicitThis,
                            JExpression[] params)
Construct a node in the parsing tree. This method is directly called by the parser.

 ensures typeState == IS_PARSER_GUESS;
 

Parameters:
where - the line of this node in the source code
objectType - the type of this object to be instantiated, initially just the parser's best guess
explicitThis - a Primary expression (i.e., an explicit outer class for the instantiation of an inner class)
params - parameters to be passed to constructor
Method Detail

params

public JExpression[] params()

getType

public CType getType()
Returns the type of this expression (called after parsing). The type evolves over the course of the compilation passes. Immediately after parsing it is just the parser's best guess. After typechecking the type returned by this method is the actual type of the object instantiated.

Returns:
the type of this expression

isStatementExpression

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

Overrides:
isStatementExpression in class JExpression

thisExpr

public JExpression thisExpr()
Returns the JExpression that is the explicit-this portion of the new Object construct.


originalTypeName

public String originalTypeName()
Returns the actual text following the "new" and preceding the parameters.


constructor

public CMethod constructor()
Returns the specific constructor by this object nstantiation expression. This method must be called after typechecking.


typecheck

public JExpression typecheck(CExpressionContextType context)
                      throws PositionedError
Typechecks the expression and mutates the context to record information gathered during typechecking.

 also 
 requires typeState == IS_PARSER_GUESS;
 ensures typeState == IS_ACTUAL;
 

Parameters:
context - the context in which this expression appears
Returns:
a desugared Java expression (see JExpression.typecheck())
Throws:
PositionedError - if the check fails
See Also:
JExpression.typecheck(CExpressionContextType)

checkTypes

protected JNewObjectExpression.ArgTypes checkTypes(CExpressionContextType context)
                                            throws PositionedError
Resolves and checks the types of the actual parameters to the constructor. The returned data structure also carries information on the types of any explicit and implicit outer this parameters for various sorts of inner classes.

 requires typeState == IS_NON_ANON_TYPE;
 

Parameters:
context - the context in which this expression occurs
Returns:
an array of CType singletons for the argument types
Throws:
PositionedError - if the checks fail

checkCall

protected JExpression checkCall(CExpressionContextType context,
                                JNewObjectExpression.ArgTypes argTypes)
                         throws PositionedError
Typechecks the invocation of the actual constructor of the object instantiated.

 requires typeState == IS_ACTUAL;
 

Parameters:
context - the context in which this expression appears
argTypes - the types of the arguments to the constructor of type, including any synthetic outer this parameters
Throws:
PositionedError

checkForUncheckedWarnings

private void checkForUncheckedWarnings(JNewObjectExpression.ArgTypes argTypes,
                                       CExpressionContextType context)
                                throws PositionedError
Issues unchecked warnings for the actual parameters which need unchecked conversion (JLS3 5.1.9) to conform to their corresponding formal parameters.

Parameters:
argTypes - The actual arguments of this constructor call.
context - The type checking context.
Throws:
PositionedError - if some error occurs during type checking.

accept

public void accept(MjcVisitor p)
Accepts the specified visitor

Parameters:
p - the visitor

genCode

public void genCode(CodeSequence code)
Generates a sequence of bytecodes

Parameters:
code - the code list

buildUniverseDynChecks

public void buildUniverseDynChecks(CExpressionContextType context,
                                   JExpression var)
                            throws PositionedError
Creates the expressions for the dynamic universe typechecks.

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

buildNewObjectUniverseDynChecks

private static JMethodCallExpression[] buildNewObjectUniverseDynChecks(CExpressionContextType context,
                                                                       CClassType type,
                                                                       JExpression var)
                                                                throws PositionedError
Creates the expressions for the dynamic universe typechecks.

Parameters:
context - context used to typecheck the expressions created
var - the variable where the new object is found
Returns:
Array mce with the two method call expressions. mce[0] is the call to use for setOwner or setAnonymousOwner mce[1] is the call for setConstructorData
Throws:
PositionedError - By scdaniel.

genUniverseDynCheckCode

public void genUniverseDynCheckCode(CodeSequence code)
Generate the code for the dynamic universe typechecks.

Overrides:
genUniverseDynCheckCode in class JExpression
Parameters:
code - the CodeSequence for the codegeneration By scdaniel.

mjc

mjc is Copyright (C) 2000-2004 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. mjc is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.