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/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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Variable; | 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 ObjectPropertyList; |
| 137 // typedef ClassPropertyList; | |
| 137 // typedef FormalParameters; | 138 // typedef FormalParameters; |
| 138 // typedef Statement; | 139 // typedef Statement; |
| 139 // typedef StatementList; | 140 // typedef StatementList; |
| 140 // typedef Block; | 141 // typedef Block; |
| 141 // typedef BreakableStatement; | 142 // typedef BreakableStatement; |
| 142 // typedef IterationStatement; | 143 // typedef IterationStatement; |
| 143 // // For constructing objects returned by the traversing functions. | 144 // // For constructing objects returned by the traversing functions. |
| 144 // typedef Factory; | 145 // typedef Factory; |
| 145 // // For other implementation-specific tasks. | 146 // // For other implementation-specific tasks. |
| 146 // typedef Target; | 147 // typedef Target; |
| 147 // typedef TargetScope; | 148 // typedef TargetScope; |
| 148 // }; | 149 // }; |
| 149 | 150 |
| 150 template <typename Impl> | 151 template <typename Impl> |
| 151 struct ParserTypes; | 152 struct ParserTypes; |
| 152 | 153 |
| 153 template <typename Impl> | 154 template <typename Impl> |
| 154 class ParserBase { | 155 class ParserBase { |
| 155 public: | 156 public: |
| 156 // Shorten type names defined by ParserTypes<Impl>. | 157 // Shorten type names defined by ParserTypes<Impl>. |
| 157 typedef ParserTypes<Impl> Types; | 158 typedef ParserTypes<Impl> Types; |
| 158 typedef typename Types::Identifier IdentifierT; | 159 typedef typename Types::Identifier IdentifierT; |
| 159 typedef typename Types::Expression ExpressionT; | 160 typedef typename Types::Expression ExpressionT; |
| 160 typedef typename Types::FunctionLiteral FunctionLiteralT; | 161 typedef typename Types::FunctionLiteral FunctionLiteralT; |
| 161 typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT; | 162 typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT; |
| 162 typedef typename Types::ClassLiteralProperty ClassLiteralPropertyT; | 163 typedef typename Types::ClassLiteralProperty ClassLiteralPropertyT; |
| 163 typedef typename Types::ExpressionList ExpressionListT; | 164 typedef typename Types::ExpressionList ExpressionListT; |
| 164 typedef typename Types::PropertyList PropertyListT; | |
| 165 typedef typename Types::FormalParameters FormalParametersT; | 165 typedef typename Types::FormalParameters FormalParametersT; |
| 166 typedef typename Types::Statement StatementT; | 166 typedef typename Types::Statement StatementT; |
| 167 typedef typename Types::StatementList StatementListT; | 167 typedef typename Types::StatementList StatementListT; |
| 168 typedef typename Types::Block BlockT; | 168 typedef typename Types::Block BlockT; |
| 169 typedef typename v8::internal::ExpressionClassifier<Types> | 169 typedef typename v8::internal::ExpressionClassifier<Types> |
| 170 ExpressionClassifier; | 170 ExpressionClassifier; |
| 171 | 171 |
| 172 // All implementation-specific methods must be called through this. | 172 // All implementation-specific methods must be called through this. |
| 173 Impl* impl() { return static_cast<Impl*>(this); } | 173 Impl* impl() { return static_cast<Impl*>(this); } |
| 174 const Impl* impl() const { return static_cast<const Impl*>(this); } | 174 const Impl* impl() const { return static_cast<const Impl*>(this); } |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 673 : bound_names(1, parser->zone()), | 673 : bound_names(1, parser->zone()), |
| 674 mode(ForEachStatement::ENUMERATE), | 674 mode(ForEachStatement::ENUMERATE), |
| 675 each_loc(), | 675 each_loc(), |
| 676 parsing_result() {} | 676 parsing_result() {} |
| 677 ZoneList<const AstRawString*> bound_names; | 677 ZoneList<const AstRawString*> bound_names; |
| 678 ForEachStatement::VisitMode mode; | 678 ForEachStatement::VisitMode mode; |
| 679 Scanner::Location each_loc; | 679 Scanner::Location each_loc; |
| 680 DeclarationParsingResult parsing_result; | 680 DeclarationParsingResult parsing_result; |
| 681 }; | 681 }; |
| 682 | 682 |
| 683 struct ClassInfo { | |
| 684 public: | |
| 685 explicit ClassInfo(ParserBase* parser) | |
| 686 : proxy(nullptr), | |
| 687 extends(parser->impl()->EmptyExpression()), | |
| 688 properties(parser->impl()->NewClassPropertyList(4)), | |
| 689 instance_field_initializers(parser->impl()->NewExpressionList(0)), | |
| 690 constructor(parser->impl()->EmptyFunctionLiteral()), | |
| 691 has_seen_constructor(false), | |
| 692 static_initializer_var(nullptr) {} | |
| 693 VariableProxy* proxy; | |
| 694 ExpressionT extends; | |
| 695 typename Types::ClassPropertyList properties; | |
| 696 ExpressionListT instance_field_initializers; | |
| 697 FunctionLiteralT constructor; | |
| 698 bool has_seen_constructor; | |
| 699 Variable* static_initializer_var; | |
| 700 }; | |
| 701 | |
| 683 DeclarationScope* NewScriptScope() const { | 702 DeclarationScope* NewScriptScope() const { |
| 684 return new (zone()) DeclarationScope(zone(), ast_value_factory()); | 703 return new (zone()) DeclarationScope(zone(), ast_value_factory()); |
| 685 } | 704 } |
| 686 | 705 |
| 687 DeclarationScope* NewVarblockScope() const { | 706 DeclarationScope* NewVarblockScope() const { |
| 688 return new (zone()) DeclarationScope(zone(), scope(), BLOCK_SCOPE); | 707 return new (zone()) DeclarationScope(zone(), scope(), BLOCK_SCOPE); |
| 689 } | 708 } |
| 690 | 709 |
| 691 ModuleScope* NewModuleScope(DeclarationScope* parent) const { | 710 ModuleScope* NewModuleScope(DeclarationScope* parent) const { |
| 692 return new (zone()) ModuleScope(parent, ast_value_factory()); | 711 return new (zone()) ModuleScope(parent, ast_value_factory()); |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1182 ExpressionT ParsePostfixExpression(bool* ok); | 1201 ExpressionT ParsePostfixExpression(bool* ok); |
| 1183 ExpressionT ParseLeftHandSideExpression(bool* ok); | 1202 ExpressionT ParseLeftHandSideExpression(bool* ok); |
| 1184 ExpressionT ParseMemberWithNewPrefixesExpression(bool* is_async, bool* ok); | 1203 ExpressionT ParseMemberWithNewPrefixesExpression(bool* is_async, bool* ok); |
| 1185 ExpressionT ParseMemberExpression(bool* is_async, bool* ok); | 1204 ExpressionT ParseMemberExpression(bool* is_async, bool* ok); |
| 1186 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, | 1205 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, |
| 1187 bool* is_async, bool* ok); | 1206 bool* is_async, bool* ok); |
| 1188 ExpressionT ParseArrowFunctionLiteral(bool accept_IN, | 1207 ExpressionT ParseArrowFunctionLiteral(bool accept_IN, |
| 1189 const FormalParametersT& parameters, | 1208 const FormalParametersT& parameters, |
| 1190 bool is_async, | 1209 bool is_async, |
| 1191 bool* ok); | 1210 bool* ok); |
| 1211 ExpressionT ParseClassLiteral(IdentifierT name, | |
| 1212 Scanner::Location class_name_location, | |
| 1213 bool name_is_strict_reserved, | |
| 1214 int class_token_pos, bool* ok); | |
| 1192 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); | 1215 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); |
| 1193 ExpressionT ParseSuperExpression(bool is_new, bool* ok); | 1216 ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
| 1194 ExpressionT ParseNewTargetExpression(bool* ok); | 1217 ExpressionT ParseNewTargetExpression(bool* ok); |
| 1195 | 1218 |
| 1196 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); | 1219 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); |
| 1197 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); | 1220 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); |
| 1198 void CheckArityRestrictions(int param_count, FunctionKind function_type, | 1221 void CheckArityRestrictions(int param_count, FunctionKind function_type, |
| 1199 bool has_rest, int formals_start_pos, | 1222 bool has_rest, int formals_start_pos, |
| 1200 int formals_end_pos, bool* ok); | 1223 int formals_end_pos, bool* ok); |
| 1201 | 1224 |
| 1202 BlockT ParseVariableDeclarations(VariableDeclarationContext var_context, | 1225 BlockT ParseVariableDeclarations(VariableDeclarationContext var_context, |
| 1203 DeclarationParsingResult* parsing_result, | 1226 DeclarationParsingResult* parsing_result, |
| 1204 ZoneList<const AstRawString*>* names, | 1227 ZoneList<const AstRawString*>* names, |
| 1205 bool* ok); | 1228 bool* ok); |
| 1206 StatementT ParseHoistableDeclaration(ZoneList<const AstRawString*>* names, | 1229 StatementT ParseHoistableDeclaration(ZoneList<const AstRawString*>* names, |
| 1207 bool default_export, bool* ok); | 1230 bool default_export, bool* ok); |
| 1208 StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags, | 1231 StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags, |
| 1209 ZoneList<const AstRawString*>* names, | 1232 ZoneList<const AstRawString*>* names, |
| 1210 bool default_export, bool* ok); | 1233 bool default_export, bool* ok); |
| 1234 StatementT ParseClassDeclaration(ZoneList<const AstRawString*>* names, | |
| 1235 bool default_export, bool* ok); | |
| 1236 StatementT ParseNativeDeclaration(bool* ok); | |
| 1211 | 1237 |
| 1212 // Under some circumstances, we allow preparsing to abort if the preparsed | 1238 // Under some circumstances, we allow preparsing to abort if the preparsed |
| 1213 // function is "long and trivial", and fully parse instead. Our current | 1239 // function is "long and trivial", and fully parse instead. Our current |
| 1214 // definition of "long and trivial" is: | 1240 // definition of "long and trivial" is: |
| 1215 // - over kLazyParseTrialLimit statements | 1241 // - over kLazyParseTrialLimit statements |
| 1216 // - all starting with an identifier (i.e., no if, for, while, etc.) | 1242 // - all starting with an identifier (i.e., no if, for, while, etc.) |
| 1217 static const int kLazyParseTrialLimit = 200; | 1243 static const int kLazyParseTrialLimit = 200; |
| 1218 | 1244 |
| 1219 // TODO(nikolaos, marja): The first argument should not really be passed | 1245 // TODO(nikolaos, marja): The first argument should not really be passed |
| 1220 // by value. The method is expected to add the parsed statements to the | 1246 // by value. The method is expected to add the parsed statements to the |
| (...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1790 function_state_->set_next_function_is_parenthesized(peek() == | 1816 function_state_->set_next_function_is_parenthesized(peek() == |
| 1791 Token::FUNCTION); | 1817 Token::FUNCTION); |
| 1792 ExpressionT expr = ParseExpressionCoverGrammar(true, CHECK_OK); | 1818 ExpressionT expr = ParseExpressionCoverGrammar(true, CHECK_OK); |
| 1793 Expect(Token::RPAREN, CHECK_OK); | 1819 Expect(Token::RPAREN, CHECK_OK); |
| 1794 return expr; | 1820 return expr; |
| 1795 } | 1821 } |
| 1796 | 1822 |
| 1797 case Token::CLASS: { | 1823 case Token::CLASS: { |
| 1798 BindingPatternUnexpectedToken(); | 1824 BindingPatternUnexpectedToken(); |
| 1799 Consume(Token::CLASS); | 1825 Consume(Token::CLASS); |
| 1800 int class_token_position = position(); | 1826 int class_token_pos = position(); |
| 1801 IdentifierT name = impl()->EmptyIdentifier(); | 1827 IdentifierT name = impl()->EmptyIdentifier(); |
| 1802 bool is_strict_reserved_name = false; | 1828 bool is_strict_reserved_name = false; |
| 1803 Scanner::Location class_name_location = Scanner::Location::invalid(); | 1829 Scanner::Location class_name_location = Scanner::Location::invalid(); |
| 1804 if (peek_any_identifier()) { | 1830 if (peek_any_identifier()) { |
| 1805 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, | 1831 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, |
| 1806 CHECK_OK); | 1832 CHECK_OK); |
| 1807 class_name_location = scanner()->location(); | 1833 class_name_location = scanner()->location(); |
| 1808 } | 1834 } |
| 1809 return impl()->ParseClassLiteral(name, class_name_location, | 1835 return ParseClassLiteral(name, class_name_location, |
| 1810 is_strict_reserved_name, | 1836 is_strict_reserved_name, class_token_pos, ok); |
| 1811 class_token_position, ok); | |
| 1812 } | 1837 } |
| 1813 | 1838 |
| 1814 case Token::TEMPLATE_SPAN: | 1839 case Token::TEMPLATE_SPAN: |
| 1815 case Token::TEMPLATE_TAIL: | 1840 case Token::TEMPLATE_TAIL: |
| 1816 BindingPatternUnexpectedToken(); | 1841 BindingPatternUnexpectedToken(); |
| 1817 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, ok); | 1842 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, ok); |
| 1818 | 1843 |
| 1819 case Token::MOD: | 1844 case Token::MOD: |
| 1820 if (allow_natives() || extension_ != NULL) { | 1845 if (allow_natives() || extension_ != NULL) { |
| 1821 BindingPatternUnexpectedToken(); | 1846 BindingPatternUnexpectedToken(); |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2467 return impl()->EmptyObjectLiteralProperty(); | 2492 return impl()->EmptyObjectLiteralProperty(); |
| 2468 } | 2493 } |
| 2469 | 2494 |
| 2470 template <typename Impl> | 2495 template <typename Impl> |
| 2471 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( | 2496 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( |
| 2472 bool* ok) { | 2497 bool* ok) { |
| 2473 // ObjectLiteral :: | 2498 // ObjectLiteral :: |
| 2474 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' | 2499 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' |
| 2475 | 2500 |
| 2476 int pos = peek_position(); | 2501 int pos = peek_position(); |
| 2477 PropertyListT properties = impl()->NewPropertyList(4); | 2502 typename Types::ObjectPropertyList properties = |
| 2503 impl()->NewObjectPropertyList(4); | |
| 2478 int number_of_boilerplate_properties = 0; | 2504 int number_of_boilerplate_properties = 0; |
| 2479 bool has_computed_names = false; | 2505 bool has_computed_names = false; |
| 2480 ObjectLiteralChecker checker(this); | 2506 ObjectLiteralChecker checker(this); |
| 2481 | 2507 |
| 2482 Expect(Token::LBRACE, CHECK_OK); | 2508 Expect(Token::LBRACE, CHECK_OK); |
| 2483 | 2509 |
| 2484 while (peek() != Token::RBRACE) { | 2510 while (peek() != Token::RBRACE) { |
| 2485 FuncNameInferrer::State fni_state(fni_); | 2511 FuncNameInferrer::State fni_state(fni_); |
| 2486 | 2512 |
| 2487 bool is_computed_name = false; | 2513 bool is_computed_name = false; |
| (...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3799 : is_async ? FunctionKind::kAsyncFunction | 3825 : is_async ? FunctionKind::kAsyncFunction |
| 3800 : FunctionKind::kNormalFunction, | 3826 : FunctionKind::kNormalFunction, |
| 3801 pos, FunctionLiteral::kDeclaration, language_mode(), | 3827 pos, FunctionLiteral::kDeclaration, language_mode(), |
| 3802 CHECK_OK_CUSTOM(NullStatement)); | 3828 CHECK_OK_CUSTOM(NullStatement)); |
| 3803 | 3829 |
| 3804 return impl()->DeclareFunction(variable_name, function, pos, is_generator, | 3830 return impl()->DeclareFunction(variable_name, function, pos, is_generator, |
| 3805 is_async, names, ok); | 3831 is_async, names, ok); |
| 3806 } | 3832 } |
| 3807 | 3833 |
| 3808 template <typename Impl> | 3834 template <typename Impl> |
| 3835 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseClassDeclaration( | |
| 3836 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | |
| 3837 // ClassDeclaration :: | |
| 3838 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' | |
| 3839 // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}' | |
| 3840 // | |
| 3841 // The anonymous form is allowed iff [default_export] is true. | |
| 3842 // | |
| 3843 // 'class' is expected to be consumed by the caller. | |
| 3844 // | |
| 3845 // A ClassDeclaration | |
| 3846 // | |
| 3847 // class C { ... } | |
| 3848 // | |
| 3849 // has the same semantics as: | |
| 3850 // | |
| 3851 // let C = class C { ... }; | |
| 3852 // | |
| 3853 // so rewrite it as such. | |
| 3854 | |
| 3855 int class_token_pos = position(); | |
| 3856 IdentifierT name = impl()->EmptyIdentifier(); | |
| 3857 bool is_strict_reserved = false; | |
| 3858 IdentifierT variable_name = impl()->EmptyIdentifier(); | |
| 3859 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { | |
| 3860 impl()->GetDefaultStrings(&name, &variable_name); | |
| 3861 } else { | |
| 3862 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, | |
| 3863 CHECK_OK_CUSTOM(NullStatement)); | |
| 3864 variable_name = name; | |
| 3865 } | |
| 3866 | |
| 3867 ExpressionClassifier no_classifier(this); | |
| 3868 ExpressionT value = | |
| 3869 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, | |
| 3870 class_token_pos, CHECK_OK_CUSTOM(NullStatement)); | |
| 3871 return impl()->DeclareClass(variable_name, value, names, class_token_pos, ok); | |
| 3872 } | |
| 3873 | |
| 3874 // Language extension which is only enabled for source files loaded | |
| 3875 // through the API's extension mechanism. A native function | |
| 3876 // declaration is resolved by looking up the function through a | |
| 3877 // callback provided by the extension. | |
| 3878 template <typename Impl> | |
| 3879 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseNativeDeclaration( | |
| 3880 bool* ok) { | |
| 3881 int pos = peek_position(); | |
| 3882 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement)); | |
| 3883 // Allow "eval" or "arguments" for backward compatibility. | |
| 3884 IdentifierT name = ParseIdentifier(kAllowRestrictedIdentifiers, | |
| 3885 CHECK_OK_CUSTOM(NullStatement)); | |
| 3886 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullStatement)); | |
| 3887 if (peek() != Token::RPAREN) { | |
| 3888 do { | |
| 3889 ParseIdentifier(kAllowRestrictedIdentifiers, | |
| 3890 CHECK_OK_CUSTOM(NullStatement)); | |
| 3891 } while (Check(Token::COMMA)); | |
| 3892 } | |
| 3893 Expect(Token::RPAREN, CHECK_OK_CUSTOM(NullStatement)); | |
| 3894 Expect(Token::SEMICOLON, CHECK_OK_CUSTOM(NullStatement)); | |
| 3895 return impl()->DeclareNative(name, pos, ok); | |
| 3896 } | |
| 3897 | |
| 3898 template <typename Impl> | |
| 3809 void ParserBase<Impl>::CheckArityRestrictions(int param_count, | 3899 void ParserBase<Impl>::CheckArityRestrictions(int param_count, |
| 3810 FunctionKind function_kind, | 3900 FunctionKind function_kind, |
| 3811 bool has_rest, | 3901 bool has_rest, |
| 3812 int formals_start_pos, | 3902 int formals_start_pos, |
| 3813 int formals_end_pos, bool* ok) { | 3903 int formals_end_pos, bool* ok) { |
| 3814 if (IsGetterFunction(function_kind)) { | 3904 if (IsGetterFunction(function_kind)) { |
| 3815 if (param_count != 0) { | 3905 if (param_count != 0) { |
| 3816 impl()->ReportMessageAt( | 3906 impl()->ReportMessageAt( |
| 3817 Scanner::Location(formals_start_pos, formals_end_pos), | 3907 Scanner::Location(formals_start_pos, formals_end_pos), |
| 3818 MessageTemplate::kBadGetterArity); | 3908 MessageTemplate::kBadGetterArity); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4010 if (should_be_used_once_hint) { | 4100 if (should_be_used_once_hint) { |
| 4011 function_literal->set_should_be_used_once_hint(); | 4101 function_literal->set_should_be_used_once_hint(); |
| 4012 } | 4102 } |
| 4013 | 4103 |
| 4014 impl()->InferFunctionName(function_literal); | 4104 impl()->InferFunctionName(function_literal); |
| 4015 | 4105 |
| 4016 return function_literal; | 4106 return function_literal; |
| 4017 } | 4107 } |
| 4018 | 4108 |
| 4019 template <typename Impl> | 4109 template <typename Impl> |
| 4110 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseClassLiteral( | |
| 4111 IdentifierT name, Scanner::Location class_name_location, | |
| 4112 bool name_is_strict_reserved, int class_token_pos, bool* ok) { | |
| 4113 // All parts of a ClassDeclaration and ClassExpression are strict code. | |
| 4114 if (name_is_strict_reserved) { | |
| 4115 impl()->ReportMessageAt(class_name_location, | |
| 4116 MessageTemplate::kUnexpectedStrictReserved); | |
| 4117 *ok = false; | |
| 4118 return impl()->EmptyExpression(); | |
| 4119 } | |
| 4120 if (impl()->IsEvalOrArguments(name)) { | |
| 4121 impl()->ReportMessageAt(class_name_location, | |
| 4122 MessageTemplate::kStrictEvalArguments); | |
| 4123 *ok = false; | |
| 4124 return impl()->EmptyExpression(); | |
| 4125 } | |
| 4126 | |
| 4127 BlockState block_state(&scope_state_); | |
| 4128 RaiseLanguageMode(STRICT); | |
| 4129 | |
| 4130 ClassInfo class_info(this); | |
| 4131 impl()->DeclareClassVariable(name, block_state.scope(), &class_info, | |
| 4132 class_token_pos, CHECK_OK); | |
| 4133 | |
| 4134 if (Check(Token::EXTENDS)) { | |
| 4135 block_state.set_start_position(scanner()->location().end_pos); | |
| 4136 ExpressionClassifier extends_classifier(this); | |
| 4137 class_info.extends = ParseLeftHandSideExpression(CHECK_OK); | |
| 4138 CheckNoTailCallExpressions(CHECK_OK); | |
| 4139 impl()->RewriteNonPattern(CHECK_OK); | |
| 4140 impl()->AccumulateFormalParameterContainmentErrors(); | |
| 4141 } else { | |
| 4142 block_state.set_start_position(scanner()->location().end_pos); | |
| 4143 } | |
| 4144 | |
| 4145 ClassLiteralChecker checker(this); | |
| 4146 | |
| 4147 Expect(Token::LBRACE, CHECK_OK); | |
| 4148 | |
| 4149 const bool has_extends = !impl()->IsEmptyExpression(class_info.extends); | |
| 4150 while (peek() != Token::RBRACE) { | |
| 4151 if (Check(Token::SEMICOLON)) continue; | |
| 4152 FuncNameInferrer::State fni_state(fni_); | |
| 4153 bool is_computed_name = false; // Classes do not care about computed | |
| 4154 // property names here. | |
| 4155 ExpressionClassifier property_classifier(this); | |
| 4156 ClassLiteralPropertyT property = ParseClassPropertyDefinition( | |
| 4157 &checker, has_extends, &is_computed_name, | |
| 4158 &class_info.has_seen_constructor, CHECK_OK); | |
| 4159 impl()->RewriteNonPattern(CHECK_OK); | |
| 4160 impl()->AccumulateFormalParameterContainmentErrors(); | |
| 4161 | |
| 4162 impl()->DeclareClassProperty(name, property, &class_info, CHECK_OK); | |
| 4163 impl()->Infer(); | |
|
adamk
2016/09/26 20:36:32
This name should be longer, "Infer" is far too sho
nickie
2016/09/27 08:52:17
Done.
| |
| 4164 } | |
| 4165 | |
| 4166 Expect(Token::RBRACE, CHECK_OK); | |
| 4167 return impl()->RewriteClassLiteral(name, &class_info, class_token_pos, ok); | |
| 4168 } | |
| 4169 | |
| 4170 template <typename Impl> | |
| 4020 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 4171 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( |
| 4021 ExpressionT tag, int start, bool* ok) { | 4172 ExpressionT tag, int start, bool* ok) { |
| 4022 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal | 4173 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal |
| 4023 // text followed by a substitution expression), finalized by a single | 4174 // text followed by a substitution expression), finalized by a single |
| 4024 // TEMPLATE_TAIL. | 4175 // TEMPLATE_TAIL. |
| 4025 // | 4176 // |
| 4026 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or | 4177 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or |
| 4027 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or | 4178 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or |
| 4028 // NoSubstitutionTemplate. | 4179 // NoSubstitutionTemplate. |
| 4029 // | 4180 // |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4306 // GeneratorDeclaration[?Yield, ?Default] | 4457 // GeneratorDeclaration[?Yield, ?Default] |
| 4307 // | 4458 // |
| 4308 // LexicalDeclaration[In, Yield] : | 4459 // LexicalDeclaration[In, Yield] : |
| 4309 // LetOrConst BindingList[?In, ?Yield] ; | 4460 // LetOrConst BindingList[?In, ?Yield] ; |
| 4310 | 4461 |
| 4311 switch (peek()) { | 4462 switch (peek()) { |
| 4312 case Token::FUNCTION: | 4463 case Token::FUNCTION: |
| 4313 return ParseHoistableDeclaration(nullptr, false, ok); | 4464 return ParseHoistableDeclaration(nullptr, false, ok); |
| 4314 case Token::CLASS: | 4465 case Token::CLASS: |
| 4315 Consume(Token::CLASS); | 4466 Consume(Token::CLASS); |
| 4316 return impl()->ParseClassDeclaration(nullptr, false, ok); | 4467 return ParseClassDeclaration(nullptr, false, ok); |
| 4317 case Token::VAR: | 4468 case Token::VAR: |
| 4318 case Token::CONST: | 4469 case Token::CONST: |
| 4319 return ParseVariableStatement(kStatementListItem, nullptr, ok); | 4470 return ParseVariableStatement(kStatementListItem, nullptr, ok); |
| 4320 case Token::LET: | 4471 case Token::LET: |
| 4321 if (IsNextLetKeyword()) { | 4472 if (IsNextLetKeyword()) { |
| 4322 return ParseVariableStatement(kStatementListItem, nullptr, ok); | 4473 return ParseVariableStatement(kStatementListItem, nullptr, ok); |
| 4323 } | 4474 } |
| 4324 break; | 4475 break; |
| 4325 case Token::ASYNC: | 4476 case Token::ASYNC: |
| 4326 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION && | 4477 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION && |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4584 } | 4735 } |
| 4585 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); | 4736 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); |
| 4586 } | 4737 } |
| 4587 | 4738 |
| 4588 // If we have an extension, we allow a native function declaration. | 4739 // If we have an extension, we allow a native function declaration. |
| 4589 // A native function declaration starts with "native function" with | 4740 // A native function declaration starts with "native function" with |
| 4590 // no line-terminator between the two words. | 4741 // no line-terminator between the two words. |
| 4591 if (extension_ != nullptr && peek() == Token::FUNCTION && | 4742 if (extension_ != nullptr && peek() == Token::FUNCTION && |
| 4592 !scanner()->HasAnyLineTerminatorBeforeNext() && impl()->IsNative(expr) && | 4743 !scanner()->HasAnyLineTerminatorBeforeNext() && impl()->IsNative(expr) && |
| 4593 !scanner()->literal_contains_escapes()) { | 4744 !scanner()->literal_contains_escapes()) { |
| 4594 return impl()->ParseNativeDeclaration(ok); | 4745 return ParseNativeDeclaration(ok); |
| 4595 } | 4746 } |
| 4596 | 4747 |
| 4597 // Parsed expression statement, followed by semicolon. | 4748 // Parsed expression statement, followed by semicolon. |
| 4598 ExpectSemicolon(CHECK_OK); | 4749 ExpectSemicolon(CHECK_OK); |
| 4599 return factory()->NewExpressionStatement(expr, pos); | 4750 return factory()->NewExpressionStatement(expr, pos); |
| 4600 } | 4751 } |
| 4601 | 4752 |
| 4602 template <typename Impl> | 4753 template <typename Impl> |
| 4603 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseIfStatement( | 4754 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseIfStatement( |
| 4604 ZoneList<const AstRawString*>* labels, bool* ok) { | 4755 ZoneList<const AstRawString*>* labels, bool* ok) { |
| (...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5317 has_seen_constructor_ = true; | 5468 has_seen_constructor_ = true; |
| 5318 return; | 5469 return; |
| 5319 } | 5470 } |
| 5320 } | 5471 } |
| 5321 | 5472 |
| 5322 | 5473 |
| 5323 } // namespace internal | 5474 } // namespace internal |
| 5324 } // namespace v8 | 5475 } // namespace v8 |
| 5325 | 5476 |
| 5326 #endif // V8_PARSING_PARSER_BASE_H | 5477 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |