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