Chromium Code Reviews| 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/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/hashmap.h" | 10 #include "src/hashmap.h" |
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 447 return true; | 447 return true; |
| 448 } | 448 } |
| 449 return false; | 449 return false; |
| 450 } | 450 } |
| 451 | 451 |
| 452 bool PeekContextualKeyword(Vector<const char> keyword) { | 452 bool PeekContextualKeyword(Vector<const char> keyword) { |
| 453 return peek() == Token::IDENTIFIER && | 453 return peek() == Token::IDENTIFIER && |
| 454 scanner()->is_next_contextual_keyword(keyword); | 454 scanner()->is_next_contextual_keyword(keyword); |
| 455 } | 455 } |
| 456 | 456 |
| 457 int ExpectMetaProperty(Vector<const char> property_name, | |
| 458 const char* full_name, int pos, bool* ok); | |
| 459 | |
| 457 void ExpectContextualKeyword(Vector<const char> keyword, bool* ok) { | 460 void ExpectContextualKeyword(Vector<const char> keyword, bool* ok) { |
| 458 Expect(Token::IDENTIFIER, ok); | 461 Expect(Token::IDENTIFIER, ok); |
| 459 if (!*ok) return; | 462 if (!*ok) return; |
| 460 if (!scanner()->is_literal_contextual_keyword(keyword)) { | 463 if (!scanner()->is_literal_contextual_keyword(keyword)) { |
| 461 ReportUnexpectedToken(scanner()->current_token()); | 464 ReportUnexpectedToken(scanner()->current_token()); |
| 462 *ok = false; | 465 *ok = false; |
| 463 } | 466 } |
| 464 } | 467 } |
| 465 | 468 |
| 466 bool CheckInOrOf(ForEachStatement::VisitMode* visit_mode, bool* ok) { | 469 bool CheckInOrOf(ForEachStatement::VisitMode* visit_mode, bool* ok) { |
| (...skipping 2066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2533 | 2536 |
| 2534 // Parse the initial primary or function expression. | 2537 // Parse the initial primary or function expression. |
| 2535 ExpressionT result = this->EmptyExpression(); | 2538 ExpressionT result = this->EmptyExpression(); |
| 2536 if (peek() == Token::FUNCTION) { | 2539 if (peek() == Token::FUNCTION) { |
| 2537 BindingPatternUnexpectedToken(classifier); | 2540 BindingPatternUnexpectedToken(classifier); |
| 2538 ArrowFormalParametersUnexpectedToken(classifier); | 2541 ArrowFormalParametersUnexpectedToken(classifier); |
| 2539 | 2542 |
| 2540 Consume(Token::FUNCTION); | 2543 Consume(Token::FUNCTION); |
| 2541 int function_token_position = position(); | 2544 int function_token_position = position(); |
| 2542 | 2545 |
| 2543 if (FLAG_harmony_function_sent && Check(Token::PERIOD)) { | 2546 if (FLAG_harmony_function_sent && peek() == Token::PERIOD) { |
| 2544 // function.sent | 2547 // function.sent |
| 2545 | |
| 2546 int pos = position(); | 2548 int pos = position(); |
| 2547 ExpectContextualKeyword(CStrVector("sent"), CHECK_OK); | 2549 ExpectMetaProperty(CStrVector("sent"), "function.sent", pos, CHECK_OK); |
| 2548 | 2550 |
| 2549 if (!is_generator()) { | 2551 if (!is_generator()) { |
| 2550 // TODO(neis): allow escaping into closures? | 2552 // TODO(neis): allow escaping into closures? |
| 2551 ReportMessageAt(scanner()->location(), | 2553 ReportMessageAt(scanner()->location(), |
| 2552 MessageTemplate::kUnexpectedFunctionSent); | 2554 MessageTemplate::kUnexpectedFunctionSent); |
| 2553 *ok = false; | 2555 *ok = false; |
| 2554 return this->EmptyExpression(); | 2556 return this->EmptyExpression(); |
| 2555 } | 2557 } |
| 2556 | 2558 |
| 2557 return this->FunctionSentExpression(scope_, factory(), pos); | 2559 return this->FunctionSentExpression(scope_, factory(), pos); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2762 function_state_->set_super_location(scanner()->location()); | 2764 function_state_->set_super_location(scanner()->location()); |
| 2763 return this->SuperCallReference(scope_, factory(), pos); | 2765 return this->SuperCallReference(scope_, factory(), pos); |
| 2764 } | 2766 } |
| 2765 } | 2767 } |
| 2766 | 2768 |
| 2767 ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); | 2769 ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); |
| 2768 *ok = false; | 2770 *ok = false; |
| 2769 return this->EmptyExpression(); | 2771 return this->EmptyExpression(); |
| 2770 } | 2772 } |
| 2771 | 2773 |
| 2774 template <class Traits> | |
| 2775 int ParserBase<Traits>::ExpectMetaProperty(Vector<const char> property_name, | |
|
adamk
2016/02/16 22:21:55
Needs to return "void" to make it compile.
| |
| 2776 const char* full_name, int pos, | |
| 2777 bool* ok) { | |
| 2778 Consume(Token::PERIOD); | |
| 2779 ExpectContextualKeyword(property_name, ok); | |
| 2780 if (!*ok) return; | |
| 2781 if (scanner()->literal_contains_escapes()) { | |
| 2782 Traits::ReportMessageAt( | |
| 2783 Scanner::Location(pos, scanner()->location().end_pos), | |
| 2784 MessageTemplate::kInvalidEscapedMetaProperty, full_name); | |
| 2785 *ok = false; | |
| 2786 } | |
| 2787 } | |
| 2772 | 2788 |
| 2773 template <class Traits> | 2789 template <class Traits> |
| 2774 typename ParserBase<Traits>::ExpressionT | 2790 typename ParserBase<Traits>::ExpressionT |
| 2775 ParserBase<Traits>::ParseNewTargetExpression(bool* ok) { | 2791 ParserBase<Traits>::ParseNewTargetExpression(bool* ok) { |
| 2776 int pos = position(); | 2792 int pos = position(); |
| 2777 Consume(Token::PERIOD); | 2793 ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); |
| 2778 ExpectContextualKeyword(CStrVector("target"), CHECK_OK); | |
| 2779 | 2794 |
| 2780 if (!scope_->ReceiverScope()->is_function_scope()) { | 2795 if (!scope_->ReceiverScope()->is_function_scope()) { |
| 2781 ReportMessageAt(scanner()->location(), | 2796 ReportMessageAt(scanner()->location(), |
| 2782 MessageTemplate::kUnexpectedNewTarget); | 2797 MessageTemplate::kUnexpectedNewTarget); |
| 2783 *ok = false; | 2798 *ok = false; |
| 2784 return this->EmptyExpression(); | 2799 return this->EmptyExpression(); |
| 2785 } | 2800 } |
| 2786 | 2801 |
| 2787 return this->NewTargetExpression(scope_, factory(), pos); | 2802 return this->NewTargetExpression(scope_, factory(), pos); |
| 2788 } | 2803 } |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3345 return; | 3360 return; |
| 3346 } | 3361 } |
| 3347 has_seen_constructor_ = true; | 3362 has_seen_constructor_ = true; |
| 3348 return; | 3363 return; |
| 3349 } | 3364 } |
| 3350 } | 3365 } |
| 3351 } // namespace internal | 3366 } // namespace internal |
| 3352 } // namespace v8 | 3367 } // namespace v8 |
| 3353 | 3368 |
| 3354 #endif // V8_PARSING_PARSER_BASE_H | 3369 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |