Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 bool* is_set, | 336 bool* is_set, |
| 337 bool* ok); | 337 bool* ok); |
| 338 | 338 |
| 339 typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal, | 339 typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal, |
| 340 bool* ok); | 340 bool* ok); |
| 341 | 341 |
| 342 typename Traits::Type::Expression ParsePrimaryExpression(bool* ok); | 342 typename Traits::Type::Expression ParsePrimaryExpression(bool* ok); |
| 343 typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok); | 343 typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok); |
| 344 typename Traits::Type::Expression ParseArrayLiteral(bool* ok); | 344 typename Traits::Type::Expression ParseArrayLiteral(bool* ok); |
| 345 typename Traits::Type::Expression ParseObjectLiteral(bool* ok); | 345 typename Traits::Type::Expression ParseObjectLiteral(bool* ok); |
| 346 typename Traits::Type::ExpressionList ParseArguments(bool* ok); | |
| 346 | 347 |
| 347 // Used to detect duplicates in object literals. Each of the values | 348 // Used to detect duplicates in object literals. Each of the values |
| 348 // kGetterProperty, kSetterProperty and kValueProperty represents | 349 // kGetterProperty, kSetterProperty and kValueProperty represents |
| 349 // a type of object literal property. When parsing a property, its | 350 // a type of object literal property. When parsing a property, its |
| 350 // type value is stored in the DuplicateFinder for the property name. | 351 // type value is stored in the DuplicateFinder for the property name. |
| 351 // Values are chosen so that having intersection bits means the there is | 352 // Values are chosen so that having intersection bits means the there is |
| 352 // an incompatibility. | 353 // an incompatibility. |
| 353 // I.e., you can add a getter to a property that already has a setter, since | 354 // I.e., you can add a getter to a property that already has a setter, since |
| 354 // kGetterProperty and kSetterProperty doesn't intersect, but not if it | 355 // kGetterProperty and kSetterProperty doesn't intersect, but not if it |
| 355 // already has a getter or a value. Adding the getter to an existing | 356 // already has a getter or a value. Adding the getter to an existing |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 550 | 551 |
| 551 int code_; | 552 int code_; |
| 552 }; | 553 }; |
| 553 | 554 |
| 554 | 555 |
| 555 // PreParserExpressionList doesn't actually store the expressions because | 556 // PreParserExpressionList doesn't actually store the expressions because |
| 556 // PreParser doesn't need to. | 557 // PreParser doesn't need to. |
| 557 class PreParserExpressionList { | 558 class PreParserExpressionList { |
| 558 public: | 559 public: |
| 559 // These functions make list->Add(some_expression) work (and do nothing). | 560 // These functions make list->Add(some_expression) work (and do nothing). |
| 561 PreParserExpressionList() : length_(0) {} | |
| 560 PreParserExpressionList* operator->() { return this; } | 562 PreParserExpressionList* operator->() { return this; } |
| 561 void Add(PreParserExpression, void*) { } | 563 void Add(PreParserExpression, void*) { ++length_; } |
| 564 int length() const { return length_; } | |
| 565 private: | |
| 566 int length_; | |
| 562 }; | 567 }; |
| 563 | 568 |
| 564 | 569 |
| 565 class PreParserScope { | 570 class PreParserScope { |
| 566 public: | 571 public: |
| 567 explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type) | 572 explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type) |
| 568 : scope_type_(scope_type) { | 573 : scope_type_(scope_type) { |
| 569 if (outer_scope) { | 574 if (outer_scope) { |
| 570 scope_inside_with_ = | 575 scope_inside_with_ = |
| 571 outer_scope->scope_inside_with_ || is_with_scope(); | 576 outer_scope->scope_inside_with_ || is_with_scope(); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 723 // "null" return type creators. | 728 // "null" return type creators. |
| 724 static PreParserIdentifier EmptyIdentifier() { | 729 static PreParserIdentifier EmptyIdentifier() { |
| 725 return PreParserIdentifier::Default(); | 730 return PreParserIdentifier::Default(); |
| 726 } | 731 } |
| 727 static PreParserExpression EmptyExpression() { | 732 static PreParserExpression EmptyExpression() { |
| 728 return PreParserExpression::Default(); | 733 return PreParserExpression::Default(); |
| 729 } | 734 } |
| 730 static PreParserExpression EmptyLiteral() { | 735 static PreParserExpression EmptyLiteral() { |
| 731 return PreParserExpression::Default(); | 736 return PreParserExpression::Default(); |
| 732 } | 737 } |
| 738 static PreParserExpressionList NullExpressionList() { | |
| 739 return PreParserExpressionList(); | |
| 740 } | |
| 733 | 741 |
| 734 // Odd-ball literal creators. | 742 // Odd-ball literal creators. |
| 735 static PreParserExpression GetLiteralTheHole(int position, | 743 static PreParserExpression GetLiteralTheHole(int position, |
| 736 PreParserFactory* factory) { | 744 PreParserFactory* factory) { |
| 737 return PreParserExpression::Default(); | 745 return PreParserExpression::Default(); |
| 738 } | 746 } |
| 739 | 747 |
| 740 // Producing data during the recursive descent. | 748 // Producing data during the recursive descent. |
| 741 PreParserIdentifier GetSymbol(Scanner* scanner); | 749 PreParserIdentifier GetSymbol(Scanner* scanner); |
| 742 static PreParserIdentifier NextLiteralString(Scanner* scanner, | 750 static PreParserIdentifier NextLiteralString(Scanner* scanner, |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 913 }; | 921 }; |
| 914 | 922 |
| 915 explicit Statement(Type code) : code_(code) {} | 923 explicit Statement(Type code) : code_(code) {} |
| 916 Type code_; | 924 Type code_; |
| 917 }; | 925 }; |
| 918 | 926 |
| 919 enum SourceElements { | 927 enum SourceElements { |
| 920 kUnknownSourceElements | 928 kUnknownSourceElements |
| 921 }; | 929 }; |
| 922 | 930 |
| 923 typedef int Arguments; | |
| 924 | |
| 925 // All ParseXXX functions take as the last argument an *ok parameter | 931 // All ParseXXX functions take as the last argument an *ok parameter |
| 926 // which is set to false if parsing failed; it is unchanged otherwise. | 932 // which is set to false if parsing failed; it is unchanged otherwise. |
| 927 // By making the 'exception handling' explicit, we are forced to check | 933 // By making the 'exception handling' explicit, we are forced to check |
| 928 // for failure at the call sites. | 934 // for failure at the call sites. |
| 929 Statement ParseSourceElement(bool* ok); | 935 Statement ParseSourceElement(bool* ok); |
| 930 SourceElements ParseSourceElements(int end_token, bool* ok); | 936 SourceElements ParseSourceElements(int end_token, bool* ok); |
| 931 Statement ParseStatement(bool* ok); | 937 Statement ParseStatement(bool* ok); |
| 932 Statement ParseFunctionDeclaration(bool* ok); | 938 Statement ParseFunctionDeclaration(bool* ok); |
| 933 Statement ParseBlock(bool* ok); | 939 Statement ParseBlock(bool* ok); |
| 934 Statement ParseVariableStatement(VariableDeclarationContext var_context, | 940 Statement ParseVariableStatement(VariableDeclarationContext var_context, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 958 Expression ParseUnaryExpression(bool* ok); | 964 Expression ParseUnaryExpression(bool* ok); |
| 959 Expression ParsePostfixExpression(bool* ok); | 965 Expression ParsePostfixExpression(bool* ok); |
| 960 Expression ParseLeftHandSideExpression(bool* ok); | 966 Expression ParseLeftHandSideExpression(bool* ok); |
| 961 Expression ParseMemberExpression(bool* ok); | 967 Expression ParseMemberExpression(bool* ok); |
| 962 Expression ParseMemberExpressionContinuation(PreParserExpression expression, | 968 Expression ParseMemberExpressionContinuation(PreParserExpression expression, |
| 963 bool* ok); | 969 bool* ok); |
| 964 Expression ParseMemberWithNewPrefixesExpression(bool* ok); | 970 Expression ParseMemberWithNewPrefixesExpression(bool* ok); |
| 965 Expression ParseObjectLiteral(bool* ok); | 971 Expression ParseObjectLiteral(bool* ok); |
| 966 Expression ParseV8Intrinsic(bool* ok); | 972 Expression ParseV8Intrinsic(bool* ok); |
| 967 | 973 |
| 968 Arguments ParseArguments(bool* ok); | |
| 969 Expression ParseFunctionLiteral( | 974 Expression ParseFunctionLiteral( |
| 970 Identifier name, | 975 Identifier name, |
| 971 Scanner::Location function_name_location, | 976 Scanner::Location function_name_location, |
| 972 bool name_is_strict_reserved, | 977 bool name_is_strict_reserved, |
| 973 bool is_generator, | 978 bool is_generator, |
| 974 int function_token_pos, | 979 int function_token_pos, |
| 975 FunctionLiteral::FunctionType function_type, | 980 FunctionLiteral::FunctionType function_type, |
| 976 bool* ok); | 981 bool* ok); |
| 977 void ParseLazyFunctionLiteralBody(bool* ok); | 982 void ParseLazyFunctionLiteralBody(bool* ok); |
| 978 | 983 |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1156 return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); | 1161 return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); |
| 1157 } | 1162 } |
| 1158 | 1163 |
| 1159 | 1164 |
| 1160 #define CHECK_OK ok); \ | 1165 #define CHECK_OK ok); \ |
| 1161 if (!*ok) return this->EmptyExpression(); \ | 1166 if (!*ok) return this->EmptyExpression(); \ |
| 1162 ((void)0 | 1167 ((void)0 |
| 1163 #define DUMMY ) // to make indentation work | 1168 #define DUMMY ) // to make indentation work |
| 1164 #undef DUMMY | 1169 #undef DUMMY |
| 1165 | 1170 |
| 1171 // Used in functions where the return type is not Traits::Type::Expression. | |
| 1172 #define CHECK_OK_CUSTOM(x) ok); \ | |
| 1173 if (!*ok) return this->x(); \ | |
| 1174 ((void)0 | |
| 1175 #define DUMMY ) // to make indentation work | |
| 1176 #undef DUMMY | |
| 1177 | |
| 1166 template <class Traits> | 1178 template <class Traits> |
| 1167 typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression( | 1179 typename Traits::Type::Expression ParserBase<Traits>::ParsePrimaryExpression( |
| 1168 bool* ok) { | 1180 bool* ok) { |
| 1169 // PrimaryExpression :: | 1181 // PrimaryExpression :: |
| 1170 // 'this' | 1182 // 'this' |
| 1171 // 'null' | 1183 // 'null' |
| 1172 // 'true' | 1184 // 'true' |
| 1173 // 'false' | 1185 // 'false' |
| 1174 // Identifier | 1186 // Identifier |
| 1175 // Number | 1187 // Number |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1460 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 1472 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
| 1461 | 1473 |
| 1462 return factory()->NewObjectLiteral(properties, | 1474 return factory()->NewObjectLiteral(properties, |
| 1463 literal_index, | 1475 literal_index, |
| 1464 number_of_boilerplate_properties, | 1476 number_of_boilerplate_properties, |
| 1465 has_function, | 1477 has_function, |
| 1466 pos); | 1478 pos); |
| 1467 } | 1479 } |
| 1468 | 1480 |
| 1469 | 1481 |
| 1482 template <class Traits> | |
| 1483 typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( | |
| 1484 bool* ok) { | |
| 1485 // Arguments :: | |
| 1486 // '(' (AssignmentExpression)*[','] ')' | |
| 1487 | |
| 1488 typename Traits::Type::ExpressionList result = | |
| 1489 this->NewExpressionList(4, zone_); | |
| 1490 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList)); | |
| 1491 bool done = (peek() == Token::RPAREN); | |
| 1492 while (!done) { | |
| 1493 typename Traits::Type::Expression argument = | |
| 1494 this->ParseAssignmentExpression(true, | |
| 1495 CHECK_OK_CUSTOM(NullExpressionList)); | |
| 1496 result->Add(argument, zone_); | |
| 1497 if (result->length() > Code::kMaxArguments) { | |
| 1498 ReportMessageAt(scanner()->location(), "too_many_arguments"); | |
| 1499 *ok = false; | |
| 1500 return this->NullExpressionList(); | |
| 1501 } | |
| 1502 done = (peek() == Token::RPAREN); | |
| 1503 if (!done) Expect(Token::COMMA, CHECK_OK_CUSTOM(NullExpressionList)); | |
|
ulan
2014/03/11 15:39:59
As discussed offline, it is probably worth putting
marja
2014/03/11 15:49:10
Done.
| |
| 1504 } | |
| 1505 Expect(Token::RPAREN, CHECK_OK_CUSTOM(NullExpressionList)); | |
| 1506 return result; | |
| 1507 } | |
| 1508 | |
| 1470 | 1509 |
| 1471 #undef CHECK_OK | 1510 #undef CHECK_OK |
| 1511 #undef CHECK_OK_CUSTOM | |
| 1472 | 1512 |
| 1473 | 1513 |
| 1474 template <typename Traits> | 1514 template <typename Traits> |
| 1475 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( | 1515 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( |
| 1476 Token::Value property, | 1516 Token::Value property, |
| 1477 PropertyKind type, | 1517 PropertyKind type, |
| 1478 bool* ok) { | 1518 bool* ok) { |
| 1479 int old; | 1519 int old; |
| 1480 if (property == Token::NUMBER) { | 1520 if (property == Token::NUMBER) { |
| 1481 old = finder_.AddNumber(scanner()->literal_ascii_string(), type); | 1521 old = finder_.AddNumber(scanner()->literal_ascii_string(), type); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1502 "accessor_get_set"); | 1542 "accessor_get_set"); |
| 1503 } | 1543 } |
| 1504 *ok = false; | 1544 *ok = false; |
| 1505 } | 1545 } |
| 1506 } | 1546 } |
| 1507 | 1547 |
| 1508 | 1548 |
| 1509 } } // v8::internal | 1549 } } // v8::internal |
| 1510 | 1550 |
| 1511 #endif // V8_PREPARSER_H | 1551 #endif // V8_PREPARSER_H |
| OLD | NEW |