diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2023-10-19 16:01:35 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2023-10-24 10:52:06 -0700 |
commit | a3f66e09f6596259677f00255a9b6231a2739774 (patch) | |
tree | addc47766e34c520307baab7952343855af872e0 /gc.c | |
parent | caf6a72348431e0e6b61be84919cd06c7a745189 (diff) |
geniv objects can become too complex
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -3533,9 +3533,13 @@ obj_free(rb_objspace_t *objspace, VALUE obj) case T_CLASS: rb_id_table_free(RCLASS_M_TBL(obj)); cc_table_free(objspace, obj, FALSE); - if (RCLASS_IVPTR(obj)) { + if (rb_shape_obj_too_complex(obj)) { + st_free_table((st_table *)RCLASS_IVPTR(obj)); + } + else if (RCLASS_IVPTR(obj)) { xfree(RCLASS_IVPTR(obj)); } + if (RCLASS_CONST_TBL(obj)) { rb_free_const_table(RCLASS_CONST_TBL(obj)); } @@ -7256,8 +7260,13 @@ gc_mark_children(rb_objspace_t *objspace, VALUE obj) mark_m_tbl(objspace, RCLASS_M_TBL(obj)); mark_cvc_tbl(objspace, obj); cc_table_mark(objspace, obj); - for (attr_index_t i = 0; i < RCLASS_IV_COUNT(obj); i++) { - gc_mark(objspace, RCLASS_IVPTR(obj)[i]); + if (rb_shape_obj_too_complex(obj)) { + mark_tbl(objspace, (st_table *)RCLASS_IVPTR(obj)); + } + else { + for (attr_index_t i = 0; i < RCLASS_IV_COUNT(obj); i++) { + gc_mark(objspace, RCLASS_IVPTR(obj)[i]); + } } mark_const_tbl(objspace, RCLASS_CONST_TBL(obj)); |