From 439d981a02f0cda15ec6a9318cecfe445f84f677 Mon Sep 17 00:00:00 2001 From: "igor%mir2.org" Date: Wed, 16 Jan 2008 08:31:15 +0000 Subject: [PATCH] Bug 412047: optimizing regexp upper/lower. r=crowder,a=blocking1.9 git-svn-id: svn://10.0.0.236/trunk@243191 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/src/jsregexp.c | 41 +++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/mozilla/js/src/jsregexp.c b/mozilla/js/src/jsregexp.c index e5210bec495..0b98cc1db91 100644 --- a/mozilla/js/src/jsregexp.c +++ b/mozilla/js/src/jsregexp.c @@ -353,22 +353,33 @@ typedef struct REGlobalData { * code point value is less than decimal 128, then return ch. * 6. Return cu. */ -static jschar -upcase(jschar ch) +static uintN +upcase(uintN ch) { - jschar cu = JS_TOUPPER(ch); - if (ch >= 128 && cu < 128) + uintN cu; + + JS_ASSERT((uintN) (jschar) ch == ch); + if (ch < 128) { + if (ch - (uintN) 'a' <= (uintN) ('z' - 'a')) + ch -= (uintN) ('a' - 'A'); return ch; - return cu; + } + + cu = JS_TOUPPER(ch); + return (cu < 128) ? ch : cu; } -static jschar -downcase(jschar ch) +static uintN +downcase(uintN ch) { - jschar cl = JS_TOLOWER(ch); - if (cl >= 128 && ch < 128) + JS_ASSERT((uintN) (jschar) ch == ch); + if (ch < 128) { + if (ch - (uintN) 'A' <= (uintN) ('Z' - 'A')) + ch += (uintN) ('a' - 'A'); return ch; - return cl; + } + + return JS_TOLOWER(ch); } /* Construct and initialize an RENode, returning NULL for out-of-memory */ @@ -944,7 +955,7 @@ CalculateBitmapSize(CompilerState *state, RENode *target, const jschar *src, break; case 'c': if (src < end && RE_IS_LETTER(*src)) { - localMax = (jschar) (*src++ & 0x1F); + localMax = (uintN) (*src++) & 0x1F; } else { --src; localMax = '\\'; @@ -1044,7 +1055,7 @@ lexHex: break; } if (state->flags & JSREG_FOLD) { - c = JS_MAX(upcase((jschar) localMax), downcase((jschar) localMax)); + c = (jschar) JS_MAX(upcase(localMax), downcase(localMax)); if (c > localMax) localMax = c; } @@ -2220,12 +2231,12 @@ AddCharacterToCharSet(RECharSet *cs, jschar c) /* Add a character range, c1 to c2 (inclusive) to the RECharSet */ static void -AddCharacterRangeToCharSet(RECharSet *cs, jschar c1, jschar c2) +AddCharacterRangeToCharSet(RECharSet *cs, uintN c1, uintN c2) { uintN i; - uintN byteIndex1 = (uintN)(c1 >> 3); - uintN byteIndex2 = (uintN)(c2 >> 3); + uintN byteIndex1 = c1 >> 3; + uintN byteIndex2 = c2 >> 3; JS_ASSERT((c2 <= cs->length) && (c1 <= c2));