187 frame deoptee = stub_frame.sender(&map); |
187 frame deoptee = stub_frame.sender(&map); |
188 // Set the deoptee nmethod |
188 // Set the deoptee nmethod |
189 assert(thread->deopt_nmethod() == NULL, "Pending deopt!"); |
189 assert(thread->deopt_nmethod() == NULL, "Pending deopt!"); |
190 thread->set_deopt_nmethod(deoptee.cb()->as_nmethod_or_null()); |
190 thread->set_deopt_nmethod(deoptee.cb()->as_nmethod_or_null()); |
191 |
191 |
|
192 if (VerifyStack) { |
|
193 thread->validate_frame_layout(); |
|
194 } |
|
195 |
192 // Create a growable array of VFrames where each VFrame represents an inlined |
196 // Create a growable array of VFrames where each VFrame represents an inlined |
193 // Java frame. This storage is allocated with the usual system arena. |
197 // Java frame. This storage is allocated with the usual system arena. |
194 assert(deoptee.is_compiled_frame(), "Wrong frame type"); |
198 assert(deoptee.is_compiled_frame(), "Wrong frame type"); |
195 GrowableArray<compiledVFrame*>* chunk = new GrowableArray<compiledVFrame*>(10); |
199 GrowableArray<compiledVFrame*>* chunk = new GrowableArray<compiledVFrame*>(10); |
196 vframe* vf = vframe::new_vframe(&deoptee, &map, thread); |
200 vframe* vf = vframe::new_vframe(&deoptee, &map, thread); |
419 // than simply use array->sender.pc(). This requires us to walk the current set of frames |
423 // than simply use array->sender.pc(). This requires us to walk the current set of frames |
420 // |
424 // |
421 frame deopt_sender = stub_frame.sender(&dummy_map); // First is the deoptee frame |
425 frame deopt_sender = stub_frame.sender(&dummy_map); // First is the deoptee frame |
422 deopt_sender = deopt_sender.sender(&dummy_map); // Now deoptee caller |
426 deopt_sender = deopt_sender.sender(&dummy_map); // Now deoptee caller |
423 |
427 |
|
428 // It's possible that the number of paramters at the call site is |
|
429 // different than number of arguments in the callee when method |
|
430 // handles are used. If the caller is interpreted get the real |
|
431 // value so that the proper amount of space can be added to it's |
|
432 // frame. |
|
433 int sender_callee_parameters = callee_parameters; |
|
434 if (deopt_sender.is_interpreted_frame()) { |
|
435 methodHandle method = deopt_sender.interpreter_frame_method(); |
|
436 Bytecode_invoke cur = Bytecode_invoke_check(method, |
|
437 deopt_sender.interpreter_frame_bci()); |
|
438 Symbol* signature = method->constants()->signature_ref_at(cur.index()); |
|
439 ArgumentSizeComputer asc(signature); |
|
440 sender_callee_parameters = asc.size() + cur.has_receiver() ? 1 : 0; |
|
441 } |
|
442 |
424 // Compute the amount the oldest interpreter frame will have to adjust |
443 // Compute the amount the oldest interpreter frame will have to adjust |
425 // its caller's stack by. If the caller is a compiled frame then |
444 // its caller's stack by. If the caller is a compiled frame then |
426 // we pretend that the callee has no parameters so that the |
445 // we pretend that the callee has no parameters so that the |
427 // extension counts for the full amount of locals and not just |
446 // extension counts for the full amount of locals and not just |
428 // locals-parms. This is because without a c2i adapter the parm |
447 // locals-parms. This is because without a c2i adapter the parm |
433 // QQQ I'd rather see this pushed down into last_frame_adjust |
452 // QQQ I'd rather see this pushed down into last_frame_adjust |
434 // and have it take the sender (aka caller). |
453 // and have it take the sender (aka caller). |
435 |
454 |
436 if (deopt_sender.is_compiled_frame()) { |
455 if (deopt_sender.is_compiled_frame()) { |
437 caller_adjustment = last_frame_adjust(0, callee_locals); |
456 caller_adjustment = last_frame_adjust(0, callee_locals); |
438 } else if (callee_locals > callee_parameters) { |
457 } else if (callee_locals > sender_callee_parameters) { |
439 // The caller frame may need extending to accommodate |
458 // The caller frame may need extending to accommodate |
440 // non-parameter locals of the first unpacked interpreted frame. |
459 // non-parameter locals of the first unpacked interpreted frame. |
441 // Compute that adjustment. |
460 // Compute that adjustment. |
442 caller_adjustment = last_frame_adjust(callee_parameters, callee_locals); |
461 caller_adjustment = last_frame_adjust(sender_callee_parameters, callee_locals); |
443 } |
462 } |
444 |
|
445 |
463 |
446 // If the sender is deoptimized the we must retrieve the address of the handler |
464 // If the sender is deoptimized the we must retrieve the address of the handler |
447 // since the frame will "magically" show the original pc before the deopt |
465 // since the frame will "magically" show the original pc before the deopt |
448 // and we'd undo the deopt. |
466 // and we'd undo the deopt. |
449 |
467 |
566 cleanup_deopt_info(thread, array); |
584 cleanup_deopt_info(thread, array); |
567 |
585 |
568 #ifndef PRODUCT |
586 #ifndef PRODUCT |
569 if (VerifyStack) { |
587 if (VerifyStack) { |
570 ResourceMark res_mark; |
588 ResourceMark res_mark; |
|
589 |
|
590 thread->validate_frame_layout(); |
571 |
591 |
572 // Verify that the just-unpacked frames match the interpreter's |
592 // Verify that the just-unpacked frames match the interpreter's |
573 // notions of expression stack and locals |
593 // notions of expression stack and locals |
574 vframeArray* cur_array = thread->vframe_array_last(); |
594 vframeArray* cur_array = thread->vframe_array_last(); |
575 RegisterMap rm(thread, false); |
595 RegisterMap rm(thread, false); |