< prev index next >

src/hotspot/share/runtime/stackChunkFrameStream.inline.hpp

Print this page
*** 53,18 ***
  
    DEBUG_ONLY(_index = 0;)
    _end = chunk->bottom_address();
    _sp = chunk->start_address() + chunk->sp();
    assert(_sp <= chunk->end_address() + frame::metadata_words, "");
  
    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, "");
    }
-   DEBUG_ONLY(else _unextended_sp = nullptr;)
  
    if (is_stub()) {
      get_oopmap(pc(), 0);
      DEBUG_ONLY(_has_stub = true);
    } DEBUG_ONLY(else _has_stub = false;)
--- 53,20 ---
  
    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;
    }
  
    if (is_stub()) {
      get_oopmap(pc(), 0);
      DEBUG_ONLY(_has_stub = true);
    } DEBUG_ONLY(else _has_stub = false;)

*** 84,14 ***
    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, "");
    }
-   DEBUG_ONLY(else _unextended_sp = nullptr;)
    assert(_sp >= chunk->start_address(), "");
    assert(_sp <= chunk->end_address() + frame::metadata_words, "");
  
    if (f.cb() != nullptr) {
      _oopmap = nullptr;
      _cb = f.cb();
    } else {
--- 86,16 ---
    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;
    }
    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 {

*** 214,23 ***
  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();
    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;
      }
      assert(_unextended_sp >= _sp - frame::metadata_words, "");
    } else {
!     _sp += cb()->frame_size();
    }
    assert(!is_interpreted() || _unextended_sp == unextended_sp_for_interpreter_frame(), "");
  
    DEBUG_ONLY(_index++;)
    if (stop) {
--- 218,37 ---
  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;
        }
!       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 = _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 >