1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 48a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_PARSING_PREPARSE_DATA_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_PARSING_PREPARSE_DATA_H_ 78a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/base/hashmap.h" 103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/collector.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h" 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/parsing/preparse-data-format.h" 138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace v8 { 158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace internal { 168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ScriptData { 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ScriptData(const byte* data, int length); 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ~ScriptData() { 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (owns_data_) DeleteArray(data_); 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const byte* data() const { return data_; } 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length() const { return length_; } 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool rejected() const { return rejected_; } 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Reject() { rejected_ = true; } 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AcquireDataOwnership() { 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!owns_data_); 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch owns_data_ = true; 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReleaseDataOwnership() { 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(owns_data_); 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch owns_data_ = false; 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool owns_data_ : 1; 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool rejected_ : 1; 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const byte* data_; 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length_; 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ScriptData); 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 49c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PreParserLogger final { 508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang public: 51c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PreParserLogger() 52c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch : end_(-1), 53c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch num_parameters_(-1), 54c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch function_length_(-1), 5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch has_duplicate_parameters_(false), 5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch num_inner_functions_(-1) {} 57c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 58c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void LogFunction(int end, int num_parameters, int function_length, 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool has_duplicate_parameters, int properties, 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int num_inner_functions) { 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch end_ = end; 62c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch num_parameters_ = num_parameters; 63c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch function_length_ = function_length; 64c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch has_duplicate_parameters_ = has_duplicate_parameters; 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch properties_ = properties; 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch num_inner_functions_ = num_inner_functions; 678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } 688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int end() const { return end_; } 70c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int num_parameters() const { 71c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return num_parameters_; 72c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 73c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int function_length() const { 74c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return function_length_; 75c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 76c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool has_duplicate_parameters() const { 77c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return has_duplicate_parameters_; 78c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int properties() const { 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return properties_; 818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int num_inner_functions() const { return num_inner_functions_; } 838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int end_; 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For function entries. 87c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int num_parameters_; 88c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int function_length_; 89c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool has_duplicate_parameters_; 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int properties_; 9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int num_inner_functions_; 928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 94c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass ParserLogger final { 958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang public: 96c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ParserLogger(); 978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 98c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void LogFunction(int start, int end, int num_parameters, int function_length, 9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool has_duplicate_parameters, int properties, 100c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LanguageMode language_mode, bool uses_super_property, 10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool calls_eval, int num_inner_functions); 1029fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 103c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ScriptData* GetScriptData(); 1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Collector<unsigned> function_store_; 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned preamble_[PreparseDataConstants::kHeaderSize]; 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int prev_start_; 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8. 1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_PARSING_PREPARSE_DATA_H_ 119