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.
This commit is contained in:
Koichi Sasada 2021-12-23 15:51:13 +09:00
parent 25e417b773
commit ca032d5eea
Notes: git 2021-12-23 16:50:15 +09:00
2 changed files with 7 additions and 7 deletions

9
gc.c
View File

@ -6363,8 +6363,6 @@ rb_mark_hash(st_table *tbl)
mark_st(&rb_objspace, 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 static void
mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me) mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me)
{ {
@ -6378,11 +6376,12 @@ mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me)
case VM_METHOD_TYPE_ISEQ: case VM_METHOD_TYPE_ISEQ:
if (def->body.iseq.iseqptr) gc_mark(objspace, (VALUE)def->body.iseq.iseqptr); if (def->body.iseq.iseqptr) gc_mark(objspace, (VALUE)def->body.iseq.iseqptr);
gc_mark(objspace, (VALUE)def->body.iseq.cref); 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)) { 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); gc_mark_and_pin(objspace, (VALUE)me);
} }
}
break; break;
case VM_METHOD_TYPE_ATTRSET: case VM_METHOD_TYPE_ATTRSET:
case VM_METHOD_TYPE_IVAR: case VM_METHOD_TYPE_IVAR:

View File

@ -979,12 +979,13 @@ lookup_overloaded_cme(const rb_callable_method_entry_t *cme)
return monly_cme; return monly_cme;
} }
// used by gc.c #if VM_CHECK_MODE > 0
MJIT_FUNC_EXPORTED const rb_callable_method_entry_t * MJIT_FUNC_EXPORTED const rb_callable_method_entry_t *
rb_vm_lookup_overloaded_cme(const rb_callable_method_entry_t *cme) rb_vm_lookup_overloaded_cme(const rb_callable_method_entry_t *cme)
{ {
return lookup_overloaded_cme(cme); return lookup_overloaded_cme(cme);
} }
#endif
static void static void
delete_overloaded_cme(const rb_callable_method_entry_t *cme) delete_overloaded_cme(const rb_callable_method_entry_t *cme)