Index: src/lexer/lexer-shell.cc |
diff --git a/src/lexer/lexer-shell.cc b/src/lexer/lexer-shell.cc |
index b65c71141b067b8a20e44a80d7005b154962f229..20a603818e7b97da9523d1754e587595a5ae22e9 100644 |
--- a/src/lexer/lexer-shell.cc |
+++ b/src/lexer/lexer-shell.cc |
@@ -81,7 +81,7 @@ class BaselineScanner { |
delete scanner_; |
delete stream_; |
delete unicode_cache_; |
- delete source_; |
+ delete[] source_; |
} |
Token::Value Next(int* beg_pos, int* end_pos) { |
@@ -98,6 +98,70 @@ class BaselineScanner { |
Utf8ToUtf16CharacterStream* stream_; |
}; |
+ExperimentalScanner::ExperimentalScanner(const char* fname, |
+ bool read_all_at_once) |
+ : current_(0), |
+ fetched_(0), |
+ read_all_at_once_(read_all_at_once), |
+ source_(0), |
+ length_(0) { |
+ file_ = fopen(fname, "rb"); |
+ scanner_ = new PushScanner(this); |
+ if (read_all_at_once_) { |
+ source_ = ReadFile(fname, NULL, &length_); |
+ } |
+} |
+ |
+ |
+ExperimentalScanner::~ExperimentalScanner() { |
+ fclose(file_); |
+ delete[] source_; |
+} |
+ |
+ |
+void ExperimentalScanner::FillTokens() { |
+ current_ = 0; |
+ fetched_ = 0; |
+ if (read_all_at_once_) { |
+ scanner_->push(source_, length_ + 1); |
+ } else { |
+ uint8_t chars[BUFFER_SIZE]; |
+ int n = static_cast<int>(fread(&chars, 1, BUFFER_SIZE, file_)); |
+ for (int i = n; i < BUFFER_SIZE; i++) chars[i] = 0; |
+ scanner_->push(chars, BUFFER_SIZE); |
+ } |
+} |
+ |
+ |
+Token::Value ExperimentalScanner::Next(int* beg_pos, int* end_pos) { |
+ while (current_ == fetched_) { |
+ FillTokens(); |
+ } |
+ *beg_pos = beg_[current_]; |
+ *end_pos = end_[current_]; |
+ Token::Value res = token_[current_]; |
+ if (token_[current_] != Token::Token::EOS && |
+ token_[current_] != Token::ILLEGAL) { |
+ current_++; |
+ } |
+ return res; |
+} |
+ |
+ |
+void ExperimentalScanner::Record(Token::Value token, int beg, int end) { |
+ if (token == Token::EOS) end--; |
+ if (fetched_ >= token_.size()) { |
+ token_.push_back(token); |
+ beg_.push_back(beg); |
+ end_.push_back(end); |
+ } else { |
+ token_[fetched_] = token; |
+ beg_[fetched_] = beg; |
+ end_[fetched_] = end; |
+ } |
+ fetched_++; |
+} |
+ |
int main(int argc, char* argv[]) { |
v8::V8::InitializeICU(); |
@@ -113,28 +177,58 @@ int main(int argc, char* argv[]) { |
Isolate* isolate = Isolate::Current(); |
HandleScope handle_scope(isolate); |
BaselineScanner baseline(argv[1], isolate); |
- ExperimentalScanner experimental(argv[1]); |
- Token::Value expected_token, actual_token; |
- int expected_beg, expected_end, actual_beg, actual_end; |
- do { |
- expected_token = baseline.Next(&expected_beg, &expected_end); |
- actual_token = experimental.Next(&actual_beg, &actual_end); |
+ ExperimentalScanner experimental(argv[1], true); |
+ |
+ std::vector<Token::Value> baseline_tokens, experimental_tokens; |
+ std::vector<size_t> baseline_beg, baseline_end, experimental_beg, |
+ experimental_end; |
+ Token::Value token; |
+ int beg, end; |
+ |
+ TimeDelta baseline_time, experimental_time; |
+ ElapsedTimer timer; |
+ { |
+ timer.Start(); |
+ do { |
+ token = baseline.Next(&beg, &end); |
+ baseline_tokens.push_back(token); |
+ baseline_beg.push_back(beg); |
+ baseline_end.push_back(end); |
+ } while (token != Token::EOS); |
+ baseline_time = timer.Elapsed(); |
+ } |
+ |
+ { |
+ timer.Start(); |
+ do { |
+ token = experimental.Next(&beg, &end); |
+ experimental_tokens.push_back(token); |
+ experimental_beg.push_back(beg); |
+ experimental_end.push_back(end); |
+ } while (token != Token::EOS); |
+ experimental_time = timer.Elapsed(); |
+ } |
+ |
+ for (size_t i = 0; i < experimental_tokens.size(); ++i) { |
printf("=> %11s at (%d, %d)\n", |
- Token::Name(actual_token), |
- actual_beg, actual_end); |
- if (expected_token != actual_token || |
- expected_beg != actual_beg || |
- expected_end != actual_end) { |
+ Token::Name(experimental_tokens[i]), |
+ experimental_beg[i], experimental_end[i]); |
+ if (experimental_tokens[i] != baseline_tokens[i] || |
+ experimental_beg[i] != baseline_beg[i] || |
+ experimental_end[i] != baseline_end[i]) { |
printf("MISMATCH:\n"); |
printf("Expected: %s at (%d, %d)\n", |
- Token::Name(expected_token), |
- expected_beg, expected_end); |
+ Token::Name(baseline_tokens[i]), |
+ baseline_beg[i], baseline_end[i]); |
printf("Actual: %s at (%d, %d)\n", |
- Token::Name(actual_token), |
- actual_beg, actual_end); |
+ Token::Name(experimental_tokens[i]), |
+ experimental_beg[i], experimental_end[i]); |
return 1; |
} |
- } while (actual_token != Token::EOS); |
+ } |
+ printf("Baseline: %f ms\nExperimental %f ms\n", |
+ baseline_time.InMillisecondsF(), |
+ experimental_time.InMillisecondsF()); |
} |
} |
v8::V8::Dispose(); |