diff options
author | Peter Zhu <peter@peterzhu.ca> | 2023-11-24 10:25:06 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-11-24 13:29:04 -0500 |
commit | 269c705f93c4db631f4cad89991bc5d69a7dcd03 (patch) | |
tree | ab71fb98e0a7465aae04ff3a2338222c58a51104 /internal | |
parent | e201b81f79828c30500947fe8c8ea3c515e3d112 (diff) | |
download | ruby-269c705f93c4db631f4cad89991bc5d69a7dcd03.tar.gz |
Fix compaction for generic ivars
When generic instance variable has a shape, it is marked movable. If it
it transitions to too complex, it needs to update references otherwise
it may have incorrect references.
Diffstat (limited to 'internal')
-rw-r--r-- | internal/gc.h | 2 | ||||
-rw-r--r-- | internal/variable.h | 3 |
2 files changed, 4 insertions, 1 deletions
diff --git a/internal/gc.h b/internal/gc.h index 188497b007..34a6043e8a 100644 --- a/internal/gc.h +++ b/internal/gc.h @@ -250,6 +250,8 @@ void rb_gc_mark_and_move(VALUE *ptr); void rb_gc_mark_weak(VALUE *ptr); void rb_gc_remove_weak(VALUE parent_obj, VALUE *ptr); +void rb_gc_ref_update_table_values_only(st_table *tbl); + #define rb_gc_mark_and_move_ptr(ptr) do { \ VALUE _obj = (VALUE)*(ptr); \ rb_gc_mark_and_move(&_obj); \ diff --git a/internal/variable.h b/internal/variable.h index 63b074a308..b2a30c7c58 100644 --- a/internal/variable.h +++ b/internal/variable.h @@ -53,7 +53,8 @@ void rb_evict_ivars_to_hash(VALUE obj); RUBY_SYMBOL_EXPORT_BEGIN /* variable.c (export) */ -void rb_mark_and_update_generic_ivar(VALUE); +void rb_mark_generic_ivar(VALUE obj); +void rb_ref_update_generic_ivar(VALUE); void rb_mv_generic_ivar(VALUE src, VALUE dst); VALUE rb_const_missing(VALUE klass, VALUE name); int rb_class_ivar_set(VALUE klass, ID vid, VALUE value); |