diff options
Diffstat (limited to 'deps/v8/src/parsing/scanner.h')
-rw-r--r-- | deps/v8/src/parsing/scanner.h | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/deps/v8/src/parsing/scanner.h b/deps/v8/src/parsing/scanner.h index 383159557b..368e150781 100644 --- a/deps/v8/src/parsing/scanner.h +++ b/deps/v8/src/parsing/scanner.h @@ -316,6 +316,10 @@ class Scanner { return LiteralContainsEscapes(current()); } + bool next_literal_contains_escapes() const { + return LiteralContainsEscapes(next()); + } + const AstRawString* CurrentSymbol(AstValueFactory* ast_value_factory) const; const AstRawString* NextSymbol(AstValueFactory* ast_value_factory) const; @@ -332,8 +336,8 @@ class Scanner { } template <size_t N> - bool NextLiteralEquals(const char (&s)[N]) { - DCHECK_EQ(Token::STRING, peek()); + bool NextLiteralExactlyEquals(const char (&s)[N]) { + DCHECK(next().CanAccessLiteral()); // The length of the token is used to make sure the literal equals without // taking escape sequences (e.g., "use \x73trict") or line continuations // (e.g., "use \(newline) strict") into account. @@ -345,6 +349,16 @@ class Scanner { return next.length() == N - 1 && strncmp(s, chars, N - 1) == 0; } + template <size_t N> + bool CurrentLiteralEquals(const char (&s)[N]) { + DCHECK(current().CanAccessLiteral()); + if (!is_literal_one_byte()) return false; + + Vector<const uint8_t> current = literal_one_byte_string(); + const char* chars = reinterpret_cast<const char*>(current.start()); + return current.length() == N - 1 && strncmp(s, chars, N - 1) == 0; + } + // Returns the location of the last seen octal literal. Location octal_position() const { return octal_pos_; } void clear_octal_position() { @@ -517,9 +531,8 @@ class Scanner { bool CanAccessLiteral() const { return token == Token::PRIVATE_NAME || token == Token::ILLEGAL || token == Token::UNINITIALIZED || token == Token::REGEXP_LITERAL || - token == Token::ESCAPED_KEYWORD || IsInRange(token, Token::NUMBER, Token::STRING) || - (Token::IsAnyIdentifier(token) && !Token::IsKeyword(token)) || + Token::IsAnyIdentifier(token) || Token::IsKeyword(token) || IsInRange(token, Token::TEMPLATE_SPAN, Token::TEMPLATE_TAIL); } bool CanAccessRawLiteral() const { @@ -530,14 +543,22 @@ class Scanner { }; enum NumberKind { + IMPLICIT_OCTAL, BINARY, OCTAL, - IMPLICIT_OCTAL, HEX, DECIMAL, DECIMAL_WITH_LEADING_ZERO }; + inline bool IsValidBigIntKind(NumberKind kind) { + return IsInRange(kind, BINARY, DECIMAL); + } + + inline bool IsDecimalNumberKind(NumberKind kind) { + return IsInRange(kind, DECIMAL, DECIMAL_WITH_LEADING_ZERO); + } + static const int kCharacterLookaheadBufferSize = 1; static const int kMaxAscii = 127; |