/* De-optimizes the current frame by directly specifying the addresses */ void MVM_spesh_deopt_one_direct(MVMThreadContext *tc, MVMint32 deopt_offset, MVMint32 deopt_target) { MVMFrame *f = tc->cur_frame; if (f->effective_bytecode != f->static_info->body.bytecode) { deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); } else { MVM_exception_throw_adhoc(tc, "deopt_one_direct failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } }
/* De-optimizes the current frame by directly specifying the addresses */ void MVM_spesh_deopt_one_direct(MVMThreadContext *tc, MVMint32 deopt_offset, MVMint32 deopt_target) { MVMFrame *f = tc->cur_frame; if (tc->instance->profiling) MVM_profiler_log_deopt_one(tc); if (f->effective_bytecode != f->static_info->body.bytecode) { deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); } else { MVM_oops(tc, "deopt_one_direct failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } }
/* De-optimizes the currently executing frame, provided it is specialized and * at a valid de-optimization point. Typically used when a guard fails. */ void MVM_spesh_deopt_one(MVMThreadContext *tc) { MVMFrame *f = tc->cur_frame; /*fprintf(stderr, "deopt_one requested in frame '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid));*/ if (f->effective_bytecode != f->static_info->body.bytecode) { MVMint32 deopt_offset = *(tc->interp_cur_op) - f->effective_bytecode; MVMint32 deopt_target = find_deopt_target(tc, f, deopt_offset); deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); } else { MVM_exception_throw_adhoc(tc, "deopt_one failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } }