mjc

org.multijava.mjc
Class CSourceDispatcherMethod

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CMember
          extended byorg.multijava.mjc.CMethod
              extended byorg.multijava.mjc.CSourceMethod
                  extended byorg.multijava.mjc.CSourceDispatcherMethod
All Implemented Interfaces:
Cloneable, Comparable, Constants, Constants, MJSpecialMethod, SigSourceMember

public class CSourceDispatcherMethod
extends CSourceMethod
implements MJSpecialMethod, Cloneable

This class represents a dispatcher method wrapping a set of multimethods of the same generic function as read from a source file.


Field Summary
protected  CSourceDispatcherClass dispatcherClass
          If this a method of an external generic function, then this field represents the dispatcher inner class for this method.
private  boolean isInBaseAnchorClass
           
private  boolean isTopDispatcherInLattice
           
private  CSourceMethod[] multimethods
           
private static DirectedAcyclicGraph.EdgeCalculator OVERRIDES_RELATION
           
private  TokenReference where
           
 
Fields inherited from class org.multijava.mjc.CSourceMethod
 
Fields inherited from class org.multijava.mjc.CMethod
declarationContext, generatefrom, needsPrivacyModifierRemoved, specArgs, synthetic, topConcreteMethod
 
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
CSourceDispatcherMethod(TokenReference where, Main compiler, CSourceClass outer, CMethod topConcreteMethod, CSourceMethod[] multimethods, int gfID)
          Constructs a dispatcher method for the given set of multimethods.
 
Method Summary
 CAmbiguousDispatcherClass ambiguousDispatcherClass()
          Returns the ambiguous-method dispatcher class for this.
 CClass anchorClass()
          Returns the $anchor class for this generic function.
protected  Object clone()
           
protected  CSourceDispatcherClass dispatcherClass()
          Returns the dispatcher class for this.
 CDispatcherSignature dispatcherSignature()
          Returns the $signature class for this.
protected  CMethodSet filteredDispatchers()
          Returns the filtered dispatcher methods for the external generic function whose top dispatcher is this.
 int functionNumber()
          Returns the function field number for this generic function within its $anchor class.
 GenericFunctionInfo genGenericFunctionInfo()
          Generates the generic function information for this required when generating a class file, or returns null if this method requires no such information.
 ArrayList genMethodInfo()
          Returns a list of CMethodInfo instances, one for this dispatcher and one for each multimethod body referenced by this.
 RMJAnnotation.Method[] getMethodAnnotations(String kind, String baseAnchorClassName, String dispatcherClassName, String ambigErrorClassName)
           
 boolean isTopDispatcherInLattice()
          Indicates whether this dispatcher method is the top dispatcher method in the generic function lattice.
protected  void plantBodyBytecode(CodeSequence code)
          Plants the bytecode for a dispatcher method that dynamically selects the appropriate multimethod body from the set represented by this.
protected  void plantFilteredDispatcherBody(CodeSequence code, CClass receiverSubclass)
          Plants the bytecode for a dispatcher method that dynamically selects the appropriate multimethod body from the set represented by this, but filtered so that only multimethods whose receiver type is a proper supertype of receiverSubclass will be dispatched to.
 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 plantNoMethodThrow(CodeSequence code)
          Plant instructions for throwing a NoSuchMethodException onto the given code sequence.
 void plantOldFunctionRef(CodeSequence code, boolean forSuper, boolean fromOuter)
          Generates bytecode to put a reference to the oldFunction field for the external generic function on the JVM stack.
protected  void setOwner(CClass owner)
          Sets the owner of this member.
protected  void swallowReceiver()
          Swallow the receiver, which is passed as the first argument to an external generic function.
 String toString()
          Returns a string representation of this grouped multimethod.
 
