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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 // typedef GeneratorVariable; | 44 // typedef GeneratorVariable; |
45 // // Return types for traversing functions. | 45 // // Return types for traversing functions. |
46 // typedef Identifier; | 46 // typedef Identifier; |
47 // typedef Expression; | 47 // typedef Expression; |
48 // typedef FunctionLiteral; | 48 // typedef FunctionLiteral; |
49 // typedef ClassLiteral; | 49 // typedef ClassLiteral; |
50 // typedef ObjectLiteralProperty; | 50 // typedef ObjectLiteralProperty; |
51 // typedef Literal; | 51 // typedef Literal; |
52 // typedef ExpressionList; | 52 // typedef ExpressionList; |
53 // typedef PropertyList; | 53 // typedef PropertyList; |
| 54 // typedef FormalParameter; |
| 55 // typedef FormalParameterList; |
54 // // For constructing objects returned by the traversing functions. | 56 // // For constructing objects returned by the traversing functions. |
55 // typedef Factory; | 57 // typedef Factory; |
56 // }; | 58 // }; |
57 // // ... | 59 // // ... |
58 // }; | 60 // }; |
59 | 61 |
60 template <typename Traits> | 62 template <typename Traits> |
61 class ParserBase : public Traits { | 63 class ParserBase : public Traits { |
62 public: | 64 public: |
63 // Shorten type names defined by Traits. | 65 // Shorten type names defined by Traits. |
64 typedef typename Traits::Type::Expression ExpressionT; | 66 typedef typename Traits::Type::Expression ExpressionT; |
65 typedef typename Traits::Type::Identifier IdentifierT; | 67 typedef typename Traits::Type::Identifier IdentifierT; |
| 68 typedef typename Traits::Type::FormalParameter FormalParameterT; |
| 69 typedef typename Traits::Type::FormalParameterList FormalParameterListT; |
66 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; | 70 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; |
67 typedef typename Traits::Type::Literal LiteralT; | 71 typedef typename Traits::Type::Literal LiteralT; |
68 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; | 72 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; |
69 | 73 |
70 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 74 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, |
71 v8::Extension* extension, AstValueFactory* ast_value_factory, | 75 v8::Extension* extension, AstValueFactory* ast_value_factory, |
72 ParserRecorder* log, typename Traits::Type::Parser this_object) | 76 ParserRecorder* log, typename Traits::Type::Parser this_object) |
73 : Traits(this_object), | 77 : Traits(this_object), |
74 parenthesized_function_(false), | 78 parenthesized_function_(false), |
75 scope_(NULL), | 79 scope_(NULL), |
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); | 603 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); |
600 ExpressionT ParseMemberExpression(bool* ok); | 604 ExpressionT ParseMemberExpression(bool* ok); |
601 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, | 605 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, |
602 bool* ok); | 606 bool* ok); |
603 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, | 607 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, |
604 bool* ok); | 608 bool* ok); |
605 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); | 609 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); |
606 void AddTemplateExpression(ExpressionT); | 610 void AddTemplateExpression(ExpressionT); |
607 ExpressionT ParseSuperExpression(bool is_new, bool* ok); | 611 ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
608 | 612 |
| 613 FormalParameterT ParseFormalParameter(DuplicateFinder* duplicate_finder, |
| 614 Scanner::Location* eval_args_error_loc, |
| 615 Scanner::Location* undefined_error_loc, |
| 616 Scanner::Location* dupe_error_loc, |
| 617 Scanner::Location* reserved_error_loc, |
| 618 bool* ok); |
| 619 FormalParameterListT ParseFormalParameterList( |
| 620 Scanner::Location* eval_args_error_loc, |
| 621 Scanner::Location* undefined_error_loc, Scanner::Location* dupe_error_loc, |
| 622 Scanner::Location* reserved_error_loc, bool* is_rest, bool* ok); |
| 623 void CheckArityRestrictions( |
| 624 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
| 625 int formals_start_pos, int formals_end_pos, bool* ok); |
| 626 |
609 // Checks if the expression is a valid reference expression (e.g., on the | 627 // Checks if the expression is a valid reference expression (e.g., on the |
610 // left-hand side of assignments). Although ruled out by ECMA as early errors, | 628 // left-hand side of assignments). Although ruled out by ECMA as early errors, |
611 // we allow calls for web compatibility and rewrite them to a runtime throw. | 629 // we allow calls for web compatibility and rewrite them to a runtime throw. |
612 ExpressionT CheckAndRewriteReferenceExpression( | 630 ExpressionT CheckAndRewriteReferenceExpression( |
613 ExpressionT expression, | 631 ExpressionT expression, |
614 Scanner::Location location, const char* message, bool* ok); | 632 Scanner::Location location, const char* message, bool* ok); |
615 | 633 |
616 // Used to validate property names in object literals and class literals | 634 // Used to validate property names in object literals and class literals |
617 enum PropertyKind { | 635 enum PropertyKind { |
618 kAccessorProperty, | 636 kAccessorProperty, |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseStrongField; | 1051 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseStrongField; |
1034 typedef BitField<ValidArrowParam, ParenthesizationField::kNext, 2> | 1052 typedef BitField<ValidArrowParam, ParenthesizationField::kNext, 2> |
1035 IsValidArrowParamListField; | 1053 IsValidArrowParamListField; |
1036 typedef BitField<PreParserIdentifier::Type, ParenthesizationField::kNext, 10> | 1054 typedef BitField<PreParserIdentifier::Type, ParenthesizationField::kNext, 10> |
1037 IdentifierTypeField; | 1055 IdentifierTypeField; |
1038 | 1056 |
1039 uint32_t code_; | 1057 uint32_t code_; |
1040 }; | 1058 }; |
1041 | 1059 |
1042 | 1060 |
1043 // PreParserExpressionList doesn't actually store the expressions because | 1061 // The pre-parser doesn't need to build lists of expressions, identifiers, or |
1044 // PreParser doesn't need to. | 1062 // the like. |
1045 class PreParserExpressionList { | 1063 template <typename T> |
| 1064 class PreParserList { |
1046 public: | 1065 public: |
1047 // These functions make list->Add(some_expression) work (and do nothing). | 1066 // These functions make list->Add(some_expression) work (and do nothing). |
1048 PreParserExpressionList() : length_(0) {} | 1067 PreParserList() : length_(0) {} |
1049 PreParserExpressionList* operator->() { return this; } | 1068 PreParserList* operator->() { return this; } |
1050 void Add(PreParserExpression, void*) { ++length_; } | 1069 void Add(T, void*) { ++length_; } |
1051 int length() const { return length_; } | 1070 int length() const { return length_; } |
1052 private: | 1071 private: |
1053 int length_; | 1072 int length_; |
1054 }; | 1073 }; |
1055 | 1074 |
1056 | 1075 |
| 1076 typedef PreParserList<PreParserExpression> PreParserExpressionList; |
| 1077 typedef PreParserList<PreParserIdentifier> PreParserFormalParameterList; |
| 1078 |
| 1079 |
1057 class PreParserStatement { | 1080 class PreParserStatement { |
1058 public: | 1081 public: |
1059 static PreParserStatement Default() { | 1082 static PreParserStatement Default() { |
1060 return PreParserStatement(kUnknownStatement); | 1083 return PreParserStatement(kUnknownStatement); |
1061 } | 1084 } |
1062 | 1085 |
1063 static PreParserStatement FunctionDeclaration() { | 1086 static PreParserStatement FunctionDeclaration() { |
1064 return PreParserStatement(kFunctionDeclaration); | 1087 return PreParserStatement(kFunctionDeclaration); |
1065 } | 1088 } |
1066 | 1089 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 kUseStrictExpressionStatement, | 1125 kUseStrictExpressionStatement, |
1103 kUseStrongExpressionStatement, | 1126 kUseStrongExpressionStatement, |
1104 kFunctionDeclaration | 1127 kFunctionDeclaration |
1105 }; | 1128 }; |
1106 | 1129 |
1107 explicit PreParserStatement(Type code) : code_(code) {} | 1130 explicit PreParserStatement(Type code) : code_(code) {} |
1108 Type code_; | 1131 Type code_; |
1109 }; | 1132 }; |
1110 | 1133 |
1111 | 1134 |
1112 | 1135 typedef PreParserList<PreParserStatement> PreParserStatementList; |
1113 // PreParserStatementList doesn't actually store the statements because | |
1114 // the PreParser does not need them. | |
1115 class PreParserStatementList { | |
1116 public: | |
1117 // These functions make list->Add(some_expression) work as no-ops. | |
1118 PreParserStatementList() {} | |
1119 PreParserStatementList* operator->() { return this; } | |
1120 void Add(PreParserStatement, void*) {} | |
1121 }; | |
1122 | 1136 |
1123 | 1137 |
1124 class PreParserFactory { | 1138 class PreParserFactory { |
1125 public: | 1139 public: |
1126 explicit PreParserFactory(void* unused_value_factory) {} | 1140 explicit PreParserFactory(void* unused_value_factory) {} |
1127 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, | 1141 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, |
1128 int pos) { | 1142 int pos) { |
1129 return PreParserExpression::Default(); | 1143 return PreParserExpression::Default(); |
1130 } | 1144 } |
1131 PreParserExpression NewNumberLiteral(double number, | 1145 PreParserExpression NewNumberLiteral(double number, |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 // Return types for traversing functions. | 1290 // Return types for traversing functions. |
1277 typedef PreParserIdentifier Identifier; | 1291 typedef PreParserIdentifier Identifier; |
1278 typedef PreParserExpression Expression; | 1292 typedef PreParserExpression Expression; |
1279 typedef PreParserExpression YieldExpression; | 1293 typedef PreParserExpression YieldExpression; |
1280 typedef PreParserExpression FunctionLiteral; | 1294 typedef PreParserExpression FunctionLiteral; |
1281 typedef PreParserExpression ClassLiteral; | 1295 typedef PreParserExpression ClassLiteral; |
1282 typedef PreParserExpression ObjectLiteralProperty; | 1296 typedef PreParserExpression ObjectLiteralProperty; |
1283 typedef PreParserExpression Literal; | 1297 typedef PreParserExpression Literal; |
1284 typedef PreParserExpressionList ExpressionList; | 1298 typedef PreParserExpressionList ExpressionList; |
1285 typedef PreParserExpressionList PropertyList; | 1299 typedef PreParserExpressionList PropertyList; |
| 1300 typedef PreParserIdentifier FormalParameter; |
| 1301 typedef PreParserFormalParameterList FormalParameterList; |
1286 typedef PreParserStatementList StatementList; | 1302 typedef PreParserStatementList StatementList; |
1287 | 1303 |
1288 // For constructing objects returned by the traversing functions. | 1304 // For constructing objects returned by the traversing functions. |
1289 typedef PreParserFactory Factory; | 1305 typedef PreParserFactory Factory; |
1290 }; | 1306 }; |
1291 | 1307 |
1292 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1308 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
1293 | 1309 |
1294 // Helper functions for recursive descent. | 1310 // Helper functions for recursive descent. |
1295 static bool IsEval(PreParserIdentifier identifier) { | 1311 static bool IsEval(PreParserIdentifier identifier) { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1434 } | 1450 } |
1435 static PreParserExpression EmptyObjectLiteralProperty() { | 1451 static PreParserExpression EmptyObjectLiteralProperty() { |
1436 return PreParserExpression::Default(); | 1452 return PreParserExpression::Default(); |
1437 } | 1453 } |
1438 static PreParserExpression EmptyFunctionLiteral() { | 1454 static PreParserExpression EmptyFunctionLiteral() { |
1439 return PreParserExpression::Default(); | 1455 return PreParserExpression::Default(); |
1440 } | 1456 } |
1441 static PreParserExpressionList NullExpressionList() { | 1457 static PreParserExpressionList NullExpressionList() { |
1442 return PreParserExpressionList(); | 1458 return PreParserExpressionList(); |
1443 } | 1459 } |
| 1460 static PreParserIdentifier EmptyFormalParameter() { |
| 1461 return PreParserIdentifier::Default(); |
| 1462 } |
| 1463 static PreParserFormalParameterList NullFormalParameterList() { |
| 1464 return PreParserFormalParameterList(); |
| 1465 } |
1444 | 1466 |
1445 // Odd-ball literal creators. | 1467 // Odd-ball literal creators. |
1446 static PreParserExpression GetLiteralTheHole(int position, | 1468 static PreParserExpression GetLiteralTheHole(int position, |
1447 PreParserFactory* factory) { | 1469 PreParserFactory* factory) { |
1448 return PreParserExpression::Default(); | 1470 return PreParserExpression::Default(); |
1449 } | 1471 } |
1450 | 1472 |
1451 // Producing data during the recursive descent. | 1473 // Producing data during the recursive descent. |
1452 PreParserIdentifier GetSymbol(Scanner* scanner); | 1474 PreParserIdentifier GetSymbol(Scanner* scanner); |
1453 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); | 1475 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1498 } | 1520 } |
1499 | 1521 |
1500 static PreParserStatementList NewStatementList(int size, Zone* zone) { | 1522 static PreParserStatementList NewStatementList(int size, Zone* zone) { |
1501 return PreParserStatementList(); | 1523 return PreParserStatementList(); |
1502 } | 1524 } |
1503 | 1525 |
1504 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { | 1526 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { |
1505 return PreParserExpressionList(); | 1527 return PreParserExpressionList(); |
1506 } | 1528 } |
1507 | 1529 |
| 1530 static PreParserFormalParameterList NewFormalParameterList(int size, |
| 1531 Zone* zone) { |
| 1532 return PreParserFormalParameterList(); |
| 1533 } |
| 1534 |
1508 V8_INLINE void SkipLazyFunctionBody(PreParserIdentifier function_name, | 1535 V8_INLINE void SkipLazyFunctionBody(PreParserIdentifier function_name, |
1509 int* materialized_literal_count, | 1536 int* materialized_literal_count, |
1510 int* expected_property_count, bool* ok) { | 1537 int* expected_property_count, bool* ok) { |
1511 UNREACHABLE(); | 1538 UNREACHABLE(); |
1512 } | 1539 } |
1513 | 1540 |
1514 V8_INLINE PreParserStatementList | 1541 V8_INLINE PreParserStatementList |
1515 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, | 1542 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, |
1516 Variable* fvar, Token::Value fvar_init_op, | 1543 Variable* fvar, Token::Value fvar_init_op, |
1517 FunctionKind kind, bool* ok); | 1544 FunctionKind kind, bool* ok); |
(...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3019 default: | 3046 default: |
3020 return expression; | 3047 return expression; |
3021 } | 3048 } |
3022 } | 3049 } |
3023 DCHECK(false); | 3050 DCHECK(false); |
3024 return this->EmptyExpression(); | 3051 return this->EmptyExpression(); |
3025 } | 3052 } |
3026 | 3053 |
3027 | 3054 |
3028 template <class Traits> | 3055 template <class Traits> |
| 3056 typename ParserBase<Traits>::FormalParameterT |
| 3057 ParserBase<Traits>::ParseFormalParameter(DuplicateFinder* duplicate_finder, |
| 3058 Scanner::Location* eval_args_error_loc, |
| 3059 Scanner::Location* undefined_error_loc, |
| 3060 Scanner::Location* dupe_error_loc, |
| 3061 Scanner::Location* reserved_error_loc, |
| 3062 bool* ok) { |
| 3063 // FormalParameter[Yield,GeneratorParameter] : |
| 3064 // BindingElement[?Yield, ?GeneratorParameter] |
| 3065 bool is_strict_reserved; |
| 3066 IdentifierT name = |
| 3067 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, ok); |
| 3068 if (!*ok) return this->EmptyFormalParameter(); |
| 3069 |
| 3070 // Store locations for possible future error reports. |
| 3071 if (!eval_args_error_loc->IsValid() && this->IsEvalOrArguments(name)) { |
| 3072 *eval_args_error_loc = scanner()->location(); |
| 3073 } |
| 3074 if (!undefined_error_loc->IsValid() && this->IsUndefined(name)) { |
| 3075 *undefined_error_loc = scanner()->location(); |
| 3076 } |
| 3077 if (!reserved_error_loc->IsValid() && is_strict_reserved) { |
| 3078 *reserved_error_loc = scanner()->location(); |
| 3079 } |
| 3080 if (!dupe_error_loc->IsValid()) { |
| 3081 int prev_value = scanner()->FindSymbol(duplicate_finder, 1); |
| 3082 if (prev_value != 0) *dupe_error_loc = scanner()->location(); |
| 3083 } |
| 3084 |
| 3085 return name; |
| 3086 } |
| 3087 |
| 3088 |
| 3089 template <class Traits> |
| 3090 typename ParserBase<Traits>::FormalParameterListT |
| 3091 ParserBase<Traits>::ParseFormalParameterList( |
| 3092 Scanner::Location* eval_args_error_loc, |
| 3093 Scanner::Location* undefined_error_loc, Scanner::Location* dupe_error_loc, |
| 3094 Scanner::Location* reserved_error_loc, bool* is_rest, bool* ok) { |
| 3095 // FormalParameters[Yield,GeneratorParameter] : |
| 3096 // [empty] |
| 3097 // FormalParameterList[?Yield, ?GeneratorParameter] |
| 3098 // |
| 3099 // FormalParameterList[Yield,GeneratorParameter] : |
| 3100 // FunctionRestParameter[?Yield] |
| 3101 // FormalsList[?Yield, ?GeneratorParameter] |
| 3102 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] |
| 3103 // |
| 3104 // FormalsList[Yield,GeneratorParameter] : |
| 3105 // FormalParameter[?Yield, ?GeneratorParameter] |
| 3106 // FormalsList[?Yield, ?GeneratorParameter] , |
| 3107 // FormalParameter[?Yield,?GeneratorParameter] |
| 3108 |
| 3109 FormalParameterListT result = this->NewFormalParameterList(4, zone_); |
| 3110 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 3111 |
| 3112 if (peek() != Token::RPAREN) { |
| 3113 do { |
| 3114 *is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS); |
| 3115 FormalParameterT param = ParseFormalParameter( |
| 3116 &duplicate_finder, eval_args_error_loc, undefined_error_loc, |
| 3117 dupe_error_loc, reserved_error_loc, ok); |
| 3118 if (!*ok) return this->NullFormalParameterList(); |
| 3119 result->Add(param, zone()); |
| 3120 if (result->length() > Code::kMaxArguments) { |
| 3121 ReportMessage("too_many_parameters"); |
| 3122 *ok = false; |
| 3123 return this->NullFormalParameterList(); |
| 3124 } |
| 3125 } while (!*is_rest && Check(Token::COMMA)); |
| 3126 } |
| 3127 |
| 3128 if (is_rest && peek() == Token::COMMA) { |
| 3129 ReportMessageAt(scanner()->peek_location(), "param_after_rest"); |
| 3130 *ok = false; |
| 3131 return this->NullFormalParameterList(); |
| 3132 } |
| 3133 |
| 3134 return result; |
| 3135 } |
| 3136 |
| 3137 |
| 3138 template <class Traits> |
| 3139 void ParserBase<Traits>::CheckArityRestrictions( |
| 3140 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
| 3141 int formals_start_pos, int formals_end_pos, bool* ok) { |
| 3142 switch (arity_restriction) { |
| 3143 case FunctionLiteral::GETTER_ARITY: |
| 3144 if (param_count != 0) { |
| 3145 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), |
| 3146 "bad_getter_arity"); |
| 3147 *ok = false; |
| 3148 } |
| 3149 break; |
| 3150 case FunctionLiteral::SETTER_ARITY: |
| 3151 if (param_count != 1) { |
| 3152 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), |
| 3153 "bad_setter_arity"); |
| 3154 *ok = false; |
| 3155 } |
| 3156 break; |
| 3157 default: |
| 3158 break; |
| 3159 } |
| 3160 } |
| 3161 |
| 3162 template <class Traits> |
3029 typename ParserBase<Traits>::ExpressionT | 3163 typename ParserBase<Traits>::ExpressionT |
3030 ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, | 3164 ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, |
3031 ExpressionT params_ast, | 3165 ExpressionT params_ast, |
3032 bool* ok) { | 3166 bool* ok) { |
3033 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { | 3167 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { |
3034 // ASI inserts `;` after arrow parameters if a line terminator is found. | 3168 // ASI inserts `;` after arrow parameters if a line terminator is found. |
3035 // `=> ...` is never a valid expression, so report as syntax error. | 3169 // `=> ...` is never a valid expression, so report as syntax error. |
3036 // If next token is not `=>`, it's a syntax error anyways. | 3170 // If next token is not `=>`, it's a syntax error anyways. |
3037 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); | 3171 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); |
3038 *ok = false; | 3172 *ok = false; |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3326 *ok = false; | 3460 *ok = false; |
3327 return; | 3461 return; |
3328 } | 3462 } |
3329 has_seen_constructor_ = true; | 3463 has_seen_constructor_ = true; |
3330 return; | 3464 return; |
3331 } | 3465 } |
3332 } | 3466 } |
3333 } } // v8::internal | 3467 } } // v8::internal |
3334 | 3468 |
3335 #endif // V8_PREPARSER_H | 3469 #endif // V8_PREPARSER_H |
OLD | NEW |