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

ruby-changes:63184

From: Jeremy <ko1@a...>
Date: Tue, 29 Sep 2020 00:34:24 +0900 (JST)
Subject: [ruby-changes:63184] 5d7953f86b (master): Switch conflicting chdir warning to RuntimeError

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

From 5d7953f86b7ae164017e2292dfb3c108e0e02527 Mon Sep 17 00:00:00 2001
From: Jeremy Evans <code@j...>
Date: Fri, 25 Sep 2020 13:29:20 -0700
Subject: Switch conflicting chdir warning to RuntimeError

The documentation already stated this was an error in one case
(when it was previously a warning).  Describe the other case,
where chdir without block is called inside block passed to chdir.

Fixes [Bug #15661]

diff --git a/dir.c b/dir.c
index e5b6705..49e6818 100644
--- a/dir.c
+++ b/dir.c
@@ -1024,7 +1024,8 @@ chdir_restore(VALUE v) https://github.com/ruby/ruby/blob/trunk/dir.c#L1024
  *  block. <code>chdir</code> blocks can be nested, but in a
  *  multi-threaded program an error will be raised if a thread attempts
  *  to open a <code>chdir</code> block while another thread has one
- *  open.
+ *  open or a call to <code>chdir</code> without a block occurs inside
+ *  a block passed to <code>chdir</code> (even in the same thread).
  *
  *     Dir.chdir("/var/spool/mail")
  *     puts Dir.pwd
@@ -1064,7 +1065,7 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj) https://github.com/ruby/ruby/blob/trunk/dir.c#L1065
 
     if (chdir_blocking > 0) {
 	if (!rb_block_given_p() || rb_thread_current() != chdir_thread)
-	    rb_warn("conflicting chdir during another chdir block");
+            rb_raise(rb_eRuntimeError, "conflicting chdir during another chdir block");
     }
 
     if (rb_block_given_p()) {
diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb
index 13b9c1d..cf18af1 100644
--- a/test/ruby/test_dir.rb
+++ b/test/ruby/test_dir.rb
@@ -99,8 +99,12 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L99
     ENV["HOME"] = @pwd
     Dir.chdir do
       assert_equal(@pwd, Dir.pwd)
-      Dir.chdir(@root)
-      assert_equal(@root, Dir.pwd)
+      assert_raise(RuntimeError) { Dir.chdir(@root) }
+      assert_equal(@pwd, Dir.pwd)
+      Dir.chdir(@root) do
+        assert_equal(@root, Dir.pwd)
+      end
+      assert_equal(@pwd, Dir.pwd)
     end
 
   ensure
@@ -121,6 +125,28 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L125
     end
   end
 
+  def test_chdir_conflict
+    @pwd = Dir.pwd
+    q = Queue.new
+    t = Thread.new do
+      q.pop
+      Dir.chdir(@pwd) rescue $!
+    end
+    Dir.chdir(@pwd) do
+      q.push nil
+      assert_instance_of(RuntimeError, t.value)
+    end
+
+    t = Thread.new do
+      q.pop
+      Dir.chdir(@pwd){} rescue $!
+    end
+    Dir.chdir(@pwd) do
+      q.push nil
+      assert_instance_of(RuntimeError, t.value)
+    end
+  end
+
   def test_chroot_nodir
     skip if RUBY_PLATFORM =~ /android/
     assert_raise(NotImplementedError, Errno::ENOENT, Errno::EPERM
-- 
cgit v0.10.2


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

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