diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | spec/ruby/core/module/name_spec.rb | 24 | ||||
-rw-r--r-- | variable.c | 5 |
3 files changed, 24 insertions, 9 deletions
@@ -174,6 +174,10 @@ Module:: * Module#autoload? now takes an +inherit+ optional argument, like as Module#const_defined?. [Feature #15777] + + * Module#name now always return a frozen String. The returned String is + always the same for a given Module. This change is experimental + [Feature #16150] ObjectSpace::WeakMap:: diff --git a/spec/ruby/core/module/name_spec.rb b/spec/ruby/core/module/name_spec.rb index d64684319c..36a91f5be5 100644 --- a/spec/ruby/core/module/name_spec.rb +++ b/spec/ruby/core/module/name_spec.rb @@ -102,13 +102,27 @@ describe "Module#name" do m::N.name.should == "ModuleSpecs::Anonymous::E::N" end - it "returns a mutable string" do - ModuleSpecs.name.frozen?.should be_false + ruby_version_is ""..."2.7" do + it "returns a mutable string" do + ModuleSpecs.name.frozen?.should be_false + end + + it "returns a mutable string that when mutated does not modify the original module name" do + ModuleSpecs.name << "foo" + + ModuleSpecs.name.should == "ModuleSpecs" + end end - it "returns a mutable string that when mutated does not modify the original module name" do - ModuleSpecs.name << "foo" + ruby_version_is "2.7" do + it "returns a frozen String" do + ModuleSpecs.name.frozen?.should == true + end - ModuleSpecs.name.should == "ModuleSpecs" + it "always returns the same String for a given Module" do + s1 = ModuleSpecs.name + s2 = ModuleSpecs.name + s1.should equal(s2) + end end end diff --git a/variable.c b/variable.c index 9fd075c21c..aafb6f4725 100644 --- a/variable.c +++ b/variable.c @@ -107,10 +107,7 @@ VALUE rb_mod_name(VALUE mod) { int permanent; - VALUE path = classname(mod, &permanent); - - if (!NIL_P(path)) return rb_str_dup(path); - return path; + return classname(mod, &permanent); } static VALUE |