@@ -172,6 +172,17 @@ internal struct _StringObject {
172
172
_internalInvariant ( !isSmall)
173
173
return CountAndFlags ( rawUnchecked: _countAndFlagsBits)
174
174
}
175
+
176
+ // FIXME: This ought to be the setter for property `_countAndFlags`.
177
+ @_alwaysEmitIntoClient
178
+ internal mutating func _setCountAndFlags( to value: CountAndFlags ) {
179
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
180
+ self . _count = value. count
181
+ self . _flags = value. flags
182
+ #else
183
+ self . _countAndFlagsBits = value. _storage
184
+ #endif
185
+ }
175
186
}
176
187
177
188
// Raw
@@ -894,6 +905,13 @@ extension _StringObject {
894
905
discriminatedObjectRawBits & Nibbles . largeAddressMask)
895
906
}
896
907
908
+ @inline ( __always)
909
+ @_alwaysEmitIntoClient
910
+ internal var largeAddress : UnsafeRawPointer {
911
+ UnsafeRawPointer ( bitPattern: largeAddressBits)
912
+ . _unsafelyUnwrappedUnchecked
913
+ }
914
+
897
915
@inlinable @inline ( __always)
898
916
internal var nativeUTF8Start : UnsafePointer < UInt8 > {
899
917
_internalInvariant ( largeFastIsTailAllocated)
@@ -915,11 +933,12 @@ extension _StringObject {
915
933
_internalInvariant ( largeFastIsShared)
916
934
#if _runtime(_ObjC)
917
935
if largeIsCocoa {
918
- return stableCocoaUTF8Pointer ( cocoaObject) . _unsafelyUnwrappedUnchecked
936
+ return withCocoaObject {
937
+ stableCocoaUTF8Pointer ( $0) . _unsafelyUnwrappedUnchecked
938
+ }
919
939
}
920
940
#endif
921
-
922
- return sharedStorage. start
941
+ return withSharedStorage { $0. start }
923
942
}
924
943
925
944
@usableFromInline
@@ -940,7 +959,24 @@ extension _StringObject {
940
959
return _unsafeUncheckedDowncast ( storage, to: __StringStorage. self)
941
960
#else
942
961
_internalInvariant ( hasNativeStorage)
943
- return Builtin . reinterpretCast ( largeAddressBits)
962
+ let unmanaged = Unmanaged< __StringStorage> . fromOpaque( largeAddress)
963
+ return unmanaged. takeUnretainedValue ( )
964
+ #endif
965
+ }
966
+
967
+ /// Call `body` with the native storage object of `self`, without retaining
968
+ /// it.
969
+ @inline ( __always)
970
+ internal func withNativeStorage< R> (
971
+ _ body: ( __StringStorage ) -> R
972
+ ) -> R {
973
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
974
+ // FIXME: Do this properly.
975
+ return body ( nativeStorage)
976
+ #else
977
+ _internalInvariant ( hasNativeStorage)
978
+ let unmanaged = Unmanaged< __StringStorage> . fromOpaque( largeAddress)
979
+ return unmanaged. _withUnsafeGuaranteedRef { body ( $0) }
944
980
#endif
945
981
}
946
982
@@ -954,7 +990,23 @@ extension _StringObject {
954
990
#else
955
991
_internalInvariant ( largeFastIsShared && !largeIsCocoa)
956
992
_internalInvariant ( hasSharedStorage)
957
- return Builtin . reinterpretCast ( largeAddressBits)
993
+ let unmanaged = Unmanaged< __SharedStringStorage> . fromOpaque( largeAddress)
994
+ return unmanaged. takeUnretainedValue ( )
995
+ #endif
996
+ }
997
+
998
+ @inline ( __always)
999
+ internal func withSharedStorage< R> (
1000
+ _ body: ( __SharedStringStorage ) -> R
1001
+ ) -> R {
1002
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
1003
+ // FIXME: Do this properly.
1004
+ return body ( sharedStorage)
1005
+ #else
1006
+ _internalInvariant ( largeFastIsShared && !largeIsCocoa)
1007
+ _internalInvariant ( hasSharedStorage)
1008
+ let unmanaged = Unmanaged< __SharedStringStorage> . fromOpaque( largeAddress)
1009
+ return unmanaged. _withUnsafeGuaranteedRef { body ( $0) }
958
1010
#endif
959
1011
}
960
1012
@@ -967,7 +1019,24 @@ extension _StringObject {
967
1019
return object
968
1020
#else
969
1021
_internalInvariant ( largeIsCocoa && !isImmortal)
970
- return Builtin . reinterpretCast ( largeAddressBits)
1022
+ let unmanaged = Unmanaged< AnyObject> . fromOpaque( largeAddress)
1023
+ return unmanaged. takeUnretainedValue ( )
1024
+ #endif
1025
+ }
1026
+
1027
+ /// Call `body` with the bridged Cocoa object in `self`, without retaining
1028
+ /// it.
1029
+ @inline ( __always)
1030
+ internal func withCocoaObject< R> (
1031
+ _ body: ( AnyObject ) -> R
1032
+ ) -> R {
1033
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
1034
+ // FIXME: Do this properly.
1035
+ return body ( cocoaObject)
1036
+ #else
1037
+ _internalInvariant ( largeIsCocoa && !isImmortal)
1038
+ let unmanaged = Unmanaged< AnyObject> . fromOpaque( largeAddress)
1039
+ return unmanaged. _withUnsafeGuaranteedRef { body ( $0) }
971
1040
#endif
972
1041
}
973
1042
@@ -976,7 +1045,8 @@ extension _StringObject {
976
1045
@inline ( __always)
977
1046
internal var owner : AnyObject ? {
978
1047
guard self . isMortal else { return nil }
979
- return Builtin . reinterpretCast ( largeAddressBits)
1048
+ let unmanaged = Unmanaged< AnyObject> . fromOpaque( largeAddress)
1049
+ return unmanaged. takeUnretainedValue ( )
980
1050
}
981
1051
}
982
1052
@@ -1055,7 +1125,8 @@ extension _StringObject {
1055
1125
@inline ( __always)
1056
1126
internal var objCBridgeableObject : AnyObject {
1057
1127
_internalInvariant ( hasObjCBridgeableObject)
1058
- return Builtin . reinterpretCast ( largeAddressBits)
1128
+ let unmanaged = Unmanaged< AnyObject> . fromOpaque( largeAddress)
1129
+ return unmanaged. takeUnretainedValue ( )
1059
1130
}
1060
1131
1061
1132
// Whether the object provides fast UTF-8 contents that are nul-terminated
@@ -1219,7 +1290,8 @@ extension _StringObject {
1219
1290
}
1220
1291
}
1221
1292
if _countAndFlags. isNativelyStored {
1222
- let anyObj = Builtin . reinterpretCast ( largeAddressBits) as AnyObject
1293
+ let unmanaged = Unmanaged< AnyObject> . fromOpaque( largeAddress)
1294
+ let anyObj = unmanaged. takeUnretainedValue ( )
1223
1295
_internalInvariant ( anyObj is __StringStorage )
1224
1296
}
1225
1297
}
0 commit comments