summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorAlan Wu <[email protected]>2023-11-17 17:57:25 -0500
committer<[email protected]>2023-11-17 17:57:25 -0500
commit24fe22a5da21c9df8584a4ce6b6d1ce18ac41cc2 ()
treecb038d1960cd21049ed7afe5fae962e8b44e9351 /vm_method.c
parentef72970a046270cc4b1d4ed029128876a9cbab88 (diff)
Fix ordering for auto compaction in get_overloaded_cme()
Found through GC.stress + GC.auto_compact crashes in GH-8932. Previously, the compaction run within `rb_method_entry_alloc()` could move the `def->body.iseq.cref` and `iseqptr` set up before the call and leave the `def` pointing to moved addresses. Nothing was marking `def` during that GC run. Low probability reproducer: GC.stress = true GC.auto_compact = true arr = [] alloc = 1000.times.map { [] } alloc = nil a = arr.first GC.start
-rw-r--r--vm_method.c6
1 files changed, 3 insertions, 3 deletions
@@ -1033,15 +1033,15 @@ get_overloaded_cme(const rb_callable_method_entry_t *cme)
else {
// create
rb_method_definition_t *def = rb_method_definition_create(VM_METHOD_TYPE_ISEQ, cme->def->original_id);
- def->body.iseq.cref = cme->def->body.iseq.cref;
- def->body.iseq.iseqptr = ISEQ_BODY(cme->def->body.iseq.iseqptr)->mandatory_only_iseq;
-
rb_method_entry_t *me = rb_method_entry_alloc(cme->called_id,
cme->owner,
cme->defined_class,
def,
false);
ASSERT_vm_locking();
st_insert(overloaded_cme_table(), (st_data_t)cme, (st_data_t)me);