Revision: 17274
Author:   [email protected]
Date:     Fri Oct 18 14:33:27 2013 UTC
Log: Experimental parser: Starting to unify the ExperimentalScanner iface with Scanner iface.

.. so that we can replace Scanner with ExperimentalScanner.

BUG=
[email protected]

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

Added:
 /branches/experimental/parser/src/lexer/experimental-scanner.cc
 /branches/experimental/parser/src/lexer/experimental-scanner.h
Modified:
 /branches/experimental/parser/src/lexer/lexer-shell.cc
 /branches/experimental/parser/src/lexer/lexer.gyp
 /branches/experimental/parser/src/lexer/lexer.h
 /branches/experimental/parser/src/lexer/lexer.re

=======================================
--- /dev/null
+++ /branches/experimental/parser/src/lexer/experimental-scanner.cc Fri Oct 18 14:33:27 2013 UTC
@@ -0,0 +1,131 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (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 "experimental-scanner.h"
+
+#include "lexer.h"
+
+namespace v8 {
+namespace internal {
+
+namespace {
+
+// Will go away.
+const byte* ReadFile(const char* name, Isolate* isolate, int* size) {
+  FILE* file = fopen(name, "rb");
+  *size = 0;
+  if (file == NULL) return NULL;
+
+  fseek(file, 0, SEEK_END);
+  *size = ftell(file);
+  rewind(file);
+
+  byte* chars = new byte[*size + 1];
+  chars[*size] = 0;
+  for (int i = 0; i < *size;) {
+    int read = static_cast<int>(fread(&chars[i], 1, *size - i, file));
+    i += read;
+  }
+  fclose(file);
+  return chars;
+}
+
+}
+
+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_);
+    token_.resize(1500);
+    beg_.resize(1500);
+    end_.resize(1500);
+  } else {
+    token_.resize(BUFFER_SIZE);
+    beg_.resize(BUFFER_SIZE);
+    end_.resize(BUFFER_SIZE);
+  }
+}
+
+
+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() {
+  while (current_ == fetched_)
+    FillTokens();
+  return token_[current_++];
+}
+
+
+Token::Value ExperimentalScanner::current_token() {
+  return token_[current_ - 1];
+}
+
+
+ExperimentalScanner::Location ExperimentalScanner::location() {
+  return Location(beg_[current_ - 1], end_[current_ - 1]);
+}
+
+
+void ExperimentalScanner::Record(Token::Value token, int beg, int end) {
+  if (token == Token::EOS) end--;
+  if (fetched_ >= token_.size()) {
+    token_.resize(token_.size() * 2);
+    beg_.resize(beg_.size() * 2);
+    end_.resize(end_.size() * 2);
+  }
+  token_[fetched_] = token;
+  beg_[fetched_] = beg;
+  end_[fetched_] = end;
+  fetched_++;
+}
+
+} }  // namespace v8::internal
=======================================
--- /dev/null
+++ /branches/experimental/parser/src/lexer/experimental-scanner.h Fri Oct 18 14:33:27 2013 UTC
@@ -0,0 +1,83 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef V8_LEXER_EXPERIMENTAL_SCANNER_H
+#define V8_LEXER_EXPERIMENTAL_SCANNER_H
+
+#include <vector>
+
+#include "flags.h"
+#include "token.h"
+
+namespace v8 {
+namespace internal {
+
+class PushScanner;
+
+class ExperimentalScanner {
+ public:
+  struct Location {
+    Location(int b, int e) : beg_pos(b), end_pos(e) { }
+    Location() : beg_pos(0), end_pos(0) { }
+
+    bool IsValid() const {
+      return beg_pos >= 0 && end_pos >= beg_pos;
+    }
+
+    static Location invalid() { return Location(-1, -1); }
+
+    int beg_pos;
+    int end_pos;
+  };
+
+  ExperimentalScanner(const char* fname, bool read_all_at_once);
+  ~ExperimentalScanner();
+
+  Token::Value Next();
+  Token::Value current_token();
+  Location location();
+
+  void Record(v8::internal::Token::Value token, int beg_pos, int end_pos);
+
+ private:
+  void FillTokens();
+  static const int BUFFER_SIZE = 256;
+  std::vector<v8::internal::Token::Value> token_;
+  std::vector<int> beg_;
+  std::vector<int> end_;
+  size_t current_;
+  size_t fetched_;
+  FILE* file_;
+  PushScanner* scanner_;
+  bool read_all_at_once_;
+  const v8::internal::byte* source_;
+  int length_;
+};
+
+} }  // namespace v8::internal
+
+#endif
=======================================
--- /branches/experimental/parser/src/lexer/lexer-shell.cc Fri Oct 18 09:01:34 2013 UTC +++ /branches/experimental/parser/src/lexer/lexer-shell.cc Fri Oct 18 14:33:27 2013 UTC
@@ -42,6 +42,8 @@
 #include "scopeinfo.h"
 #include "string-stream.h"
 #include "scanner.h"
