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

Ensure the receiver is modifiable before shrinking [Bug #17736]

* Ensure the receiver is modifiable before shinking [Bug #17736]

* Assert the receivers are not modified
This commit is contained in:
Nobuyoshi Nakada 2021-03-20 19:15:38 +09:00 committed by GitHub
parent bf3eaf39df
commit e019dd24df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
Notes: git 2021-03-20 19:16:06 +09:00
Merged: https://github.com/ruby/ruby/pull/4296

Merged-By: nobu <nobu@ruby-lang.org>
2 changed files with 37 additions and 0 deletions

View file

@ -3846,6 +3846,7 @@ select_bang_ensure(VALUE a)
if (i2 < len && i2 < i1) {
long tail = 0;
rb_ary_modify(ary);
if (i1 < len) {
tail = len - i1;
RARRAY_PTR_USE_TRANSIENT(ary, ptr, {

View file

@ -754,6 +754,15 @@ class TestArray < Test::Unit::TestCase
a = @cls[ 5, 6, 7, 8, 9, 10 ]
assert_equal(9, a.delete_if {|i| break i if i > 8; i < 7})
assert_equal(@cls[7, 8, 9, 10], a, bug2545)
assert_raise(FrozenError) do
a = @cls[1, 2, 3, 42]
a.delete_if do
a.freeze
true
end
end
assert_equal(@cls[1, 2, 3, 42], a)
end
def test_dup
@ -1322,6 +1331,15 @@ class TestArray < Test::Unit::TestCase
a = @cls[ 5, 6, 7, 8, 9, 10 ]
assert_equal(9, a.reject! {|i| break i if i > 8; i < 7})
assert_equal(@cls[7, 8, 9, 10], a, bug2545)
assert_raise(FrozenError) do
a = @cls[1, 2, 3, 42]
a.reject! do
a.freeze
true
end
end
assert_equal(@cls[1, 2, 3, 42], a)
end
def test_shared_array_reject!
@ -2599,6 +2617,15 @@ class TestArray < Test::Unit::TestCase
a = @cls[ 1, 2, 3, 4, 5 ]
a.select! {|i| a.clear if i == 5; false }
assert_equal(0, a.size, bug13053)
assert_raise(FrozenError) do
a = @cls[1, 2, 3, 42]
a.select! do
a.freeze
false
end
end
assert_equal(@cls[1, 2, 3, 42], a)
end
# also select!
@ -2614,6 +2641,15 @@ class TestArray < Test::Unit::TestCase
a = @cls[ 1, 2, 3, 4, 5 ]
assert_equal(a, a.keep_if { |i| i > 3 })
assert_equal(@cls[4, 5], a)
assert_raise(FrozenError) do
a = @cls[1, 2, 3, 42]
a.keep_if do
a.freeze
false
end
end
assert_equal(@cls[1, 2, 3, 42], a)
end
def test_filter