summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2023-03-17 11:29:04 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2023-03-20 13:54:18 -0700
commit54dbd8bea8a79bfcdefa471c1717c6cd28022f33 (patch)
treea192755d979ae7db2a47616450d8a32332855809 /gc.c
parent51834ff2ec4fba7fa4d62b04365c1c9c5b6700f1 (diff)
Use an st table for "too complex" objects
st tables will maintain insertion order so we can marshal dump / load objects with instance variables in the same order they were set on that particular instance [ruby-core:112926] [Bug #19535] Co-Authored-By: Jemma Issroff <jemmaissroff@gmail.com>
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7560
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/gc.c b/gc.c
index 06a4bacfb8..af789bc9ee 100644
--- a/gc.c
+++ b/gc.c
@@ -3512,7 +3512,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
case T_OBJECT:
if (rb_shape_obj_too_complex(obj)) {
RB_DEBUG_COUNTER_INC(obj_obj_too_complex);
- rb_id_table_free(ROBJECT_IV_HASH(obj));
+ st_free_table(ROBJECT_IV_HASH(obj));
}
else if (RANY(obj)->as.basic.flags & ROBJECT_EMBED) {
RB_DEBUG_COUNTER_INC(obj_obj_embed);
@@ -4910,7 +4910,7 @@ obj_memsize_of(VALUE obj, int use_all_types)
switch (BUILTIN_TYPE(obj)) {
case T_OBJECT:
if (rb_shape_obj_too_complex(obj)) {
- size += rb_id_table_memsize(ROBJECT_IV_HASH(obj));
+ size += rb_st_memsize(ROBJECT_IV_HASH(obj));
}
else if (!(RBASIC(obj)->flags & ROBJECT_EMBED)) {
size += ROBJECT_IV_CAPACITY(obj) * sizeof(VALUE);
@@ -7400,7 +7400,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE obj)
{
rb_shape_t *shape = rb_shape_get_shape_by_id(ROBJECT_SHAPE_ID(obj));
if (rb_shape_obj_too_complex(obj)) {
- mark_m_tbl(objspace, ROBJECT_IV_HASH(obj));
+ mark_tbl_no_pin(objspace, ROBJECT_IV_HASH(obj));
}
else {
const VALUE * const ptr = ROBJECT_IVPTR(obj);
@@ -10117,15 +10117,13 @@ gc_ref_update_array(rb_objspace_t * objspace, VALUE v)
}
}
-static void update_m_tbl(rb_objspace_t *objspace, struct rb_id_table *tbl);
-
static void
gc_ref_update_object(rb_objspace_t *objspace, VALUE v)
{
VALUE *ptr = ROBJECT_IVPTR(v);
if (rb_shape_obj_too_complex(v)) {
- update_m_tbl(objspace, ROBJECT_IV_HASH(v));
+ rb_gc_update_tbl_refs(ROBJECT_IV_HASH(v));
return;
}