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_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); | 483 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); |
484 ExpressionT ParseUnaryExpression(bool* ok); | 484 ExpressionT ParseUnaryExpression(bool* ok); |
485 ExpressionT ParsePostfixExpression(bool* ok); | 485 ExpressionT ParsePostfixExpression(bool* ok); |
486 ExpressionT ParseLeftHandSideExpression(bool* ok); | 486 ExpressionT ParseLeftHandSideExpression(bool* ok); |
487 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); | 487 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); |
488 ExpressionT ParseMemberExpression(bool* ok); | 488 ExpressionT ParseMemberExpression(bool* ok); |
489 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, | 489 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, |
490 bool* ok); | 490 bool* ok); |
491 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, | 491 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, |
492 bool* ok); | 492 bool* ok); |
493 ExpressionT ParseClassLiteral(IdentifierT name, | |
494 Scanner::Location function_name_location, | |
495 bool name_is_strict_reserved, int pos, | |
496 bool* ok); | |
497 | 493 |
498 // Checks if the expression is a valid reference expression (e.g., on the | 494 // Checks if the expression is a valid reference expression (e.g., on the |
499 // left-hand side of assignments). Although ruled out by ECMA as early errors, | 495 // left-hand side of assignments). Although ruled out by ECMA as early errors, |
500 // we allow calls for web compatibility and rewrite them to a runtime throw. | 496 // we allow calls for web compatibility and rewrite them to a runtime throw. |
501 ExpressionT CheckAndRewriteReferenceExpression( | 497 ExpressionT CheckAndRewriteReferenceExpression( |
502 ExpressionT expression, | 498 ExpressionT expression, |
503 Scanner::Location location, const char* message, bool* ok); | 499 Scanner::Location location, const char* message, bool* ok); |
504 | 500 |
505 // Used to detect duplicates in object literals. Each of the values | 501 // Used to detect duplicates in object literals. Each of the values |
506 // kGetterProperty, kSetterProperty and kValueProperty represents | 502 // kGetterProperty, kSetterProperty and kValueProperty represents |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1083 const PreParserScope& scope, PreParserStatementList body, | 1079 const PreParserScope& scope, PreParserStatementList body, |
1084 int materialized_literal_count, int expected_property_count, | 1080 int materialized_literal_count, int expected_property_count, |
1085 int handler_count, int parameter_count, | 1081 int handler_count, int parameter_count, |
1086 FunctionLiteral::ParameterFlag has_duplicate_parameters, | 1082 FunctionLiteral::ParameterFlag has_duplicate_parameters, |
1087 FunctionLiteral::FunctionType function_type, | 1083 FunctionLiteral::FunctionType function_type, |
1088 FunctionLiteral::IsFunctionFlag is_function, | 1084 FunctionLiteral::IsFunctionFlag is_function, |
1089 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, | 1085 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, |
1090 int position) { | 1086 int position) { |
1091 return PreParserExpression::Default(); | 1087 return PreParserExpression::Default(); |
1092 } | 1088 } |
1093 PreParserExpression NewClassLiteral(PreParserIdentifier name, | 1089 |
1094 PreParserExpression extends, | 1090 // Return the object itself as AstVisitor and implement the needed |
1095 PreParserExpression constructor, | 1091 // dummy method right in this class. |
1096 PreParserExpressionList properties, | 1092 PreParserFactory* visitor() { return this; } |
1097 int start_position, int end_position) { | 1093 int* ast_properties() { |
1098 return PreParserExpression::Default(); | 1094 static int dummy = 42; |
| 1095 return &dummy; |
1099 } | 1096 } |
1100 }; | 1097 }; |
1101 | 1098 |
1102 | 1099 |
1103 class PreParser; | 1100 class PreParser; |
1104 | 1101 |
1105 class PreParserTraits { | 1102 class PreParserTraits { |
1106 public: | 1103 public: |
1107 struct Type { | 1104 struct Type { |
1108 // TODO(marja): To be removed. The Traits object should contain all the data | 1105 // TODO(marja): To be removed. The Traits object should contain all the data |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1301 static PreParserExpression ThisExpression(PreParserScope* scope, | 1298 static PreParserExpression ThisExpression(PreParserScope* scope, |
1302 PreParserFactory* factory) { | 1299 PreParserFactory* factory) { |
1303 return PreParserExpression::This(); | 1300 return PreParserExpression::This(); |
1304 } | 1301 } |
1305 | 1302 |
1306 static PreParserExpression SuperReference(PreParserScope* scope, | 1303 static PreParserExpression SuperReference(PreParserScope* scope, |
1307 PreParserFactory* factory) { | 1304 PreParserFactory* factory) { |
1308 return PreParserExpression::Super(); | 1305 return PreParserExpression::Super(); |
1309 } | 1306 } |
1310 | 1307 |
1311 static PreParserExpression ClassExpression( | |
1312 PreParserIdentifier name, PreParserExpression extends, | |
1313 PreParserExpression constructor, PreParserExpressionList properties, | |
1314 int start_position, int end_position, PreParserFactory* factory) { | |
1315 return PreParserExpression::Default(); | |
1316 } | |
1317 | |
1318 static PreParserExpression DefaultConstructor(bool call_super, | 1308 static PreParserExpression DefaultConstructor(bool call_super, |
1319 PreParserScope* scope, int pos, | 1309 PreParserScope* scope, int pos, |
1320 int end_pos) { | 1310 int end_pos) { |
1321 return PreParserExpression::Default(); | 1311 return PreParserExpression::Default(); |
1322 } | 1312 } |
1323 | 1313 |
1324 static PreParserExpression ExpressionFromLiteral( | 1314 static PreParserExpression ExpressionFromLiteral( |
1325 Token::Value token, int pos, Scanner* scanner, | 1315 Token::Value token, int pos, Scanner* scanner, |
1326 PreParserFactory* factory) { | 1316 PreParserFactory* factory) { |
1327 return PreParserExpression::Default(); | 1317 return PreParserExpression::Default(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1380 void CheckConflictingVarDeclarations(PreParserScope scope, bool* ok) {} | 1370 void CheckConflictingVarDeclarations(PreParserScope scope, bool* ok) {} |
1381 | 1371 |
1382 // Temporary glue; these functions will move to ParserBase. | 1372 // Temporary glue; these functions will move to ParserBase. |
1383 PreParserExpression ParseV8Intrinsic(bool* ok); | 1373 PreParserExpression ParseV8Intrinsic(bool* ok); |
1384 PreParserExpression ParseFunctionLiteral( | 1374 PreParserExpression ParseFunctionLiteral( |
1385 PreParserIdentifier name, Scanner::Location function_name_location, | 1375 PreParserIdentifier name, Scanner::Location function_name_location, |
1386 bool name_is_strict_reserved, FunctionKind kind, | 1376 bool name_is_strict_reserved, FunctionKind kind, |
1387 int function_token_position, FunctionLiteral::FunctionType type, | 1377 int function_token_position, FunctionLiteral::FunctionType type, |
1388 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); | 1378 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); |
1389 | 1379 |
| 1380 PreParserExpression ParseClassLiteral(PreParserIdentifier name, |
| 1381 Scanner::Location class_name_location, |
| 1382 bool name_is_strict_reserved, int pos, |
| 1383 bool* ok); |
| 1384 |
1390 private: | 1385 private: |
1391 PreParser* pre_parser_; | 1386 PreParser* pre_parser_; |
1392 }; | 1387 }; |
1393 | 1388 |
1394 | 1389 |
1395 // Preparsing checks a JavaScript program and emits preparse-data that helps | 1390 // Preparsing checks a JavaScript program and emits preparse-data that helps |
1396 // a later parsing to be faster. | 1391 // a later parsing to be faster. |
1397 // See preparse-data-format.h for the data format. | 1392 // See preparse-data-format.h for the data format. |
1398 | 1393 |
1399 // The PreParser checks that the syntax follows the grammar for JavaScript, | 1394 // The PreParser checks that the syntax follows the grammar for JavaScript, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1517 Variable* fvar, Token::Value fvar_init_op, | 1512 Variable* fvar, Token::Value fvar_init_op, |
1518 bool is_generator, bool* ok); | 1513 bool is_generator, bool* ok); |
1519 | 1514 |
1520 Expression ParseFunctionLiteral( | 1515 Expression ParseFunctionLiteral( |
1521 Identifier name, Scanner::Location function_name_location, | 1516 Identifier name, Scanner::Location function_name_location, |
1522 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, | 1517 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, |
1523 FunctionLiteral::FunctionType function_type, | 1518 FunctionLiteral::FunctionType function_type, |
1524 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); | 1519 FunctionLiteral::ArityRestriction arity_restriction, bool* ok); |
1525 void ParseLazyFunctionLiteralBody(bool* ok); | 1520 void ParseLazyFunctionLiteralBody(bool* ok); |
1526 | 1521 |
| 1522 PreParserExpression ParseClassLiteral(PreParserIdentifier name, |
| 1523 Scanner::Location class_name_location, |
| 1524 bool name_is_strict_reserved, int pos, |
| 1525 bool* ok); |
| 1526 |
1527 bool CheckInOrOf(bool accept_OF); | 1527 bool CheckInOrOf(bool accept_OF); |
1528 }; | 1528 }; |
1529 | 1529 |
1530 | 1530 |
1531 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1531 PreParserStatementList PreParser::ParseEagerFunctionBody( |
1532 PreParserIdentifier function_name, int pos, Variable* fvar, | 1532 PreParserIdentifier function_name, int pos, Variable* fvar, |
1533 Token::Value fvar_init_op, bool is_generator, bool* ok) { | 1533 Token::Value fvar_init_op, bool is_generator, bool* ok) { |
1534 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 1534 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
1535 | 1535 |
1536 ParseSourceElements(Token::RBRACE, ok); | 1536 ParseSourceElements(Token::RBRACE, ok); |
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2715 start_pos); | 2715 start_pos); |
2716 | 2716 |
2717 function_literal->set_function_token_position(start_pos); | 2717 function_literal->set_function_token_position(start_pos); |
2718 | 2718 |
2719 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); | 2719 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); |
2720 | 2720 |
2721 return function_literal; | 2721 return function_literal; |
2722 } | 2722 } |
2723 | 2723 |
2724 | 2724 |
2725 template <class Traits> | |
2726 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseClassLiteral( | |
2727 IdentifierT name, Scanner::Location class_name_location, | |
2728 bool name_is_strict_reserved, int pos, bool* ok) { | |
2729 // All parts of a ClassDeclaration or a ClassExpression are strict code. | |
2730 if (name_is_strict_reserved) { | |
2731 ReportMessageAt(class_name_location, "unexpected_strict_reserved"); | |
2732 *ok = false; | |
2733 return this->EmptyExpression(); | |
2734 } | |
2735 if (this->IsEvalOrArguments(name)) { | |
2736 ReportMessageAt(class_name_location, "strict_eval_arguments"); | |
2737 *ok = false; | |
2738 return this->EmptyExpression(); | |
2739 } | |
2740 | |
2741 bool has_extends = false; | |
2742 ExpressionT extends = this->EmptyExpression(); | |
2743 if (Check(Token::EXTENDS)) { | |
2744 typename Traits::Type::ScopePtr scope = this->NewScope(scope_, BLOCK_SCOPE); | |
2745 BlockState block_state(&scope_, Traits::Type::ptr_to_scope(scope)); | |
2746 scope_->SetStrictMode(STRICT); | |
2747 extends = this->ParseLeftHandSideExpression(CHECK_OK); | |
2748 has_extends = true; | |
2749 } | |
2750 | |
2751 // TODO(arv): Implement scopes and name binding in class body only. | |
2752 typename Traits::Type::ScopePtr scope = this->NewScope(scope_, BLOCK_SCOPE); | |
2753 BlockState block_state(&scope_, Traits::Type::ptr_to_scope(scope)); | |
2754 scope_->SetStrictMode(STRICT); | |
2755 scope_->SetScopeName(name); | |
2756 | |
2757 typename Traits::Type::PropertyList properties = | |
2758 this->NewPropertyList(4, zone_); | |
2759 ExpressionT constructor = this->EmptyExpression(); | |
2760 bool has_seen_constructor = false; | |
2761 | |
2762 Expect(Token::LBRACE, CHECK_OK); | |
2763 while (peek() != Token::RBRACE) { | |
2764 if (Check(Token::SEMICOLON)) continue; | |
2765 if (fni_ != NULL) fni_->Enter(); | |
2766 const bool in_class = true; | |
2767 const bool is_static = false; | |
2768 bool old_has_seen_constructor = has_seen_constructor; | |
2769 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | |
2770 NULL, in_class, is_static, &has_seen_constructor, CHECK_OK); | |
2771 | |
2772 if (has_seen_constructor != old_has_seen_constructor) { | |
2773 constructor = this->GetPropertyValue(property); | |
2774 } else { | |
2775 properties->Add(property, zone()); | |
2776 } | |
2777 | |
2778 if (fni_ != NULL) { | |
2779 fni_->Infer(); | |
2780 fni_->Leave(); | |
2781 } | |
2782 } | |
2783 | |
2784 int end_pos = peek_position(); | |
2785 Expect(Token::RBRACE, CHECK_OK); | |
2786 | |
2787 if (!has_seen_constructor) { | |
2788 constructor = | |
2789 this->DefaultConstructor(has_extends, scope_, pos, end_pos + 1); | |
2790 } | |
2791 | |
2792 return this->ClassExpression(name, extends, constructor, properties, pos, | |
2793 end_pos + 1, factory()); | |
2794 } | |
2795 | |
2796 | |
2797 template <typename Traits> | 2725 template <typename Traits> |
2798 typename ParserBase<Traits>::ExpressionT | 2726 typename ParserBase<Traits>::ExpressionT |
2799 ParserBase<Traits>::CheckAndRewriteReferenceExpression( | 2727 ParserBase<Traits>::CheckAndRewriteReferenceExpression( |
2800 ExpressionT expression, | 2728 ExpressionT expression, |
2801 Scanner::Location location, const char* message, bool* ok) { | 2729 Scanner::Location location, const char* message, bool* ok) { |
2802 if (strict_mode() == STRICT && this->IsIdentifier(expression) && | 2730 if (strict_mode() == STRICT && this->IsIdentifier(expression) && |
2803 this->IsEvalOrArguments(this->AsIdentifier(expression))) { | 2731 this->IsEvalOrArguments(this->AsIdentifier(expression))) { |
2804 this->ReportMessageAt(location, "strict_eval_arguments", false); | 2732 this->ReportMessageAt(location, "strict_eval_arguments", false); |
2805 *ok = false; | 2733 *ok = false; |
2806 return this->EmptyExpression(); | 2734 return this->EmptyExpression(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2846 DCHECK(IsAccessorAccessorConflict(old_type, type)); | 2774 DCHECK(IsAccessorAccessorConflict(old_type, type)); |
2847 // Both accessors of the same type. | 2775 // Both accessors of the same type. |
2848 parser()->ReportMessage("accessor_get_set"); | 2776 parser()->ReportMessage("accessor_get_set"); |
2849 } | 2777 } |
2850 *ok = false; | 2778 *ok = false; |
2851 } | 2779 } |
2852 } | 2780 } |
2853 } } // v8::internal | 2781 } } // v8::internal |
2854 | 2782 |
2855 #endif // V8_PREPARSER_H | 2783 #endif // V8_PREPARSER_H |
OLD | NEW |