diff options
Diffstat (limited to 'deps/v8/src/parsing/scanner.cc')
-rw-r--r-- | deps/v8/src/parsing/scanner.cc | 620 |
1 files changed, 15 insertions, 605 deletions
diff --git a/deps/v8/src/parsing/scanner.cc b/deps/v8/src/parsing/scanner.cc index 781832c2e6..525b1bc681 100644 --- a/deps/v8/src/parsing/scanner.cc +++ b/deps/v8/src/parsing/scanner.cc @@ -11,7 +11,6 @@ #include <cmath> #include "src/ast/ast-value-factory.h" -#include "src/char-predicates-inl.h" #include "src/conversions-inl.h" #include "src/objects/bigint.h" #include "src/parsing/duplicate-finder.h" // For Scanner::FindSymbol @@ -134,7 +133,6 @@ const size_t Scanner::BookmarkScope::kBookmarkWasApplied = void Scanner::BookmarkScope::Set() { DCHECK_EQ(bookmark_, kNoBookmark); - DCHECK_EQ(scanner_->next_next().token, Token::UNINITIALIZED); // The first token is a bit special, since current_ will still be // uninitialized. In this case, store kBookmarkAtFirstPos and special-case it @@ -160,11 +158,11 @@ void Scanner::BookmarkScope::Apply() { bookmark_ = kBookmarkWasApplied; } -bool Scanner::BookmarkScope::HasBeenSet() { +bool Scanner::BookmarkScope::HasBeenSet() const { return bookmark_ != kNoBookmark && bookmark_ != kBookmarkWasApplied; } -bool Scanner::BookmarkScope::HasBeenApplied() { +bool Scanner::BookmarkScope::HasBeenApplied() const { return bookmark_ == kBookmarkWasApplied; } @@ -175,12 +173,11 @@ Scanner::Scanner(UnicodeCache* unicode_cache, Utf16CharacterStream* source, bool is_module) : unicode_cache_(unicode_cache), source_(source), - octal_pos_(Location::invalid()), - octal_message_(MessageTemplate::kNone), found_html_comment_(false), - allow_harmony_bigint_(false), allow_harmony_numeric_separator_(false), - is_module_(is_module) { + is_module_(is_module), + octal_pos_(Location::invalid()), + octal_message_(MessageTemplate::kNone) { DCHECK_NOT_NULL(source); } @@ -234,146 +231,7 @@ uc32 Scanner::ScanUnlimitedLengthHexNumber(int max_value, int beg_pos) { return x; } - -// Ensure that tokens can be stored in a byte. -STATIC_ASSERT(Token::NUM_TOKENS <= 0x100); - -// Table of one-character tokens, by character (0x00..0x7F only). -// clang-format off -static const byte one_char_tokens[] = { - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::LPAREN, // 0x28 - Token::RPAREN, // 0x29 - Token::ILLEGAL, - Token::ILLEGAL, - Token::COMMA, // 0x2C - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::COLON, // 0x3A - Token::SEMICOLON, // 0x3B - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::CONDITIONAL, // 0x3F - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::LBRACK, // 0x5B - Token::ILLEGAL, - Token::RBRACK, // 0x5D - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::ILLEGAL, - Token::LBRACE, // 0x7B - Token::ILLEGAL, - Token::RBRACE, // 0x7D - Token::BIT_NOT, // 0x7E - Token::ILLEGAL -}; -// clang-format on - Token::Value Scanner::Next() { - if (next().token == Token::EOS) next().location = current().location; // Rotate through tokens. TokenDesc* previous = current_; current_ = next_; @@ -395,7 +253,6 @@ Token::Value Scanner::Next() { return current().token; } - Token::Value Scanner::PeekAhead() { DCHECK(next().token != Token::DIV); DCHECK(next().token != Token::ASSIGN_DIV); @@ -534,250 +391,6 @@ Token::Value Scanner::ScanHtmlComment() { return SkipSingleHTMLComment(); } -void Scanner::Scan() { - next().literal_chars.Drop(); - next().raw_literal_chars.Drop(); - next().invalid_template_escape_message = MessageTemplate::kNone; - - Token::Value token; - do { - if (static_cast<unsigned>(c0_) <= 0x7F) { - Token::Value token = static_cast<Token::Value>(one_char_tokens[c0_]); - if (token != Token::ILLEGAL) { - int pos = source_pos(); - next().token = token; - next().contextual_token = Token::UNINITIALIZED; - next().location.beg_pos = pos; - next().location.end_pos = pos + 1; - Advance(); - return; - } - } - - // Remember the position of the next token - next().location.beg_pos = source_pos(); - - switch (c0_) { - case '"': - case '\'': - token = ScanString(); - break; - - case '<': - // < <= << <<= <!-- - Advance(); - if (c0_ == '=') { - token = Select(Token::LTE); - } else if (c0_ == '<') { - token = Select('=', Token::ASSIGN_SHL, Token::SHL); - } else if (c0_ == '!') { - token = ScanHtmlComment(); - } else { - token = Token::LT; - } - break; - - case '>': - // > >= >> >>= >>> >>>= - Advance(); - if (c0_ == '=') { - token = Select(Token::GTE); - } else if (c0_ == '>') { - // >> >>= >>> >>>= - Advance(); - if (c0_ == '=') { - token = Select(Token::ASSIGN_SAR); - } else if (c0_ == '>') { - token = Select('=', Token::ASSIGN_SHR, Token::SHR); - } else { - token = Token::SAR; - } - } else { - token = Token::GT; - } - break; - - case '=': - // = == === => - Advance(); - if (c0_ == '=') { - token = Select('=', Token::EQ_STRICT, Token::EQ); - } else if (c0_ == '>') { - token = Select(Token::ARROW); - } else { - token = Token::ASSIGN; - } - break; - - case '!': - // ! != !== - Advance(); - if (c0_ == '=') { - token = Select('=', Token::NE_STRICT, Token::NE); - } else { - token = Token::NOT; - } - break; - - case '+': - // + ++ += - Advance(); - if (c0_ == '+') { - token = Select(Token::INC); - } else if (c0_ == '=') { - token = Select(Token::ASSIGN_ADD); - } else { - token = Token::ADD; - } - break; - - case '-': - // - -- --> -= - Advance(); - if (c0_ == '-') { - Advance(); - if (c0_ == '>' && HasLineTerminatorBeforeNext()) { - // For compatibility with SpiderMonkey, we skip lines that - // start with an HTML comment end '-->'. - token = SkipSingleHTMLComment(); - } else { - token = Token::DEC; - } - } else if (c0_ == '=') { - token = Select(Token::ASSIGN_SUB); - } else { - token = Token::SUB; - } - break; - - case '*': - // * *= - Advance(); - if (c0_ == '*') { - token = Select('=', Token::ASSIGN_EXP, Token::EXP); - } else if (c0_ == '=') { - token = Select(Token::ASSIGN_MUL); - } else { - token = Token::MUL; - } - break; - - case '%': - // % %= - token = Select('=', Token::ASSIGN_MOD, Token::MOD); - break; - - case '/': - // / // /* /= - Advance(); - if (c0_ == '/') { - uc32 c = Peek(); - if (c == '#' || c == '@') { - Advance(); - Advance(); - token = SkipSourceURLComment(); - } else { - token = SkipSingleLineComment(); - } - } else if (c0_ == '*') { - token = SkipMultiLineComment(); - } else if (c0_ == '=') { - token = Select(Token::ASSIGN_DIV); - } else { - token = Token::DIV; - } - break; - - case '&': - // & && &= - Advance(); - if (c0_ == '&') { - token = Select(Token::AND); - } else if (c0_ == '=') { - token = Select(Token::ASSIGN_BIT_AND); - } else { - token = Token::BIT_AND; - } - break; - - case '|': - // | || |= - Advance(); - if (c0_ == '|') { - token = Select(Token::OR); - } else if (c0_ == '=') { - token = Select(Token::ASSIGN_BIT_OR); - } else { - token = Token::BIT_OR; - } - break; - - case '^': - // ^ ^= - token = Select('=', Token::ASSIGN_BIT_XOR, Token::BIT_XOR); - break; - - case '.': - // . Number - Advance(); - if (IsDecimalDigit(c0_)) { - token = ScanNumber(true); - } else { - token = Token::PERIOD; - if (c0_ == '.') { - if (Peek() == '.') { - Advance(); - Advance(); - token = Token::ELLIPSIS; - } - } - } - break; - - case '`': - token = ScanTemplateStart(); - break; - - case '#': - token = ScanPrivateName(); - break; - - default: - if (unicode_cache_->IsIdentifierStart(c0_) || - (CombineSurrogatePair() && - unicode_cache_->IsIdentifierStart(c0_))) { - token = ScanIdentifierOrKeyword(); - } else if (IsDecimalDigit(c0_)) { - token = ScanNumber(false); - } else if (c0_ == kEndOfInput) { - token = Token::EOS; - } else { - token = SkipWhiteSpace(); - if (token == Token::ILLEGAL) Advance(); - } - break; - } - - // Continue scanning for tokens as long as we're just skipping - // whitespace. - } while (token == Token::WHITESPACE); - - next().location.end_pos = source_pos(); - if (Token::IsContextualKeyword(token)) { - next().token = Token::IDENTIFIER; - next().contextual_token = token; - } else { - next().token = token; - next().contextual_token = Token::UNINITIALIZED; - } - -#ifdef DEBUG - SanityCheckTokenDesc(current()); - SanityCheckTokenDesc(next()); - SanityCheckTokenDesc(next_next()); -#endif -} - #ifdef DEBUG void Scanner::SanityCheckTokenDesc(const TokenDesc& token) const { // Most tokens should not have literal_chars or even raw_literal chars. @@ -916,7 +529,7 @@ uc32 Scanner::ScanOctalEscape(uc32 c, int length) { // can be reported later (in strict mode). // We don't report the error immediately, because the octal escape can // occur before the "use strict" directive. - if (c != '0' || i > 0 || c0_ == '8' || c0_ == '9') { + if (c != '0' || i > 0 || IsNonOctalDecimalDigit(c0_)) { octal_pos_ = Location(source_pos() - i - 1, source_pos() - 1); octal_message_ = capture_raw ? MessageTemplate::kTemplateOctalLiteral : MessageTemplate::kStrictOctalEscape; @@ -993,7 +606,7 @@ Token::Value Scanner::ScanTemplateSpan() { Token::Value result = Token::TEMPLATE_SPAN; LiteralScope literal(this); - StartRawLiteral(); + next().raw_literal_chars.Start(); const bool capture_raw = true; while (true) { uc32 c = c0_; @@ -1053,14 +666,6 @@ Token::Value Scanner::ScanTemplateSpan() { return result; } -Token::Value Scanner::ScanTemplateStart() { - DCHECK_EQ(next_next().token, Token::UNINITIALIZED); - DCHECK_EQ(c0_, '`'); - next().location.beg_pos = source_pos(); - Advance(); // Consume ` - return ScanTemplateSpan(); -} - Handle<String> Scanner::SourceUrl(Isolate* isolate) const { Handle<String> tmp; if (source_url_.length() > 0) { @@ -1200,11 +805,11 @@ bool Scanner::ScanImplicitOctalDigits(int start_pos, while (true) { // (possible) octal number - if (c0_ == '8' || c0_ == '9') { + if (IsNonOctalDecimalDigit(c0_)) { *kind = DECIMAL_WITH_LEADING_ZERO; return true; } - if (c0_ < '0' || '7' < c0_) { + if (!IsOctalDigit(c0_)) { // Octal literal finished. octal_pos_ = Location(start_pos, source_pos()); octal_message_ = MessageTemplate::kStrictOctalLiteral; @@ -1272,7 +877,7 @@ Token::Value Scanner::ScanNumber(bool seen_period) { AddLiteralCharAdvance(); kind = BINARY; if (!ScanBinaryDigits()) return Token::ILLEGAL; - } else if ('0' <= c0_ && c0_ <= '7') { + } else if (IsOctalDigit(c0_)) { kind = IMPLICIT_OCTAL; if (!ScanImplicitOctalDigits(start_pos, &kind)) { return Token::ILLEGAL; @@ -1280,7 +885,7 @@ Token::Value Scanner::ScanNumber(bool seen_period) { if (kind == DECIMAL_WITH_LEADING_ZERO) { at_start = false; } - } else if (c0_ == '8' || c0_ == '9') { + } else if (IsNonOctalDecimalDigit(c0_)) { kind = DECIMAL_WITH_LEADING_ZERO; } else if (allow_harmony_numeric_separator() && c0_ == '_') { ReportScannerError(Location(source_pos(), source_pos() + 1), @@ -1326,7 +931,7 @@ Token::Value Scanner::ScanNumber(bool seen_period) { } bool is_bigint = false; - if (allow_harmony_bigint() && c0_ == 'n' && !seen_period && + if (c0_ == 'n' && !seen_period && (kind == DECIMAL || kind == HEX || kind == OCTAL || kind == BINARY)) { // Check that the literal is within our limits for BigInt length. // For simplicity, use 4 bits per character to calculate the maximum @@ -1399,197 +1004,8 @@ uc32 Scanner::ScanUnicodeEscape() { return ScanHexNumber<capture_raw, unicode>(4); } - -// ---------------------------------------------------------------------------- -// Keyword Matcher - -#define KEYWORDS(KEYWORD_GROUP, KEYWORD) \ - KEYWORD_GROUP('a') \ - KEYWORD("arguments", Token::ARGUMENTS) \ - KEYWORD("as", Token::AS) \ - KEYWORD("async", Token::ASYNC) \ - KEYWORD("await", Token::AWAIT) \ - KEYWORD("anonymous", Token::ANONYMOUS) \ - KEYWORD_GROUP('b') \ - KEYWORD("break", Token::BREAK) \ - KEYWORD_GROUP('c') \ - KEYWORD("case", Token::CASE) \ - KEYWORD("catch", Token::CATCH) \ - KEYWORD("class", Token::CLASS) \ - KEYWORD("const", Token::CONST) \ - KEYWORD("constructor", Token::CONSTRUCTOR) \ - KEYWORD("continue", Token::CONTINUE) \ - KEYWORD_GROUP('d') \ - KEYWORD("debugger", Token::DEBUGGER) \ - KEYWORD("default", Token::DEFAULT) \ - KEYWORD("delete", Token::DELETE) \ - KEYWORD("do", Token::DO) \ - KEYWORD_GROUP('e') \ - KEYWORD("else", Token::ELSE) \ - KEYWORD("enum", Token::ENUM) \ - KEYWORD("eval", Token::EVAL) \ - KEYWORD("export", Token::EXPORT) \ - KEYWORD("extends", Token::EXTENDS) \ - KEYWORD_GROUP('f') \ - KEYWORD("false", Token::FALSE_LITERAL) \ - KEYWORD("finally", Token::FINALLY) \ - KEYWORD("for", Token::FOR) \ - KEYWORD("from", Token::FROM) \ - KEYWORD("function", Token::FUNCTION) \ - KEYWORD_GROUP('g') \ - KEYWORD("get", Token::GET) \ - KEYWORD_GROUP('i') \ - KEYWORD("if", Token::IF) \ - KEYWORD("implements", Token::FUTURE_STRICT_RESERVED_WORD) \ - KEYWORD("import", Token::IMPORT) \ - KEYWORD("in", Token::IN) \ - KEYWORD("instanceof", Token::INSTANCEOF) \ - KEYWORD("interface", Token::FUTURE_STRICT_RESERVED_WORD) \ - KEYWORD_GROUP('l') \ - KEYWORD("let", Token::LET) \ - KEYWORD_GROUP('m') \ - KEYWORD("meta", Token::META) \ - KEYWORD_GROUP('n') \ - KEYWORD("name", Token::NAME) \ - KEYWORD("new", Token::NEW) \ - KEYWORD("null", Token::NULL_LITERAL) \ - KEYWORD_GROUP('o') \ - KEYWORD("of", Token::OF) \ - KEYWORD_GROUP('p') \ - KEYWORD("package", Token::FUTURE_STRICT_RESERVED_WORD) \ - KEYWORD("private", Token::FUTURE_STRICT_RESERVED_WORD) \ - KEYWORD("protected", Token::FUTURE_STRICT_RESERVED_WORD) \ - KEYWORD("prototype", Token::PROTOTYPE) \ - KEYWORD("public", Token::FUTURE_STRICT_RESERVED_WORD) \ - KEYWORD_GROUP('r') \ - KEYWORD("return", Token::RETURN) \ - KEYWORD_GROUP('s') \ - KEYWORD("set", Token::SET) \ - KEYWORD("static", Token::STATIC) \ - KEYWORD("super", Token::SUPER) \ - KEYWORD("switch", Token::SWITCH) \ - KEYWORD_GROUP('t') \ - KEYWORD("target", Token::TARGET) \ - KEYWORD("this", Token::THIS) \ - KEYWORD("throw", Token::THROW) \ - KEYWORD("true", Token::TRUE_LITERAL) \ - KEYWORD("try", Token::TRY) \ - KEYWORD("typeof", Token::TYPEOF) \ - KEYWORD_GROUP('u') \ - KEYWORD("undefined", Token::UNDEFINED) \ - KEYWORD_GROUP('v') \ - KEYWORD("var", Token::VAR) \ - KEYWORD("void", Token::VOID) \ - KEYWORD_GROUP('w') \ - KEYWORD("while", Token::WHILE) \ - KEYWORD("with", Token::WITH) \ - KEYWORD_GROUP('y') \ - KEYWORD("yield", Token::YIELD) \ - KEYWORD_GROUP('_') \ - KEYWORD("__proto__", Token::PROTO_UNDERSCORED) \ - KEYWORD_GROUP('#') \ - KEYWORD("#constructor", Token::PRIVATE_CONSTRUCTOR) - -static Token::Value KeywordOrIdentifierToken(const uint8_t* input, - int input_length) { - DCHECK_GE(input_length, 1); - const int kMinLength = 2; - const int kMaxLength = 12; - if (input_length < kMinLength || input_length > kMaxLength) { - return Token::IDENTIFIER; - } - switch (input[0]) { - default: -#define KEYWORD_GROUP_CASE(ch) \ - break; \ - case ch: -#define KEYWORD(keyword, token) \ - { \ - /* 'keyword' is a char array, so sizeof(keyword) is */ \ - /* strlen(keyword) plus 1 for the NUL char. */ \ - const int keyword_length = sizeof(keyword) - 1; \ - STATIC_ASSERT(keyword_length >= kMinLength); \ - STATIC_ASSERT(keyword_length <= kMaxLength); \ - DCHECK_EQ(input[0], keyword[0]); \ - DCHECK(token == Token::FUTURE_STRICT_RESERVED_WORD || \ - 0 == strncmp(keyword, Token::String(token), sizeof(keyword))); \ - if (input_length == keyword_length && input[1] == keyword[1] && \ - (keyword_length <= 2 || input[2] == keyword[2]) && \ - (keyword_length <= 3 || input[3] == keyword[3]) && \ - (keyword_length <= 4 || input[4] == keyword[4]) && \ - (keyword_length <= 5 || input[5] == keyword[5]) && \ - (keyword_length <= 6 || input[6] == keyword[6]) && \ - (keyword_length <= 7 || input[7] == keyword[7]) && \ - (keyword_length <= 8 || input[8] == keyword[8]) && \ - (keyword_length <= 9 || input[9] == keyword[9]) && \ - (keyword_length <= 10 || input[10] == keyword[10])) { \ - return token; \ - } \ - } - KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD) - } - return Token::IDENTIFIER; -#undef KEYWORDS -#undef KEYWORD -#undef KEYWORD_GROUP_CASE -} - -Token::Value Scanner::ScanIdentifierOrKeyword() { - LiteralScope literal(this); - return ScanIdentifierOrKeywordInner(&literal); -} - -Token::Value Scanner::ScanIdentifierOrKeywordInner(LiteralScope* literal) { - DCHECK(unicode_cache_->IsIdentifierStart(c0_)); - bool escaped = false; - if (IsInRange(c0_, 'a', 'z') || c0_ == '_') { - do { - AddLiteralChar(static_cast<char>(c0_)); - Advance(); - } while (IsInRange(c0_, 'a', 'z') || c0_ == '_'); - - if (IsDecimalDigit(c0_) || IsInRange(c0_, 'A', 'Z') || c0_ == '$') { - // Identifier starting with lowercase or _. - do { - AddLiteralChar(static_cast<char>(c0_)); - Advance(); - } while (IsAsciiIdentifier(c0_)); - - if (c0_ <= kMaxAscii && c0_ != '\\') { - literal->Complete(); - return Token::IDENTIFIER; - } - } else if (c0_ <= kMaxAscii && c0_ != '\\') { - // Only a-z+ or _: could be a keyword or identifier. - Vector<const uint8_t> chars = next().literal_chars.one_byte_literal(); - Token::Value token = - KeywordOrIdentifierToken(chars.start(), chars.length()); - if (token == Token::IDENTIFIER || - token == Token::FUTURE_STRICT_RESERVED_WORD || - Token::IsContextualKeyword(token)) - literal->Complete(); - return token; - } - } else if (IsInRange(c0_, 'A', 'Z') || c0_ == '$') { - do { - AddLiteralChar(static_cast<char>(c0_)); - Advance(); - } while (IsAsciiIdentifier(c0_)); - - if (c0_ <= kMaxAscii && c0_ != '\\') { - literal->Complete(); - return Token::IDENTIFIER; - } - } else if (c0_ == '\\') { - escaped = true; - uc32 c = ScanIdentifierUnicodeEscape(); - DCHECK(!unicode_cache_->IsIdentifierStart(-1)); - if (c == '\\' || !unicode_cache_->IsIdentifierStart(c)) { - return Token::ILLEGAL; - } - AddLiteralChar(c); - } - +Token::Value Scanner::ScanIdentifierOrKeywordInnerSlow(LiteralScope* literal, + bool escaped) { while (true) { if (c0_ == '\\') { escaped = true; @@ -1645,18 +1061,12 @@ bool Scanner::ScanRegExpPattern() { // Scan: ('/' | '/=') RegularExpressionBody '/' RegularExpressionFlags bool in_character_class = false; - bool seen_equal = (next().token == Token::ASSIGN_DIV); - - // Previous token is either '/' or '/=', in the second case, the - // pattern starts at =. - next().location.beg_pos = source_pos() - (seen_equal ? 2 : 1); - next().location.end_pos = source_pos() - (seen_equal ? 1 : 0); // Scan regular expression body: According to ECMA-262, 3rd, 7.8.5, // the scanner should pass uninterpreted bodies to the RegExp // constructor. LiteralScope literal(this); - if (seen_equal) { + if (next().token == Token::ASSIGN_DIV) { AddLiteralChar('='); } |