Skip to content

Commit fd0d4d8

Browse files
committed
SR-10555 foreignCopyUTF8 should do bulk access
1 parent ecebf70 commit fd0d4d8

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

stdlib/public/core/StringBridge.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,27 @@ internal func _cocoaStringSubscript(
6969
return _swift_stdlib_CFStringGetCharacterAtIndex(cfSelf, position)
7070
}
7171

72+
@_effects(releasenone)
73+
internal func _cocoaStringCopyUTF8(
74+
_ target: _CocoaString,
75+
into bufPtr: UnsafeMutableBufferPointer<UInt8>
76+
) -> Int? {
77+
let ptr = bufPtr.baseAddress._unsafelyUnwrappedUnchecked
78+
let len = _stdlib_binary_CFStringGetLength(target)
79+
var count = 0
80+
let converted = _swift_stdlib_CFStringGetBytes(
81+
target,
82+
_swift_shims_CFRange(location: 0, length: len),
83+
kCFStringEncodingUTF8,
84+
0,
85+
0,
86+
ptr,
87+
bufPtr.count,
88+
&count
89+
)
90+
return len == converted ? count : nil
91+
}
92+
7293
@_effects(readonly)
7394
internal func _cocoaStringCompare(
7495
_ string: _CocoaString, _ other: _CocoaString

stdlib/public/core/StringGuts.swift

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,16 +246,12 @@ extension _StringGuts {
246246
internal func _foreignCopyUTF8(
247247
into mbp: UnsafeMutableBufferPointer<UInt8>
248248
) -> Int? {
249-
var ptr = mbp.baseAddress._unsafelyUnwrappedUnchecked
250-
var numWritten = 0
251-
for cu in String(self).utf8 {
252-
guard numWritten < mbp.count else { return nil }
253-
ptr.initialize(to: cu)
254-
ptr += 1
255-
numWritten += 1
256-
}
257-
258-
return numWritten
249+
#if _runtime(_ObjC)
250+
// Currently, foreign means NSString
251+
return _cocoaStringCopyUTF8(_object.cocoaObject, into: mbp)
252+
#else
253+
fatalError("No foreign strings on Linux in this version of Swift")
254+
#endif
259255
}
260256

261257
@inline(__always)

0 commit comments

Comments
 (0)