[ruby-core:93238] [Ruby trunk Bug#15926] Edge case issue with String#uminus
From:
merch-redmine@...
Date:
2019-06-19 02:07:27 UTC
List:
ruby-core #93238
Issue #15926 has been updated by jeremyevans0 (Jeremy Evans).
File str-uminus-freeze-fix.patch added
I agree that this is a bug. I'm not sure if `rb_fstring`'s behavior should be changed (hopefully a more knowledgeable committer can weigh in), so a conservative approach to fix this is to dup the receiver before passing to `rb_fstring`, if the receiver's class is not `String` and the object is not already frozen. The attached patch does this.
----------------------------------------
Bug #15926: Edge case issue with String#uminus
https://bugs.ruby-lang.org/issues/15926#change-78688
* Author: luke-gru (Luke Gruber)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v:
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
I was working on issue related to code in `rb_fstring`(https://github.com/ruby/ruby/pull/2233) and saw some weird behavior in the function,
freezing the given string if it's not a "bare" string and it's small enough to be embedded.
The issue comes up in the following edge case:
class MyString < String
end
non_frozen = MyString.new("nonfrozen")
frozen = -non_frozen # deduplicates, but shouldn't freeze receiver
non_frozen << " added" # raises FrozenError
I'm not sure what the correct behavior should be with a subclass and String#uminus. Should it return
a frozen regular String or a frozen copy of the given class's string?
Not a practical concern (not often come upon I'm sure), but I think a valid one.
---Files--------------------------------
str-uminus-freeze-fix.patch (1.38 KB)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>