From: "fxn (Xavier Noria) via ruby-core" Date: 2023-06-11T15:41:54+00:00 Subject: [ruby-core:113871] [Ruby master Bug#19681] The final classpath of partially named modules is sometimes inconsistent once permanently named Issue #19681 has been updated by fxn (Xavier Noria). @matz the related spec proposed in https://github.com/ruby/spec/pull/1044 says in a commment > You get one of the two, but you don't know which one. It is written this way because that is all CRuby can say, since we have seen that the name of the module is not predicatable by the user: ```ruby m = Module.new m::C = Class.new m::D = m::C M = m M::C.name # => "M::D" ``` vs ```ruby m = Module.new m::C = Class.new m::X = Class.new # <-- This line inserted m::D = m::C M = m M::C.name # => "M::C" ``` Do you like that vague wording in the spec? Or would you prefer to use some more formal language? ---------------------------------------- Bug #19681: The final classpath of partially named modules is sometimes inconsistent once permanently named https://bugs.ruby-lang.org/issues/19681#change-103519 * Author: byroot (Jean Boussier) * Status: Closed * Priority: Normal * Backport: 3.0: WONTFIX, 3.1: REQUIRED, 3.2: REQUIRED ---------------------------------------- Reported to me by @fxn ```ruby m = Module.new class m::C; end p m::C.name # => "#::C" m::D = m::C p m::D.name # => "#::C" M = m p M::C.name # => "M::D" ``` Expected behavior: ```ruby p M::C.name # => "M::C" ``` ### Reason When the parent is assigned its permanent classpath, we iterate over its `const_table` to recursively give a permanent name to all the constant it owns. However, `const_table` is an `id_table` so it doesn't retain the insertion order, which means that if the constant was aliased, we can no longer distinguish between the original name and its aliases, and whichever comes first in the `const_table` will be used as the permanent name. ### Potential solution I have a tentative fix for it in https://github.com/ruby/ruby/pull/7829. Instead of relying on the `const_table` key, it extract the original name from the temporary classpath. It does feel a bit wrong to do a string search in such a place, but it does work. -- 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/postorius/lists/ruby-core.ml.ruby-lang.org/