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