OLD | NEW |
| (Empty) |
1 // Copyright 2011 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef V8_PREPARSE_DATA_H_ | |
6 #define V8_PREPARSE_DATA_H_ | |
7 | |
8 #include "src/allocation.h" | |
9 #include "src/hashmap.h" | |
10 #include "src/messages.h" | |
11 #include "src/preparse-data-format.h" | |
12 | |
13 namespace v8 { | |
14 namespace internal { | |
15 | |
16 class ScriptData { | |
17 public: | |
18 ScriptData(const byte* data, int length); | |
19 ~ScriptData() { | |
20 if (owns_data_) DeleteArray(data_); | |
21 } | |
22 | |
23 const byte* data() const { return data_; } | |
24 int length() const { return length_; } | |
25 bool rejected() const { return rejected_; } | |
26 | |
27 void Reject() { rejected_ = true; } | |
28 | |
29 void AcquireDataOwnership() { | |
30 DCHECK(!owns_data_); | |
31 owns_data_ = true; | |
32 } | |
33 | |
34 void ReleaseDataOwnership() { | |
35 DCHECK(owns_data_); | |
36 owns_data_ = false; | |
37 } | |
38 | |
39 private: | |
40 bool owns_data_ : 1; | |
41 bool rejected_ : 1; | |
42 const byte* data_; | |
43 int length_; | |
44 | |
45 DISALLOW_COPY_AND_ASSIGN(ScriptData); | |
46 }; | |
47 | |
48 // Abstract interface for preparse data recorder. | |
49 class ParserRecorder { | |
50 public: | |
51 ParserRecorder() { } | |
52 virtual ~ParserRecorder() { } | |
53 | |
54 // Logs the scope and some details of a function literal in the source. | |
55 virtual void LogFunction(int start, int end, int literals, int properties, | |
56 LanguageMode language_mode, bool uses_super_property, | |
57 bool calls_eval) = 0; | |
58 | |
59 // Logs an error message and marks the log as containing an error. | |
60 // Further logging will be ignored, and ExtractData will return a vector | |
61 // representing the error only. | |
62 virtual void LogMessage(int start, int end, MessageTemplate::Template message, | |
63 const char* argument_opt, | |
64 ParseErrorType error_type) = 0; | |
65 | |
66 private: | |
67 DISALLOW_COPY_AND_ASSIGN(ParserRecorder); | |
68 }; | |
69 | |
70 | |
71 class SingletonLogger : public ParserRecorder { | |
72 public: | |
73 SingletonLogger() | |
74 : has_error_(false), start_(-1), end_(-1), error_type_(kSyntaxError) {} | |
75 virtual ~SingletonLogger() {} | |
76 | |
77 void Reset() { has_error_ = false; } | |
78 | |
79 virtual void LogFunction(int start, int end, int literals, int properties, | |
80 LanguageMode language_mode, bool uses_super_property, | |
81 bool calls_eval) { | |
82 DCHECK(!has_error_); | |
83 start_ = start; | |
84 end_ = end; | |
85 literals_ = literals; | |
86 properties_ = properties; | |
87 language_mode_ = language_mode; | |
88 uses_super_property_ = uses_super_property; | |
89 calls_eval_ = calls_eval; | |
90 } | |
91 | |
92 // Logs an error message and marks the log as containing an error. | |
93 // Further logging will be ignored, and ExtractData will return a vector | |
94 // representing the error only. | |
95 virtual void LogMessage(int start, int end, MessageTemplate::Template message, | |
96 const char* argument_opt, ParseErrorType error_type) { | |
97 if (has_error_) return; | |
98 has_error_ = true; | |
99 start_ = start; | |
100 end_ = end; | |
101 message_ = message; | |
102 argument_opt_ = argument_opt; | |
103 error_type_ = error_type; | |
104 } | |
105 | |
106 bool has_error() const { return has_error_; } | |
107 | |
108 int start() const { return start_; } | |
109 int end() const { return end_; } | |
110 int literals() const { | |
111 DCHECK(!has_error_); | |
112 return literals_; | |
113 } | |
114 int properties() const { | |
115 DCHECK(!has_error_); | |
116 return properties_; | |
117 } | |
118 LanguageMode language_mode() const { | |
119 DCHECK(!has_error_); | |
120 return language_mode_; | |
121 } | |
122 bool uses_super_property() const { | |
123 DCHECK(!has_error_); | |
124 return uses_super_property_; | |
125 } | |
126 bool calls_eval() const { | |
127 DCHECK(!has_error_); | |
128 return calls_eval_; | |
129 } | |
130 ParseErrorType error_type() const { | |
131 DCHECK(has_error_); | |
132 return error_type_; | |
133 } | |
134 MessageTemplate::Template message() { | |
135 DCHECK(has_error_); | |
136 return message_; | |
137 } | |
138 const char* argument_opt() const { | |
139 DCHECK(has_error_); | |
140 return argument_opt_; | |
141 } | |
142 | |
143 private: | |
144 bool has_error_; | |
145 int start_; | |
146 int end_; | |
147 // For function entries. | |
148 int literals_; | |
149 int properties_; | |
150 LanguageMode language_mode_; | |
151 bool uses_super_property_; | |
152 bool calls_eval_; | |
153 // For error messages. | |
154 MessageTemplate::Template message_; | |
155 const char* argument_opt_; | |
156 ParseErrorType error_type_; | |
157 }; | |
158 | |
159 | |
160 class CompleteParserRecorder : public ParserRecorder { | |
161 public: | |
162 struct Key { | |
163 bool is_one_byte; | |
164 Vector<const byte> literal_bytes; | |
165 }; | |
166 | |
167 CompleteParserRecorder(); | |
168 virtual ~CompleteParserRecorder() {} | |
169 | |
170 virtual void LogFunction(int start, int end, int literals, int properties, | |
171 LanguageMode language_mode, bool uses_super_property, | |
172 bool calls_eval) { | |
173 function_store_.Add(start); | |
174 function_store_.Add(end); | |
175 function_store_.Add(literals); | |
176 function_store_.Add(properties); | |
177 function_store_.Add(language_mode); | |
178 function_store_.Add(uses_super_property); | |
179 function_store_.Add(calls_eval); | |
180 } | |
181 | |
182 // Logs an error message and marks the log as containing an error. | |
183 // Further logging will be ignored, and ExtractData will return a vector | |
184 // representing the error only. | |
185 virtual void LogMessage(int start, int end, MessageTemplate::Template message, | |
186 const char* argument_opt, ParseErrorType error_type); | |
187 ScriptData* GetScriptData(); | |
188 | |
189 bool HasError() { | |
190 return static_cast<bool>(preamble_[PreparseDataConstants::kHasErrorOffset]); | |
191 } | |
192 Vector<unsigned> ErrorMessageData() { | |
193 DCHECK(HasError()); | |
194 return function_store_.ToVector(); | |
195 } | |
196 | |
197 private: | |
198 void WriteString(Vector<const char> str); | |
199 | |
200 Collector<unsigned> function_store_; | |
201 unsigned preamble_[PreparseDataConstants::kHeaderSize]; | |
202 | |
203 #ifdef DEBUG | |
204 int prev_start_; | |
205 #endif | |
206 }; | |
207 | |
208 | |
209 } // namespace internal | |
210 } // namespace v8. | |
211 | |
212 #endif // V8_PREPARSE_DATA_H_ | |
OLD | NEW |