OLD | NEW |
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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 // and PreParser methods use PreParserExpression. For any given parser | 118 // and PreParser methods use PreParserExpression. For any given parser |
119 // implementation class Impl, it is expected to contain the following typedefs: | 119 // implementation class Impl, it is expected to contain the following typedefs: |
120 // | 120 // |
121 // template <> | 121 // template <> |
122 // struct ParserTypes<Impl> { | 122 // struct ParserTypes<Impl> { |
123 // // Synonyms for ParserBase<Impl> and Impl, respectively. | 123 // // Synonyms for ParserBase<Impl> and Impl, respectively. |
124 // typedef Base; | 124 // typedef Base; |
125 // typedef Impl; | 125 // typedef Impl; |
126 // // TODO(nikolaos): this one will probably go away, as it is | 126 // // TODO(nikolaos): this one will probably go away, as it is |
127 // // not related to pure parsing. | 127 // // not related to pure parsing. |
128 // typedef GeneratorVariable; | 128 // typedef Variable; |
129 // // Return types for traversing functions. | 129 // // Return types for traversing functions. |
130 // typedef Identifier; | 130 // typedef Identifier; |
131 // typedef Expression; | 131 // typedef Expression; |
132 // typedef FunctionLiteral; | 132 // typedef FunctionLiteral; |
133 // typedef ObjectLiteralProperty; | 133 // typedef ObjectLiteralProperty; |
134 // typedef ClassLiteralProperty; | 134 // typedef ClassLiteralProperty; |
135 // typedef ExpressionList; | 135 // typedef ExpressionList; |
136 // typedef PropertyList; | 136 // typedef PropertyList; |
137 // typedef FormalParameters; | 137 // typedef FormalParameters; |
138 // typedef Statement; | 138 // typedef Statement; |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 void AddProperty() { expected_property_count_++; } | 398 void AddProperty() { expected_property_count_++; } |
399 int expected_property_count() { return expected_property_count_; } | 399 int expected_property_count() { return expected_property_count_; } |
400 | 400 |
401 bool is_generator() const { return IsGeneratorFunction(kind_); } | 401 bool is_generator() const { return IsGeneratorFunction(kind_); } |
402 bool is_async_function() const { return IsAsyncFunction(kind_); } | 402 bool is_async_function() const { return IsAsyncFunction(kind_); } |
403 bool is_resumable() const { return is_generator() || is_async_function(); } | 403 bool is_resumable() const { return is_generator() || is_async_function(); } |
404 | 404 |
405 FunctionKind kind() const { return kind_; } | 405 FunctionKind kind() const { return kind_; } |
406 FunctionState* outer() const { return outer_function_state_; } | 406 FunctionState* outer() const { return outer_function_state_; } |
407 | 407 |
408 void set_generator_object_variable( | 408 void set_generator_object_variable(typename Types::Variable* variable) { |
409 typename Types::GeneratorVariable* variable) { | |
410 DCHECK(variable != NULL); | 409 DCHECK(variable != NULL); |
411 DCHECK(is_resumable()); | 410 DCHECK(is_resumable()); |
412 generator_object_variable_ = variable; | 411 generator_object_variable_ = variable; |
413 } | 412 } |
414 typename Types::GeneratorVariable* generator_object_variable() const { | 413 typename Types::Variable* generator_object_variable() const { |
415 return generator_object_variable_; | 414 return generator_object_variable_; |
416 } | 415 } |
417 | 416 |
| 417 void set_promise_variable(typename Types::Variable* variable) { |
| 418 DCHECK(variable != NULL); |
| 419 DCHECK(is_async_function()); |
| 420 promise_variable_ = variable; |
| 421 } |
| 422 typename Types::Variable* promise_variable() const { |
| 423 return promise_variable_; |
| 424 } |
| 425 |
418 const ZoneList<DestructuringAssignment>& | 426 const ZoneList<DestructuringAssignment>& |
419 destructuring_assignments_to_rewrite() const { | 427 destructuring_assignments_to_rewrite() const { |
420 return destructuring_assignments_to_rewrite_; | 428 return destructuring_assignments_to_rewrite_; |
421 } | 429 } |
422 | 430 |
423 TailCallExpressionList& tail_call_expressions() { | 431 TailCallExpressionList& tail_call_expressions() { |
424 return tail_call_expressions_; | 432 return tail_call_expressions_; |
425 } | 433 } |
426 void AddImplicitTailCallExpression(ExpressionT expression) { | 434 void AddImplicitTailCallExpression(ExpressionT expression) { |
427 if (return_expr_context() == | 435 if (return_expr_context() == |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 int next_materialized_literal_index_; | 491 int next_materialized_literal_index_; |
484 | 492 |
485 // Properties count estimation. | 493 // Properties count estimation. |
486 int expected_property_count_; | 494 int expected_property_count_; |
487 | 495 |
488 FunctionKind kind_; | 496 FunctionKind kind_; |
489 // For generators, this variable may hold the generator object. It variable | 497 // For generators, this variable may hold the generator object. It variable |
490 // is used by yield expressions and return statements. It is not necessary | 498 // is used by yield expressions and return statements. It is not necessary |
491 // for generator functions to have this variable set. | 499 // for generator functions to have this variable set. |
492 Variable* generator_object_variable_; | 500 Variable* generator_object_variable_; |
| 501 // For async functions, this variable holds a temporary for the Promise |
| 502 // being created as output of the async function. |
| 503 Variable* promise_variable_; |
493 | 504 |
494 FunctionState** function_state_stack_; | 505 FunctionState** function_state_stack_; |
495 FunctionState* outer_function_state_; | 506 FunctionState* outer_function_state_; |
496 | 507 |
497 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; | 508 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; |
498 TailCallExpressionList tail_call_expressions_; | 509 TailCallExpressionList tail_call_expressions_; |
499 ReturnExprContext return_expr_context_; | 510 ReturnExprContext return_expr_context_; |
500 ZoneList<ExpressionT> non_patterns_to_rewrite_; | 511 ZoneList<ExpressionT> non_patterns_to_rewrite_; |
501 | 512 |
502 ZoneList<typename ExpressionClassifier::Error> reported_errors_; | 513 ZoneList<typename ExpressionClassifier::Error> reported_errors_; |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1422 }; | 1433 }; |
1423 | 1434 |
1424 template <typename Impl> | 1435 template <typename Impl> |
1425 ParserBase<Impl>::FunctionState::FunctionState( | 1436 ParserBase<Impl>::FunctionState::FunctionState( |
1426 FunctionState** function_state_stack, ScopeState** scope_stack, | 1437 FunctionState** function_state_stack, ScopeState** scope_stack, |
1427 Scope* scope, FunctionKind kind) | 1438 Scope* scope, FunctionKind kind) |
1428 : ScopeState(scope_stack, scope), | 1439 : ScopeState(scope_stack, scope), |
1429 next_materialized_literal_index_(0), | 1440 next_materialized_literal_index_(0), |
1430 expected_property_count_(0), | 1441 expected_property_count_(0), |
1431 kind_(kind), | 1442 kind_(kind), |
1432 generator_object_variable_(NULL), | 1443 generator_object_variable_(nullptr), |
| 1444 promise_variable_(nullptr), |
1433 function_state_stack_(function_state_stack), | 1445 function_state_stack_(function_state_stack), |
1434 outer_function_state_(*function_state_stack), | 1446 outer_function_state_(*function_state_stack), |
1435 destructuring_assignments_to_rewrite_(16, scope->zone()), | 1447 destructuring_assignments_to_rewrite_(16, scope->zone()), |
1436 tail_call_expressions_(scope->zone()), | 1448 tail_call_expressions_(scope->zone()), |
1437 return_expr_context_(ReturnExprContext::kInsideValidBlock), | 1449 return_expr_context_(ReturnExprContext::kInsideValidBlock), |
1438 non_patterns_to_rewrite_(0, scope->zone()), | 1450 non_patterns_to_rewrite_(0, scope->zone()), |
1439 reported_errors_(16, scope->zone()), | 1451 reported_errors_(16, scope->zone()), |
1440 next_function_is_parenthesized_(false), | 1452 next_function_is_parenthesized_(false), |
1441 this_function_is_parenthesized_(false) { | 1453 this_function_is_parenthesized_(false) { |
1442 *function_state_stack = this; | 1454 *function_state_stack = this; |
(...skipping 3584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5027 has_seen_constructor_ = true; | 5039 has_seen_constructor_ = true; |
5028 return; | 5040 return; |
5029 } | 5041 } |
5030 } | 5042 } |
5031 | 5043 |
5032 | 5044 |
5033 } // namespace internal | 5045 } // namespace internal |
5034 } // namespace v8 | 5046 } // namespace v8 |
5035 | 5047 |
5036 #endif // V8_PARSING_PARSER_BASE_H | 5048 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |