Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(949)

Unified Diff: src/parsing/scanner.h

Issue 2240513003: Scanner::LiteralBuffer usage cleanup. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Feedback fix compiler issues. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/parsing/parser-base.h ('k') | src/parsing/scanner.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/scanner.h
diff --git a/src/parsing/scanner.h b/src/parsing/scanner.h
index ac17a49c2e102429a81e9dffa0526fc161daf03d..115c760ca45f8abb14be68bb374c6a86a53722ae 100644
--- a/src/parsing/scanner.h
+++ b/src/parsing/scanner.h
@@ -219,10 +219,9 @@ class Scanner {
bool literal_contains_escapes() const {
return LiteralContainsEscapes(current_);
}
- bool next_literal_contains_escapes() const {
- return LiteralContainsEscapes(next_);
- }
bool is_literal_contextual_keyword(Vector<const char> keyword) {
+ DCHECK(current_.token == Token::IDENTIFIER ||
+ current_.token == Token::ESCAPED_STRICT_RESERVED_WORD);
DCHECK_NOT_NULL(current_.literal_chars);
return current_.literal_chars->is_contextual_keyword(keyword);
}
@@ -238,9 +237,10 @@ class Scanner {
double DoubleValue();
bool ContainsDot();
bool LiteralMatches(const char* data, int length, bool allow_escapes = true) {
- if (is_literal_one_byte() &&
- literal_length() == length &&
- (allow_escapes || !literal_contains_escapes())) {
+ if (!current_.literal_chars) {
+ return !strncmp(Token::Name(current_.token), data, length);
+ } else if (is_literal_one_byte() && literal_length() == length &&
+ (allow_escapes || !literal_contains_escapes())) {
const char* token =
reinterpret_cast<const char*>(literal_one_byte_string().start());
return !strncmp(token, data, length);
@@ -299,9 +299,9 @@ class Scanner {
return has_line_terminator_after_next_;
}
- // Scans the input as a regular expression pattern, previous
- // character(s) must be /(=). Returns true if a pattern is scanned.
- bool ScanRegExpPattern(bool seen_equal);
+ // Scans the input as a regular expression pattern, next token must be /(=).
+ // Returns true if a pattern is scanned.
+ bool ScanRegExpPattern();
// Scans the input as regular expression flags. Returns the flags on success.
Maybe<RegExp::Flags> ScanRegExpFlags();
@@ -515,9 +515,15 @@ class Scanner {
STATIC_ASSERT(kCharacterLookaheadBufferSize == 1);
Advance();
// Initialize current_ to not refer to a literal.
+ current_.token = Token::UNINITIALIZED;
current_.literal_chars = NULL;
current_.raw_literal_chars = NULL;
+ next_.token = Token::UNINITIALIZED;
+ next_.literal_chars = NULL;
+ next_.raw_literal_chars = NULL;
next_next_.token = Token::UNINITIALIZED;
+ next_next_.literal_chars = NULL;
+ next_next_.raw_literal_chars = NULL;
found_html_comment_ = false;
scanner_error_ = MessageTemplate::kNone;
}
@@ -650,21 +656,30 @@ class Scanner {
// form.
// These functions only give the correct result if the literal was scanned
// when a LiteralScope object is alive.
+ //
+ // Current usage of these functions is unfortunately a little undisciplined,
+ // and is_literal_one_byte() + is_literal_one_byte_string() is also
+ // requested for tokens that do not have a literal. Hence, we treat any
+ // token as a one-byte literal. E.g. Token::FUNCTION pretends to have a
+ // literal "function".
Vector<const uint8_t> literal_one_byte_string() {
- DCHECK_NOT_NULL(current_.literal_chars);
- return current_.literal_chars->one_byte_literal();
+ if (current_.literal_chars)
+ return current_.literal_chars->one_byte_literal();
+ const char* str = Token::String(current_.token);
+ const uint8_t* str_as_uint8 = reinterpret_cast<const uint8_t*>(str);
+ return Vector<const uint8_t>(str_as_uint8,
+ Token::StringLength(current_.token));
}
Vector<const uint16_t> literal_two_byte_string() {
DCHECK_NOT_NULL(current_.literal_chars);
return current_.literal_chars->two_byte_literal();
}
bool is_literal_one_byte() {
- DCHECK_NOT_NULL(current_.literal_chars);
- return current_.literal_chars->is_one_byte();
+ return !current_.literal_chars || current_.literal_chars->is_one_byte();
}
int literal_length() const {
- DCHECK_NOT_NULL(current_.literal_chars);
- return current_.literal_chars->length();
+ if (current_.literal_chars) return current_.literal_chars->length();
+ return Token::StringLength(current_.token);
}
// Returns the literal string for the next token (the token that
// would be returned if Next() were called).
@@ -746,9 +761,14 @@ class Scanner {
// Subtract delimiters.
source_length -= 2;
}
- return token.literal_chars->length() != source_length;
+ return token.literal_chars &&
+ (token.literal_chars->length() != source_length);
}
+#ifdef DEBUG
+ void SanityCheckTokenDesc(const TokenDesc&) const;
+#endif
+
UnicodeCache* unicode_cache_;
// Buffers collecting literal strings, numbers, etc.
« no previous file with comments | « src/parsing/parser-base.h ('k') | src/parsing/scanner.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698