mjc

org.multijava.mjc
Class CSourceClass

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CMember
          extended byorg.multijava.mjc.CClass
              extended byorg.multijava.mjc.CSourceClass
All Implemented Interfaces:
Cloneable, CMemberHost, Comparable, Constants, Constants
Direct Known Subclasses:
CSourceAmbiguousDispatcherClass, CSourceDispatcherClass, CSourceDispatcherSignature, CSourceGFCollection

public class CSourceClass
extends CClass

This class represents a class read from a *.java file. It is primarily just a data structure, apart from methods for generating the qualified name and for determining whether the member is accessible from some class.

See Also:
CMember

Nested Class Summary
 
Nested classes inherited from class org.multijava.mjc.CClass
CClass.NoDupStrategy, CClass.Observer
 
Field Summary
private  RMJAnnotation _rmjInfo
           
private  int countSyntheticsFields
           
private  boolean initializerChecked
           
private  boolean isAnonymous
          Indicates whether this represents the signature of an anonymous class.
private  boolean isMember
          Indicates whether the class represented by this is a member type.
private  int nextDispatcherNumber
          Used to construct nested dispatcher class identifiers for methods of external generic functions.
private  Hashtable outers
           
 
Fields inherited from class org.multijava.mjc.CClass
CLS_UNDEFINED, dispClassTypes, methods
 
Fields inherited from class org.multijava.mjc.CMember
 
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
CSourceClass(Main compiler, MemberAccess access, TokenReference where, String ident, String qualifiedName, CTypeVariable[] typevariables, boolean isAnonymous, boolean isMember, boolean deprecated)
          Constructs a class export from source
 
Method Summary
 void addRMJMethodAnnotation(RMJAnnotation.Method annote)
           
protected  void appendCustomAttributes(AttributeList accum)
          Appends any custom attributes for this class to the attribute list represented by accum.
 void genCode(Destination destination)
          Generate a class file for the class represented by this.
 CType[] genConstructorArray(CType[] params)
          Mutates the given array to add any synthetic parameters for outer local variables referenced within the class represented by this.
private  JLocalVariableExpression generatedLocalVarHelper(CMethod constructor, CSourceField field, JLocalVariable var, TokenReference ref)
           
 void genInit(CodeSequence code, int countLocals)
          Adds to the body of a constructor the storage of synthetic parameters (for outer local variables) into synthetic fields.
 void genSyntheticParams(CodeSequence code)
          Adds synthetic parameters to the code sequence for a call to this class's constructor.
 void genSyntheticParamsForExplicitThis(CodeSequence code, CMethod constructor)
          Adds synthetic parameters to the code sequence for an explicit constructor invocation to this class's constructor.
 JExpression getOuterLocalAccess(TokenReference ref, JLocalVariable var, CMethod constructor)
          Returns an expression that evaluates to the value of the outer local variable var.
 JExpression[] getSyntheticParamsForExplicitSuper(CSourceClass callerClass, CMethod caller)
          For an explicit super class constructor invocation, returns the expressions that must be evaluated in the body of the constructor caller of the class callerClass to add the outer local variable values required by this to the stack.
 String getUniverseVersion()
          Return the version of the encoding used to encode the universe type modifiers.
 boolean hasUniverseRuntimeSupport()
          Return true if the class is being compiled with run-time support enabled.
 boolean initializerChecked()
          Returns true if initialization pass is finished for this class
 boolean isAnonymous()
           
 boolean isMember()
          Indicates whether the class represented by this is a member type.
 CClass lookupClass(String name, CContextType context)
          Searches for a class with the given simple name according the procedure in JLS2 6.5.5.
 CMethodSet lookupMethodOrSet(String name, CType[] params, CClassType[] args, CContextType context)
          Searches for the generic function applicable to the given identifier and argument type tuple, in the given context, looking in parent hierarchy and augmentation map as needed.
protected  int nextDispatcherNumber()
          Returns a unique number for a nested dispatcher class of this.
protected  void rmjAnnotate()
          Provide an annotation for any dispatcher classes (RMJ only)
 void setCheckedMembers(Hashtable fields_H, CMethod[] protoMethods_A)
          Stores information on member signatures gathered during checkInterface pass prior to closing in the translateMJ pass.
 void setInitializerChecked()
          Sets initialization pass to be finished
 
Methods inherited from class org.multijava.mjc.CClass
accumLocalExtAndInheritedMethods, accumLocalInternalMethods, accumMostSpecificMethods, addBridgeMethod, addField, addRedirector, augmentWithMethod, checkBridgeMethod, checkTypeVariables, close, collectAbstractMethods, collectInterfaceMethods, compareTo, createClassInfo, descendsFrom, descendsFrom, directlyVisibleTypes, equals, fields, fieldsForCodeGen, findGetterMethod, findOrCreateGetterMethod, findOrCreateSetterMethod, genClassFile, genCustomAttributes, genFields, genGenericFunctions, genInnerInfo, genInners, genInterfaces, genMethods, getAbstractMethods, getAllInheritableMethods, getAllInheritedMethods, getAllMethods, getCClass, getCompiler, getDeclaredField, getFieldCount, getGenericSignature, getIdentFrom, getInnerClasses, getInterfaceMethods, getInterfaces, getNextAccessName, getNextSyntheticIndex, getSubstitution, getSubstitution, getSuperClass, getSuperSubstitution, getSuperType, getterOrSetterMethodFor, getType, getTypeVariables, hashCode, hasProtectedVisibilityIn, hasSyntheticOuterThis, initSession, innerClassesForAttribute, isAbstract, isClass, isCompilationUnit, isDefinedInside, isFieldRedefined, isGenericClass, isInnerClass, isInterface, isNestedType, lookupAllMethods, lookupField, lookupFieldHelper, lookupMethod, lookupMethodsSpecializedByMethod, lookupMSAMethod, lookupOverloadedMethod, lookupSuperField, lookupTopConcreteMethod, lookupTypeVariable, memberNeedsPrivilegedAccess, methods, methodsForCodeGen, nestedDescendsFrom, noAssertionsYet, noPossiblyInnerAssertionsYet, packageName, protoMethods, qualifiedName, register, registerNestedType, rmjAnnotate, setAssertHelperMethod, setAssertStaticInitMethod, setCheckedInterfaces, setCheckedMembers, setInnerClasses, setSuperClass, setTypeVariables, sourceFile, syntheticOuterThisInaccessible, toString, wrapSuperCallTo
 
Methods inherited from class org.multijava.mjc.CMember
access, addModifiers, deprecated, getCCompilationUnit, getField, getIdent, getJavaName, getMethod, getOwnerName, getQualNameWithSeparator, hasDefaultAccess, host, ident, isAccessibleFrom, isDeclaredNonNull, isDeprecated, isFinal, isLocalTo, isPrivate, isProtected, isPublic, isStatic, modifiers, owner, setModifiers
 
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
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.multijava.mjc.CMemberHost
host, ident, isAccessibleFrom
 

Field Detail

outers

private Hashtable outers

countSyntheticsFields

private int countSyntheticsFields

initializerChecked

private boolean initializerChecked

nextDispatcherNumber

private int nextDispatcherNumber
Used to construct nested dispatcher class identifiers for methods of external generic functions.


_rmjInfo

private RMJAnnotation _rmjInfo

isAnonymous

private final boolean isAnonymous
Indicates whether this represents the signature of an anonymous class.


isMember

private final boolean isMember
Indicates whether the class represented by this is a member type. A member type is a type that is declared inside another type but that is not an anonymous class or a local type declaration.

Constructor Detail

CSourceClass

public CSourceClass(Main compiler,
                    MemberAccess access,
                    TokenReference where,
                    String ident,
                    String qualifiedName,
                    CTypeVariable[] typevariables,
                    boolean isAnonymous,
                    boolean isMember,
                    boolean deprecated)
Constructs a class export from source

Method Detail

setCheckedMembers

public void setCheckedMembers(Hashtable fields_H,
                              CMethod[] protoMethods_A)
Stores information on member signatures gathered during checkInterface pass prior to closing in the translateMJ pass. Method and field lookup is possible after this method has been called, however, code generation must wait until after the close method has been called.


initializerChecked

public boolean initializerChecked()
Returns true if initialization pass is finished for this class


setInitializerChecked

public void setInitializerChecked()
Sets initialization pass to be finished


isAnonymous

public boolean isAnonymous()
Returns:
true if this class is anonymous

isMember

public boolean isMember()
Indicates whether the class represented by this is a member type. A member type is a type that is declared inside another type but that is not an anonymous class or a local type declaration.


getUniverseVersion

public String getUniverseVersion()
Return the version of the encoding used to encode the universe type modifiers. By AHS.

Overrides:
getUniverseVersion in class CClass

hasUniverseRuntimeSupport

public boolean hasUniverseRuntimeSupport()
Return true if the class is being compiled with run-time support enabled. By AHS.


genConstructorArray

public CType[] genConstructorArray(CType[] params)
Mutates the given array to add any synthetic parameters for outer local variables referenced within the class represented by this.

 also
 requires (* this represents an anonymous class or 
		   a local class declaration *);
 requires (* params is the parameter array for a constructor of this, 
		   already including any synthetic outer this parameter *);
 ensures (* params includes the types of any outer local variables 
		  required to instantiate this *);
 

