00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 # include "incls/_precompiled.incl"
00025 # include "incls/_methodIterator.cpp.incl"
00026 
00027 
00028 
00029 
00030 MethodInterval::MethodInterval(methodOop method, MethodInterval* parent) {
00031   initialize(method, parent, 1, method->end_bci(), false);
00032 }
00033 
00034 MethodInterval::MethodInterval(methodOop method, MethodInterval* parent, int begin_bci, int end_bci, bool failBlock) {
00035   initialize(method, parent, begin_bci, end_bci, failBlock);
00036 }
00037 
00038 void MethodInterval::initialize(methodOop method, MethodInterval* parent, int begin_bci, int end_bci, bool failBlock) {
00039   _method    = method;
00040   _parent    = parent;
00041   _begin_bci = begin_bci;
00042   _end_bci   = end_bci;
00043   _in_prim_failure = failBlock;
00044 #ifdef DELTA_COMPILER
00045   _info = NULL;
00046 #endif
00047 }
00048 
00049 
00050 
00051 
00052 InlineSendNode::InlineSendNode(methodOop method, MethodInterval* parent, int begin_bci, int end_bci)
00053  : MethodInterval(method, parent, begin_bci, end_bci) {}
00054 
00055 
00056 
00057 
00058 CondNode::CondNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset)
00059  : InlineSendNode(method, parent, begin_bci, next_bci + dest_offset) {
00060   _expr_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci, end_bci());
00061 }
00062 
00063 
00064 
00065 
00066 AndNode::AndNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset)
00067  : CondNode(method, parent, begin_bci, next_bci, dest_offset) {}
00068 
00069 symbolOop AndNode::selector() const {
00070   return vmSymbols::and_();
00071 }
00072 
00073 
00074 
00075 
00076 OrNode::OrNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int dest_offset)
00077  : CondNode(method, parent, begin_bci, next_bci, dest_offset) {}
00078 
00079 symbolOop OrNode::selector() const {
00080   return vmSymbols::or_();
00081 }
00082 
00083 
00084 
00085 
00086 WhileNode::WhileNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int cond_offset, 
00087                      int end_offset)
00088  : InlineSendNode(method, parent, begin_bci) {
00089 
00090   CodeIterator c(method, next_bci + cond_offset + end_offset);
00091   switch (c.code()) {
00092     case Bytecodes::whileTrue_byte: 
00093     case Bytecodes::whileTrue_word: 
00094         _cond = true;
00095         break;
00096     case Bytecodes::whileFalse_byte:
00097     case Bytecodes::whileFalse_word:
00098         _cond = false;
00099         break;
00100     default: fatal("expecting while jump");
00101   }
00102   int jump_end = c.next_bci();
00103 
00104   if (cond_offset == 0) {
00105     _body_code = NULL;
00106     _expr_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci, jump_end);
00107   } else {
00108     int cond_dest = next_bci + cond_offset;
00109     _body_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci, cond_dest);
00110     _expr_code = MethodIterator::factory->new_MethodInterval(method, this, cond_dest, jump_end);
00111   }
00112   set_end_bci(expr_code()->end_bci());
00113 }
00114 
00115 symbolOop WhileNode::selector() const {
00116   if (is_whileTrue()) return body_code() ? vmSymbols::while_true_()  : vmSymbols::while_true();
00117   else                return body_code() ? vmSymbols::while_false_() : vmSymbols::while_false();
00118 }
00119 
00120 
00121 
00122 
00123 IfNode::IfNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, bool cond, 
00124                int else_offset, u_char structure)
00125  : InlineSendNode(method, parent, begin_bci) {
00126   bool has_else_branch;
00127   int  else_jump_size;
00128   _cond                       = cond;
00129   _produces_result            = isSet(structure, 0);
00130   has_else_branch             = isSet(structure, 1);
00131   _ignore_else_while_printing = isSet(structure, 2);
00132   else_jump_size              = structure >> 4;
00133 
00134   if (has_else_branch) {
00135     int else_jump = next_bci + else_offset - else_jump_size;
00136     _then_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci, else_jump);
00137     CodeIterator c(method, else_jump);
00138     int end_offset;
00139     switch (c.code()) {
00140       case Bytecodes::jump_else_byte: end_offset = c.byte_at(1); break;
00141       case Bytecodes::jump_else_word: end_offset = c.word_at(1); break;
00142       default: fatal("expecting an else jump");
00143     }
00144     _else_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci + else_offset, 
00145                                                              next_bci + else_offset + end_offset);
00146     set_end_bci(else_code()->end_bci());
00147   } else {
00148     _then_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci, next_bci + else_offset);
00149     _else_code = NULL;
00150     set_end_bci(then_code()->end_bci());
00151   }
00152 }
00153 
00154 symbolOop IfNode::selector() const {
00155   if (is_ifTrue()) return else_code() ? vmSymbols::if_true_false() : vmSymbols::if_true();
00156   else             return else_code() ? vmSymbols::if_false_true() : vmSymbols::if_false();
00157 }
00158 
00159 
00160 
00161 
00162 ExternalCallNode::ExternalCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci) 
00163  : MethodInterval(method, parent, begin_bci, next_bci) {
00164   _failure_code = NULL;
00165 }
00166 
00167 ExternalCallNode::ExternalCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, int end_offset) 
00168  : MethodInterval(method, parent, begin_bci, next_bci + end_offset) {
00169   assert(end_offset > 0, "wrong offset");
00170   _failure_code = MethodIterator::factory->new_MethodInterval(method, this, next_bci, end_bci(), true);
00171 }
00172 
00173 
00174 
00175 
00176 PrimitiveCallNode::PrimitiveCallNode(methodOop       method, 
00177                                      MethodInterval* parent,
00178                                      int             begin_bci,
00179                                      int             next_bci,
00180                                      bool            has_receiver,
00181                                      symbolOop       name,
00182                                      primitive_desc* pdesc) 
00183  : ExternalCallNode(method, parent, begin_bci, next_bci) {
00184   assert( (name == NULL) != (pdesc == NULL), "we need one an only one kind");
00185   _has_receiver = has_receiver;
00186   _name  = (name  == NULL) ? pdesc->selector()        : name;
00187   _pdesc = (pdesc == NULL) ? primitives::lookup(name) : pdesc;
00188 }
00189 
00190 
00191 
00192 PrimitiveCallNode::PrimitiveCallNode(methodOop       method, 
00193                                      MethodInterval* parent,
00194                                      int             begin_bci,
00195                                      int             next_bci,
00196                                      bool            has_receiver,
00197                                      symbolOop       name,
00198                                      primitive_desc* pdesc,
00199                                      int             end_offset)
00200  : ExternalCallNode(method, parent, begin_bci, next_bci, end_offset) {
00201   assert( (name == NULL) != (pdesc == NULL), "we need one an only one kind");
00202   _has_receiver = has_receiver;
00203   _name  = (name  == NULL) ? pdesc->selector()        : name;
00204   _pdesc = (pdesc == NULL) ? primitives::lookup(name) : pdesc;
00205 }
00206 
00207 int PrimitiveCallNode::number_of_parameters() const {
00208   int result = name()->number_of_arguments()
00209              + (has_receiver() ? 1 : 0)
00210              - (failure_code() ? 1 : 0);
00211   assert(_pdesc == NULL || pdesc()->number_of_parameters() == result, "checking result");
00212   return result;
00213 }
00214 
00215 void DLLCallNode::initialize(InterpretedDLL_Cache* cache) {
00216   _dll_name      = cache->dll_name();
00217   _function_name = cache->funct_name();
00218   _nofArgs       = cache->number_of_arguments();
00219   _function      = cache->entry_point();
00220   _async         = cache->async();
00221 }
00222 
00223 DLLCallNode::DLLCallNode(methodOop method, MethodInterval* parent, int begin_bci, int next_bci, 
00224                          InterpretedDLL_Cache* cache)
00225  : ExternalCallNode(method, parent, begin_bci, next_bci) {
00226   initialize(cache);
00227 }
00228 
00229 
00230 
00231 
00232 MethodClosure::MethodClosure() {
00233   _method = NULL;
00234   _bci = _next_bci = PrologueBCI;
00235   _aborting = false;
00236   _in_prim_failure = false;
00237   _float0_index = 0;
00238 }
00239 
00240 void MethodClosure::set_method(methodOop method) {
00241   _method = method;
00242   assert(method->number_of_stack_temporaries() % 2 == 0 || !method->has_float_temporaries(), "inconsistency");
00243   _float0_index = 256 - method->number_of_stack_temporaries()/2;
00244 }
00245 
00246 int MethodClosure::float_at(int index) {
00247   int fno = _float0_index - index;
00248   assert(0 <= fno && fno < _method->total_number_of_floats(), "illegal float number");
00249   return fno;
00250 }
00251 
00252 
00253 
00254 void CustomizedMethodClosure::push_instVar_name(symbolOop name) {
00255   fatal("instance variable not resolved");
00256 }
00257 
00258 void CustomizedMethodClosure::store_instVar_name(symbolOop name) {
00259   fatal("instance variable not resolved");
00260 }
00261 
00262 void CustomizedMethodClosure::push_classVar_name(symbolOop name) {
00263   fatal("class variable not resolved");
00264 }
00265 
00266 
00267 void CustomizedMethodClosure::store_classVar_name(symbolOop name) {
00268   fatal("class variable not resolved");
00269 }
00270 
00271 void CustomizedMethodClosure::push_classVar(associationOop assoc) {
00272   push_global(assoc);
00273 }
00274 
00275 void CustomizedMethodClosure::store_classVar(associationOop assoc) {
00276   store_global(assoc);
00277 }
00278 
00279 
00280 
00281 void SpecializedMethodClosure::if_node(IfNode* node) {
00282   MethodIterator iter(node->then_code(), this);
00283   if (node->else_code() != NULL) {
00284     MethodIterator iter(node->else_code(), this);
00285   }
00286 }
00287 
00288 void SpecializedMethodClosure::cond_node(CondNode* node) {
00289   MethodIterator iter(node->expr_code(), this);
00290 }
00291 
00292 void SpecializedMethodClosure::while_node(WhileNode* node) {
00293   MethodIterator iter(node->expr_code(), this);
00294   if (node->body_code() != NULL) {
00295     MethodIterator iter(node->body_code(), this);
00296   }
00297 }
00298 
00299 void SpecializedMethodClosure::primitive_call_node(PrimitiveCallNode* node) {
00300   if (node->failure_code() != NULL) {
00301     MethodIterator iter(node->failure_code(), this);
00302   }
00303 }
00304 
00305 void SpecializedMethodClosure::dll_call_node(DLLCallNode* node) {
00306   if (node->failure_code() != NULL) {
00307     MethodIterator iter(node->failure_code(), this);
00308   }
00309 }
00310 
00311 
00312 
00313 void MethodIterator::unknown_code(u_char code) {
00314   std->print_cr("Unknown code found 0x%x", code);
00315   fatal("aborting");
00316 }
00317 
00318 void MethodIterator::should_never_encounter(u_char code) {
00319   std->print_cr("Should never iterate through code 0x%x", code);
00320   fatal("aborting");
00321 }
00322 
00323 static inline u_char map0to256(u_char ch) { return ch ? ch : 256; }
00324 
00325 void MethodIterator::dispatch(MethodClosure* blk) {
00326   bool oldFailState = blk->in_prim_failure_block();
00327   blk->set_prim_failure(_interval->in_prim_failure_block());
00328   CodeIterator iter(_interval->method(), _interval->begin_bci());
00329   int lastArgNo = _interval->method()->number_of_arguments() - 1;
00330   blk->set_method(_interval->method());
00331   int next_bci = _interval->begin_bci();
00332 
00333   while (next_bci < _interval->end_bci() && !blk->aborting()) {
00334     iter.set_bci(next_bci);
00335     blk->set_bci(iter.bci());
00336 
00337     next_bci = iter.next_bci();
00338     blk->set_next_bci(next_bci);
00339 
00340     switch(iter.code()) {
00341       case Bytecodes::push_temp_0:
00342               blk->push_temporary(0);
00343               break;
00344       case Bytecodes::push_temp_1:
00345               blk->push_temporary(1);
00346               break;
00347       case Bytecodes::push_temp_2:
00348               blk->push_temporary(2);
00349               break;
00350       case Bytecodes::push_temp_3:
00351               blk->push_temporary(3);
00352               break;
00353       case Bytecodes::push_temp_4:
00354               blk->push_temporary(4);
00355               break;
00356       case Bytecodes::push_temp_5:
00357               blk->push_temporary(5);
00358               break;
00359       case Bytecodes::unimplemented_06:
00360               unknown_code(Bytecodes::unimplemented_06);
00361               break;
00362       case Bytecodes::push_temp_n:
00363               blk->push_temporary(255 - iter.byte_at(1));
00364               break;
00365       case Bytecodes::push_arg_1:
00366               blk->push_argument(lastArgNo);
00367               break;
00368       case Bytecodes::push_arg_2:
00369               blk->push_argument(lastArgNo - 1);
00370               break;
00371       case Bytecodes::push_arg_3:
00372               blk->push_argument(lastArgNo - 2);
00373               break;
00374       case Bytecodes::push_arg_n:
00375               blk->push_argument(lastArgNo - iter.byte_at(1));
00376               break;
00377       case Bytecodes::allocate_temp_1:
00378               blk->allocate_temporaries(1);
00379               break;
00380       case Bytecodes::allocate_temp_2:
00381               blk->allocate_temporaries(2);
00382               break;
00383       case Bytecodes::allocate_temp_3:
00384               blk->allocate_temporaries(3);
00385               break;
00386       case Bytecodes::allocate_temp_n:
00387               blk->allocate_temporaries(map0to256(iter.byte_at(1)));
00388               break;
00389       case Bytecodes::store_temp_0_pop:
00390               blk->store_temporary(0);
00391               blk->pop();
00392               break;
00393       case Bytecodes::store_temp_1_pop:
00394               blk->store_temporary(1);
00395               blk->pop();
00396               break;
00397       case Bytecodes::store_temp_2_pop:
00398               blk->store_temporary(2);
00399               blk->pop();
00400               break;
00401       case Bytecodes::store_temp_3_pop:
00402               blk->store_temporary(3);
00403               blk->pop();
00404               break;
00405       case Bytecodes::store_temp_4_pop:
00406               blk->store_temporary(4);
00407               blk->pop();
00408               break;
00409       case Bytecodes::store_temp_5_pop:
00410               blk->store_temporary(5);
00411               blk->pop();
00412               break;
00413       case Bytecodes::store_temp_n:
00414               blk->store_temporary(255 - iter.byte_at(1));
00415               break;
00416       case Bytecodes::store_temp_n_pop:
00417               blk->store_temporary(255 - iter.byte_at(1));
00418               blk->pop();
00419               break;
00420       case Bytecodes::push_neg_n:
00421               blk->push_literal(as_smiOop(-(int) iter.byte_at(1)));
00422               break;
00423       case Bytecodes::push_succ_n:
00424               blk->push_literal(as_smiOop(iter.byte_at(1)+1));
00425               break;
00426       case Bytecodes::push_literal:
00427               blk->push_literal(iter.oop_at(1));
00428               break;
00429       case Bytecodes::push_tos:
00430               blk->push_tos();
00431               break;
00432       case Bytecodes::push_self:
00433               blk->push_self();
00434               break;
00435       case Bytecodes::push_nil:
00436               blk->push_literal(nilObj);
00437               break;
00438       case Bytecodes::push_true:
00439               blk->push_literal(trueObj);
00440               break;
00441       case Bytecodes::push_false:
00442               blk->push_literal(falseObj);
00443               break;
00444       case Bytecodes::unimplemented_20:
00445               unknown_code(Bytecodes::unimplemented_20);
00446               break;
00447       case Bytecodes::unimplemented_21:
00448               unknown_code(Bytecodes::unimplemented_21);
00449               break;
00450       case Bytecodes::unimplemented_22:
00451               unknown_code(Bytecodes::unimplemented_22);
00452               break;
00453       case Bytecodes::unimplemented_23:
00454               unknown_code(Bytecodes::unimplemented_23);
00455               break;
00456       case Bytecodes::unimplemented_24:
00457               unknown_code(Bytecodes::unimplemented_24);
00458               break;
00459       case Bytecodes::unimplemented_25:
00460               unknown_code(Bytecodes::unimplemented_25);
00461               break;
00462       case Bytecodes::unimplemented_26:
00463               unknown_code(Bytecodes::unimplemented_26);
00464               break;
00465       case Bytecodes::unimplemented_27:
00466               unknown_code(Bytecodes::unimplemented_27);
00467               break;
00468       case Bytecodes::return_instVar_name: {
00469                 symbolOop name = symbolOop(iter.oop_at(1));
00470                 assert(name->is_symbol(), "must be symbol");
00471                 blk->push_instVar_name(name);
00472                 blk->method_return(0); 
00473               }
00474               break;
00475       case Bytecodes::push_classVar: {
00476                 associationOop assoc = associationOop(iter.oop_at(1));
00477                 assert(assoc->is_association(), "must be association");
00478                 blk->push_classVar(assoc); 
00479               }
00480               break;
00481       case Bytecodes::store_classVar_pop: {
00482                 associationOop assoc = associationOop(iter.oop_at(1));
00483                 assert(assoc->is_association(), "must be association");
00484                 blk->store_classVar(assoc);
00485                 blk->pop(); 
00486               }
00487               break;
00488       case Bytecodes::store_classVar: {
00489                 associationOop assoc = associationOop(iter.oop_at(1));
00490                 assert(assoc->is_association(), "must be association");
00491                 blk->store_classVar(assoc);
00492               }
00493               break;
00494       case Bytecodes::return_instVar: {
00495                 smiOop offset = smiOop(iter.oop_at(1));
00496                 assert(offset->is_smi(), "must be smi");
00497                 blk->push_instVar(offset->value());
00498                 blk->method_return(0); 
00499               }
00500               break;
00501       case Bytecodes::push_instVar: {
00502                 smiOop offset = smiOop(iter.oop_at(1));
00503                 assert(offset->is_smi(), "must be smi");
00504                 blk->push_instVar(offset->value());
00505               }
00506               break;
00507       case Bytecodes::store_instVar_pop: {
00508                 smiOop offset = smiOop(iter.oop_at(1));
00509                 assert(offset->is_smi(), "must be smi");
00510                 blk->store_instVar(offset->value());
00511                 blk->pop();
00512               }
00513               break;
00514       case Bytecodes::store_instVar:{
00515                 smiOop offset = smiOop(iter.oop_at(1));
00516                 assert(offset->is_smi(), "must be smi");
00517                 blk->store_instVar(offset->value());
00518               }
00519               break;
00520       case Bytecodes::float_allocate:
00521               blk->allocate_temporaries(1 + iter.byte_at(1)*2);
00522               blk->float_allocate(iter.byte_at(2), iter.byte_at(3));
00523               break;
00524       case Bytecodes::float_floatify_pop:
00525               blk->float_floatify(Floats::floatify, blk->float_at(iter.byte_at(1)));
00526               break;
00527       case Bytecodes::float_move:
00528               blk->float_move(blk->float_at(iter.byte_at(1)), blk->float_at(iter.byte_at(2)));
00529               break;
00530       case Bytecodes::float_set:
00531               blk->float_set(blk->float_at(iter.byte_at(1)), *(doubleOop*)iter.aligned_oop(2));
00532               break;
00533       case Bytecodes::float_nullary_op:
00534               blk->float_nullary(Floats::Function(iter.byte_at(2)), blk->float_at(iter.byte_at(1)));
00535               break;
00536       case Bytecodes::float_unary_op:
00537               blk->float_unary(Floats::Function(iter.byte_at(2)), blk->float_at(iter.byte_at(1)));
00538               break;
00539       case Bytecodes::float_binary_op:
00540               blk->float_binary(Floats::Function(iter.byte_at(2)), blk->float_at(iter.byte_at(1)));
00541               break;
00542       case Bytecodes::float_unary_op_to_oop:
00543               blk->float_unaryToOop(Floats::Function(iter.byte_at(2)), blk->float_at(iter.byte_at(1)));
00544               break;
00545       case Bytecodes::float_binary_op_to_oop:
00546               blk->float_binaryToOop(Floats::Function(iter.byte_at(2)), blk->float_at(iter.byte_at(1)));
00547               break;
00548       case Bytecodes::unimplemented_39:
00549               unknown_code(Bytecodes::unimplemented_39);
00550               break;
00551       case Bytecodes::unimplemented_3a:
00552               unknown_code(Bytecodes::unimplemented_3a);
00553               break;
00554       case Bytecodes::unimplemented_3b:
00555               unknown_code(Bytecodes::unimplemented_3b); 
00556               break;
00557       case Bytecodes::unimplemented_3c:
00558               unknown_code(Bytecodes::unimplemented_3c); 
00559               break;
00560       case Bytecodes::push_instVar_name: {
00561                 symbolOop name = symbolOop(iter.oop_at(1));
00562                 assert(name->is_symbol(), "must be symbol");
00563                 blk->push_instVar_name(name);
00564               }
00565               break;
00566       case Bytecodes::store_instVar_pop_name:  {
00567                 symbolOop name = symbolOop(iter.oop_at(1));
00568                 assert(name->is_symbol(), "must be symbol");
00569                 blk->store_instVar_name(name);
00570                 blk->pop();
00571               }
00572               break;
00573       case Bytecodes::store_instVar_name:  {
00574                 symbolOop name = symbolOop(iter.oop_at(1));
00575                 assert(name->is_symbol(), "must be symbol");
00576                 blk->store_instVar_name(name);
00577               }
00578               break;
00579       case Bytecodes::push_temp_0_context_0:
00580               blk->push_temporary(0, 0);
00581               break;
00582       case Bytecodes::push_temp_1_context_0:
00583               blk->push_temporary(1, 0);
00584               break;
00585       case Bytecodes::push_temp_2_context_0:
00586               blk->push_temporary(2, 0);
00587               break;
00588       case Bytecodes::push_temp_n_context_0:
00589               blk->push_temporary(iter.byte_at(1), 0);
00590               break;
00591       case Bytecodes::store_temp_0_context_0_pop:
00592               blk->store_temporary(0, 0);
00593               blk->pop();
00594               break;
00595       case Bytecodes::store_temp_1_context_0_pop:
00596               blk->store_temporary(1, 0);
00597               blk->pop();
00598               break;
00599       case Bytecodes::store_temp_2_context_0_pop: 
00600               blk->store_temporary(2, 0);
00601               blk->pop();
00602               break;
00603       case Bytecodes::store_temp_n_context_0_pop:
00604               blk->store_temporary(iter.byte_at(1), 0);
00605               blk->pop();
00606               break;
00607       case Bytecodes::push_new_closure_context_0:
00608               blk->allocate_closure(context_as_scope, 0, methodOop(iter.oop_at(1)));
00609               break;
00610       case Bytecodes::push_new_closure_context_1:
00611               blk->allocate_closure(context_as_scope, 1, methodOop(iter.oop_at(1)));
00612               break;
00613       case Bytecodes::push_new_closure_context_2:
00614               blk->allocate_closure(context_as_scope, 2, methodOop(iter.oop_at(1)));
00615               break;
00616       case Bytecodes::push_new_closure_context_n:
00617               blk->allocate_closure(context_as_scope, iter.byte_at(1), methodOop(iter.oop_at(2)));
00618               break;
00619       case Bytecodes::install_new_context_method_0:
00620               blk->allocate_context(0, true);
00621               break;
00622       case Bytecodes::install_new_context_method_1:
00623               blk->allocate_context(1, true);
00624               break;
00625      case Bytecodes::install_new_context_method_2:
00626               blk->allocate_context(2, true);
00627               break;
00628       case Bytecodes::install_new_context_method_n:
00629               blk->allocate_context(iter.byte_at(1), true);
00630               break;
00631       case Bytecodes::push_temp_0_context_1:
00632               blk->push_temporary(0, 1);
00633               break;
00634       case Bytecodes::push_temp_1_context_1:
00635               blk->push_temporary(1, 1);
00636               break;
00637       case Bytecodes::push_temp_2_context_1:
00638               blk->push_temporary(2, 1);
00639               break;
00640       case Bytecodes::push_temp_n_context_1:
00641               blk->push_temporary(iter.byte_at(1), 1);
00642               break;
00643       case Bytecodes::store_temp_0_context_1_pop:
00644               blk->store_temporary(0, 1);
00645               blk->pop();
00646               break;
00647       case Bytecodes::store_temp_1_context_1_pop:
00648               blk->store_temporary(1, 1);
00649               blk->pop();
00650               break;
00651       case Bytecodes::store_temp_2_context_1_pop:
00652               blk->store_temporary(2, 1);
00653               blk->pop();
00654               break;
00655       case Bytecodes::store_temp_n_context_1_pop:
00656               blk->store_temporary(iter.byte_at(1), 1);
00657               blk->pop();
00658               break;
00659       case Bytecodes::push_new_closure_tos_0:
00660               blk->allocate_closure(tos_as_scope, 0, methodOop(iter.oop_at(1)));
00661               break;
00662       case Bytecodes::push_new_closure_tos_1:
00663               blk->allocate_closure(tos_as_scope, 1, methodOop(iter.oop_at(1)));
00664               break;
00665       case Bytecodes::push_new_closure_tos_2:
00666               blk->allocate_closure(tos_as_scope, 2, methodOop(iter.oop_at(1)));
00667               break;
00668       case Bytecodes::push_new_closure_tos_n:
00669               blk->allocate_closure(tos_as_scope, iter.byte_at(1), methodOop(iter.oop_at(2)));
00670               break;
00671       case Bytecodes::only_pop:
00672               blk->pop();
00673               break;
00674       case Bytecodes::install_new_context_block_1:
00675               blk->allocate_context(1, false);
00676               break;
00677       case Bytecodes::install_new_context_block_2:
00678               blk->allocate_context(2, false);
00679               break;
00680       case Bytecodes::install_new_context_block_n:
00681               blk->allocate_context(iter.byte_at(1), false);
00682               break;
00683       case Bytecodes::push_temp_0_context_n:
00684               blk->push_temporary(0, iter.byte_at(1));
00685               break;
00686       case Bytecodes::push_temp_1_context_n:
00687               blk->push_temporary(1, iter.byte_at(1));
00688               break;
00689       case Bytecodes::push_temp_2_context_n:
00690               blk->push_temporary(2, iter.byte_at(1));
00691               break;
00692       case Bytecodes::push_temp_n_context_n:
00693               blk->push_temporary(iter.byte_at(1), map0to256(iter.byte_at(2)));
00694               break;
00695       case Bytecodes::store_temp_0_context_n_pop:
00696               blk->store_temporary(0, iter.byte_at(1));
00697               blk->pop();
00698               break;
00699       case Bytecodes::store_temp_1_context_n_pop:
00700               blk->store_temporary(1, iter.byte_at(1));
00701               blk->pop();
00702               break;
00703       case Bytecodes::store_temp_2_context_n_pop:
00704               blk->store_temporary(2, iter.byte_at(1));
00705               blk->pop();
00706               break;
00707       case Bytecodes::store_temp_n_context_n_pop:
00708               blk->store_temporary(iter.byte_at(1), map0to256(iter.byte_at(2)));
00709               blk->pop();
00710               break;
00711       case Bytecodes::set_self_via_context:
00712               blk->set_self_via_context();
00713               break;
00714       case Bytecodes::copy_1_into_context:
00715               blk->copy_argument_into_context(lastArgNo - iter.byte_at(1), 0);
00716               break;
00717       case Bytecodes::copy_2_into_context:
00718               blk->copy_argument_into_context(lastArgNo - iter.byte_at(1), 0); 
00719               blk->copy_argument_into_context(lastArgNo - iter.byte_at(2), 1);
00720               break;
00721       case Bytecodes::copy_n_into_context: {
00722               int len = map0to256(iter.byte_at(1));
00723               for (int i = 0; i < len; i++)
00724                 blk->copy_argument_into_context(lastArgNo - iter.byte_at(i + 2), i);
00725               break;
00726            }
00727       case Bytecodes::copy_self_into_context:
00728               blk->copy_self_into_context();
00729               break;
00730       case Bytecodes::copy_self_1_into_context:
00731               blk->copy_self_into_context(); 
00732               blk->copy_argument_into_context(lastArgNo - iter.byte_at(1), 1);
00733               break;
00734       case Bytecodes::copy_self_2_into_context:
00735               blk->copy_self_into_context();
00736               blk->copy_argument_into_context(lastArgNo - iter.byte_at(1), 1); 
00737               blk->copy_argument_into_context(lastArgNo - iter.byte_at(2), 2);
00738               break;
00739       case Bytecodes::copy_self_n_into_context: {
00740               blk->copy_self_into_context();
00741               int len = map0to256(iter.byte_at(1));
00742               for (int i = 0; i < len; i++)
00743                 blk->copy_argument_into_context(lastArgNo - iter.byte_at(i + 2), i+1);
00744               break;
00745            }
00746       case Bytecodes::ifTrue_byte: {
00747               IfNode* node = MethodIterator::factory->new_IfNode(
00748                 _interval->method(), _interval, iter.bci(), iter.next_bci(), true, iter.byte_at(2), iter.byte_at(1));
00749               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00750               blk->if_node(node);
00751               next_bci = node->end_bci();
00752               break;
00753            }
00754       case Bytecodes::ifFalse_byte: {
00755               IfNode* node = MethodIterator::factory->new_IfNode(
00756                 _interval->method(), _interval, iter.bci(), iter.next_bci(), false, iter.byte_at(2), iter.byte_at(1));
00757               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00758               blk->if_node(node);
00759               next_bci = node->end_bci();
00760               break;
00761            }
00762       case Bytecodes::and_byte: {
00763               AndNode* node = MethodIterator::factory->new_AndNode(
00764                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.byte_at(1));
00765               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00766               blk->cond_node(node);
00767               next_bci = node->end_bci();
00768               break;
00769            }
00770       case Bytecodes::or_byte: {
00771               OrNode* node = MethodIterator::factory->new_OrNode(
00772                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.byte_at(1));
00773               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00774               blk->cond_node(node);
00775               next_bci = node->end_bci();
00776               break;
00777            }
00778       case Bytecodes::whileTrue_byte:
00779               
00780               break;
00781       case Bytecodes::whileFalse_byte:
00782               
00783               break;
00784       case Bytecodes::jump_else_byte:
00785               should_never_encounter(Bytecodes::jump_else_byte);
00786               break;
00787       case Bytecodes::jump_loop_byte: {
00788               WhileNode* node = MethodIterator::factory->new_WhileNode(
00789                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.byte_at(2), iter.byte_at(1));
00790               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00791               blk->while_node(node);
00792               next_bci = node->end_bci();
00793               break;
00794            }
00795       case Bytecodes::ifTrue_word: {
00796               IfNode* node = MethodIterator::factory->new_IfNode(
00797                 _interval->method(), _interval, iter.bci(), iter.next_bci(), true, 
00798                 iter.word_at(2), iter.byte_at(1));
00799               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00800               blk->if_node(node);
00801               next_bci = node->end_bci();
00802               break;
00803            }
00804       case Bytecodes::ifFalse_word: {
00805               IfNode* node = MethodIterator::factory->new_IfNode(
00806                 _interval->method(), _interval, iter.bci(), iter.next_bci(), false, 
00807                 iter.word_at(2), iter.byte_at(1));
00808               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00809               blk->if_node(node);
00810               next_bci = node->end_bci();
00811               break;
00812            }
00813       case Bytecodes::and_word: {
00814               AndNode* node = MethodIterator::factory->new_AndNode(
00815                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.word_at(1));
00816               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00817               blk->cond_node(node);
00818               next_bci = node->end_bci();
00819               break;
00820            }
00821       case Bytecodes::or_word: {
00822               OrNode* node = MethodIterator::factory->new_OrNode(
00823                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.word_at(1));
00824               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00825               blk->cond_node(node);
00826               next_bci = node->end_bci();
00827               break;
00828            }
00829       case Bytecodes::whileTrue_word:
00830               
00831               break;
00832       case Bytecodes::whileFalse_word:
00833               
00834               break;
00835       case Bytecodes::jump_else_word:
00836               should_never_encounter(Bytecodes::jump_else_word);
00837               break;
00838       case Bytecodes::jump_loop_word: {
00839               WhileNode* node = MethodIterator::factory->new_WhileNode(
00840                 _interval->method(), _interval, iter.bci(), iter.next_bci(), 
00841                 iter.word_at(1 + oopSize), iter.word_at(1));
00842               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00843               blk->while_node(node);
00844               next_bci = node->end_bci();
00845               break;
00846            }
00847       case Bytecodes::interpreted_send_0:               
00848       case Bytecodes::interpreted_send_1:               
00849       case Bytecodes::interpreted_send_2:               
00850       case Bytecodes::interpreted_send_n:               
00851       case Bytecodes::compiled_send_0:                  
00852       case Bytecodes::compiled_send_1:                  
00853       case Bytecodes::compiled_send_2:                  
00854       case Bytecodes::compiled_send_n:                  
00855       case Bytecodes::primitive_send_0:                 
00856       case Bytecodes::primitive_send_1:                 
00857       case Bytecodes::primitive_send_2:                 
00858       case Bytecodes::primitive_send_n:                 
00859       case Bytecodes::polymorphic_send_0:               
00860       case Bytecodes::polymorphic_send_1:               
00861       case Bytecodes::polymorphic_send_2:               
00862       case Bytecodes::polymorphic_send_n:               
00863       case Bytecodes::megamorphic_send_0:               
00864       case Bytecodes::megamorphic_send_1:               
00865       case Bytecodes::megamorphic_send_2:               
00866       case Bytecodes::megamorphic_send_n:               
00867               blk->normal_send(iter.ic());
00868               break;
00869       case Bytecodes::interpreted_send_0_pop:           
00870       case Bytecodes::interpreted_send_1_pop:           
00871       case Bytecodes::interpreted_send_2_pop:           
00872       case Bytecodes::interpreted_send_n_pop:           
00873       case Bytecodes::compiled_send_0_pop:              
00874       case Bytecodes::compiled_send_1_pop:              
00875       case Bytecodes::compiled_send_2_pop:              
00876       case Bytecodes::compiled_send_n_pop:              
00877       case Bytecodes::primitive_send_0_pop:             
00878       case Bytecodes::primitive_send_1_pop:             
00879       case Bytecodes::primitive_send_2_pop:             
00880       case Bytecodes::primitive_send_n_pop:             
00881       case Bytecodes::polymorphic_send_0_pop:           
00882       case Bytecodes::polymorphic_send_1_pop:           
00883       case Bytecodes::polymorphic_send_2_pop:           
00884       case Bytecodes::polymorphic_send_n_pop:           
00885       case Bytecodes::megamorphic_send_0_pop:           
00886       case Bytecodes::megamorphic_send_1_pop:           
00887       case Bytecodes::megamorphic_send_2_pop:           
00888       case Bytecodes::megamorphic_send_n_pop:           
00889               blk->normal_send(iter.ic());
00890               blk->pop();
00891               break;
00892       case Bytecodes::interpreted_send_self:            
00893       case Bytecodes::compiled_send_self:               
00894       case Bytecodes::primitive_send_self:              
00895       case Bytecodes::polymorphic_send_self:            
00896       case Bytecodes::megamorphic_send_self:            
00897               blk->self_send(iter.ic());
00898               break;
00899       case Bytecodes::interpreted_send_self_pop:        
00900       case Bytecodes::compiled_send_self_pop:           
00901       case Bytecodes::primitive_send_self_pop:          
00902       case Bytecodes::polymorphic_send_self_pop:        
00903       case Bytecodes::megamorphic_send_self_pop:        
00904               blk->self_send(iter.ic());
00905               blk->pop();
00906               break;
00907       case Bytecodes::interpreted_send_super:           
00908       case Bytecodes::compiled_send_super:              
00909       case Bytecodes::primitive_send_super:             
00910       case Bytecodes::polymorphic_send_super:           
00911       case Bytecodes::megamorphic_send_super:           
00912               blk->super_send(iter.ic());
00913               break;
00914       case Bytecodes::interpreted_send_super_pop:       
00915       case Bytecodes::compiled_send_super_pop:          
00916       case Bytecodes::primitive_send_super_pop:         
00917       case Bytecodes::polymorphic_send_super_pop:       
00918       case Bytecodes::megamorphic_send_super_pop:       
00919               blk->super_send(iter.ic());
00920               blk->pop();
00921               break;
00922       case Bytecodes::return_tos_pop_0:
00923               blk->method_return(0);
00924               break;
00925       case Bytecodes::return_tos_pop_1:
00926               blk->method_return(1);
00927               break;
00928       case Bytecodes::return_tos_pop_2:
00929               blk->method_return(2);
00930               break;
00931       case Bytecodes::return_tos_pop_n:
00932               blk->method_return(iter.byte_at(1));
00933               break;
00934       case Bytecodes::return_self_pop_0:
00935               blk->push_self();
00936               blk->method_return(0);
00937               break;
00938       case Bytecodes::return_self_pop_1:
00939               blk->push_self();
00940               blk->method_return(1);
00941               break;
00942       case Bytecodes::return_self_pop_2:
00943               blk->push_self();
00944               blk->method_return(2);
00945               break;
00946       case Bytecodes::return_self_pop_n:
00947               blk->push_self();
00948               blk->method_return(iter.byte_at(1));
00949               break;
00950       case Bytecodes::return_tos_zap_pop_n:
00951               blk->zap_scope();
00952               blk->method_return(iter.byte_at(1));
00953               break;
00954       case Bytecodes::return_self_zap_pop_n:
00955               blk->zap_scope();
00956               blk->push_self();
00957               blk->method_return(iter.byte_at(1));
00958               break;
00959       case Bytecodes::non_local_return_tos_pop_n:
00960               blk->nonlocal_return(iter.byte_at(1));
00961               break;
00962       case Bytecodes::non_local_return_self_pop_n:
00963               blk->push_self();
00964               blk->nonlocal_return(iter.byte_at(1));
00965               break;
00966       case Bytecodes::prim_call: 
00967       case Bytecodes::prim_call_self: {
00968               primitive_desc* pdesc = primitives::lookup((fntype) iter.word_at(1));
00969               PrimitiveCallNode* node = 
00970                 MethodIterator::factory->new_PrimitiveCallNode(_interval->method(),
00971                                       _interval,
00972                                       iter.bci(),
00973                                       iter.next_bci(),
00974                                       pdesc->has_receiver(),
00975                                       NULL,
00976                                       pdesc);
00977               assert(pdesc->has_receiver() == (iter.code() == Bytecodes::prim_call_self), "just checking");
00978               assert(node->end_bci() <= _interval->end_bci(), "just checking");
00979               blk->primitive_call_node(node);
00980               next_bci = node->end_bci();
00981               break;
00982            }
00983       case Bytecodes::predict_prim_call:
00984               blk->predict_prim_call(primitives::lookup((fntype) iter.word_at(1)), -1);
00985               break;
00986       case Bytecodes::prim_call_failure: 
00987       case Bytecodes::prim_call_self_failure: {
00988               primitive_desc* pdesc = primitives::lookup((fntype) iter.word_at(1));
00989               PrimitiveCallNode* node = MethodIterator::factory->new_PrimitiveCallNode(
00990                   _interval->method(),
00991                   _interval,
00992                   iter.bci(), 
00993                   iter.next_bci(),
00994                   pdesc->has_receiver(),
00995                   NULL,
00996                   pdesc,
00997                   iter.word_at(1 + oopSize));
00998               assert(pdesc->has_receiver() == (iter.code() == Bytecodes::prim_call_self_failure), "just checking");
00999               assert(node->end_bci() <= _interval->end_bci(), "just checking");
01000               blk->primitive_call_node(node);
01001               next_bci = node->end_bci();
01002               break;
01003            }
01004       case Bytecodes::predict_prim_call_failure:
01005               blk->predict_prim_call(
01006                 primitives::lookup((fntype) iter.word_at(1)),
01007                 iter.next_bci() + iter.word_at(1 + oopSize));
01008               break;
01009       case Bytecodes::dll_call_sync: {
01010               DLLCallNode* node = MethodIterator::factory->new_DLLCallNode(
01011                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.dll_cache());
01012               assert(node->end_bci() <= _interval->end_bci(), "just checking");
01013               blk->dll_call_node(node);
01014               next_bci = node->end_bci();
01015               break;
01016            }
01017       case Bytecodes::access_send_self:
01018               blk->self_send(iter.ic());
01019               break;
01020       case Bytecodes::unimplemented_bc:
01021               unknown_code(Bytecodes::unimplemented_bc);
01022               break;
01023       case Bytecodes::prim_call_lookup: 
01024       case Bytecodes::prim_call_self_lookup: {
01025               symbolOop name = symbolOop(iter.oop_at(1));
01026               assert(name->is_symbol(), "name must be symbolOop");
01027               PrimitiveCallNode* node = 
01028                 MethodIterator::factory->new_PrimitiveCallNode(_interval->method(),
01029                                       _interval, 
01030                                       iter.bci(),
01031                                       iter.next_bci(),
01032                                       iter.code() == Bytecodes::prim_call_self_lookup,
01033                                       name,
01034                                       NULL);
01035               assert(node->end_bci() <= _interval->end_bci(), "just checking");
01036               blk->primitive_call_node(node);
01037               next_bci = node->end_bci();
01038               break;
01039            }
01040       case Bytecodes::predict_prim_call_lookup:
01041               blk->predict_prim_call(primitives::lookup(symbolOop(iter.word_at(1))), -1);
01042               break;
01043       case Bytecodes::prim_call_failure_lookup: 
01044       case Bytecodes::prim_call_self_failure_lookup: {
01045               symbolOop name = symbolOop(iter.oop_at(1));
01046               assert(name->is_symbol(), "name must be symbolOop");
01047               PrimitiveCallNode* node = MethodIterator::factory->new_PrimitiveCallNode(
01048                   _interval->method(),
01049                   _interval, 
01050                   iter.bci(), 
01051                   iter.next_bci(),
01052                   iter.code() == Bytecodes::prim_call_self_failure_lookup, 
01053                   name,
01054                   NULL,
01055                   iter.word_at(1 + oopSize));
01056               assert(node->end_bci() <= _interval->end_bci(), "just checking");
01057               blk->primitive_call_node(node);
01058               next_bci = node->end_bci();
01059               break;
01060            }
01061       case Bytecodes::predict_prim_call_failure_lookup:
01062               blk->predict_prim_call(
01063                 primitives::lookup(symbolOop(iter.word_at(1))),
01064                 iter.bci() + iter.word_at(1 + oopSize));
01065               break;
01066       case Bytecodes::dll_call_async: {
01067               DLLCallNode* node = MethodIterator::factory->new_DLLCallNode(
01068                 _interval->method(), _interval, iter.bci(), iter.next_bci(), iter.dll_cache());
01069               assert(node->end_bci() <= _interval->end_bci(), "just checking");
01070               blk->dll_call_node(node);
01071               next_bci = node->end_bci();
01072               break;
01073            }
01074       case Bytecodes::unimplemented_c7:
01075               unknown_code(Bytecodes::unimplemented_c7);
01076               break;
01077       case Bytecodes::access_send_0:
01078               blk->normal_send(iter.ic());
01079               break;
01080       case Bytecodes::unimplemented_cc:
01081               unknown_code(Bytecodes::unimplemented_cc);
01082               break;
01083       case Bytecodes::unimplemented_dc:
01084               unknown_code(Bytecodes::unimplemented_dc);
01085               break;
01086       case Bytecodes::special_primitive_send_1_hint:
01087               
01088               break;
01089       case Bytecodes::unimplemented_de:
01090               unknown_code(Bytecodes::unimplemented_de);
01091               break;
01092       case Bytecodes::unimplemented_df:
01093               unknown_code(Bytecodes::unimplemented_df);
01094               break;
01095       case Bytecodes::smi_add           : 
01096       case Bytecodes::smi_sub           : 
01097       case Bytecodes::smi_mult          : 
01098       case Bytecodes::smi_div           : 
01099       case Bytecodes::smi_mod           : 
01100       case Bytecodes::smi_create_point  : 
01101       case Bytecodes::smi_equal         : 
01102       case Bytecodes::smi_not_equal     : 
01103       case Bytecodes::smi_less          : 
01104       case Bytecodes::smi_less_equal    : 
01105       case Bytecodes::smi_greater       : 
01106       case Bytecodes::smi_greater_equal : 
01107       case Bytecodes::objArray_at       : 
01108       case Bytecodes::objArray_at_put   : 
01109       case Bytecodes::smi_and           : 
01110       case Bytecodes::smi_or            : 
01111       case Bytecodes::smi_xor           : 
01112       case Bytecodes::smi_shift         :
01113               blk->normal_send(iter.ic());
01114               break;
01115       case Bytecodes::double_equal:
01116               blk->double_equal();
01117               break;
01118       case Bytecodes::double_tilde:
01119               blk->double_not_equal();
01120               break;
01121       case Bytecodes::push_global:
01122               assert(iter.oop_at(1)->is_association(), "must be an association");
01123               blk->push_global(associationOop(iter.oop_at(1))); 
01124               break;
01125       case Bytecodes::store_global_pop:
01126               assert(iter.oop_at(1)->is_association(), "must be an association");
01127               blk->store_global(associationOop(iter.oop_at(1)));
01128               blk->pop(); 
01129               break;
01130       case Bytecodes::store_global:
01131               assert(iter.oop_at(1)->is_association(), "must be an association");
01132               blk->store_global(associationOop(iter.oop_at(1)));  
01133               break;
01134       case Bytecodes::push_classVar_name: {
01135                 symbolOop name = symbolOop(iter.oop_at(1));
01136                 assert(name->is_symbol(), "must be symbol");
01137                 blk->push_classVar_name(name);
01138               }
01139               break;
01140       case Bytecodes::store_classVar_pop_name: {
01141                 symbolOop name = symbolOop(iter.oop_at(1));
01142                 assert(name->is_symbol(), "must be symbol");
01143                 blk->store_classVar_name(name);
01144                 blk->pop();
01145               }
01146               break;
01147       case Bytecodes::store_classVar_name: {
01148                 symbolOop name = symbolOop(iter.oop_at(1));
01149                 assert(name->is_symbol(), "must be symbol");
01150                 blk->store_classVar_name(name);
01151               }
01152               break;
01153       case Bytecodes::unimplemented_fa:
01154               unknown_code(Bytecodes::unimplemented_fa);
01155               break;
01156       case Bytecodes::unimplemented_fb:
01157               unknown_code(Bytecodes::unimplemented_fb);
01158               break;
01159       case Bytecodes::unimplemented_fc:
01160               unknown_code(Bytecodes::unimplemented_fc);
01161               break;
01162       case Bytecodes::unimplemented_fd:
01163               unknown_code(Bytecodes::unimplemented_fd);
01164               break;
01165       case Bytecodes::unimplemented_fe:
01166               unknown_code(Bytecodes::unimplemented_fe);
01167               break;
01168       case Bytecodes::halt:
01169               unknown_code(Bytecodes::halt);
01170               break;
01171       default:
01172               ShouldNotReachHere();
01173     }
01174   }
01175   blk->set_prim_failure(oldFailState);
01176 }
01177 
01178 MethodIterator::MethodIterator(methodOop m, MethodClosure* blk, 
01179                                AbstractMethodIntervalFactory* f) {
01180   factory = f;
01181   _interval = factory->new_MethodInterval(m, NULL);
01182   dispatch(blk);
01183 }
01184 
01185 MethodIterator::MethodIterator(MethodInterval* interval, MethodClosure* blk, 
01186                                AbstractMethodIntervalFactory* f) {
01187   factory = f;
01188   _interval = interval;
01189   dispatch(blk);
01190 }
01191 
01192 MethodIntervalFactory MethodIterator::defaultFactory;
01193 AbstractMethodIntervalFactory* MethodIterator::factory;
01194 
01195 MethodInterval* MethodIntervalFactory::new_MethodInterval(methodOop method, MethodInterval* parent) {
01196   return new MethodInterval(method, parent);
01197 }
01198 
01199 MethodInterval* MethodIntervalFactory::new_MethodInterval(methodOop method, MethodInterval* parent, 
01200                                                           int begin_bci, int end_bci, bool failureBlock) {
01201   return new MethodInterval(method, parent, begin_bci, end_bci, failureBlock);
01202 }
01203 
01204 AndNode* MethodIntervalFactory::new_AndNode(methodOop method, MethodInterval* parent, int begin_bci, 
01205                                             int next_bci, int dest_offset) {
01206   return new AndNode(method, parent, begin_bci, next_bci, dest_offset);
01207 }
01208 
01209 OrNode* MethodIntervalFactory::new_OrNode(methodOop method, MethodInterval* parent, int begin_bci, 
01210                                           int next_bci, int dest_offset) {
01211   return new OrNode(method, parent, begin_bci, next_bci, dest_offset);
01212 }
01213 
01214 
01215 WhileNode* MethodIntervalFactory::new_WhileNode(methodOop method, MethodInterval* parent, int begin_bci, 
01216                                                 int next_bci, int cond_offset, int end_offset) {
01217   return new WhileNode(method, parent, begin_bci, next_bci, cond_offset, end_offset);
01218 }
01219 
01220 
01221 IfNode*  MethodIntervalFactory::new_IfNode(methodOop method, MethodInterval* parent, int begin_bci, 
01222                                            int next_bci, bool cond, int else_offset, u_char structure) {
01223   return new IfNode(method, parent, begin_bci, next_bci, cond, else_offset, structure);
01224 }
01225 
01226 
01227 PrimitiveCallNode* MethodIntervalFactory::new_PrimitiveCallNode(methodOop method, MethodInterval* parent, 
01228                                                                 int begin_bci, int next_bci, bool has_receiver, 
01229                                                                 symbolOop name, primitive_desc* pdesc) {
01230   return new PrimitiveCallNode(method, parent, begin_bci, next_bci, has_receiver, name, pdesc);
01231 }
01232 
01233 
01234 PrimitiveCallNode* MethodIntervalFactory::new_PrimitiveCallNode(methodOop method, MethodInterval* parent, 
01235                                                                 int begin_bci, int next_bci, bool has_receiver, 
01236                                                                 symbolOop name, primitive_desc* pdesc, int end_offset) {
01237   return new PrimitiveCallNode(method, parent, begin_bci, next_bci, has_receiver, name, pdesc, end_offset);
01238 }
01239 
01240 
01241 DLLCallNode* MethodIntervalFactory::new_DLLCallNode(methodOop method, MethodInterval* parent, int begin_bci, 
01242                                                     int next_bci, InterpretedDLL_Cache* cache) {
01243   return new DLLCallNode(method, parent, begin_bci, next_bci, cache);
01244 }
01245 
01246 
01247 
01248