summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <[email protected]>2021-07-06 15:11:49 -0700
committerAaron Patterson <[email protected]>2021-07-06 17:48:40 -0700
commit2599d1a8dff29a2376f36c8cc301839b454fc064 (patch)
tree8558da8e425fc58ec14c501f7aa1fdc3c381bf4a
parent91258ed4490652e4c44ceca447ed1ebb5ec48ca3 (diff)
Store the dup'd CDHASH in the object list during IBF load
Since b2fc592c304 nothing was holding a reference to the dup'd CDHASH during IBF loading. If a GC happened to run during IBF load then the copied hash wouldn't have anything to keep it alive. We don't really want to keep the originally loaded CDHASH hash, so this patch just overwrites the original hash with the copied / modified hash. [Bug #17984] [ruby-core:104259]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4630
-rw-r--r--compile.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index a73a5be9a1..a7862194c0 100644
--- a/compile.c
+++ b/compile.c
@@ -10797,6 +10797,11 @@ ibf_load_code(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t bytecod
rb_hash_rehash(v); // hash function changed
freeze_hide_obj(v);
+ // Overwrite the existing hash in the object list. This
+ // is to keep the object alive during load time.
+ // [Bug #17984] [ruby-core:104259]
+ pinned_list_store(load->current_buffer->obj_list, (long)op, v);
+
code[code_index] = v;
RB_OBJ_WRITTEN(iseqv, Qundef, v);
FL_SET(iseqv, ISEQ_MARKABLE_ISEQ);