diff options
Diffstat (limited to 'deps/v8/src/parsing/scanner.cc')
-rw-r--r-- | deps/v8/src/parsing/scanner.cc | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/deps/v8/src/parsing/scanner.cc b/deps/v8/src/parsing/scanner.cc index 52a1bf0724..9a04bdc510 100644 --- a/deps/v8/src/parsing/scanner.cc +++ b/deps/v8/src/parsing/scanner.cc @@ -107,6 +107,12 @@ void Scanner::Initialize() { Scan(); } +// static +bool Scanner::IsInvalid(uc32 c) { + DCHECK(c == Invalid() || base::IsInRange(c, 0u, String::kMaxCodePoint)); + return c == Scanner::Invalid(); +} + template <bool capture_raw, bool unicode> uc32 Scanner::ScanHexNumber(int expected_length) { DCHECK_LE(expected_length, 4); // prevent overflow @@ -120,7 +126,7 @@ uc32 Scanner::ScanHexNumber(int expected_length) { unicode ? MessageTemplate::kInvalidUnicodeEscapeSequence : MessageTemplate::kInvalidHexEscapeSequence); - return -1; + return Invalid(); } x = x * 16 + d; Advance<capture_raw>(); @@ -130,17 +136,17 @@ uc32 Scanner::ScanHexNumber(int expected_length) { } template <bool capture_raw> -uc32 Scanner::ScanUnlimitedLengthHexNumber(int max_value, int beg_pos) { +uc32 Scanner::ScanUnlimitedLengthHexNumber(uc32 max_value, int beg_pos) { uc32 x = 0; int d = HexValue(c0_); - if (d < 0) return -1; + if (d < 0) return Invalid(); while (d >= 0) { x = x * 16 + d; if (x > max_value) { ReportScannerError(Location(beg_pos, source_pos() + 1), MessageTemplate::kUndefinedUnicodeCodePoint); - return -1; + return Invalid(); } Advance<capture_raw>(); d = HexValue(c0_); @@ -386,7 +392,7 @@ bool Scanner::ScanEscape() { case 't' : c = '\t'; break; case 'u' : { c = ScanUnicodeEscape<capture_raw>(); - if (c < 0) return false; + if (IsInvalid(c)) return false; break; } case 'v': @@ -394,19 +400,27 @@ bool Scanner::ScanEscape() { break; case 'x': { c = ScanHexNumber<capture_raw>(2); - if (c < 0) return false; + if (IsInvalid(c)) return false; break; } - case '0': // Fall through. - case '1': // fall through - case '2': // fall through - case '3': // fall through - case '4': // fall through - case '5': // fall through - case '6': // fall through + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': case '7': c = ScanOctalEscape<capture_raw>(c, 2); break; + case '8': + case '9': + // '\8' and '\9' are disallowed in strict mode. + // Re-use the octal error state to propagate the error. + octal_pos_ = Location(source_pos() - 2, source_pos() - 1); + octal_message_ = capture_raw ? MessageTemplate::kTemplate8Or9Escape + : MessageTemplate::kStrict8Or9Escape; + break; } // Other escaped characters are interpreted as their non-escaped version. @@ -416,6 +430,7 @@ bool Scanner::ScanEscape() { template <bool capture_raw> uc32 Scanner::ScanOctalEscape(uc32 c, int length) { + DCHECK('0' <= c && c <= '7'); uc32 x = c - '0'; int i = 0; for (; i < length; i++) { @@ -553,7 +568,7 @@ Token::Value Scanner::ScanTemplateSpan() { scanner_error_state.MoveErrorTo(next_); octal_error_state.MoveErrorTo(next_); } - } else if (c < 0) { + } else if (c == kEndOfInput) { // Unterminated template literal break; } else { @@ -585,7 +600,7 @@ Handle<String> Scanner::SourceUrl(LocalIsolate* isolate) const { } template Handle<String> Scanner::SourceUrl(Isolate* isolate) const; -template Handle<String> Scanner::SourceUrl(OffThreadIsolate* isolate) const; +template Handle<String> Scanner::SourceUrl(LocalIsolate* isolate) const; template <typename LocalIsolate> Handle<String> Scanner::SourceMappingUrl(LocalIsolate* isolate) const { @@ -597,8 +612,7 @@ Handle<String> Scanner::SourceMappingUrl(LocalIsolate* isolate) const { } template Handle<String> Scanner::SourceMappingUrl(Isolate* isolate) const; -template Handle<String> Scanner::SourceMappingUrl( - OffThreadIsolate* isolate) const; +template Handle<String> Scanner::SourceMappingUrl(LocalIsolate* isolate) const; bool Scanner::ScanDigitsWithNumericSeparators(bool (*predicate)(uc32 ch), bool is_check_first_digit) { @@ -861,7 +875,7 @@ Token::Value Scanner::ScanNumber(bool seen_period) { uc32 Scanner::ScanIdentifierUnicodeEscape() { Advance(); - if (c0_ != 'u') return -1; + if (c0_ != 'u') return Invalid(); Advance(); return ScanUnicodeEscape<false>(); } @@ -873,11 +887,12 @@ uc32 Scanner::ScanUnicodeEscape() { if (c0_ == '{') { int begin = source_pos() - 2; Advance<capture_raw>(); - uc32 cp = ScanUnlimitedLengthHexNumber<capture_raw>(0x10FFFF, begin); - if (cp < 0 || c0_ != '}') { + uc32 cp = + ScanUnlimitedLengthHexNumber<capture_raw>(String::kMaxCodePoint, begin); + if (cp == kInvalidSequence || c0_ != '}') { ReportScannerError(source_pos(), MessageTemplate::kInvalidUnicodeEscapeSequence); - return -1; + return Invalid(); } Advance<capture_raw>(); return cp; @@ -895,7 +910,7 @@ Token::Value Scanner::ScanIdentifierOrKeywordInnerSlow(bool escaped, // Only allow legal identifier part characters. // TODO(verwaest): Make this true. // DCHECK(!IsIdentifierPart('\')); - DCHECK(!IsIdentifierPart(-1)); + DCHECK(!IsIdentifierPart(Invalid())); if (c == '\\' || !IsIdentifierPart(c)) { return Token::ILLEGAL; } @@ -986,8 +1001,9 @@ Maybe<int> Scanner::ScanRegExpFlags() { // Scan regular expression flags. JSRegExp::Flags flags; while (IsIdentifierPart(c0_)) { - JSRegExp::Flags flag = JSRegExp::FlagFromChar(c0_); - if (flag == JSRegExp::kInvalid) return Nothing<int>(); + base::Optional<JSRegExp::Flags> maybe_flag = JSRegExp::FlagFromChar(c0_); + if (!maybe_flag.has_value()) return Nothing<int>(); + JSRegExp::Flags flag = *maybe_flag; if (flags & flag) return Nothing<int>(); Advance(); flags |= flag; |