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

Side by Side Diff: src/preparser.h

Issue 197353003: Move ParseYieldExpression 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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal, 338 typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal,
339 bool* ok); 339 bool* ok);
340 340
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 349
349 // Used to detect duplicates in object literals. Each of the values 350 // Used to detect duplicates in object literals. Each of the values
350 // kGetterProperty, kSetterProperty and kValueProperty represents 351 // kGetterProperty, kSetterProperty and kValueProperty represents
351 // a type of object literal property. When parsing a property, its 352 // a type of object literal property. When parsing a property, its
352 // type value is stored in the DuplicateFinder for the property name. 353 // type value is stored in the DuplicateFinder for the property name.
353 // Values are chosen so that having intersection bits means the there is 354 // Values are chosen so that having intersection bits means the there is
354 // an incompatibility. 355 // an incompatibility.
355 // I.e., you can add a getter to a property that already has a setter, since 356 // I.e., you can add a getter to a property that already has a setter, since
356 // kGetterProperty and kSetterProperty doesn't intersect, but not if it 357 // kGetterProperty and kSetterProperty doesn't intersect, but not if it
357 // already has a getter or a value. Adding the getter to an existing 358 // already has a getter or a value. Adding the getter to an existing
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 bool IsStrictFunction() { return code_ == kStrictFunctionExpression; } 529 bool IsStrictFunction() { return code_ == kStrictFunctionExpression; }
529 530
530 // Dummy implementation for making expression->AsCall() work (see below). 531 // Dummy implementation for making expression->AsCall() work (see below).
531 PreParserExpression* operator->() { return this; } 532 PreParserExpression* operator->() { return this; }
532 533
533 // These are only used when doing function name inferring, and PreParser 534 // These are only used when doing function name inferring, and PreParser
534 // doesn't do function name inferring. 535 // doesn't do function name inferring.
535 void* AsCall() const { return NULL; } 536 void* AsCall() const { return NULL; }
536 void* AsCallNew() const { return NULL; } 537 void* AsCallNew() const { return NULL; }
537 538
539 // More dummy implementations of things PreParser doesn't need to track:
540 void set_index(int index) {} // For YieldExpressions
541
538 private: 542 private:
539 // First two/three bits are used as flags. 543 // First two/three bits are used as flags.
540 // Bit 0 and 1 represent identifiers or strings literals, and are 544 // Bit 0 and 1 represent identifiers or strings literals, and are
541 // mutually exclusive, but can both be absent. 545 // mutually exclusive, but can both be absent.
542 enum { 546 enum {
543 kUnknownExpression = 0, 547 kUnknownExpression = 0,
544 // Identifiers 548 // Identifiers
545 kIdentifierFlag = 1, // Used to detect labels. 549 kIdentifierFlag = 1, // Used to detect labels.
546 kIdentifierShift = 3, 550 kIdentifierShift = 3,
547 551
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 int pos) { 658 int pos) {
655 return PreParserExpression::Default(); 659 return PreParserExpression::Default();
656 } 660 }
657 661
658 PreParserExpression NewAssignment(Token::Value op, 662 PreParserExpression NewAssignment(Token::Value op,
659 PreParserExpression left, 663 PreParserExpression left,
660 PreParserExpression right, 664 PreParserExpression right,
661 int pos) { 665 int pos) {
662 return PreParserExpression::Default(); 666 return PreParserExpression::Default();
663 } 667 }
668
669 PreParserExpression NewVariableProxy(void* generator_variable) {
670 return PreParserExpression::Default();
671 }
672
673 PreParserExpression NewYield(PreParserExpression generator_object,
674 PreParserExpression expression,
675 Yield::Kind yield_kind,
676 int pos) {
677 return PreParserExpression::Default();
678 }
664 }; 679 };
665 680
666 681
667 class PreParser; 682 class PreParser;
668 683
669 class PreParserTraits { 684 class PreParserTraits {
670 public: 685 public:
671 struct Type { 686 struct Type {
672 typedef PreParser* Parser; 687 typedef PreParser* Parser;
673 688
674 // Types used by FunctionState and BlockState. 689 // Types used by FunctionState and BlockState.
675 typedef PreParserScope Scope; 690 typedef PreParserScope Scope;
676 typedef PreParserFactory Factory; 691 typedef PreParserFactory Factory;
677 // PreParser doesn't need to store generator variables. 692 // PreParser doesn't need to store generator variables.
678 typedef void GeneratorVariable; 693 typedef void GeneratorVariable;
679 // No interaction with Zones. 694 // No interaction with Zones.
680 typedef void Zone; 695 typedef void Zone;
681 696
682 // Return types for traversing functions. 697 // Return types for traversing functions.
683 typedef PreParserIdentifier Identifier; 698 typedef PreParserIdentifier Identifier;
684 typedef PreParserExpression Expression; 699 typedef PreParserExpression Expression;
700 typedef PreParserExpression YieldExpression;
685 typedef PreParserExpression FunctionLiteral; 701 typedef PreParserExpression FunctionLiteral;
686 typedef PreParserExpression ObjectLiteralProperty; 702 typedef PreParserExpression ObjectLiteralProperty;
687 typedef PreParserExpression Literal; 703 typedef PreParserExpression Literal;
688 typedef PreParserExpressionList ExpressionList; 704 typedef PreParserExpressionList ExpressionList;
689 typedef PreParserExpressionList PropertyList; 705 typedef PreParserExpressionList PropertyList;
690 }; 706 };
691 707
692 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} 708 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}
693 709
694 // Custom operations executed when FunctionStates are created and 710 // Custom operations executed when FunctionStates are created and
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 // Temporary glue; these functions will move to ParserBase. 837 // Temporary glue; these functions will move to ParserBase.
822 PreParserExpression ParseV8Intrinsic(bool* ok); 838 PreParserExpression ParseV8Intrinsic(bool* ok);
823 PreParserExpression ParseFunctionLiteral( 839 PreParserExpression ParseFunctionLiteral(
824 PreParserIdentifier name, 840 PreParserIdentifier name,
825 Scanner::Location function_name_location, 841 Scanner::Location function_name_location,
826 bool name_is_strict_reserved, 842 bool name_is_strict_reserved,
827 bool is_generator, 843 bool is_generator,
828 int function_token_position, 844 int function_token_position,
829 FunctionLiteral::FunctionType type, 845 FunctionLiteral::FunctionType type,
830 bool* ok); 846 bool* ok);
831 PreParserExpression ParseYieldExpression(bool* ok);
832 PreParserExpression ParseConditionalExpression(bool accept_IN, bool* ok); 847 PreParserExpression ParseConditionalExpression(bool accept_IN, bool* ok);
833 848
834 private: 849 private:
835 PreParser* pre_parser_; 850 PreParser* pre_parser_;
836 }; 851 };
837 852
838 853
839 // Preparsing checks a JavaScript program and emits preparse-data that helps 854 // Preparsing checks a JavaScript program and emits preparse-data that helps
840 // a later parsing to be faster. 855 // a later parsing to be faster.
841 // See preparse-data-format.h for the data format. 856 // See preparse-data-format.h for the data format.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 Statement ParseBreakStatement(bool* ok); 1002 Statement ParseBreakStatement(bool* ok);
988 Statement ParseReturnStatement(bool* ok); 1003 Statement ParseReturnStatement(bool* ok);
989 Statement ParseWithStatement(bool* ok); 1004 Statement ParseWithStatement(bool* ok);
990 Statement ParseSwitchStatement(bool* ok); 1005 Statement ParseSwitchStatement(bool* ok);
991 Statement ParseDoWhileStatement(bool* ok); 1006 Statement ParseDoWhileStatement(bool* ok);
992 Statement ParseWhileStatement(bool* ok); 1007 Statement ParseWhileStatement(bool* ok);
993 Statement ParseForStatement(bool* ok); 1008 Statement ParseForStatement(bool* ok);
994 Statement ParseThrowStatement(bool* ok); 1009 Statement ParseThrowStatement(bool* ok);
995 Statement ParseTryStatement(bool* ok); 1010 Statement ParseTryStatement(bool* ok);
996 Statement ParseDebuggerStatement(bool* ok); 1011 Statement ParseDebuggerStatement(bool* ok);
997 Expression ParseYieldExpression(bool* ok);
998 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 1012 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
999 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); 1013 Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
1000 Expression ParseUnaryExpression(bool* ok); 1014 Expression ParseUnaryExpression(bool* ok);
1001 Expression ParsePostfixExpression(bool* ok); 1015 Expression ParsePostfixExpression(bool* ok);
1002 Expression ParseLeftHandSideExpression(bool* ok); 1016 Expression ParseLeftHandSideExpression(bool* ok);
1003 Expression ParseMemberExpression(bool* ok); 1017 Expression ParseMemberExpression(bool* ok);
1004 Expression ParseMemberExpressionContinuation(PreParserExpression expression, 1018 Expression ParseMemberExpressionContinuation(PreParserExpression expression,
1005 bool* ok); 1019 bool* ok);
1006 Expression ParseMemberWithNewPrefixesExpression(bool* ok); 1020 Expression ParseMemberWithNewPrefixesExpression(bool* ok);
1007 Expression ParseObjectLiteral(bool* ok); 1021 Expression ParseObjectLiteral(bool* ok);
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 fni_->Infer(); 1623 fni_->Infer();
1610 } else { 1624 } else {
1611 fni_->RemoveLastFunction(); 1625 fni_->RemoveLastFunction();
1612 } 1626 }
1613 fni_->Leave(); 1627 fni_->Leave();
1614 } 1628 }
1615 1629
1616 return factory()->NewAssignment(op, expression, right, pos); 1630 return factory()->NewAssignment(op, expression, right, pos);
1617 } 1631 }
1618 1632
1633 template <class Traits>
1634 typename Traits::Type::Expression ParserBase<Traits>::ParseYieldExpression(
1635 bool* ok) {
1636 // YieldExpression ::
1637 // 'yield' '*'? AssignmentExpression
1638 int pos = peek_position();
1639 Expect(Token::YIELD, CHECK_OK);
1640 Yield::Kind kind =
1641 Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND;
1642 typename Traits::Type::Expression generator_object =
1643 factory()->NewVariableProxy(function_state_->generator_object_variable());
1644 typename Traits::Type::Expression expression =
1645 ParseAssignmentExpression(false, CHECK_OK);
1646 typename Traits::Type::YieldExpression yield =
1647 factory()->NewYield(generator_object, expression, kind, pos);
1648 if (kind == Yield::DELEGATING) {
1649 yield->set_index(function_state_->NextHandlerIndex());
1650 }
1651 return yield;
1652 }
1653
1654
1619 #undef CHECK_OK 1655 #undef CHECK_OK
1620 #undef CHECK_OK_CUSTOM 1656 #undef CHECK_OK_CUSTOM
1621 1657
1622 1658
1623 template <typename Traits> 1659 template <typename Traits>
1624 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( 1660 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty(
1625 Token::Value property, 1661 Token::Value property,
1626 PropertyKind type, 1662 PropertyKind type,
1627 bool* ok) { 1663 bool* ok) {
1628 int old; 1664 int old;
(...skipping 22 matching lines...) Expand all
1651 "accessor_get_set"); 1687 "accessor_get_set");
1652 } 1688 }
1653 *ok = false; 1689 *ok = false;
1654 } 1690 }
1655 } 1691 }
1656 1692
1657 1693
1658 } } // v8::internal 1694 } } // v8::internal
1659 1695
1660 #endif // V8_PREPARSER_H 1696 #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