aboutsummaryrefslogtreecommitdiffstats
path: root/array.c
diff options
context:
space:
mode:
authorLuke Gruber <luke.gru@gmail.com>2019-06-22 22:22:23 -0400
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-06-23 13:17:41 +0900
commit5a187e26adc8aa32367f294c1496935c7356d386 (patch)
tree276da8a96e7ac0aaa897c69eb871319597b8c7d7 /array.c
parentec8e5f5aa64e2a54cf1e303f2b012c98e8d521ba (diff)
downloadruby-5a187e26adc8aa32367f294c1496935c7356d386.tar.gz
array.c add back shared array optimization to ary_ensure_room_for_unshift
Bug fix in commit ec8e5f5aa64e2a [Bug #15952] disabled an optimization in this function. Closes: https://github.com/ruby/ruby/pull/2252
Diffstat (limited to 'array.c')
-rw-r--r--array.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/array.c b/array.c
index 2d68b608c0..403428d361 100644
--- a/array.c
+++ b/array.c
@@ -1373,18 +1373,18 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
rb_raise(rb_eIndexError, "index %ld too big", new_len);
}
- rb_ary_modify(ary);
-
if (ARY_SHARED_P(ary)) {
VALUE shared = ARY_SHARED(ary);
capa = RARRAY_LEN(shared);
if (ARY_SHARED_OCCUPIED(shared) && capa > new_len) {
+ rb_ary_modify_check(ary);
head = RARRAY_CONST_PTR_TRANSIENT(ary);
sharedp = RARRAY_CONST_PTR_TRANSIENT(shared);
goto makeroom_if_need;
}
}
+ rb_ary_modify(ary);
capa = ARY_CAPA(ary);
if (capa - (capa >> 6) <= new_len) {
ary_double_capa(ary, new_len);