From 9d0866c7d7b9cbe36a851744a37806e747e0e7a8 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 26 Sep 2019 10:41:43 +0200 Subject: [PATCH] [EXPERIMENTAL] Make Module#name return a frozen String * Always the same frozen String for a given Module or Class. * Avoids extra allocations whenever calling Module#name. * See [Feature #16150] --- NEWS | 4 ++++ spec/ruby/core/module/name_spec.rb | 24 +++++++++++++++++++----- variable.c | 5 +---- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index 4e168518ca..d23cadde3e 100644 --- a/NEWS +++ b/NEWS @@ -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