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