88 _sp = fp + frame::sender_sp_offset;
89 }
90 }
91
92 template <ChunkFrames frame_kind>
93 inline int StackChunkFrameStream<frame_kind>::interpreter_frame_size() const {
94 assert_is_interpreted_and_frame_type_mixed();
95
96 intptr_t* top = unextended_sp(); // later subtract argsize if callee is interpreted
97 intptr_t* bottom = derelativize(frame::interpreter_frame_locals_offset) + 1; // the sender's unextended sp: derelativize(frame::interpreter_frame_sender_sp_offset);
98 return (int)(bottom - top);
99 }
100
101 template <ChunkFrames frame_kind>
102 inline int StackChunkFrameStream<frame_kind>::interpreter_frame_stack_argsize() const {
103 assert_is_interpreted_and_frame_type_mixed();
104 int diff = (int)(derelativize(frame::interpreter_frame_locals_offset) - derelativize(frame::interpreter_frame_sender_sp_offset) + 1);
105 return diff;
106 }
107
108 template <ChunkFrames frame_kind>
109 inline int StackChunkFrameStream<frame_kind>::interpreter_frame_num_oops() const {
110 assert_is_interpreted_and_frame_type_mixed();
111 ResourceMark rm;
112 InterpreterOopMap mask;
113 frame f = to_frame();
114 f.interpreted_frame_oop_map(&mask);
115 return mask.num_oops()
116 + 1 // for the mirror oop
117 + (f.interpreter_frame_method()->is_native() ? 1 : 0) // temp oop slot
118 + pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(),
119 (intptr_t*)f.interpreter_frame_monitor_end())/BasicObjectLock::size();
120 }
121
122 template<>
123 template<>
124 inline void StackChunkFrameStream<ChunkFrames::Mixed>::update_reg_map_pd(RegisterMap* map) {
125 if (map->update_map()) {
126 frame::update_map_with_saved_link(map, map->in_cont() ? (intptr_t**)(intptr_t)frame::sender_sp_offset
127 : (intptr_t**)(_sp - frame::sender_sp_offset));
128 }
129 }
130
131 template<>
132 template<>
133 inline void StackChunkFrameStream<ChunkFrames::CompiledOnly>::update_reg_map_pd(RegisterMap* map) {
134 if (map->update_map()) {
135 frame::update_map_with_saved_link(map, map->in_cont() ? (intptr_t**)(intptr_t)frame::sender_sp_offset
136 : (intptr_t**)(_sp - frame::sender_sp_offset));
137 }
138 }
139
|
88 _sp = fp + frame::sender_sp_offset;
89 }
90 }
91
92 template <ChunkFrames frame_kind>
93 inline int StackChunkFrameStream<frame_kind>::interpreter_frame_size() const {
94 assert_is_interpreted_and_frame_type_mixed();
95
96 intptr_t* top = unextended_sp(); // later subtract argsize if callee is interpreted
97 intptr_t* bottom = derelativize(frame::interpreter_frame_locals_offset) + 1; // the sender's unextended sp: derelativize(frame::interpreter_frame_sender_sp_offset);
98 return (int)(bottom - top);
99 }
100
101 template <ChunkFrames frame_kind>
102 inline int StackChunkFrameStream<frame_kind>::interpreter_frame_stack_argsize() const {
103 assert_is_interpreted_and_frame_type_mixed();
104 int diff = (int)(derelativize(frame::interpreter_frame_locals_offset) - derelativize(frame::interpreter_frame_sender_sp_offset) + 1);
105 return diff;
106 }
107
108 class InterpreterOopCount : public OopClosure {
109 int _count;
110 public:
111 InterpreterOopCount() : _count(0) {}
112 void do_oop(oop* p) override { _count++; }
113 void do_oop(narrowOop* p) override { _count++; }
114 int count() { return _count; }
115 };
116
117 template <ChunkFrames frame_kind>
118 template <typename RegisterMapT>
119 inline int StackChunkFrameStream<frame_kind>::interpreter_frame_num_oops(RegisterMapT* map) const {
120 assert_is_interpreted_and_frame_type_mixed();
121 ResourceMark rm;
122 frame f = to_frame();
123 InterpreterOopCount closure;
124 f.oops_interpreted_do(&closure, map, false);
125 return closure.count();
126 }
127
128 template<>
129 template<>
130 inline void StackChunkFrameStream<ChunkFrames::Mixed>::update_reg_map_pd(RegisterMap* map) {
131 if (map->update_map()) {
132 frame::update_map_with_saved_link(map, map->in_cont() ? (intptr_t**)(intptr_t)frame::sender_sp_offset
133 : (intptr_t**)(_sp - frame::sender_sp_offset));
134 }
135 }
136
137 template<>
138 template<>
139 inline void StackChunkFrameStream<ChunkFrames::CompiledOnly>::update_reg_map_pd(RegisterMap* map) {
140 if (map->update_map()) {
141 frame::update_map_with_saved_link(map, map->in_cont() ? (intptr_t**)(intptr_t)frame::sender_sp_offset
142 : (intptr_t**)(_sp - frame::sender_sp_offset));
143 }
144 }
145
|