Skip to content

Commit c628661

Browse files
committed
Replace calls to CFStringCreateWithCString with CFSTR macro
This would save performance by removing unnecessary calls to CFStringCreateWithCString. This would save performance by removing unnecessary calls to CFStringCreateWithCString. Note: Windows does not have CFSTR, so I added a macro workaround for platforms where __CONSTANT_CFSTRINGS__ is not defined, so CoreFoundation can compile without issue.
1 parent 01f6389 commit c628661

File tree

6 files changed

+41
-28
lines changed

6 files changed

+41
-28
lines changed

CoreFoundation/Base.subproj/CFPlatform.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,11 @@ CF_PRIVATE CFStringRef _CFProcessNameString(void) {
278278
static CFStringRef __CFProcessNameString = NULL;
279279
if (!__CFProcessNameString) {
280280
const char *processName = *_CFGetProgname();
281-
if (!processName) processName = "";
282-
CFStringRef newStr = CFStringCreateWithCString(kCFAllocatorSystemDefault, processName, kCFPlatformInterfaceStringEncoding);
281+
CFStringRef newStr;
282+
if (processName)
283+
newStr = CFStringCreateWithCString(kCFAllocatorSystemDefault, processName, kCFPlatformInterfaceStringEncoding);
284+
else
285+
newStr = CFSTR("");
283286
#pragma GCC diagnostic push
284287
#pragma GCC diagnostic ignored "-Wdeprecated"
285288
if (!OSAtomicCompareAndSwapPtrBarrier(NULL, (void *) newStr, (void * volatile *)& __CFProcessNameString)) {
@@ -392,7 +395,7 @@ CF_PRIVATE CFStringRef _CFStringCreateHostName(void) {
392395
char myName[CFMaxHostNameSize];
393396

394397
// return @"" instead of nil a la CFUserName() and Ali Ozer
395-
if (0 != gethostname(myName, CFMaxHostNameSize)) myName[0] = '\0';
398+
if (0 != gethostname(myName, CFMaxHostNameSize)) return CFSTR("");
396399
return CFStringCreateWithCString(kCFAllocatorSystemDefault, myName, kCFPlatformInterfaceStringEncoding);
397400
}
398401

CoreFoundation/Base.subproj/CFRuntime.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ bool (*__CFObjCIsCollectable)(void *) = NULL;
274274
// The constant string class reference is set at link time to _NSCFConstantString
275275
void *__CFConstantStringClassReferencePtr = &_CF_CONSTANT_STRING_SWIFT_CLASS;
276276
#else
277-
#if !__CONSTANT_CFSTRINGS__
277+
#ifndef __CONSTANT_CFSTRINGS__
278278
// Compiler uses this symbol name; must match compiler built-in decl, so we use 'int'
279279
#if TARGET_RT_64_BIT
280280
int __CFConstantStringClassReference[24] = {0};

CoreFoundation/Locale.subproj/CFDateFormatter.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ static CFMutableStringRef __createISO8601FormatString(CFISO8601DateFormatOptions
979979
}
980980

981981
CFDateFormatterRef CFDateFormatterCreateISO8601Formatter(CFAllocatorRef allocator, CFISO8601DateFormatOptions formatOptions) {
982-
CFStringRef localeStr = CFStringCreateWithCString(kCFAllocatorSystemDefault, "en_US_POSIX", kCFStringEncodingUTF8);
982+
CFStringRef localeStr = CFSTR("en_US_POSIX");
983983
CFLocaleRef locale = CFLocaleCreate(kCFAllocatorSystemDefault, localeStr);
984984
CFDateFormatterRef ISO8601Formatter = __CreateCFDateFormatter(allocator, locale, kCFDateFormatterNoStyle, kCFDateFormatterNoStyle, kCFBooleanTrue); // dateStyle and timeStyle are not relevant for ISO8601
985985

@@ -991,7 +991,6 @@ CFDateFormatterRef CFDateFormatterCreateISO8601Formatter(CFAllocatorRef allocato
991991
}
992992
}
993993

994-
CFRelease(localeStr);
995994
CFRelease(locale);
996995

997996
return ISO8601Formatter;

CoreFoundation/Parsing.subproj/CFXMLInterface.c

+30-19
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ CF_INLINE struct _NSCFXMLBridgeStrong __CFSwiftXMLParserBridgeGetStronglyTyped()
3333
}
3434
#define __CFSwiftXMLParserBridgeCF (__CFSwiftXMLParserBridgeGetStronglyTyped())
3535

36+
// CFSTR is not supported on Windows, so we have to fake it just for this file
37+
#ifndef __CONSTANT_CFSTRINGS__
38+
#pragma push_macro("CFSTR")
39+
#undef CFSTR
40+
#define CFSTR(x) __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, (x), kCFStringEncodingUTF8)
41+
#endif
42+
3643
/*
3744
libxml2 does not have nullability annotations and does not import well into swift when given potentially differing versions of the library that might be installed on the host operating system. This is a simple C wrapper to simplify some of that interface layer to libxml2.
3845
*/
@@ -350,7 +357,7 @@ void _CFXMLInterfaceSAX2UnparsedEntityDecl(_CFXMLInterfaceParserContext ctx, con
350357
}
351358

352359
CFErrorRef _CFErrorCreateFromXMLInterface(_CFXMLInterfaceError err) {
353-
return __CFSwiftXMLParserBridgeCF.CFErrorCreate(*(__CFSwiftXMLParserBridgeCF.kCFAllocatorSystemDefault), __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "NSXMLParserErrorDomain", kCFStringEncodingUTF8), err->code, NULL);
360+
return __CFSwiftXMLParserBridgeCF.CFErrorCreate(*(__CFSwiftXMLParserBridgeCF.kCFAllocatorSystemDefault), CFSTR("NSXMLParserErrorDomain"), err->code, NULL);
354361
}
355362

356363
_CFXMLNodePtr _CFXMLNewNode(_CFXMLNamespacePtr namespace, const char* name) {
@@ -594,14 +601,14 @@ void _CFXMLNodeSetContent(_CFXMLNodePtr node, const unsigned char* _Nullable co
594601
// rather than writing custom code to parse the new content into the correct
595602
// xmlElementContent structures, let's leverage what we've already got.
596603
CFMutableStringRef xmlString = __CFSwiftXMLParserBridgeCF.CFStringCreateMutable(NULL, 0);
597-
__CFSwiftXMLParserBridgeCF.CFStringAppend(xmlString, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "<!ELEMENT ", kCFStringEncodingUTF8));
604+
__CFSwiftXMLParserBridgeCF.CFStringAppend(xmlString, CFSTR("<!ELEMENT "));
598605
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(xmlString, (const char*)element->name, kCFStringEncodingUTF8);
599-
__CFSwiftXMLParserBridgeCF.CFStringAppend(xmlString, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, " ", kCFStringEncodingUTF8));
606+
__CFSwiftXMLParserBridgeCF.CFStringAppend(xmlString, CFSTR(" "));
600607
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(xmlString, (const char*)content, kCFStringEncodingUTF8);
601-
__CFSwiftXMLParserBridgeCF.CFStringAppend(xmlString, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, ">", kCFStringEncodingUTF8));
608+
__CFSwiftXMLParserBridgeCF.CFStringAppend(xmlString, CFSTR(">"));
602609

