From: "fxn (Xavier Noria) via ruby-core" Date: 2023-05-20T10:18:34+00:00 Subject: [ruby-core:113542] [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). Let me elaborate the alignment I see. In Ruby, these lines are different: ```ruby C = Class.new c = C D = C ``` The first line creates a class objects and assigns it to a constant. At that point, it gets its name, because it is the first constant assignment. This is what happens with ```ruby class m::C; end p m::C.name # => "#::C" ``` and we expect that "C" segment to persist. Now, I would freeze that and would become the name of the class forever, but Ruby has this concept of permanent names. OK. What about lines (2) and (3) above? They are totally ordinary assignments with no side-effects associated in your mind. Assigning to a variable or a constant, is the same. So, it is in this sense that I believe this patch is good, because that expectation holds the same way for the snippet @byroot shared in the description. ---------------------------------------- Bug #19681: The final classpath of partially named modules is sometimes inconsistent once permanently named https://bugs.ruby-lang.org/issues/19681#change-103169 * Author: byroot (Jean Boussier) * Status: Open * 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/