summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2022-07-27 11:18:29 -0400
committerPeter Zhu <peter@peterzhu.ca>2022-07-28 10:02:12 -0400
commit2375afb8d6fd218cd9083749d87a7a59946d8938 (patch)
tree98392f1c9d603df9eecd248e9e33a6d602cdf07b /gc.c
parent3eade599194dac960bc5b81c3f1bcff4a460b959 (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.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/gc.c b/gc.c
index 75f0658829..84f9aa30f6 100644
--- a/gc.c
+++ b/gc.c
@@ -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: