< prev index next >

src/hotspot/share/oops/stackChunkOop.inline.hpp

Print this page
@@ -166,10 +166,22 @@
  inline void stackChunkOopDesc::set_preempted(bool value) {
    assert(preempted() != value, "");
    set_flag(FLAG_PREEMPTED, value);
  }
  
+ inline bool stackChunkOopDesc::at_klass_init() const { return jdk_internal_vm_StackChunk::atKlassInit(as_oop()); }
+ inline void stackChunkOopDesc::set_at_klass_init(bool value) {
+   assert(at_klass_init() != value, "");
+   jdk_internal_vm_StackChunk::set_atKlassInit(this, value);
+ }
+ 
+ inline bool stackChunkOopDesc::has_args_at_top() const { return jdk_internal_vm_StackChunk::hasArgsAtTop(as_oop()); }
+ inline void stackChunkOopDesc::set_has_args_at_top(bool value) {
+   assert(has_args_at_top() != value, "");
+   jdk_internal_vm_StackChunk::set_hasArgsAtTop(this, value);
+ }
+ 
  inline bool stackChunkOopDesc::has_lockstack() const         { return is_flag(FLAG_HAS_LOCKSTACK); }
  inline void stackChunkOopDesc::set_has_lockstack(bool value) { set_flag(FLAG_HAS_LOCKSTACK, value); }
  
  inline bool stackChunkOopDesc::is_gc_mode() const                  { return is_flag(FLAG_GC_MODE); }
  inline bool stackChunkOopDesc::is_gc_mode_acquire() const          { return is_flag_acquire(FLAG_GC_MODE); }

@@ -208,11 +220,11 @@
                       : iterate_stack<ChunkFrames::CompiledOnly>(closure);
  }
  
  template <ChunkFrames frame_kind, class StackChunkFrameClosureType>
  inline void stackChunkOopDesc::iterate_stack(StackChunkFrameClosureType* closure) {
-   const SmallRegisterMap* map = SmallRegisterMap::instance();
+   const auto* map = SmallRegisterMap::instance_no_args();
    assert(!map->in_cont(), "");
  
    StackChunkFrameStream<frame_kind> f(this);
    bool should_continue = true;
  

@@ -228,10 +240,13 @@
      assert(!f.is_done(), "");
      assert(f.is_compiled(), "");
  
      should_continue = closure->do_frame(f, &full_map);
      f.next(map);
+   } else if (frame_kind == ChunkFrames::Mixed && f.is_interpreted() && has_args_at_top()) {
+     should_continue = closure->do_frame(f, SmallRegisterMap::instance_with_args());
+     f.next(map);
    }
    assert(!f.is_stub(), "");
  
    for(; should_continue && !f.is_done(); f.next(map)) {
      if (frame_kind == ChunkFrames::Mixed) {
< prev index next >