|
37 | 37 | #include "gc/shared/collectedHeap.hpp" |
38 | 38 | #include "gc/shared/memAllocator.hpp" |
39 | 39 | #include "interpreter/bytecode.hpp" |
| 40 | +#include "interpreter/bytecode.inline.hpp" |
40 | 41 | #include "interpreter/bytecodeStream.hpp" |
41 | 42 | #include "interpreter/interpreter.hpp" |
42 | 43 | #include "interpreter/oopMapCache.hpp" |
@@ -642,11 +643,12 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread |
642 | 643 | bool caller_was_method_handle = false; |
643 | 644 | if (deopt_sender.is_interpreted_frame()) { |
644 | 645 | methodHandle method(current, deopt_sender.interpreter_frame_method()); |
645 | | - Bytecode_invoke cur = Bytecode_invoke_check(method, deopt_sender.interpreter_frame_bci()); |
646 | | - if (cur.is_invokedynamic() || cur.is_invokehandle()) { |
647 | | - // Method handle invokes may involve fairly arbitrary chains of |
648 | | - // calls so it's impossible to know how much actual space the |
649 | | - // caller has for locals. |
| 646 | + Bytecode_invoke cur(method, deopt_sender.interpreter_frame_bci()); |
| 647 | + if (cur.has_member_arg()) { |
| 648 | + // This should cover all real-world cases. One exception is a pathological chain of |
| 649 | + // MH.linkToXXX() linker calls, which only trusted code could do anyway. To handle that case, we |
| 650 | + // would need to get the size from the resolved method entry. Another exception would |
| 651 | + // be an invokedynamic with an adapter that is really a MethodHandle linker. |
650 | 652 | caller_was_method_handle = true; |
651 | 653 | } |
652 | 654 | } |
@@ -749,9 +751,14 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread |
749 | 751 | } |
750 | 752 | #endif |
751 | 753 |
|
| 754 | + int caller_actual_parameters = -1; // value not used except for interpreted frames, see below |
| 755 | + if (deopt_sender.is_interpreted_frame()) { |
| 756 | + caller_actual_parameters = callee_parameters + (caller_was_method_handle ? 1 : 0); |
| 757 | + } |
| 758 | + |
752 | 759 | UnrollBlock* info = new UnrollBlock(array->frame_size() * BytesPerWord, |
753 | 760 | caller_adjustment * BytesPerWord, |
754 | | - caller_was_method_handle ? 0 : callee_parameters, |
| 761 | + caller_actual_parameters, |
755 | 762 | number_of_frames, |
756 | 763 | frame_sizes, |
757 | 764 | frame_pcs, |
@@ -940,7 +947,7 @@ JRT_LEAF(BasicType, Deoptimization::unpack_frames(JavaThread* thread, int exec_m |
940 | 947 | if (Bytecodes::is_invoke(cur_code)) { |
941 | 948 | Bytecode_invoke invoke(mh, iframe->interpreter_frame_bci()); |
942 | 949 | cur_invoke_parameter_size = invoke.size_of_parameters(); |
943 | | - if (i != 0 && !invoke.is_invokedynamic() && MethodHandles::has_member_arg(invoke.klass(), invoke.name())) { |
| 950 | + if (i != 0 && invoke.has_member_arg()) { |
944 | 951 | callee_size_of_parameters++; |
945 | 952 | } |
946 | 953 | } |
|
0 commit comments