mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[EXPERIMENTAL] Make Symbol#to_s return a frozen String
* Always the same frozen String for a given Symbol. * Avoids extra allocations whenever calling Symbol#to_s. * See [Feature #16150]
This commit is contained in:
parent
4a4c502825
commit
6ffc045a81
Notes:
git
2019-09-26 17:23:27 +09:00
4 changed files with 31 additions and 3 deletions
8
NEWS
8
NEWS
|
@ -197,6 +197,14 @@ RubyVM::
|
||||||
* RubyVM.resolve_feature_path moved to
|
* RubyVM.resolve_feature_path moved to
|
||||||
$LOAD_PATH.resolve_feature_path. [Feature #15903] [Feature #15230]
|
$LOAD_PATH.resolve_feature_path. [Feature #15903] [Feature #15230]
|
||||||
|
|
||||||
|
Symbol::
|
||||||
|
|
||||||
|
Modified method::
|
||||||
|
|
||||||
|
* Symbol#to_s now always returns a frozen String. The returned String is
|
||||||
|
always the same for a given Symbol. This change is experimental.
|
||||||
|
[Feature #16150]
|
||||||
|
|
||||||
Time::
|
Time::
|
||||||
|
|
||||||
New methods::
|
New methods::
|
||||||
|
|
|
@ -6,4 +6,21 @@ describe :symbol_id2name, shared: true do
|
||||||
:@ruby.send(@method).should == "@ruby"
|
:@ruby.send(@method).should == "@ruby"
|
||||||
:@@ruby.send(@method).should == "@@ruby"
|
:@@ruby.send(@method).should == "@@ruby"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby_version_is "2.7" do
|
||||||
|
it "returns a frozen String" do
|
||||||
|
:my_symbol.to_s.frozen?.should == true
|
||||||
|
:"dynamic symbol #{6 * 7}".to_s.frozen?.should == true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "always returns the same String for a given Symbol" do
|
||||||
|
s1 = :my_symbol.to_s
|
||||||
|
s2 = :my_symbol.to_s
|
||||||
|
s1.should equal(s2)
|
||||||
|
|
||||||
|
s1 = :"dynamic symbol #{6 * 7}".to_s
|
||||||
|
s2 = :"dynamic symbol #{2 * 3 * 7}".to_s
|
||||||
|
s1.should equal(s2)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
5
string.c
5
string.c
|
@ -10869,7 +10869,8 @@ sym_inspect(VALUE sym)
|
||||||
* sym.id2name -> string
|
* sym.id2name -> string
|
||||||
* sym.to_s -> string
|
* sym.to_s -> string
|
||||||
*
|
*
|
||||||
* Returns the name or string corresponding to <i>sym</i>.
|
* Returns a frozen string corresponding to <i>sym</i>.
|
||||||
|
* The returned String is always the same String instance for a given Symbol.
|
||||||
*
|
*
|
||||||
* :fred.id2name #=> "fred"
|
* :fred.id2name #=> "fred"
|
||||||
* :ginger.to_s #=> "ginger"
|
* :ginger.to_s #=> "ginger"
|
||||||
|
@ -10879,7 +10880,7 @@ sym_inspect(VALUE sym)
|
||||||
VALUE
|
VALUE
|
||||||
rb_sym_to_s(VALUE sym)
|
rb_sym_to_s(VALUE sym)
|
||||||
{
|
{
|
||||||
return str_new_shared(rb_cString, rb_sym2str(sym));
|
return rb_sym2str(sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,9 @@ class Test_StringCapacity < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_capacity_shared
|
def test_capacity_shared
|
||||||
assert_equal 0, capa(:abcdefghijklmnopqrstuvwxyz.to_s)
|
str = :abcdefghijklmnopqrstuvwxyz.to_s.dup
|
||||||
|
assert Bug::String.shared_string? str
|
||||||
|
assert_equal 0, capa(str)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_capacity_normal
|
def test_capacity_normal
|
||||||
|
|
Loading…
Reference in a new issue