From 584fbfc2455e1e30af305070c08f0f80aef20afe Mon Sep 17 00:00:00 2001 From: David Smith Date: Fri, 12 Apr 2019 16:16:12 -0700 Subject: [PATCH] Avoid the overhead of looking up the current CFAllocator in String bridging --- .../public/SwiftShims/CoreFoundationShims.h | 6 ++--- stdlib/public/core/StringBridge.swift | 24 +++++++++++++++---- stdlib/public/stubs/FoundationHelpers.mm | 17 ++++++++----- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/stdlib/public/SwiftShims/CoreFoundationShims.h b/stdlib/public/SwiftShims/CoreFoundationShims.h index e71a0c77be4c2..a27ab00befe44 100644 --- a/stdlib/public/SwiftShims/CoreFoundationShims.h +++ b/stdlib/public/SwiftShims/CoreFoundationShims.h @@ -80,7 +80,7 @@ _swift_shims_CFIndex _swift_stdlib_CFStringGetLength( SWIFT_RUNTIME_STDLIB_API __attribute__((ns_returns_retained)) _swift_shims_CFStringRef _Nonnull _swift_stdlib_CFStringCreateWithSubstring( - _swift_shims_CFAllocatorRef _Nullable alloc, + const void * _Nullable unused, _swift_shims_CFStringRef _Nonnull str, _swift_shims_CFRange range); SWIFT_RUNTIME_STDLIB_API @@ -90,13 +90,13 @@ _swift_shims_UniChar _swift_stdlib_CFStringGetCharacterAtIndex( SWIFT_RUNTIME_STDLIB_API __attribute__((ns_returns_retained)) _swift_shims_CFStringRef _Nonnull _swift_stdlib_CFStringCreateCopy( - _swift_shims_CFAllocatorRef _Nullable alloc, + const void * _Nullable unused, _swift_shims_CFStringRef _Nonnull theString); SWIFT_RUNTIME_STDLIB_API __attribute__((ns_returns_retained)) _swift_shims_CFStringRef _Nonnull _swift_stdlib_CFStringCreateWithBytes( - _swift_shims_CFAllocatorRef _Nullable alloc, + const void * _Nullable unused, const __swift_uint8_t *_Nonnull bytes, _swift_shims_CFIndex numBytes, _swift_shims_CFStringEncoding encoding, _swift_shims_Boolean isExternalRepresentation); diff --git a/stdlib/public/core/StringBridge.swift b/stdlib/public/core/StringBridge.swift index 21b7cb9ebf4c4..3ba5fbdef5ff5 100644 --- a/stdlib/public/core/StringBridge.swift +++ b/stdlib/public/core/StringBridge.swift @@ -266,18 +266,32 @@ extension String { } } +@_effects(releasenone) +private func _createCFString( + _ ptr: UnsafePointer, + _ count: Int, + _ encoding: UInt32 +) -> AnyObject { + return _swift_stdlib_CFStringCreateWithBytes( + nil, //ignored in the shim for perf reasons + ptr, + count, + kCFStringEncodingUTF8, + 0 + ) as AnyObject +} + extension String { @_effects(releasenone) public // SPI(Foundation) func _bridgeToObjectiveCImpl() -> AnyObject { if _guts.isSmall { return _guts.asSmall.withUTF8 { bufPtr in - // TODO(String bridging): worth isASCII check for different encoding? - return _swift_stdlib_CFStringCreateWithBytes( - nil, bufPtr.baseAddress._unsafelyUnwrappedUnchecked, + return _createCFString( + bufPtr.baseAddress._unsafelyUnwrappedUnchecked, bufPtr.count, - kCFStringEncodingUTF8, 0) - as AnyObject + kCFStringEncodingUTF8 + ) } } if _guts._object.isImmortal { diff --git a/stdlib/public/stubs/FoundationHelpers.mm b/stdlib/public/stubs/FoundationHelpers.mm index e2cb9c8c6e4e7..edafdb8392f43 100644 --- a/stdlib/public/stubs/FoundationHelpers.mm +++ b/stdlib/public/stubs/FoundationHelpers.mm @@ -77,10 +77,13 @@ static CFRange cast(_swift_shims_CFRange value) { _swift_shims_CFStringRef swift::_swift_stdlib_CFStringCreateWithSubstring( - _swift_shims_CFAllocatorRef alloc, + const void *unused, _swift_shims_CFStringRef str, _swift_shims_CFRange range) { - return cast(CFStringCreateWithSubstring(cast(alloc), cast(str), cast(range))); + assert(unused == NULL); + return cast(CFStringCreateWithSubstring(kCFAllocatorSystemDefault, + cast(str), + cast(range))); } _swift_shims_CFComparisonResult @@ -108,17 +111,19 @@ static CFRange cast(_swift_shims_CFRange value) { } _swift_shims_CFStringRef -swift::_swift_stdlib_CFStringCreateCopy(_swift_shims_CFAllocatorRef alloc, +swift::_swift_stdlib_CFStringCreateCopy(const void *unused, _swift_shims_CFStringRef theString) { - return cast(CFStringCreateCopy(cast(alloc), cast(theString))); + assert(unused == NULL); + return cast(CFStringCreateCopy(kCFAllocatorSystemDefault, cast(theString))); } _swift_shims_CFStringRef swift::_swift_stdlib_CFStringCreateWithBytes( - _swift_shims_CFAllocatorRef _Nullable alloc, const uint8_t *bytes, + const void *unused, const uint8_t *bytes, _swift_shims_CFIndex numBytes, _swift_shims_CFStringEncoding encoding, _swift_shims_Boolean isExternalRepresentation) { - return cast(CFStringCreateWithBytes(cast(alloc), bytes, numBytes, + assert(unused == NULL); + return cast(CFStringCreateWithBytes(kCFAllocatorSystemDefault, bytes, numBytes, cast(encoding), isExternalRepresentation)); }