Skip to content

Commit 31c98e8

Browse files
committed
Avoid unnecessary allocations
1 parent d0e579e commit 31c98e8

2 files changed

Lines changed: 29 additions & 17 deletions

File tree

object.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,10 +2950,16 @@ rb_obj_ivar_set_m(VALUE obj, VALUE iv, VALUE val)
29502950
{
29512951
ID id = id_for_var(obj, iv, instance);
29522952
if (!id) id = rb_intern_str(iv);
2953-
VALUE pair = rb_ary_new_capa(2);
2954-
rb_ary_push(pair, iv);
2955-
rb_ary_push(pair, val);
2956-
EXEC_EVENT_HOOK(GET_EC(), RUBY_EVENT_IVAR_SET, obj, id, 0, 0, pair);
2953+
2954+
bool ivar_set_event_enabled = (ruby_vm_event_enabled_global_flags & RUBY_EVENT_IVAR_SET) &&
2955+
(ruby_vm_event_flags & RUBY_EVENT_IVAR_SET);
2956+
2957+
if (ivar_set_event_enabled) {
2958+
VALUE pair = rb_ary_new_capa(2);
2959+
rb_ary_push(pair, iv);
2960+
rb_ary_push(pair, val);
2961+
EXEC_EVENT_HOOK(GET_EC(), RUBY_EVENT_IVAR_SET, obj, id, 0, 0, pair);
2962+
}
29572963
return rb_ivar_set(obj, id, val);
29582964
}
29592965

vm_insnhelper.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,11 +1642,16 @@ vm_setinstancevariable(const rb_iseq_t *iseq, VALUE obj, ID id, VALUE val, IVC i
16421642
attr_index_t index;
16431643
vm_ic_atomic_shape_and_index(ic, &dest_shape_id, &index);
16441644

1645-
VALUE pair = rb_ary_new_capa(2);
1646-
rb_ary_push(pair, rb_id2sym(id));
1647-
rb_ary_push(pair, val);
1645+
bool ivar_set_event_enabled = (ruby_vm_event_enabled_global_flags & RUBY_EVENT_IVAR_SET) &&
1646+
(ruby_vm_event_flags & RUBY_EVENT_IVAR_SET);
16481647

1649-
EXEC_EVENT_HOOK(GET_EC(), RUBY_EVENT_IVAR_SET, obj, id, 0, 0, pair);
1648+
if (ivar_set_event_enabled) {
1649+
VALUE pair = rb_ary_new_capa(2);
1650+
rb_ary_push(pair, rb_id2sym(id));
1651+
rb_ary_push(pair, val);
1652+
1653+
EXEC_EVENT_HOOK(GET_EC(), RUBY_EVENT_IVAR_SET, obj, id, 0, 0, pair);
1654+
}
16501655

16511656
if (UNLIKELY(UNDEF_P(vm_setivar(obj, id, val, dest_shape_id, index)))) {
16521657
switch (BUILTIN_TYPE(obj)) {
@@ -4759,15 +4764,15 @@ vm_call_method_each_type(rb_execution_context_t *ec, rb_control_frame_t *cfp, st
47594764
rb_check_arity(calling->argc, 1, 1);
47604765

47614766
const unsigned int aset_mask = (VM_CALL_ARGS_SPLAT | VM_CALL_KW_SPLAT | VM_CALL_KWARG | VM_CALL_FORWARDING);
4767+
bool ivar_set_event_enabled = (ruby_vm_event_enabled_global_flags & RUBY_EVENT_IVAR_SET) && (ruby_vm_event_flags & RUBY_EVENT_IVAR_SET);
47624768

47634769
if (vm_cc_markable(cc)) {
47644770
vm_cc_attr_index_initialize(cc, INVALID_SHAPE_ID);
47654771
VM_CALL_METHOD_ATTR(v,
47664772
vm_call_attrset_direct(ec, cfp, cc, calling->recv),
47674773
CC_SET_FASTPATH(cc, vm_call_attrset,
47684774
!(vm_ci_flag(ci) & aset_mask) &&
4769-
!(ruby_vm_event_flags & RUBY_EVENT_IVAR_SET) &&
4770-
!(ruby_vm_event_enabled_global_flags & RUBY_EVENT_IVAR_SET)));
4775+
!ivar_set_event_enabled));
47714776
}
47724777
else {
47734778
cc = &((struct rb_callcache) {
@@ -4789,15 +4794,16 @@ vm_call_method_each_type(rb_execution_context_t *ec, rb_control_frame_t *cfp, st
47894794
vm_call_attrset_direct(ec, cfp, cc, calling->recv),
47904795
CC_SET_FASTPATH(cc, vm_call_attrset,
47914796
!(vm_ci_flag(ci) & aset_mask) &&
4792-
!(ruby_vm_event_flags & RUBY_EVENT_IVAR_SET) &&
4793-
!(ruby_vm_event_enabled_global_flags & RUBY_EVENT_IVAR_SET)));
4797+
!ivar_set_event_enabled));
47944798
}
47954799

4796-
ID mid = vm_cc_cme(cc)->def->body.attr.id;
4797-
VALUE pair = rb_ary_new_capa(2);
4798-
rb_ary_push(pair, rb_id2sym(mid));
4799-
rb_ary_push(pair, v);
4800-
EXEC_EVENT_HOOK(ec, RUBY_EVENT_IVAR_SET, calling->recv, mid, mid, 0, pair);
4800+
if (ivar_set_event_enabled) {
4801+
ID mid = vm_cc_cme(cc)->def->body.attr.id;
4802+
VALUE pair = rb_ary_new_capa(2);
4803+
rb_ary_push(pair, rb_id2sym(mid));
4804+
rb_ary_push(pair, v);
4805+
EXEC_EVENT_HOOK(ec, RUBY_EVENT_IVAR_SET, calling->recv, mid, mid, 0, pair);
4806+
}
48014807

48024808
return v;
48034809

0 commit comments

Comments
 (0)