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

ruby-changes:72788

From: Nobuyoshi <ko1@a...>
Date: Tue, 2 Aug 2022 16:40:31 +0900 (JST)
Subject: [ruby-changes:72788] ec3f59309e (master): [Bug #17767] Now `ENV.clone` raises `TypeError` as well as `ENV.dup`

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

From ec3f59309e3f08339c4c76a6881901580801d6cd Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Wed, 20 Jul 2022 19:19:23 +0900
Subject: [Bug #17767] Now `ENV.clone` raises `TypeError` as well as `ENV.dup`

One year ago, the former method has been deprecated while the latter
has become an error.  Then the 3.1 released, it is enough time to make
also the former an error.
---
 hash.c                | 21 ++++++++-------------
 test/ruby/test_env.rb | 48 ++++++------------------------------------------
 2 files changed, 14 insertions(+), 55 deletions(-)

diff --git a/hash.c b/hash.c
index 69a768d4ce..8c20791ede 100644
--- a/hash.c
+++ b/hash.c
@@ -6639,31 +6639,26 @@ env_update(int argc, VALUE *argv, VALUE env) https://github.com/ruby/ruby/blob/trunk/hash.c#L6639
     return env;
 }
 
+NORETURN(static VALUE env_clone(int, VALUE *, VALUE));
 /*
  * call-seq:
- *   ENV.clone(freeze: nil) -> ENV
+ *   ENV.clone(freeze: nil) # raises TypeError
  *
- * Returns ENV itself, and warns because ENV is a wrapper for the
- * process-wide environment variables and a clone is useless.
- * If +freeze+ keyword is given and not +nil+ or +false+, raises ArgumentError.
- * If +freeze+ keyword is given and +true+, raises TypeError, as ENV storage
- * cannot be frozen.
+ * Raises TypeError, because ENV is a wrapper for the process-wide
+ * environment variables and a clone is useless.
+ * Use #to_h to get a copy of ENV data as a hash.
  */
 static VALUE
 env_clone(int argc, VALUE *argv, VALUE obj)
 {
     if (argc) {
-        VALUE opt, kwfreeze;
+        VALUE opt;
         if (rb_scan_args(argc, argv, "0:", &opt) < argc) {
-            kwfreeze = rb_get_freeze_opt(1, &opt);
-            if (RTEST(kwfreeze)) {
-                rb_raise(rb_eTypeError, "cannot freeze ENV");
-            }
+            rb_get_freeze_opt(1, &opt);
         }
     }
 
-    rb_warn_deprecated("ENV.clone", "ENV.to_h");
-    return envtbl;
+    rb_raise(rb_eTypeError, "Cannot clone ENV, use ENV.to_h to get a copy of ENV as a hash");
 }
 
 NORETURN(static VALUE env_dup(VALUE));
diff --git a/test/ruby/test_env.rb b/test/ruby/test_env.rb
index e9eaf144a1..cdadeac148 100644
--- a/test/ruby/test_env.rb
+++ b/test/ruby/test_env.rb
@@ -69,25 +69,20 @@ class TestEnv < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_env.rb#L69
   end
 
   def test_clone
-    warning = /ENV\.clone is deprecated; use ENV\.to_h instead/
-    clone = assert_deprecated_warning(warning) {
+    message = /Cannot clone ENV/
+    assert_raise_with_message(TypeError, message) {
       ENV.clone
     }
-    assert_same(ENV, clone)
-
-    clone = assert_deprecated_warning(warning) {
+    assert_raise_with_message(TypeError, message) {
       ENV.clone(freeze: false)
     }
-    assert_same(ENV, clone)
-
-    clone = assert_deprecated_warning(warning) {
+    assert_raise_with_message(TypeError, message) {
       ENV.clone(freeze: nil)
     }
-    assert_same(ENV, clone)
-
-    assert_raise(TypeError) {
+    assert_raise_with_message(TypeError, message) {
       ENV.clone(freeze: true)
     }
+
     assert_raise(ArgumentError) {
       ENV.clone(freeze: 1)
     }
@@ -688,37 +683,6 @@ class TestEnv < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_env.rb#L683
     end;
   end
 
-  def test_clone_in_ractor
-    assert_ractor(<<-"end;")
-      r = Ractor.new do
-        original_warning_state = Warning[:deprecated]
-        Warning[:deprecated] = false
-
-        begin
-          Ractor.yield ENV.clone.object_id
-          Ractor.yield ENV.clone(freeze: false).object_id
-          Ractor.yield ENV.clone(freeze: nil).object_id
-
-          #{str_for_yielding_exception_class("ENV.clone(freeze: true)")}
-          #{str_for_yielding_exception_class("ENV.clone(freeze: 1)")}
-          #{str_for_yielding_exception_class("ENV.clone(foo: false)")}
-          #{str_for_yielding_exception_class("ENV.clone(1)")}
-          #{str_for_yielding_exception_class("ENV.clone(1, foo: false)")}
-
-        ensure
-          Warning[:deprecated] = original_warning_state
-        end
-      end
-      assert_equal(ENV.object_id, r.take)
-      assert_equal(ENV.object_id, r.take)
-      assert_equal(ENV.object_id, r.take)
-      #{str_for_assert_raise_on_yielded_exception_class(TypeError, "r")}
-      4.times do
-        #{str_for_assert_raise_on_yielded_exception_class(ArgumentError, "r")}
-      end
-    end;
-  end
-
   def test_has_value_in_ractor
     assert_ractor(<<-"end;")
       r = Ractor.new do
-- 
cgit v1.2.1


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

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