< prev index next > src/hotspot/share/prims/stackwalk.hpp
Print this page
virtual int bci()=0;
virtual oop cont()=0; // returns the current continuation (even when walking a thread)
virtual const RegisterMap* reg_map()=0;
! virtual void fill_frame(int index, objArrayHandle frames_array,
const methodHandle& method, TRAPS)=0;
oop continuation() { return _continuation(); }
void set_continuation(Handle cont);
! void setup_magic_on_entry(objArrayHandle frames_array);
! bool check_magic(objArrayHandle frames_array);
! bool cleanup_magic_on_exit(objArrayHandle frames_array);
! bool is_valid_in(Thread* thread, objArrayHandle frames_array) {
return (_thread == thread && check_magic(frames_array));
}
jlong address_value() {
return (jlong) this;
}
! static BaseFrameStream* from_current(JavaThread* thread, jlong magic, objArrayHandle frames_array);
};
class JavaFrameStream : public BaseFrameStream {
private:
vframeStream _vfst;
virtual int bci()=0;
virtual oop cont()=0; // returns the current continuation (even when walking a thread)
virtual const RegisterMap* reg_map()=0;
! virtual void fill_frame(int index, refArrayHandle frames_array,
const methodHandle& method, TRAPS)=0;
oop continuation() { return _continuation(); }
void set_continuation(Handle cont);
! void setup_magic_on_entry(refArrayHandle frames_array);
! bool check_magic(refArrayHandle frames_array);
! bool cleanup_magic_on_exit(refArrayHandle frames_array);
! bool is_valid_in(Thread* thread, refArrayHandle frames_array) {
return (_thread == thread && check_magic(frames_array));
}
jlong address_value() {
return (jlong) this;
}
! static BaseFrameStream* from_current(JavaThread* thread, jlong magic, refArrayHandle frames_array);
};
class JavaFrameStream : public BaseFrameStream {
private:
vframeStream _vfst;
Method* method() override { return _vfst.method(); }
int bci() override { return _vfst.bci(); }
oop cont() override { return _vfst.continuation(); }
! void fill_frame(int index, objArrayHandle frames_array,
const methodHandle& method, TRAPS) override;
};
class LiveFrameStream : public BaseFrameStream {
private:
Method* method() override { return _vfst.method(); }
int bci() override { return _vfst.bci(); }
oop cont() override { return _vfst.continuation(); }
! void fill_frame(int index, refArrayHandle frames_array,
const methodHandle& method, TRAPS) override;
};
class LiveFrameStream : public BaseFrameStream {
private:
Method* method() override { return _jvf->method(); }
int bci() override { return _jvf->bci(); }
oop cont() override { return continuation() != nullptr ? continuation(): ContinuationEntry::cont_oop_or_null(_cont_entry, _map->thread()); }
! void fill_frame(int index, objArrayHandle frames_array,
const methodHandle& method, TRAPS) override;
};
class StackWalk : public AllStatic {
private:
static int fill_in_frames(jint mode, BaseFrameStream& stream,
int buffer_size, int start_index,
! objArrayHandle frames_array,
int& end_index, TRAPS);
static inline bool skip_hidden_frames(jint mode) {
return (mode & JVM_STACKWALK_SHOW_HIDDEN_FRAMES) == 0;
}
Method* method() override { return _jvf->method(); }
int bci() override { return _jvf->bci(); }
oop cont() override { return continuation() != nullptr ? continuation(): ContinuationEntry::cont_oop_or_null(_cont_entry, _map->thread()); }
! void fill_frame(int index, refArrayHandle frames_array,
const methodHandle& method, TRAPS) override;
};
class StackWalk : public AllStatic {
private:
static int fill_in_frames(jint mode, BaseFrameStream& stream,
int buffer_size, int start_index,
! refArrayHandle frames_array,
int& end_index, TRAPS);
static inline bool skip_hidden_frames(jint mode) {
return (mode & JVM_STACKWALK_SHOW_HIDDEN_FRAMES) == 0;
}
static inline bool need_method_info(jint mode) {
return (mode & JVM_STACKWALK_CLASS_INFO_ONLY) == 0;
}
static oop walk(Handle stackStream, jint mode, int skip_frames, Handle cont_scope, Handle cont,
! int buffer_size, int start_index, objArrayHandle frames_array,
TRAPS);
static oop fetchFirstBatch(BaseFrameStream& stream, Handle stackStream,
jint mode, int skip_frames, int buffer_size,
! int start_index, objArrayHandle frames_array, TRAPS);
static jint fetchNextBatch(Handle stackStream, jint mode, jlong magic,
int last_batch_count, int buffer_size, int start_index,
! objArrayHandle frames_array, TRAPS);
! static void setContinuation(Handle stackStream, jlong magic, objArrayHandle frames_array,
Handle cont, TRAPS);
};
#endif // SHARE_PRIMS_STACKWALK_HPP
static inline bool need_method_info(jint mode) {
return (mode & JVM_STACKWALK_CLASS_INFO_ONLY) == 0;
}
static oop walk(Handle stackStream, jint mode, int skip_frames, Handle cont_scope, Handle cont,
! int buffer_size, int start_index, refArrayHandle frames_array,
TRAPS);
static oop fetchFirstBatch(BaseFrameStream& stream, Handle stackStream,
jint mode, int skip_frames, int buffer_size,
! int start_index, refArrayHandle frames_array, TRAPS);
static jint fetchNextBatch(Handle stackStream, jint mode, jlong magic,
int last_batch_count, int buffer_size, int start_index,
! refArrayHandle frames_array, TRAPS);
! static void setContinuation(Handle stackStream, jlong magic, refArrayHandle frames_array,
Handle cont, TRAPS);
};
#endif // SHARE_PRIMS_STACKWALK_HPP
< prev index next >