Revision: 19682
Author:   [email protected]
Date:     Wed Mar  5 15:21:46 2014 UTC
Log:      Experimental parser: make lexer shell do something again

[email protected]

BUG=

Review URL: https://codereview.chromium.org/187633003
http://code.google.com/p/v8/source/detail?r=19682

Modified:
 /branches/experimental/parser/src/lexer/lexer-shell.cc

=======================================
--- /branches/experimental/parser/src/lexer/lexer-shell.cc Wed Mar 5 08:32:50 2014 UTC +++ /branches/experimental/parser/src/lexer/lexer-shell.cc Wed Mar 5 15:21:46 2014 UTC
@@ -25,7 +25,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-#include <assert.h>
 #include <fcntl.h>
 #include <string.h>
 #include <stdio.h>
@@ -48,8 +47,8 @@

 using namespace v8::internal;

-byte* ReadFile(const char* name, const byte** end, int repeat,
-               bool convert_to_utf16) {
+static byte* ReadFile(const char* name, const byte** end, int repeat,
+                      bool convert_to_utf16) {
   FILE* file = fopen(name, "rb");
   if (file == NULL) return NULL;

@@ -103,10 +102,6 @@
 struct LexerShellSettings {
   Encoding encoding;
   bool print_tokens;
-  bool run_baseline;
-  bool run_experimental;
-  bool check_tokens;
-  bool dump_tokens;
   bool break_after_illegal;
   bool eos_test;
   int repeat;
@@ -116,10 +111,6 @@
   LexerShellSettings()
       : encoding(LATIN1),
         print_tokens(false),
-        run_baseline(true),
-        run_experimental(true),
-        check_tokens(true),
-        dump_tokens(false),
         break_after_illegal(false),
         eos_test(false),
         repeat(1),
@@ -128,58 +119,6 @@
         harmony_scoping(false) {}
 };

-class BaselineScanner {
- public:
-  BaselineScanner(const byte* source,
-                  const byte* source_end,
-                  Isolate* isolate,
-                  ElapsedTimer* timer,
-                  const LexerShellSettings& settings)
-      : source_(source), stream_(NULL) {
-    scanner_ = new Scanner(isolate->unicode_cache());
-    scanner_->SetHarmonyNumericLiterals(settings.harmony_numeric_literals);
-    scanner_->SetHarmonyModules(settings.harmony_modules);
-    scanner_->SetHarmonyScoping(settings.harmony_scoping);
-    switch (settings.encoding) {
-      case UTF8:
-      case UTF8TO16:
- stream_ = new Utf8ToUtf16CharacterStream(source_, source_end - source_);
-        break;
-      case UTF16: {
-        Handle<String> result = isolate->factory()->NewStringFromTwoByte(
-            Vector<const uint16_t>(
-                reinterpret_cast<const uint16_t*>(source_),
-                (source_end - source_) / 2));
-        stream_ =
- new GenericStringUtf16CharacterStream(result, 0, result->length());
-        break;
-      }
-      case LATIN1: {
-        Handle<String> result = isolate->factory()->NewStringFromOneByte(
-            Vector<const uint8_t>(source_, source_end - source_));
-        stream_ =
- new GenericStringUtf16CharacterStream(result, 0, result->length());
-        break;
-      }
-    }
-    timer->Start();
-    scanner_->Initialize(stream_);
-  }
-
-  ~BaselineScanner() {
-    delete scanner_;
-    delete stream_;
-    delete unicode_cache_;
-  }
-
-  Scanner* scanner_;
-
- private:
-  UnicodeCache* unicode_cache_;
-  const byte* source_;
-  Utf16CharacterStream* stream_;
-};
-

 struct TokenWithLocation {
   Token::Value value;
@@ -219,7 +158,7 @@
 };


-bool HasLiteral(Token::Value token) {
+static bool HasLiteral(Token::Value token) {
   return token == Token::IDENTIFIER ||
          token == Token::STRING ||
          token == Token::NUMBER;
@@ -227,7 +166,7 @@


 template<typename Char>
-std::vector<int> ToStdVector(const Vector<Char>& literal) {
+static std::vector<int> ToStdVector(const Vector<Char>& literal) {
   std::vector<int> result;
   for (int i = 0; i < literal.length(); i++) {
     result.push_back(literal[i]);
@@ -237,7 +176,8 @@


 template<typename Scanner>
-TokenWithLocation GetTokenWithLocation(Scanner *scanner, Token::Value token) {
+static TokenWithLocation GetTokenWithLocation(
+    Scanner *scanner, Token::Value token) {
   int beg = scanner->location().beg_pos;
   int end = scanner->location().end_pos;
TokenWithLocation result(token, beg, end, scanner->octal_position().beg_pos);
@@ -253,27 +193,51 @@
 }


-TimeDelta RunBaselineScanner(const byte* source,
-                             const byte* source_end,
-                             Isolate* isolate,
-                             std::vector<TokenWithLocation>* tokens,
-                             const LexerShellSettings& settings) {
+static TimeDelta RunLexer(const byte* source,
+                          const byte* source_end,
+                          Isolate* isolate,
+                          std::vector<TokenWithLocation>* tokens,
+                          const LexerShellSettings& settings) {
+  SmartPointer<Utf16CharacterStream> stream;
+  switch (settings.encoding) {
+    case UTF8:
+    case UTF8TO16:
+ stream.Reset(new Utf8ToUtf16CharacterStream(source, source_end - source));
+      break;
+    case UTF16: {
+      Handle<String> result = isolate->factory()->NewStringFromTwoByte(
+          Vector<const uint16_t>(
+              reinterpret_cast<const uint16_t*>(source),
+              (source_end - source) / 2));
+      stream.Reset(
+ new GenericStringUtf16CharacterStream(result, 0, result->length()));
+      break;
+    }
+    case LATIN1: {
+      Handle<String> result = isolate->factory()->NewStringFromOneByte(
+          Vector<const uint8_t>(source, source_end - source));
+      stream.Reset(
+ new GenericStringUtf16CharacterStream(result, 0, result->length()));
+      break;
+    }
+  }
+  Scanner scanner(isolate->unicode_cache());
+  scanner.SetHarmonyNumericLiterals(settings.harmony_numeric_literals);
+  scanner.SetHarmonyModules(settings.harmony_modules);
+  scanner.SetHarmonyScoping(settings.harmony_scoping);
   ElapsedTimer timer;
-  BaselineScanner scanner(source,
-                          source_end,
-                          isolate,
-                          &timer,
-                          settings);
+  timer.Start();
+  scanner.Initialize(stream.get());
   Token::Value token;
   do {
-    token = scanner.scanner_->Next();
-    if (settings.dump_tokens) {
-      tokens->push_back(GetTokenWithLocation(scanner.scanner_, token));
+    token = scanner.Next();
+    if (settings.print_tokens) {
+      tokens->push_back(GetTokenWithLocation(&scanner, token));
     } else if (HasLiteral(token)) {
-      if (scanner.scanner_->is_literal_ascii()) {
-        scanner.scanner_->literal_ascii_string();
+      if (scanner.is_literal_ascii()) {
+        scanner.literal_ascii_string();
       } else {
-        scanner.scanner_->literal_utf16_string();
+        scanner.literal_utf16_string();
       }
     }
   } while (token != Token::EOS);
@@ -281,91 +245,47 @@
 }


-void PrintTokens(const char* name,
-                 const std::vector<TokenWithLocation>& tokens) {
-  printf("No of tokens: %d\n",
-         static_cast<int>(tokens.size()));
-  printf("%s:\n", name);
-  for (size_t i = 0; i < tokens.size(); ++i) {
-    tokens[i].Print("=>");
-  }
-}
-
-
-std::pair<TimeDelta, TimeDelta> ProcessFile(
+static TimeDelta ProcessFile(
     const char* fname,
     Isolate* isolate,
     const LexerShellSettings& settings,
     int truncate_by,
     bool* can_truncate) {
-  const bool print_tokens = settings.print_tokens;
-  const bool run_baseline = settings.run_baseline;
-  const bool run_experimental = settings.run_experimental;
-  if (print_tokens) {
+  if (settings.print_tokens) {
printf("Processing file %s, truncating by %d bytes\n", fname, truncate_by);
   }
   HandleScope handle_scope(isolate);
-  std::vector<TokenWithLocation> baseline_tokens, experimental_tokens;
-  TimeDelta baseline_time, experimental_time;
-  if (settings.run_baseline) {
+  std::vector<TokenWithLocation> tokens;
+  TimeDelta time;
+  {
     const byte* buffer_end = 0;
const byte* buffer = ReadFile(fname, &buffer_end, settings.repeat, false);
     if (truncate_by > buffer_end - buffer) {
       *can_truncate = false;
     } else {
       buffer_end -= truncate_by;
-      baseline_time = RunBaselineScanner(
-          buffer, buffer_end, isolate, &baseline_tokens, settings);
+      time = RunLexer(buffer, buffer_end, isolate, &tokens, settings);
     }
     delete[] buffer;
   }
-  if (print_tokens && !run_experimental) {
-    PrintTokens("Baseline", baseline_tokens);
-  }
-  if (print_tokens && !run_baseline) {
-    PrintTokens("Experimental", experimental_tokens);
-  }
-  if ((print_tokens || settings.check_tokens) &&
-       run_baseline && run_experimental) {
-    if (print_tokens) {
-      printf("No of tokens in Baseline:     %d\n",
-             static_cast<int>(baseline_tokens.size()));
-      printf("No of tokens in Experimental: %d\n",
-             static_cast<int>(experimental_tokens.size()));
-      printf("Baseline and Experimental:\n");
-    }
-    for (size_t i = 0; i < experimental_tokens.size(); ++i) {
-      if (print_tokens) experimental_tokens[i].Print("=>");
-      if (baseline_tokens[i].value == Token::ILLEGAL) {
-        if (experimental_tokens[i].value != Token::ILLEGAL ||
-            experimental_tokens[i].beg != baseline_tokens[i].beg) {
-          printf("MISMATCH:\n");
-          baseline_tokens[i].Print("Expected: ");
-          experimental_tokens[i].Print("Actual:   ");
-          exit(1);
-        }
+  if (settings.print_tokens) {
+    printf("No of tokens:\t%d\n", static_cast<int>(tokens.size()));
+    for (size_t i = 0; i < tokens.size(); ++i) {
+      tokens[i].Print("=>");
+      if (tokens[i].value == Token::ILLEGAL) {
         if (settings.break_after_illegal)
           break;
-        continue;
-      }
-      if (experimental_tokens[i] != baseline_tokens[i]) {
-        printf("MISMATCH:\n");
-        baseline_tokens[i].Print("Expected: ");
-        experimental_tokens[i].Print("Actual:   ");
-        exit(1);
       }
     }
   }
-  return std::make_pair(baseline_time, experimental_time);
+  return time;
 }


 int main(int argc, char* argv[]) {
-  return 0;
   v8::V8::InitializeICU();
   v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
   std::vector<std::string> fnames;
-  std::string benchmark;
   LexerShellSettings settings;
   for (int i = 0; i < argc; ++i) {
     if (strcmp(argv[i], "--latin1") == 0) {
@@ -379,9 +299,11 @@
     } else if (strcmp(argv[i], "--print-tokens") == 0) {
       settings.print_tokens = true;
     } else if (strcmp(argv[i], "--no-baseline") == 0) {
+      // Ignore.
     } else if (strcmp(argv[i], "--no-experimental") == 0) {
+      // Ignore.
     } else if (strcmp(argv[i], "--no-check") == 0) {
-      settings.check_tokens = false;
+      // Ignore.
     } else if (strcmp(argv[i], "--break-after-illegal") == 0) {
       settings.break_after_illegal = true;
     } else if (strcmp(argv[i], "--use-harmony") == 0) {
@@ -389,7 +311,7 @@
       settings.harmony_modules = true;
       settings.harmony_scoping = true;
     } else if (strncmp(argv[i], "--benchmark=", 12) == 0) {
-      benchmark = std::string(argv[i]).substr(12);
+      // Ignore.
     } else if (strncmp(argv[i], "--repeat=", 9) == 0) {
       std::string repeat_str = std::string(argv[i]).substr(9);
       settings.repeat = atoi(repeat_str.c_str());
@@ -399,46 +321,29 @@
       fnames.push_back(std::string(argv[i]));
     }
   }
-  settings.check_tokens =
-      settings.check_tokens &&
-      settings.run_baseline &&
-      settings.run_experimental;
-  settings.dump_tokens = settings.check_tokens || settings.print_tokens;
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
   {
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
     v8::HandleScope handle_scope(isolate);
-    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
- v8::Local<v8::Context> context = v8::Context::New(isolate, NULL, global);
-    ASSERT(!context.IsEmpty());
-    {
-      v8::Context::Scope scope(context);
-      Isolate* internal_isolate = Isolate::Current();
-      double baseline_total = 0, experimental_total = 0;
-      for (size_t i = 0; i < fnames.size(); i++) {
-        std::pair<TimeDelta, TimeDelta> times;
-        bool can_truncate = settings.eos_test;
-        int truncate_by = 0;
-        do {
-          times = ProcessFile(fnames[i].c_str(),
-                              internal_isolate,
-                              settings,
-                              truncate_by,
-                              &can_truncate);
-          baseline_total += times.first.InMillisecondsF();
-          experimental_total += times.second.InMillisecondsF();
-          ++truncate_by;
-        } while (can_truncate);
-      }
-      if (settings.run_baseline) {
-        printf("Baseline%s(RunTime): %.f ms\n", benchmark.c_str(),
-               baseline_total);
-      }
-      if (settings.run_experimental) {
-        if (benchmark.empty()) benchmark = "Experimental";
-        printf("%s(RunTime): %.f ms\n", benchmark.c_str(),
-               experimental_total);
-      }
+    v8::Local<v8::Context> context = v8::Context::New(isolate);
+    CHECK(!context.IsEmpty());
+    v8::Context::Scope scope(context);
+    Isolate* internal_isolate = Isolate::Current();
+    double total_time = 0;
+    for (size_t i = 0; i < fnames.size(); i++) {
+      std::pair<TimeDelta, TimeDelta> times;
+      bool can_truncate = settings.eos_test;
+      int truncate_by = 0;
+      do {
+        TimeDelta t = ProcessFile(fnames[i].c_str(),
+                                  internal_isolate,
+                                  settings,
+                                  truncate_by,
+                                  &can_truncate);
+        total_time += t.InMillisecondsF();
+        ++truncate_by;
+      } while (can_truncate);
     }
+    printf("RunTime: %.f ms\n", total_time);
   }
   v8::V8::Dispose();
   return 0;

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to