[ruby-core:85579] [Ruby trunk Feature#14478] String #uminus should de-dupe unconditionally

From: ko1@...
Date: 2018-02-15 05:14:45 UTC
List: ruby-core #85579
Issue #14478 has been updated by ko1 (Koichi Sasada).


Summary of this issue:

# Background

We changed to return dedup-ed string with `String-@`.

https://bugs.ruby-lang.org/issues/13077#note-7
>    For the time being, let us make -@ to call rb_fstring.

# Issue

However, it returns non-deduped string when `self` is frozen
because of `OBJ_FREEZE(str)` check (https://bugs.ruby-lang.org/issues/14478#note-5).

It is inconsistent. We can't use it for `dedup` functionality.

# Proposal

We always need to return dedup-ed strings with `String#-@`

----

This proposal makes sense for me, at least I understand "inconsistency".


----------------------------------------
Feature #14478: String #uminus should de-dupe unconditionally
https://bugs.ruby-lang.org/issues/14478#change-70372

* Author: sam.saffron (Sam Saffron)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
continuing: https://bugs.ruby-lang.org/issues/14475

Current documentation for String uminus says: "If the string is frozen, then return the string itself."

Trouble is that there is no simple way to de-duplicate unconditionally without inefficiency:

Say `x` is an arbitrary string (either frozen or unfrozen) :

```
x = -x # may return a non fstring

x = -+x # will return fstring, but makes an unneeded copy

x = -x.dup # fstring again, uneeded copy 

x = x.frozen? ? -+x : -x # too verbose, uneeded copy
```

Instead why not change it so `-` is deduped unconditionally? 

I would argue this is worth backporting, cause if we are making fstring optimisations now, we are going to be stuck with legacy inefficient code going forward.

An alternative may be a c-extension gem that adds #fstring to String but that just feel wrong. 

I think the documentation should say:

String uminus says: "If the string is de-duplicated, then return the string itself."

Happy to make the change it is quite simple:`(FL_TEST(str, RSTRING_FSTR)` 






-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next