зеркало из https://github.com/mozilla/gecko-dev.git
Bug 639420 - Speed up the scanner ten ways, part 6. r=brendan.
This commit is contained in:
Родитель
8d79a77d17
Коммит
7258795aa4
|
@ -775,15 +775,6 @@ TokenStream::newToken(ptrdiff_t adjust)
|
||||||
return tp;
|
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 *
|
JS_ALWAYS_INLINE JSAtom *
|
||||||
TokenStream::atomize(JSContext *cx, CharBuffer &cb)
|
TokenStream::atomize(JSContext *cx, CharBuffer &cb)
|
||||||
{
|
{
|
||||||
|
@ -1017,7 +1008,7 @@ TokenStream::getTokenInternal()
|
||||||
flags |= TSF_EOL;
|
flags |= TSF_EOL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} while (ScanAsSpace((jschar)c));
|
} while (JS_ISSPACE_OR_BOM((jschar)c));
|
||||||
|
|
||||||
if (c == EOF) {
|
if (c == EOF) {
|
||||||
tp = newToken(0); /* no -1 here because userbuf.ptr isn't incremented for 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[3] == 'n' &&
|
||||||
cp[4] == 'e') {
|
cp[4] == 'e') {
|
||||||
skipChars(5);
|
skipChars(5);
|
||||||
while ((c = getChar()) != '\n' && ScanAsSpace((jschar)c))
|
while ((c = getChar()) != '\n' && JS_ISSPACE_OR_BOM((jschar)c))
|
||||||
continue;
|
continue;
|
||||||
if (JS7_ISDEC(c)) {
|
if (JS7_ISDEC(c)) {
|
||||||
line = JS7_UNDEC(c);
|
line = JS7_UNDEC(c);
|
||||||
|
@ -1632,7 +1623,7 @@ TokenStream::getTokenInternal()
|
||||||
}
|
}
|
||||||
line = temp;
|
line = temp;
|
||||||
}
|
}
|
||||||
while (c != '\n' && ScanAsSpace((jschar)c))
|
while (c != '\n' && JS_ISSPACE_OR_BOM((jschar)c))
|
||||||
c = getChar();
|
c = getChar();
|
||||||
i = 0;
|
i = 0;
|
||||||
if (c == '"') {
|
if (c == '"') {
|
||||||
|
@ -1647,7 +1638,7 @@ TokenStream::getTokenInternal()
|
||||||
}
|
}
|
||||||
if (c == '"') {
|
if (c == '"') {
|
||||||
while ((c = getChar()) != '\n' &&
|
while ((c = getChar()) != '\n' &&
|
||||||
ScanAsSpace((jschar)c)) {
|
JS_ISSPACE_OR_BOM((jschar)c)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5639,27 +5639,49 @@ const jschar js_uriUnescaped_ucstr[] =
|
||||||
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||||
'-', '_', '.', '!', '~', '*', '\'', '(', ')', 0};
|
'-', '_', '.', '!', '~', '*', '\'', '(', ')', 0};
|
||||||
|
|
||||||
|
#define ____ false
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This table allows efficient testing for the regular expression \w which is
|
* 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].
|
* defined by ECMA-262 15.10.2.6 to be [0-9A-Z_a-z].
|
||||||
*/
|
*/
|
||||||
const bool js_alnum[] = {
|
const bool js_alnum[] = {
|
||||||
/* 0 1 2 3 4 5 5 7 8 9 */
|
/* 0 1 2 3 4 5 6 7 8 9 */
|
||||||
/* 0 */ false, false, false, false, false, false, false, false, false, false,
|
/* 0 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
|
||||||
/* 1 */ false, false, false, false, false, false, false, false, false, false,
|
/* 1 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
|
||||||
/* 2 */ false, false, false, false, false, false, false, false, false, false,
|
/* 2 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
|
||||||
/* 3 */ false, false, false, false, false, false, false, false, false, false,
|
/* 3 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
|
||||||
/* 4 */ false, false, false, false, false, false, false, false, true, true,
|
/* 4 */ ____, ____, ____, ____, ____, ____, ____, ____, true, true,
|
||||||
/* 5 */ true, true, true, true, true, true, true, true, false, false,
|
/* 5 */ true, true, true, true, true, true, true, true, ____, ____,
|
||||||
/* 6 */ false, false, false, false, false, true, true, true, true, true,
|
/* 6 */ ____, ____, ____, ____, ____, true, true, true, true, true,
|
||||||
/* 7 */ true, true, true, true, true, 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,
|
/* 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,
|
/* 10 */ true, true, true, true, true, true, true, true, true, true,
|
||||||
/* 11 */ 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
|
#define URI_CHUNK 64U
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
|
@ -5669,7 +5691,7 @@ TransferBufferToString(JSContext *cx, StringBuffer &sb, Value *rval)
|
||||||
if (!str)
|
if (!str)
|
||||||
return false;
|
return false;
|
||||||
rval->setString(str);
|
rval->setString(str);
|
||||||
return true;;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -732,15 +732,29 @@ extern const bool js_alnum[];
|
||||||
const jschar BYTE_ORDER_MARK = 0xFEFF;
|
const jschar BYTE_ORDER_MARK = 0xFEFF;
|
||||||
const jschar NO_BREAK_SPACE = 0x00A0;
|
const jschar NO_BREAK_SPACE = 0x00A0;
|
||||||
|
|
||||||
|
extern const bool js_isspace[];
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
JS_ISSPACE(jschar c)
|
JS_ISSPACE(int c)
|
||||||
{
|
{
|
||||||
unsigned w = c;
|
unsigned w = c;
|
||||||
|
|
||||||
if (w < 256)
|
return (w < 128)
|
||||||
return (w <= ' ' && (w == ' ' || (9 <= w && w <= 0xD))) || w == NO_BREAK_SPACE;
|
? 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))
|
#define JS_ISPRINT(c) ((c) < 128 && isprint(c))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче