1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
28a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Redistribution and use in source and binary forms, with or without
38a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// modification, are permitted provided that the following conditions are
48a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// met:
58a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
68a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions of source code must retain the above copyright
78a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       notice, this list of conditions and the following disclaimer.
88a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions in binary form must reproduce the above
98a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       copyright notice, this list of conditions and the following
108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       disclaimer in the documentation and/or other materials provided
118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       with the distribution.
128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Neither the name of Google Inc. nor the names of its
138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       contributors may be used to endorse or promote products derived
148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       from this software without specific prior written permission.
158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
28257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifndef V8_PREPARSE_DATA_H_
29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define V8_PREPARSE_DATA_H_
308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "hashmap.h"
33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "utils-inl.h"
348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace v8 {
368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace internal {
378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------
398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ParserRecorder - Logging of preparser data.
408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Abstract interface for preparse data recorder.
428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ParserRecorder {
438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang public:
448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  ParserRecorder() { }
458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual ~ParserRecorder() { }
468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Logs the scope and some details of a function literal in the source.
488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void LogFunction(int start,
498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                           int end,
508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                           int literals,
513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           int properties,
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                           LanguageMode language_mode) = 0;
538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Logs a symbol creation of a literal or identifier.
559fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  virtual void LogAsciiSymbol(int start, Vector<const char> literal) { }
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { }
578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Logs an error message and marks the log as containing an error.
598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Further logging will be ignored, and ExtractData will return a vector
608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // representing the error only.
618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void LogMessage(int start,
628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                          int end,
638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                          const char* message,
648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                          const char* argument_opt) = 0;
658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int function_position() = 0;
678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int symbol_position() = 0;
698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int symbol_ids() = 0;
718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual Vector<unsigned> ExtractData() = 0;
738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void PauseRecording() = 0;
758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void ResumeRecording() = 0;
778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------
818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// FunctionLoggingParserRecorder - Record only function entries
828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionLoggingParserRecorder : public ParserRecorder {
848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang public:
858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FunctionLoggingParserRecorder();
868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual ~FunctionLoggingParserRecorder() {}
878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void LogFunction(int start,
893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           int end,
903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           int literals,
913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           int properties,
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                           LanguageMode language_mode) {
938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    function_store_.Add(start);
948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    function_store_.Add(end);
958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    function_store_.Add(literals);
968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    function_store_.Add(properties);
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    function_store_.Add(language_mode);
988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Logs an error message and marks the log as containing an error.
1018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Further logging will be ignored, and ExtractData will return a vector
1028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // representing the error only.
1038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void LogMessage(int start,
1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                          int end,
1058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                          const char* message,
1068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                          const char* argument_opt);
1078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int function_position() { return function_store_.size(); }
1098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual Vector<unsigned> ExtractData() = 0;
1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void PauseRecording() {
1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    pause_count_++;
1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    is_recording_ = false;
1168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual void ResumeRecording() {
1198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    ASSERT(pause_count_ > 0);
1208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    if (--pause_count_ == 0) is_recording_ = !has_error();
1218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
1228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang protected:
1248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  bool has_error() {
1258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    return static_cast<bool>(preamble_[PreparseDataConstants::kHasErrorOffset]);
1268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
1278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  bool is_recording() {
1298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    return is_recording_;
1308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
1318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void WriteString(Vector<const char> str);
1338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Collector<unsigned> function_store_;
1358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  unsigned preamble_[PreparseDataConstants::kHeaderSize];
1368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  bool is_recording_;
1378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int pause_count_;
1388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef DEBUG
1408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int prev_start_;
1418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
1428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
1438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------
1468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// PartialParserRecorder - Record only function entries
1478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass PartialParserRecorder : public FunctionLoggingParserRecorder {
1498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang public:
1508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  PartialParserRecorder() : FunctionLoggingParserRecorder() { }
1519fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  virtual void LogAsciiSymbol(int start, Vector<const char> literal) { }
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { }
1538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual ~PartialParserRecorder() { }
1548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual Vector<unsigned> ExtractData();
1558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int symbol_position() { return 0; }
1568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int symbol_ids() { return 0; }
1578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
1588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------
1618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// CompleteParserRecorder -  Record both function entries and symbols.
1628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CompleteParserRecorder: public FunctionLoggingParserRecorder {
1648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang public:
1658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CompleteParserRecorder();
1668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual ~CompleteParserRecorder() { }
1678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1689fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  virtual void LogAsciiSymbol(int start, Vector<const char> literal) {
1699fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    if (!is_recording_) return;
1709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    int hash = vector_hash(literal);
1719fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    LogSymbol(start, hash, true, Vector<const byte>::cast(literal));
1729fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
1739fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) {
1759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    if (!is_recording_) return;
1769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    int hash = vector_hash(literal);
1779fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    LogSymbol(start, hash, false, Vector<const byte>::cast(literal));
1789fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
1798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual Vector<unsigned> ExtractData();
1818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int symbol_position() { return symbol_store_.size(); }
1838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  virtual int symbol_ids() { return symbol_id_; }
1848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang private:
1869fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  struct Key {
1879fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    bool is_ascii;
1889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    Vector<const byte> literal_bytes;
1899fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  };
1909fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
1919fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  virtual void LogSymbol(int start,
1929fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block                         int hash,
1939fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block                         bool is_ascii,
1949fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block                         Vector<const byte> literal);
1959fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
1969fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  template <typename Char>
1979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  static int vector_hash(Vector<const Char> string) {
1988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    int hash = 0;
1998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    for (int i = 0; i < string.length(); i++) {
2009fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block      int c = static_cast<int>(string[i]);
2018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      hash += c;
2028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      hash += (hash << 10);
2038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      hash ^= (hash >> 6);
2048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    }
2058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    return hash;
2068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
2078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  static bool vector_compare(void* a, void* b) {
2099fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    Key* string1 = reinterpret_cast<Key*>(a);
2109fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    Key* string2 = reinterpret_cast<Key*>(b);
2119fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    if (string1->is_ascii != string2->is_ascii) return false;
2129fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    int length = string1->literal_bytes.length();
2139fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    if (string2->literal_bytes.length() != length) return false;
2149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return memcmp(string1->literal_bytes.start(),
2159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block                  string2->literal_bytes.start(), length) == 0;
2168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Write a non-negative number to the symbol store.
2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void WriteNumber(int number);
2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  Collector<byte> literal_chars_;
2228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Collector<byte> symbol_store_;
2239fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  Collector<Key> symbol_keys_;
2248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  HashMap symbol_table_;
2258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int symbol_id_;
2268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} }  // namespace v8::internal.
2308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif  // V8_PREPARSE_DATA_H_
232