JML

org.multijava.mjc
Class JMethodCallExpression

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JExpression
                  extended byorg.multijava.mjc.JMethodCallExpression
All Implemented Interfaces:
Cloneable, Constants, Constants, PhylumType
Direct Known Subclasses:
JResendExpression, TransInvariant.CallExpr, TransInvariant.CallExpr2

public class JMethodCallExpression
extends JExpression

This class represents method calls methodname( e1, e2, ..., en )


Field Summary
private  JLocalVariable[] argLocalVars
          an array of local variables used as temps for the args of the call.
protected  JExpression[] args
           
private  CType cachedType
           
private  boolean doSetContext
           
protected  String ident
           
private  boolean isCase_s_e2
          Tracks whether the invocation is of a super class method that belongs to the same external generic function as the caller but is declared in a different compilation unit (Clifton-01, Figure 24, case s-e2).
private  CMethod localMethod
          A local method of the generic function targeted by this invocation.
protected  CMethod method
          The method invoked by this method call, as determined by the static receiver and argument types.
protected  JExpression prefix
           
private  JExpression repObject
           
private  JIfStatement repTest
           
private  JMethodCallExpression resetContext
           
private  JMethodCallExpression setContext
           
private  boolean skipLocalFunction
          Tracks whether invocation is of a super class method that belongs to an external generic function (Clifton-01, Figure 24, cases s-i3, s-e2, or s-e3) where a local method of the target generic function must be skipped in the chain-of-responsibility.
private  JNameExpression sourceName
          the name of this field reference as originally appeared in the source file.
private  JLocalVariable tmpLocalVar
           
protected  CMethod topConcreteMethod
          The top concrete method of the generic function invoked by this method call.
private  CType type
           
 
Fields inherited from class org.multijava.mjc.JExpression
EMPTY
 
Fields inherited from class org.multijava.util.compiler.Phylum
 
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
protected JMethodCallExpression(TokenReference where, JExpression prefix, String ident, JExpression[] args)
          Constructs a method call node of an AST.
  JMethodCallExpression(TokenReference where, JExpression prefix, String ident, JExpression[] args, boolean doSetContext)
          Constructs a method call node of an AST.
  JMethodCallExpression(TokenReference where, JExpression prefix, JExpression[] args)
          Construct a node in the parsing tree This method is directly called by the parser
 
Method Summary
 void accept(MjcVisitor p)
          Accepts the specified visitor
 JExpression[] args()
           
protected  CType[] checkArgumentTypes(CExpressionContextType context)
          Typechecks args and returns an array of the argument types.
private  void checkMethodFound(CMethod found, CType[] argTypes)
          Builds an error message and throws an exception if found is null.
private  void checkParameterUniverses(CExpressionContextType context, CUniverse prefix_universe, boolean non_pure_through_pivot)
          Check the universe types of the parameters.
private  void ensurePrefixIsInitialized(CExpressionContextType context)
          Ensures that, if the target method is not static, then the prefix field contains an appropriate expression that evaluates to the method's receiver.
protected  void genActualArgLoads(CodeSequence code)
          Plants the code for loading the actual args from their local vars.
protected  void genActualArgs(CodeSequence code)
          Plants the code for putting the args to the call on the stack.
protected  void genActualArgStores(CodeSequence code)
          Plants the code for storing the actual args to local variables.
 void genCode(CodeSequence code)
          Generates a sequence of bytecodes.
protected  void genExternalTargetRef(CodeSequence code)
          Plants the code for putting a reference to the appropriate dispatcher in the chain-of-responsibility onto the stack.
protected  void genInvocationOpcode(CodeSequence code)
          Generates the bytecode for invoking the actual target method.
private  void genPrefix(CodeSequence code)
          Generates the bytecode for adding the prefix to the JVM stack.
protected  JFormalParameter[] getFormalParameters()
           
 CType getType()
           
private  void handlePossibleRawTypeAccess(CExpressionContextType context)
          If a non-static method is accessed as a member of a raw type, the following actions are performed (see JLS3 4.8): Replace the type of the method return value by its erasure.
protected  void handleSuperPrefix(CType[] argTypes, CExpressionContextType context)
          Handles processing of cases where prefix is a super expression, including various hacks for MultiJava super sends and for super sends to inner and outer classes.
 String ident()
           
(package private) static boolean isInnerThis(JExpression expr)
           
 boolean isNonNull(CContextType context)
          Returns true iff the value represented by this expression is non-null
 boolean isStatementExpression()
          Returns true iff this expression can be used as a statement (JLS 14.7)
