methodIterator.cpp

Go to the documentation of this file.
00001 /* Copyright 1994 - 1996, LongView Technologies L.L.C. $Revision: 1.52 $ */
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 # include "incls/_precompiled.incl"
00025 # include "incls/_methodIterator.cpp.incl"
00026 
00027 
00028 // MethodInterval
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 // InlineSendNode
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 // CondNode
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 // AndNode
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 // OrNode
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 // WhileNode
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 // IfNode
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 // ExternalCallNode
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 // PrimitiveCallNode
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 // DLLCallNode
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 // MethodClosure
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 // CustomizedMethodClosure
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 // SpecializedMethodClosure
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 // MethodIterator
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               // ignore since they are inside WhileNode expression body
00780               break;
00781       case Bytecodes::whileFalse_byte:
00782               // ignore since they are inside WhileNode expression body
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               // Ignore since they are inside WhileNode expression body
00831               break;
00832       case Bytecodes::whileFalse_word:
00833               // Ignore since they are inside WhileNode expression body
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:               // fall through
00848       case Bytecodes::interpreted_send_1:               // fall through
00849       case Bytecodes::interpreted_send_2:               // fall through
00850       case Bytecodes::interpreted_send_n:               // fall through
00851       case Bytecodes::compiled_send_0:                  // fall through
00852       case Bytecodes::compiled_send_1:                  // fall through
00853       case Bytecodes::compiled_send_2:                  // fall through
00854       case Bytecodes::compiled_send_n:                  // fall through
00855       case Bytecodes::primitive_send_0:                 // fall through
00856       case Bytecodes::primitive_send_1:                 // fall through
00857       case Bytecodes::primitive_send_2:                 // fall through
00858       case Bytecodes::primitive_send_n:                 // fall through
00859       case Bytecodes::polymorphic_send_0:               // fall through
00860       case Bytecodes::polymorphic_send_1:               // fall through
00861       case Bytecodes::polymorphic_send_2:               // fall through
00862       case Bytecodes::polymorphic_send_n:               // fall through
00863       case Bytecodes::megamorphic_send_0:               // fall through
00864       case Bytecodes::megamorphic_send_1:               // fall through
00865       case Bytecodes::megamorphic_send_2:               // fall through
00866       case Bytecodes::megamorphic_send_n:               // fall through
00867               blk->normal_send(iter.ic());
00868               break;
00869       case Bytecodes::interpreted_send_0_pop:           // fall through
00870       case Bytecodes::interpreted_send_1_pop:           // fall through
00871       case Bytecodes::interpreted_send_2_pop:           // fall through
00872       case Bytecodes::interpreted_send_n_pop:           // fall through
00873       case Bytecodes::compiled_send_0_pop:              // fall through
00874       case Bytecodes::compiled_send_1_pop:              // fall through
00875       case Bytecodes::compiled_send_2_pop:              // fall through
00876       case Bytecodes::compiled_send_n_pop:              // fall through
00877       case Bytecodes::primitive_send_0_pop:             // fall through
00878       case Bytecodes::primitive_send_1_pop:             // fall through
00879       case Bytecodes::primitive_send_2_pop:             // fall through
00880       case Bytecodes::primitive_send_n_pop:             // fall through
00881       case Bytecodes::polymorphic_send_0_pop:           // fall through
00882       case Bytecodes::polymorphic_send_1_pop:           // fall through
00883       case Bytecodes::polymorphic_send_2_pop:           // fall through
00884       case Bytecodes::polymorphic_send_n_pop:           // fall through
00885       case Bytecodes::megamorphic_send_0_pop:           // fall through
00886       case Bytecodes::megamorphic_send_1_pop:           // fall through
00887       case Bytecodes::megamorphic_send_2_pop:           // fall through
00888       case Bytecodes::megamorphic_send_n_pop:           // fall through
00889               blk->normal_send(iter.ic());
00890               blk->pop();
00891               break;
00892       case Bytecodes::interpreted_send_self:            // fall through
00893       case Bytecodes::compiled_send_self:               // fall through
00894       case Bytecodes::primitive_send_self:              // fall through
00895       case Bytecodes::polymorphic_send_self:            // fall through
00896       case Bytecodes::megamorphic_send_self:            // fall through
00897               blk->self_send(iter.ic());
00898               break;
00899       case Bytecodes::interpreted_send_self_pop:        // fall through
00900       case Bytecodes::compiled_send_self_pop:           // fall through
00901       case Bytecodes::primitive_send_self_pop:          // fall through
00902       case Bytecodes::polymorphic_send_self_pop:        // fall through
00903       case Bytecodes::megamorphic_send_self_pop:        // fall through
00904               blk->self_send(iter.ic());
00905               blk->pop();
00906               break;
00907       case Bytecodes::interpreted_send_super:           // fall through
00908       case Bytecodes::compiled_send_super:              // fall through
00909       case Bytecodes::primitive_send_super:             // fall through
00910       case Bytecodes::polymorphic_send_super:           // fall through
00911       case Bytecodes::megamorphic_send_super:           // fall through
00912               blk->super_send(iter.ic());
00913               break;
00914       case Bytecodes::interpreted_send_super_pop:       // fall through
00915       case Bytecodes::compiled_send_super_pop:          // fall through
00916       case Bytecodes::primitive_send_super_pop:         // fall through
00917       case Bytecodes::polymorphic_send_super_pop:       // fall through
00918       case Bytecodes::megamorphic_send_super_pop:       // fall through
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: // fall through
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: // fall through
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: // fall through
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: // fall through
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               // ignore - only meaningfull for the interpreter
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           : // fall through
01096       case Bytecodes::smi_sub           : // fall through
01097       case Bytecodes::smi_mult          : // fall through
01098       case Bytecodes::smi_div           : // fall through
01099       case Bytecodes::smi_mod           : // fall through
01100       case Bytecodes::smi_create_point  : // fall through
01101       case Bytecodes::smi_equal         : // fall through
01102       case Bytecodes::smi_not_equal     : // fall through
01103       case Bytecodes::smi_less          : // fall through
01104       case Bytecodes::smi_less_equal    : // fall through
01105       case Bytecodes::smi_greater       : // fall through
01106       case Bytecodes::smi_greater_equal : // fall through
01107       case Bytecodes::objArray_at       : // fall through
01108       case Bytecodes::objArray_at_put   : // fall through
01109       case Bytecodes::smi_and           : // fall through
01110       case Bytecodes::smi_or            : // fall through
01111       case Bytecodes::smi_xor           : // fall through
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 

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