From 70624ae43d72b94c12e7fe717e0b9d5456bcadda Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 18 Sep 2021 16:15:24 +0900 Subject: Extract hook macro for attributes --- vm_insnhelper.c | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) (limited to 'vm_insnhelper.c') diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 9ffe3ee792..bbb62d8397 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -3468,11 +3468,25 @@ vm_call_refined(rb_execution_context_t *ec, rb_control_frame_t *cfp, struct rb_c } } +#define VM_CALL_METHOD_ATTR(var, func, nohook) \ + if (UNLIKELY(ruby_vm_event_flags & (RUBY_EVENT_C_CALL | RUBY_EVENT_C_RETURN))) { \ + EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_CALL, calling->recv, vm_cc_cme(cc)->def->original_id, \ + vm_ci_mid(ci), vm_cc_cme(cc)->owner, Qundef); \ + var = func; \ + EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_RETURN, calling->recv, vm_cc_cme(cc)->def->original_id, \ + vm_ci_mid(ci), vm_cc_cme(cc)->owner, (var)); \ + } \ + else { \ + nohook; \ + var = func; \ + } + static VALUE vm_call_method_each_type(rb_execution_context_t *ec, rb_control_frame_t *cfp, struct rb_calling_info *calling) { const struct rb_callinfo *ci = calling->ci; const struct rb_callcache *cc = calling->cc; + VALUE v; switch (vm_cc_cme(cc)->def->type) { case VM_METHOD_TYPE_ISEQ: @@ -3490,40 +3504,22 @@ vm_call_method_each_type(rb_execution_context_t *ec, rb_control_frame_t *cfp, st rb_check_arity(calling->argc, 1, 1); vm_cc_attr_index_set(cc, 0); - if (UNLIKELY(ruby_vm_event_flags & (RUBY_EVENT_C_CALL | RUBY_EVENT_C_RETURN))) { - const struct rb_callinfo *ci = calling->ci; - VALUE v; - EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_CALL, calling->recv, vm_cc_cme(cc)->def->original_id, - vm_ci_mid(ci), vm_cc_cme(cc)->owner, Qundef); - v = vm_call_attrset(ec, cfp, calling); - EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_RETURN, calling->recv, vm_cc_cme(cc)->def->original_id, - vm_ci_mid(ci), vm_cc_cme(cc)->owner, v); - return v; - } - else { - CC_SET_FASTPATH(cc, vm_call_attrset, !(vm_ci_flag(ci) & (VM_CALL_ARGS_SPLAT | VM_CALL_KW_SPLAT | VM_CALL_KWARG))); - return vm_call_attrset(ec, cfp, calling); - } + const unsigned int aset_mask = (VM_CALL_ARGS_SPLAT | VM_CALL_KW_SPLAT | VM_CALL_KWARG); + VM_CALL_METHOD_ATTR(v, + vm_call_attrset(ec, cfp, calling), + CC_SET_FASTPATH(cc, vm_call_attrset, !(vm_ci_flag(ci) & aset_mask))); + return v; case VM_METHOD_TYPE_IVAR: CALLER_SETUP_ARG(cfp, calling, ci); CALLER_REMOVE_EMPTY_KW_SPLAT(cfp, calling, ci); rb_check_arity(calling->argc, 0, 0); vm_cc_attr_index_set(cc, 0); - if (UNLIKELY(ruby_vm_event_flags & (RUBY_EVENT_C_CALL | RUBY_EVENT_C_RETURN))) { - const struct rb_callinfo *ci = calling->ci; - VALUE v; - EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_CALL, calling->recv, vm_cc_cme(cc)->def->original_id, - vm_ci_mid(ci), vm_cc_cme(cc)->owner, Qundef); - v = vm_call_ivar(ec, cfp, calling); - EXEC_EVENT_HOOK(ec, RUBY_EVENT_C_RETURN, calling->recv, vm_cc_cme(cc)->def->original_id, - vm_ci_mid(ci), vm_cc_cme(cc)->owner, v); - return v; - } - else { - CC_SET_FASTPATH(cc, vm_call_ivar, !(vm_ci_flag(ci) & (VM_CALL_ARGS_SPLAT | VM_CALL_KW_SPLAT))); - return vm_call_ivar(ec, cfp, calling); - } + const unsigned int ivar_mask = (VM_CALL_ARGS_SPLAT | VM_CALL_KW_SPLAT); + VM_CALL_METHOD_ATTR(v, + vm_call_ivar(ec, cfp, calling), + CC_SET_FASTPATH(cc, vm_call_ivar, !(vm_ci_flag(ci) & ivar_mask))); + return v; case VM_METHOD_TYPE_MISSING: vm_cc_method_missing_reason_set(cc, 0); -- cgit v1.2.3