Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: src/preparser.h

Issue 196933005: Move ParseBinaryExpression to ParserBase. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: . Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 typename Traits::Type::Expression ParsePrimaryExpression(bool* ok); 341 typename Traits::Type::Expression ParsePrimaryExpression(bool* ok);
342 typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok); 342 typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok);
343 typename Traits::Type::Expression ParseArrayLiteral(bool* ok); 343 typename Traits::Type::Expression ParseArrayLiteral(bool* ok);
344 typename Traits::Type::Expression ParseObjectLiteral(bool* ok); 344 typename Traits::Type::Expression ParseObjectLiteral(bool* ok);
345 typename Traits::Type::ExpressionList ParseArguments(bool* ok); 345 typename Traits::Type::ExpressionList ParseArguments(bool* ok);
346 typename Traits::Type::Expression ParseAssignmentExpression(bool accept_IN, 346 typename Traits::Type::Expression ParseAssignmentExpression(bool accept_IN,
347 bool* ok); 347 bool* ok);
348 typename Traits::Type::Expression ParseYieldExpression(bool* ok); 348 typename Traits::Type::Expression ParseYieldExpression(bool* ok);
349 typename Traits::Type::Expression ParseConditionalExpression(bool accept_IN, 349 typename Traits::Type::Expression ParseConditionalExpression(bool accept_IN,
350 bool* ok); 350 bool* ok);
351 typename Traits::Type::Expression ParseBinaryExpression(int prec,
352 bool accept_IN,
353 bool* ok);
351 354
352 // Used to detect duplicates in object literals. Each of the values 355 // Used to detect duplicates in object literals. Each of the values
353 // kGetterProperty, kSetterProperty and kValueProperty represents 356 // kGetterProperty, kSetterProperty and kValueProperty represents
354 // a type of object literal property. When parsing a property, its 357 // a type of object literal property. When parsing a property, its
355 // type value is stored in the DuplicateFinder for the property name. 358 // type value is stored in the DuplicateFinder for the property name.
356 // Values are chosen so that having intersection bits means the there is 359 // Values are chosen so that having intersection bits means the there is
357 // an incompatibility. 360 // an incompatibility.
358 // I.e., you can add a getter to a property that already has a setter, since 361 // I.e., you can add a getter to a property that already has a setter, since
359 // kGetterProperty and kSetterProperty doesn't intersect, but not if it 362 // kGetterProperty and kSetterProperty doesn't intersect, but not if it
360 // already has a getter or a value. Adding the getter to an existing 363 // already has a getter or a value. Adding the getter to an existing
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 class PreParserFactory { 617 class PreParserFactory {
615 public: 618 public:
616 explicit PreParserFactory(void* extra_param) {} 619 explicit PreParserFactory(void* extra_param) {}
617 620
618 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, 621 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern,
619 PreParserIdentifier js_flags, 622 PreParserIdentifier js_flags,
620 int literal_index, 623 int literal_index,
621 int pos) { 624 int pos) {
622 return PreParserExpression::Default(); 625 return PreParserExpression::Default();
623 } 626 }
627 PreParserExpression NewUnaryOperation(Token::Value op,
628 PreParserExpression expression,
629 int pos) {
630 return PreParserExpression::Default();
631 }
624 PreParserExpression NewBinaryOperation(Token::Value op, 632 PreParserExpression NewBinaryOperation(Token::Value op,
625 PreParserExpression left, 633 PreParserExpression left,
626 PreParserExpression right, int pos) { 634 PreParserExpression right, int pos) {
627 return PreParserExpression::Default(); 635 return PreParserExpression::Default();
628 } 636 }
637 PreParserExpression NewCompareOperation(Token::Value op,
638 PreParserExpression left,
639 PreParserExpression right, int pos) {
640 return PreParserExpression::Default();
641 }
629 PreParserExpression NewArrayLiteral(PreParserExpressionList values, 642 PreParserExpression NewArrayLiteral(PreParserExpressionList values,
630 int literal_index, 643 int literal_index,
631 int pos) { 644 int pos) {
632 return PreParserExpression::Default(); 645 return PreParserExpression::Default();
633 } 646 }
634 647
635 PreParserExpression NewObjectLiteralProperty(bool is_getter, 648 PreParserExpression NewObjectLiteralProperty(bool is_getter,
636 PreParserExpression value, 649 PreParserExpression value,
637 int pos) { 650 int pos) {
638 return PreParserExpression::Default(); 651 return PreParserExpression::Default();
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 PreParserExpression expression) { 780 PreParserExpression expression) {
768 // TODO(marja): To be able to produce the same errors, the preparser needs 781 // TODO(marja): To be able to produce the same errors, the preparser needs
769 // to start tracking which expressions are variables and which are lvalues. 782 // to start tracking which expressions are variables and which are lvalues.
770 return expression; 783 return expression;
771 } 784 }
772 785
773 // Checks LHS expression for assignment and prefix/postfix increment/decrement 786 // Checks LHS expression for assignment and prefix/postfix increment/decrement
774 // in strict mode. 787 // in strict mode.
775 void CheckStrictModeLValue(PreParserExpression expression, bool* ok); 788 void CheckStrictModeLValue(PreParserExpression expression, bool* ok);
776 789
790 bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x,
791 PreParserExpression y,
792 Token::Value op,
793 int pos,
794 PreParserFactory* factory) {
795 return false;
796 }
777 797
778 // Reporting errors. 798 // Reporting errors.
779 void ReportMessageAt(Scanner::Location location, 799 void ReportMessageAt(Scanner::Location location,
780 const char* message, 800 const char* message,
781 Vector<const char*> args); 801 Vector<const char*> args);
782 void ReportMessageAt(Scanner::Location location, 802 void ReportMessageAt(Scanner::Location location,
783 const char* type, 803 const char* type,
784 const char* name_opt); 804 const char* name_opt);
785 void ReportMessageAt(int start_pos, 805 void ReportMessageAt(int start_pos,
786 int end_pos, 806 int end_pos,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 // Temporary glue; these functions will move to ParserBase. 866 // Temporary glue; these functions will move to ParserBase.
847 PreParserExpression ParseV8Intrinsic(bool* ok); 867 PreParserExpression ParseV8Intrinsic(bool* ok);
848 PreParserExpression ParseFunctionLiteral( 868 PreParserExpression ParseFunctionLiteral(
849 PreParserIdentifier name, 869 PreParserIdentifier name,
850 Scanner::Location function_name_location, 870 Scanner::Location function_name_location,
851 bool name_is_strict_reserved, 871 bool name_is_strict_reserved,
852 bool is_generator, 872 bool is_generator,
853 int function_token_position, 873 int function_token_position,
854 FunctionLiteral::FunctionType type, 874 FunctionLiteral::FunctionType type,
855 bool* ok); 875 bool* ok);
856 PreParserExpression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); 876 PreParserExpression ParseUnaryExpression(bool* ok);
857 877
858 private: 878 private:
859 PreParser* pre_parser_; 879 PreParser* pre_parser_;
860 }; 880 };
861 881
862 882
863 // Preparsing checks a JavaScript program and emits preparse-data that helps 883 // Preparsing checks a JavaScript program and emits preparse-data that helps
864 // a later parsing to be faster. 884 // a later parsing to be faster.
865 // See preparse-data-format.h for the data format. 885 // See preparse-data-format.h for the data format.
866 886
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 Statement ParseReturnStatement(bool* ok); 1032 Statement ParseReturnStatement(bool* ok);
1013 Statement ParseWithStatement(bool* ok); 1033 Statement ParseWithStatement(bool* ok);
1014 Statement ParseSwitchStatement(bool* ok); 1034 Statement ParseSwitchStatement(bool* ok);
1015 Statement ParseDoWhileStatement(bool* ok); 1035 Statement ParseDoWhileStatement(bool* ok);
1016 Statement ParseWhileStatement(bool* ok); 1036 Statement ParseWhileStatement(bool* ok);
1017 Statement ParseForStatement(bool* ok); 1037 Statement ParseForStatement(bool* ok);
1018 Statement ParseThrowStatement(bool* ok); 1038 Statement ParseThrowStatement(bool* ok);
1019 Statement ParseTryStatement(bool* ok); 1039 Statement ParseTryStatement(bool* ok);
1020 Statement ParseDebuggerStatement(bool* ok); 1040 Statement ParseDebuggerStatement(bool* ok);
1021 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 1041 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
1022 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
1023 Expression ParseUnaryExpression(bool* ok); 1042 Expression ParseUnaryExpression(bool* ok);
1024 Expression ParsePostfixExpression(bool* ok); 1043 Expression ParsePostfixExpression(bool* ok);
1025 Expression ParseLeftHandSideExpression(bool* ok); 1044 Expression ParseLeftHandSideExpression(bool* ok);
1026 Expression ParseMemberExpression(bool* ok); 1045 Expression ParseMemberExpression(bool* ok);
1027 Expression ParseMemberExpressionContinuation(PreParserExpression expression, 1046 Expression ParseMemberExpressionContinuation(PreParserExpression expression,
1028 bool* ok); 1047 bool* ok);
1029 Expression ParseMemberWithNewPrefixesExpression(bool* ok); 1048 Expression ParseMemberWithNewPrefixesExpression(bool* ok);
1030 Expression ParseObjectLiteral(bool* ok); 1049 Expression ParseObjectLiteral(bool* ok);
1031 Expression ParseV8Intrinsic(bool* ok); 1050 Expression ParseV8Intrinsic(bool* ok);
1032 1051
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after
1680 // section 11.12, page 58. 1699 // section 11.12, page 58.
1681 typename Traits::Type::Expression left = 1700 typename Traits::Type::Expression left =
1682 ParseAssignmentExpression(true, CHECK_OK); 1701 ParseAssignmentExpression(true, CHECK_OK);
1683 Expect(Token::COLON, CHECK_OK); 1702 Expect(Token::COLON, CHECK_OK);
1684 typename Traits::Type::Expression right = 1703 typename Traits::Type::Expression right =
1685 ParseAssignmentExpression(accept_IN, CHECK_OK); 1704 ParseAssignmentExpression(accept_IN, CHECK_OK);
1686 return factory()->NewConditional(expression, left, right, pos); 1705 return factory()->NewConditional(expression, left, right, pos);
1687 } 1706 }
1688 1707
1689 1708
1709 // Precedence >= 4
1710 template <class Traits>
1711 typename Traits::Type::Expression
1712 ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) {
1713 ASSERT(prec >= 4);
1714 typename Traits::Type::Expression x = this->ParseUnaryExpression(CHECK_OK);
1715 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
1716 // prec1 >= 4
1717 while (Precedence(peek(), accept_IN) == prec1) {
1718 Token::Value op = Next();
1719 int pos = position();
1720 typename Traits::Type::Expression y =
1721 ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
1722
1723 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos,
1724 factory())) {
1725 continue;
1726 }
1727
1728 // For now we distinguish between comparisons and other binary
1729 // operations. (We could combine the two and get rid of this
1730 // code and AST node eventually.)
1731 if (Token::IsCompareOp(op)) {
1732 // We have a comparison.
1733 Token::Value cmp = op;
1734 switch (op) {
1735 case Token::NE: cmp = Token::EQ; break;
1736 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break;
1737 default: break;
1738 }
1739 x = factory()->NewCompareOperation(cmp, x, y, pos);
1740 if (cmp != op) {
1741 // The comparison was negated - add a NOT.
1742 x = factory()->NewUnaryOperation(Token::NOT, x, pos);
1743 }
1744
1745 } else {
1746 // We have a "normal" binary operation.
1747 x = factory()->NewBinaryOperation(op, x, y, pos);
1748 }
1749 }
1750 }
1751 return x;
1752 }
1753
1754
1690 #undef CHECK_OK 1755 #undef CHECK_OK
1691 #undef CHECK_OK_CUSTOM 1756 #undef CHECK_OK_CUSTOM
1692 1757
1693 1758
1694 template <typename Traits> 1759 template <typename Traits>
1695 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( 1760 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty(
1696 Token::Value property, 1761 Token::Value property,
1697 PropertyKind type, 1762 PropertyKind type,
1698 bool* ok) { 1763 bool* ok) {
1699 int old; 1764 int old;
(...skipping 22 matching lines...) Expand all
1722 "accessor_get_set"); 1787 "accessor_get_set");
1723 } 1788 }
1724 *ok = false; 1789 *ok = false;
1725 } 1790 }
1726 } 1791 }
1727 1792
1728 1793
1729 } } // v8::internal 1794 } } // v8::internal
1730 1795
1731 #endif // V8_PREPARSER_H 1796 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698