Bug #10741
closedconst_defined? triggers autoload where it did not before
Description
This should not cause b.rb to load, but it does in 2.2:
~/projects/jruby $ cat a.rb
module Foo
autoload :Bar, 'b.rb'
end
p Foo.const_defined?('Bar')
~/projects/jruby $ cat b.rb
puts "in b"
module Foo
Bar = 1
end
~/projects/jruby $ rvm ruby-2.0 do ruby -I. a.rb
true
~/projects/jruby $ rvm ruby-2.1 do ruby -I. a.rb
in b
true
~/projects/jruby $ rvm ruby-2.2 do ruby -I. a.rb
in b
true
This is likely caused by the :: support in const_get/const_defined not doing autoload-free traversal.
Updated by headius (Charles Nutter) about 10 years ago
Test in JRuby that caught this change: https://github.com/jruby/jruby/blob/master/test/jruby/test_autoload.rb#L4-L24
Fix in JRuby: https://github.com/jruby/jruby/commit/496c638d2419e089e93eec9759d9775de0390901
Updated by headius (Charles Nutter) about 10 years ago
To be more specific, this assertion fails on MRI:
assert_equal("#{File.dirname(FILE)}/autoloaded.rb", Object.autoload?("Autoloaded"))
Because the previous const_defined? call has already triggered the autoload.
Updated by headius (Charles Nutter) about 10 years ago
Boo...my fix was bad because it stopped searching superclasses. Since I did not have an appropriate method to search superclasses, split up :: elements, and check private consts all in one, I reverted JRuby to the autoload-inducing state for now: https://github.com/jruby/jruby/commit/ccfee85c717a8235d18c63aacfe5f015f4f14261
Tagged some specs and removed an assertion in JRuby's test: https://github.com/jruby/jruby/commit/cffeaab92d5a893240f6ba35159c29eb4cc8d4d5
Updated by jeremyevans0 (Jeremy Evans) over 5 years ago
- Status changed from Open to Closed
This was fixed between 2.6 and 2.7.0-preview1:
$ ruby26 a.rb
in b
true
$ ruby27 a.rb
true
Updated by nobu (Nobuyoshi Nakada) over 5 years ago
- Has duplicate Bug #15780: Module#const_defined?(String) executes autoloads added