Project

General

Profile

Actions

Bug #18624

open

`const_source_location` returns [false, 0] when autoload is defined for the constant

Added by pocke (Masataka Kuwabara) 3 months ago. Updated 2 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 3.2.0dev (2022-03-11T08:38:13Z master 2e4516be26) [x86_64-linux]
[ruby-core:107846]

Description

const_source_location returns [false, 0] unexpectedly with the following code.

# test.rb
path = File.join(__dir__, 'test2')
Object.autoload 'Test2', path
require path

p Object.const_source_location 'Test2'
# test2.rb
class Test2
end
$ ruby -v test.rb
ruby 3.2.0dev (2022-03-11T08:38:13Z master 2e4516be26) [x86_64-linux]
[false, 0]

I expect it returns ['/path/to/test2.rb', 2], but it doesn't.
Ruby 2.7 ~ 3.1 have the same behavior.

I actually encountered this problem in a Rails app with Zeitwerk. The following codes are a reproducing example with Zeitwerk.
loader.setup calls autoload, so it causes the same problem.

# test.rb
require "zeitwerk"
loader = Zeitwerk::Loader.for_gem
loader.setup

require File.join(__dir__, 'test2')

p Zeitwerk::VERSION
p Object.const_source_location 'Test2'
# test2.rb
class Test2
end
Actions #1

Updated by pocke (Masataka Kuwabara) 3 months ago

  • Description updated (diff)

Updated by jeremyevans0 (Jeremy Evans) 2 months ago

I've submitted a pull request to fix this: https://github.com/ruby/ruby/pull/5646

Updated by ufuk (Ufuk Kayserilioglu) 2 months ago

This is a duplicate of Issue #17354 and @jeremyevans0 (Jeremy Evans), in that issue, you had argued that just because the autoload location was known didn't mean that the constant would be guaranteed to be defined by that file.

I believe this was also discussed in the Dev Meeting at the time and a consensus wasn't reached: https://bugs.ruby-lang.org/issues/17354#note-12

I suggest we close this issue and continue the conversation on #17354

Updated by jeremyevans0 (Jeremy Evans) 2 months ago

ufuk (Ufuk Kayserilioglu) wrote in #note-3:

This is a duplicate of Issue #17354 and @jeremyevans0 (Jeremy Evans), in that issue, you had argued that just because the autoload location was known didn't mean that the constant would be guaranteed to be defined by that file.

I believe this was also discussed in the Dev Meeting at the time and a consensus wasn't reached: https://bugs.ruby-lang.org/issues/17354#note-12

I suggest we close this issue and continue the conversation on #17354

Sorry, but you are incorrect. #17354 is regarding behavior of const_source_location before the autoloaded file is required. This issue is regarding behavior of const_source_location after the autoloaded file is required. They are separate issues, not duplicates, and should be treated as such. This issue is definitely a bug, because the related constant has already been defined and the source of the constant is now known.

Updated by ufuk (Ufuk Kayserilioglu) 2 months ago

jeremyevans0 (Jeremy Evans) wrote in #note-4:

Sorry, but you are incorrect. #17354 is regarding behavior of const_source_location before the autoloaded file is required. This issue is regarding behavior of const_source_location after the autoloaded file is required. They are separate issues, not duplicates, and should be treated as such. This issue is definitely a bug, because the related constant has already been defined and the source of the constant is now known.

Indeed, thanks for the correction. I had missed the require path line in the original reproduction example. Apologies for the noise and thanks again for the clarification.

Actions

Also available in: Atom PDF