protected  CMethod lookupMethod(CType[] argTypes, CExpressionContextType context)
          Returns the apparent target method for this call.
 CMethod method()
          Returns the method being called.
 JExpression prefix()
           
private  void processExceptions(CExpressionContextType context)
          Processes the exceptions thrown by the target method and registers them with the context.
protected  void resolveExternalMethods(CExpressionContextType context)
          Makes sure any external generic functions that are implicitly imported are actually available in the data structures.
 void setPrefix(JExpression expr)
           
 void setType(CType type)
           
 JNameExpression sourceName()
          Returns the name of this field reference as originally appeared in the source file.
 String toString()
          Returns a string representation of this.
 JExpression typecheck(CExpressionContextType context)
          Typechecks the expression and mutates the context to record information gathered during typechecking.
private  void typecheckNullity(CExpressionContextType context)
           
private  void typecheckUncheckedWarnings(CType[] actuals, CExpressionContextType context)
          Issues unchecked warnings for the actual parameters which need unchecked conversion (JLS3 5.1.9) to conform to their corresponding formal parameters.
private  void typecheckUniverse(CExpressionContextType context)
          Typecheck the universe properties of the method call.
private  CUniverse typecheckUniverseMethodOnThis(CExpressionContextType context, CUniverse prefix_universe)
          Check the properties of a method call that is performed on this, the current object, regardless of whether the call is pure or not.
private  CUniverse typecheckUniverseNonPureOnPivot(CExpressionContextType context, CUniverse prefix_universe)
          Check the properties of a non-pure method call that is performed through a pivot, i.e. not on this.
private  CUniverse typecheckUniversePureOnPivot(CExpressionContextType context, CUniverse prefix_universe)
          Check the properties of a pure method call that is performed through a pivot, i.e. not on this.
 
Methods inherited from class org.multijava.mjc.JExpression
buildUniverseDynChecks, clone, convertType, dumpArray, fail, genBranch, genUniverseDynCheckCode, getApparentType, getBooleanLiteral, getFANonNulls, getFANulls, getLiteral, getNumberLiteral, getOrdinalLiteral, getRealLiteral, getStringLiteral, isAssignableTo, isBooleanLiteral, isConstant, isDeclaredNonNull, isLiteral, isMaybeInitializable, isOrdinalLiteral, isRealLiteral, isStringLiteral, typecheck, unParenthesize
 
Methods inherited from class org.multijava.mjc.JPhylum
check, check, check, check, fail, fail, warn, warn, warn, warn
 
Methods inherited from class org.multijava.util.compiler.Phylum
getTokenReference, setTokenReference
 
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
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

prefix

protected JExpression prefix

ident

protected String ident

args

protected JExpression[] args

type

private CType type

cachedType

private CType cachedType

method

protected CMethod method
The method invoked by this method call, as determined by the static receiver and argument types. Dynamic dispatch may cause an overriding method to be invoked at runtime.


topConcreteMethod

protected CMethod topConcreteMethod
The top concrete method of the generic function invoked by this method call.


skipLocalFunction

private boolean skipLocalFunction
Tracks whether invocation is of a super class method that belongs to an external generic function (Clifton-01, Figure 24, cases s-i3, s-e2, or s-e3) where a local method of the target generic function must be skipped in the chain-of-responsibility.


isCase_s_e2

private boolean isCase_s_e2
Tracks whether the invocation is of a super class method that belongs to the same external generic function as the caller but is declared in a different compilation unit (Clifton-01, Figure 24, case s-e2).


localMethod

private CMethod localMethod
A local method of the generic function targeted by this invocation.

 private invariant skipLocalFunction ==> localMethod != null;
 


sourceName

private JNameExpression sourceName
the name of this field reference as originally appeared in the source file. It may be null if generated by the system.


argLocalVars

private JLocalVariable[] argLocalVars
an array of local variables used as temps for the args of the call. necessary if the call is external and we're using RMJ.


setContext

private JMethodCallExpression setContext

resetContext

private JMethodCallExpression resetContext

tmpLocalVar

private JLocalVariable tmpLocalVar

doSetContext

private boolean doSetContext

repObject

private JExpression repObject

repTest

private JIfStatement repTest
Constructor Detail

JMethodCallExpression

public JMethodCallExpression(TokenReference where,
                             JExpression prefix,
                             JExpression[] args)
