diff options
author | Peter Zhu <peter@peterzhu.ca> | 2022-07-27 11:18:29 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2022-07-28 10:02:12 -0400 |
commit | 2375afb8d6fd218cd9083749d87a7a59946d8938 (patch) | |
tree | 98392f1c9d603df9eecd248e9e33a6d602cdf07b /gc.c | |
parent | 3eade599194dac960bc5b81c3f1bcff4a460b959 (diff) |
Refactor gc_ref_update_array
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6192
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 38 |
1 files changed, 18 insertions, 20 deletions
@@ -9957,16 +9957,26 @@ gc_sort_heap_by_empty_slots(rb_objspace_t *objspace) static void gc_ref_update_array(rb_objspace_t * objspace, VALUE v) { - long i, len; + if (ARY_SHARED_P(v)) { + UPDATE_IF_MOVED(objspace, RARRAY(v)->as.heap.aux.shared_root); + } + else { + long len = RARRAY_LEN(v); - if (ARY_SHARED_P(v)) return; + if (len > 0) { + VALUE *ptr = (VALUE *)RARRAY_CONST_PTR_TRANSIENT(v); + for (long i = 0; i < len; i++) { + UPDATE_IF_MOVED(objspace, ptr[i]); + } + } - len = RARRAY_LEN(v); - if (len > 0) { - VALUE *ptr = (VALUE *)RARRAY_CONST_PTR_TRANSIENT(v); - for (i = 0; i < len; i++) { - UPDATE_IF_MOVED(objspace, ptr[i]); +#if USE_RVARGC + if ((size_t)GET_HEAP_PAGE(v)->slot_size >= rb_ary_size_as_embedded(v)) { + if (rb_ary_embeddable_p(v)) { + rb_ary_make_embedded(v); + } } +#endif } } @@ -10466,19 +10476,7 @@ gc_update_object_references(rb_objspace_t *objspace, VALUE obj) return; case T_ARRAY: - if (ARY_SHARED_P(obj)) { - UPDATE_IF_MOVED(objspace, any->as.array.as.heap.aux.shared_root); - } - else { - gc_ref_update_array(objspace, obj); - } -#if USE_RVARGC - if ((size_t)GET_HEAP_PAGE(obj)->slot_size >= rb_ary_size_as_embedded(obj)) { - if (rb_ary_embeddable_p(obj)) { - rb_ary_make_embedded(obj); - } - } -#endif + gc_ref_update_array(objspace, obj); break; case T_HASH: |