1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Refactor gc_ref_update_array

This commit is contained in:
Peter Zhu 2022-07-27 11:18:29 -04:00
parent 3eade59919
commit 2375afb8d6
Notes: git 2022-07-28 23:02:33 +09:00

40
gc.c
View file

@ -9957,16 +9957,26 @@ gc_sort_heap_by_empty_slots(rb_objspace_t *objspace)
static void static void
gc_ref_update_array(rb_objspace_t * objspace, VALUE v) 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);
len = RARRAY_LEN(v); for (long i = 0; i < len; i++) {
if (len > 0) { UPDATE_IF_MOVED(objspace, ptr[i]);
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; return;
case T_ARRAY: case T_ARRAY:
if (ARY_SHARED_P(obj)) { gc_ref_update_array(objspace, 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
break; break;
case T_HASH: case T_HASH: