226 UpcallStub* blob = _cb->as_upcall_stub();
227 JavaFrameAnchor* jfa = blob->jfa_for_frame(*this);
228 return jfa->last_Java_sp() == nullptr;
229 }
230
231 frame frame::sender_for_upcall_stub_frame(RegisterMap* map) const {
232 assert(map != nullptr, "map must be set");
233 UpcallStub* blob = _cb->as_upcall_stub();
234 // Java frame called from C; skip all C frames and return top C
235 // frame of that chunk as the sender
236 JavaFrameAnchor* jfa = blob->jfa_for_frame(*this);
237 assert(!upcall_stub_frame_is_first(), "must have a frame anchor to go back to");
238 assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack");
239 map->clear();
240 assert(map->include_argument_oops(), "should be set by clear");
241 frame fr(jfa->last_Java_sp(), jfa->last_Java_pc(), kind::code_blob);
242
243 return fr;
244 }
245
246 frame frame::sender_for_interpreter_frame(RegisterMap *map) const {
247 // This is the sp before any possible extension (adapter/locals).
248 intptr_t* unextended_sp = interpreter_frame_sender_sp();
249 address sender_pc = this->sender_pc();
250 if (Continuation::is_return_barrier_entry(sender_pc)) {
251 if (map->walk_cont()) { // about to walk into an h-stack
252 return Continuation::top_frame(*this, map);
253 } else {
254 return Continuation::continuation_bottom_sender(map->thread(), *this, sender_sp());
255 }
256 }
257
258 return frame(sender_sp(), sender_pc, unextended_sp);
259 }
260
261 // locals
262
263 void frame::interpreter_frame_set_locals(intptr_t* locs) {
264 assert(is_interpreted_frame(), "interpreted frame expected");
265 // set relativized locals
|
226 UpcallStub* blob = _cb->as_upcall_stub();
227 JavaFrameAnchor* jfa = blob->jfa_for_frame(*this);
228 return jfa->last_Java_sp() == nullptr;
229 }
230
231 frame frame::sender_for_upcall_stub_frame(RegisterMap* map) const {
232 assert(map != nullptr, "map must be set");
233 UpcallStub* blob = _cb->as_upcall_stub();
234 // Java frame called from C; skip all C frames and return top C
235 // frame of that chunk as the sender
236 JavaFrameAnchor* jfa = blob->jfa_for_frame(*this);
237 assert(!upcall_stub_frame_is_first(), "must have a frame anchor to go back to");
238 assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack");
239 map->clear();
240 assert(map->include_argument_oops(), "should be set by clear");
241 frame fr(jfa->last_Java_sp(), jfa->last_Java_pc(), kind::code_blob);
242
243 return fr;
244 }
245
246 JavaThread** frame::saved_thread_address(const frame& f) {
247 // The current thread (JavaThread*) is never stored on the stack
248 return nullptr;
249 }
250
251 frame frame::sender_for_interpreter_frame(RegisterMap *map) const {
252 // This is the sp before any possible extension (adapter/locals).
253 intptr_t* unextended_sp = interpreter_frame_sender_sp();
254 address sender_pc = this->sender_pc();
255 if (Continuation::is_return_barrier_entry(sender_pc)) {
256 if (map->walk_cont()) { // about to walk into an h-stack
257 return Continuation::top_frame(*this, map);
258 } else {
259 return Continuation::continuation_bottom_sender(map->thread(), *this, sender_sp());
260 }
261 }
262
263 return frame(sender_sp(), sender_pc, unextended_sp);
264 }
265
266 // locals
267
268 void frame::interpreter_frame_set_locals(intptr_t* locs) {
269 assert(is_interpreted_frame(), "interpreted frame expected");
270 // set relativized locals
|