< prev index next > src/hotspot/share/runtime/stackChunkFrameStream.inline.hpp
Print this page
DEBUG_ONLY(_index = 0;)
_end = chunk->bottom_address();
_sp = chunk->start_address() + chunk->sp();
assert(_sp <= chunk->end_address() + frame::metadata_words, "");
+ _callee_augmented = false;
get_cb();
if (frame_kind == ChunkFrames::Mixed) {
_unextended_sp = (!is_done() && is_interpreted()) ? unextended_sp_for_interpreter_frame() : _sp;
assert(_unextended_sp >= _sp - frame::metadata_words, "");
+ } else {
+ _unextended_sp = _sp;
}
- DEBUG_ONLY(else _unextended_sp = nullptr;)
if (is_stub()) {
get_oopmap(pc(), 0);
DEBUG_ONLY(_has_stub = true);
} DEBUG_ONLY(else _has_stub = false;)
assert(chunk->is_in_chunk(f.sp()), "");
_sp = f.sp();
if (frame_kind == ChunkFrames::Mixed) {
_unextended_sp = f.unextended_sp();
assert(_unextended_sp >= _sp - frame::metadata_words, "");
+ } else {
+ _unextended_sp = _sp;
}
- DEBUG_ONLY(else _unextended_sp = nullptr;)
assert(_sp >= chunk->start_address(), "");
assert(_sp <= chunk->end_address() + frame::metadata_words, "");
+ _callee_augmented = false;
if (f.cb() != nullptr) {
_oopmap = nullptr;
_cb = f.cb();
} else {
template <ChunkFrames frame_kind>
template <typename RegisterMapT>
inline void StackChunkFrameStream<frame_kind>::next(RegisterMapT* map, bool stop) {
update_reg_map(map);
bool is_runtime_stub = is_stub();
+ _callee_augmented = false;
if (frame_kind == ChunkFrames::Mixed) {
if (is_interpreted()) {
next_for_interpreter_frame();
} else {
_sp = _unextended_sp + cb()->frame_size();
if (_sp >= _end - frame::metadata_words) {
_sp = _end;
}
- _unextended_sp = is_interpreted() ? unextended_sp_for_interpreter_frame() : _sp;
+ if (is_interpreted()) {
+ _unextended_sp = unextended_sp_for_interpreter_frame();
+ } else if (cb()->is_nmethod() && cb()->as_nmethod()->needs_stack_repair()) {
+ _unextended_sp = frame::repair_sender_sp(cb()->as_nmethod(), _unextended_sp, (intptr_t**)(_sp - frame::sender_sp_offset));
+ _callee_augmented = _unextended_sp != _sp;
+ } else {
+ _unextended_sp = _sp;
+ }
}
assert(_unextended_sp >= _sp - frame::metadata_words, "");
} else {
- _sp += cb()->frame_size();
+ _sp = _unextended_sp + cb()->frame_size();
+ if (cb()->is_nmethod() && cb()->as_nmethod()->needs_stack_repair()) {
+ _unextended_sp = frame::repair_sender_sp(cb()->as_nmethod(), _unextended_sp, (intptr_t**)(_sp - frame::sender_sp_offset));
+ _callee_augmented = _unextended_sp != _sp;
+ } else {
+ _unextended_sp = _sp;
+ }
}
assert(!is_interpreted() || _unextended_sp == unextended_sp_for_interpreter_frame(), "");
DEBUG_ONLY(_index++;)
if (stop) {
< prev index next >