From 2877535cbd245339acd85f2901696493222e75ef Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Mon, 4 Jun 2018 04:11:41 +0000
Subject: [PATCH] String#uminus dedupes unconditionally

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

Thanks-to: Sam Saffron <sam.saffron@gmail.com>
---
 spec/ruby/core/string/uminus_spec.rb |  8 +++-----
 string.c                             | 14 +++++---------
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/spec/ruby/core/string/uminus_spec.rb b/spec/ruby/core/string/uminus_spec.rb
index f79683cb74..f5f77f0d2e 100644
--- a/spec/ruby/core/string/uminus_spec.rb
+++ b/spec/ruby/core/string/uminus_spec.rb
@@ -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
diff --git a/string.c b/string.c
index 36126eb805..088df21b40 100644
--- a/string.c
+++ b/string.c
@@ -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))
-- 
EW

