diff options
| author | Koichi Sasada <ko1@atdot.net> | 2025-09-25 05:50:05 +0900 |
|---|---|---|
| committer | Koichi Sasada <ko1@atdot.net> | 2025-10-23 13:08:26 +0900 |
| commit | bc00c4468e0054ca896d2b83d3020180915f64cf (patch) | |
| tree | 3942c12dbba8254925400f16c022661dcbb7ffb0 /vm_method.c | |
| parent | 45907b1b00d09ce2c40f5073ff540d8b63217d96 (diff) | |
use `SET_SHAREABLE`
to adopt strict shareable rule.
* (basically) shareable objects only refer shareable objects
* (exception) shareable objects can refere unshareable objects
but should not leak reference to unshareable objects to Ruby world
Diffstat (limited to 'vm_method.c')
| -rw-r--r-- | vm_method.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/vm_method.c b/vm_method.c index 60c273ff2f..2cd41bd377 100644 --- a/vm_method.c +++ b/vm_method.c @@ -682,7 +682,7 @@ rb_vm_ci_lookup(ID mid, unsigned int flag, unsigned int argc, const struct rb_ca ((struct rb_callinfo_kwarg *)kwarg)->references++; } - struct rb_callinfo *new_ci = IMEMO_NEW(struct rb_callinfo, imemo_callinfo, (VALUE)kwarg); + struct rb_callinfo *new_ci = SHAREABLE_IMEMO_NEW(struct rb_callinfo, imemo_callinfo, (VALUE)kwarg); new_ci->mid = mid; new_ci->flag = flag; new_ci->argc = argc; @@ -1008,7 +1008,9 @@ rb_method_definition_set(const rb_method_entry_t *me, rb_method_definition_t *de if (cfp && (line = rb_vm_get_sourceline(cfp))) { VALUE location = rb_ary_new3(2, rb_iseq_path(cfp->iseq), INT2FIX(line)); - RB_OBJ_WRITE(me, &def->body.attr.location, rb_ary_freeze(location)); + rb_ary_freeze(location); + RB_OBJ_SET_SHAREABLE(location); + RB_OBJ_WRITE(me, &def->body.attr.location, location); } else { VM_ASSERT(def->body.attr.location == 0); @@ -1099,7 +1101,7 @@ rb_method_entry_alloc(ID called_id, VALUE owner, VALUE defined_class, rb_method_ // not negative cache VM_ASSERT_TYPE2(defined_class, T_CLASS, T_ICLASS); } - rb_method_entry_t *me = IMEMO_NEW(rb_method_entry_t, imemo_ment, defined_class); + rb_method_entry_t *me = SHAREABLE_IMEMO_NEW(rb_method_entry_t, imemo_ment, defined_class); *((rb_method_definition_t **)&me->def) = def; me->called_id = called_id; me->owner = owner; |
