Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/parsing/scanner.cc b/src/parsing/scanner.cc
index 698cb5e..6a9b32e 100644
--- a/src/parsing/scanner.cc
+++ b/src/parsing/scanner.cc
@@ -40,6 +40,7 @@
: unicode_cache_(unicode_cache),
bookmark_c0_(kNoBookmark),
octal_pos_(Location::invalid()),
+ decimal_with_leading_zero_pos_(Location::invalid()),
found_html_comment_(false),
allow_harmony_exponentiation_operator_(false) {
bookmark_current_.literal_chars = &bookmark_current_literal_;
@@ -249,6 +250,7 @@
if (V8_UNLIKELY(next_next_.token != Token::UNINITIALIZED)) {
next_ = next_next_;
next_next_.token = Token::UNINITIALIZED;
+ has_line_terminator_before_next_ = has_line_terminator_after_next_;
return current_.token;
}
has_line_terminator_before_next_ = false;
@@ -274,7 +276,12 @@
return next_next_.token;
}
TokenDesc prev = current_;
+ bool has_line_terminator_before_next =
+ has_line_terminator_before_next_ || has_multiline_comment_before_next_;
Next();
+ has_line_terminator_after_next_ =
+ has_line_terminator_before_next_ || has_multiline_comment_before_next_;
+ has_line_terminator_before_next_ = has_line_terminator_before_next;
Token::Value ret = next_.token;
next_next_ = next_;
next_ = current_;
@@ -975,10 +982,18 @@
Token::Value Scanner::ScanNumber(bool seen_period) {
DCHECK(IsDecimalDigit(c0_)); // the first digit of the number or the fraction
- enum { DECIMAL, HEX, OCTAL, IMPLICIT_OCTAL, BINARY } kind = DECIMAL;
+ enum {
+ DECIMAL,
+ DECIMAL_WITH_LEADING_ZERO,
+ HEX,
+ OCTAL,
+ IMPLICIT_OCTAL,
+ BINARY
+ } kind = DECIMAL;
LiteralScope literal(this);
bool at_start = !seen_period;
+ int start_pos = source_pos(); // For reporting octal positions.
if (seen_period) {
// we have already seen a decimal point of the float
AddLiteralChar('.');
@@ -987,7 +1002,6 @@
} else {
// if the first character is '0' we must check for octals and hex
if (c0_ == '0') {
- int start_pos = source_pos(); // For reporting octal positions.
AddLiteralCharAdvance();
// either 0, 0exxx, 0Exxx, 0.xxx, a hex number, a binary number or
@@ -1029,7 +1043,7 @@
while (true) {
if (c0_ == '8' || c0_ == '9') {
at_start = false;
- kind = DECIMAL;
+ kind = DECIMAL_WITH_LEADING_ZERO;
break;
}
if (c0_ < '0' || '7' < c0_) {
@@ -1039,11 +1053,13 @@
}
AddLiteralCharAdvance();
}
+ } else if (c0_ == '8' || c0_ == '9') {
+ kind = DECIMAL_WITH_LEADING_ZERO;
}
}
// Parse decimal digits and allow trailing fractional part.
- if (kind == DECIMAL) {
+ if (kind == DECIMAL || kind == DECIMAL_WITH_LEADING_ZERO) {
if (at_start) {
uint64_t value = 0;
while (IsDecimalDigit(c0_)) {
@@ -1060,6 +1076,8 @@
literal.Complete();
HandleLeadSurrogate();
+ if (kind == DECIMAL_WITH_LEADING_ZERO)
+ decimal_with_leading_zero_pos_ = Location(start_pos, source_pos());
return Token::SMI;
}
HandleLeadSurrogate();
@@ -1076,7 +1094,8 @@
// scan exponent, if any
if (c0_ == 'e' || c0_ == 'E') {
DCHECK(kind != HEX); // 'e'/'E' must be scanned as part of the hex number
- if (kind != DECIMAL) return Token::ILLEGAL;
+ if (!(kind == DECIMAL || kind == DECIMAL_WITH_LEADING_ZERO))
+ return Token::ILLEGAL;
// scan exponent
AddLiteralCharAdvance();
if (c0_ == '+' || c0_ == '-')
@@ -1098,6 +1117,8 @@
literal.Complete();
+ if (kind == DECIMAL_WITH_LEADING_ZERO)
+ decimal_with_leading_zero_pos_ = Location(start_pos, source_pos());
return Token::NUMBER;
}
@@ -1135,6 +1156,9 @@
// Keyword Matcher
#define KEYWORDS(KEYWORD_GROUP, KEYWORD) \
+ KEYWORD_GROUP('a') \
+ KEYWORD("async", Token::ASYNC) \
+ KEYWORD("await", Token::AWAIT) \
KEYWORD_GROUP('b') \
KEYWORD("break", Token::BREAK) \
KEYWORD_GROUP('c') \
@@ -1150,7 +1174,7 @@
KEYWORD("do", Token::DO) \
KEYWORD_GROUP('e') \
KEYWORD("else", Token::ELSE) \
- KEYWORD("enum", Token::FUTURE_RESERVED_WORD) \
+ KEYWORD("enum", Token::ENUM) \
KEYWORD("export", Token::EXPORT) \
KEYWORD("extends", Token::EXTENDS) \
KEYWORD_GROUP('f') \
@@ -1196,7 +1220,6 @@
KEYWORD_GROUP('y') \
KEYWORD("yield", Token::YIELD)
-
static Token::Value KeywordOrIdentifierToken(const uint8_t* input,
int input_length, bool escaped) {
DCHECK(input_length >= 1);