Bug 639420 - Speed up the scanner ten ways, part 6. r=brendan.

This commit is contained in:
Nicholas Nethercote 2011-03-16 15:17:55 -07:00
Родитель 8d79a77d17
Коммит 7258795aa4
3 изменённых файлов: 59 добавлений и 32 удалений

Просмотреть файл

@ -775,15 +775,6 @@ TokenStream::newToken(ptrdiff_t adjust)
return tp;
}
static JS_ALWAYS_INLINE JSBool
ScanAsSpace(jschar c)
{
/* Treat little- and big-endian BOMs as whitespace for compatibility. */
if (JS_ISSPACE(c) || c == 0xfffe || c == 0xfeff)
return JS_TRUE;
return JS_FALSE;
}
JS_ALWAYS_INLINE JSAtom *
TokenStream::atomize(JSContext *cx, CharBuffer &cb)
{
@ -1017,7 +1008,7 @@ TokenStream::getTokenInternal()
flags |= TSF_EOL;
continue;
}
} while (ScanAsSpace((jschar)c));
} while (JS_ISSPACE_OR_BOM((jschar)c));
if (c == EOF) {
tp = newToken(0); /* no -1 here because userbuf.ptr isn't incremented for EOF */
@ -1620,7 +1611,7 @@ TokenStream::getTokenInternal()
cp[3] == 'n' &&
cp[4] == 'e') {
skipChars(5);
while ((c = getChar()) != '\n' && ScanAsSpace((jschar)c))
while ((c = getChar()) != '\n' && JS_ISSPACE_OR_BOM((jschar)c))
continue;
if (JS7_ISDEC(c)) {
line = JS7_UNDEC(c);
@ -1632,7 +1623,7 @@ TokenStream::getTokenInternal()
}
line = temp;
}
while (c != '\n' && ScanAsSpace((jschar)c))
while (c != '\n' && JS_ISSPACE_OR_BOM((jschar)c))
c = getChar();
i = 0;
if (c == '"') {
@ -1647,7 +1638,7 @@ TokenStream::getTokenInternal()
}
if (c == '"') {
while ((c = getChar()) != '\n' &&
ScanAsSpace((jschar)c)) {
JS_ISSPACE_OR_BOM((jschar)c)) {
continue;
}
}

Просмотреть файл

@ -5639,27 +5639,49 @@ const jschar js_uriUnescaped_ucstr[] =
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'-', '_', '.', '!', '~', '*', '\'', '(', ')', 0};
#define ____ false
/*
* This table allows efficient testing for the regular expression \w which is
* defined by ECMA-262 15.10.2.6 to be [0-9A-Z_a-z].
*/
const bool js_alnum[] = {
/* 0 1 2 3 4 5 5 7 8 9 */
/* 0 */ false, false, false, false, false, false, false, false, false, false,
/* 1 */ false, false, false, false, false, false, false, false, false, false,
/* 2 */ false, false, false, false, false, false, false, false, false, false,
/* 3 */ false, false, false, false, false, false, false, false, false, false,
/* 4 */ false, false, false, false, false, false, false, false, true, true,
/* 5 */ true, true, true, true, true, true, true, true, false, false,
/* 6 */ false, false, false, false, false, true, true, true, true, true,
/* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 1 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 2 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 3 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 4 */ ____, ____, ____, ____, ____, ____, ____, ____, true, true,
/* 5 */ true, true, true, true, true, true, true, true, ____, ____,
/* 6 */ ____, ____, ____, ____, ____, true, true, true, true, true,
/* 7 */ true, true, true, true, true, true, true, true, true, true,
/* 8 */ true, true, true, true, true, true, true, true, true, true,
/* 9 */ true, false, false, false, false, true, false, true, true, true,
/* 9 */ true, ____, ____, ____, ____, true, ____, true, true, true,
/* 10 */ true, true, true, true, true, true, true, true, true, true,
/* 11 */ true, true, true, true, true, true, true, true, true, true,
/* 12 */ true, true, true, false, false, false, false, false
/* 12 */ true, true, true, ____, ____, ____, ____, ____
};
/* Whitespace chars: '\t', '\n', '\v', '\f', '\r', ' '. */
const bool js_isspace[] = {
/* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, true,
/* 1 */ true, true, true, true, ____, ____, ____, ____, ____, ____,
/* 2 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 3 */ ____, ____, true, ____, ____, ____, ____, ____, ____, ____,
/* 4 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 5 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 6 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 7 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 8 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 9 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 10 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 11 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
/* 12 */ ____, ____, ____, ____, ____, ____, ____, ____
};
#undef ____
#define URI_CHUNK 64U
static inline bool
@ -5669,7 +5691,7 @@ TransferBufferToString(JSContext *cx, StringBuffer &sb, Value *rval)
if (!str)
return false;
rval->setString(str);
return true;;
return true;
}
/*

Просмотреть файл

@ -732,15 +732,29 @@ extern const bool js_alnum[];
const jschar BYTE_ORDER_MARK = 0xFEFF;
const jschar NO_BREAK_SPACE = 0x00A0;
extern const bool js_isspace[];
static inline bool
JS_ISSPACE(jschar c)
JS_ISSPACE(int c)
{
unsigned w = c;
if (w < 256)
return (w <= ' ' && (w == ' ' || (9 <= w && w <= 0xD))) || w == NO_BREAK_SPACE;
return (w < 128)
? js_isspace[w]
: w == NO_BREAK_SPACE || w == BYTE_ORDER_MARK ||
(JS_CCODE(w) & 0x00070000) == 0x00040000;
}
return w == BYTE_ORDER_MARK || (JS_CCODE(w) & 0x00070000) == 0x00040000;
static inline bool
JS_ISSPACE_OR_BOM(int c)
{
unsigned w = c;
/* Treat little- and big-endian BOMs as whitespace for compatibility. */
return (w < 128)
? js_isspace[w]
: w == NO_BREAK_SPACE || w == BYTE_ORDER_MARK ||
(JS_CCODE(w) & 0x00070000) == 0x00040000 || w == 0xfffe || w == 0xfeff;
}
#define JS_ISPRINT(c) ((c) < 128 && isprint(c))