Construct a node in the parsing tree This method is directly called by the parser

Parameters:
where - the line of this node in the source code
prefix - an expression that is a member of an object or class representing a method
args - the arguments of the call

JMethodCallExpression

protected JMethodCallExpression(TokenReference where,
                                JExpression prefix,
                                String ident,
                                JExpression[] args)
Constructs a method call node of an AST. This method is not directly called by the parser.

Parameters:
where - the location of this node in the source code
prefix - the receiver of the method call, or null
ident - the name of the method to be invoked, must be non-null
args - the non-receiver arguments of the call

JMethodCallExpression

public JMethodCallExpression(TokenReference where,
                             JExpression prefix,
                             String ident,
                             JExpression[] args,
                             boolean doSetContext)
Constructs a method call node of an AST. This method is not directly called by the parser. Used for the universe runtime checks. Before and after calls to static methods additional calls are generated. As these calls are static too, we need a way to stop the recursion so all method calls generated for the universe runtime checks use this constructor and set doSetContext to false.

Parameters:
where - the location of this node in the source code
prefix - the receiver of the method call, or null
ident - the name of the method to be invoked, must be non-null
args - the non-receiver arguments of the call
doSetContext - whether or not to create the calls to save the current context (will be generated only when the universeDynChecks are enabled) By scdaniel.
Method Detail

sourceName

public JNameExpression sourceName()
Returns the name of this field reference as originally appeared in the source file. The return value may be null if this field reference was built by the system.


prefix

public JExpression prefix()

ident

public String ident()

args

public JExpression[] args()

getType

public CType getType()
Description copied from class: JExpression
Returns the type of this expression (call after parsing only)

Returns:
the type of this expression

isNonNull

public boolean isNonNull(CContextType context)
Returns true iff the value represented by this expression is non-null

Overrides:
isNonNull in class JExpression

setType

public void setType(CType type)

setPrefix

public void setPrefix(JExpression expr)

method

public CMethod method()
Returns the method being called. This method must be called after typechecking.


isStatementExpression

public boolean isStatementExpression()
Returns true iff this expression can be used as a statement (JLS 14.7)

Overrides:
isStatementExpression in class JExpression

toString

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

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

typecheck

public JExpression typecheck(CExpressionContextType context)
                      throws PositionedError
Typechecks the expression and mutates the context to record information gathered during typechecking.

Parameters:
context - the context in which this expression appears
Returns:
a desugared Java expression (see JExpression.typecheck())
Throws:
PositionedError - if the check fails

typecheckUncheckedWarnings

private void typecheckUncheckedWarnings(CType[] actuals,
                                        CExpressionContextType context)
                                 throws PositionedError
Issues unchecked warnings for the actual parameters which need unchecked conversion (JLS3 5.1.9) to conform to their corresponding formal parameters.

Parameters:
actuals - The actual arguments of this method call.
context - The type checking context.
Throws:
PositionedError - if some error occurs during type checking.

handlePossibleRawTypeAccess

private void handlePossibleRawTypeAccess(CExpressionContextType context)
                                  throws PositionedError
If a non-static method is accessed as a member of a raw type, the following actions are performed (see JLS3 4.8):

Parameters:
context - The typechecking context.
Throws:
PositionedError - if an error occurs during typechecking.

typecheckNullity

private void typecheckNullity(CExpressionContextType context)
                       throws PositionedError
Throws:
PositionedError

isInnerThis

static boolean isInnerThis(JExpression expr)

checkArgumentTypes

protected CType[] checkArgumentTypes(CExpressionContextType context)
                              throws PositionedError
Typechecks args and returns an array of the argument types.

 requires context != null;
 modifiable args;
 ensures \result != null && \result.length == args.length;
 

Throws:
PositionedError

resolveExternalMethods

protected void resolveExternalMethods(CExpressionContextType context)
Makes sure any external generic functions that are implicitly imported are actually available in the data structures.


getFormalParameters

protected JFormalParameter[] getFormalParameters()

lookupMethod

protected CMethod lookupMethod(CType[] argTypes,
                               CExpressionContextType context)
                        throws UnpositionedError,
                               PositionedError
Returns the apparent target method for this call. (We say apparent because it may be that some synthetic redirection is needed in the generated code to account for compilation techniques of MultiJava or Java workarounds for the JVM's lack of support for inner classes.)

Throws:
UnpositionedError
PositionedError

checkMethodFound

private void checkMethodFound(CMethod found,
                              CType[] argTypes)
                       throws CMethodNotFoundError
Builds an error message and throws an exception if found is null.

 ensures found != null ==> true;
 signals_only CMethodNotFoundError;
 signals (CMethodNotFoundError) found == null;
 

Throws:
CMethodNotFoundError

handleSuperPrefix

protected void handleSuperPrefix(CType[] argTypes,
                                 CExpressionContextType context)
                          throws UnpositionedError,
                                 PositionedError
Handles processing of cases where prefix is a super expression, including various hacks for MultiJava super sends and for super sends to inner and outer classes.

 modifies method, prefix, localMethod, skipLocalFunction, isCase_s_e2;
 

Throws:
UnpositionedError
PositionedError

processExceptions

private void processExceptions(CExpressionContextType context)
Processes the exceptions thrown by the target method and registers them with the context.


ensurePrefixIsInitialized

private void ensurePrefixIsInitialized(CExpressionContextType context)
                                throws PositionedError
Ensures that, if the target method is not static, then the prefix field contains an appropriate expression that evaluates to the method's receiver.

 requires context != null;
 modifies prefix;
 ensures prefix != null || method.access().isStatic();
 

Throws:
PositionedError

typecheckUniverse

private void typecheckUniverse(CExpressionContextType context)
                        throws PositionedError
Typecheck the universe properties of the method call. Some general checks are performed here and then the specialised functions for the different method types are invoked. In the end the attribute result_universe will contain the correct universe modifier. The method setType has to be called to set the type and universe modifier! By WMD.

Throws:
PositionedError

typecheckUniverseNonPureOnPivot

private CUniverse typecheckUniverseNonPureOnPivot(CExpressionContextType context,
                                                  CUniverse prefix_universe)
                                           throws PositionedError
Check the properties of a non-pure method call that is performed through a pivot, i.e. not on this. By WMD.

Throws:
PositionedError

typecheckUniversePureOnPivot

private CUniverse typecheckUniversePureOnPivot(CExpressionContextType context,
                                               CUniverse prefix_universe)
                                        throws PositionedError
Check the properties of a pure method call that is performed through a pivot, i.e. not on this. By WMD.

Throws:
PositionedError

typecheckUniverseMethodOnThis

private CUniverse typecheckUniverseMethodOnThis(CExpressionContextType context,
                                                CUniverse prefix_universe)
                                         throws PositionedError
Check the properties of a method call that is performed on this, the current object, regardless of whether the call is pure or not. By WMD.

Throws:
PositionedError

checkParameterUniverses

private void checkParameterUniverses(CExpressionContextType context,
                                     CUniverse prefix_universe,
                                     boolean non_pure_through_pivot)
                              throws PositionedError
Check the universe types of the parameters. By WMD.

Throws:
PositionedError

accept

public void accept(MjcVisitor p)
Accepts the specified visitor

Parameters:
p - the visitor

genCode

public void genCode(CodeSequence code)
Generates a sequence of bytecodes.

 also
 public normal_behavior
   requires code != null;
   {|
     requires code.discardValue();
     assignable \not_specified;
     ensures (* after executing generated code JVM stack is unchanged *);
   also
     requires !code.discardValue();
     assignable \not_specified;
     ensures (* after executing generated code JVM stack contains 
		      result *);
   |}
 


genPrefix

private void genPrefix(CodeSequence code)
Generates the bytecode for adding the prefix to the JVM stack.


genActualArgs

protected void genActualArgs(CodeSequence code)
Plants the code for putting the args to the call on the stack.


genActualArgStores

protected void genActualArgStores(CodeSequence code)
Plants the code for storing the actual args to local variables. Used by RMJ for calls to external generic functions. Assumes the actual args are currently on the stack, with the last one on top.


genActualArgLoads

protected void genActualArgLoads(CodeSequence code)
Plants the code for loading the actual args from their local vars. Used by RMJ for calls to external generic functions.


genExternalTargetRef

protected void genExternalTargetRef(CodeSequence code)
Plants the code for putting a reference to the appropriate dispatcher in the chain-of-responsibility onto the stack.

 requires topConcreteMethod.isExternal();
 requires (* code already contains instructions for leaving any
             necessary prefix object on the stack *);
 


genInvocationOpcode

protected void genInvocationOpcode(CodeSequence code)
Generates the bytecode for invoking the actual target method. Assumes code sequence already contains code for pushing all the necessary arguments onto the stack. This is a helper method of genCode(CodeSequence).


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.