Chromium Code Reviews| Index: src/scanner-base.h |
| diff --git a/src/scanner-base.h b/src/scanner-base.h |
| index 61b1fddda9331837f122028eda31972b80b6177c..19bb225ce16be189f158dfa1beddb600050c87f2 100644 |
| --- a/src/scanner-base.h |
| +++ b/src/scanner-base.h |
| @@ -327,6 +327,37 @@ class Scanner { |
| class JavaScriptScanner : public Scanner { |
| public: |
| + |
| + enum LiteralType { |
| + kLiteralNumber = 1, |
| + kLiteralIdentifier = 2, |
| + kLiteralString = 4, |
| + kLiteralRegExp = 8, |
| + kLiteralRegExpFlags = 16 |
| + }; |
| + |
| + // More specialized literal scope. |
|
Søren Thygesen Gjesse
2010/11/19 08:17:21
More specialized - in what sense?
Lasse Reichstein
2010/11/19 08:51:24
Elaborated.
|
| + class LiteralScope { |
| + public: |
| + LiteralScope(JavaScriptScanner* self, LiteralType type) |
| + : scanner_(self), complete_(false) { |
| + if (scanner_->RecordsLiteral(type)) { |
| + scanner_->StartLiteral(); |
| + } |
| + } |
| + ~LiteralScope() { |
| + if (!complete_) scanner_->DropLiteral(); |
| + } |
| + void Complete() { |
| + scanner_->TerminateLiteral(); |
| + complete_ = true; |
| + } |
| + |
| + private: |
| + JavaScriptScanner* scanner_; |
| + bool complete_; |
| + }; |
| + |
| JavaScriptScanner(); |
| // Returns the next token. |
| @@ -354,6 +385,11 @@ class JavaScriptScanner : public Scanner { |
| // tokens, which is what it is used for. |
| void SeekForward(int pos); |
| + // Whether this scanner records the given literal type or not. |
| + bool RecordsLiteral(LiteralType type) { |
| + return (literal_flags_ & type) != 0; |
| + } |
| + |
| protected: |
| bool SkipWhiteSpace(); |
| Token::Value SkipSingleLineComment(); |
| @@ -364,7 +400,8 @@ class JavaScriptScanner : public Scanner { |
| void ScanDecimalDigits(); |
| Token::Value ScanNumber(bool seen_period); |
| - Token::Value ScanIdentifier(); |
| + Token::Value ScanIdentifierOrKeyword(); |
| + Token::Value ScanIdentifierSuffix(LiteralScope* literal); |
| void ScanEscape(); |
| Token::Value ScanString(); |
| @@ -376,6 +413,7 @@ class JavaScriptScanner : public Scanner { |
| // If the escape sequence cannot be decoded the result is kBadChar. |
| uc32 ScanIdentifierUnicodeEscape(); |
| + int literal_flags_; |
| bool has_line_terminator_before_next_; |
| }; |
| @@ -404,10 +442,11 @@ class KeywordMatcher { |
| Token::Value token() { return token_; } |
| - inline void AddChar(unibrow::uchar input) { |
| + inline bool AddChar(unibrow::uchar input) { |
| if (state_ != UNMATCHABLE) { |
| Step(input); |
| } |
| + return state_ != UNMATCHABLE; |
| } |
| void Fail() { |
| @@ -458,33 +497,32 @@ class KeywordMatcher { |
| const char* keyword, |
| int position, |
| Token::Value token_if_match) { |
| - if (input == static_cast<unibrow::uchar>(keyword[position])) { |
| - state_ = KEYWORD_PREFIX; |
| - this->keyword_ = keyword; |
| - this->counter_ = position + 1; |
| - this->keyword_token_ = token_if_match; |
| - return true; |
| + if (input != static_cast<unibrow::uchar>(keyword[position])) { |
| + return false; |
| } |
| - return false; |
| + state_ = KEYWORD_PREFIX; |
| + this->keyword_ = keyword; |
| + this->counter_ = position + 1; |
| + this->keyword_token_ = token_if_match; |
| + return true; |
| } |
| // If input equals match character, transition to new state and return true. |
| inline bool MatchState(unibrow::uchar input, char match, State new_state) { |
| - if (input == static_cast<unibrow::uchar>(match)) { |
| - state_ = new_state; |
| - return true; |
| + if (input != static_cast<unibrow::uchar>(match)) { |
| + return false; |
| } |
| - return false; |
| + state_ = new_state; |
| + return true; |
| } |
| inline bool MatchKeyword(unibrow::uchar input, |
| char match, |
| - State new_state, |
| Token::Value keyword_token) { |
| if (input != static_cast<unibrow::uchar>(match)) { |
| return false; |
| } |
| - state_ = new_state; |
| + state_ = KEYWORD_MATCHED; |
| token_ = keyword_token; |
| return true; |
| } |