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

ruby-changes:54569

From: nagachika <ko1@a...>
Date: Fri, 11 Jan 2019 00:02:25 +0900 (JST)
Subject: [ruby-changes:54569] nagachika:r66784 (ruby_2_5): merge revision(s) 66756: [Backport #15479]

nagachika	2019-01-11 00:02:21 +0900 (Fri, 11 Jan 2019)

  New Revision: 66784

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=66784

  Log:
    merge revision(s) 66756: [Backport #15479]
    
    Mark array as "going to be modified" in `Array#reject!`
    
    Before this patch, if `reject!` is called on a shared array it can
    mutate the shared array rather than a copy.  This patch marks the array
    as "going to be modified" so that the shared source array isn't
    mutated.
    
    [Bug #15479] [ruby-core:90781]

  Modified directories:
    branches/ruby_2_5/
  Modified files:
    branches/ruby_2_5/array.c
    branches/ruby_2_5/test/ruby/test_array.rb
    branches/ruby_2_5/version.h
Index: ruby_2_5/test/ruby/test_array.rb
===================================================================
--- ruby_2_5/test/ruby/test_array.rb	(revision 66783)
+++ ruby_2_5/test/ruby/test_array.rb	(revision 66784)
@@ -1291,6 +1291,65 @@ class TestArray < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/ruby/test_array.rb#L1291
     assert_equal(@cls[7, 8, 9, 10], a, bug2545)
   end
 
+  def test_shared_array_reject!
+    c = []
+    b = [1, 2, 3, 4]
+    3.times do
+      a = b.dup
+      c << a.dup
+
+      begin
+        a.reject! do |x|
+          case x
+          when 2 then true
+          when 3 then raise StandardError, 'Oops'
+          else false
+          end
+        end
+      rescue StandardError
+      end
+
+      c << a.dup
+    end
+
+    bug90781 = '[ruby-core:90781]'
+    assert_equal [[1, 2, 3, 4],
+                  [1, 3, 4],
+                  [1, 2, 3, 4],
+                  [1, 3, 4],
+                  [1, 2, 3, 4],
+                  [1, 3, 4]], c, bug90781
+  end
+
+  def test_iseq_shared_array_reject!
+    c = []
+    3.times do
+      a = [1, 2, 3, 4]
+      c << a.dup
+
+      begin
+        a.reject! do |x|
+          case x
+          when 2 then true
+          when 3 then raise StandardError, 'Oops'
+          else false
+          end
+        end
+      rescue StandardError
+      end
+
+      c << a.dup
+    end
+
+    bug90781 = '[ruby-core:90781]'
+    assert_equal [[1, 2, 3, 4],
+                  [1, 3, 4],
+                  [1, 2, 3, 4],
+                  [1, 3, 4],
+                  [1, 2, 3, 4],
+                  [1, 3, 4]], c, bug90781
+  end
+
   def test_replace
     a = @cls[ 1, 2, 3]
     a_id = a.__id__
Index: ruby_2_5/version.h
===================================================================
--- ruby_2_5/version.h	(revision 66783)
+++ ruby_2_5/version.h	(revision 66784)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_5/version.h#L1
 #define RUBY_VERSION "2.5.4"
 #define RUBY_RELEASE_DATE "2019-01-10"
-#define RUBY_PATCHLEVEL 127
+#define RUBY_PATCHLEVEL 128
 
 #define RUBY_RELEASE_YEAR 2019
 #define RUBY_RELEASE_MONTH 1
Index: ruby_2_5/array.c
===================================================================
--- ruby_2_5/array.c	(revision 66783)
+++ ruby_2_5/array.c	(revision 66784)
@@ -3241,6 +3241,7 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_5/array.c#L3241
 rb_ary_reject_bang(VALUE ary)
 {
     RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
+    rb_ary_modify(ary);
     return ary_reject_bang(ary);
 }
 
Index: ruby_2_5
===================================================================
--- ruby_2_5	(revision 66783)
+++ ruby_2_5	(revision 66784)

Property changes on: ruby_2_5
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /trunk:r66756

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

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