JML

org.multijava.mjc
Class CSourceDispatcherClass

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CMember
          extended byorg.multijava.mjc.CClass
              extended byorg.multijava.mjc.CSourceClass
                  extended byorg.multijava.mjc.CSourceDispatcherClass
All Implemented Interfaces:
Cloneable, CMemberHost, Comparable, Constants, Constants

public class CSourceDispatcherClass
extends CSourceClass

This class represents an inner dispatcher class for a collection of multimethods of the same generic function declared in a single lexical context.

Version:
$Revision: 1.33 $
Author:
Curtis Clifton

Nested Class Summary
 
Nested classes inherited from class org.multijava.mjc.CClass
CClass.NoDupStrategy, CClass.Observer
 
Field Summary
protected  CAmbiguousDispatcherClass ambiguousDispatcherClass
          The ambiguous-method dispatcher class for this generic function.
protected  CSourceDispatcherMethod dispatcherMethod
           
protected  CDispatcherSignature dispatcherSig
          The $signature interface for this generic function.
private  boolean infoCompleted
          Indicates whether the info needed for code generation has been completed.
private  int number
          The unique number of this within it's outer class, used to construct the identifier and qualified name of this.
private  CSourceClass outer
           
private  TokenReference where
           
 
Fields inherited from class org.multijava.mjc.CSourceClass
 
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
CSourceDispatcherClass(Main compiler, CSourceClass outer, TokenReference where, CSourceDispatcherMethod dispatcherMethod)
           
 
Method Summary
protected  CAmbiguousDispatcherClass ambiguousDispatcherClass()
          Returns the ambiguous-method dispatcher class for this generic function.
 CClass anchorClass()
           
private  void completeClassInfo()
          Lazily completes the information necessary to generate the bytecode for the dispatcher class represented by this.
private  void completeClassInfo(Main compiler, TokenReference where)
          Generates the $signature interface and (if RMJ) the ambiguous-method dispatcher class for this generic function and then calls completeClassInfo().
private  CMethod dispatcherConstructor()
          Returns the appropriate constructor for this dispatcher class.
protected  CDispatcherSignature dispatcherSignature()
          Returns the $signature interface for this generic function.
 CSourceMethod functionAccessorMethod()
          Creates a synchronized accessor method for the function field for this dispatcher's generic function.
 CSourceField functionField()
          Creates a field data structure representing the function field for this dispatcher's generic function.
 int functionNumber()
           
 void genCode(Destination destination)
          Generate a class file for the class represented by this.
protected  void genGenericFunctions(ArrayList accum)
          Accumulates an array of all the required gf_info data structures for this.
 String ident()
          Gives the identifier for this host, or null for a compilation unit.
protected  CSourceField outersDispatcherField()
          Returns a field to be added to the outer class for storing a reference to a singleton instance of this, or returns null if the outer class is the anchor.
private  String outersDispatcherFieldIdent()
           
 void plantCORInitialization(CodeSequence code)
          Plants the bytecode to add this to the appropriate chain-of-responsibility and store a reference in a field of the outer class.
 void plantFunctionRef(CodeSequence code)
          Generates bytecode to put a reference to the external function field for the external generic function on the JVM stack.
private  void plantGetAnchorClassObject(CodeSequence code)
           
private  void plantGetFunctionField(CodeSequence code)
           
 void plantOldFunctionRef(CodeSequence code, boolean forSuper, boolean fromOuter)
          Plants bytecode to load the oldFunction field of this dispatcher class.
private  void plantSetFunctionField(CodeSequence code)
           
private  void plantSetOutersDispatcherField(CodeSequence code)
           
 String qualifiedName()
           
 void rmjAnnotate(RMJAnnotation rmjInfo)
          Provide an annotation for any dispatcher classes (RMJ only)
 
Methods inherited from class org.multijava.mjc.CSourceClass
addRMJMethodAnnotation, appendCustomAttributes, genConstructorArray, genInit, genSyntheticParams, genSyntheticParamsForExplicitThis, getOuterLocalAccess, getSyntheticParamsForExplicitSuper, getUniverseVersion, hasUniverseRuntimeSupport, initializerChecked, isAnonymous, isMember, lookupClass, lookupMethodOrSet, nextDispatcherNumber, rmjAnnotate, setCheckedMembers, setInitializerChecked
 
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, 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, register, registerNestedType, 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, 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, isAccessibleFrom
 

Field Detail

number

private int number
The unique number of this within it's outer class, used to construct the identifier and qualified name of this.


outer

private CSourceClass outer

where

private TokenReference where

dispatcherMethod

protected final CSourceDispatcherMethod dispatcherMethod

dispatcherSig

protected CDispatcherSignature dispatcherSig
The $signature interface for this generic function.