Methods inherited from class org.multijava.mjc.CSourceMethod
addFilteredDispatcher, body, createCMethodInfo, createMethodInfo, declarationASTNode, dispatcherClassName, dispatcherMethod, exceptionsAsStringArray, genCode, getBody, getGenericSignature, getSignature, isTopLevelAbstractMethod, isUsed, markAsTopLevelAbstractMethod, nonEmptyMethodInfo, optimizingLevel, removePrivacyModifierIfNecessary, setDispatcherMethod, setParmsAndOptimizeCode, setUsed
 
Methods inherited from class org.multijava.mjc.CMethod
apparentlySpecializes, apparentlySpecializes, apparentlySpecializes, bodyGenericSignature, bodyIdent, bodySignature, compareTo, declarationContext, equalParameters, equalParametersNoUniverses, equals, genDispatch, genGenFuncInvocation, getGenerateFrom, getMethod, getSpecArgs, getTypeVariable, hashCode, hasSameSignature, hasSameSignature, hasSameSignatureNoUniverses, isAbstract, isApplicable, isConstructor, isExternal, isGenericMethod, isInExternalGF, isLocalTo, isMixedPleomorphic, isMoreSpecificThan, isMoreSpecificThan, isMoreSpecificThan, isMoreSpecificThan, isMoreSpecificThan, isNative, isPure, isSynthetic, lookupTypeVariable, mmGenericSignature, mmSignature, overriddenMethodSet, parameters, parametersSize, plantMMInvocation, plantSelfArguments, purityWasChanged, receiverType, returnType, setGenerateFrom, setIDs, setIsMixedPleomorphic, setOverriddenMethodSet, setOverriddenMethodSet, setParameters, setReturnType, setSynthetic, setThrowables, specializes, throwables, topConcreteMethod, toString
 
Methods inherited from class org.multijava.mjc.CMember
access, addModifiers, deprecated, getCClass, getCCompilationUnit, getField, getIdent, getJavaName, getOwnerName, getQualNameWithSeparator, hasDefaultAccess, hasProtectedVisibilityIn, host, ident, isAccessibleFrom, isDeclaredNonNull, isDeprecated, isFinal, isLocalTo, isPrivate, isProtected, isPublic, isStatic, modifiers, owner, qualifiedName, 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
finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

multimethods

private final CSourceMethod[] multimethods

where

private TokenReference where

isTopDispatcherInLattice

private boolean isTopDispatcherInLattice

isInBaseAnchorClass

private boolean isInBaseAnchorClass

dispatcherClass

protected CSourceDispatcherClass dispatcherClass
If this a method of an external generic function, then this field represents the dispatcher inner class for this method. Otherwise this field is null.


OVERRIDES_RELATION

private static final DirectedAcyclicGraph.EdgeCalculator OVERRIDES_RELATION
Constructor Detail

CSourceDispatcherMethod

public CSourceDispatcherMethod(TokenReference where,
                               Main compiler,
                               CSourceClass outer,
                               CMethod topConcreteMethod,
                               CSourceMethod[] multimethods,
                               int gfID)
Constructs a dispatcher method for the given set of multimethods.

 requires multimethods != null && multimethods.length > 0;
 

Parameters:
where - a reference to the source code for annotating bytecode
outer - the class that hosts this dispatcher, either the declaring class for internal methods or the anchor class for external methods
topConcreteMethod - the top concrete method of the generic function
multimethods - the collection of multimethods for which this this will dispatch
gfID - the unique ID of this dispatcher's associated gf, used to give its $body methods a unique name
Method Detail

setOwner

protected void setOwner(CClass owner)
Sets the owner of this member.

See Also:
#owner

isTopDispatcherInLattice

public boolean isTopDispatcherInLattice()
Indicates whether this dispatcher method is the top dispatcher method in the generic function lattice.


swallowReceiver

protected void swallowReceiver()
Description copied from class: CMethod
Swallow the receiver, which is passed as the first argument to an external generic function.

 requires topConcreteMethod != null && topConcreteMethod.isExternal();
 assignable parameters;
 ensures parameters.length == \old(parameters).length + 1;
 ensures parameters[0].staticType() == topConcreteMethod.receiverType();
 ensures parameters[0].dynamicType() == this.receiverType();
 

