| 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 1728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1739 name_expression, value, ObjectLiteralProperty::COMPUTED, false, | 1739 name_expression, value, ObjectLiteralProperty::COMPUTED, false, |
| 1740 false); | 1740 false); |
| 1741 } | 1741 } |
| 1742 } | 1742 } |
| 1743 | 1743 |
| 1744 // Method definitions are never valid in patterns. | 1744 // Method definitions are never valid in patterns. |
| 1745 classifier->RecordPatternError( | 1745 classifier->RecordPatternError( |
| 1746 Scanner::Location(next_beg_pos, scanner()->location().end_pos), | 1746 Scanner::Location(next_beg_pos, scanner()->location().end_pos), |
| 1747 MessageTemplate::kInvalidDestructuringTarget); | 1747 MessageTemplate::kInvalidDestructuringTarget); |
| 1748 | 1748 |
| 1749 if (is_generator || peek() == Token::LPAREN) { | 1749 if (is_generator || peek() == Token::LPAREN || |
| 1750 (scope_->typed() && peek() == Token::LT)) { |
| 1750 // MethodDefinition | 1751 // MethodDefinition |
| 1751 // PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}' | 1752 // PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}' |
| 1752 // '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}' | 1753 // '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}' |
| 1753 if (!*is_computed_name) { | 1754 if (!*is_computed_name) { |
| 1754 checker->CheckProperty(name_token, kMethodProperty, is_static, | 1755 checker->CheckProperty(name_token, kMethodProperty, is_static, |
| 1755 is_generator, | 1756 is_generator, |
| 1756 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 1757 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 1757 } | 1758 } |
| 1758 | 1759 |
| 1759 FunctionKind kind = is_generator ? FunctionKind::kConciseGeneratorMethod | 1760 FunctionKind kind = is_generator ? FunctionKind::kConciseGeneratorMethod |
| 1760 : FunctionKind::kConciseMethod; | 1761 : FunctionKind::kConciseMethod; |
| 1762 typesystem::TypeFlags type_flags = (is_get || is_set) |
| 1763 ? typesystem::kDisallowTypeParameters |
| 1764 : typesystem::kNormalTypes; |
| 1761 | 1765 |
| 1762 if (in_class && !is_static && this->IsConstructor(*name)) { | 1766 if (in_class && !is_static && this->IsConstructor(*name)) { |
| 1763 *has_seen_constructor = true; | 1767 *has_seen_constructor = true; |
| 1764 kind = has_extends ? FunctionKind::kSubclassConstructor | 1768 kind = has_extends ? FunctionKind::kSubclassConstructor |
| 1765 : FunctionKind::kBaseConstructor; | 1769 : FunctionKind::kBaseConstructor; |
| 1770 type_flags = typesystem::kConstructorTypes; |
| 1766 } | 1771 } |
| 1767 | 1772 |
| 1768 value = this->ParseFunctionLiteral( | 1773 value = this->ParseFunctionLiteral( |
| 1769 *name, scanner()->location(), kSkipFunctionNameCheck, kind, | 1774 *name, scanner()->location(), kSkipFunctionNameCheck, kind, |
| 1770 RelocInfo::kNoPosition, FunctionLiteral::kAccessorOrMethod, | 1775 RelocInfo::kNoPosition, FunctionLiteral::kAccessorOrMethod, |
| 1771 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 1776 language_mode(), type_flags, |
| 1777 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 1772 | 1778 |
| 1773 return factory()->NewObjectLiteralProperty(name_expression, value, | 1779 return factory()->NewObjectLiteralProperty(name_expression, value, |
| 1774 ObjectLiteralProperty::COMPUTED, | 1780 ObjectLiteralProperty::COMPUTED, |
| 1775 is_static, *is_computed_name); | 1781 is_static, *is_computed_name); |
| 1776 } | 1782 } |
| 1777 | 1783 |
| 1778 if (in_class && name_token == Token::STATIC && !is_static) { | 1784 if (in_class && name_token == Token::STATIC && !is_static) { |
| 1779 // ClassElement (static) | 1785 // ClassElement (static) |
| 1780 // 'static' MethodDefinition | 1786 // 'static' MethodDefinition |
| 1781 *name = this->EmptyIdentifier(); | 1787 *name = this->EmptyIdentifier(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1801 if (!*is_computed_name) { | 1807 if (!*is_computed_name) { |
| 1802 checker->CheckProperty(name_token, kAccessorProperty, is_static, | 1808 checker->CheckProperty(name_token, kAccessorProperty, is_static, |
| 1803 is_generator, | 1809 is_generator, |
| 1804 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 1810 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 1805 } | 1811 } |
| 1806 | 1812 |
| 1807 typename Traits::Type::FunctionLiteral value = this->ParseFunctionLiteral( | 1813 typename Traits::Type::FunctionLiteral value = this->ParseFunctionLiteral( |
| 1808 *name, scanner()->location(), kSkipFunctionNameCheck, | 1814 *name, scanner()->location(), kSkipFunctionNameCheck, |
| 1809 is_get ? FunctionKind::kGetterFunction : FunctionKind::kSetterFunction, | 1815 is_get ? FunctionKind::kGetterFunction : FunctionKind::kSetterFunction, |
| 1810 RelocInfo::kNoPosition, FunctionLiteral::kAccessorOrMethod, | 1816 RelocInfo::kNoPosition, FunctionLiteral::kAccessorOrMethod, |
| 1811 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 1817 language_mode(), typesystem::kDisallowTypeParameters, |
| 1818 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 1812 | 1819 |
| 1813 // Make sure the name expression is a string since we need a Name for | 1820 // Make sure the name expression is a string since we need a Name for |
| 1814 // Runtime_DefineAccessorPropertyUnchecked and since we can determine this | 1821 // Runtime_DefineAccessorPropertyUnchecked and since we can determine this |
| 1815 // statically we can skip the extra runtime check. | 1822 // statically we can skip the extra runtime check. |
| 1816 if (!*is_computed_name) { | 1823 if (!*is_computed_name) { |
| 1817 name_expression = | 1824 name_expression = |
| 1818 factory()->NewStringLiteral(*name, name_expression->position()); | 1825 factory()->NewStringLiteral(*name, name_expression->position()); |
| 1819 } | 1826 } |
| 1820 | 1827 |
| 1821 return factory()->NewObjectLiteralProperty( | 1828 return factory()->NewObjectLiteralProperty( |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2586 is_generator, &is_strict_reserved_name, CHECK_OK); | 2593 is_generator, &is_strict_reserved_name, CHECK_OK); |
| 2587 function_name_location = scanner()->location(); | 2594 function_name_location = scanner()->location(); |
| 2588 function_type = FunctionLiteral::kNamedExpression; | 2595 function_type = FunctionLiteral::kNamedExpression; |
| 2589 } | 2596 } |
| 2590 result = this->ParseFunctionLiteral( | 2597 result = this->ParseFunctionLiteral( |
| 2591 name, function_name_location, | 2598 name, function_name_location, |
| 2592 is_strict_reserved_name ? kFunctionNameIsStrictReserved | 2599 is_strict_reserved_name ? kFunctionNameIsStrictReserved |
| 2593 : kFunctionNameValidityUnknown, | 2600 : kFunctionNameValidityUnknown, |
| 2594 is_generator ? FunctionKind::kGeneratorFunction | 2601 is_generator ? FunctionKind::kGeneratorFunction |
| 2595 : FunctionKind::kNormalFunction, | 2602 : FunctionKind::kNormalFunction, |
| 2596 function_token_position, function_type, language_mode(), CHECK_OK); | 2603 function_token_position, function_type, language_mode(), |
| 2604 typesystem::kNormalTypes, CHECK_OK); |
| 2597 } else if (peek() == Token::SUPER) { | 2605 } else if (peek() == Token::SUPER) { |
| 2598 const bool is_new = false; | 2606 const bool is_new = false; |
| 2599 result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 2607 result = ParseSuperExpression(is_new, classifier, CHECK_OK); |
| 2600 } else { | 2608 } else { |
| 2601 result = ParsePrimaryExpression(classifier, CHECK_OK); | 2609 result = ParsePrimaryExpression(classifier, CHECK_OK); |
| 2602 } | 2610 } |
| 2603 | 2611 |
| 2604 result = ParseMemberExpressionContinuation(result, classifier, CHECK_OK); | 2612 result = ParseMemberExpressionContinuation(result, classifier, CHECK_OK); |
| 2605 return result; | 2613 return result; |
| 2606 } | 2614 } |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2755 ValidateBindingPattern(classifier, ok); | 2763 ValidateBindingPattern(classifier, ok); |
| 2756 if (!*ok) return; | 2764 if (!*ok) return; |
| 2757 | 2765 |
| 2758 if (!Traits::IsIdentifier(pattern)) { | 2766 if (!Traits::IsIdentifier(pattern)) { |
| 2759 parameters->is_simple = false; | 2767 parameters->is_simple = false; |
| 2760 ValidateFormalParameterInitializer(classifier, ok); | 2768 ValidateFormalParameterInitializer(classifier, ok); |
| 2761 if (!*ok) return; | 2769 if (!*ok) return; |
| 2762 classifier->RecordNonSimpleParameter(); | 2770 classifier->RecordNonSimpleParameter(); |
| 2763 } | 2771 } |
| 2764 | 2772 |
| 2773 // Parse optional question mark. |
| 2774 bool optional = false; |
| 2775 if (scope_->typed()) optional = Check(Token::CONDITIONAL); |
| 2776 |
| 2777 // Parse optional type annotation. |
| 2778 typename TypeSystem::Type type = this->EmptyType(); |
| 2779 if (scope_->typed() && Check(Token::COLON)) { |
| 2780 type = ParseValidType(ok); |
| 2781 if (!*ok) return; |
| 2782 } |
| 2783 USE(type); // TODO(nikolaos): really use it! |
| 2784 |
| 2765 ExpressionT initializer = Traits::EmptyExpression(); | 2785 ExpressionT initializer = Traits::EmptyExpression(); |
| 2766 if (!is_rest && Check(Token::ASSIGN)) { | 2786 if (!is_rest && !optional && Check(Token::ASSIGN)) { |
| 2767 ExpressionClassifier init_classifier(this); | 2787 ExpressionClassifier init_classifier(this); |
| 2768 initializer = ParseAssignmentExpression(true, &init_classifier, ok); | 2788 initializer = ParseAssignmentExpression(true, &init_classifier, ok); |
| 2769 if (!*ok) return; | 2789 if (!*ok) return; |
| 2770 Traits::RewriteNonPattern(&init_classifier, ok); | 2790 Traits::RewriteNonPattern(&init_classifier, ok); |
| 2771 ValidateFormalParameterInitializer(&init_classifier, ok); | 2791 ValidateFormalParameterInitializer(&init_classifier, ok); |
| 2772 if (!*ok) return; | 2792 if (!*ok) return; |
| 2773 parameters->is_simple = false; | 2793 parameters->is_simple = false; |
| 2774 init_classifier.Discard(); | 2794 init_classifier.Discard(); |
| 2775 classifier->RecordNonSimpleParameter(); | 2795 classifier->RecordNonSimpleParameter(); |
| 2776 | 2796 |
| (...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3635 has_seen_constructor_ = true; | 3655 has_seen_constructor_ = true; |
| 3636 return; | 3656 return; |
| 3637 } | 3657 } |
| 3638 } | 3658 } |
| 3639 | 3659 |
| 3640 | 3660 |
| 3641 } // namespace internal | 3661 } // namespace internal |
| 3642 } // namespace v8 | 3662 } // namespace v8 |
| 3643 | 3663 |
| 3644 #endif // V8_PARSING_PARSER_BASE_H | 3664 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |