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