| Index: runtime/vm/scanner.cc
|
| diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
|
| index ceef56d84b7846132fd4020fbe244b24bba1af34..c207415ce2f836c11f682e499bc0c4c36a26fc70 100644
|
| --- a/runtime/vm/scanner.cc
|
| +++ b/runtime/vm/scanner.cc
|
| @@ -19,7 +19,8 @@ namespace dart {
|
| DEFINE_FLAG(bool, print_tokens, false, "Print scanned tokens.");
|
|
|
|
|
| -Scanner::KeywordTable Scanner::keywords_[Token::numKeywords];
|
| +Scanner::KeywordTable Scanner::keywords_[Token::kNumKeywords];
|
| +int Scanner::keywords_char_offset_[Scanner::kNumLowercaseChars];
|
|
|
|
|
| void Scanner::Reset() {
|
| @@ -289,23 +290,25 @@ void Scanner::ScanIdentChars(bool allow_dollar) {
|
|
|
| // Check whether the characters we read are a known keyword.
|
| // Note, can't use strcmp since token_chars is not null-terminated.
|
| - int i = 0;
|
| - while (i < Token::numKeywords &&
|
| - keywords_[i].keyword_chars[0] <= ident_char0) {
|
| - if (keywords_[i].keyword_len == ident_length) {
|
| - const char* keyword = keywords_[i].keyword_chars;
|
| - int char_pos = 0;
|
| - while ((char_pos < ident_length) &&
|
| - (keyword[char_pos] == source_.CharAt(ident_pos + char_pos))) {
|
| - char_pos++;
|
| - }
|
| - if (char_pos == ident_length) {
|
| - current_token_.literal = keywords_[i].keyword_symbol;
|
| - current_token_.kind = keywords_[i].kind;
|
| - return;
|
| + if (('a' <= ident_char0) && (ident_char0 <= 'z')) {
|
| + int i = keywords_char_offset_[ident_char0 - 'a'];
|
| + while (i < Token::kNumKeywords &&
|
| + keywords_[i].keyword_chars[0] <= ident_char0) {
|
| + if (keywords_[i].keyword_len == ident_length) {
|
| + const char* keyword = keywords_[i].keyword_chars;
|
| + int char_pos = 1;
|
| + while ((char_pos < ident_length) &&
|
| + (keyword[char_pos] == source_.CharAt(ident_pos + char_pos))) {
|
| + char_pos++;
|
| + }
|
| + if (char_pos == ident_length) {
|
| + current_token_.literal = keywords_[i].keyword_symbol;
|
| + current_token_.kind = keywords_[i].kind;
|
| + return;
|
| + }
|
| }
|
| + i++;
|
| }
|
| - i++;
|
| }
|
|
|
| // We did not read a keyword.
|
| @@ -937,12 +940,20 @@ void Scanner::PrintTokens(const GrowableTokenStream& ts) {
|
|
|
| void Scanner::InitOnce() {
|
| ASSERT(Isolate::Current() == Dart::vm_isolate());
|
| - for (int i = 0; i < Token::numKeywords; i++) {
|
| + for (int i = 0; i < kNumLowercaseChars; i++) {
|
| + keywords_char_offset_[i] = Token::kNumKeywords;
|
| + }
|
| + for (int i = 0; i < Token::kNumKeywords; i++) {
|
| Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
|
| keywords_[i].kind = token;
|
| keywords_[i].keyword_chars = Token::Str(token);
|
| keywords_[i].keyword_len = strlen(Token::Str(token));
|
| keywords_[i].keyword_symbol = &Symbols::Keyword(token);
|
| +
|
| + int ch = keywords_[i].keyword_chars[0] - 'a';
|
| + if (keywords_char_offset_[ch] == Token::kNumKeywords) {
|
| + keywords_char_offset_[ch] = i;
|
| + }
|
| }
|
| }
|
|
|
|
|