diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2022-04-27 12:23:52 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2022-04-28 11:31:22 -0400 |
commit | c416dbb3c700173d62c2d8381e3680b8aa4482ae (patch) | |
tree | 3a8a256a139cc4aeb54018a270eef2e4914131a6 /array.c | |
parent | 0626e6f959ed740508ff2ec1f2ff4b7188fa821d (diff) |
Add missing write barriers to Array#replace
Previously it made object references without using write barriers,
creating GC inconsistencies.
See: http://ci.rvm.jp/results/trunk-gc-asserts@phosphorus-docker/3925529
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5851
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -4680,14 +4680,16 @@ rb_ary_replace(VALUE copy, VALUE orig) * contents of orig. */ else if (ARY_EMBED_P(orig)) { long len = ARY_EMBED_LEN(orig); - VALUE *ptr = ary_heap_alloc(copy, len); - MEMCPY(ptr, ARY_EMBED_PTR(orig), VALUE, len); FL_UNSET_EMBED(copy); ARY_SET_PTR(copy, ptr); ARY_SET_LEN(copy, len); ARY_SET_CAPA(copy, len); + + // No allocation and exception expected that could leave `copy` in a + // bad state from the edits above. + ary_memcpy(copy, 0, len, RARRAY_CONST_PTR_TRANSIENT(orig)); } #endif /* Otherwise, orig is on heap and copy does not have enough space to embed |