| 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/base/hashmap.h" | 10 #include "src/base/hashmap.h" | 
| (...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1008                                                   bool* is_strict_reserved, | 1008                                                   bool* is_strict_reserved, | 
| 1009                                                   bool* ok); | 1009                                                   bool* ok); | 
| 1010   IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, | 1010   IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, | 
| 1011                                                   bool* ok) { | 1011                                                   bool* ok) { | 
| 1012     return ParseIdentifierOrStrictReservedWord(this->is_generator(), | 1012     return ParseIdentifierOrStrictReservedWord(this->is_generator(), | 
| 1013                                                is_strict_reserved, ok); | 1013                                                is_strict_reserved, ok); | 
| 1014   } | 1014   } | 
| 1015 | 1015 | 
| 1016   IdentifierT ParseIdentifierName(bool* ok); | 1016   IdentifierT ParseIdentifierName(bool* ok); | 
| 1017 | 1017 | 
| 1018   ExpressionT ParseRegExpLiteral(bool seen_equal, | 1018   ExpressionT ParseRegExpLiteral(bool seen_equal, bool* ok); | 
| 1019                                  ExpressionClassifier* classifier, bool* ok); |  | 
| 1020 | 1019 | 
| 1021   ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, | 1020   ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, | 
| 1022                                      bool* is_async, bool* ok); | 1021                                      bool* is_async, bool* ok); | 
| 1023   ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, | 1022   ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, | 
| 1024                                      bool* ok) { | 1023                                      bool* ok) { | 
| 1025     bool is_async; | 1024     bool is_async; | 
| 1026     return ParsePrimaryExpression(classifier, &is_async, ok); | 1025     return ParsePrimaryExpression(classifier, &is_async, ok); | 
| 1027   } | 1026   } | 
| 1028   ExpressionT ParseExpression(bool accept_IN, bool* ok); | 1027   ExpressionT ParseExpression(bool accept_IN, bool* ok); | 
| 1029   ExpressionT ParseExpression(bool accept_IN, ExpressionClassifier* classifier, | 1028   ExpressionT ParseExpression(bool accept_IN, ExpressionClassifier* classifier, | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1071       ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, | 1070       ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, | 
| 1072       bool* ok); | 1071       bool* ok); | 
| 1073   ExpressionT ParseArrowFunctionLiteral(bool accept_IN, | 1072   ExpressionT ParseArrowFunctionLiteral(bool accept_IN, | 
| 1074                                         const FormalParametersT& parameters, | 1073                                         const FormalParametersT& parameters, | 
| 1075                                         bool is_async, | 1074                                         bool is_async, | 
| 1076                                         const ExpressionClassifier& classifier, | 1075                                         const ExpressionClassifier& classifier, | 
| 1077                                         bool* ok); | 1076                                         bool* ok); | 
| 1078   ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, | 1077   ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, | 
| 1079                                    ExpressionClassifier* classifier, bool* ok); | 1078                                    ExpressionClassifier* classifier, bool* ok); | 
| 1080   void AddTemplateExpression(ExpressionT); | 1079   void AddTemplateExpression(ExpressionT); | 
| 1081   ExpressionT ParseSuperExpression(bool is_new, | 1080   ExpressionT ParseSuperExpression(bool is_new, bool* ok); | 
| 1082                                    ExpressionClassifier* classifier, bool* ok); |  | 
| 1083   ExpressionT ParseNewTargetExpression(bool* ok); | 1081   ExpressionT ParseNewTargetExpression(bool* ok); | 
| 1084 | 1082 | 
| 1085   void ParseFormalParameter(FormalParametersT* parameters, | 1083   void ParseFormalParameter(FormalParametersT* parameters, | 
| 1086                             ExpressionClassifier* classifier, bool* ok); | 1084                             ExpressionClassifier* classifier, bool* ok); | 
| 1087   void ParseFormalParameterList(FormalParametersT* parameters, | 1085   void ParseFormalParameterList(FormalParametersT* parameters, | 
| 1088                                 ExpressionClassifier* classifier, bool* ok); | 1086                                 ExpressionClassifier* classifier, bool* ok); | 
| 1089   void CheckArityRestrictions(int param_count, FunctionKind function_type, | 1087   void CheckArityRestrictions(int param_count, FunctionKind function_type, | 
| 1090                               bool has_rest, int formals_start_pos, | 1088                               bool has_rest, int formals_start_pos, | 
| 1091                               int formals_end_pos, bool* ok); | 1089                               int formals_end_pos, bool* ok); | 
| 1092 | 1090 | 
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1452     this->ReportUnexpectedToken(next); | 1450     this->ReportUnexpectedToken(next); | 
| 1453     *ok = false; | 1451     *ok = false; | 
| 1454     return Traits::EmptyIdentifier(); | 1452     return Traits::EmptyIdentifier(); | 
| 1455   } | 1453   } | 
| 1456 | 1454 | 
| 1457   IdentifierT name = this->GetSymbol(scanner()); | 1455   IdentifierT name = this->GetSymbol(scanner()); | 
| 1458   if (this->IsArguments(name)) scope()->RecordArgumentsUsage(); | 1456   if (this->IsArguments(name)) scope()->RecordArgumentsUsage(); | 
| 1459   return name; | 1457   return name; | 
| 1460 } | 1458 } | 
| 1461 | 1459 | 
| 1462 |  | 
| 1463 template <class Traits> | 1460 template <class Traits> | 
| 1464 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral( | 1461 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral( | 
| 1465     bool seen_equal, ExpressionClassifier* classifier, bool* ok) { | 1462     bool seen_equal, bool* ok) { | 
| 1466   int pos = peek_position(); | 1463   int pos = peek_position(); | 
| 1467   if (!scanner()->ScanRegExpPattern(seen_equal)) { | 1464   if (!scanner()->ScanRegExpPattern(seen_equal)) { | 
| 1468     Next(); | 1465     Next(); | 
| 1469     ReportMessage(MessageTemplate::kUnterminatedRegExp); | 1466     ReportMessage(MessageTemplate::kUnterminatedRegExp); | 
| 1470     *ok = false; | 1467     *ok = false; | 
| 1471     return Traits::EmptyExpression(); | 1468     return Traits::EmptyExpression(); | 
| 1472   } | 1469   } | 
| 1473 | 1470 | 
| 1474   int literal_index = function_state_->NextMaterializedLiteralIndex(); | 1471   int literal_index = function_state_->NextMaterializedLiteralIndex(); | 
| 1475 | 1472 | 
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1551 | 1548 | 
| 1552     case Token::STRING: { | 1549     case Token::STRING: { | 
| 1553       BindingPatternUnexpectedToken(classifier); | 1550       BindingPatternUnexpectedToken(classifier); | 
| 1554       Consume(Token::STRING); | 1551       Consume(Token::STRING); | 
| 1555       return this->ExpressionFromString(beg_pos, scanner(), factory()); | 1552       return this->ExpressionFromString(beg_pos, scanner(), factory()); | 
| 1556     } | 1553     } | 
| 1557 | 1554 | 
| 1558     case Token::ASSIGN_DIV: | 1555     case Token::ASSIGN_DIV: | 
| 1559       classifier->RecordBindingPatternError( | 1556       classifier->RecordBindingPatternError( | 
| 1560           scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 1557           scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 
| 1561       return this->ParseRegExpLiteral(true, classifier, ok); | 1558       return this->ParseRegExpLiteral(true, ok); | 
| 1562 | 1559 | 
| 1563     case Token::DIV: | 1560     case Token::DIV: | 
| 1564       classifier->RecordBindingPatternError( | 1561       classifier->RecordBindingPatternError( | 
| 1565           scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 1562           scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 
| 1566       return this->ParseRegExpLiteral(false, classifier, ok); | 1563       return this->ParseRegExpLiteral(false, ok); | 
| 1567 | 1564 | 
| 1568     case Token::LBRACK: | 1565     case Token::LBRACK: | 
| 1569       return this->ParseArrayLiteral(classifier, ok); | 1566       return this->ParseArrayLiteral(classifier, ok); | 
| 1570 | 1567 | 
| 1571     case Token::LBRACE: | 1568     case Token::LBRACE: | 
| 1572       return this->ParseObjectLiteral(classifier, ok); | 1569       return this->ParseObjectLiteral(classifier, ok); | 
| 1573 | 1570 | 
| 1574     case Token::LPAREN: { | 1571     case Token::LPAREN: { | 
| 1575       // Arrow function formal parameters are either a single identifier or a | 1572       // Arrow function formal parameters are either a single identifier or a | 
| 1576       // list of BindingPattern productions enclosed in parentheses. | 1573       // list of BindingPattern productions enclosed in parentheses. | 
| (...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2946   // new new foo().bar().baz means (new (new foo()).bar()).baz | 2943   // new new foo().bar().baz means (new (new foo()).bar()).baz | 
| 2947 | 2944 | 
| 2948   if (peek() == Token::NEW) { | 2945   if (peek() == Token::NEW) { | 
| 2949     BindingPatternUnexpectedToken(classifier); | 2946     BindingPatternUnexpectedToken(classifier); | 
| 2950     ArrowFormalParametersUnexpectedToken(classifier); | 2947     ArrowFormalParametersUnexpectedToken(classifier); | 
| 2951     Consume(Token::NEW); | 2948     Consume(Token::NEW); | 
| 2952     int new_pos = position(); | 2949     int new_pos = position(); | 
| 2953     ExpressionT result; | 2950     ExpressionT result; | 
| 2954     if (peek() == Token::SUPER) { | 2951     if (peek() == Token::SUPER) { | 
| 2955       const bool is_new = true; | 2952       const bool is_new = true; | 
| 2956       result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 2953       result = ParseSuperExpression(is_new, CHECK_OK); | 
| 2957     } else if (peek() == Token::PERIOD) { | 2954     } else if (peek() == Token::PERIOD) { | 
| 2958       return ParseNewTargetExpression(CHECK_OK); | 2955       return ParseNewTargetExpression(CHECK_OK); | 
| 2959     } else { | 2956     } else { | 
| 2960       result = this->ParseMemberWithNewPrefixesExpression(classifier, is_async, | 2957       result = this->ParseMemberWithNewPrefixesExpression(classifier, is_async, | 
| 2961                                                           CHECK_OK); | 2958                                                           CHECK_OK); | 
| 2962     } | 2959     } | 
| 2963     Traits::RewriteNonPattern(classifier, CHECK_OK); | 2960     Traits::RewriteNonPattern(classifier, CHECK_OK); | 
| 2964     if (peek() == Token::LPAREN) { | 2961     if (peek() == Token::LPAREN) { | 
| 2965       // NewExpression with arguments. | 2962       // NewExpression with arguments. | 
| 2966       Scanner::Location spread_pos; | 2963       Scanner::Location spread_pos; | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3037     } | 3034     } | 
| 3038     result = this->ParseFunctionLiteral( | 3035     result = this->ParseFunctionLiteral( | 
| 3039         name, function_name_location, | 3036         name, function_name_location, | 
| 3040         is_strict_reserved_name ? kFunctionNameIsStrictReserved | 3037         is_strict_reserved_name ? kFunctionNameIsStrictReserved | 
| 3041                                 : kFunctionNameValidityUnknown, | 3038                                 : kFunctionNameValidityUnknown, | 
| 3042         is_generator ? FunctionKind::kGeneratorFunction | 3039         is_generator ? FunctionKind::kGeneratorFunction | 
| 3043                      : FunctionKind::kNormalFunction, | 3040                      : FunctionKind::kNormalFunction, | 
| 3044         function_token_position, function_type, language_mode(), CHECK_OK); | 3041         function_token_position, function_type, language_mode(), CHECK_OK); | 
| 3045   } else if (peek() == Token::SUPER) { | 3042   } else if (peek() == Token::SUPER) { | 
| 3046     const bool is_new = false; | 3043     const bool is_new = false; | 
| 3047     result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 3044     result = ParseSuperExpression(is_new, CHECK_OK); | 
| 3048   } else { | 3045   } else { | 
| 3049     result = ParsePrimaryExpression(classifier, is_async, CHECK_OK); | 3046     result = ParsePrimaryExpression(classifier, is_async, CHECK_OK); | 
| 3050   } | 3047   } | 
| 3051 | 3048 | 
| 3052   result = | 3049   result = | 
| 3053       ParseMemberExpressionContinuation(result, is_async, classifier, CHECK_OK); | 3050       ParseMemberExpressionContinuation(result, is_async, classifier, CHECK_OK); | 
| 3054   return result; | 3051   return result; | 
| 3055 } | 3052 } | 
| 3056 | 3053 | 
| 3057 |  | 
| 3058 template <class Traits> | 3054 template <class Traits> | 
| 3059 typename ParserBase<Traits>::ExpressionT | 3055 typename ParserBase<Traits>::ExpressionT | 
| 3060 ParserBase<Traits>::ParseSuperExpression(bool is_new, | 3056 ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { | 
| 3061                                          ExpressionClassifier* classifier, |  | 
| 3062                                          bool* ok) { |  | 
| 3063   Expect(Token::SUPER, CHECK_OK); | 3057   Expect(Token::SUPER, CHECK_OK); | 
| 3064   int pos = position(); | 3058   int pos = position(); | 
| 3065 | 3059 | 
| 3066   Scope* scope = this->scope()->ReceiverScope(); | 3060   Scope* scope = this->scope()->ReceiverScope(); | 
| 3067   FunctionKind kind = scope->function_kind(); | 3061   FunctionKind kind = scope->function_kind(); | 
| 3068   if (IsConciseMethod(kind) || IsAccessorFunction(kind) || | 3062   if (IsConciseMethod(kind) || IsAccessorFunction(kind) || | 
| 3069       IsClassConstructor(kind)) { | 3063       IsClassConstructor(kind)) { | 
| 3070     if (peek() == Token::PERIOD || peek() == Token::LBRACK) { | 3064     if (peek() == Token::PERIOD || peek() == Token::LBRACK) { | 
| 3071       scope->RecordSuperPropertyUsage(); | 3065       scope->RecordSuperPropertyUsage(); | 
| 3072       return this->NewSuperPropertyReference(this->scope(), factory(), pos); | 3066       return this->NewSuperPropertyReference(this->scope(), factory(), pos); | 
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3660     has_seen_constructor_ = true; | 3654     has_seen_constructor_ = true; | 
| 3661     return; | 3655     return; | 
| 3662   } | 3656   } | 
| 3663 } | 3657 } | 
| 3664 | 3658 | 
| 3665 | 3659 | 
| 3666 }  // namespace internal | 3660 }  // namespace internal | 
| 3667 }  // namespace v8 | 3661 }  // namespace v8 | 
| 3668 | 3662 | 
| 3669 #endif  // V8_PARSING_PARSER_BASE_H | 3663 #endif  // V8_PARSING_PARSER_BASE_H | 
| OLD | NEW | 
|---|