[stdlib, 6.2] Handle String's 32-bit inline representation for Span #82587
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.
String's inline representation is currently non-contiguous on 32-bit platforms. Furthermore, that representation is baked in ABI for watchOS's 32-bit variant. This PR implements mitigations.
A. For 32-bit platforms without ABI stability, we reduce the size of the inline representation to 8 UTF-8 code units (from 10).
B. For 32-bit watchOS, we add an optional property var _span: Span<UTF8.CodeUnit>? that returns nil when the representation of the String is non-contiguous, that is when it is 9 or 10 UTF-8 code units.
All platforms will get this underscored property, so that code that supports 32-bit watchOS doesn't have to be specific to it.
Scope: Bug fix for 32-bit platforms
Radar/SR Issue: rdar://147500261
Main PR: #82442
Risk: Low
Testing: Covered by unit tests
Reviewer: @lorentey