Skip to content

Commit 8557649

Browse files
authored
Merge pull request #39229 from Catfish-Man/bridge-collusion
Expose __SwiftNativeNSString for Foundation's use, as well as an initializer to create Strings from them
2 parents b5b10ce + 30a3b6d commit 8557649

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

stdlib/public/core/GroupInfo.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"StringRangeReplaceableCollection.swift",
3434
"StringGutsRangeReplaceable.swift",
3535
"StringStorage.swift",
36+
"StringStorageBridge.swift",
3637
"StringSwitch.swift",
3738
"StringTesting.swift",
3839
"StringUTF16View.swift",

stdlib/public/core/StringBridge.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ internal func _SwiftCreateBridgedString_DoNotCall(
658658
// This allows us to subclass an Objective-C class and use the fast Swift
659659
// memory allocator.
660660
@objc @_swift_native_objc_runtime_base(__SwiftNativeNSStringBase)
661-
class __SwiftNativeNSString {
661+
@_spi(Foundation) public class __SwiftNativeNSString {
662662
@objc internal init() {}
663663
deinit {}
664664
}

stdlib/public/core/StringStorageBridge.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,28 @@ import SwiftShims
1717
internal let _cocoaASCIIEncoding:UInt = 1 /* NSASCIIStringEncoding */
1818
internal let _cocoaUTF8Encoding:UInt = 4 /* NSUTF8StringEncoding */
1919

20+
extension String {
21+
@available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
22+
@_spi(Foundation)
23+
public init?(_nativeStorage: AnyObject) {
24+
let knownOther = _KnownCocoaString(_nativeStorage)
25+
switch knownOther {
26+
case .storage:
27+
self = _unsafeUncheckedDowncast(
28+
_nativeStorage,
29+
to: __StringStorage.self
30+
).asString
31+
case .shared:
32+
self = _unsafeUncheckedDowncast(
33+
_nativeStorage,
34+
to: __SharedStringStorage.self
35+
).asString
36+
default:
37+
return nil
38+
}
39+
}
40+
}
41+
2042
// ObjC interfaces.
2143
extension _AbstractStringStorage {
2244
@inline(__always)

0 commit comments

Comments
 (0)