Skip to content

Commit

Permalink
[MERGE #4035 @rhuanjl] Optimise xplat UtcTimeFromStrCore
Browse files Browse the repository at this point in the history
Merge pull request #4035 from rhuanjl:fastXplatDateFromString

Added a fast path for standard ascii characters to PAL_tolower

Resolves #4008
  • Loading branch information
MSLaguana committed Oct 25, 2017
2 parents ee33785 + 696b4d8 commit 8dbf8e4
Showing 1 changed file with 50 additions and 34 deletions.
84 changes: 50 additions & 34 deletions pal/src/cruntime/wchar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
}


Expand Down

0 comments on commit 8dbf8e4

Please sign in to comment.