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 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); | 595 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); |
592 ExpressionT ParseMemberExpression(bool* ok); | 596 ExpressionT ParseMemberExpression(bool* ok); |
593 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, | 597 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, |
594 bool* ok); | 598 bool* ok); |
595 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, | 599 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, |
596 bool* ok); | 600 bool* ok); |
597 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); | 601 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); |
598 void AddTemplateExpression(ExpressionT); | 602 void AddTemplateExpression(ExpressionT); |
599 ExpressionT ParseSuperExpression(bool is_new, bool* ok); | 603 ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
600 | 604 |
| 605 FormalParameterT ParseFormalParameter(DuplicateFinder* duplicate_finder, |
| 606 Scanner::Location* eval_args_error_loc, |
| 607 Scanner::Location* dupe_error_loc, |
| 608 Scanner::Location* reserved_error_loc, |
| 609 bool* ok); |
| 610 FormalParameterListT ParseFormalParameterList( |
| 611 Scanner::Location* eval_args_error_loc, Scanner::Location* dupe_error_loc, |
| 612 Scanner::Location* reserved_error_loc, bool* is_rest, bool* ok); |
| 613 void CheckArityRestrictions( |
| 614 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
| 615 int formals_start_pos, int formals_end_pos, bool* ok); |
| 616 |
601 // Checks if the expression is a valid reference expression (e.g., on the | 617 // Checks if the expression is a valid reference expression (e.g., on the |
602 // left-hand side of assignments). Although ruled out by ECMA as early errors, | 618 // left-hand side of assignments). Although ruled out by ECMA as early errors, |
603 // we allow calls for web compatibility and rewrite them to a runtime throw. | 619 // we allow calls for web compatibility and rewrite them to a runtime throw. |
604 ExpressionT CheckAndRewriteReferenceExpression( | 620 ExpressionT CheckAndRewriteReferenceExpression( |
605 ExpressionT expression, | 621 ExpressionT expression, |
606 Scanner::Location location, const char* message, bool* ok); | 622 Scanner::Location location, const char* message, bool* ok); |
607 | 623 |
608 // Used to validate property names in object literals and class literals | 624 // Used to validate property names in object literals and class literals |
609 enum PropertyKind { | 625 enum PropertyKind { |
610 kAccessorProperty, | 626 kAccessorProperty, |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseStrongField; | 1008 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseStrongField; |
993 typedef BitField<bool, ParenthesizationField::kNext, 1> | 1009 typedef BitField<bool, ParenthesizationField::kNext, 1> |
994 IsValidArrowParamListField; | 1010 IsValidArrowParamListField; |
995 typedef BitField<PreParserIdentifier::Type, ParenthesizationField::kNext, 10> | 1011 typedef BitField<PreParserIdentifier::Type, ParenthesizationField::kNext, 10> |
996 IdentifierTypeField; | 1012 IdentifierTypeField; |
997 | 1013 |
998 uint32_t code_; | 1014 uint32_t code_; |
999 }; | 1015 }; |
1000 | 1016 |
1001 | 1017 |
1002 // PreParserExpressionList doesn't actually store the expressions because | 1018 // The pre-parser doesn't need to build lists of expressions, identifiers, or |
1003 // PreParser doesn't need to. | 1019 // the like. |
1004 class PreParserExpressionList { | 1020 template <typename T> |
| 1021 class PreParserList { |
1005 public: | 1022 public: |
1006 // These functions make list->Add(some_expression) work (and do nothing). | 1023 // These functions make list->Add(some_expression) work (and do nothing). |
1007 PreParserExpressionList() : length_(0) {} | 1024 PreParserList() : length_(0) {} |
1008 PreParserExpressionList* operator->() { return this; } | 1025 PreParserList* operator->() { return this; } |
1009 void Add(PreParserExpression, void*) { ++length_; } | 1026 void Add(T, void*) { ++length_; } |
1010 int length() const { return length_; } | 1027 int length() const { return length_; } |
1011 private: | 1028 private: |
1012 int length_; | 1029 int length_; |
1013 }; | 1030 }; |
1014 | 1031 |
1015 | 1032 |
| 1033 typedef PreParserList<PreParserExpression> PreParserExpressionList; |
| 1034 typedef PreParserList<PreParserIdentifier> PreParserFormalParameterList; |
| 1035 |
| 1036 |
1016 class PreParserStatement { | 1037 class PreParserStatement { |
1017 public: | 1038 public: |
1018 static PreParserStatement Default() { | 1039 static PreParserStatement Default() { |
1019 return PreParserStatement(kUnknownStatement); | 1040 return PreParserStatement(kUnknownStatement); |
1020 } | 1041 } |
1021 | 1042 |
1022 static PreParserStatement FunctionDeclaration() { | 1043 static PreParserStatement FunctionDeclaration() { |
1023 return PreParserStatement(kFunctionDeclaration); | 1044 return PreParserStatement(kFunctionDeclaration); |
1024 } | 1045 } |
1025 | 1046 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 kUseStrictExpressionStatement, | 1082 kUseStrictExpressionStatement, |
1062 kUseStrongExpressionStatement, | 1083 kUseStrongExpressionStatement, |
1063 kFunctionDeclaration | 1084 kFunctionDeclaration |
1064 }; | 1085 }; |
1065 | 1086 |
1066 explicit PreParserStatement(Type code) : code_(code) {} | 1087 explicit PreParserStatement(Type code) : code_(code) {} |
1067 Type code_; | 1088 Type code_; |
1068 }; | 1089 }; |
1069 | 1090 |
1070 | 1091 |
1071 | 1092 typedef PreParserList<PreParserStatement> PreParserStatementList; |
1072 // PreParserStatementList doesn't actually store the statements because | |
1073 // the PreParser does not need them. | |
1074 class PreParserStatementList { | |
1075 public: | |
1076 // These functions make list->Add(some_expression) work as no-ops. | |
1077 PreParserStatementList() {} | |
1078 PreParserStatementList* operator->() { return this; } | |
1079 void Add(PreParserStatement, void*) {} | |
1080 }; | |
1081 | 1093 |
1082 | 1094 |
1083 class PreParserFactory { | 1095 class PreParserFactory { |
1084 public: | 1096 public: |
1085 explicit PreParserFactory(void* unused_value_factory) {} | 1097 explicit PreParserFactory(void* unused_value_factory) {} |
1086 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, | 1098 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, |
1087 int pos) { | 1099 int pos) { |
1088 return PreParserExpression::Default(); | 1100 return PreParserExpression::Default(); |
1089 } | 1101 } |
1090 PreParserExpression NewNumberLiteral(double number, | 1102 PreParserExpression NewNumberLiteral(double number, |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 // Return types for traversing functions. | 1247 // Return types for traversing functions. |
1236 typedef PreParserIdentifier Identifier; | 1248 typedef PreParserIdentifier Identifier; |
1237 typedef PreParserExpression Expression; | 1249 typedef PreParserExpression Expression; |
1238 typedef PreParserExpression YieldExpression; | 1250 typedef PreParserExpression YieldExpression; |
1239 typedef PreParserExpression FunctionLiteral; | 1251 typedef PreParserExpression FunctionLiteral; |
1240 typedef PreParserExpression ClassLiteral; | 1252 typedef PreParserExpression ClassLiteral; |
1241 typedef PreParserExpression ObjectLiteralProperty; | 1253 typedef PreParserExpression ObjectLiteralProperty; |
1242 typedef PreParserExpression Literal; | 1254 typedef PreParserExpression Literal; |
1243 typedef PreParserExpressionList ExpressionList; | 1255 typedef PreParserExpressionList ExpressionList; |
1244 typedef PreParserExpressionList PropertyList; | 1256 typedef PreParserExpressionList PropertyList; |
| 1257 typedef PreParserIdentifier FormalParameter; |
| 1258 typedef PreParserFormalParameterList FormalParameterList; |
1245 typedef PreParserStatementList StatementList; | 1259 typedef PreParserStatementList StatementList; |
1246 | 1260 |
1247 // For constructing objects returned by the traversing functions. | 1261 // For constructing objects returned by the traversing functions. |
1248 typedef PreParserFactory Factory; | 1262 typedef PreParserFactory Factory; |
1249 }; | 1263 }; |
1250 | 1264 |
1251 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1265 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
1252 | 1266 |
1253 // Helper functions for recursive descent. | 1267 // Helper functions for recursive descent. |
1254 static bool IsEval(PreParserIdentifier identifier) { | 1268 static bool IsEval(PreParserIdentifier identifier) { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1389 } | 1403 } |
1390 static PreParserExpression EmptyObjectLiteralProperty() { | 1404 static PreParserExpression EmptyObjectLiteralProperty() { |
1391 return PreParserExpression::Default(); | 1405 return PreParserExpression::Default(); |
1392 } | 1406 } |
1393 static PreParserExpression EmptyFunctionLiteral() { | 1407 static PreParserExpression EmptyFunctionLiteral() { |
1394 return PreParserExpression::Default(); | 1408 return PreParserExpression::Default(); |
1395 } | 1409 } |
1396 static PreParserExpressionList NullExpressionList() { | 1410 static PreParserExpressionList NullExpressionList() { |
1397 return PreParserExpressionList(); | 1411 return PreParserExpressionList(); |
1398 } | 1412 } |
| 1413 static PreParserIdentifier EmptyFormalParameter() { |
| 1414 return PreParserIdentifier::Default(); |
| 1415 } |
| 1416 static PreParserFormalParameterList NullFormalParameterList() { |
| 1417 return PreParserFormalParameterList(); |
| 1418 } |
1399 | 1419 |
1400 // Odd-ball literal creators. | 1420 // Odd-ball literal creators. |
1401 static PreParserExpression GetLiteralTheHole(int position, | 1421 static PreParserExpression GetLiteralTheHole(int position, |
1402 PreParserFactory* factory) { | 1422 PreParserFactory* factory) { |
1403 return PreParserExpression::Default(); | 1423 return PreParserExpression::Default(); |
1404 } | 1424 } |
1405 | 1425 |
1406 // Producing data during the recursive descent. | 1426 // Producing data during the recursive descent. |
1407 PreParserIdentifier GetSymbol(Scanner* scanner); | 1427 PreParserIdentifier GetSymbol(Scanner* scanner); |
1408 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); | 1428 PreParserIdentifier GetNumberAsSymbol(Scanner* scanner); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1453 } | 1473 } |
1454 | 1474 |
1455 static PreParserStatementList NewStatementList(int size, Zone* zone) { | 1475 static PreParserStatementList NewStatementList(int size, Zone* zone) { |
1456 return PreParserStatementList(); | 1476 return PreParserStatementList(); |
1457 } | 1477 } |
1458 | 1478 |
1459 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { | 1479 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { |
1460 return PreParserExpressionList(); | 1480 return PreParserExpressionList(); |
1461 } | 1481 } |
1462 | 1482 |
| 1483 static PreParserFormalParameterList NewFormalParameterList(int size, |
| 1484 Zone* zone) { |
| 1485 return PreParserFormalParameterList(); |
| 1486 } |
| 1487 |
1463 V8_INLINE void SkipLazyFunctionBody(PreParserIdentifier function_name, | 1488 V8_INLINE void SkipLazyFunctionBody(PreParserIdentifier function_name, |
1464 int* materialized_literal_count, | 1489 int* materialized_literal_count, |
1465 int* expected_property_count, bool* ok) { | 1490 int* expected_property_count, bool* ok) { |
1466 UNREACHABLE(); | 1491 UNREACHABLE(); |
1467 } | 1492 } |
1468 | 1493 |
1469 V8_INLINE PreParserStatementList | 1494 V8_INLINE PreParserStatementList |
1470 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, | 1495 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, |
1471 Variable* fvar, Token::Value fvar_init_op, | 1496 Variable* fvar, Token::Value fvar_init_op, |
1472 FunctionKind kind, bool* ok); | 1497 FunctionKind kind, bool* ok); |
(...skipping 1498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2971 default: | 2996 default: |
2972 return expression; | 2997 return expression; |
2973 } | 2998 } |
2974 } | 2999 } |
2975 DCHECK(false); | 3000 DCHECK(false); |
2976 return this->EmptyExpression(); | 3001 return this->EmptyExpression(); |
2977 } | 3002 } |
2978 | 3003 |
2979 | 3004 |
2980 template <class Traits> | 3005 template <class Traits> |
| 3006 typename ParserBase<Traits>::FormalParameterT |
| 3007 ParserBase<Traits>::ParseFormalParameter(DuplicateFinder* duplicate_finder, |
| 3008 Scanner::Location* eval_args_error_loc, |
| 3009 Scanner::Location* dupe_error_loc, |
| 3010 Scanner::Location* reserved_error_loc, |
| 3011 bool* ok) { |
| 3012 // FormalParameter[Yield,GeneratorParameter] : |
| 3013 // BindingElement[?Yield, ?GeneratorParameter] |
| 3014 bool is_strict_reserved; |
| 3015 IdentifierT name = |
| 3016 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, ok); |
| 3017 if (!*ok) return this->EmptyFormalParameter(); |
| 3018 |
| 3019 // Store locations for possible future error reports. |
| 3020 if (!eval_args_error_loc->IsValid() && this->IsEvalOrArguments(name)) { |
| 3021 *eval_args_error_loc = scanner()->location(); |
| 3022 } |
| 3023 if (!reserved_error_loc->IsValid() && is_strict_reserved) { |
| 3024 *reserved_error_loc = scanner()->location(); |
| 3025 } |
| 3026 if (!dupe_error_loc->IsValid()) { |
| 3027 int prev_value = scanner()->FindSymbol(duplicate_finder, 1); |
| 3028 if (prev_value != 0) *dupe_error_loc = scanner()->location(); |
| 3029 } |
| 3030 |
| 3031 return name; |
| 3032 } |
| 3033 |
| 3034 |
| 3035 template <class Traits> |
| 3036 typename ParserBase<Traits>::FormalParameterListT |
| 3037 ParserBase<Traits>::ParseFormalParameterList( |
| 3038 Scanner::Location* eval_args_error_loc, Scanner::Location* dupe_error_loc, |
| 3039 Scanner::Location* reserved_error_loc, bool* is_rest, bool* ok) { |
| 3040 // FormalParameters[Yield,GeneratorParameter] : |
| 3041 // [empty] |
| 3042 // FormalParameterList[?Yield, ?GeneratorParameter] |
| 3043 // |
| 3044 // FormalParameterList[Yield,GeneratorParameter] : |
| 3045 // FunctionRestParameter[?Yield] |
| 3046 // FormalsList[?Yield, ?GeneratorParameter] |
| 3047 // FormalsList[?Yield, ?GeneratorParameter] , FunctionRestParameter[?Yield] |
| 3048 // |
| 3049 // FormalsList[Yield,GeneratorParameter] : |
| 3050 // FormalParameter[?Yield, ?GeneratorParameter] |
| 3051 // FormalsList[?Yield, ?GeneratorParameter] , |
| 3052 // FormalParameter[?Yield,?GeneratorParameter] |
| 3053 |
| 3054 FormalParameterListT result = this->NewFormalParameterList(4, zone_); |
| 3055 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 3056 |
| 3057 if (peek() != Token::RPAREN) { |
| 3058 do { |
| 3059 *is_rest = allow_harmony_rest_params() && Check(Token::ELLIPSIS); |
| 3060 FormalParameterT param = |
| 3061 ParseFormalParameter(&duplicate_finder, eval_args_error_loc, |
| 3062 dupe_error_loc, reserved_error_loc, ok); |
| 3063 if (!*ok) return this->NullFormalParameterList(); |
| 3064 result->Add(param, zone()); |
| 3065 if (result->length() > Code::kMaxArguments) { |
| 3066 ReportMessage("too_many_parameters"); |
| 3067 *ok = false; |
| 3068 return this->NullFormalParameterList(); |
| 3069 } |
| 3070 } while (!*is_rest && Check(Token::COMMA)); |
| 3071 } |
| 3072 |
| 3073 return result; |
| 3074 } |
| 3075 |
| 3076 |
| 3077 template <class Traits> |
| 3078 void ParserBase<Traits>::CheckArityRestrictions( |
| 3079 int param_count, FunctionLiteral::ArityRestriction arity_restriction, |
| 3080 int formals_start_pos, int formals_end_pos, bool* ok) { |
| 3081 switch (arity_restriction) { |
| 3082 case FunctionLiteral::GETTER_ARITY: |
| 3083 if (param_count != 0) { |
| 3084 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), |
| 3085 "bad_getter_arity"); |
| 3086 *ok = false; |
| 3087 } |
| 3088 break; |
| 3089 case FunctionLiteral::SETTER_ARITY: |
| 3090 if (param_count != 1) { |
| 3091 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), |
| 3092 "bad_setter_arity"); |
| 3093 *ok = false; |
| 3094 } |
| 3095 break; |
| 3096 default: |
| 3097 break; |
| 3098 } |
| 3099 } |
| 3100 |
| 3101 template <class Traits> |
2981 typename ParserBase<Traits>::ExpressionT | 3102 typename ParserBase<Traits>::ExpressionT |
2982 ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, | 3103 ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, |
2983 ExpressionT params_ast, | 3104 ExpressionT params_ast, |
2984 bool* ok) { | 3105 bool* ok) { |
2985 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { | 3106 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { |
2986 // ASI inserts `;` after arrow parameters if a line terminator is found. | 3107 // ASI inserts `;` after arrow parameters if a line terminator is found. |
2987 // `=> ...` is never a valid expression, so report as syntax error. | 3108 // `=> ...` is never a valid expression, so report as syntax error. |
2988 // If next token is not `=>`, it's a syntax error anyways. | 3109 // If next token is not `=>`, it's a syntax error anyways. |
2989 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); | 3110 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); |
2990 *ok = false; | 3111 *ok = false; |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3262 *ok = false; | 3383 *ok = false; |
3263 return; | 3384 return; |
3264 } | 3385 } |
3265 has_seen_constructor_ = true; | 3386 has_seen_constructor_ = true; |
3266 return; | 3387 return; |
3267 } | 3388 } |
3268 } | 3389 } |
3269 } } // v8::internal | 3390 } } // v8::internal |
3270 | 3391 |
3271 #endif // V8_PREPARSER_H | 3392 #endif // V8_PREPARSER_H |
OLD | NEW |