+
+#include "experimental-scanner.h"
 #include "lexer.h"

 using namespace v8::internal;
@@ -98,73 +100,6 @@
   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_);
-    token_.resize(1500);
-    beg_.resize(1500);
-    end_.resize(1500);
-  } else {
-    token_.resize(BUFFER_SIZE);
-    beg_.resize(BUFFER_SIZE);
-    end_.resize(BUFFER_SIZE);
-  }
-}
-
-
-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 (res != Token::Token::EOS)
-    current_++;
-  return res;
-}
-
-
-void ExperimentalScanner::Record(Token::Value token, int beg, int end) {
-  if (token == Token::EOS) end--;
-  if (fetched_ >= token_.size()) {
-    token_.resize(token_.size() * 2);
-    beg_.resize(beg_.size() * 2);
-    end_.resize(end_.size() * 2);
-  }
-  token_[fetched_] = token;
-  beg_[fetched_] = beg;
-  end_[fetched_] = end;
-  fetched_++;
-}
-

 int main(int argc, char* argv[]) {
   v8::V8::InitializeICU();
@@ -204,10 +139,11 @@
       {
         timer.Start();
         do {
-          token = experimental.Next(&beg, &end);
+          token = experimental.Next();
           experimental_tokens.push_back(token);
-          experimental_beg.push_back(beg);
-          experimental_end.push_back(end);
+          ExperimentalScanner::Location location = experimental.location();
+          experimental_beg.push_back(location.beg_pos);
+          experimental_end.push_back(location.end_pos);
         } while (token != Token::EOS);
         experimental_time = timer.Elapsed();
       }
=======================================
--- /branches/experimental/parser/src/lexer/lexer.gyp Wed Oct 16 09:06:56 2013 UTC +++ /branches/experimental/parser/src/lexer/lexer.gyp Fri Oct 18 14:33:27 2013 UTC
@@ -44,6 +44,8 @@
         '../../src/lexer',
       ],
       'sources': [
+        'experimental-scanner.cc',
+        'experimental-scanner.h',
         'lexer-shell.cc',
         'lexer.h',
         '<(SHARED_INTERMEDIATE_DIR)/lexer.cc',
=======================================
--- /branches/experimental/parser/src/lexer/lexer.h Thu Oct 17 13:56:53 2013 UTC +++ /branches/experimental/parser/src/lexer/lexer.h Fri Oct 18 14:33:27 2013 UTC
@@ -30,11 +30,12 @@
 #ifndef V8_LEXER_LEXER_H
 #define V8_LEXER_LEXER_H

-#include <vector>
-
 #include "token.h"
 #include "flags.h"

+namespace v8 {
+namespace internal {
+
 class ExperimentalScanner;

 class PushScanner {
@@ -66,26 +67,6 @@
   ExperimentalScanner* sink_;
 };

-class ExperimentalScanner {
- public:
-  ExperimentalScanner(const char* fname, bool read_all_at_once);
-  ~ExperimentalScanner();
-  v8::internal::Token::Value Next(int* beg_pos, int* end_pos);
-  void Record(v8::internal::Token::Value token, int beg_pos, int end_pos);
-
- private:
-  void FillTokens();
-  static const int BUFFER_SIZE = 256;
-  std::vector<v8::internal::Token::Value> token_;
-  std::vector<int> beg_;
-  std::vector<int> end_;
-  size_t current_;
-  size_t fetched_;
-  FILE* file_;
-  PushScanner* scanner_;
-  bool read_all_at_once_;
-  const v8::internal::byte* source_;
-  int length_;
-};
+} }

 #endif  // V8_LEXER_LEXER_H
=======================================
--- /branches/experimental/parser/src/lexer/lexer.re Fri Oct 18 11:41:17 2013 UTC +++ /branches/experimental/parser/src/lexer/lexer.re Fri Oct 18 14:33:27 2013 UTC
@@ -70,6 +70,7 @@

 #endif //  defined(WIN32)

+#include "experimental-scanner.h"
 #include "lexer.h"

 using namespace v8::internal;

--
--
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