summaryrefslogtreecommitdiff
path: root/deps/v8/src/parsing/scanner.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/parsing/scanner.cc')
-rw-r--r--deps/v8/src/parsing/scanner.cc64
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;