@@ -145,9 +145,22 @@ extension _UnmanagedOpaqueString {
145
145
}
146
146
147
147
extension _StringGuts {
148
+ //
149
+ // FIXME(TODO: JIRA): HACK HACK HACK: Work around for ARC :-(
150
+ //
148
151
@_versioned
152
+ @effects ( readonly)
149
153
@inline ( never) // Hide the CF dependency
154
+ internal static func _computeHashValue(
155
+ _unsafeBitPattern: _RawBitPattern
156
+ ) -> Int {
157
+ return _StringGuts ( rawBits: _unsafeBitPattern) . _computeHashValue ( )
158
+ }
159
+
160
+ @_versioned
161
+ // TODO: After removing above hack: @inline(never) // Hide the CF dependency
150
162
internal func _computeHashValue( ) -> Int {
163
+ defer { _fixLifetime ( self ) }
151
164
if _slowPath ( _isOpaque) {
152
165
return _asOpaque ( ) . computeHashValue ( )
153
166
}
@@ -158,8 +171,9 @@ extension _StringGuts {
158
171
}
159
172
160
173
@_versioned
161
- @inline ( never) // Hide the CF dependency
174
+ // TODO: After removing above hack: @inline(never) // Hide the CF dependency
162
175
internal func _computeHashValue( _ range: Range < Int > ) -> Int {
176
+ defer { _fixLifetime ( self ) }
163
177
if _slowPath ( _isOpaque) {
164
178
return _asOpaque ( ) [ range] . computeHashValue ( )
165
179
}
@@ -177,7 +191,9 @@ extension String : Hashable {
177
191
/// your program. Do not save hash values to use during a future execution.
178
192
@_inlineable // FIXME(sil-serialize-all)
179
193
public var hashValue : Int {
180
- return _guts. _computeHashValue ( )
194
+ defer { _fixLifetime ( self ) }
195
+ let gutsBits = _guts. rawBits
196
+ return _StringGuts. _computeHashValue ( _unsafeBitPattern: gutsBits)
181
197
}
182
198
}
183
199
0 commit comments