105 if (is_enterSpecial_frame) {
106 _cont_entry = _cont_entry->parent();
107 }
108 } while (!fill_from_frame());
109 }
110
111 inline vframeStream::vframeStream(JavaThread* thread, bool stop_at_java_call_stub, bool process_frame, bool vthread_carrier)
112 : vframeStreamCommon(RegisterMap(thread,
113 RegisterMap::UpdateMap::include,
114 process_frame ? RegisterMap::ProcessFrames::include : RegisterMap::ProcessFrames::skip ,
115 RegisterMap::WalkContinuation::include)) {
116 _stop_at_java_call_stub = stop_at_java_call_stub;
117
118 if (!thread->has_last_Java_frame()) {
119 _mode = at_end_mode;
120 return;
121 }
122
123 if (thread->is_vthread_mounted()) {
124 _frame = vthread_carrier ? _thread->carrier_last_frame(&_reg_map) : _thread->vthread_last_frame();
125 } else {
126 _frame = _thread->last_frame();
127 }
128
129 _cont_entry = _thread->last_continuation();
130 while (!fill_from_frame()) {
131 _frame = _frame.sender(&_reg_map);
132 }
133 }
134
135 inline bool vframeStreamCommon::fill_in_compiled_inlined_sender() {
136 if (_sender_decode_offset == DebugInformationRecorder::serialized_null) {
137 return false;
138 }
139 fill_from_compiled_frame(_sender_decode_offset);
140 ++_vframe_id;
141 return true;
142 }
143
144
|
105 if (is_enterSpecial_frame) {
106 _cont_entry = _cont_entry->parent();
107 }
108 } while (!fill_from_frame());
109 }
110
111 inline vframeStream::vframeStream(JavaThread* thread, bool stop_at_java_call_stub, bool process_frame, bool vthread_carrier)
112 : vframeStreamCommon(RegisterMap(thread,
113 RegisterMap::UpdateMap::include,
114 process_frame ? RegisterMap::ProcessFrames::include : RegisterMap::ProcessFrames::skip ,
115 RegisterMap::WalkContinuation::include)) {
116 _stop_at_java_call_stub = stop_at_java_call_stub;
117
118 if (!thread->has_last_Java_frame()) {
119 _mode = at_end_mode;
120 return;
121 }
122
123 if (thread->is_vthread_mounted()) {
124 _frame = vthread_carrier ? _thread->carrier_last_frame(&_reg_map) : _thread->vthread_last_frame();
125 if (Continuation::is_continuation_enterSpecial(_frame)) {
126 // This can happen when calling async_get_stack_trace() and catching the target
127 // vthread at the JRT_BLOCK_END in freeze_internal() or when posting the Monitor
128 // Waited event after target vthread was preempted. Since all continuation frames
129 // are freezed we get the top frame from the stackChunk instead.
130 _frame = Continuation::last_frame(java_lang_VirtualThread::continuation(_thread->vthread()), &_reg_map);
131 }
132 } else {
133 _frame = _thread->last_frame();
134 }
135
136 _cont_entry = _thread->last_continuation();
137 while (!fill_from_frame()) {
138 _frame = _frame.sender(&_reg_map);
139 }
140 }
141
142 inline bool vframeStreamCommon::fill_in_compiled_inlined_sender() {
143 if (_sender_decode_offset == DebugInformationRecorder::serialized_null) {
144 return false;
145 }
146 fill_from_compiled_frame(_sender_decode_offset);
147 ++_vframe_id;
148 return true;
149 }
150
151
|