< prev index next > src/hotspot/cpu/aarch64/stackChunkFrameStream_aarch64.inline.hpp
Print this page
assert_is_interpreted_and_frame_type_mixed();
int diff = (int)(derelativize(frame::interpreter_frame_locals_offset) - derelativize(frame::interpreter_frame_sender_sp_offset) + 1);
return diff;
}
template <ChunkFrames frame_kind>
! inline int StackChunkFrameStream<frame_kind>::interpreter_frame_num_oops() const {
assert_is_interpreted_and_frame_type_mixed();
ResourceMark rm;
- InterpreterOopMap mask;
frame f = to_frame();
! f.interpreted_frame_oop_map(&mask);
! return mask.num_oops()
! + 1 // for the mirror oop
- + (f.interpreter_frame_method()->is_native() ? 1 : 0) // temp oop slot
- + pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(),
- (intptr_t*)f.interpreter_frame_monitor_end())/BasicObjectLock::size();
}
template<>
template<>
inline void StackChunkFrameStream<ChunkFrames::Mixed>::update_reg_map_pd(RegisterMap* map) {
assert_is_interpreted_and_frame_type_mixed();
int diff = (int)(derelativize(frame::interpreter_frame_locals_offset) - derelativize(frame::interpreter_frame_sender_sp_offset) + 1);
return diff;
}
+ class InterpreterOopCount : public OopClosure {
+ int _count;
+ public:
+ InterpreterOopCount() : _count(0) {}
+ void do_oop(oop* p) override { _count++; }
+ void do_oop(narrowOop* p) override { _count++; }
+ int count() { return _count; }
+ };
+
template <ChunkFrames frame_kind>
! template <typename RegisterMapT>
+ inline int StackChunkFrameStream<frame_kind>::interpreter_frame_num_oops(RegisterMapT* map) const {
assert_is_interpreted_and_frame_type_mixed();
ResourceMark rm;
frame f = to_frame();
! InterpreterOopCount closure;
! f.oops_interpreted_do(&closure, map, false);
! return closure.count();
}
template<>
template<>
inline void StackChunkFrameStream<ChunkFrames::Mixed>::update_reg_map_pd(RegisterMap* map) {
< prev index next >