Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: src/parsing/parser-base.h

Issue 2399833002: Teach Scopes whether they will end up being lazily compiled or not (Closed)
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_PARSING_PARSER_BASE_H 5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H 6 #define V8_PARSING_PARSER_BASE_H
7 7
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 ast_value_factory_(ast_value_factory), 183 ast_value_factory_(ast_value_factory),
184 ast_node_factory_(ast_value_factory), 184 ast_node_factory_(ast_value_factory),
185 log_(log), 185 log_(log),
186 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. 186 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly.
187 parsing_module_(false), 187 parsing_module_(false),
188 stack_limit_(stack_limit), 188 stack_limit_(stack_limit),
189 zone_(zone), 189 zone_(zone),
190 classifier_(nullptr), 190 classifier_(nullptr),
191 scanner_(scanner), 191 scanner_(scanner),
192 stack_overflow_(false), 192 stack_overflow_(false),
193 default_eager_compile_hint_(FunctionLiteral::kShouldLazyCompile),
193 allow_lazy_(false), 194 allow_lazy_(false),
194 allow_natives_(false), 195 allow_natives_(false),
195 allow_tailcalls_(false), 196 allow_tailcalls_(false),
196 allow_harmony_restrictive_declarations_(false), 197 allow_harmony_restrictive_declarations_(false),
197 allow_harmony_do_expressions_(false), 198 allow_harmony_do_expressions_(false),
198 allow_harmony_for_in_(false), 199 allow_harmony_for_in_(false),
199 allow_harmony_function_sent_(false), 200 allow_harmony_function_sent_(false),
200 allow_harmony_async_await_(false), 201 allow_harmony_async_await_(false),
201 allow_harmony_restrictive_generators_(false), 202 allow_harmony_restrictive_generators_(false),
202 allow_harmony_trailing_commas_(false), 203 allow_harmony_trailing_commas_(false),
(...skipping 14 matching lines...) Expand all
217 ALLOW_ACCESSORS(harmony_restrictive_generators); 218 ALLOW_ACCESSORS(harmony_restrictive_generators);
218 ALLOW_ACCESSORS(harmony_trailing_commas); 219 ALLOW_ACCESSORS(harmony_trailing_commas);
219 ALLOW_ACCESSORS(harmony_class_fields); 220 ALLOW_ACCESSORS(harmony_class_fields);
220 221
221 #undef ALLOW_ACCESSORS 222 #undef ALLOW_ACCESSORS
222 223
223 uintptr_t stack_limit() const { return stack_limit_; } 224 uintptr_t stack_limit() const { return stack_limit_; }
224 225
225 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } 226 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; }
226 227
228 void set_default_eager_compile_hint(
229 FunctionLiteral::EagerCompileHint eager_compile_hint) {
230 default_eager_compile_hint_ = eager_compile_hint;
231 }
232
233 FunctionLiteral::EagerCompileHint default_eager_compile_hint() const {
234 return default_eager_compile_hint_;
235 }
236
227 Zone* zone() const { return zone_; } 237 Zone* zone() const { return zone_; }
228 238
229 protected: 239 protected:
230 friend class v8::internal::ExpressionClassifier<ParserTypes<Impl>>; 240 friend class v8::internal::ExpressionClassifier<ParserTypes<Impl>>;
231 241
232 // clang-format off
233 enum AllowRestrictedIdentifiers { 242 enum AllowRestrictedIdentifiers {
234 kAllowRestrictedIdentifiers, 243 kAllowRestrictedIdentifiers,
235 kDontAllowRestrictedIdentifiers 244 kDontAllowRestrictedIdentifiers
236 }; 245 };
237 246
238 enum Mode { 247 enum Mode { PARSE_LAZILY, PARSE_EAGERLY };
239 PARSE_LAZILY,
240 PARSE_EAGERLY
241 };
242 248
243 enum LazyParsingResult { 249 enum LazyParsingResult { kLazyParsingComplete, kLazyParsingAborted };
244 kLazyParsingComplete,
245 kLazyParsingAborted
246 };
247 250
248 enum VariableDeclarationContext { 251 enum VariableDeclarationContext {
249 kStatementListItem, 252 kStatementListItem,
250 kStatement, 253 kStatement,
251 kForStatement 254 kForStatement
252 }; 255 };
253 256
254 enum class FunctionBodyType { 257 enum class FunctionBodyType { kNormal, kSingleExpression };
255 kNormal,
256 kSingleExpression
257 };
258 // clang-format on
259 258
260 class Checkpoint; 259 class Checkpoint;
261 class ClassLiteralChecker; 260 class ClassLiteralChecker;
262 class ObjectLiteralChecker; 261 class ObjectLiteralChecker;
263 262
264 // --------------------------------------------------------------------------- 263 // ---------------------------------------------------------------------------
265 // ScopeState and its subclasses implement the parser's scope stack. 264 // ScopeState and its subclasses implement the parser's scope stack.
266 // ScopeState keeps track of the current scope, and the outer ScopeState. The 265 // ScopeState keeps track of the current scope, and the outer ScopeState. The
267 // parser's scope_state_ points to the top ScopeState. ScopeState's 266 // parser's scope_state_ points to the top ScopeState. ScopeState's
268 // constructor push on the scope stack and the destructors pop. BlockState and 267 // constructor push on the scope stack and the destructors pop. BlockState and
(...skipping 1168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 1436
1438 // Parser base's private field members. 1437 // Parser base's private field members.
1439 1438
1440 private: 1439 private:
1441 Zone* zone_; 1440 Zone* zone_;
1442 ExpressionClassifier* classifier_; 1441 ExpressionClassifier* classifier_;
1443 1442
1444 Scanner* scanner_; 1443 Scanner* scanner_;
1445 bool stack_overflow_; 1444 bool stack_overflow_;
1446 1445
1446 FunctionLiteral::EagerCompileHint default_eager_compile_hint_;
1447
1447 bool allow_lazy_; 1448 bool allow_lazy_;
1448 bool allow_natives_; 1449 bool allow_natives_;
1449 bool allow_tailcalls_; 1450 bool allow_tailcalls_;
1450 bool allow_harmony_restrictive_declarations_; 1451 bool allow_harmony_restrictive_declarations_;
1451 bool allow_harmony_do_expressions_; 1452 bool allow_harmony_do_expressions_;
1452 bool allow_harmony_for_in_; 1453 bool allow_harmony_for_in_;
1453 bool allow_harmony_function_sent_; 1454 bool allow_harmony_function_sent_;
1454 bool allow_harmony_async_await_; 1455 bool allow_harmony_async_await_;
1455 bool allow_harmony_restrictive_generators_; 1456 bool allow_harmony_restrictive_generators_;
1456 bool allow_harmony_trailing_commas_; 1457 bool allow_harmony_trailing_commas_;
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
2281 value = factory()->NewUndefinedLiteral(kNoSourcePosition); 2282 value = factory()->NewUndefinedLiteral(kNoSourcePosition);
2282 } 2283 }
2283 initializer_scope->set_end_position(scanner()->location().end_pos); 2284 initializer_scope->set_end_position(scanner()->location().end_pos);
2284 typename Types::StatementList body = impl()->NewStatementList(1); 2285 typename Types::StatementList body = impl()->NewStatementList(1);
2285 body->Add(factory()->NewReturnStatement(value, kNoSourcePosition), zone()); 2286 body->Add(factory()->NewReturnStatement(value, kNoSourcePosition), zone());
2286 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 2287 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
2287 impl()->EmptyIdentifierString(), initializer_scope, body, 2288 impl()->EmptyIdentifierString(), initializer_scope, body,
2288 initializer_state.materialized_literal_count(), 2289 initializer_state.materialized_literal_count(),
2289 initializer_state.expected_property_count(), 0, 2290 initializer_state.expected_property_count(), 0,
2290 FunctionLiteral::kNoDuplicateParameters, 2291 FunctionLiteral::kNoDuplicateParameters,
2291 FunctionLiteral::kAnonymousExpression, 2292 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint_,
2292 FunctionLiteral::kShouldLazyCompile, initializer_scope->start_position()); 2293 initializer_scope->start_position());
2293 function_literal->set_is_class_field_initializer(true); 2294 function_literal->set_is_class_field_initializer(true);
2294 return function_literal; 2295 return function_literal;
2295 } 2296 }
2296 2297
2297 template <typename Impl> 2298 template <typename Impl>
2298 typename ParserBase<Impl>::ObjectLiteralPropertyT 2299 typename ParserBase<Impl>::ObjectLiteralPropertyT
2299 ParserBase<Impl>::ParseObjectPropertyDefinition(ObjectLiteralChecker* checker, 2300 ParserBase<Impl>::ParseObjectPropertyDefinition(ObjectLiteralChecker* checker,
2300 bool* is_computed_name, 2301 bool* is_computed_name,
2301 bool* ok) { 2302 bool* ok) {
2302 bool is_get = false; 2303 bool is_get = false;
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
3076 // For other kinds of calls we record position of the parenthesis as 3077 // For other kinds of calls we record position of the parenthesis as
3077 // position of the call. Note that this is extremely important for 3078 // position of the call. Note that this is extremely important for
3078 // expressions of the form function(){...}() for which call position 3079 // expressions of the form function(){...}() for which call position
3079 // should not point to the closing brace otherwise it will intersect 3080 // should not point to the closing brace otherwise it will intersect
3080 // with positions recorded for function literal and confuse debugger. 3081 // with positions recorded for function literal and confuse debugger.
3081 pos = peek_position(); 3082 pos = peek_position();
3082 // Also the trailing parenthesis are a hint that the function will 3083 // Also the trailing parenthesis are a hint that the function will
3083 // be called immediately. If we happen to have parsed a preceding 3084 // be called immediately. If we happen to have parsed a preceding
3084 // function literal eagerly, we can also compile it eagerly. 3085 // function literal eagerly, we can also compile it eagerly.
3085 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { 3086 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
3086 result->AsFunctionLiteral()->set_should_eager_compile(); 3087 result->AsFunctionLiteral()->SetShouldEagerCompile();
3087 } 3088 }
3088 } 3089 }
3089 Scanner::Location spread_pos; 3090 Scanner::Location spread_pos;
3090 ExpressionListT args; 3091 ExpressionListT args;
3091 if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) { 3092 if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) {
3092 ExpressionClassifier async_classifier(this); 3093 ExpressionClassifier async_classifier(this);
3093 args = ParseArguments(&spread_pos, true, CHECK_OK); 3094 args = ParseArguments(&spread_pos, true, CHECK_OK);
3094 if (peek() == Token::ARROW) { 3095 if (peek() == Token::ARROW) {
3095 if (fni_) { 3096 if (fni_) {
3096 fni_->RemoveAsyncKeywordFromEnd(); 3097 fni_->RemoveAsyncKeywordFromEnd();
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
3408 BindingPatternUnexpectedToken(); 3409 BindingPatternUnexpectedToken();
3409 ArrowFormalParametersUnexpectedToken(); 3410 ArrowFormalParametersUnexpectedToken();
3410 int pos; 3411 int pos;
3411 if (scanner()->current_token() == Token::IDENTIFIER) { 3412 if (scanner()->current_token() == Token::IDENTIFIER) {
3412 pos = position(); 3413 pos = position();
3413 } else { 3414 } else {
3414 pos = peek_position(); 3415 pos = peek_position();
3415 if (expression->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { 3416 if (expression->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
3416 // If the tag function looks like an IIFE, set_parenthesized() to 3417 // If the tag function looks like an IIFE, set_parenthesized() to
3417 // force eager compilation. 3418 // force eager compilation.
3418 expression->AsFunctionLiteral()->set_should_eager_compile(); 3419 expression->AsFunctionLiteral()->SetShouldEagerCompile();
3419 } 3420 }
3420 } 3421 }
3421 expression = ParseTemplateLiteral(expression, pos, CHECK_OK); 3422 expression = ParseTemplateLiteral(expression, pos, CHECK_OK);
3422 break; 3423 break;
3423 } 3424 }
3424 case Token::ILLEGAL: { 3425 case Token::ILLEGAL: {
3425 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); 3426 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL);
3426 *ok = false; 3427 *ok = false;
3427 return impl()->EmptyExpression(); 3428 return impl()->EmptyExpression();
3428 } 3429 }
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
3913 return impl()->EmptyExpression(); 3914 return impl()->EmptyExpression();
3914 } 3915 }
3915 3916
3916 StatementListT body = impl()->NullStatementList(); 3917 StatementListT body = impl()->NullStatementList();
3917 int num_parameters = formal_parameters.scope->num_parameters(); 3918 int num_parameters = formal_parameters.scope->num_parameters();
3918 int materialized_literal_count = -1; 3919 int materialized_literal_count = -1;
3919 int expected_property_count = -1; 3920 int expected_property_count = -1;
3920 3921
3921 FunctionKind kind = formal_parameters.scope->function_kind(); 3922 FunctionKind kind = formal_parameters.scope->function_kind();
3922 FunctionLiteral::EagerCompileHint eager_compile_hint = 3923 FunctionLiteral::EagerCompileHint eager_compile_hint =
3923 FunctionLiteral::kShouldLazyCompile; 3924 default_eager_compile_hint_;
3924 bool should_be_used_once_hint = false; 3925 bool should_be_used_once_hint = false;
3925 { 3926 {
3926 FunctionState function_state(&function_state_, &scope_state_, 3927 FunctionState function_state(&function_state_, &scope_state_,
3927 formal_parameters.scope); 3928 formal_parameters.scope);
3928 3929
3929 function_state.SkipMaterializedLiterals( 3930 function_state.SkipMaterializedLiterals(
3930 formal_parameters.materialized_literals_count); 3931 formal_parameters.materialized_literals_count);
3931 3932
3932 impl()->ReindexLiterals(formal_parameters); 3933 impl()->ReindexLiterals(formal_parameters);
3933 3934
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after
4685 template <typename Impl> 4686 template <typename Impl>
4686 typename ParserBase<Impl>::StatementT 4687 typename ParserBase<Impl>::StatementT
4687 ParserBase<Impl>::ParseExpressionOrLabelledStatement( 4688 ParserBase<Impl>::ParseExpressionOrLabelledStatement(
4688 ZoneList<const AstRawString*>* labels, 4689 ZoneList<const AstRawString*>* labels,
4689 AllowLabelledFunctionStatement allow_function, bool* ok) { 4690 AllowLabelledFunctionStatement allow_function, bool* ok) {
4690 // ExpressionStatement | LabelledStatement :: 4691 // ExpressionStatement | LabelledStatement ::
4691 // Expression ';' 4692 // Expression ';'
4692 // Identifier ':' Statement 4693 // Identifier ':' Statement
4693 // 4694 //
4694 // ExpressionStatement[Yield] : 4695 // ExpressionStatement[Yield] :
4695 // [lookahead {{, function, class, let [}] Expression[In, ?Yield] ; 4696 // [lookahead notin {{, function, class, let [}] Expression[In, ?Yield] ;
4696 4697
4697 int pos = peek_position(); 4698 int pos = peek_position();
4698 4699
4699 switch (peek()) { 4700 switch (peek()) {
4700 case Token::FUNCTION: 4701 case Token::FUNCTION:
4701 case Token::LBRACE: 4702 case Token::LBRACE:
4702 UNREACHABLE(); // Always handled by the callers. 4703 UNREACHABLE(); // Always handled by the callers.
4703 case Token::CLASS: 4704 case Token::CLASS:
4704 ReportUnexpectedToken(Next()); 4705 ReportUnexpectedToken(Next());
4705 *ok = false; 4706 *ok = false;
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after
5454 has_seen_constructor_ = true; 5455 has_seen_constructor_ = true;
5455 return; 5456 return;
5456 } 5457 }
5457 } 5458 }
5458 5459
5459 5460
5460 } // namespace internal 5461 } // namespace internal
5461 } // namespace v8 5462 } // namespace v8
5462 5463
5463 #endif // V8_PARSING_PARSER_BASE_H 5464 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698