mjc

org.multijava.mjc
Class CSourceMethod

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.CMember
          extended byorg.multijava.mjc.CMethod
              extended byorg.multijava.mjc.CSourceMethod
All Implemented Interfaces:
Cloneable, Comparable, Constants, Constants, SigSourceMember
Direct Known Subclasses:
CAnchorInitializer, CAssertHelperMethod, CAssertStaticInitMethod, CCORInitializer, CDispatcherInitializer, CFieldAccessorMethod, CFunctionAccessMethod, CSourceAmbiguousDispatcherClass.CSourceAmbiguousDispatcherClass$1, CSourceAmbiguousDispatcherClass.CSourceAmbiguousDispatcherClass$2, CSourceAmbiguousDispatcherClass.CSourceAmbiguousDispatcherClass$3, CSourceDispatcherClass.CSourceDispatcherClass$1, CSourceDispatcherMethod, CSourceDispatcherSignature.CSourceDispatcherSignature$1, CSourceFilteredDispatcherMethod, CSourceRedirectorMethod, CWrapperMethod

public class CSourceMethod
extends CMethod
implements SigSourceMember

This class represents a method read from a source code (*.java) file. It stores the fully qualified type signature and the method body.


Field Summary
private  boolean _isTopLevelAbstractMethod
           
private  JBlock body
           
private  JMethodDeclaration declarationASTNode
          The AST node corresponding to the declaration of this, may be null.
private  CSourceDispatcherMethod dispatcherMethod
           
private  CMethodSet filteredDispatchers
          Stores the filtered dispatcher methods for the external generic function whose top method is this.
private  int optimizingLevel
           
private  boolean used
           
 
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
CSourceMethod(MemberAccess access, String ident, CType returnType, CSpecializedType[] paramTypes, CClassType[] exceptions, CTypeVariable[] typevariables, boolean deprecated, JBlock body, CContextType declarationContext, JMethodDeclaration declarationASTNode)
          Constructs a representation of the method as read from the source file including the type signature and the method body
 
Method Summary
protected  void addFilteredDispatcher(CSourceFilteredDispatcherMethod fdm)
          Stores a reference to the given filtered dispatcher method.
 CAmbiguousDispatcherClass ambiguousDispatcherClass()
          Returns the ambiguous-method dispatcher class for this.
 CClass anchorClass()
          Returns the $anchor class for this generic function.
 JBlock body()
          Returns the body of this method
protected  MethodInfo createCMethodInfo(long modifiers, String name, String type, String genericsignature, String[] exceptions, CSourceMethod method, boolean deprecated, boolean synthetic)
          Creates a method info object.
protected  MethodInfo createMethodInfo(long modifiers, String name, String type, String genericsignature, String[] exceptions, CodeInfo code, boolean deprecated, boolean synthetic)
          Creates a method info object.
 JMemberDeclaration declarationASTNode()
          Returns the AST node for the declaration corresponding to this signature.
protected  String dispatcherClassName()
          Returns the name of the dispatcher class for this multimethod.
protected  CSourceDispatcherMethod dispatcherMethod()
          Returns the dispatcher method for this multimethod.
 CDispatcherSignature dispatcherSignature()
          Returns the $signature class for this.
protected  String[] exceptionsAsStringArray()
          Returns a string array of the fully qualified names of the exceptions throwable by this.
protected  CMethodSet filteredDispatchers()
          Returns the filtered dispatcher methods for the external generic function whose top method is this.
 int functionNumber()
          Returns the function field number for this generic function within its $anchor class.
 CodeInfo genCode()
          Generates the bytecode for this method
 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()
          Generate the method information for this for constructing a class file [JVM2 4.6].
protected  JBlock getBody()
           
 String getGenericSignature()
           
 String getSignature()
          Generates a string giving the type signature of this method.
 boolean isTopLevelAbstractMethod()
           
 boolean isUsed()
          Checks whether this method is used.
 void markAsTopLevelAbstractMethod()
           
protected  MethodInfo nonEmptyMethodInfo(String id)
           
 int optimizingLevel()
          Returns the optimizing level of this.
protected  void plantBodyBytecode(CodeSequence code)
          Plants the bytecode for the body of this method.
 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.
protected  void removePrivacyModifierIfNecessary()
           
protected  void setDispatcherMethod(CSourceDispatcherMethod dispatcherMethod)
          Sets the dispatcher method for this multimethod.
protected  CodeInfo setParmsAndOptimizeCode(CodeInfo info)
           
 void setUsed()
          Sets a flag indicating that this method is used
 String toString()
          Return a string representation of this.
 
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, swallowReceiver, 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
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

body

private JBlock body

used

private boolean used

optimizingLevel

private int optimizingLevel

dispatcherMethod

private CSourceDispatcherMethod dispatcherMethod

_isTopLevelAbstractMethod

private boolean _isTopLevelAbstractMethod

filteredDispatchers

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


declarationASTNode

private JMethodDeclaration declarationASTNode
The AST node corresponding to the declaration of this, may be null.

Constructor Detail

CSourceMethod

