diff --git a/stdlib/public/RuntimeModule/CoreSymbolication.swift b/stdlib/public/RuntimeModule/CoreSymbolication.swift index a9ec307f7b9..94634b6fedb 100644 --- a/stdlib/public/RuntimeModule/CoreSymbolication.swift +++ b/stdlib/public/RuntimeModule/CoreSymbolication.swift @@ -46,6 +46,9 @@ private func symbol(_ handle: UnsafeMutableRawPointer, _ name: String) -> T { return unsafeBitCast(result, to: T.self) } +// Define UniChar +typealias UniChar = UInt16 + private enum Sym { // CRCopySanitizedPath static let CRCopySanitizedPath: @convention(c) (CFString, CFIndex) -> CFString = @@ -130,6 +133,9 @@ private enum Sym { UnsafeMutableRawPointer?, CFIndex, UnsafeMutablePointer?) -> CFIndex = symbol(coreFoundationHandle, "CFStringGetBytes") + static let CFStringGetCharactersPtr: + @convention(c) (CFString) -> UnsafePointer? = + symbol(coreFoundationHandle, "CFStringGetCharactersPtr") } // .. Core Foundation miscellany ............................................... @@ -161,6 +167,11 @@ internal func CFStringGetCStringPtr(_ s: CFString, return Sym.CFStringGetCStringPtr(s, encoding) } +internal func CFStringGetCharactersPtr(_ s: CFString) + -> UnsafePointer? { + return Sym.CFStringGetCharactersPtr(s); +} + internal func CFStringGetBytes(_ s: CFString, _ range: CFRange, _ encoding: CFStringEncoding, @@ -199,8 +210,15 @@ private func fromCFString(_ cf: CFString) -> String { if let ptr = CFStringGetCStringPtr(cf, CFStringBuiltInEncodings.ASCII.rawValue) { - return String(decoding: UnsafeRawBufferPointer(start: ptr, count: length), - as: UTF8.self) + let buffer = UnsafeRawBufferPointer(start: ptr, count: length) + return String(decoding: buffer, as: UTF8.self) + } else if let ptr = CFStringGetCharactersPtr(cf) { + let buffer = UnsafeBufferPointer(start: ptr, count: length) + return String(decoding: buffer, as: UTF16.self) + } else if let ptr = CFStringGetCStringPtr(cf, + CFStringBuiltInEncodings.UTF8.rawValue) { + let buffer = UnsafeRawBufferPointer(start: ptr, count: length) + return String(decoding: buffer, as: UTF8.self) } else { var byteLen = CFIndex(0)