Permalink
Browse files

String#uminus dedupes unconditionally

[Feature #14478] [ruby-core:85669]

Thanks-to: Sam Saffron <sam.saffron@gmail.com>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63566 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
normal
normal committed Jun 4, 2018
1 parent b3cb6db commit 256411b47fd486b40eb3cfe3760dca06f62c830f
Showing with 8 additions and 14 deletions.
  1. +3 −5 spec/ruby/core/string/uminus_spec.rb
  2. +5 −9 string.c
@@ -31,14 +31,12 @@
(-"unfrozen string").should_not equal(-"another unfrozen string")
end
it "is an identity function if the string is frozen" do
it "deduplicates frozen strings" do
dynamic = %w(this string is frozen).join(' ').freeze
(-dynamic).should equal(dynamic)
dynamic.should_not equal("this string is frozen".freeze)
(-dynamic).should_not equal("this string is frozen".freeze)
(-dynamic).should_not equal(-"this string is frozen".freeze)
(-dynamic).should equal("this string is frozen".freeze)
(-dynamic).should equal(-"this string is frozen".freeze)
end
end
end
@@ -2607,20 +2607,16 @@ str_uplus(VALUE str)
* call-seq:
* -str -> str (frozen)
*
* If the string is frozen, then return the string itself.
* Return a frozen, possibly pre-existing
* copy of the string.
*
* If the string is not frozen, return a frozen, possibly pre-existing
* copy of it.
* String will be deduplicated as long as it is not tainted,
* or has any instance vars set on it.
*/
static VALUE
str_uminus(VALUE str)
{
if (OBJ_FROZEN(str)) {
return str;
}
else {
return rb_fstring(str);
}
return rb_fstring(str);
}
RUBY_ALIAS_FUNCTION(rb_str_dup_frozen(VALUE str), rb_str_new_frozen, (str))

0 comments on commit 256411b

Please sign in to comment.