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

Unified Diff: runtime/vm/scanner.cc

Issue 316633002: Speed up identifying keywords in scanner, by using extra table. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 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 | « runtime/vm/scanner.h ('k') | runtime/vm/symbols.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
+ }
}
}
« no previous file with comments | « runtime/vm/scanner.h ('k') | runtime/vm/symbols.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698