Overrides:
swallowReceiver in class CMethod

toString

public String toString()
Returns a string representation of this grouped multimethod.

Overrides:
toString in class CSourceMethod
Returns:
a string representation of this

dispatcherClass

protected CSourceDispatcherClass dispatcherClass()
Returns the dispatcher class for this.

 requires dispatcherClass != null;
 requires_redundantly topConcreteMethod.isExternal();
 


dispatcherSignature

public CDispatcherSignature dispatcherSignature()
Returns the $signature class for this.

 also
 requires dispatcherClass != null;
 requires_redundantly topConcreteMethod.isExternal();
 

Overrides:
dispatcherSignature in class CSourceMethod

ambiguousDispatcherClass

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

 also
 requires dispatcherClass != null;
 requires_redundantly topConcreteMethod.isExternal();
 

Overrides:
ambiguousDispatcherClass in class CSourceMethod

anchorClass

public CClass anchorClass()
Returns the $anchor class for this generic function.

 also
 requires dispatcherClass != null;
 requires_redundantly topConcreteMethod.isExternal();
 

Overrides:
anchorClass in class CSourceMethod

functionNumber

public int functionNumber()
Returns the function field number for this generic function within its $anchor class.

 also
 requires dispatcherClass != null;
 requires_redundantly topConcreteMethod.isExternal();
 

Overrides:
functionNumber in class CSourceMethod

filteredDispatchers

protected CMethodSet filteredDispatchers()
Returns the filtered dispatcher methods for the external generic function whose top dispatcher is this. At code generation time these filtered dispatcher methods are used to generate special dispatchers for handling superclass method invocations within the generic function.

 also 
 requires topConcreteMethod instanceof CSourceMethod &&
          (\exists int i; i <= 0 && i < multimethods.length;
              multimethods[i] == topConcreteMethod);
 

Overrides:
filteredDispatchers in class CSourceMethod

genMethodInfo

public ArrayList genMethodInfo()
Returns a list of CMethodInfo instances, one for this dispatcher and one for each multimethod body referenced by this.

Overrides:
genMethodInfo in class CSourceMethod

getMethodAnnotations

public RMJAnnotation.Method[] getMethodAnnotations(String kind,
                                                   String baseAnchorClassName,
                                                   String dispatcherClassName,
                                                   String ambigErrorClassName)

genGenericFunctionInfo

public GenericFunctionInfo genGenericFunctionInfo()
Generates the generic function information for this required when generating a class file, or returns null if this method requires no such information.

Overrides:
genGenericFunctionInfo in class CSourceMethod

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.

   also
   requires isTopDispatcherInLattice();
 

Overrides:
plantFunctionRef in class CSourceMethod

plantOldFunctionRef

public void plantOldFunctionRef(CodeSequence code,
                                boolean forSuper,
                                boolean fromOuter)
Generates bytecode to put a reference to the oldFunction field for the external generic function on the JVM stack.

   also
   requires this.isExternal();
 

Overrides:
plantOldFunctionRef in class CSourceMethod
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

clone

protected Object clone()
Overrides:
clone in class Object

plantBodyBytecode

protected void plantBodyBytecode(CodeSequence code)
Plants the bytecode for a dispatcher method that dynamically selects the appropriate multimethod body from the set represented by this.

Overrides:
plantBodyBytecode in class CSourceMethod

plantFilteredDispatcherBody

protected void plantFilteredDispatcherBody(CodeSequence code,
                                           CClass receiverSubclass)
Plants the bytecode for a dispatcher method that dynamically selects the appropriate multimethod body from the set represented by this, but filtered so that only multimethods whose receiver type is a proper supertype of receiverSubclass will be dispatched to. receiverSubclass may be null in which case no filtering is done.


plantNoMethodThrow

private void plantNoMethodThrow(CodeSequence code)
Plant instructions for throwing a NoSuchMethodException onto the given code sequence.


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.