diff options
author | Jemma Issroff <jemmaissroff@gmail.com> | 2022-10-20 14:50:41 -0400 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2022-10-21 10:57:05 -0700 |
commit | f2ae58119d9581dee467b0a7f05173eca3b2dfea (patch) | |
tree | bd88011a256a9101a26af4835a214ad1a7b22141 | |
parent | 35e03a44b815c1111e3947ba526a5de0bdf82c82 (diff) | |
download | ruby-f2ae58119d9581dee467b0a7f05173eca3b2dfea.tar.gz |
In init_copy, set shape after copying ivars
GC uses shapes to determine IV buffer width. Since allocation can
trigger GC, we need to ensure we only set the shape once we've fully
allocated new memory for the IV buffer, otherwise the GC can end up
trying to mark invalid memory.
-rw-r--r-- | object.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -306,12 +306,12 @@ init_copy(VALUE dest, VALUE obj) shape_to_set = rb_shape_get_shape_by_id(shape_to_set->parent_id); } - // shape ids are different - rb_shape_set_shape(dest, shape_to_set); - if (RB_TYPE_P(obj, T_OBJECT)) { rb_obj_copy_ivar(dest, obj); } + + // shape ids are different + rb_shape_set_shape(dest, shape_to_set); } static VALUE immutable_obj_clone(VALUE obj, VALUE kwfreeze); |