From: "mame (Yusuke Endoh) via ruby-core" Date: 2025-03-21T05:28:36+00:00 Subject: [ruby-core:121422] [Ruby Bug#21193] Inherited callback returns `nil` for `Object.const_source_location` 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/