Index: src/parsing/scanner.cc |
diff --git a/src/parsing/scanner.cc b/src/parsing/scanner.cc |
index be4100a0971688dea6165b9bf77cabe8a190185b..dbdab3929d3b20fab976855533a8b054e081f057 100644 |
--- a/src/parsing/scanner.cc |
+++ b/src/parsing/scanner.cc |
@@ -19,9 +19,6 @@ |
namespace v8 { |
namespace internal { |
-const size_t Utf16CharacterStream::kNoBookmark = |
- std::numeric_limits<size_t>::max(); |
- |
Handle<String> Scanner::LiteralBuffer::Internalize(Isolate* isolate) const { |
if (is_one_byte()) { |
return isolate->factory()->InternalizeOneByteString(one_byte_literal()); |
@@ -29,21 +26,42 @@ Handle<String> Scanner::LiteralBuffer::Internalize(Isolate* isolate) const { |
return isolate->factory()->InternalizeTwoByteString(two_byte_literal()); |
} |
+// ---------------------------------------------------------------------------- |
+// Scanner::BookmarkScope |
+ |
+const size_t Scanner::BookmarkScope::kNoBookmark = |
+ std::numeric_limits<size_t>::max() - 1; |
+const size_t Scanner::BookmarkScope::kBookmarkWasApplied = |
+ std::numeric_limits<size_t>::max(); |
+ |
+void Scanner::BookmarkScope::Set() { |
+ DCHECK_EQ(bookmark_, kNoBookmark); |
+ DCHECK_EQ(scanner_->next_next_.token, Token::UNINITIALIZED); |
+ bookmark_ = scanner_->location().beg_pos; |
+} |
+ |
+void Scanner::BookmarkScope::Reset() { |
marja
2016/09/19 07:50:22
IMO "Reset" is not the correct name for this funct
vogelheim
2016/09/20 11:52:44
Done.
|
+ DCHECK(HasBeenSet()); // Caller hasn't called SetBookmark. |
+ scanner_->Seek(bookmark_); |
+ bookmark_ = kBookmarkWasApplied; |
+} |
+ |
+bool Scanner::BookmarkScope::HasBeenSet() { |
+ return bookmark_ != kNoBookmark && bookmark_ != kBookmarkWasApplied; |
+} |
+bool Scanner::BookmarkScope::HasBeenReset() { |
+ return bookmark_ == kBookmarkWasApplied; |
marja
2016/09/19 07:50:22
... here you already use the term "apply" :)
vogelheim
2016/09/20 11:52:44
Done.
|
+} |
// ---------------------------------------------------------------------------- |
// Scanner |
Scanner::Scanner(UnicodeCache* unicode_cache) |
: unicode_cache_(unicode_cache), |
- bookmark_c0_(kNoBookmark), |
octal_pos_(Location::invalid()), |
decimal_with_leading_zero_pos_(Location::invalid()), |
found_html_comment_(false) { |
- bookmark_current_.literal_chars = &bookmark_current_literal_; |
- bookmark_current_.raw_literal_chars = &bookmark_current_raw_literal_; |
- bookmark_next_.literal_chars = &bookmark_next_literal_; |
- bookmark_next_.raw_literal_chars = &bookmark_next_raw_literal_; |
} |
@@ -1584,59 +1602,21 @@ int Scanner::FindSymbol(DuplicateFinder* finder, int value) { |
return finder->AddTwoByteSymbol(literal_two_byte_string(), value); |
} |
- |
-bool Scanner::SetBookmark() { |
- if (c0_ != kNoBookmark && bookmark_c0_ == kNoBookmark && |
- next_next_.token == Token::UNINITIALIZED && source_->SetBookmark()) { |
- bookmark_c0_ = c0_; |
- CopyTokenDesc(&bookmark_current_, ¤t_); |
- CopyTokenDesc(&bookmark_next_, &next_); |
- return true; |
- } |
- return false; |
-} |
- |
- |
-void Scanner::ResetToBookmark() { |
- DCHECK(BookmarkHasBeenSet()); // Caller hasn't called SetBookmark. |
- |
- source_->ResetToBookmark(); |
- c0_ = bookmark_c0_; |
- CopyToNextTokenDesc(&bookmark_current_); |
- current_ = next_; |
- CopyToNextTokenDesc(&bookmark_next_); |
- bookmark_c0_ = kBookmarkWasApplied; |
-} |
- |
- |
-bool Scanner::BookmarkHasBeenSet() { return bookmark_c0_ >= 0; } |
- |
- |
-bool Scanner::BookmarkHasBeenReset() { |
- return bookmark_c0_ == kBookmarkWasApplied; |
-} |
- |
- |
-void Scanner::DropBookmark() { bookmark_c0_ = kNoBookmark; } |
- |
-void Scanner::CopyToNextTokenDesc(TokenDesc* from) { |
- StartLiteral(); |
- StartRawLiteral(); |
- CopyTokenDesc(&next_, from); |
- if (next_.literal_chars->length() == 0) next_.literal_chars = nullptr; |
- if (next_.raw_literal_chars->length() == 0) next_.raw_literal_chars = nullptr; |
-} |
- |
-void Scanner::CopyTokenDesc(TokenDesc* to, TokenDesc* from) { |
- DCHECK_NOT_NULL(to); |
- DCHECK_NOT_NULL(from); |
- to->token = from->token; |
- to->location = from->location; |
- to->literal_chars->CopyFrom(from->literal_chars); |
- to->raw_literal_chars->CopyFrom(from->raw_literal_chars); |
+void Scanner::Seek(size_t position) { |
+ // Use with care: This cleanly resets most, but not all scanner state. |
+ // TODO(vogelheim): Fix this, or at least DCHECK the relevant conditions. |
+ |
+ // To re-scan from a given character position, we need to: |
+ // 1, Reset the next_ and next_next_ tokens (since they'll be used by Next(), |
+ next_.token = Token::UNINITIALIZED; |
+ next_next_.token = Token::UNINITIALIZED; |
+ // 2, reset the source to the desired position, |
+ source_->Seek(position); |
+ // 3, re-scan, by scanning the look-ahead char + 2 tokens (current_ + next_). |
+ c0_ = source_->Advance(); |
+ Scan(); |
+ Scan(); |
} |
- |
- |
} // namespace internal |
} // namespace v8 |