From 564fb6a795b8a9692664f3c541d5aec4fd1f69c7 Mon Sep 17 00:00:00 2001 From: mrkn Date: Sun, 10 Jul 2011 06:32:06 +0000 Subject: [PATCH] * load.c (rb_f_autoload): prevent to autoload for singleton classes. fixes [Bug #4886] [ruby-dev:43816] * bootstraptest/test_autoload.rb: add tests for the above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32489 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ bootstraptest/test_autoload.rb | 32 ++++++++++++++++++++++++++++++++ load.c | 2 +- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 4c64fe8480..1d122fdbdb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sun Jul 10 15:30:00 2011 Kenta Murata + + * load.c (rb_f_autoload): prevent to autoload for singleton + classes. fixes [Bug #4886] [ruby-dev:43816] + + * bootstraptest/test_autoload.rb: add tests for the above change. + Sun Jul 10 15:09:17 2011 Shota Fukumori * lib/test/unit/assertions.rb: Import documentation patch by Justin diff --git a/bootstraptest/test_autoload.rb b/bootstraptest/test_autoload.rb index b781fdb7e9..e8df6684b6 100644 --- a/bootstraptest/test_autoload.rb +++ b/bootstraptest/test_autoload.rb @@ -1,3 +1,35 @@ +assert_equal 'ok', %q{ + File.unlink('zzz.rb') if File.file?('zzz.rb') + instance_eval do + autoload :ZZZ, './zzz.rb' + begin + ZZZ + rescue LoadError + :ok + end + end +}, '[ruby-dev:43816]' + +assert_equal 'ok', %q{ + open('zzz.rb', 'w') {|f| f.puts '' } + instance_eval do + autoload :ZZZ, './zzz.rb' + begin + ZZZ + rescue NameError + :ok + end + end +}, '[ruby-dev:43816]' + +assert_equal 'ok', %q{ + open('zzz.rb', 'w') {|f| f.puts 'class ZZZ; def self.ok;:ok;end;end'} + instance_eval do + autoload :ZZZ, './zzz.rb' + ZZZ.ok + end +}, '[ruby-dev:43816]' + assert_equal 'ok', %q{ open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"} autoload :ZZZ, "./zzz.rb" diff --git a/load.c b/load.c index b819bf37f9..62e2cac4c6 100644 --- a/load.c +++ b/load.c @@ -722,7 +722,7 @@ rb_mod_autoload_p(VALUE mod, VALUE sym) static VALUE rb_f_autoload(VALUE obj, VALUE sym, VALUE file) { - VALUE klass = rb_vm_cbase(); + VALUE klass = rb_class_real(rb_vm_cbase()); if (NIL_P(klass)) { rb_raise(rb_eTypeError, "Can not set autoload on singleton class"); }