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:
parent
bf3eaf39df
commit
e019dd24df
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
1
array.c
1
array.c
|
@ -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, {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue