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