🐛 Fix SequenceSet#xor
crash when set is frozen
#457
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
and crashed when it was!set ^ other
andset.xor other
are supposed to be safe transforms. But, unfortunately, they modified the receiver if it wasn't frozen,The fix is trivial: convert
self
todup
.Edited later to add: The bug wasn't as severe as I thought when I wrote the ticket and commit notes.
(self | other)
always returns a newSequenceSet
so the original is unmodified. The test failed becauseSequenceSet#|
returns a new set with the same frozen status as the receiver. But as a performance optimization, the#xor
implementation uses(self | other).subtract(...)
rather than(self | other) - ...
. So, whenself
is frozen, the result of(self | other)
will be frozen too, and `subtract will crash (as the test showed).