BIF_RETTYPE hipe_bifs_call_count_get_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; pc = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] != BeamOpCode(op_hipe_call_count)) BIF_RET(am_false); hcc = (struct hipe_call_count*)pc[-4]; BIF_RET(make_small(hcc->count)); }
BIF_RETTYPE hipe_bifs_call_count_get_1(BIF_ALIST_1) { ErtsCodeInfo* ci; Eterm *pc; struct hipe_call_count *hcc; ci = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!ci) BIF_ERROR(BIF_P, BADARG); ASSERT(BeamIsOpCode(ci->op, op_i_func_info_IaaI)); pc = erts_codeinfo_to_code(ci); if (! BeamIsOpCode(pc[0], op_hipe_call_count)) BIF_RET(am_false); hcc = ci->u.hcc; BIF_RET(make_small(hcc->count)); }
BIF_RETTYPE hipe_bifs_call_count_clear_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; unsigned count; pc = hipe_bifs_find_pc_from_mfa(&loader_target_self, BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] != BeamOpCode(op_hipe_call_count)) BIF_RET(am_false); hcc = (struct hipe_call_count*)pc[-4]; count = hcc->count; hcc->count = 0; BIF_RET(make_small(count)); }
BIF_RETTYPE hipe_bifs_call_count_off_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; unsigned count; pc = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] != BeamOpCode(op_hipe_call_count)) BIF_RET(am_false); hcc = (struct hipe_call_count*)pc[-4]; count = hcc->count; pc[0] = hcc->opcode; pc[-4] = (Eterm)NULL; erts_free(ERTS_ALC_T_HIPE, hcc); BIF_RET(make_small(count)); }
BIF_RETTYPE hipe_bifs_call_count_on_1(BIF_ALIST_1) { Eterm *pc; struct hipe_call_count *hcc; pc = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!pc) BIF_ERROR(BIF_P, BADARG); ASSERT(pc[-5] == BeamOpCode(op_i_func_info_IaaI)); if (pc[0] == BeamOpCode(op_hipe_trap_call)) BIF_ERROR(BIF_P, BADARG); if (pc[0] == BeamOpCode(op_hipe_call_count)) BIF_RET(NIL); hcc = erts_alloc(ERTS_ALC_T_HIPE, sizeof(*hcc)); hcc->count = 0; hcc->opcode = pc[0]; pc[-4] = (Eterm)hcc; pc[0] = BeamOpCode(op_hipe_call_count); BIF_RET(am_true); }
BIF_RETTYPE hipe_bifs_call_count_off_1(BIF_ALIST_1) { ErtsCodeInfo* ci; Eterm *pc; struct hipe_call_count *hcc; unsigned count; ci = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!ci) BIF_ERROR(BIF_P, BADARG); ASSERT(BeamIsOpCode(ci->op, op_i_func_info_IaaI)); pc = erts_codeinfo_to_code(ci); if (! BeamIsOpCode(pc[0], op_hipe_call_count)) BIF_RET(am_false); hcc = ci->u.hcc; count = hcc->count; pc[0] = hcc->opcode; ci->u.hcc = NULL; erts_free(ERTS_ALC_T_HIPE_SL, hcc); BIF_RET(make_small(count)); }
BIF_RETTYPE hipe_bifs_call_count_on_1(BIF_ALIST_1) { ErtsCodeInfo *ci; Eterm *pc; struct hipe_call_count *hcc; ci = hipe_bifs_find_pc_from_mfa(BIF_ARG_1); if (!ci) BIF_ERROR(BIF_P, BADARG); ASSERT(BeamIsOpCode(ci->op, op_i_func_info_IaaI)); pc = erts_codeinfo_to_code(ci); if (BeamIsOpCode(pc[0], op_hipe_trap_call)) BIF_ERROR(BIF_P, BADARG); if (BeamIsOpCode(pc[0], op_hipe_call_count)) BIF_RET(NIL); hcc = erts_alloc(ERTS_ALC_T_HIPE_SL, sizeof(*hcc)); hcc->count = 0; hcc->opcode = pc[0]; ci->u.hcc = hcc; pc[0] = BeamOpCodeAddr(op_hipe_call_count); BIF_RET(am_true); }