From 559f7cf37ebb5d65cd13e432546c66e1d00573a6 Mon Sep 17 00:00:00 2001 From: chakrabot Date: Thu, 26 Oct 2017 03:02:54 -0700 Subject: [PATCH] [Merge Microsoft/Chakracore@8dbf8e4721] [MERGE #4035 @rhuanjl] Optimise xplat UtcTimeFromStrCore Merge pull request #4035 from rhuanjl:fastXplatDateFromString Added a fast path for standard ascii characters to PAL_tolower Resolves https://github.com/Microsoft/ChakraCore/issues/4008 --- .../core/pal/src/cruntime/wchar.cpp | 84 +++++++++++-------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/deps/chakrashim/core/pal/src/cruntime/wchar.cpp b/deps/chakrashim/core/pal/src/cruntime/wchar.cpp index d8b4f178582..42367502eb4 100644 --- a/deps/chakrashim/core/pal/src/cruntime/wchar.cpp +++ b/deps/chakrashim/core/pal/src/cruntime/wchar.cpp @@ -885,51 +885,67 @@ char16_t __cdecl PAL_towlower( char16_t c ) { -#if HAVE_COREFOUNDATION PERF_ENTRY(towlower); ENTRY("towlower (c=%d)\n", c); - if (!PAL_iswlower(c)) - { - CFMutableStringRef cfString = CFStringCreateMutable( - kCFAllocatorDefault, 1); - if (cfString != NULL) + if(c < 128) + {//fast path for ascii characters + if(c >= 'A' && c <= 'Z') { - CFStringAppendCharacters(cfString, (const UniChar*)&c, 1); - CFStringLowercase(cfString, NULL); - c = CFStringGetCharacterAtIndex(cfString, 0); - CFRelease(cfString); + c += ('a' - 'A'); + PERF_EXIT(towlower); + LOGEXIT("towlower returns int %d\n", c ); + return c; + } + else + { + PERF_EXIT(towlower); + LOGEXIT("towlower returns int %d\n", c ); + return c; } } - LOGEXIT("towlower returns int %d\n", c ); - PERF_EXIT(towlower); - return c; -#else /* HAVE_COREFOUNDATION */ - UnicodeDataRec dataRec; - - PERF_ENTRY(towlower); - ENTRY("towlower (c=%d)\n", c); - - if (!GetUnicodeData(c, &dataRec)) + else { - TRACE( "Unable to retrieve unicode data for the character %c.\n", c ); + #if HAVE_COREFOUNDATION + if (!PAL_iswlower(c)) + { + CFMutableStringRef cfString = CFStringCreateMutable( + kCFAllocatorDefault, 1); + if (cfString != NULL) + { + CFStringAppendCharacters(cfString, (const UniChar*)&c, 1); + CFStringLowercase(cfString, NULL); + c = CFStringGetCharacterAtIndex(cfString, 0); + CFRelease(cfString); + } + } LOGEXIT("towlower returns int %d\n", c ); PERF_EXIT(towlower); return c; - } + #else /* HAVE_COREFOUNDATION */ + UnicodeDataRec dataRec; - if ( (dataRec.C1_TYPE_FLAGS & C1_LOWER) || (dataRec.nOpposingCase == 0 )) - { - LOGEXIT("towlower returns int %d\n", c ); - PERF_EXIT(towlower); - return c; - } - else - { - LOGEXIT("towlower returns int %d\n", dataRec.nOpposingCase ); - PERF_EXIT(towlower); - return dataRec.nOpposingCase; + if (!GetUnicodeData(c, &dataRec)) + { + TRACE( "Unable to retrieve unicode data for the character %c.\n", c ); + LOGEXIT("towlower returns int %d\n", c ); + PERF_EXIT(towlower); + return c; + } + + if ( (dataRec.C1_TYPE_FLAGS & C1_LOWER) || (dataRec.nOpposingCase == 0 )) + { + LOGEXIT("towlower returns int %d\n", c ); + PERF_EXIT(towlower); + return c; + } + else + { + LOGEXIT("towlower returns int %d\n", dataRec.nOpposingCase ); + PERF_EXIT(towlower); + return dataRec.nOpposingCase; + } + #endif /* HAVE_COREFOUNDATION */ } -#endif /* HAVE_COREFOUNDATION */ }