Skip to content

Commit a0e726c

Browse files
committed
[Backtracing] Also try CFStringGetCharactersPtr when converting CFStrings.
We already try using `CFStringGetCStringPtr` to see if we can get ASCII; we should also try `CFStringGetCharactersPtr` as the native encoding of `CFNSString` is very often UTF-16. While we're at it, try asking explicitly for UTF-8 as well. That won't work for `CFNSString` because AFAIK it's currently never encoded that way, but it might work if something hands us a Swift-backed string or if some future implementation of `CFString` happens to support UTF-8 encoded data. rdar://124913332
1 parent 7c64fd9 commit a0e726c

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

stdlib/public/RuntimeModule/CoreSymbolication.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ private func symbol<T>(_ handle: UnsafeMutableRawPointer, _ name: String) -> T {
4646
return unsafeBitCast(result, to: T.self)
4747
}
4848

49+
// Define UniChar
50+
typealias UniChar = UInt16
51+
4952
private enum Sym {
5053
// CRCopySanitizedPath
5154
static let CRCopySanitizedPath: @convention(c) (CFString, CFIndex) -> CFString =
@@ -130,6 +133,9 @@ private enum Sym {
130133
UnsafeMutableRawPointer?, CFIndex,
131134
UnsafeMutablePointer<CFIndex>?) -> CFIndex =
132135
symbol(coreFoundationHandle, "CFStringGetBytes")
136+
static let CFStringGetCharactersPtr:
137+
@convention(c) (CFString) -> UnsafePointer<UniChar>? =
138+
symbol(coreFoundationHandle, "CFStringGetCharactersPtr")
133139
}
134140

135141
// .. Core Foundation miscellany ...............................................
@@ -161,6 +167,11 @@ internal func CFStringGetCStringPtr(_ s: CFString,
161167
return Sym.CFStringGetCStringPtr(s, encoding)
162168
}
163169

170+
internal func CFStringGetCharactersPtr(_ s: CFString)
171+
-> UnsafePointer<UniChar>? {
172+
return Sym.CFStringGetCharactersPtr(s);
173+
}
174+
164175
internal func CFStringGetBytes(_ s: CFString,
165176
_ range: CFRange,
166177
_ encoding: CFStringEncoding,
@@ -199,8 +210,15 @@ private func fromCFString(_ cf: CFString) -> String {
199210

200211
if let ptr = CFStringGetCStringPtr(cf,
201212
CFStringBuiltInEncodings.ASCII.rawValue) {
202-
return String(decoding: UnsafeRawBufferPointer(start: ptr, count: length),
203-
as: UTF8.self)
213+
let buffer = UnsafeRawBufferPointer(start: ptr, count: length)
214+
return String(decoding: buffer, as: UTF8.self)
215+
} else if let ptr = CFStringGetCharactersPtr(cf) {
216+
let buffer = UnsafeBufferPointer(start: ptr, count: length)
217+
return String(decoding: buffer, as: UTF16.self)
218+
} else if let ptr = CFStringGetCStringPtr(cf,
219+
CFStringBuiltInEncodings.UTF8.rawValue) {
220+
let buffer = UnsafeRawBufferPointer(start: ptr, count: length)
221+
return String(decoding: buffer, as: UTF8.self)
204222
} else {
205223
var byteLen = CFIndex(0)
206224

0 commit comments

Comments
 (0)