[前][次][番号順一覧][スレッド一覧]

ruby-changes:65575

From: Nobuyoshi <ko1@a...>
Date: Sat, 20 Mar 2021 19:16:09 +0900 (JST)
Subject: [ruby-changes:65575] e019dd24df (master): Ensure the receiver is modifiable before shrinking [Bug #17736]

https://git.ruby-lang.org/ruby.git/commit/?id=e019dd24df

From e019dd24df4ed7063ad80d4c2e4070141793f598 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Sat, 20 Mar 2021 19:15:38 +0900
Subject: Ensure the receiver is modifiable before shrinking [Bug #17736]

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

* Assert the receivers are not modified
---
 array.c                 |  1 +
 test/ruby/test_array.rb | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/array.c b/array.c
index 2876548..0f7ccde 100644
--- a/array.c
+++ b/array.c
@@ -3846,6 +3846,7 @@ select_bang_ensure(VALUE a) https://github.com/ruby/ruby/blob/trunk/array.c#L3846
 
     if (i2 < len && i2 < i1) {
 	long tail = 0;
+        rb_ary_modify(ary);
 	if (i1 < len) {
 	    tail = len - i1;
             RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 522b58e..789531f 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -754,6 +754,15 @@ class TestArray < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_array.rb#L754
     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 https://github.com/ruby/ruby/blob/trunk/test/ruby/test_array.rb#L1331
     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 https://github.com/ruby/ruby/blob/trunk/test/ruby/test_array.rb#L2617
     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 https://github.com/ruby/ruby/blob/trunk/test/ruby/test_array.rb#L2641
     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
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]