Overrides:
genConstructorArray in class CClass
See Also:
outers

genSyntheticParams

public void genSyntheticParams(CodeSequence code)
Adds synthetic parameters to the code sequence for a call to this class's constructor. In other words, it does nothing, except for anonymous classes and inner class declarations that reference final local variables. In those cases, this adds code to push the local variable values onto the stack.

Overrides:
genSyntheticParams in class CClass
Parameters:
code - the code sequence being generated

genSyntheticParamsForExplicitThis

public void genSyntheticParamsForExplicitThis(CodeSequence code,
                                              CMethod constructor)
Adds synthetic parameters to the code sequence for an explicit constructor invocation to this class's constructor. In other words, it does nothing, except for anonymous classes and inner class declarations that reference final local variables. In those cases, this adds code to push the local variable values onto the stack.

Overrides:
genSyntheticParamsForExplicitThis in class CClass
Parameters:
code - the code sequence being generated
constructor - the signature of the calling constructor

getSyntheticParamsForExplicitSuper

public JExpression[] getSyntheticParamsForExplicitSuper(CSourceClass callerClass,
                                                        CMethod caller)
For an explicit super class constructor invocation, returns the expressions that must be evaluated in the body of the constructor caller of the class callerClass to add the outer local variable values required by this to the stack.

 also
 requires callerClass.descendsFrom(this);
 requires caller.isConstructor();
 ensures \result != null;
 

Overrides:
getSyntheticParamsForExplicitSuper in class CClass

getOuterLocalAccess

public JExpression getOuterLocalAccess(TokenReference ref,
                                       JLocalVariable var,
                                       CMethod constructor)
Returns an expression that evaluates to the value of the outer local variable var. The constructor parameter is used to generate a reference to a synthetic outer variable parameter rather than a synthetic field when the original reference appears in a constructor.

Parameters:
ref - a token reference to be added to the returned expr
var - the variable to be referenced
constructor - the constructor in which this reference appears, or null if the reference is not in a constructor

generatedLocalVarHelper

private JLocalVariableExpression generatedLocalVarHelper(CMethod constructor,
                                                         CSourceField field,
                                                         JLocalVariable var,
                                                         TokenReference ref)

genInit

public void genInit(CodeSequence code,
                    int countLocals)
Adds to the body of a constructor the storage of synthetic parameters (for outer local variables) into synthetic fields. Some nested classes (anonymous classes and local class declarations) have access to final local variables. This access is accomplished in bytecode by passing the values of the variables as synthetic parameters to the nested class's constructor. This code stores these parameters in synthetic fields of the owner of this.

 requires isNestedType();
 requires (* code represents the body of a constructor of the class 
		   represented by this *);
 requires (* countLocals == the stack space consumed by the actual
		   parameters of the constructor along with any synthetic
		   outer this parameter *);
 


lookupMethodOrSet

public CMethodSet lookupMethodOrSet(String name,
                                    CType[] params,
                                    CClassType[] args,
                                    CContextType context)
                             throws UnpositionedError
Description copied from class: CClass
Searches for the generic function applicable to the given identifier and argument type tuple, in the given context, looking in parent hierarchy and augmentation map as needed. The receiver is assumed to be the type represented by this.

Overrides:
lookupMethodOrSet in class CClass
Throws:
UnpositionedError

lookupClass

public CClass lookupClass(String name,
                          CContextType context)
                   throws UnpositionedError
Description copied from class: CClass
Searches for a class with the given simple name according the procedure in JLS2 6.5.5. This method implements the second and third bullet points of the procedure. That is "Otherwise, if the simple type name occurs within the scope of exactly one visible member type, then the simple type name denotes that member type;" and "Otherwise, if the simple type name occurs within the scope of more than one visible member type, then the name is ambiguous as a type name; a compile-time error occurs."

Overrides:
lookupClass in class CClass
Throws:
UnpositionedError

nextDispatcherNumber

protected int nextDispatcherNumber()
Returns a unique number for a nested dispatcher class of this.


genCode

public void genCode(Destination destination)
             throws IOException,
                    ClassFileFormatException
Generate a class file for the class represented by this.

Throws:
IOException
ClassFileFormatException

rmjAnnotate

protected void rmjAnnotate()
Provide an annotation for any dispatcher classes (RMJ only)


appendCustomAttributes

protected void appendCustomAttributes(AttributeList accum)
Appends any custom attributes for this class to the attribute list represented by accum.

Overrides:
appendCustomAttributes in class CClass

addRMJMethodAnnotation

public void addRMJMethodAnnotation(RMJAnnotation.Method annote)

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.