equal
deleted
inserted
replaced
312 // Entry frame's arguments are always in relation to unextended_sp() |
312 // Entry frame's arguments are always in relation to unextended_sp() |
313 return &unextended_sp()[index]; |
313 return &unextended_sp()[index]; |
314 } |
314 } |
315 |
315 |
316 // sender_sp |
316 // sender_sp |
317 #ifdef CC_INTERP |
|
318 intptr_t* frame::interpreter_frame_sender_sp() const { |
|
319 assert(is_interpreted_frame(), "interpreted frame expected"); |
|
320 // QQQ why does this specialize method exist if frame::sender_sp() does same thing? |
|
321 // seems odd and if we always know interpreted vs. non then sender_sp() is really |
|
322 // doing too much work. |
|
323 return get_interpreterState()->sender_sp(); |
|
324 } |
|
325 |
|
326 // monitor elements |
|
327 |
|
328 BasicObjectLock* frame::interpreter_frame_monitor_begin() const { |
|
329 return get_interpreterState()->monitor_base(); |
|
330 } |
|
331 |
|
332 BasicObjectLock* frame::interpreter_frame_monitor_end() const { |
|
333 return (BasicObjectLock*) get_interpreterState()->stack_base(); |
|
334 } |
|
335 |
|
336 #else // CC_INTERP |
|
337 |
|
338 intptr_t* frame::interpreter_frame_sender_sp() const { |
317 intptr_t* frame::interpreter_frame_sender_sp() const { |
339 assert(is_interpreted_frame(), "interpreted frame expected"); |
318 assert(is_interpreted_frame(), "interpreted frame expected"); |
340 return (intptr_t*) at(interpreter_frame_sender_sp_offset); |
319 return (intptr_t*) at(interpreter_frame_sender_sp_offset); |
341 } |
320 } |
342 |
321 |
366 |
345 |
367 // Used by template based interpreter deoptimization |
346 // Used by template based interpreter deoptimization |
368 void frame::interpreter_frame_set_last_sp(intptr_t* sp) { |
347 void frame::interpreter_frame_set_last_sp(intptr_t* sp) { |
369 *((intptr_t**)addr_at(interpreter_frame_last_sp_offset)) = sp; |
348 *((intptr_t**)addr_at(interpreter_frame_last_sp_offset)) = sp; |
370 } |
349 } |
371 #endif // CC_INTERP |
|
372 |
350 |
373 frame frame::sender_for_entry_frame(RegisterMap* map) const { |
351 frame frame::sender_for_entry_frame(RegisterMap* map) const { |
374 assert(map != NULL, "map must be set"); |
352 assert(map != NULL, "map must be set"); |
375 // Java frame called from C; skip all C frames and return top C |
353 // Java frame called from C; skip all C frames and return top C |
376 // frame of that chunk as the sender |
354 // frame of that chunk as the sender |
526 // methods that exists in the core system. |
504 // methods that exists in the core system. |
527 return frame(sender_sp(), link(), sender_pc()); |
505 return frame(sender_sp(), link(), sender_pc()); |
528 } |
506 } |
529 |
507 |
530 bool frame::is_interpreted_frame_valid(JavaThread* thread) const { |
508 bool frame::is_interpreted_frame_valid(JavaThread* thread) const { |
531 // QQQ |
|
532 #ifdef CC_INTERP |
|
533 #else |
|
534 assert(is_interpreted_frame(), "Not an interpreted frame"); |
509 assert(is_interpreted_frame(), "Not an interpreted frame"); |
535 // These are reasonable sanity checks |
510 // These are reasonable sanity checks |
536 if (fp() == 0 || (intptr_t(fp()) & (wordSize-1)) != 0) { |
511 if (fp() == 0 || (intptr_t(fp()) & (wordSize-1)) != 0) { |
537 return false; |
512 return false; |
538 } |
513 } |
582 address locals = (address) *interpreter_frame_locals_addr(); |
557 address locals = (address) *interpreter_frame_locals_addr(); |
583 |
558 |
584 if (locals > thread->stack_base() || locals < (address) fp()) return false; |
559 if (locals > thread->stack_base() || locals < (address) fp()) return false; |
585 |
560 |
586 // We'd have to be pretty unlucky to be mislead at this point |
561 // We'd have to be pretty unlucky to be mislead at this point |
587 |
|
588 #endif // CC_INTERP |
|
589 return true; |
562 return true; |
590 } |
563 } |
591 |
564 |
592 BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) { |
565 BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) { |
593 #ifdef CC_INTERP |
|
594 // Needed for JVMTI. The result should always be in the |
|
595 // interpreterState object |
|
596 interpreterState istate = get_interpreterState(); |
|
597 #endif // CC_INTERP |
|
598 assert(is_interpreted_frame(), "interpreted frame expected"); |
566 assert(is_interpreted_frame(), "interpreted frame expected"); |
599 Method* method = interpreter_frame_method(); |
567 Method* method = interpreter_frame_method(); |
600 BasicType type = method->result_type(); |
568 BasicType type = method->result_type(); |
601 |
569 |
602 intptr_t* tos_addr; |
570 intptr_t* tos_addr; |
618 switch (type) { |
586 switch (type) { |
619 case T_OBJECT : |
587 case T_OBJECT : |
620 case T_ARRAY : { |
588 case T_ARRAY : { |
621 oop obj; |
589 oop obj; |
622 if (method->is_native()) { |
590 if (method->is_native()) { |
623 #ifdef CC_INTERP |
|
624 obj = istate->_oop_temp; |
|
625 #else |
|
626 obj = cast_to_oop(at(interpreter_frame_oop_temp_offset)); |
591 obj = cast_to_oop(at(interpreter_frame_oop_temp_offset)); |
627 #endif // CC_INTERP |
|
628 } else { |
592 } else { |
629 oop* obj_p = (oop*)tos_addr; |
593 oop* obj_p = (oop*)tos_addr; |
630 obj = (obj_p == NULL) ? (oop)NULL : *obj_p; |
594 obj = (obj_p == NULL) ? (oop)NULL : *obj_p; |
631 } |
595 } |
632 assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); |
596 assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); |