summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-09 21:18:42 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-09 21:18:42 +0000
commit64c08dafe2e592fe3d4f18c5b90ca392453c8221 (patch)
tree01224db43c9d7700921827e2029d79be6c318dae
parent2b15d16987cbbe3c07cbc28a59e6bbaa1f506a73 (diff)
variable.c (rb_autoload_load): allow recursive calls
* variable.c (rb_autoload_load): allow recursive calls [ruby-core:71345] [Bug #11658] * test/ruby/test_autoload.rb (test_autoload_while_autoloading): new test by: Hiroshi Shirosaki <h.shirosaki@gmail.com> [ruby-core:71390] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--test/ruby/test_autoload.rb19
-rw-r--r--variable.c3
3 files changed, 30 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 20c5a6cd52..c4bc28f62a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Nov 10 06:17:17 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (rb_autoload_load): allow recursive calls
+ [ruby-core:71345] [Bug #11658]
+ * test/ruby/test_autoload.rb (test_autoload_while_autoloading):
+ new test by: Hiroshi Shirosaki <h.shirosaki@gmail.com>
+ [ruby-core:71390]
+
Tue Nov 10 00:36:46 2015 Tanaka Akira <akr@fsij.org>
* lib/resolv.rb (Resolv::DNS::Message::MessageEncoder#put_labels):
diff --git a/test/ruby/test_autoload.rb b/test/ruby/test_autoload.rb
index 719502d268..a672e0be5a 100644
--- a/test/ruby/test_autoload.rb
+++ b/test/ruby/test_autoload.rb
@@ -215,6 +215,25 @@ p Foo::Bar
end
end
+ def test_autoload_while_autoloading
+ ruby_impl_require do |called_with|
+ Tempfile.create(%w(a .rb)) do |a|
+ Tempfile.create(%w(b .rb)) do |b|
+ a.puts "require '#{b.path}'; class AutoloadTest; end"
+ b.puts "class AutoloadTest; module B; end; end"
+ [a, b].each(&:flush)
+ add_autoload(a.path)
+ begin
+ assert(Object::AutoloadTest)
+ ensure
+ remove_autoload_constant
+ end
+ assert_equal [a.path, b.path], called_with
+ end
+ end
+ end
+ end
+
def add_autoload(path)
(@autoload_paths ||= []) << path
::Object.class_eval {autoload(:AutoloadTest, path)}
diff --git a/variable.c b/variable.c
index ec6924ad2f..c8264b1fe9 100644
--- a/variable.c
+++ b/variable.c
@@ -2179,6 +2179,9 @@ rb_autoload_load(VALUE mod, ID id)
*/
list_head_init(&state.waitq.head);
}
+ else if (state.thread == ele->state->thread) {
+ return Qfalse;
+ }
else {
list_add_tail(&ele->state->waitq.head, &state.waitq.node);
/*