inline void unpack_first_frame(char* ¤t_pc, frame ¤t, CodeIterator &c) { // first vframe in the array if (nlr_through_unpacking) { // NLR is comming through unpacked vframes current_pc = c.interpreter_return_point(); // current_pc points to a normal return point in the interpreter. // To find the nlr return point we first compute the nlr offset. current_pc = ic_info_at(current_pc)->NLR_target(); current.set_hp(c.next_hp()); } else if (redo_the_send) { // Deoptimizing uncommon trap current_pc = Interpreter::redo_bytecode_after_deoptimization(); current.set_hp(c.next_hp()); redo_send_offset = c.next_hp() - c.hp(); redo_the_send = false; } else { // Normal case current_pc = c.interpreter_return_point(true); current.set_hp(c.next_hp()); if (c.is_message_send()) { number_of_arguments_through_unpacking = c.ic()->nof_arguments(); } else if (c.is_primitive_call()) { number_of_arguments_through_unpacking = c.prim_cache()->number_of_parameters(); } else if (c.is_dll_call()) { // The callee should not pop the argument since a DLL call is like a c function call. // The continuation code for the DLL call will pop the arguments! number_of_arguments_through_unpacking = 0; } } }