public CSourceMethod(MemberAccess access,
                     String ident,
                     CType returnType,
                     CSpecializedType[] paramTypes,
                     CClassType[] exceptions,
                     CTypeVariable[] typevariables,
                     boolean deprecated,
                     JBlock body,
                     CContextType declarationContext,
                     JMethodDeclaration declarationASTNode)
Constructs a representation of the method as read from the source file including the type signature and the method body

Parameters:
access - contains the info used to determine accessibility of this method
ident - the ident of this method
returnType - the return type of this method
paramTypes - the parameter types of this method
exceptions - a list of all exceptions in the throws list
deprecated - is this method deprecated
body - the source code
declarationContext - the context in which this method is declared
declarationASTNode - the AST node corresponding to the declaration of this, may be null
Method Detail

isUsed

public boolean isUsed()
Checks whether this method is used. Non-private methods are always assumed to be used.

Returns:
true if this method should be consider used

setUsed

public void setUsed()
Sets a flag indicating that this method is used


body

public JBlock body()
Returns the body of this method


optimizingLevel

public int optimizingLevel()
Returns the optimizing level of this.


setDispatcherMethod

protected void setDispatcherMethod(CSourceDispatcherMethod dispatcherMethod)
Sets the dispatcher method for this multimethod.

Parameters:
dispatcherMethod - a CSourceDispatcherMethod value

dispatcherMethod

protected CSourceDispatcherMethod dispatcherMethod()
Returns the dispatcher method for this multimethod.


dispatcherClassName

protected String dispatcherClassName()
Returns the name of the dispatcher class for this multimethod.

 requires topConcreteMethod.isExternal();
 


addFilteredDispatcher

protected void addFilteredDispatcher(CSourceFilteredDispatcherMethod fdm)
Stores a reference to the given filtered dispatcher method. At code generation time this filtered dispatcher method will be used to generate a special dispatcher for handling superclass method invocations within the external generic function whose top method this is.


filteredDispatchers

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


toString

public String toString()
Return a string representation of this.

Overrides:
toString in class CMethod

declarationASTNode

public JMemberDeclaration declarationASTNode()
Returns the AST node for the declaration corresponding to this signature. May return null if mapping to declaration is not available. For example, an objects representing a synthetic method might be a subtype of CSourceMethod, yet such an object does not have a corresponding AST node.

 also 
 ensures \result instanceof JMethodDeclaration;
 

Specified by:
declarationASTNode in interface SigSourceMember

genMethodInfo

public ArrayList genMethodInfo()
Description copied from class: CMethod
Generate the method information for this for constructing a class file [JVM2 4.6].

Overrides:
genMethodInfo in class CMethod

nonEmptyMethodInfo

protected MethodInfo nonEmptyMethodInfo(String id)

createCMethodInfo

protected MethodInfo createCMethodInfo(long modifiers,
                                       String name,
                                       String type,
                                       String genericsignature,
                                       String[] exceptions,
                                       CSourceMethod method,
                                       boolean deprecated,
                                       boolean synthetic)
Creates a method info object. This is a factory method that may be overridden by the subclass.


createMethodInfo

protected MethodInfo createMethodInfo(long modifiers,
                                      String name,
                                      String type,
                                      String genericsignature,
                                      String[] exceptions,
                                      CodeInfo code,
                                      boolean deprecated,
                                      boolean synthetic)
Creates a method info object. This is a factory method that may be overridden by the subclass.


exceptionsAsStringArray

protected String[] exceptionsAsStringArray()
Returns a string array of the fully qualified names of the exceptions throwable by this. Provided as a utility method so subclasses of this can easily override genMethodInfo.

See Also:
genMethodInfo()

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 CMethod

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 topConcreteMethod == this;
 requires this.isExternal();
 requires_redundantly dispatcherMethod != null;
 


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();
 requires_redundantly dispatcherMethod != null;
 


ambiguousDispatcherClass

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

 also
 requires this.isExternal();
 requires_redundantly dispatcherMethod != null;
 


anchorClass

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

 also 
 requires this.isExternal();
 requires_redundantly dispatcherMethod != null;
 


functionNumber

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

 also
 requires this.isExternal();
 requires_redundantly dispatcherMethod != null;
 


getSignature

public String getSignature()
Generates a string giving the type signature of this method.

Overrides:
getSignature in class CMethod
Returns:
the type signature of this method

getGenericSignature

public String getGenericSignature()
Overrides:
getGenericSignature in class CMethod

genCode

public CodeInfo genCode()
Generates the bytecode for this method

Returns:
the bytecode info for this method

plantBodyBytecode

protected void plantBodyBytecode(CodeSequence code)
Plants the bytecode for the body of this method. Separated from genCode() so subclasses my replace standard body bytecode with specialized code.

See Also:
genCode()

setParmsAndOptimizeCode

protected CodeInfo setParmsAndOptimizeCode(CodeInfo info)

removePrivacyModifierIfNecessary

protected void removePrivacyModifierIfNecessary()

isTopLevelAbstractMethod

public boolean isTopLevelAbstractMethod()

markAsTopLevelAbstractMethod

public void markAsTopLevelAbstractMethod()

getBody

protected JBlock getBody()

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.