| 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 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 // whether it is strict mode future reserved. | 218 // whether it is strict mode future reserved. |
| 219 typename Traits::IdentifierType ParseIdentifierOrStrictReservedWord( | 219 typename Traits::IdentifierType ParseIdentifierOrStrictReservedWord( |
| 220 bool* is_strict_reserved, | 220 bool* is_strict_reserved, |
| 221 bool* ok); | 221 bool* ok); |
| 222 typename Traits::IdentifierType ParseIdentifierName(bool* ok); | 222 typename Traits::IdentifierType ParseIdentifierName(bool* ok); |
| 223 // Parses an identifier and determines whether or not it is 'get' or 'set'. | 223 // Parses an identifier and determines whether or not it is 'get' or 'set'. |
| 224 typename Traits::IdentifierType ParseIdentifierNameOrGetOrSet(bool* is_get, | 224 typename Traits::IdentifierType ParseIdentifierNameOrGetOrSet(bool* is_get, |
| 225 bool* is_set, | 225 bool* is_set, |
| 226 bool* ok); | 226 bool* ok); |
| 227 | 227 |
| 228 typename Traits::ExpressionType ParseRegExpLiteral(bool seen_equal, bool* ok); |
| 229 |
| 228 // Used to detect duplicates in object literals. Each of the values | 230 // Used to detect duplicates in object literals. Each of the values |
| 229 // kGetterProperty, kSetterProperty and kValueProperty represents | 231 // kGetterProperty, kSetterProperty and kValueProperty represents |
| 230 // a type of object literal property. When parsing a property, its | 232 // a type of object literal property. When parsing a property, its |
| 231 // type value is stored in the DuplicateFinder for the property name. | 233 // type value is stored in the DuplicateFinder for the property name. |
| 232 // Values are chosen so that having intersection bits means the there is | 234 // Values are chosen so that having intersection bits means the there is |
| 233 // an incompatibility. | 235 // an incompatibility. |
| 234 // I.e., you can add a getter to a property that already has a setter, since | 236 // I.e., you can add a getter to a property that already has a setter, since |
| 235 // kGetterProperty and kSetterProperty doesn't intersect, but not if it | 237 // kGetterProperty and kSetterProperty doesn't intersect, but not if it |
| 236 // already has a getter or a value. Adding the getter to an existing | 238 // already has a getter or a value. Adding the getter to an existing |
| 237 // setter will store the value (kGetterProperty | kSetterProperty), which | 239 // setter will store the value (kGetterProperty | kSetterProperty), which |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 }; | 422 }; |
| 421 | 423 |
| 422 class PreParser; | 424 class PreParser; |
| 423 | 425 |
| 424 | 426 |
| 425 class PreParserTraits { | 427 class PreParserTraits { |
| 426 public: | 428 public: |
| 427 typedef PreParser* ParserType; | 429 typedef PreParser* ParserType; |
| 428 // Return types for traversing functions. | 430 // Return types for traversing functions. |
| 429 typedef PreParserIdentifier IdentifierType; | 431 typedef PreParserIdentifier IdentifierType; |
| 432 typedef PreParserExpression ExpressionType; |
| 430 | 433 |
| 431 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 434 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
| 432 | 435 |
| 433 // Helper functions for recursive descent. | 436 // Helper functions for recursive descent. |
| 434 bool is_classic_mode() const; | 437 bool is_classic_mode() const; |
| 435 bool is_generator() const; | 438 bool is_generator() const; |
| 436 static bool IsEvalOrArguments(IdentifierType identifier) { | 439 static bool IsEvalOrArguments(IdentifierType identifier) { |
| 437 return identifier.IsEvalOrArguments(); | 440 return identifier.IsEvalOrArguments(); |
| 438 } | 441 } |
| 442 int NextMaterializedLiteralIndex(); |
| 439 | 443 |
| 440 // Reporting errors. | 444 // Reporting errors. |
| 441 void ReportMessageAt(Scanner::Location location, | 445 void ReportMessageAt(Scanner::Location location, |
| 442 const char* message, | 446 const char* message, |
| 443 Vector<const char*> args); | 447 Vector<const char*> args); |
| 444 void ReportMessageAt(Scanner::Location location, | 448 void ReportMessageAt(Scanner::Location location, |
| 445 const char* type, | 449 const char* type, |
| 446 const char* name_opt); | 450 const char* name_opt); |
| 447 void ReportMessageAt(int start_pos, | 451 void ReportMessageAt(int start_pos, |
| 448 int end_pos, | 452 int end_pos, |
| 449 const char* type, | 453 const char* type, |
| 450 const char* name_opt); | 454 const char* name_opt); |
| 451 | 455 |
| 452 // Identifiers: | 456 // "null" return type creators. |
| 453 static IdentifierType EmptyIdentifier() { | 457 static IdentifierType EmptyIdentifier() { |
| 454 return PreParserIdentifier::Default(); | 458 return PreParserIdentifier::Default(); |
| 455 } | 459 } |
| 460 static ExpressionType EmptyExpression() { |
| 461 return PreParserExpression::Default(); |
| 462 } |
| 456 | 463 |
| 464 // Producing data during the recursive descent. |
| 457 IdentifierType GetSymbol(); | 465 IdentifierType GetSymbol(); |
| 466 static IdentifierType NextLiteralString(PretenureFlag tenured) { |
| 467 return PreParserIdentifier::Default(); |
| 468 } |
| 469 ExpressionType NewRegExpLiteral(IdentifierType js_pattern, |
| 470 IdentifierType js_flags, |
| 471 int literal_index, |
| 472 int pos) { |
| 473 return PreParserExpression::Default(); |
| 474 } |
| 458 | 475 |
| 459 private: | 476 private: |
| 460 PreParser* pre_parser_; | 477 PreParser* pre_parser_; |
| 461 }; | 478 }; |
| 462 | 479 |
| 463 | 480 |
| 464 // Preparsing checks a JavaScript program and emits preparse-data that helps | 481 // Preparsing checks a JavaScript program and emits preparse-data that helps |
| 465 // a later parsing to be faster. | 482 // a later parsing to be faster. |
| 466 // See preparse-data-format.h for the data format. | 483 // See preparse-data-format.h for the data format. |
| 467 | 484 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 type_(type), | 626 type_(type), |
| 610 materialized_literal_count_(0), | 627 materialized_literal_count_(0), |
| 611 expected_properties_(0), | 628 expected_properties_(0), |
| 612 with_nesting_count_(0), | 629 with_nesting_count_(0), |
| 613 language_mode_( | 630 language_mode_( |
| 614 (prev_ != NULL) ? prev_->language_mode() : CLASSIC_MODE), | 631 (prev_ != NULL) ? prev_->language_mode() : CLASSIC_MODE), |
| 615 is_generator_(false) { | 632 is_generator_(false) { |
| 616 *variable = this; | 633 *variable = this; |
| 617 } | 634 } |
| 618 ~Scope() { *variable_ = prev_; } | 635 ~Scope() { *variable_ = prev_; } |
| 619 void NextMaterializedLiteralIndex() { materialized_literal_count_++; } | 636 int NextMaterializedLiteralIndex() { return materialized_literal_count_++; } |
| 620 void AddProperty() { expected_properties_++; } | 637 void AddProperty() { expected_properties_++; } |
| 621 ScopeType type() { return type_; } | 638 ScopeType type() { return type_; } |
| 622 int expected_properties() { return expected_properties_; } | 639 int expected_properties() { return expected_properties_; } |
| 623 int materialized_literal_count() { return materialized_literal_count_; } | 640 int materialized_literal_count() { return materialized_literal_count_; } |
| 624 bool IsInsideWith() { return with_nesting_count_ != 0; } | 641 bool IsInsideWith() { return with_nesting_count_ != 0; } |
| 625 bool is_generator() { return is_generator_; } | 642 bool is_generator() { return is_generator_; } |
| 626 void set_is_generator(bool is_generator) { is_generator_ = is_generator; } | 643 void set_is_generator(bool is_generator) { is_generator_ = is_generator; } |
| 627 bool is_classic_mode() { | 644 bool is_classic_mode() { |
| 628 return language_mode_ == CLASSIC_MODE; | 645 return language_mode_ == CLASSIC_MODE; |
| 629 } | 646 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); | 711 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); |
| 695 Expression ParseUnaryExpression(bool* ok); | 712 Expression ParseUnaryExpression(bool* ok); |
| 696 Expression ParsePostfixExpression(bool* ok); | 713 Expression ParsePostfixExpression(bool* ok); |
| 697 Expression ParseLeftHandSideExpression(bool* ok); | 714 Expression ParseLeftHandSideExpression(bool* ok); |
| 698 Expression ParseNewExpression(bool* ok); | 715 Expression ParseNewExpression(bool* ok); |
| 699 Expression ParseMemberExpression(bool* ok); | 716 Expression ParseMemberExpression(bool* ok); |
| 700 Expression ParseMemberWithNewPrefixesExpression(unsigned new_count, bool* ok); | 717 Expression ParseMemberWithNewPrefixesExpression(unsigned new_count, bool* ok); |
| 701 Expression ParsePrimaryExpression(bool* ok); | 718 Expression ParsePrimaryExpression(bool* ok); |
| 702 Expression ParseArrayLiteral(bool* ok); | 719 Expression ParseArrayLiteral(bool* ok); |
| 703 Expression ParseObjectLiteral(bool* ok); | 720 Expression ParseObjectLiteral(bool* ok); |
| 704 Expression ParseRegExpLiteral(bool seen_equal, bool* ok); | |
| 705 Expression ParseV8Intrinsic(bool* ok); | 721 Expression ParseV8Intrinsic(bool* ok); |
| 706 | 722 |
| 707 Arguments ParseArguments(bool* ok); | 723 Arguments ParseArguments(bool* ok); |
| 708 Expression ParseFunctionLiteral( | 724 Expression ParseFunctionLiteral( |
| 709 Identifier name, | 725 Identifier name, |
| 710 Scanner::Location function_name_location, | 726 Scanner::Location function_name_location, |
| 711 bool name_is_strict_reserved, | 727 bool name_is_strict_reserved, |
| 712 bool is_generator, | 728 bool is_generator, |
| 713 bool* ok); | 729 bool* ok); |
| 714 void ParseLazyFunctionLiteralBody(bool* ok); | 730 void ParseLazyFunctionLiteralBody(bool* ok); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 if (scanner()->is_literal_ascii() && | 857 if (scanner()->is_literal_ascii() && |
| 842 scanner()->literal_length() == 3) { | 858 scanner()->literal_length() == 3) { |
| 843 const char* token = scanner()->literal_ascii_string().start(); | 859 const char* token = scanner()->literal_ascii_string().start(); |
| 844 *is_get = strncmp(token, "get", 3) == 0; | 860 *is_get = strncmp(token, "get", 3) == 0; |
| 845 *is_set = !*is_get && strncmp(token, "set", 3) == 0; | 861 *is_set = !*is_get && strncmp(token, "set", 3) == 0; |
| 846 } | 862 } |
| 847 return result; | 863 return result; |
| 848 } | 864 } |
| 849 | 865 |
| 850 | 866 |
| 867 template <class Traits> |
| 868 typename Traits::ExpressionType |
| 869 ParserBase<Traits>::ParseRegExpLiteral(bool seen_equal, bool* ok) { |
| 870 int pos = peek_position(); |
| 871 if (!scanner()->ScanRegExpPattern(seen_equal)) { |
| 872 Next(); |
| 873 ReportMessage("unterminated_regexp", Vector<const char*>::empty()); |
| 874 *ok = false; |
| 875 return Traits::EmptyExpression(); |
| 876 } |
| 877 |
| 878 int literal_index = this->NextMaterializedLiteralIndex(); |
| 879 |
| 880 typename Traits::IdentifierType js_pattern = this->NextLiteralString(TENURED); |
| 881 if (!scanner()->ScanRegExpFlags()) { |
| 882 Next(); |
| 883 ReportMessageAt(scanner()->location(), "invalid_regexp_flags"); |
| 884 *ok = false; |
| 885 return Traits::EmptyExpression(); |
| 886 } |
| 887 typename Traits::IdentifierType js_flags = this->NextLiteralString(TENURED); |
| 888 Next(); |
| 889 return this->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); |
| 890 } |
| 891 |
| 892 |
| 851 template <typename Traits> | 893 template <typename Traits> |
| 852 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( | 894 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( |
| 853 Token::Value property, | 895 Token::Value property, |
| 854 PropertyKind type, | 896 PropertyKind type, |
| 855 bool* ok) { | 897 bool* ok) { |
| 856 int old; | 898 int old; |
| 857 if (property == Token::NUMBER) { | 899 if (property == Token::NUMBER) { |
| 858 old = finder_.AddNumber(scanner()->literal_ascii_string(), type); | 900 old = finder_.AddNumber(scanner()->literal_ascii_string(), type); |
| 859 } else if (scanner()->is_literal_ascii()) { | 901 } else if (scanner()->is_literal_ascii()) { |
| 860 old = finder_.AddAsciiSymbol(scanner()->literal_ascii_string(), type); | 902 old = finder_.AddAsciiSymbol(scanner()->literal_ascii_string(), type); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 879 "accessor_get_set"); | 921 "accessor_get_set"); |
| 880 } | 922 } |
| 881 *ok = false; | 923 *ok = false; |
| 882 } | 924 } |
| 883 } | 925 } |
| 884 | 926 |
| 885 | 927 |
| 886 } } // v8::internal | 928 } } // v8::internal |
| 887 | 929 |
| 888 #endif // V8_PREPARSER_H | 930 #endif // V8_PREPARSER_H |
| OLD | NEW |