[ruby-core:121422] [Ruby Bug#21193] Inherited callback returns `nil` for `Object.const_source_location`
From:
"mame (Yusuke Endoh) via ruby-core" <ruby-core@...>
Date:
2025-03-21 05:28:36 UTC
List:
ruby-core #121422
Issue #21193 has been updated by mame (Yusuke Endoh).
Status changed from Closed to Assigned
Assignee changed from byroot (Jean Boussier) to matz (Yukihiro Matsumoto)
Hmmm, I think this handling is dirty. @matz said in #21143
> But I don't want to break any existing code. I'd like to experiment inherited-then-const_added order works (or not).
> If it works, I'd like to change the order. If it doesn't I'like to keep the current order (and document somewhere).
We actually found the real-world examples that are affected by the change. This means the change breaks existing code. I think we should revert the change and keep the previous order, instead of introducing dirty special handling.
At the least, we should ask matz to reconfirm this change before putting it in. @matz what do you think?
----------------------------------------
Bug #21193: Inherited callback returns `nil` for `Object.const_source_location`
https://bugs.ruby-lang.org/issues/21193#change-112404
* 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/