mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Eagerly name modules and classes
* variable.c: make the hidden ivars `classpath` and `tmp_classpath` the source of truth for module and constant names. Assign to them when modules are bind to constants. * variable.c: remove references to module name cache, as what used to be the cache is now the source of truth. Remove rb_class_path_no_cache(). * variable.c: remove the hidden ivar `classid`. This existed for the purposes of module name search, which is now replaced. Also, remove the associated rb_name_class(). * class.c: use rb_set_class_path_string to set the name of Object during boot. Must use a fstring as this runs before rb_cString is initialized and creating a normal string leads to a VALUE without a class. * spec/ruby/core/module/name_spec.rb: add a few specs to specify what happens to Module#name across multiple operations. These specs pass without other code changes in this commit. [Feature #15765]
This commit is contained in:
parent
a829be209f
commit
b00f280d4b
6 changed files with 145 additions and 229 deletions
|
@ -18,6 +18,33 @@ describe "Module#name" do
|
|||
m::N.name.should =~ /#<Module:0x[0-9a-f]+>::N/
|
||||
end
|
||||
|
||||
it "changes when the module is reachable through a constant path" do
|
||||
m = Module.new
|
||||
module m::N; end
|
||||
m::N.name.should =~ /#<Module:0x[0-9a-f]+>::N/
|
||||
ModuleSpecs::Anonymous::WasAnnon = m::N
|
||||
m::N.name.should == "ModuleSpecs::Anonymous::WasAnnon"
|
||||
end
|
||||
|
||||
it "is set after it is removed from a constant" do
|
||||
module ModuleSpecs
|
||||
module ModuleToRemove
|
||||
end
|
||||
|
||||
mod = ModuleToRemove
|
||||
remove_const(:ModuleToRemove)
|
||||
mod.name.should == "ModuleSpecs::ModuleToRemove"
|
||||
end
|
||||
end
|
||||
|
||||
it "is set after it is removed from a constant under an anonymous module" do
|
||||
m = Module.new
|
||||
module m::Child; end
|
||||
child = m::Child
|
||||
m.send(:remove_const, :Child)
|
||||
child.name.should =~ /#<Module:0x[0-9a-f]+>::Child/
|
||||
end
|
||||
|
||||
it "is set when opened with the module keyword" do
|
||||
ModuleSpecs.name.should == "ModuleSpecs"
|
||||
end
|
||||
|
@ -40,6 +67,15 @@ describe "Module#name" do
|
|||
m.name.should == "ModuleSpecs::Anonymous::B"
|
||||
end
|
||||
|
||||
it "is not modified when assigned to a different anonymous module" do
|
||||
m = Module.new
|
||||
module m::M; end
|
||||
first_name = m::M.name.dup
|
||||
module m::N; end
|
||||
m::N::F = m::M
|
||||
m::M.name.should == first_name
|
||||
end
|
||||
|
||||
# http://bugs.ruby-lang.org/issues/6067
|
||||
it "is set with a conditional assignment to a nested constant" do
|
||||
eval("ModuleSpecs::Anonymous::F ||= Module.new")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue