[ruby-core:121426] [Ruby Bug#21193] Inherited callback returns `nil` for `Object.const_source_location`
From:
"fxn (Xavier Noria) via ruby-core" <ruby-core@...>
Date:
2025-03-21 08:28:56 UTC
List:
ruby-core #121426
Issue #21193 has been updated by fxn (Xavier Noria).
> I think the current state is the best: set the state internally (both superclass and constant) so when both hooks are called it's fully setup as expected and there is no "half-initialized state".
Let me stress this was already the case in the previous order, as I explained in the original ticket.
----------------------------------------
Bug #21193: Inherited callback returns `nil` for `Object.const_source_location`
https://bugs.ruby-lang.org/issues/21193#change-112408
* Author: eileencodes (Eileen Uchitelle)
* Status: Assigned
* Assignee: matz (Yukihiro Matsumoto)
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
Since https://github.com/ruby/ruby/pull/12927 the inherited callback no longer can access the `Object.const_source_location`. A simplified reproduction is the following:
```ruby
class A
def self.inherited(other)
super
p Object.const_source_location(other.name)
end
end
class B < A
end
```
Prior to this change `Object.const_source_location(other.name)` would return `["test.rb", 8]` and now returns `nil`.
Shopify's application uses the `inherited` callback to load configuration classes and since it's unable to find these classes they aren't loaded when they are called. It's not clear if this was intended or if there's a workaround. In chatting with folks at GitHub, they have a similar issue (although that case sounds less straightforward). A more accurate example of what we have (I did strip this down a bunch too):
```ruby
def self.inherited(config)
return super unless config.superclass == Config
if (class_name = config.name) &&
(config_location = Object.const_source_location(class_name)) &&
(parent_dirname = File.dirname(config_location[0]))
config_dirname = File.join(parent_dirname, "config")
config.autoload(:Something, File.join(config_dirname, "something.rb"))
end
super
end
```
Original issue: https://bugs.ruby-lang.org/issues/21143
cc/ @byroot @fxn
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/