diff --git a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp index 55e1e2ac374..29cd6a17b13 100644 --- a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp +++ b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTrace.cpp @@ -163,10 +163,10 @@ static RegisterMap::WalkContinuation walk_continuation(JavaThread* jt) { } JfrVframeStream::JfrVframeStream(JavaThread* jt, const frame& fr, bool stop_at_java_call_stub, bool async_mode) : - vframeStreamCommon(RegisterMap(jt, - RegisterMap::UpdateMap::skip, - RegisterMap::ProcessFrames::skip, - walk_continuation(jt))), + vframeStreamCommon(jt, + RegisterMap::UpdateMap::skip, + RegisterMap::ProcessFrames::skip, + walk_continuation(jt)), _vthread(JfrThreadLocal::is_vthread(jt)), _cont_entry(_vthread ? jt->last_continuation() : nullptr), _async_mode(async_mode) { diff --git a/src/hotspot/share/prims/forte.cpp b/src/hotspot/share/prims/forte.cpp index 2edaae66158..a7f48faba13 100644 --- a/src/hotspot/share/prims/forte.cpp +++ b/src/hotspot/share/prims/forte.cpp @@ -92,10 +92,10 @@ static bool is_decipherable_interpreted_frame(JavaThread* thread, vframeStreamForte::vframeStreamForte(JavaThread *jt, frame fr, bool stop_at_java_call_stub) - : vframeStreamCommon(RegisterMap(jt, - RegisterMap::UpdateMap::skip, - RegisterMap::ProcessFrames::skip, - RegisterMap::WalkContinuation::skip)) { + : vframeStreamCommon(jt, + RegisterMap::UpdateMap::skip, + RegisterMap::ProcessFrames::skip, + RegisterMap::WalkContinuation::skip) { _reg_map.set_async(true); _stop_at_java_call_stub = stop_at_java_call_stub; _frame = fr; diff --git a/src/hotspot/share/runtime/vframe.cpp b/src/hotspot/share/runtime/vframe.cpp index ccb90c427b0..ec97c468ecb 100644 --- a/src/hotspot/share/runtime/vframe.cpp +++ b/src/hotspot/share/runtime/vframe.cpp @@ -94,10 +94,11 @@ vframe* vframe::new_vframe(const frame* f, const RegisterMap* reg_map, JavaThrea } vframe* vframe::sender() const { - RegisterMap temp_map = *register_map(); assert(is_top(), "just checking"); if (_fr.is_empty()) return nullptr; if (_fr.is_entry_frame() && _fr.is_first_frame()) return nullptr; + + RegisterMap temp_map = *register_map(); // can we avoid copy? postpone it at least. frame s = _fr.real_sender(&temp_map); if (s.is_first_frame()) return nullptr; return vframe::new_vframe(&s, &temp_map, thread()); @@ -488,10 +489,10 @@ void vframeStreamCommon::found_bad_method_frame() const { #endif vframeStream::vframeStream(JavaThread* thread, Handle continuation_scope, bool stop_at_java_call_stub) - : vframeStreamCommon(RegisterMap(thread, - RegisterMap::UpdateMap::include, - RegisterMap::ProcessFrames::include, - RegisterMap::WalkContinuation::include)) { + : vframeStreamCommon(thread, + RegisterMap::UpdateMap::include, + RegisterMap::ProcessFrames::include, + RegisterMap::WalkContinuation::include) { _stop_at_java_call_stub = stop_at_java_call_stub; _continuation_scope = continuation_scope; @@ -509,7 +510,7 @@ vframeStream::vframeStream(JavaThread* thread, Handle continuation_scope, bool s } vframeStream::vframeStream(oop continuation, Handle continuation_scope) - : vframeStreamCommon(RegisterMap(continuation, RegisterMap::UpdateMap::include)) { + : vframeStreamCommon(continuation) { _stop_at_java_call_stub = false; _continuation_scope = continuation_scope; @@ -525,6 +526,10 @@ vframeStream::vframeStream(oop continuation, Handle continuation_scope) } } +vframeStreamCommon::vframeStreamCommon(oop continuation) + : _reg_map(continuation, RegisterMap::UpdateMap::include), _cont_entry(nullptr) { + _thread = _reg_map.thread(); +} // Step back n frames, skip any pseudo frames in between. // This function is used in Class.forName, Class.newInstance, Method.Invoke, diff --git a/src/hotspot/share/runtime/vframe.hpp b/src/hotspot/share/runtime/vframe.hpp index 427fea2f78e..397b77c2b3e 100644 --- a/src/hotspot/share/runtime/vframe.hpp +++ b/src/hotspot/share/runtime/vframe.hpp @@ -281,7 +281,9 @@ class vframeStreamCommon : StackObj { public: // Constructor - inline vframeStreamCommon(RegisterMap reg_map); +// inline vframeStreamCommon(RegisterMap reg_map); + inline vframeStreamCommon(JavaThread* thread, RegisterMap::UpdateMap update_map, RegisterMap::ProcessFrames process_frames, RegisterMap::WalkContinuation walk_cont); + vframeStreamCommon(oop continuation); // Accessors Method* method() const { return _method; } diff --git a/src/hotspot/share/runtime/vframe.inline.hpp b/src/hotspot/share/runtime/vframe.inline.hpp index 4630e695ce9..d33093863a7 100644 --- a/src/hotspot/share/runtime/vframe.inline.hpp +++ b/src/hotspot/share/runtime/vframe.inline.hpp @@ -34,7 +34,15 @@ #include "runtime/handles.inline.hpp" #include "runtime/javaThread.inline.hpp" -inline vframeStreamCommon::vframeStreamCommon(RegisterMap reg_map) : _reg_map(reg_map), _cont_entry(nullptr) { +//inline vframeStreamCommon::vframeStreamCommon(RegisterMap reg_map) : _reg_map(reg_map), _cont_entry(nullptr) { +// _thread = _reg_map.thread(); +//} + +inline vframeStreamCommon::vframeStreamCommon(JavaThread* thread, + RegisterMap::UpdateMap update_map, + RegisterMap::ProcessFrames process_frames, + RegisterMap::WalkContinuation walk_cont) + : _reg_map(thread, update_map, process_frames, walk_cont), _cont_entry(nullptr) { _thread = _reg_map.thread(); } @@ -109,10 +117,10 @@ inline void vframeStreamCommon::next() { } inline vframeStream::vframeStream(JavaThread* thread, bool stop_at_java_call_stub, bool process_frame, bool vthread_carrier) - : vframeStreamCommon(RegisterMap(thread, - RegisterMap::UpdateMap::include, - process_frame ? RegisterMap::ProcessFrames::include : RegisterMap::ProcessFrames::skip , - RegisterMap::WalkContinuation::include)) { + : vframeStreamCommon(thread, + RegisterMap::UpdateMap::include, + process_frame ? RegisterMap::ProcessFrames::include : RegisterMap::ProcessFrames::skip , + RegisterMap::WalkContinuation::include) { _stop_at_java_call_stub = stop_at_java_call_stub; if (!thread->has_last_Java_frame()) {