Bug 1156886 - Optimize toLowerCase and toUpperCase on ASCII characters. r=luke

This commit is contained in:
Jan de Mooij 2015-04-22 11:30:47 +02:00
parent d50a6635d4
commit 0f0dffb24e
2 changed files with 32 additions and 2 deletions

View File

@ -603,7 +603,7 @@ ToLowerCase(JSContext* cx, JSLinearString* str)
size_t i = 0; size_t i = 0;
for (; i < length; i++) { for (; i < length; i++) {
char16_t c = chars[i]; char16_t c = chars[i];
if (unicode::ToLowerCase(c) != c) if (unicode::CanLowerCase(c))
break; break;
} }
@ -722,7 +722,7 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
size_t i = 0; size_t i = 0;
for (; i < length; i++) { for (; i < length; i++) {
char16_t c = chars[i]; char16_t c = chars[i];
if (unicode::ToUpperCase(c) != c) if (unicode::CanUpperCase(c))
break; break;
} }

View File

@ -191,6 +191,12 @@ IsSpaceOrBOM2(char16_t ch)
inline char16_t inline char16_t
ToUpperCase(char16_t ch) ToUpperCase(char16_t ch)
{ {
if (ch < 128) {
if (ch >= 'a' && ch <= 'z')
return ch - ('a' - 'A');
return ch;
}
const CharacterInfo& info = CharInfo(ch); const CharacterInfo& info = CharInfo(ch);
return uint16_t(ch) + info.upperCase; return uint16_t(ch) + info.upperCase;
@ -199,11 +205,35 @@ ToUpperCase(char16_t ch)
inline char16_t inline char16_t
ToLowerCase(char16_t ch) ToLowerCase(char16_t ch)
{ {
if (ch < 128) {
if (ch >= 'A' && ch <= 'Z')
return ch + ('a' - 'A');
return ch;
}
const CharacterInfo& info = CharInfo(ch); const CharacterInfo& info = CharInfo(ch);
return uint16_t(ch) + info.lowerCase; return uint16_t(ch) + info.lowerCase;
} }
// Returns true iff ToUpperCase(ch) != ch.
inline bool
CanUpperCase(char16_t ch)
{
if (ch < 128)
return ch >= 'a' && ch <= 'z';
return CharInfo(ch).upperCase != 0;
}
// Returns true iff ToLowerCase(ch) != ch.
inline bool
CanLowerCase(char16_t ch)
{
if (ch < 128)
return ch >= 'A' && ch <= 'Z';
return CharInfo(ch).lowerCase != 0;
}
} /* namespace unicode */ } /* namespace unicode */
} /* namespace js */ } /* namespace js */