methodIterator.hpp

Go to the documentation of this file.
00001 /* Copyright 1994, LongView Technologies L.L.C. $Revision: 1.30 $ */
00002 /* Copyright (c) 2006, Sun Microsystems, Inc.
00003 All rights reserved.
00004 
00005 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the 
00006 following conditions are met:
00007 
00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
00009     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following 
00010           disclaimer in the documentation and/or other materials provided with the distribution.
00011     * Neither the name of Sun Microsystems nor the names of its contributors may be used to endorse or promote products derived 
00012           from this software without specific prior written permission.
00013 
00014 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT 
00015 NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
00016 THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
00017 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
00018 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
00019 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
00020 
00021 
00022 */
00023 
00024 // The MethodIterator iterates over the byte code structures of a methodOop
00025 // Usage:
00026 //    MethodIterator(method, &SomeMethodClosure);
00027 
00028 // A MethodInterval represents an interval of byte codes
00029 class MethodInterval: public ResourceObj {
00030  protected:
00031   MethodInterval* _parent;                      // enclosing interval (or NULL if top-level)
00032   methodOop _method;
00033   int       _begin_bci;
00034   int       _end_bci;
00035   bool      _in_prim_failure;                   // currently in primitive failure block?
00036 #ifdef DELTA_COMPILER
00037   IntervalInfo* _info;
00038 #endif
00039 
00040   void initialize(methodOop method, MethodInterval* parent, int begin_bci, int end_bci, bool failBlock);
00041   void set_end_bci(int bci) { _end_bci = bci; }
00042 
00043   // Constructors
00044   MethodInterval(methodOop method, MethodInterval* parent);
00045   MethodInterval(methodOop method, MethodInterval* parent, 
00046                  int begin_bci, int end_bci = -1, bool failureBlock = false);
00047   friend class MethodIntervalFactory;
00048 
00049  public:
00050   // Test operations
00051   bool includes(int bci) const          { return begin_bci() <= bci && bci < end_bci(); }
00052 
00053   // Accessor operations
00054   methodOop method()     const          { return _method;     }
00055   int       begin_bci()  const          { return _begin_bci;  }
00056   int       end_bci()    const          { return _end_bci;    }
00057   MethodInterval* parent() const        { return _parent; }
00058 
00059   // primitive failure block recognition (for inlining policy of compiler)
00060   bool in_prim_failure_block() const    { return _in_prim_failure; }
00061   void set_prim_failure(bool f)         { _in_prim_failure = f; }
00062 
00063   // compiler support (not fully implemented/used yet)
00064 #ifdef DELTA_COMPILER
00065   IntervalInfo* info() const            { return _info; }
00066   void set_info(IntervalInfo* i)        { _info = i; }
00067 #endif
00068 };
00069 
00070 
00071 // The hierarchy of structures in a method is as follow:
00072 //  - InlineSendNode
00073 //    - CondNode           (expr_code)
00074 //      - AndNode
00075 //      - OrNode
00076 //    - WhileNode          (expr_code, ?body_code)
00077 //    - IfNode             (then_code, ?else_code)
00078 //  - ExternalCallNode     (?failure_code)    
00079 //    - PrimitiveCallNode
00080 //    - DLLCallNode
00081 // The names in the parenthesis show the inlined blocks. 
00082 // ? denotes the inline block is optional.
00083 
00084 class InlineSendNode: public MethodInterval {
00085  protected:
00086   // Constructor
00087   InlineSendNode(methodOop method, MethodInterval* parent, int begin_bci, int end_bci = -1);
00088 
00089  public:
00090   // Accessor operation
00091   virtual symbolOop selector() const = 0;
00092 };
00093 
00094 
00095 class CondNode: public InlineSendNode {
00096  protected:
00097   MethodInterval* _expr_code;
00098 
00099   // Constructor
00100   CondNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset);
00101 
00102  public:
00103   // Inlined block
00104   MethodInterval* expr_code() const { return _expr_code; }
00105 
00106   // Accessor operations
00107   virtual bool is_and() const = 0;
00108   virtual bool is_or() const  = 0;
00109 };
00110 
00111 
00112 class AndNode: public CondNode {
00113   // Constructor
00114   AndNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset);
00115   friend class MethodIntervalFactory;
00116 
00117  public:
00118   // Accessor operation
00119   symbolOop selector() const;
00120   bool is_and() const { return true; }
00121   bool is_or() const  { return false; }
00122 };
00123 
00124 
00125 class OrNode: public CondNode {
00126  protected:
00127   // Constructor
00128   OrNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset);
00129   friend class MethodIntervalFactory;
00130 
00131  public:
00132   // Accessor operation
00133   symbolOop selector() const;
00134   bool is_and() const { return false; }
00135   bool is_or() const  { return true; }
00136 };
00137 
00138 
00139 class WhileNode: public InlineSendNode {
00140  protected:
00141   bool _cond; 
00142   MethodInterval* _expr_code;
00143   MethodInterval* _body_code;
00144   
00145   // Constructor
00146   WhileNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int cond_offset, int end_offset);
00147   friend class MethodIntervalFactory;
00148 
00149  public:
00150   // Mandatory inlined block
00151   MethodInterval* expr_code() const { return _expr_code; }
00152   // Optional inlined block
00153   MethodInterval* body_code() const { return _body_code; }
00154   
00155   // Accessor operations
00156   symbolOop selector() const;
00157   bool is_whileTrue() const { return _cond; }
00158   bool is_whileFalse() const { return !_cond; }
00159 };
00160 
00161 
00162 class IfNode: public InlineSendNode {
00163  protected:
00164   bool _cond;
00165   bool _ignore_else_while_printing;
00166   bool _produces_result;
00167   MethodInterval* _then_code;
00168   MethodInterval* _else_code;
00169 
00170   // Constructor
00171   IfNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool cond, int else_offset, u_char structure);
00172   friend class MethodIntervalFactory;
00173 
00174  public:
00175   // Inlined block
00176   MethodInterval* then_code() const { return _then_code; }
00177   // Optional inlined block
00178   MethodInterval* else_code() const { return _else_code; }
00179 
00180   // Accessor operations
00181   symbolOop selector() const;
00182   bool is_ifTrue()                  const { return _cond; }
00183   bool is_ifFalse()                 const { return !_cond; }
00184   bool ignore_else_while_printing() const { return _ignore_else_while_printing; }
00185   bool produces_result()            const { return _produces_result; }
00186 };
00187 
00188 
00189 class ExternalCallNode: public MethodInterval {
00190  protected:
00191   MethodInterval* _failure_code;
00192 
00193   // Constructors
00194   ExternalCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci);
00195   ExternalCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int end_offset);
00196 
00197   public:
00198  // Optional inlined block
00199   MethodInterval* failure_code() const { return _failure_code; }
00200 };
00201 
00202 
00203 class PrimitiveCallNode: public ExternalCallNode {
00204  protected:
00205   primitive_desc* _pdesc;
00206   bool            _has_receiver;
00207   symbolOop       _name;
00208 
00209   // Constructors
00210   PrimitiveCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool has_receiver, symbolOop name, primitive_desc* pdesc);
00211   PrimitiveCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool has_receiver, symbolOop name, primitive_desc* pdesc, int end_offset);
00212   friend class MethodIntervalFactory;
00213 
00214  public:
00215   // Returns the primitive descriptor
00216   primitive_desc* pdesc() const        { return _pdesc; }
00217   bool            has_receiver() const { return _has_receiver; }
00218   symbolOop       name() const         { return _name; }
00219   int             number_of_parameters() const;
00220 };
00221 
00222 
00223 class DLLCallNode: public ExternalCallNode {
00224  protected:
00225   symbolOop       _dll_name;
00226   symbolOop       _function_name;
00227   int             _nofArgs;
00228   dll_func        _function;
00229   bool            _async;
00230 
00231   void initialize(InterpretedDLL_Cache* cache);
00232 
00233   // Constructors
00234   DLLCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, InterpretedDLL_Cache* cache);
00235   friend class MethodIntervalFactory;
00236 
00237  public:
00238   // DLL accessor operations
00239   symbolOop dll_name()      const { return _dll_name;      }
00240   symbolOop function_name() const { return _function_name; }
00241   int       nofArgs()       const { return _nofArgs;       }
00242   dll_func  function()      const { return _function;      }
00243   bool      async()         const { return _async;         }
00244 };
00245 
00246 
00247 // When creating a block closure, AllocationType specifies what is used
00248 // in the context field of that block closure. When value is send to the
00249 // block, the context field is copied into the activation frame of the block.
00250 
00251 enum AllocationType {
00252   tos_as_scope,         // top of stack is used as context (usually nil or self)
00253   context_as_scope      // context of current stack frame (i.e. content of temp0)
00254                         // is used a context
00255 };
00256 
00257 class MethodIterator;
00258 
00259 // A MethodClosure is the object handling the call backs when iterating through a MethodInterval.
00260 // Virtuals are defined for each inline structure and each byte code not defining an inline structure.
00261 class MethodClosure: ValueObj {
00262  private:
00263   methodOop _method;
00264   int       _bci;
00265   int       _next_bci;
00266   bool      _aborting;
00267   bool      _in_prim_failure;                   // currently in primitive failure block?
00268   int       _float0_index;
00269 
00270   void set_method(methodOop method);
00271   void set_bci(int bci)                         { _bci      = bci;      }
00272   void set_next_bci(int next_bci)               { _next_bci = next_bci; }
00273   int  float_at(int index);                     // converts the float byte code index into a float number
00274 
00275  protected:
00276   MethodClosure();
00277   // operations to terminate iteration
00278   virtual void abort()                          { _aborting = true; }
00279   virtual void un_abort()                       { _aborting = false; }
00280 
00281   friend class MethodIterator;
00282 
00283  public:
00284   int       bci() const                         { return _bci;      }
00285   int       next_bci() const                    { return _next_bci; }
00286   methodOop method() const                      { return _method;   }
00287   bool      aborting() const                    { return _aborting; }// was iteration aborted?  (dead code)
00288 
00289   // The following function are called when an inlined structure
00290   // is recognized. It is the functions responsibility to iterate
00291   // over the structures byte codes.
00292   virtual void if_node(IfNode* node)                            = 0; // inlined if message send
00293   virtual void cond_node(CondNode* node)                        = 0; // inlined or/and message send
00294   virtual void while_node(WhileNode* node)                      = 0; // inlined while message send
00295   virtual void primitive_call_node(PrimitiveCallNode* node)     = 0; // primitive call with inlined failure block
00296   virtual void dll_call_node(DLLCallNode* node)                 = 0; // dll call 
00297 
00298   // primitive failure block recognition (for inlining policy of compiler)
00299   virtual bool in_prim_failure_block() const    { return _in_prim_failure; }
00300   virtual void set_prim_failure(bool f)         { _in_prim_failure = f; }
00301 
00302  public:
00303   // Specifies the number of additional temporaries that are allocated on the stack
00304   // and initialized. Note: One temporary is always there and initialized (temp0).
00305   virtual void allocate_temporaries(int nofTemps)               = 0;
00306 
00307   // Push a value on the stack.
00308   virtual void push_self()                                      = 0;
00309   virtual void push_tos()                                       = 0;
00310   virtual void push_literal(oop obj)                            = 0;
00311 
00312   // Argument numbers are 0, 1, ... starting with the first argument (0).
00313   // Temporary numbers are 0, 1, ... starting with the first temporary (0).
00314   // Contexts are numbered 0, 1, ... starting with the context held in the
00315   // current frame (i.e., in temp0). Context i+1 is the context reached by
00316   // dereferencing the home field of context i. Globals are held in the value
00317   // field of an association (obj).
00318   virtual void push_argument(int no)                            = 0;
00319   virtual void push_temporary(int no)                           = 0;
00320   virtual void push_temporary(int no, int context)              = 0;
00321 
00322   virtual void push_instVar(int offset)                         = 0;
00323   virtual void push_instVar_name(symbolOop name)                = 0;
00324 
00325   virtual void push_classVar(associationOop assoc)              = 0;
00326   virtual void push_classVar_name(symbolOop name)               = 0;
00327 
00328   virtual void push_global(associationOop obj)                  = 0;
00329 
00330   virtual void store_temporary(int no)                          = 0;
00331   virtual void store_temporary(int no, int context)             = 0;
00332 
00333   virtual void store_instVar(int offset)                        = 0;
00334   virtual void store_instVar_name(symbolOop name)               = 0;
00335 
00336   virtual void store_classVar(associationOop assoc)             = 0;
00337   virtual void store_classVar_name(symbolOop name)              = 0;
00338 
00339   virtual void store_global(associationOop obj)                 = 0;
00340 
00341   virtual void pop()                                            = 0;
00342 
00343   // The receiver and arguments are pushed prior to a normal send. Only the
00344   // arguments are pushed for self and super sends (the receiver is self).
00345   virtual void normal_send(InterpretedIC* ic)                   = 0;
00346   virtual void self_send  (InterpretedIC* ic)                   = 0;
00347   virtual void super_send (InterpretedIC* ic)                   = 0;
00348 
00349   // Hardwired sends
00350   virtual void double_equal()                                   = 0;
00351   virtual void double_not_equal()                               = 0;
00352 
00353   // nofArgs is the number of arguments to be popped before returning (callee popped arguments).
00354   virtual void method_return(int nofArgs)                       = 0;
00355   virtual void nonlocal_return(int nofArgs)                     = 0;
00356 
00357   virtual void allocate_closure(AllocationType type, int nofArgs, methodOop meth) = 0;
00358   virtual void allocate_context(int nofTemps, bool forMethod)   = 0;
00359 
00360   // fp->recv = fp->context->bottom()->recv
00361   virtual void set_self_via_context()                           = 0;
00362   virtual void copy_self_into_context()                         = 0;
00363   virtual void copy_argument_into_context(int argNo, int no)    = 0;
00364 
00365   // fp->context->home
00366   virtual void zap_scope()                                      = 0;
00367 
00368   // indicates the method is a pure primitive call
00369   virtual void predict_prim_call(primitive_desc* pdesc, int failure_start) = 0;
00370 
00371   // floating-point operations
00372   virtual void float_allocate(int nofFloatTemps, int nofFloatExprs) = 0;
00373   virtual void float_floatify(Floats::Function f, int fno)      = 0;
00374   virtual void float_move(int fno, int from)                    = 0;
00375   virtual void float_set(int fno, doubleOop value)              = 0;
00376   virtual void float_nullary(Floats::Function f, int fno)       = 0;
00377   virtual void float_unary(Floats::Function f, int fno)         = 0;
00378   virtual void float_binary(Floats::Function f, int fno)        = 0;
00379   virtual void float_unaryToOop(Floats::Function f, int fno)    = 0;
00380   virtual void float_binaryToOop(Floats::Function f, int fno)   = 0;
00381 };
00382 
00383 class CustomizedMethodClosure : public MethodClosure {
00384  public:
00385   // virtuals from MethodClosure
00386   void push_instVar_name(symbolOop name);
00387   void store_instVar_name(symbolOop name);
00388 
00389   void push_classVar_name(symbolOop name);
00390   void push_classVar(associationOop assoc);
00391 
00392   void store_classVar_name(symbolOop name);
00393   void store_classVar(associationOop assoc);
00394 };
00395 
00396 // A SpecializedMethodClosure is a MethodClosure that provides default implementations for
00397 // all inlined structures as well as empty implementations for methods corresponding to
00398 // individual bytecodes. A SpecializedMethodClosure should be used when only a few methods
00399 // need to be specialized.
00400 class SpecializedMethodClosure: public CustomizedMethodClosure {
00401  public:
00402   virtual void if_node(IfNode* node);
00403   virtual void cond_node(CondNode* node);
00404   virtual void while_node(WhileNode* node);
00405   virtual void primitive_call_node(PrimitiveCallNode* node);
00406   virtual void dll_call_node(DLLCallNode* node);
00407 
00408  public:
00409   // Customize this method to get uniform behavior for all instructions.
00410   virtual void instruction()                                                            {}
00411 
00412  public:
00413   virtual void allocate_temporaries(int nofTemps)                                       { instruction(); }
00414   virtual void push_self()                                                              { instruction(); }
00415   virtual void push_tos()                                                               { instruction(); }
00416   virtual void push_literal(oop obj)                                                    { instruction(); }
00417   virtual void push_argument(int no)                                                    { instruction(); }
00418   virtual void push_temporary(int no)                                                   { instruction(); }
00419   virtual void push_temporary(int no, int context)                                      { instruction(); }
00420   virtual void push_instVar(int offset)                                                 { instruction(); }
00421   virtual void push_global(associationOop obj)                                          { instruction(); }
00422   virtual void store_temporary(int no)                                                  { instruction(); }
00423   virtual void store_temporary(int no, int context)                                     { instruction(); }
00424   virtual void store_instVar(int offset)                                                { instruction(); }
00425   virtual void store_global(associationOop obj)                                         { instruction(); }
00426   virtual void pop()                                                                    { instruction(); }
00427   virtual void normal_send(InterpretedIC* ic)                                           { instruction(); }
00428   virtual void self_send  (InterpretedIC* ic)                                           { instruction(); }
00429   virtual void super_send (InterpretedIC* ic)                                           { instruction(); }
00430   virtual void double_equal()                                                           { instruction(); }
00431   virtual void double_not_equal()                                                       { instruction(); }
00432   virtual void method_return(int nofArgs)                                               { instruction(); }
00433   virtual void nonlocal_return(int nofArgs)                                             { instruction(); }
00434   virtual void allocate_closure(AllocationType type, int nofArgs, methodOop meth)       { instruction(); }
00435   virtual void allocate_context(int nofTemps, bool forMethod)                           { instruction(); }
00436   virtual void set_self_via_context()                                                   { instruction(); }
00437   virtual void copy_self_into_context()                                                 { instruction(); }
00438   virtual void copy_argument_into_context(int argNo, int no)                            { instruction(); }
00439   virtual void zap_scope()                                                              { instruction(); }
00440   virtual void predict_prim_call(primitive_desc* pdesc, int failure_start)              { instruction(); }
00441   virtual void float_allocate(int nofFloatTemps, int nofFloatExprs)                     { instruction(); }
00442   virtual void float_floatify(Floats::Function f, int fno)                              { instruction(); }
00443   virtual void float_move(int fno, int from)                                            { instruction(); }
00444   virtual void float_set(int fno, doubleOop value)                                      { instruction(); }
00445   virtual void float_nullary(Floats::Function f, int fno)                               { instruction(); }
00446   virtual void float_unary(Floats::Function f, int fno)                                 { instruction(); }
00447   virtual void float_binary(Floats::Function f, int fno)                                { instruction(); }
00448   virtual void float_unaryToOop(Floats::Function f, int fno)                            { instruction(); }
00449   virtual void float_binaryToOop(Floats::Function f, int fno)                           { instruction(); }
00450 };
00451 
00452 
00453 // factory to parameterize construction of nodes
00454 class AbstractMethodIntervalFactory : StackObj {
00455  public:
00456   virtual MethodInterval*    new_MethodInterval(methodOop method, MethodInterval* parent) = 0;
00457   virtual MethodInterval*    new_MethodInterval(methodOop method, MethodInterval* parent, 
00458                                                 int begin_bci, int end_bci = -1, bool failureBlock = false) = 0;
00459   virtual AndNode*           new_AndNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset) = 0;
00460   virtual OrNode*            new_OrNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset) = 0;
00461   virtual WhileNode*         new_WhileNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int cond_offset, int end_offset) = 0;
00462   virtual IfNode*            new_IfNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool cond, int else_offset, u_char structure) = 0;
00463   virtual PrimitiveCallNode* new_PrimitiveCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool has_receiver, symbolOop name, primitive_desc* pdesc) = 0;
00464   virtual PrimitiveCallNode* new_PrimitiveCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool has_receiver, symbolOop name, primitive_desc* pdesc, int end_offset) = 0;
00465   virtual DLLCallNode*       new_DLLCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, InterpretedDLL_Cache* cache) = 0;
00466 };
00467 
00468 // default factory (used by everyone except the compiler)
00469 class MethodIntervalFactory : public AbstractMethodIntervalFactory {
00470  public:
00471   MethodInterval*    new_MethodInterval(methodOop method, MethodInterval* parent);
00472   MethodInterval*    new_MethodInterval(methodOop method, MethodInterval* parent, 
00473                                         int begin_bci, int end_bci = -1, bool failureBlock = false);
00474   AndNode*           new_AndNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset);
00475   OrNode*            new_OrNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset);
00476   WhileNode*         new_WhileNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int cond_offset, int end_offset);
00477   IfNode*            new_IfNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool cond, int else_offset, u_char structure);
00478   PrimitiveCallNode* new_PrimitiveCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool has_receiver, symbolOop name, primitive_desc* pdesc);
00479   PrimitiveCallNode* new_PrimitiveCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool has_receiver, symbolOop name, primitive_desc* pdesc, int end_offset);
00480   DLLCallNode*       new_DLLCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, InterpretedDLL_Cache* cache);
00481 };
00482 
00483 // A MethodIterator iterates over a MethodInterval and dispatches calls to the provided MethodClosure
00484 class MethodIterator: StackObj {
00485  private:
00486   void dispatch(MethodClosure* blk);
00487   void unknown_code(u_char code);
00488   void should_never_encounter(u_char code);
00489   MethodInterval* _interval;
00490   static MethodIntervalFactory defaultFactory;      // default factory
00491  public:
00492   static AbstractMethodIntervalFactory* factory;      // used to build nodes
00493 
00494   MethodIterator(methodOop m, MethodClosure* blk, AbstractMethodIntervalFactory* f = &defaultFactory);
00495   MethodIterator(MethodInterval* interval, MethodClosure* blk, AbstractMethodIntervalFactory* f = &defaultFactory);
00496   MethodInterval* interval() const { return _interval; }
00497 };

Generated on Mon Oct 9 13:37:15 2006 for Strongtalk VM by  doxygen 1.4.7