summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2021-12-21 14:06:02 +0900
committerKoichi Sasada <ko1@atdot.net>2021-12-21 15:21:30 +0900
commitad450c9fe51c51626dd07f6e766f47d839cae3ba (patch)
treef61545a929b263b3df661cd02b8affca12f12637 /gc.c
parent3c7e95966d6b9efd201170eb59b0e4a3c4eb6134 (diff)
make `overloaded_cme_table` truly weak key map
`overloaded_cme_table` keeps cme -> monly_cme pairs to manage corresponding `monly_cme` for `cme`. The lifetime of the `monly_cme` should be longer than `monly_cme`, but the previous patch losts the reference to the living `monly_cme`. Now `overloaded_cme_table` values are always root (keys are only weak reference), it means `monly_cme` does not freed until corresponding `cme` is invalidated. To make managing easy, move `overloaded_cme_table` to `rb_vm_t`.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5316
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/gc.c b/gc.c
index 5fd46defb4..c4cac9bd07 100644
--- a/gc.c
+++ b/gc.c
@@ -6379,9 +6379,7 @@ mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me)
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
- const rb_callable_method_entry_t *monly_cme = rb_vm_lookup_overloaded_cme((const rb_callable_method_entry_t *)me);
- if (monly_cme) {
- gc_mark(objspace, (VALUE)monly_cme);
+ if (rb_vm_lookup_overloaded_cme((const rb_callable_method_entry_t *)me)) {
gc_mark_and_pin(objspace, (VALUE)me);
}
}
@@ -10113,9 +10111,6 @@ gc_ref_update(void *vstart, void *vend, size_t stride, rb_objspace_t * objspace,
extern rb_symbols_t ruby_global_symbols;
#define global_symbols ruby_global_symbols
-
-st_table *rb_vm_overloaded_cme_table(void);
-
static void
gc_update_references(rb_objspace_t *objspace)
{
@@ -10151,7 +10146,6 @@ gc_update_references(rb_objspace_t *objspace)
gc_update_table_refs(objspace, objspace->id_to_obj_tbl);
gc_update_table_refs(objspace, global_symbols.str_sym);
gc_update_table_refs(objspace, finalizer_table);
- gc_update_table_refs(objspace, rb_vm_overloaded_cme_table());
}
static VALUE