⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsscan.c

📁 Swfdec still is development software, but has also followed a rigid no-crashes-allowed policy. I b
💻 C
📖 第 1 页 / 共 3 页
字号:
                if (ts->linebuf.limit[-1] == '\n')                    ts->flags |= TSF_NLFLAG;                else                    ts->flags &= ~TSF_NLFLAG;                /* Update linelen from original segment length. */                ts->linelen = olen;            }            c = *ts->linebuf.ptr++;        } while (JS_ISFORMAT(c));    }    if (c == '\n')        ts->lineno++;    return c;}static voidUngetChar(JSTokenStream *ts, int32 c){    if (c == EOF)        return;    JS_ASSERT(ts->ungetpos < sizeof ts->ungetbuf / sizeof ts->ungetbuf[0]);    if (c == '\n')        ts->lineno--;    ts->ungetbuf[ts->ungetpos++] = (jschar)c;}static int32PeekChar(JSTokenStream *ts){    int32 c;    c = GetChar(ts);    UngetChar(ts, c);    return c;}static JSBoolPeekChars(JSTokenStream *ts, intN n, jschar *cp){    intN i, j;    int32 c;    for (i = 0; i < n; i++) {        c = GetChar(ts);        if (c == EOF)            break;        cp[i] = (jschar)c;    }    for (j = i - 1; j >= 0; j--)        UngetChar(ts, cp[j]);    return i == n;}static voidSkipChars(JSTokenStream *ts, intN n){    while (--n >= 0)        GetChar(ts);}static JSBoolMatchChar(JSTokenStream *ts, int32 expect){    int32 c;    c = GetChar(ts);    if (c == expect)        return JS_TRUE;    UngetChar(ts, c);    return JS_FALSE;}JSBooljs_ReportCompileErrorNumber(JSContext *cx, JSTokenStream *ts,                            JSCodeGenerator *cg, uintN flags,                            const uintN errorNumber, ...){    va_list ap;    JSErrorReporter onError;    JSErrorReport report;    jschar *tokenptr;    JSString *linestr = NULL;    char *message;    JSBool warning;    if ((flags & JSREPORT_STRICT) && !JS_HAS_STRICT_OPTION(cx))        return JS_TRUE;    memset(&report, 0, sizeof (struct JSErrorReport));    report.flags = flags;    report.errorNumber = errorNumber;    message = NULL;    va_start(ap, errorNumber);    if (!js_ExpandErrorArguments(cx, js_GetErrorMessage, NULL,                                 errorNumber, &message, &report, &warning,                                 JS_TRUE, ap)) {        return JS_FALSE;    }    va_end(ap);    js_AddRoot(cx, &linestr, "error line buffer");    JS_ASSERT(!ts || ts->linebuf.limit < ts->linebuf.base + JS_LINE_LIMIT);    onError = cx->errorReporter;    if (onError) {        /*          * We are typically called with non-null ts and null cg from jsparse.c.         * We can be called with null ts from the regexp compilation functions.         * The code generator (jsemit.c) may pass null ts and non-null cg.         */        if (ts) {            report.filename = ts->filename;            report.lineno = ts->lineno;            linestr = js_NewStringCopyN(cx, ts->linebuf.base,                                        ts->linebuf.limit - ts->linebuf.base,                                        0);            report.linebuf = linestr                ? JS_GetStringBytes(linestr)                : NULL;            tokenptr =                ts->tokens[(ts->cursor + ts->lookahead) & NTOKENS_MASK].ptr;            report.tokenptr = linestr                ? report.linebuf + (tokenptr - ts->linebuf.base)                : NULL;            report.uclinebuf = linestr                ? JS_GetStringChars(linestr)                : NULL;            report.uctokenptr = linestr                ? report.uclinebuf + (tokenptr - ts->linebuf.base)                : NULL;        } else if (cg) {            report.filename = cg->filename;            report.lineno = CG_CURRENT_LINE(cg);        }#if JS_HAS_ERROR_EXCEPTIONS        /*         * If there's a runtime exception type associated with this error         * number, set that as the pending exception.  For errors occuring at         * compile time, this is very likely to be a JSEXN_SYNTAXERR.         *         * If an exception is thrown but not caught, the JSREPORT_EXCEPTION         * flag will be set in report.flags.  Proper behavior for an error         * reporter is to ignore a report with this flag for all but top-level         * compilation errors.  The exception will remain pending, and so long         * as the non-top-level "load", "eval", or "compile" native function         * returns false, the top-level reporter will eventually receive the         * uncaught exception report.         *          * XXX it'd probably be best if there was only one call to this         * function, but there seem to be two error reporter call points.         */        /*         * Only try to raise an exception if there isn't one already set -         * otherwise the exception will describe only the last compile error,         * which is likely spurious.         */        if (!(ts && (ts->flags & TSF_ERROR)))            if (js_ErrorToException(cx, message, &report))                onError = NULL;        /*         * Suppress any compiletime errors that don't occur at the top level.         * This may still fail, as interplevel may be zero in contexts where we         * don't really want to call the error reporter, as when js is called         * by other code which could catch the error.         */        if (cx->interpLevel != 0)            onError = NULL;#endif        if (cx->runtime->debugErrorHook && onError) {            JSDebugErrorHook hook = cx->runtime->debugErrorHook;            /* test local in case debugErrorHook changed on another thread */            if (hook && !hook(cx, message, &report,                              cx->runtime->debugErrorHookData)) {                onError = NULL;            }        }        if (onError)            (*onError)(cx, message, &report);    }    if (message)        JS_free(cx, message);    if (report.messageArgs) {        int i = 0;        while (report.messageArgs[i])            JS_free(cx, (void *)report.messageArgs[i++]);        JS_free(cx, (void *)report.messageArgs);    }    if (report.ucmessage)        JS_free(cx, (void *)report.ucmessage);    js_RemoveRoot(cx->runtime, &linestr);    if (ts && !JSREPORT_IS_WARNING(flags)) {        /* Set the error flag to suppress spurious reports. */        ts->flags |= TSF_ERROR;    }    return warning;}JSTokenTypejs_PeekToken(JSContext *cx, JSTokenStream *ts){    JSTokenType tt;    if (ts->lookahead != 0) {        tt = ts->tokens[(ts->cursor + ts->lookahead) & NTOKENS_MASK].type;    } else {        tt = js_GetToken(cx, ts);        js_UngetToken(ts);    }    return tt;}JSTokenTypejs_PeekTokenSameLine(JSContext *cx, JSTokenStream *ts){    JSTokenType tt;    JS_ASSERT(ts->lookahead == 0 ||              ON_CURRENT_LINE(ts, CURRENT_TOKEN(ts).pos));    ts->flags |= TSF_NEWLINES;    tt = js_PeekToken(cx, ts);    ts->flags &= ~TSF_NEWLINES;    return tt;}#define TBMIN   64static JSBoolGrowTokenBuf(JSContext *cx, JSTokenBuf *tb){    jschar *base;    ptrdiff_t offset, length;    size_t tbsize;    JSArenaPool *pool;    base = tb->base;    offset = PTRDIFF(tb->ptr, base, jschar);    pool = &cx->tempPool;    if (!base) {        tbsize = TBMIN * sizeof(jschar);        length = TBMIN;        JS_ARENA_ALLOCATE_CAST(base, jschar *, pool, tbsize);    } else {        length = PTRDIFF(tb->limit, base, jschar);        tbsize = length * sizeof(jschar);        length <<= 1;        JS_ARENA_GROW_CAST(base, jschar *, pool, tbsize, tbsize);    }    if (!base) {        JS_ReportOutOfMemory(cx);        return JS_FALSE;    }    tb->base = base;    tb->limit = base + length;    tb->ptr = base + offset;    return JS_TRUE;}static JSBoolAddToTokenBuf(JSContext *cx, JSTokenBuf *tb, jschar c){    if (tb->ptr == tb->limit && !GrowTokenBuf(cx, tb))        return JS_FALSE;    *tb->ptr++ = c;    return JS_TRUE;}/* * We have encountered a '\': check for a Unicode escape sequence after it, * returning the character code value if we found a Unicode escape sequence. * Otherwise, non-destructively return the original '\'. */static int32GetUnicodeEscape(JSTokenStream *ts){    jschar cp[5];    int32 c;    if (PeekChars(ts, 5, cp) && cp[0] == 'u' &&        JS7_ISHEX(cp[1]) && JS7_ISHEX(cp[2]) &&        JS7_ISHEX(cp[3]) && JS7_ISHEX(cp[4]))    {        c = (((((JS7_UNHEX(cp[1]) << 4)                + JS7_UNHEX(cp[2])) << 4)              + JS7_UNHEX(cp[3])) << 4)            + JS7_UNHEX(cp[4]);        SkipChars(ts, 5);        return c;    }    return '\\';}JSTokenTypejs_GetToken(JSContext *cx, JSTokenStream *ts){    JSTokenType tt;    JSToken *tp;    int32 c;    JSAtom *atom;    JSBool hadUnicodeEscape;#define INIT_TOKENBUF(tb)   ((tb)->ptr = (tb)->base)#define FINISH_TOKENBUF(tb) if (!AddToTokenBuf(cx, tb, 0)) RETURN(TOK_ERROR)#define TOKEN_LENGTH(tb)    ((tb)->ptr - (tb)->base - 1)#define RETURN(tt)          { if (tt == TOK_ERROR) ts->flags |= TSF_ERROR;    \                              tp->pos.end.index = ts->linepos +               \                                  (ts->linebuf.ptr - ts->linebuf.base) -      \                                  ts->ungetpos;                               \                              return (tp->type = tt); }    /* If there was a fatal error, keep returning TOK_ERROR. */    if (ts->flags & TSF_ERROR)        return TOK_ERROR;    /* Check for a pushed-back token resulting from mismatching lookahead. */    while (ts->lookahead != 0) {        ts->lookahead--;        ts->cursor = (ts->cursor + 1) & NTOKENS_MASK;        tt = CURRENT_TOKEN(ts).type;        if (tt != TOK_EOL || (ts->flags & TSF_NEWLINES))            return tt;    }retry:    do {        c = GetChar(ts);        if (c == '\n') {            ts->flags &= ~TSF_DIRTYLINE;            if (ts->flags & TSF_NEWLINES)                break;        }    } while (JS_ISSPACE(c));    ts->cursor = (ts->cursor + 1) & NTOKENS_MASK;    tp = &CURRENT_TOKEN(ts);    tp->ptr = ts->linebuf.ptr - 1;    tp->pos.begin.index = ts->linepos + (tp->ptr - ts->linebuf.base);    tp->pos.begin.lineno = tp->pos.end.lineno = (uint16)ts->lineno;    if (c == EOF)        RETURN(TOK_EOF);    if (c != '-' && c != '\n')        ts->flags |= TSF_DIRTYLINE;    hadUnicodeEscape = JS_FALSE;    if (JS_ISIDENT_START(c) ||        (c == '\\' &&         (c = GetUnicodeEscape(ts),          hadUnicodeEscape = JS_ISIDENT_START(c)))) {        INIT_TOKENBUF(&ts->tokenbuf);        for (;;) {            if (!AddToTokenBuf(cx, &ts->tokenbuf, (jschar)c))                RETURN(TOK_ERROR);            c = GetChar(ts);            if (c == '\\') {                c = GetUnicodeEscape(ts);                if (!JS_ISIDENT(c))                    break;                hadUnicodeEscape = JS_TRUE;            } else {                if (!JS_ISIDENT(c))                    break;            }        }        UngetChar(ts, c);        FINISH_TOKENBUF(&ts->tokenbuf);        atom = js_AtomizeChars(cx,                               ts->tokenbuf.base,                               TOKEN_LENGTH(&ts->tokenbuf),                               0);        if (!atom)            RETURN(TOK_ERROR);        if (!hadUnicodeEscape && ATOM_KEYWORD(atom)) {            struct keyword *kw = ATOM_KEYWORD(atom);            if (JSVERSION_IS_ECMA(cx->version) || kw->version <= cx->version) {                tp->t_op = (JSOp) kw->op;                RETURN(kw->tokentype);            }        }        tp->t_op = JSOP_NAME;        tp->t_atom = atom;        RETURN(TOK_NAME);    }    if (JS7_ISDEC(c) || (c == '.' && JS7_ISDEC(PeekChar(ts)))) {        jsint radix;        const jschar *endptr;        jsdouble dval;        radix = 10;        INIT_TOKENBUF(&ts->tokenbuf);        if (c == '0') {            if (!AddToTokenBuf(cx, &ts->tokenbuf, (jschar)c))                RETURN(TOK_ERROR);            c = GetChar(ts);            if (JS_TOLOWER(c) == 'x') {                if (!AddToTokenBuf(cx, &ts->tokenbuf, (jschar)c))                    RETURN(TOK_ERROR);                c = GetChar(ts);                radix = 16;            } else if (JS7_ISDEC(c)) {                radix = 8;            }        }        while (JS7_ISHEX(c)) {            if (radix < 16) {                if (JS7_ISLET(c))                    break;                /*                 * We permit 08 and 09 as decimal numbers, which makes our                 * behaviour a superset of the ECMA numeric grammar.  We might                 * not always be so permissive, so we warn about it.                 */                if (radix == 8 && c >= '8') {                    if (!js_ReportCompileErrorNumber(cx, ts, NULL,                                                     JSREPORT_WARNING,                                                     JSMSG_BAD_OCTAL,                                                     c == '8' ? "08" : "09")) {                        RETURN(TOK_ERROR);                    }                    radix = 10;                }            }            if (!AddToTokenBuf(cx, &ts->tokenbuf, (jschar)c))                RETURN(TOK_ERROR);            c = GetChar(ts);        }        if (radix == 10 && (c == '.' || JS_TOLOWER(c) == 'e')) {            if (c == '.') {                do {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -