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/func-name-inferrer.h" | 10 #include "src/func-name-inferrer.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 // // ... | 57 // // ... |
58 // }; | 58 // }; |
59 | 59 |
60 template <typename Traits> | 60 template <typename Traits> |
61 class ParserBase : public Traits { | 61 class ParserBase : public Traits { |
62 public: | 62 public: |
63 // Shorten type names defined by Traits. | 63 // Shorten type names defined by Traits. |
64 typedef typename Traits::Type::Expression ExpressionT; | 64 typedef typename Traits::Type::Expression ExpressionT; |
65 typedef typename Traits::Type::Identifier IdentifierT; | 65 typedef typename Traits::Type::Identifier IdentifierT; |
66 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; | 66 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
67 typedef typename Traits::Type::ClassLiteral ClassLiteralT; | |
68 typedef typename Traits::Type::Literal LiteralT; | 67 typedef typename Traits::Type::Literal LiteralT; |
69 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; | 68 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; |
70 | 69 |
71 ParserBase(Scanner* scanner, uintptr_t stack_limit, v8::Extension* extension, | 70 ParserBase(Scanner* scanner, uintptr_t stack_limit, v8::Extension* extension, |
72 ParserRecorder* log, typename Traits::Type::Zone* zone, | 71 ParserRecorder* log, typename Traits::Type::Zone* zone, |
73 AstNode::IdGen* ast_node_id_gen, | 72 AstNode::IdGen* ast_node_id_gen, |
74 typename Traits::Type::Parser this_object) | 73 typename Traits::Type::Parser this_object) |
75 : Traits(this_object), | 74 : Traits(this_object), |
76 parenthesized_function_(false), | 75 parenthesized_function_(false), |
77 scope_(NULL), | 76 scope_(NULL), |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); | 494 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); |
496 ExpressionT ParseUnaryExpression(bool* ok); | 495 ExpressionT ParseUnaryExpression(bool* ok); |
497 ExpressionT ParsePostfixExpression(bool* ok); | 496 ExpressionT ParsePostfixExpression(bool* ok); |
498 ExpressionT ParseLeftHandSideExpression(bool* ok); | 497 ExpressionT ParseLeftHandSideExpression(bool* ok); |
499 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); | 498 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); |
500 ExpressionT ParseMemberExpression(bool* ok); | 499 ExpressionT ParseMemberExpression(bool* ok); |
501 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, | 500 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, |
502 bool* ok); | 501 bool* ok); |
503 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, | 502 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, |
504 bool* ok); | 503 bool* ok); |
505 ClassLiteralT ParseClassLiteral(IdentifierT name, | 504 ExpressionT ParseClassLiteral(IdentifierT name, |
506 Scanner::Location function_name_location, | 505 Scanner::Location function_name_location, |
507 bool name_is_strict_reserved, int pos, | 506 bool name_is_strict_reserved, int pos, |
508 bool* ok); | 507 bool* ok); |
509 | 508 |
510 // Checks if the expression is a valid reference expression (e.g., on the | 509 // Checks if the expression is a valid reference expression (e.g., on the |
511 // left-hand side of assignments). Although ruled out by ECMA as early errors, | 510 // left-hand side of assignments). Although ruled out by ECMA as early errors, |
512 // we allow calls for web compatibility and rewrite them to a runtime throw. | 511 // we allow calls for web compatibility and rewrite them to a runtime throw. |
513 ExpressionT CheckAndRewriteReferenceExpression( | 512 ExpressionT CheckAndRewriteReferenceExpression( |
514 ExpressionT expression, | 513 ExpressionT expression, |
515 Scanner::Location location, const char* message, bool* ok); | 514 Scanner::Location location, const char* message, bool* ok); |
516 | 515 |
517 // Used to detect duplicates in object literals. Each of the values | 516 // Used to detect duplicates in object literals. Each of the values |
518 // kGetterProperty, kSetterProperty and kValueProperty represents | 517 // kGetterProperty, kSetterProperty and kValueProperty represents |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 FunctionLiteral::FunctionType function_type, | 1079 FunctionLiteral::FunctionType function_type, |
1081 FunctionLiteral::IsFunctionFlag is_function, | 1080 FunctionLiteral::IsFunctionFlag is_function, |
1082 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, | 1081 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, |
1083 int position) { | 1082 int position) { |
1084 return PreParserExpression::Default(); | 1083 return PreParserExpression::Default(); |
1085 } | 1084 } |
1086 PreParserExpression NewClassLiteral(PreParserIdentifier name, | 1085 PreParserExpression NewClassLiteral(PreParserIdentifier name, |
1087 PreParserExpression extends, | 1086 PreParserExpression extends, |
1088 PreParserExpression constructor, | 1087 PreParserExpression constructor, |
1089 PreParserExpressionList properties, | 1088 PreParserExpressionList properties, |
1090 AstValueFactory* ast_value_factory, | |
1091 int position) { | 1089 int position) { |
1092 return PreParserExpression::Default(); | 1090 return PreParserExpression::Default(); |
1093 } | 1091 } |
1094 | 1092 |
1095 // Return the object itself as AstVisitor and implement the needed | 1093 // Return the object itself as AstVisitor and implement the needed |
1096 // dummy method right in this class. | 1094 // dummy method right in this class. |
1097 PreParserFactory* visitor() { return this; } | 1095 PreParserFactory* visitor() { return this; } |
1098 BailoutReason dont_optimize_reason() { return kNoReason; } | 1096 BailoutReason dont_optimize_reason() { return kNoReason; } |
1099 int* ast_properties() { | 1097 int* ast_properties() { |
1100 static int dummy = 42; | 1098 static int dummy = 42; |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 } | 1278 } |
1281 static PreParserExpression EmptyLiteral() { | 1279 static PreParserExpression EmptyLiteral() { |
1282 return PreParserExpression::Default(); | 1280 return PreParserExpression::Default(); |
1283 } | 1281 } |
1284 static PreParserExpression EmptyObjectLiteralProperty() { | 1282 static PreParserExpression EmptyObjectLiteralProperty() { |
1285 return PreParserExpression::Default(); | 1283 return PreParserExpression::Default(); |
1286 } | 1284 } |
1287 static PreParserExpression EmptyFunctionLiteral() { | 1285 static PreParserExpression EmptyFunctionLiteral() { |
1288 return PreParserExpression::Default(); | 1286 return PreParserExpression::Default(); |
1289 } | 1287 } |
1290 static PreParserExpression EmptyClassLiteral() { | |
1291 return PreParserExpression::Default(); | |
1292 } | |
1293 static PreParserExpressionList NullExpressionList() { | 1288 static PreParserExpressionList NullExpressionList() { |
1294 return PreParserExpressionList(); | 1289 return PreParserExpressionList(); |
1295 } | 1290 } |
1296 | 1291 |
1297 // Odd-ball literal creators. | 1292 // Odd-ball literal creators. |
1298 static PreParserExpression GetLiteralTheHole(int position, | 1293 static PreParserExpression GetLiteralTheHole(int position, |
1299 PreParserFactory* factory) { | 1294 PreParserFactory* factory) { |
1300 return PreParserExpression::Default(); | 1295 return PreParserExpression::Default(); |
1301 } | 1296 } |
1302 | 1297 |
1303 // Producing data during the recursive descent. | 1298 // Producing data during the recursive descent. |
1304 PreParserIdentifier GetSymbol(Scanner* scanner); | 1299 PreParserIdentifier GetSymbol(Scanner* scanner); |
1305 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); | 1300 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); |
1306 | 1301 |
1307 static PreParserIdentifier GetNextSymbol(Scanner* scanner) { | 1302 static PreParserIdentifier GetNextSymbol(Scanner* scanner) { |
1308 return PreParserIdentifier::Default(); | 1303 return PreParserIdentifier::Default(); |
1309 } | 1304 } |
1310 | 1305 |
1311 static PreParserExpression ThisExpression(PreParserScope* scope, | 1306 static PreParserExpression ThisExpression(PreParserScope* scope, |
1312 PreParserFactory* factory) { | 1307 PreParserFactory* factory) { |
1313 return PreParserExpression::This(); | 1308 return PreParserExpression::This(); |
1314 } | 1309 } |
1315 | 1310 |
1316 static PreParserExpression SuperReference(PreParserScope* scope, | 1311 static PreParserExpression SuperReference(PreParserScope* scope, |
1317 PreParserFactory* factory) { | 1312 PreParserFactory* factory) { |
1318 return PreParserExpression::Super(); | 1313 return PreParserExpression::Super(); |
1319 } | 1314 } |
1320 | 1315 |
| 1316 static PreParserExpression ClassLiteral(PreParserIdentifier name, |
| 1317 PreParserExpression extends, |
| 1318 PreParserExpression constructor, |
| 1319 PreParserExpressionList properties, |
| 1320 int position, |
| 1321 PreParserFactory* factory) { |
| 1322 return PreParserExpression::Default(); |
| 1323 } |
| 1324 |
1321 static PreParserExpression ExpressionFromLiteral( | 1325 static PreParserExpression ExpressionFromLiteral( |
1322 Token::Value token, int pos, Scanner* scanner, | 1326 Token::Value token, int pos, Scanner* scanner, |
1323 PreParserFactory* factory) { | 1327 PreParserFactory* factory) { |
1324 return PreParserExpression::Default(); | 1328 return PreParserExpression::Default(); |
1325 } | 1329 } |
1326 | 1330 |
1327 static PreParserExpression ExpressionFromIdentifier( | 1331 static PreParserExpression ExpressionFromIdentifier( |
1328 PreParserIdentifier name, int pos, PreParserScope* scope, | 1332 PreParserIdentifier name, int pos, PreParserScope* scope, |
1329 PreParserFactory* factory) { | 1333 PreParserFactory* factory) { |
1330 return PreParserExpression::FromIdentifier(name); | 1334 return PreParserExpression::FromIdentifier(name); |
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2706 function_literal->set_ast_properties(&ast_properties); | 2710 function_literal->set_ast_properties(&ast_properties); |
2707 function_literal->set_dont_optimize_reason(dont_optimize_reason); | 2711 function_literal->set_dont_optimize_reason(dont_optimize_reason); |
2708 | 2712 |
2709 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); | 2713 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); |
2710 | 2714 |
2711 return function_literal; | 2715 return function_literal; |
2712 } | 2716 } |
2713 | 2717 |
2714 | 2718 |
2715 template <class Traits> | 2719 template <class Traits> |
2716 typename ParserBase<Traits>::ClassLiteralT | 2720 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseClassLiteral( |
2717 ParserBase<Traits>::ParseClassLiteral(IdentifierT name, | 2721 IdentifierT name, Scanner::Location class_name_location, |
2718 Scanner::Location class_name_location, | 2722 bool name_is_strict_reserved, int pos, bool* ok) { |
2719 bool name_is_strict_reserved, int pos, | |
2720 bool* ok) { | |
2721 // All parts of a ClassDeclaration or a ClassExpression are strict code. | 2723 // All parts of a ClassDeclaration or a ClassExpression are strict code. |
2722 if (name_is_strict_reserved) { | 2724 if (name_is_strict_reserved) { |
2723 ReportMessageAt(class_name_location, "unexpected_strict_reserved"); | 2725 ReportMessageAt(class_name_location, "unexpected_strict_reserved"); |
2724 *ok = false; | 2726 *ok = false; |
2725 return this->EmptyClassLiteral(); | 2727 return this->EmptyExpression(); |
2726 } | 2728 } |
2727 if (this->IsEvalOrArguments(name)) { | 2729 if (this->IsEvalOrArguments(name)) { |
2728 ReportMessageAt(class_name_location, "strict_eval_arguments"); | 2730 ReportMessageAt(class_name_location, "strict_eval_arguments"); |
2729 *ok = false; | 2731 *ok = false; |
2730 return this->EmptyClassLiteral(); | 2732 return this->EmptyExpression(); |
2731 } | 2733 } |
2732 | 2734 |
2733 // TODO(arv): Implement scopes and name binding in class body only. | 2735 // TODO(arv): Implement scopes and name binding in class body only. |
2734 // TODO(arv): Maybe add CLASS_SCOPE? | 2736 // TODO(arv): Maybe add CLASS_SCOPE? |
2735 typename Traits::Type::ScopePtr extends_scope = | 2737 typename Traits::Type::ScopePtr extends_scope = |
2736 this->NewScope(scope_, BLOCK_SCOPE); | 2738 this->NewScope(scope_, BLOCK_SCOPE); |
2737 FunctionState extends_function_state( | 2739 FunctionState extends_function_state( |
2738 &function_state_, &scope_, &extends_scope, zone(), | 2740 &function_state_, &scope_, &extends_scope, zone(), |
2739 this->ast_value_factory(), ast_node_id_gen_); | 2741 this->ast_value_factory(), ast_node_id_gen_); |
2740 scope_->SetStrictMode(STRICT); | 2742 scope_->SetStrictMode(STRICT); |
2741 scope_->SetScopeName(name); | 2743 scope_->SetScopeName(name); |
2742 | 2744 |
2743 ExpressionT extends = this->EmptyExpression(); | 2745 ExpressionT extends = this->EmptyExpression(); |
2744 if (Check(Token::EXTENDS)) { | 2746 if (Check(Token::EXTENDS)) { |
2745 extends = | 2747 extends = this->ParseLeftHandSideExpression(CHECK_OK); |
2746 this->ParseLeftHandSideExpression(CHECK_OK_CUSTOM(EmptyClassLiteral)); | |
2747 } | 2748 } |
2748 | 2749 |
2749 ObjectLiteralChecker checker(this, STRICT); | 2750 ObjectLiteralChecker checker(this, STRICT); |
2750 typename Traits::Type::PropertyList properties = | 2751 typename Traits::Type::PropertyList properties = |
2751 this->NewPropertyList(4, zone_); | 2752 this->NewPropertyList(4, zone_); |
2752 FunctionLiteralT constructor = this->EmptyFunctionLiteral(); | 2753 FunctionLiteralT constructor = this->EmptyFunctionLiteral(); |
2753 | 2754 |
2754 Expect(Token::LBRACE, CHECK_OK_CUSTOM(EmptyClassLiteral)); | 2755 Expect(Token::LBRACE, CHECK_OK); |
2755 while (peek() != Token::RBRACE) { | 2756 while (peek() != Token::RBRACE) { |
2756 if (Check(Token::SEMICOLON)) continue; | 2757 if (Check(Token::SEMICOLON)) continue; |
2757 if (fni_ != NULL) fni_->Enter(); | 2758 if (fni_ != NULL) fni_->Enter(); |
2758 | 2759 |
2759 const bool in_class = true; | 2760 const bool in_class = true; |
2760 const bool is_static = false; | 2761 const bool is_static = false; |
2761 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | 2762 ObjectLiteralPropertyT property = |
2762 &checker, in_class, is_static, CHECK_OK_CUSTOM(EmptyClassLiteral)); | 2763 this->ParsePropertyDefinition(&checker, in_class, is_static, CHECK_OK); |
2763 | 2764 |
2764 properties->Add(property, zone()); | 2765 properties->Add(property, zone()); |
2765 | 2766 |
2766 if (fni_ != NULL) { | 2767 if (fni_ != NULL) { |
2767 fni_->Infer(); | 2768 fni_->Infer(); |
2768 fni_->Leave(); | 2769 fni_->Leave(); |
2769 } | 2770 } |
2770 } | 2771 } |
2771 Expect(Token::RBRACE, CHECK_OK_CUSTOM(EmptyClassLiteral)); | 2772 Expect(Token::RBRACE, CHECK_OK); |
2772 | 2773 |
2773 return factory()->NewClassLiteral(name, extends, constructor, properties, | 2774 return this->ClassLiteral(name, extends, constructor, properties, pos, |
2774 this->ast_value_factory(), pos); | 2775 factory()); |
2775 } | 2776 } |
2776 | 2777 |
2777 | 2778 |
2778 template <typename Traits> | 2779 template <typename Traits> |
2779 typename ParserBase<Traits>::ExpressionT | 2780 typename ParserBase<Traits>::ExpressionT |
2780 ParserBase<Traits>::CheckAndRewriteReferenceExpression( | 2781 ParserBase<Traits>::CheckAndRewriteReferenceExpression( |
2781 ExpressionT expression, | 2782 ExpressionT expression, |
2782 Scanner::Location location, const char* message, bool* ok) { | 2783 Scanner::Location location, const char* message, bool* ok) { |
2783 if (strict_mode() == STRICT && this->IsIdentifier(expression) && | 2784 if (strict_mode() == STRICT && this->IsIdentifier(expression) && |
2784 this->IsEvalOrArguments(this->AsIdentifier(expression))) { | 2785 this->IsEvalOrArguments(this->AsIdentifier(expression))) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2827 DCHECK(IsAccessorAccessorConflict(old_type, type)); | 2828 DCHECK(IsAccessorAccessorConflict(old_type, type)); |
2828 // Both accessors of the same type. | 2829 // Both accessors of the same type. |
2829 parser()->ReportMessage("accessor_get_set"); | 2830 parser()->ReportMessage("accessor_get_set"); |
2830 } | 2831 } |
2831 *ok = false; | 2832 *ok = false; |
2832 } | 2833 } |
2833 } | 2834 } |
2834 } } // v8::internal | 2835 } } // v8::internal |
2835 | 2836 |
2836 #endif // V8_PREPARSER_H | 2837 #endif // V8_PREPARSER_H |
OLD | NEW |