ambiguousDispatcherClass

protected CAmbiguousDispatcherClass ambiguousDispatcherClass
The ambiguous-method dispatcher class for this generic function. (RMJ only)


infoCompleted

private boolean infoCompleted
Indicates whether the info needed for code generation has been completed.

See Also:
completeClassInfo()
Constructor Detail

CSourceDispatcherClass

public CSourceDispatcherClass(Main compiler,
                              CSourceClass outer,
                              TokenReference where,
                              CSourceDispatcherMethod dispatcherMethod)
Method Detail

completeClassInfo

private void completeClassInfo(Main compiler,
                               TokenReference where)
Generates the $signature interface and (if RMJ) the ambiguous-method dispatcher class for this generic function and then calls completeClassInfo().

 requires dispatcherMethod.isTopDispatcherInLattice();
 


completeClassInfo

private void completeClassInfo()
Lazily completes the information necessary to generate the bytecode for the dispatcher class represented by this. The info is completed lazily so that when this dispatcher class is not the top dispatcher in the latice, the $signature interface for the top dispatcher will already exist.


dispatcherConstructor

private CMethod dispatcherConstructor()
Returns the appropriate constructor for this dispatcher class. For the top of the lattice the constructor simply calls the super constructor Object(). Otherwise the constructor sets the oldFunction field of this dispatcher to the next dispatcher in the chain-of-responsibility.

 requires dispatcherSig != null;
 


ident

public String ident()
Description copied from interface: CMemberHost
Gives the identifier for this host, or null for a compilation unit.

Specified by:
ident in interface CMemberHost
Overrides:
ident in class CMember

qualifiedName

public String qualifiedName()
Overrides:
qualifiedName in class CClass

dispatcherSignature

protected CDispatcherSignature dispatcherSignature()
Returns the $signature interface for this generic function.


ambiguousDispatcherClass

protected CAmbiguousDispatcherClass ambiguousDispatcherClass()
Returns the ambiguous-method dispatcher class for this generic function. (RMJ only)


outersDispatcherField

protected CSourceField outersDispatcherField()
Returns a field to be added to the outer class for storing a reference to a singleton instance of this, or returns null if the outer class is the anchor. (The additional field is not necessary in the anchor class.)


outersDispatcherFieldIdent

private String outersDispatcherFieldIdent()

genCode

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

Overrides:
genCode in class CSourceClass
Throws:
IOException
ClassFileFormatException

plantFunctionRef

public void plantFunctionRef(CodeSequence code)
Generates bytecode to put a reference to the external function field for the external generic function on the JVM stack.

 requires dispatcherMethod.isTopDispatcherInLattice();
 requires_redundantly dispatcherSig != null;
 


functionAccessorMethod

public CSourceMethod functionAccessorMethod()
Creates a synchronized accessor method for the function field for this dispatcher's generic function.

 requires dispatcherMethod.isTopDispatcherInLattice();
 requires_redundantly dispatcherSig != null;
 


functionField

public CSourceField functionField()
Creates a field data structure representing the function field for this dispatcher's generic function.

 requires dispatcherMethod.isTopDispatcherInLattice();
 requires_redundantly dispatcherSig != null;
 


plantOldFunctionRef

public void plantOldFunctionRef(CodeSequence code,
                                boolean forSuper,
                                boolean fromOuter)
Plants bytecode to load the oldFunction field of this dispatcher class.

 requires !dispatcherMethod.isTopDispatcherInLattice();
 requires_redundantly dispatcherSig == null;
 

Parameters:
code - the code sequence to add the bytecode to
forSuper - if true, then this is for a super send, which, under RMJ, should start from the oldSuperFunction rather than oldFunction
fromOuter - if true, then generates a reference that works from the outer class context, otherwise generates a reference that works from within the dispatcher class

plantCORInitialization

public void plantCORInitialization(CodeSequence code)
Plants the bytecode to add this to the appropriate chain-of-responsibility and store a reference in a field of the outer class.


plantSetOutersDispatcherField

private void plantSetOutersDispatcherField(CodeSequence code)

plantGetFunctionField

private void plantGetFunctionField(CodeSequence code)

plantSetFunctionField

private void plantSetFunctionField(CodeSequence code)

plantGetAnchorClassObject

private void plantGetAnchorClassObject(CodeSequence code)

anchorClass

public CClass anchorClass()

functionNumber

public int functionNumber()

genGenericFunctions

protected void genGenericFunctions(ArrayList accum)
Accumulates an array of all the required gf_info data structures for this.

Overrides:
genGenericFunctions in class CClass

rmjAnnotate

public void rmjAnnotate(RMJAnnotation rmjInfo)
Provide an annotation for any dispatcher classes (RMJ only)

Overrides:
rmjAnnotate in class CClass

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.