Index: src/lexer/lexer-shell.cc |
diff --git a/src/lexer/lexer-shell.cc b/src/lexer/lexer-shell.cc |
index b65c71141b067b8a20e44a80d7005b154962f229..7d20fa2cc38ada59b212cf86bc7e0094aff7a5a6 100644 |
--- a/src/lexer/lexer-shell.cc |
+++ b/src/lexer/lexer-shell.cc |
@@ -30,6 +30,7 @@ |
#include <string.h> |
#include <stdio.h> |
#include <stdlib.h> |
+#include <sys/time.h> |
#include "v8.h" |
#include "api.h" |
@@ -81,7 +82,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 +99,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 +178,60 @@ 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; |
+ 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; |
+ |
+ struct timeval baseline_tv_start, baseline_tv_stop, experimental_tv_start, |
+ experimental_tv_stop; |
+ gettimeofday(&baseline_tv_start, NULL); |
ulan
2013/10/17 13:43:32
We can use ElapsedTimer of v8 here.
marja
2013/10/17 13:56:34
Done.
|
do { |
- expected_token = baseline.Next(&expected_beg, &expected_end); |
- actual_token = experimental.Next(&actual_beg, &actual_end); |
+ token = baseline.Next(&beg, &end); |
+ baseline_tokens.push_back(token); |
+ baseline_beg.push_back(beg); |
+ baseline_end.push_back(end); |
+ } while (token != Token::EOS); |
+ gettimeofday(&baseline_tv_stop, NULL); |
+ |
+ gettimeofday(&experimental_tv_start, NULL); |
+ 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); |
+ gettimeofday(&experimental_tv_stop, NULL); |
+ |
+ 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); |
+ } |
+ fprintf(stderr, |
+ "Baseline: %ld\n", |
+ 1000000 * (baseline_tv_stop.tv_sec - baseline_tv_start.tv_sec) + |
+ baseline_tv_stop.tv_usec - baseline_tv_start.tv_usec); |
+ fprintf(stderr, |
+ "Experimental: %ld\n", |
+ 1000000 * (experimental_tv_stop.tv_sec - |
+ experimental_tv_start.tv_sec) + |
+ experimental_tv_stop.tv_usec - experimental_tv_start.tv_usec); |
} |
} |
v8::V8::Dispose(); |