| Index: src/scanner.h
|
| diff --git a/src/scanner.h b/src/scanner.h
|
| index 87ff20b753a0f4314dc0553d2ea3ac7847789811..d96ed579b070ecc6e83de670fc789084f1ac5ef1 100644
|
| --- a/src/scanner.h
|
| +++ b/src/scanner.h
|
| @@ -322,16 +322,13 @@ class Scanner {
|
| // if aborting the scanning before it's complete.
|
| class LiteralScope {
|
| public:
|
| - explicit LiteralScope(Scanner* self, bool capture_raw = false)
|
| - : scanner_(self), complete_(false) {
|
| + explicit LiteralScope(Scanner* self) : scanner_(self), complete_(false) {
|
| scanner_->StartLiteral();
|
| - if (capture_raw) scanner_->StartRawLiteral();
|
| }
|
| ~LiteralScope() {
|
| if (!complete_) scanner_->DropLiteral();
|
| }
|
| void Complete() {
|
| - scanner_->TerminateLiteral();
|
| complete_ = true;
|
| }
|
|
|
| @@ -506,6 +503,7 @@ class Scanner {
|
| static const int kCharacterLookaheadBufferSize = 1;
|
|
|
| // Scans octal escape sequence. Also accepts "\0" decimal escape sequence.
|
| + template <bool capture_raw>
|
| uc32 ScanOctalEscape(uc32 c, int length);
|
|
|
| // Call this after setting source_ to the input.
|
| @@ -529,7 +527,6 @@ class Scanner {
|
| inline void StartRawLiteral() {
|
| raw_literal_buffer_.Reset();
|
| next_.raw_literal_chars = &raw_literal_buffer_;
|
| - capturing_raw_literal_ = true;
|
| }
|
|
|
| INLINE(void AddLiteralChar(uc32 c)) {
|
| @@ -538,26 +535,20 @@ class Scanner {
|
| }
|
|
|
| INLINE(void AddRawLiteralChar(uc32 c)) {
|
| - DCHECK(capturing_raw_literal_);
|
| DCHECK_NOT_NULL(next_.raw_literal_chars);
|
| next_.raw_literal_chars->AddChar(c);
|
| }
|
|
|
| INLINE(void ReduceRawLiteralLength(int delta)) {
|
| - DCHECK(capturing_raw_literal_);
|
| DCHECK_NOT_NULL(next_.raw_literal_chars);
|
| next_.raw_literal_chars->ReduceLength(delta);
|
| }
|
|
|
| - // Complete scanning of a literal.
|
| - inline void TerminateLiteral() { capturing_raw_literal_ = false; }
|
| -
|
| // Stops scanning of a literal and drop the collected characters,
|
| // e.g., due to an encountered error.
|
| inline void DropLiteral() {
|
| next_.literal_chars = NULL;
|
| next_.raw_literal_chars = NULL;
|
| - capturing_raw_literal_ = false;
|
| }
|
|
|
| inline void AddLiteralCharAdvance() {
|
| @@ -566,8 +557,9 @@ class Scanner {
|
| }
|
|
|
| // Low-level scanning support.
|
| + template <bool capture_raw = false>
|
| void Advance() {
|
| - if (capturing_raw_literal_) {
|
| + if (capture_raw) {
|
| AddRawLiteralChar(c0_);
|
| }
|
| c0_ = source_->Advance();
|
| @@ -585,10 +577,8 @@ class Scanner {
|
| if (ch > static_cast<uc32>(unibrow::Utf16::kMaxNonSurrogateCharCode)) {
|
| source_->PushBack(unibrow::Utf16::TrailSurrogate(c0_));
|
| source_->PushBack(unibrow::Utf16::LeadSurrogate(c0_));
|
| - if (capturing_raw_literal_) ReduceRawLiteralLength(2);
|
| } else {
|
| source_->PushBack(c0_);
|
| - if (capturing_raw_literal_) ReduceRawLiteralLength(1);
|
| }
|
| c0_ = ch;
|
| }
|
| @@ -613,8 +603,8 @@ class Scanner {
|
| // Literal strings are collected for identifiers, strings, numbers as well
|
| // as for template literals. For template literals we also collect the raw
|
| // form.
|
| - // These functions only give the correct result if the literal
|
| - // was scanned between calls to StartLiteral() and TerminateLiteral().
|
| + // These functions only give the correct result if the literal was scanned
|
| + // when a LiteralScope object is alive.
|
| Vector<const uint8_t> literal_one_byte_string() {
|
| DCHECK_NOT_NULL(current_.literal_chars);
|
| return current_.literal_chars->one_byte_literal();
|
| @@ -658,11 +648,12 @@ class Scanner {
|
| return current_.raw_literal_chars->is_one_byte();
|
| }
|
|
|
| -
|
| + template <bool capture_raw>
|
| uc32 ScanHexNumber(int expected_length);
|
| // Scan a number of any length but not bigger than max_value. For example, the
|
| // number can be 000000001, so it's very long in characters but its value is
|
| // small.
|
| + template <bool capture_raw>
|
| uc32 ScanUnlimitedLengthHexNumber(int max_value);
|
|
|
| // Scans a single JavaScript token.
|
| @@ -686,11 +677,13 @@ class Scanner {
|
| // Scans an escape-sequence which is part of a string and adds the
|
| // decoded character to the current literal. Returns true if a pattern
|
| // is scanned.
|
| + template <bool capture_raw>
|
| bool ScanEscape();
|
| // Decodes a Unicode escape-sequence which is part of an identifier.
|
| // If the escape sequence cannot be decoded the result is kBadChar.
|
| uc32 ScanIdentifierUnicodeEscape();
|
| // Helper for the above functions.
|
| + template <bool capture_raw>
|
| uc32 ScanUnicodeEscape();
|
|
|
| Token::Value ScanTemplateSpan();
|
| @@ -713,10 +706,6 @@ class Scanner {
|
| // Buffer to store raw string values
|
| LiteralBuffer raw_literal_buffer_;
|
|
|
| - // We only need to capture the raw literal when we are scanning template
|
| - // literal spans.
|
| - bool capturing_raw_literal_;
|
| -
|
| TokenDesc current_; // desc for current token (as returned by Next())
|
| TokenDesc next_; // desc for next token (one token look-ahead)
|
|
|
|
|