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 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
449 return return_expr_context_; | 449 return return_expr_context_; |
450 } | 450 } |
451 void set_return_expr_context(ReturnExprContext context) { | 451 void set_return_expr_context(ReturnExprContext context) { |
452 return_expr_context_ = context; | 452 return_expr_context_ = context; |
453 } | 453 } |
454 | 454 |
455 ZoneList<ExpressionT>* non_patterns_to_rewrite() { | 455 ZoneList<ExpressionT>* non_patterns_to_rewrite() { |
456 return &non_patterns_to_rewrite_; | 456 return &non_patterns_to_rewrite_; |
457 } | 457 } |
458 | 458 |
459 bool next_function_is_parenthesized() const { | 459 bool next_function_is_likely_called() const { |
460 return next_function_is_parenthesized_; | 460 return next_function_is_likely_called_; |
461 } | 461 } |
462 | 462 |
463 void set_next_function_is_parenthesized(bool parenthesized) { | 463 void set_next_function_is_likely_called() { |
464 next_function_is_parenthesized_ = parenthesized; | 464 next_function_is_likely_called_ = true; |
465 } | |
466 | |
467 bool this_function_is_parenthesized() const { | |
468 return this_function_is_parenthesized_; | |
469 } | 465 } |
470 | 466 |
471 private: | 467 private: |
472 void AddDestructuringAssignment(DestructuringAssignment pair) { | 468 void AddDestructuringAssignment(DestructuringAssignment pair) { |
473 destructuring_assignments_to_rewrite_.Add(pair, this->zone()); | 469 destructuring_assignments_to_rewrite_.Add(pair, this->zone()); |
474 } | 470 } |
475 | 471 |
476 void AddNonPatternForRewriting(ExpressionT expr, bool* ok) { | 472 void AddNonPatternForRewriting(ExpressionT expr, bool* ok) { |
477 non_patterns_to_rewrite_.Add(expr, this->zone()); | 473 non_patterns_to_rewrite_.Add(expr, this->zone()); |
478 if (non_patterns_to_rewrite_.length() >= | 474 if (non_patterns_to_rewrite_.length() >= |
(...skipping 20 matching lines...) Expand all Loading... | |
499 FunctionState** function_state_stack_; | 495 FunctionState** function_state_stack_; |
500 FunctionState* outer_function_state_; | 496 FunctionState* outer_function_state_; |
501 | 497 |
502 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; | 498 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; |
503 TailCallExpressionList tail_call_expressions_; | 499 TailCallExpressionList tail_call_expressions_; |
504 ReturnExprContext return_expr_context_; | 500 ReturnExprContext return_expr_context_; |
505 ZoneList<ExpressionT> non_patterns_to_rewrite_; | 501 ZoneList<ExpressionT> non_patterns_to_rewrite_; |
506 | 502 |
507 ZoneList<typename ExpressionClassifier::Error> reported_errors_; | 503 ZoneList<typename ExpressionClassifier::Error> reported_errors_; |
508 | 504 |
509 // If true, the next (and immediately following) function literal is | 505 // Record whether the next (=== immediately following) function literal is |
510 // preceded by a parenthesis. | 506 // preceded by a parenthesis / exclamation mark. |
511 bool next_function_is_parenthesized_; | 507 // The FunctionState constructor will reset a parents' |
512 | 508 // next_function_is_likely_called_ to prevent it from being 'reused' in the |
513 // The value of the parents' next_function_is_parenthesized_, as it applies | 509 // next function literal. |
514 // to this function. Filled in by constructor. | 510 bool next_function_is_likely_called_; |
515 bool this_function_is_parenthesized_; | |
516 | 511 |
517 friend Impl; | 512 friend Impl; |
518 friend class Checkpoint; | 513 friend class Checkpoint; |
519 }; | 514 }; |
520 | 515 |
521 // This scope sets current ReturnExprContext to given value. | 516 // This scope sets current ReturnExprContext to given value. |
522 class ReturnExprScope { | 517 class ReturnExprScope { |
523 public: | 518 public: |
524 explicit ReturnExprScope(FunctionState* function_state, | 519 explicit ReturnExprScope(FunctionState* function_state, |
525 ReturnExprContext return_expr_context) | 520 ReturnExprContext return_expr_context) |
(...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1456 expected_property_count_(0), | 1451 expected_property_count_(0), |
1457 generator_object_variable_(nullptr), | 1452 generator_object_variable_(nullptr), |
1458 promise_variable_(nullptr), | 1453 promise_variable_(nullptr), |
1459 function_state_stack_(function_state_stack), | 1454 function_state_stack_(function_state_stack), |
1460 outer_function_state_(*function_state_stack), | 1455 outer_function_state_(*function_state_stack), |
1461 destructuring_assignments_to_rewrite_(16, scope->zone()), | 1456 destructuring_assignments_to_rewrite_(16, scope->zone()), |
1462 tail_call_expressions_(scope->zone()), | 1457 tail_call_expressions_(scope->zone()), |
1463 return_expr_context_(ReturnExprContext::kInsideValidBlock), | 1458 return_expr_context_(ReturnExprContext::kInsideValidBlock), |
1464 non_patterns_to_rewrite_(0, scope->zone()), | 1459 non_patterns_to_rewrite_(0, scope->zone()), |
1465 reported_errors_(16, scope->zone()), | 1460 reported_errors_(16, scope->zone()), |
1466 next_function_is_parenthesized_(false), | 1461 next_function_is_likely_called_(false) { |
1467 this_function_is_parenthesized_(false) { | |
1468 *function_state_stack = this; | 1462 *function_state_stack = this; |
1469 if (outer_function_state_) { | 1463 if (outer_function_state_) { |
1470 this_function_is_parenthesized_ = | 1464 outer_function_state_->next_function_is_likely_called_ = false; |
1471 outer_function_state_->next_function_is_parenthesized_; | |
1472 outer_function_state_->next_function_is_parenthesized_ = false; | |
1473 } | 1465 } |
1474 } | 1466 } |
1475 | 1467 |
1476 template <typename Impl> | 1468 template <typename Impl> |
1477 ParserBase<Impl>::FunctionState::~FunctionState() { | 1469 ParserBase<Impl>::FunctionState::~FunctionState() { |
1478 *function_state_stack_ = outer_function_state_; | 1470 *function_state_stack_ = outer_function_state_; |
1479 } | 1471 } |
1480 | 1472 |
1481 template <typename Impl> | 1473 template <typename Impl> |
1482 void ParserBase<Impl>::GetUnexpectedTokenMessage( | 1474 void ParserBase<Impl>::GetUnexpectedTokenMessage( |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1779 if (Check(Token::RPAREN)) { | 1771 if (Check(Token::RPAREN)) { |
1780 // ()=>x. The continuation that looks for the => is in | 1772 // ()=>x. The continuation that looks for the => is in |
1781 // ParseAssignmentExpression. | 1773 // ParseAssignmentExpression. |
1782 classifier()->RecordExpressionError(scanner()->location(), | 1774 classifier()->RecordExpressionError(scanner()->location(), |
1783 MessageTemplate::kUnexpectedToken, | 1775 MessageTemplate::kUnexpectedToken, |
1784 Token::String(Token::RPAREN)); | 1776 Token::String(Token::RPAREN)); |
1785 return factory()->NewEmptyParentheses(beg_pos); | 1777 return factory()->NewEmptyParentheses(beg_pos); |
1786 } | 1778 } |
1787 // Heuristically try to detect immediately called functions before | 1779 // Heuristically try to detect immediately called functions before |
1788 // seeing the call parentheses. | 1780 // seeing the call parentheses. |
1789 function_state_->set_next_function_is_parenthesized(peek() == | 1781 if (peek() == Token::FUNCTION) |
Toon Verwaest
2016/11/18 13:59:48
use {} after if for statements that don't fit on t
vogelheim
2016/11/18 14:10:30
Done.
| |
1790 Token::FUNCTION); | 1782 function_state_->set_next_function_is_likely_called(); |
1791 ExpressionT expr = ParseExpressionCoverGrammar(true, CHECK_OK); | 1783 ExpressionT expr = ParseExpressionCoverGrammar(true, CHECK_OK); |
1792 Expect(Token::RPAREN, CHECK_OK); | 1784 Expect(Token::RPAREN, CHECK_OK); |
1793 return expr; | 1785 return expr; |
1794 } | 1786 } |
1795 | 1787 |
1796 case Token::CLASS: { | 1788 case Token::CLASS: { |
1797 BindingPatternUnexpectedToken(); | 1789 BindingPatternUnexpectedToken(); |
1798 Consume(Token::CLASS); | 1790 Consume(Token::CLASS); |
1799 int class_token_pos = position(); | 1791 int class_token_pos = position(); |
1800 IdentifierT name = impl()->EmptyIdentifier(); | 1792 IdentifierT name = impl()->EmptyIdentifier(); |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2934 // '!' UnaryExpression | 2926 // '!' UnaryExpression |
2935 // [+Await] AwaitExpression[?Yield] | 2927 // [+Await] AwaitExpression[?Yield] |
2936 | 2928 |
2937 Token::Value op = peek(); | 2929 Token::Value op = peek(); |
2938 if (Token::IsUnaryOp(op)) { | 2930 if (Token::IsUnaryOp(op)) { |
2939 BindingPatternUnexpectedToken(); | 2931 BindingPatternUnexpectedToken(); |
2940 ArrowFormalParametersUnexpectedToken(); | 2932 ArrowFormalParametersUnexpectedToken(); |
2941 | 2933 |
2942 op = Next(); | 2934 op = Next(); |
2943 int pos = position(); | 2935 int pos = position(); |
2936 | |
2937 // Assume "! function ..." indicates the function is likely to be called. | |
2938 if (op == Token::NOT && peek() == Token::FUNCTION) | |
2939 function_state_->set_next_function_is_likely_called(); | |
2940 | |
2944 ExpressionT expression = ParseUnaryExpression(CHECK_OK); | 2941 ExpressionT expression = ParseUnaryExpression(CHECK_OK); |
2945 impl()->RewriteNonPattern(CHECK_OK); | 2942 impl()->RewriteNonPattern(CHECK_OK); |
2946 | 2943 |
2947 if (op == Token::DELETE && is_strict(language_mode())) { | 2944 if (op == Token::DELETE && is_strict(language_mode())) { |
2948 if (impl()->IsIdentifier(expression)) { | 2945 if (impl()->IsIdentifier(expression)) { |
2949 // "delete identifier" is a syntax error in strict mode. | 2946 // "delete identifier" is a syntax error in strict mode. |
2950 ReportMessage(MessageTemplate::kStrictDelete); | 2947 ReportMessage(MessageTemplate::kStrictDelete); |
2951 *ok = false; | 2948 *ok = false; |
2952 return impl()->EmptyExpression(); | 2949 return impl()->EmptyExpression(); |
2953 } | 2950 } |
(...skipping 2497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5451 has_seen_constructor_ = true; | 5448 has_seen_constructor_ = true; |
5452 return; | 5449 return; |
5453 } | 5450 } |
5454 } | 5451 } |
5455 | 5452 |
5456 | 5453 |
5457 } // namespace internal | 5454 } // namespace internal |
5458 } // namespace v8 | 5455 } // namespace v8 |
5459 | 5456 |
5460 #endif // V8_PARSING_PARSER_BASE_H | 5457 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |