summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/array.c3
-rw-r--r--test/t/array.rb7
2 files changed, 10 insertions, 0 deletions
diff --git a/src/array.c b/src/array.c
index bfa6e5f06..2152e292d 100644
--- a/src/array.c
+++ b/src/array.c
@@ -377,6 +377,9 @@ ary_replace(mrb_state *mrb, struct RArray *a, struct RArray *b)
if (ARY_EMBED_P(a)) {
ARY_UNSET_EMBED_FLAG(a);
}
+ else {
+ mrb_free(mrb, a->as.heap.ptr);
+ }
a->as.heap.ptr = b->as.heap.ptr;
a->as.heap.len = len;
a->as.heap.aux.shared = b->as.heap.aux.shared;
diff --git a/test/t/array.rb b/test/t/array.rb
index d2edd0189..ecec39363 100644
--- a/test/t/array.rb
+++ b/test/t/array.rb
@@ -392,3 +392,10 @@ assert('Array#freeze') do
a[0] = 1
end
end
+
+assert('shared array replace') do
+ a = [0] * 40
+ b = [0, 1, 2]
+ b.replace a[1, 20].dup
+ assert_equal 20, b.size
+end