603610
size_t bufferSize = __CFSwiftXMLParserBridgeCF.CFStringGetMaximumSizeForEncoding(__CFSwiftXMLParserBridgeCF.CFStringGetLength(xmlString), kCFStringEncodingUTF8) + 1;
604-
char* buffer = calloc(bufferSize, 1);
611+
char* buffer = calloc(1, bufferSize);
605612
__CFSwiftXMLParserBridgeCF.CFStringGetCString(xmlString, buffer, bufferSize, kCFStringEncodingUTF8);
606613
xmlElementPtr resultNode = _CFXMLParseDTDNode((const xmlChar*)buffer);
607614

@@ -864,35 +871,35 @@ CFStringRef _CFXMLCopyStringWithOptions(_CFXMLNodePtr node, uint32_t options) {
864871
// predefined entities need special handling, libxml2 just tosses an error and returns a NULL string
865872
// if we try to use xmlSaveTree on a predefined entity
866873
CFMutableStringRef result = __CFSwiftXMLParserBridgeCF.CFStringCreateMutable(NULL, 0);
867-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "<!ENTITY ", kCFStringEncodingUTF8));
874+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("<!ENTITY "));
868875
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(result, (const char*)((xmlEntityPtr)node)->name, kCFStringEncodingUTF8);
869-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, " \"", kCFStringEncodingUTF8));
876+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR(" \""));
870877
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(result, (const char*)((xmlEntityPtr)node)->content, kCFStringEncodingUTF8);
871-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "\">", kCFStringEncodingUTF8));
878+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("\">"));
872879

873880
return result;
874881
} else if (((xmlNodePtr)node)->type == XML_NOTATION_NODE) {
875882
// This is not actually a thing that occurs naturally in libxml2
876883
xmlNotationPtr notation = ((_cfxmlNotation*)node)->notation;
877884
CFMutableStringRef result = __CFSwiftXMLParserBridgeCF.CFStringCreateMutable(NULL, 0);
878-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "<!NOTATION ", kCFStringEncodingUTF8));
885+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("<!NOTATION "));
879886
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(result, (const char*)notation->name, kCFStringEncodingUTF8);
880-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, " ", kCFStringEncodingUTF8));
887+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR(" "));
881888
if (notation->PublicID == NULL && notation->SystemID != NULL) {
882-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "SYSTEM ", kCFStringEncodingUTF8));
889+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("SYSTEM "));
883890
} else if (notation->PublicID != NULL) {
884-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "PUBLIC \"", kCFStringEncodingUTF8));
891+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("PUBLIC \""));
885892
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(result, (const char*)notation->PublicID, kCFStringEncodingUTF8);
886-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "\"", kCFStringEncodingUTF8));
893+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("\""));
887894
}
888895

889896
if (notation->SystemID != NULL) {
890-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "\"", kCFStringEncodingUTF8));
897+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("\""));
891898
__CFSwiftXMLParserBridgeCF.CFStringAppendCString(result, (const char*)notation->SystemID, kCFStringEncodingUTF8);
892-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "\"", kCFStringEncodingUTF8));
899+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR("\""));
893900
}
894901

895-
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, " >", kCFStringEncodingUTF8));
902+
__CFSwiftXMLParserBridgeCF.CFStringAppend(result, CFSTR(" >"));
896903

897904
return result;
898905
}
@@ -918,7 +925,7 @@ CFStringRef _CFXMLCopyStringWithOptions(_CFXMLNodePtr node, uint32_t options) {
918925
int error = xmlSaveClose(ctx);
919926

920927
if (error == -1) {
921-
return __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "", kCFStringEncodingUTF8);
928+
return CFSTR("");
922929
}
923930

924931
const xmlChar* bufferContents = xmlBufferContent(buffer);
@@ -1111,7 +1118,7 @@ bool _CFXMLDocValidate(_CFXMLDocPtr doc, CFErrorRef _Nullable * error) {
11111118
CFMutableDictionaryRef userInfo = __CFSwiftXMLParserBridgeCF.CFDictionaryCreateMutable(NULL, 1, __CFSwiftXMLParserBridgeCF.kCFCopyStringDictionaryKeyCallBacks, __CFSwiftXMLParserBridgeCF.kCFTypeDictionaryValueCallBacks);
11121119
__CFSwiftXMLParserBridgeCF.CFDictionarySetValue(userInfo, *(__CFSwiftXMLParserBridgeCF.kCFErrorLocalizedDescriptionKey), errorMessage);
11131120

1114-
*error = __CFSwiftXMLParserBridgeCF.CFErrorCreate(NULL, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "NSXMLParserErrorDomain", kCFStringEncodingUTF8), 0, userInfo);
1121+
*error = __CFSwiftXMLParserBridgeCF.CFErrorCreate(NULL, CFSTR("NSXMLParserErrorDomain"), 0, userInfo);
11151122

11161123
__CFSwiftXMLParserBridgeCF.CFRelease(userInfo);
11171124
}
@@ -1177,7 +1184,7 @@ _CFXMLDTDPtr _Nullable _CFXMLParseDTDFromData(CFDataRef data, CFErrorRef _Nullab
11771184
CFMutableDictionaryRef userInfo = __CFSwiftXMLParserBridgeCF.CFDictionaryCreateMutable(NULL, 1, __CFSwiftXMLParserBridgeCF.kCFCopyStringDictionaryKeyCallBacks, __CFSwiftXMLParserBridgeCF.kCFTypeDictionaryValueCallBacks);
11781185
__CFSwiftXMLParserBridgeCF.CFDictionarySetValue(userInfo, *(__CFSwiftXMLParserBridgeCF.kCFErrorLocalizedDescriptionKey), errorMessage);
11791186

1180-
*error = __CFSwiftXMLParserBridgeCF.CFErrorCreate(NULL, __CFSwiftXMLParserBridgeCF.CFStringCreateWithCString(NULL, "NSXMLParserErrorDomain", kCFStringEncodingUTF8), 0, userInfo);
1187+
*error = __CFSwiftXMLParserBridgeCF.CFErrorCreate(NULL, CFSTR("NSXMLParserErrorDomain"), 0, userInfo);
11811188

11821189
__CFSwiftXMLParserBridgeCF.CFRelease(userInfo);
11831190
}
@@ -1598,3 +1605,7 @@ bool _CFXMLGetLengthOfPrefixInQualifiedName(const char *_Nonnull qname, size_t *
15981605
return false;
15991606
}
16001607
}
1608+
1609+
#ifndef __CONSTANT_CFSTRINGS__
1610+
#pragma pop_macro("CFSTR")
1611+
#endif

CoreFoundation/Preferences.subproj/CFPreferences.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ CF_PRIVATE CFArrayRef _CFPreferencesCreateDomainList(CFStringRef userName, CFSt
558558
return NULL;
559559
}
560560
if (hostName == kCFPreferencesAnyHost) {
561-
suffix = CFStringCreateWithCString(prefAlloc, ".plist", kCFStringEncodingASCII);
561+
suffix = CFSTR(".plist");
562562
} else if (hostName == kCFPreferencesCurrentHost) {
563563
CFStringRef hostID = _CFPreferencesGetByHostIdentifierString();
564564
suffix = CFStringCreateWithFormat(prefAlloc, NULL, CFSTR(".%@.plist"), hostID);

CoreFoundation/URL.subproj/CFURL.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -4058,9 +4058,9 @@ static CFStringRef WindowsPathToURLPath(CFStringRef path, CFAllocatorRef alloc,
40584058
CFArrayRef urlComponents;
40594059
CFStringRef str;
40604060

4061-
if (CFStringGetLength(path) == 0) return CFStringCreateWithCString(alloc, "", kCFStringEncodingASCII);
4061+
if (CFStringGetLength(path) == 0) return CFSTR("");
40624062
urlComponents = WindowsPathToURLComponents(path, alloc, isDir, isAbsolute);
4063-
if (!urlComponents) return CFStringCreateWithCString(alloc, "", kCFStringEncodingASCII);
4063+
if (!urlComponents) return CFSTR("");
40644064

40654065
// WindowsPathToURLComponents already added percent escapes for us; no need to add them again here.
40664066
str = CFStringCreateByCombiningStrings(alloc, urlComponents, CFSTR("/"));

0 commit comments

Comments
 (0)