diff options
author | Koichi Sasada <[email protected]> | 2021-12-23 15:51:13 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2021-12-23 16:49:49 +0900 |
commit | ca032d5eeaf81692f89f35c55450dcb97df59e16 (patch) | |
tree | f3c1e534a718b9459afb08e1f82ea7d54618e0f0 /gc.c | |
parent | 25e417b773b6f4b78c27a79e06c1277e7a5cf342 (diff) |
undef `rb_vm_lookup_overloaded_cme()`
Some callable method entries (cme) can be a key of `overloaded_cme_table`
and the keys should be pinned because the table is numtable (VALUE is a key).
Before the patch GC checks the cme is in `overloaded_cme_table` by looking up
the table, but it needs VM locking.
It works well in normal GC marking because it is protected by the VM lock,
but it doesn't work on `rb_objspace_reachable_objects_from` because it doesn't
use VM lock.
Now, the number of target cmes are small enough, I decide to pin down
all possible cmes instead of using looking up the table.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5327
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 11 |
1 files changed, 5 insertions, 6 deletions
@@ -6363,8 +6363,6 @@ rb_mark_hash(st_table *tbl) mark_st(&rb_objspace, tbl); } -const rb_callable_method_entry_t *rb_vm_lookup_overloaded_cme(const rb_callable_method_entry_t *cme); - static void mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me) { @@ -6378,10 +6376,11 @@ mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me) case VM_METHOD_TYPE_ISEQ: if (def->body.iseq.iseqptr) gc_mark(objspace, (VALUE)def->body.iseq.iseqptr); gc_mark(objspace, (VALUE)def->body.iseq.cref); - if (def->iseq_overload && me->defined_class) { // cme - if (rb_vm_lookup_overloaded_cme((const rb_callable_method_entry_t *)me)) { - gc_mark_and_pin(objspace, (VALUE)me); - } + + if (def->iseq_overload && me->defined_class) { + // it can be a key of "overloaded_cme" table + // so it should be pinned. + gc_mark_and_pin(objspace, (VALUE)me); } break; case VM_METHOD_TYPE_ATTRSET: |