summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dir.c4
-rw-r--r--test/ruby/test_dir.rb19
2 files changed, 19 insertions, 4 deletions
diff --git a/dir.c b/dir.c
index 49e6818d25..bedbdd9f83 100644
--- a/dir.c
+++ b/dir.c
@@ -1064,8 +1064,10 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj)
}
if (chdir_blocking > 0) {
- if (!rb_block_given_p() || rb_thread_current() != chdir_thread)
+ if (rb_thread_current() != chdir_thread)
rb_raise(rb_eRuntimeError, "conflicting chdir during another chdir block");
+ if (!rb_block_given_p())
+ rb_warn("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 fb8d009db4..e5bcbeac73 100644
--- a/test/ruby/test_dir.rb
+++ b/test/ruby/test_dir.rb
@@ -97,9 +97,22 @@ class TestDir < Test::Unit::TestCase
assert_raise(ArgumentError) { Dir.chdir }
ENV["HOME"] = pwd
Dir.chdir do
- assert_equal(pwd, Dir.pwd)
- assert_raise(RuntimeError) { Dir.chdir(@root) }
- assert_equal(pwd, Dir.pwd)
+ assert_warning(/conflicting chdir during another chdir block/) { Dir.chdir(pwd) }
+
+ assert_warning(/conflicting chdir during another chdir block/) { Dir.chdir(@root) }
+ assert_equal(@root, Dir.pwd)
+
+ assert_warning(/conflicting chdir during another chdir block/) { Dir.chdir(pwd) }
+
+ assert_raise(RuntimeError) { Thread.new { Thread.current.report_on_exception = false; Dir.chdir(@root) }.join }
+ assert_raise(RuntimeError) { Thread.new { Thread.current.report_on_exception = false; Dir.chdir(@root) { } }.join }
+
+ assert_warning(/conflicting chdir during another chdir block/) { Dir.chdir(pwd) }
+
+ assert_warning(/conflicting chdir during another chdir block/) { Dir.chdir(@root) }
+ assert_equal(@root, Dir.pwd)
+
+ assert_warning(/conflicting chdir during another chdir block/) { Dir.chdir(pwd) }
Dir.chdir(@root) do
assert_equal(@root, Dir.pwd)
end