mjc

org.multijava.mjc
Class CBinaryMethod

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

public class CBinaryMethod
extends CMethod

This class represents a loaded (already compiled) class method.


Field Summary
private  CAmbiguousDispatcherClass ambiguousDispatcherClass
           
private  CDispatcherSignature dispatcherSig
           
private  int functionNumber
          The unique number of the overloaded external generic function to which this belongs, or Short.MAX_VALUE if this does not belong to an external generic function.
private static int TOPS_INIT_SIZE
           
private static int topsNextPos
           
private static CBinaryMethod[] unresolvedTops
           
private static int UNSW_INIT_SIZE
           
private static CBinaryMethod[] unswallowed
           
private static int unswNextPos
           
 
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
  CBinaryMethod(CClass host, MethodInfo methodInfo, CContextType declarationContext)
          Constructs a method
protected CBinaryMethod(MemberAccess acc, MethodInfo methodInfo, CContextType declarationContext)
          Constructs a method
 
Method Summary
 CAmbiguousDispatcherClass ambiguousDispatcherClass()
          Returns the ambiguous-method dispatcher class for this.
 CClass anchorClass()
          Returns the $anchor class for this generic function.
private static CClassType[] buildExceptionTypes(MethodInfo methodInfo)
           
private static CSpecializedType[] buildParameterTypes(CClass host, MethodInfo methodInfo)
           
private static CClass buildReceiverClass(CClass host, MethodInfo methodInfo)
           
private static CType buildReturnType(CClass host, MethodInfo methodInfo)
           
private static CTypeVariable[] buildTypeParameter(CClass host, MethodInfo methodInfo)
           
 void checkTypes(CContextType context)
           
 CDispatcherSignature dispatcherSignature()
          Returns the $signature class for this.
 int functionNumber()
          Returns the function field number for this generic function within its $anchor class.
private static String getCorrectSignature(CClass host, MethodInfo methodInfo)
          Simple convenience method which returns the appropriate method signature stored in the given methodInfo depending on whether Java generics are turned on or off in the current compilation session.
 void plantFunctionRef(CodeSequence code)
          Generates bytecode to put a reference to the external function field for the external generic function on the JVM stack.
 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.
private static void registerNew(CBinaryMethod self)
          Registers that the newly created binary method self has not had its top method resolved or its receiver swallowed.
 void registerVisibleTypes()
          Registers the types visible in the signature of this.
protected static void resolveTops()
          Resolves the top methods of all binary methods.
protected static void swallowReceivers()
          Swallows the receivers of all external methods read from bytecode.
 
Methods inherited from class org.multijava.mjc.CMethod
apparentlySpecializes, apparentlySpecializes, apparentlySpecializes, bodyGenericSignature, bodyIdent, bodySignature, compareTo, declarationContext, equalParameters, equalParametersNoUniverses, equals, genDispatch, genGenericFunctionInfo, genGenFuncInvocation, genMethodInfo, getGenerateFrom, getGenericSignature, getMethod, getSignature, 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, swallowReceiver, throwables, topConcreteMethod, toString, 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
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

TOPS_INIT_SIZE

private static final int TOPS_INIT_SIZE

topsNextPos

private static int topsNextPos

unresolvedTops

private static CBinaryMethod[] unresolvedTops

UNSW_INIT_SIZE

private static final int UNSW_INIT_SIZE

unswNextPos

private static int unswNextPos

unswallowed

private static CBinaryMethod[] unswallowed

functionNumber

private final int functionNumber
The unique number of the overloaded external generic function to which this belongs, or Short.MAX_VALUE if this does not belong to an external generic function.


dispatcherSig

private CDispatcherSignature dispatcherSig

ambiguousDispatcherClass

private CAmbiguousDispatcherClass ambiguousDispatcherClass
Constructor Detail

CBinaryMethod

public CBinaryMethod(CClass host,
                     MethodInfo methodInfo,
                     CContextType declarationContext)
Constructs a method

Parameters:
host - the host of this method
methodInfo - a multimethod info from a class file
declarationContext - the context in which this method is declared

CBinaryMethod

protected CBinaryMethod(MemberAccess acc,
                        MethodInfo methodInfo,
                        CContextType declarationContext)
Constructs a method

Parameters:
acc - the member access for this method
methodInfo - a multimethod info from a class file
declarationContext - the context in which this method is declared
Method Detail

buildReceiverClass

private static CClass buildReceiverClass(CClass host,
                                         MethodInfo methodInfo)

getCorrectSignature

private static String getCorrectSignature(CClass host,
                                          MethodInfo methodInfo)
Simple convenience method which returns the appropriate method signature stored in the given methodInfo depending on whether Java generics are turned on or off in the current compilation session.

Parameters:
methodInfo - The information representing this method as parsed from a *.class file.
Returns:
The signature to be used for this method.

buildReturnType

private static CType buildReturnType(CClass host,
                                     MethodInfo methodInfo)

buildTypeParameter

private static CTypeVariable[] buildTypeParameter(CClass host,
                                                  MethodInfo methodInfo)

buildParameterTypes

private static CSpecializedType[] buildParameterTypes(CClass host,
                                                      MethodInfo methodInfo)

buildExceptionTypes

private static CClassType[] buildExceptionTypes(MethodInfo methodInfo)

registerVisibleTypes

public void registerVisibleTypes()
Registers the types visible in the signature of this.


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 this.isExternal();
 


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();
 

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

dispatcherSignature

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

   also 
   requires this.isExternal();
 


ambiguousDispatcherClass

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

   also
   requires this.isExternal();
 


anchorClass

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

 also
 requires this.isExternal();
 


functionNumber

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

 also
 requires this.isExternal();
 


registerNew

private static void registerNew(CBinaryMethod self)
Registers that the newly created binary method self has not had its top method resolved or its receiver swallowed. Called from the constructor of this class.


resolveTops

protected static void resolveTops()
                           throws PositionedError
Resolves the top methods of all binary methods.

Throws:
PositionedError

checkTypes

public void checkTypes(CContextType context)
                throws UnpositionedError
Throws:
UnpositionedError

swallowReceivers

protected static void swallowReceivers()
Swallows the receivers of all external methods read from bytecode. Called immediately before code generation (synthetic receivers are kept outside the parameter lists until then for typechecking purposes.


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.