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

Side by Side Diff: src/preparser.h

Issue 206433003: Move ParseLeftHandSideExpression to ParserBase. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: code review 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 ParserRecorder* log, 90 ParserRecorder* log,
91 typename Traits::Type::Zone* zone, 91 typename Traits::Type::Zone* zone,
92 typename Traits::Type::Parser this_object) 92 typename Traits::Type::Parser this_object)
93 : Traits(this_object), 93 : Traits(this_object),
94 parenthesized_function_(false), 94 parenthesized_function_(false),
95 scope_(NULL), 95 scope_(NULL),
96 function_state_(NULL), 96 function_state_(NULL),
97 extension_(extension), 97 extension_(extension),
98 fni_(NULL), 98 fni_(NULL),
99 log_(log), 99 log_(log),
100 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly.
100 scanner_(scanner), 101 scanner_(scanner),
101 stack_limit_(stack_limit), 102 stack_limit_(stack_limit),
102 stack_overflow_(false), 103 stack_overflow_(false),
103 allow_lazy_(false), 104 allow_lazy_(false),
104 allow_natives_syntax_(false), 105 allow_natives_syntax_(false),
105 allow_generators_(false), 106 allow_generators_(false),
106 allow_for_of_(false), 107 allow_for_of_(false),
107 zone_(zone) { } 108 zone_(zone) { }
108 109
109 // Getters that indicate whether certain syntactical constructs are 110 // Getters that indicate whether certain syntactical constructs are
(...skipping 21 matching lines...) Expand all
131 void set_allow_harmony_numeric_literals(bool allow) { 132 void set_allow_harmony_numeric_literals(bool allow) {
132 scanner()->SetHarmonyNumericLiterals(allow); 133 scanner()->SetHarmonyNumericLiterals(allow);
133 } 134 }
134 135
135 protected: 136 protected:
136 enum AllowEvalOrArgumentsAsIdentifier { 137 enum AllowEvalOrArgumentsAsIdentifier {
137 kAllowEvalOrArguments, 138 kAllowEvalOrArguments,
138 kDontAllowEvalOrArguments 139 kDontAllowEvalOrArguments
139 }; 140 };
140 141
142 enum Mode {
143 PARSE_LAZILY,
144 PARSE_EAGERLY
145 };
146
141 // --------------------------------------------------------------------------- 147 // ---------------------------------------------------------------------------
142 // FunctionState and BlockState together implement the parser's scope stack. 148 // FunctionState and BlockState together implement the parser's scope stack.
143 // The parser's current scope is in scope_. BlockState and FunctionState 149 // The parser's current scope is in scope_. BlockState and FunctionState
144 // constructors push on the scope stack and the destructors pop. They are also 150 // constructors push on the scope stack and the destructors pop. They are also
145 // used to hold the parser's per-function and per-block state. 151 // used to hold the parser's per-function and per-block state.
146 class BlockState BASE_EMBEDDED { 152 class BlockState BASE_EMBEDDED {
147 public: 153 public:
148 BlockState(typename Traits::Type::Scope** scope_stack, 154 BlockState(typename Traits::Type::Scope** scope_stack,
149 typename Traits::Type::Scope* scope) 155 typename Traits::Type::Scope* scope)
150 : scope_stack_(scope_stack), 156 : scope_stack_(scope_stack),
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 FunctionState* outer_function_state_; 228 FunctionState* outer_function_state_;
223 typename Traits::Type::Scope** scope_stack_; 229 typename Traits::Type::Scope** scope_stack_;
224 typename Traits::Type::Scope* outer_scope_; 230 typename Traits::Type::Scope* outer_scope_;
225 Isolate* isolate_; // Only used by ParserTraits. 231 Isolate* isolate_; // Only used by ParserTraits.
226 int saved_ast_node_id_; // Only used by ParserTraits. 232 int saved_ast_node_id_; // Only used by ParserTraits.
227 typename Traits::Type::Factory factory_; 233 typename Traits::Type::Factory factory_;
228 234
229 friend class ParserTraits; 235 friend class ParserTraits;
230 }; 236 };
231 237
238 class ParsingModeScope BASE_EMBEDDED {
239 public:
240 ParsingModeScope(ParserBase* parser, Mode mode)
241 : parser_(parser),
242 old_mode_(parser->mode()) {
243 parser_->mode_ = mode;
244 }
245 ~ParsingModeScope() {
246 parser_->mode_ = old_mode_;
247 }
248
249 private:
250 ParserBase* parser_;
251 Mode old_mode_;
252 };
253
232 Scanner* scanner() const { return scanner_; } 254 Scanner* scanner() const { return scanner_; }
233 int position() { return scanner_->location().beg_pos; } 255 int position() { return scanner_->location().beg_pos; }
234 int peek_position() { return scanner_->peek_location().beg_pos; } 256 int peek_position() { return scanner_->peek_location().beg_pos; }
235 bool stack_overflow() const { return stack_overflow_; } 257 bool stack_overflow() const { return stack_overflow_; }
236 void set_stack_overflow() { stack_overflow_ = true; } 258 void set_stack_overflow() { stack_overflow_ = true; }
259 Mode mode() const { return mode_; }
237 typename Traits::Type::Zone* zone() const { return zone_; } 260 typename Traits::Type::Zone* zone() const { return zone_; }
238 261
239 INLINE(Token::Value peek()) { 262 INLINE(Token::Value peek()) {
240 if (stack_overflow_) return Token::ILLEGAL; 263 if (stack_overflow_) return Token::ILLEGAL;
241 return scanner()->peek(); 264 return scanner()->peek();
242 } 265 }
243 266
244 INLINE(Token::Value Next()) { 267 INLINE(Token::Value Next()) {
245 if (stack_overflow_) return Token::ILLEGAL; 268 if (stack_overflow_) return Token::ILLEGAL;
246 { 269 {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 ExpressionT ParseExpression(bool accept_IN, bool* ok); 412 ExpressionT ParseExpression(bool accept_IN, bool* ok);
390 ExpressionT ParseArrayLiteral(bool* ok); 413 ExpressionT ParseArrayLiteral(bool* ok);
391 ExpressionT ParseObjectLiteral(bool* ok); 414 ExpressionT ParseObjectLiteral(bool* ok);
392 typename Traits::Type::ExpressionList ParseArguments(bool* ok); 415 typename Traits::Type::ExpressionList ParseArguments(bool* ok);
393 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok); 416 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok);
394 ExpressionT ParseYieldExpression(bool* ok); 417 ExpressionT ParseYieldExpression(bool* ok);
395 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok); 418 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok);
396 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); 419 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
397 ExpressionT ParseUnaryExpression(bool* ok); 420 ExpressionT ParseUnaryExpression(bool* ok);
398 ExpressionT ParsePostfixExpression(bool* ok); 421 ExpressionT ParsePostfixExpression(bool* ok);
422 ExpressionT ParseLeftHandSideExpression(bool* ok);
399 423
400 // Used to detect duplicates in object literals. Each of the values 424 // Used to detect duplicates in object literals. Each of the values
401 // kGetterProperty, kSetterProperty and kValueProperty represents 425 // kGetterProperty, kSetterProperty and kValueProperty represents
402 // a type of object literal property. When parsing a property, its 426 // a type of object literal property. When parsing a property, its
403 // type value is stored in the DuplicateFinder for the property name. 427 // type value is stored in the DuplicateFinder for the property name.
404 // Values are chosen so that having intersection bits means the there is 428 // Values are chosen so that having intersection bits means the there is
405 // an incompatibility. 429 // an incompatibility.
406 // I.e., you can add a getter to a property that already has a setter, since 430 // I.e., you can add a getter to a property that already has a setter, since
407 // kGetterProperty and kSetterProperty doesn't intersect, but not if it 431 // kGetterProperty and kSetterProperty doesn't intersect, but not if it
408 // already has a getter or a value. Adding the getter to an existing 432 // already has a getter or a value. Adding the getter to an existing
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 // preceded by a parenthesis. 479 // preceded by a parenthesis.
456 // Heuristically that means that the function will be called immediately, 480 // Heuristically that means that the function will be called immediately,
457 // so never lazily compile it. 481 // so never lazily compile it.
458 bool parenthesized_function_; 482 bool parenthesized_function_;
459 483
460 typename Traits::Type::Scope* scope_; // Scope stack. 484 typename Traits::Type::Scope* scope_; // Scope stack.
461 FunctionState* function_state_; // Function state stack. 485 FunctionState* function_state_; // Function state stack.
462 v8::Extension* extension_; 486 v8::Extension* extension_;
463 FuncNameInferrer* fni_; 487 FuncNameInferrer* fni_;
464 ParserRecorder* log_; 488 ParserRecorder* log_;
489 Mode mode_;
465 490
466 private: 491 private:
467 Scanner* scanner_; 492 Scanner* scanner_;
468 uintptr_t stack_limit_; 493 uintptr_t stack_limit_;
469 bool stack_overflow_; 494 bool stack_overflow_;
470 495
471 bool allow_lazy_; 496 bool allow_lazy_;
472 bool allow_natives_syntax_; 497 bool allow_natives_syntax_;
473 bool allow_generators_; 498 bool allow_generators_;
474 bool allow_for_of_; 499 bool allow_for_of_;
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 bool IsThisProperty() { return code_ == kThisPropertyExpression; } 603 bool IsThisProperty() { return code_ == kThisPropertyExpression; }
579 604
580 bool IsProperty() { 605 bool IsProperty() {
581 return code_ == kPropertyExpression || code_ == kThisPropertyExpression; 606 return code_ == kPropertyExpression || code_ == kThisPropertyExpression;
582 } 607 }
583 608
584 bool IsValidLeftHandSide() { 609 bool IsValidLeftHandSide() {
585 return IsIdentifier() || IsProperty(); 610 return IsIdentifier() || IsProperty();
586 } 611 }
587 612
613 // At the moment PreParser doesn't track these expression types.
614 bool IsFunctionLiteral() const { return false; }
615 bool IsCall() const { return false; }
616 bool IsCallNew() const { return false; }
617
618 PreParserExpression AsFunctionLiteral() { return *this; }
619
588 // Dummy implementation for making expression->somefunc() work in both Parser 620 // Dummy implementation for making expression->somefunc() work in both Parser
589 // and PreParser. 621 // and PreParser.
590 PreParserExpression* operator->() { return this; } 622 PreParserExpression* operator->() { return this; }
591 623
592 // These are only used when doing function name inferring, and PreParser
593 // doesn't do function name inferring.
594 void* AsCall() const { return NULL; }
595 void* AsCallNew() const { return NULL; }
596
597 // More dummy implementations of things PreParser doesn't need to track: 624 // More dummy implementations of things PreParser doesn't need to track:
598 void set_index(int index) {} // For YieldExpressions 625 void set_index(int index) {} // For YieldExpressions
626 void set_parenthesized() {}
599 627
600 private: 628 private:
601 // Least significant 2 bits are used as flags. Bits 0 and 1 represent 629 // Least significant 2 bits are used as flags. Bits 0 and 1 represent
602 // identifiers or strings literals, and are mutually exclusive, but can both 630 // identifiers or strings literals, and are mutually exclusive, but can both
603 // be absent. If the expression is an identifier or a string literal, the 631 // be absent. If the expression is an identifier or a string literal, the
604 // other bits describe the type (see PreParserIdentifier::Type and string 632 // other bits describe the type (see PreParserIdentifier::Type and string
605 // literal constants below). 633 // literal constants below).
606 enum { 634 enum {
607 kUnknownExpression = 0, 635 kUnknownExpression = 0,
608 // Identifiers 636 // Identifiers
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 private: 694 private:
667 ScopeType scope_type_; 695 ScopeType scope_type_;
668 bool scope_inside_with_; 696 bool scope_inside_with_;
669 StrictMode strict_mode_; 697 StrictMode strict_mode_;
670 }; 698 };
671 699
672 700
673 class PreParserFactory { 701 class PreParserFactory {
674 public: 702 public:
675 explicit PreParserFactory(void* extra_param) {} 703 explicit PreParserFactory(void* extra_param) {}
676 704 PreParserExpression NewLiteral(PreParserIdentifier identifier,
705 int pos) {
706 return PreParserExpression::Default();
707 }
708 PreParserExpression NewNumberLiteral(double number,
709 int pos) {
710 return PreParserExpression::Default();
711 }
677 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, 712 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern,
678 PreParserIdentifier js_flags, 713 PreParserIdentifier js_flags,
679 int literal_index, 714 int literal_index,
680 int pos) { 715 int pos) {
681 return PreParserExpression::Default(); 716 return PreParserExpression::Default();
682 } 717 }
683 PreParserExpression NewUnaryOperation(Token::Value op,
684 PreParserExpression expression,
685 int pos) {
686 return PreParserExpression::Default();
687 }
688 PreParserExpression NewBinaryOperation(Token::Value op,
689 PreParserExpression left,
690 PreParserExpression right, int pos) {
691 return PreParserExpression::Default();
692 }
693 PreParserExpression NewCompareOperation(Token::Value op,
694 PreParserExpression left,
695 PreParserExpression right, int pos) {
696 return PreParserExpression::Default();
697 }
698 PreParserExpression NewArrayLiteral(PreParserExpressionList values, 718 PreParserExpression NewArrayLiteral(PreParserExpressionList values,
699 int literal_index, 719 int literal_index,
700 int pos) { 720 int pos) {
701 return PreParserExpression::Default(); 721 return PreParserExpression::Default();
702 } 722 }
703
704 PreParserExpression NewObjectLiteralProperty(bool is_getter, 723 PreParserExpression NewObjectLiteralProperty(bool is_getter,
705 PreParserExpression value, 724 PreParserExpression value,
706 int pos) { 725 int pos) {
707 return PreParserExpression::Default(); 726 return PreParserExpression::Default();
708 } 727 }
709
710 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, 728 PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
711 PreParserExpression value) { 729 PreParserExpression value) {
712 return PreParserExpression::Default(); 730 return PreParserExpression::Default();
713 } 731 }
714
715 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, 732 PreParserExpression NewObjectLiteral(PreParserExpressionList properties,
716 int literal_index, 733 int literal_index,
717 int boilerplate_properties, 734 int boilerplate_properties,
718 bool has_function, 735 bool has_function,
719 int pos) { 736 int pos) {
720 return PreParserExpression::Default(); 737 return PreParserExpression::Default();
721 } 738 }
722 739 PreParserExpression NewVariableProxy(void* generator_variable) {
723 PreParserExpression NewLiteral(PreParserIdentifier identifier,
724 int pos) {
725 return PreParserExpression::Default(); 740 return PreParserExpression::Default();
726 } 741 }
727 742 PreParserExpression NewProperty(PreParserExpression obj,
728 PreParserExpression NewNumberLiteral(double number, 743 PreParserExpression key,
729 int pos) { 744 int pos) {
745 if (obj.IsThis()) {
746 return PreParserExpression::ThisProperty();
747 }
748 return PreParserExpression::Property();
749 }
750 PreParserExpression NewUnaryOperation(Token::Value op,
751 PreParserExpression expression,
752 int pos) {
730 return PreParserExpression::Default(); 753 return PreParserExpression::Default();
731 } 754 }
732 755 PreParserExpression NewBinaryOperation(Token::Value op,
756 PreParserExpression left,
757 PreParserExpression right, int pos) {
758 return PreParserExpression::Default();
759 }
760 PreParserExpression NewCompareOperation(Token::Value op,
761 PreParserExpression left,
762 PreParserExpression right, int pos) {
763 return PreParserExpression::Default();
764 }
733 PreParserExpression NewAssignment(Token::Value op, 765 PreParserExpression NewAssignment(Token::Value op,
734 PreParserExpression left, 766 PreParserExpression left,
735 PreParserExpression right, 767 PreParserExpression right,
736 int pos) { 768 int pos) {
737 return PreParserExpression::Default(); 769 return PreParserExpression::Default();
738 } 770 }
739
740 PreParserExpression NewVariableProxy(void* generator_variable) {
741 return PreParserExpression::Default();
742 }
743
744 PreParserExpression NewYield(PreParserExpression generator_object, 771 PreParserExpression NewYield(PreParserExpression generator_object,
745 PreParserExpression expression, 772 PreParserExpression expression,
746 Yield::Kind yield_kind, 773 Yield::Kind yield_kind,
747 int pos) { 774 int pos) {
748 return PreParserExpression::Default(); 775 return PreParserExpression::Default();
749 } 776 }
750
751 PreParserExpression NewConditional(PreParserExpression condition, 777 PreParserExpression NewConditional(PreParserExpression condition,
752 PreParserExpression then_expression, 778 PreParserExpression then_expression,
753 PreParserExpression else_expression, 779 PreParserExpression else_expression,
754 int pos) { 780 int pos) {
755 return PreParserExpression::Default(); 781 return PreParserExpression::Default();
756 } 782 }
757
758 PreParserExpression NewCountOperation(Token::Value op, 783 PreParserExpression NewCountOperation(Token::Value op,
759 bool is_prefix, 784 bool is_prefix,
760 PreParserExpression expression, 785 PreParserExpression expression,
761 int pos) { 786 int pos) {
762 return PreParserExpression::Default(); 787 return PreParserExpression::Default();
763 } 788 }
789 PreParserExpression NewCall(PreParserExpression expression,
790 PreParserExpressionList arguments,
791 int pos) {
792 return PreParserExpression::Default();
793 }
764 }; 794 };
765 795
766 796
767 class PreParser; 797 class PreParser;
768 798
769 class PreParserTraits { 799 class PreParserTraits {
770 public: 800 public:
771 struct Type { 801 struct Type {
772 // TODO(marja): To be removed. The Traits object should contain all the data 802 // TODO(marja): To be removed. The Traits object should contain all the data
773 // it needs. 803 // it needs.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 // PreParser should not use FuncNameInferrer. 862 // PreParser should not use FuncNameInferrer.
833 ASSERT(false); 863 ASSERT(false);
834 } 864 }
835 865
836 static void CheckFunctionLiteralInsideTopLevelObjectLiteral( 866 static void CheckFunctionLiteralInsideTopLevelObjectLiteral(
837 PreParserScope* scope, PreParserExpression value, bool* has_function) {} 867 PreParserScope* scope, PreParserExpression value, bool* has_function) {}
838 868
839 static void CheckAssigningFunctionLiteralToProperty( 869 static void CheckAssigningFunctionLiteralToProperty(
840 PreParserExpression left, PreParserExpression right) {} 870 PreParserExpression left, PreParserExpression right) {}
841 871
872 // PreParser doesn't need to keep track of eval calls.
873 static void CheckPossibleEvalCall(PreParserExpression expression,
874 PreParserScope* scope) {}
875
842 static PreParserExpression MarkExpressionAsLValue( 876 static PreParserExpression MarkExpressionAsLValue(
843 PreParserExpression expression) { 877 PreParserExpression expression) {
844 // TODO(marja): To be able to produce the same errors, the preparser needs 878 // TODO(marja): To be able to produce the same errors, the preparser needs
845 // to start tracking which expressions are variables and which are lvalues. 879 // to start tracking which expressions are variables and which are lvalues.
846 return expression; 880 return expression;
847 } 881 }
848 882
849 // Checks LHS expression for assignment and prefix/postfix increment/decrement 883 // Checks LHS expression for assignment and prefix/postfix increment/decrement
850 // in strict mode. 884 // in strict mode.
851 void CheckStrictModeLValue(PreParserExpression expression, bool* ok); 885 void CheckStrictModeLValue(PreParserExpression expression, bool* ok);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 // Temporary glue; these functions will move to ParserBase. 972 // Temporary glue; these functions will move to ParserBase.
939 PreParserExpression ParseV8Intrinsic(bool* ok); 973 PreParserExpression ParseV8Intrinsic(bool* ok);
940 PreParserExpression ParseFunctionLiteral( 974 PreParserExpression ParseFunctionLiteral(
941 PreParserIdentifier name, 975 PreParserIdentifier name,
942 Scanner::Location function_name_location, 976 Scanner::Location function_name_location,
943 bool name_is_strict_reserved, 977 bool name_is_strict_reserved,
944 bool is_generator, 978 bool is_generator,
945 int function_token_position, 979 int function_token_position,
946 FunctionLiteral::FunctionType type, 980 FunctionLiteral::FunctionType type,
947 bool* ok); 981 bool* ok);
948 PreParserExpression ParseLeftHandSideExpression(bool* ok); 982 PreParserExpression ParseMemberWithNewPrefixesExpression(bool* ok);
949 983
950 private: 984 private:
951 PreParser* pre_parser_; 985 PreParser* pre_parser_;
952 }; 986 };
953 987
954 988
955 // Preparsing checks a JavaScript program and emits preparse-data that helps 989 // Preparsing checks a JavaScript program and emits preparse-data that helps
956 // a later parsing to be faster. 990 // a later parsing to be faster.
957 // See preparse-data-format.h for the data format. 991 // See preparse-data-format.h for the data format.
958 992
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 Statement ParseReturnStatement(bool* ok); 1136 Statement ParseReturnStatement(bool* ok);
1103 Statement ParseWithStatement(bool* ok); 1137 Statement ParseWithStatement(bool* ok);
1104 Statement ParseSwitchStatement(bool* ok); 1138 Statement ParseSwitchStatement(bool* ok);
1105 Statement ParseDoWhileStatement(bool* ok); 1139 Statement ParseDoWhileStatement(bool* ok);
1106 Statement ParseWhileStatement(bool* ok); 1140 Statement ParseWhileStatement(bool* ok);
1107 Statement ParseForStatement(bool* ok); 1141 Statement ParseForStatement(bool* ok);
1108 Statement ParseThrowStatement(bool* ok); 1142 Statement ParseThrowStatement(bool* ok);
1109 Statement ParseTryStatement(bool* ok); 1143 Statement ParseTryStatement(bool* ok);
1110 Statement ParseDebuggerStatement(bool* ok); 1144 Statement ParseDebuggerStatement(bool* ok);
1111 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 1145 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
1112 Expression ParseLeftHandSideExpression(bool* ok);
1113 Expression ParseMemberExpression(bool* ok); 1146 Expression ParseMemberExpression(bool* ok);
1114 Expression ParseMemberExpressionContinuation(PreParserExpression expression, 1147 Expression ParseMemberExpressionContinuation(PreParserExpression expression,
1115 bool* ok); 1148 bool* ok);
1116 Expression ParseMemberWithNewPrefixesExpression(bool* ok); 1149 Expression ParseMemberWithNewPrefixesExpression(bool* ok);
1117 Expression ParseObjectLiteral(bool* ok); 1150 Expression ParseObjectLiteral(bool* ok);
1118 Expression ParseV8Intrinsic(bool* ok); 1151 Expression ParseV8Intrinsic(bool* ok);
1119 1152
1120 Expression ParseFunctionLiteral( 1153 Expression ParseFunctionLiteral(
1121 Identifier name, 1154 Identifier name,
1122 Scanner::Location function_name_location, 1155 Scanner::Location function_name_location,
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
1691 1724
1692 this->CheckAssigningFunctionLiteralToProperty(expression, right); 1725 this->CheckAssigningFunctionLiteralToProperty(expression, right);
1693 1726
1694 if (fni_ != NULL) { 1727 if (fni_ != NULL) {
1695 // Check if the right hand side is a call to avoid inferring a 1728 // Check if the right hand side is a call to avoid inferring a
1696 // name if we're dealing with "a = function(){...}();"-like 1729 // name if we're dealing with "a = function(){...}();"-like
1697 // expression. 1730 // expression.
1698 if ((op == Token::INIT_VAR 1731 if ((op == Token::INIT_VAR
1699 || op == Token::INIT_CONST_LEGACY 1732 || op == Token::INIT_CONST_LEGACY
1700 || op == Token::ASSIGN) 1733 || op == Token::ASSIGN)
1701 && (right->AsCall() == NULL && right->AsCallNew() == NULL)) { 1734 && (!right->IsCall() && !right->IsCallNew())) {
1702 fni_->Infer(); 1735 fni_->Infer();
1703 } else { 1736 } else {
1704 fni_->RemoveLastFunction(); 1737 fni_->RemoveLastFunction();
1705 } 1738 }
1706 fni_->Leave(); 1739 fni_->Leave();
1707 } 1740 }
1708 1741
1709 return factory()->NewAssignment(op, expression, right, pos); 1742 return factory()->NewAssignment(op, expression, right, pos);
1710 } 1743 }
1711 1744
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1883 expression = 1916 expression =
1884 factory()->NewCountOperation(next, 1917 factory()->NewCountOperation(next,
1885 false /* postfix */, 1918 false /* postfix */,
1886 expression, 1919 expression,
1887 position()); 1920 position());
1888 } 1921 }
1889 return expression; 1922 return expression;
1890 } 1923 }
1891 1924
1892 1925
1926 template <class Traits>
1927 typename ParserBase<Traits>::ExpressionT
1928 ParserBase<Traits>::ParseLeftHandSideExpression(bool* ok) {
1929 // LeftHandSideExpression ::
1930 // (NewExpression | MemberExpression) ...
1931
1932 ExpressionT result = this->ParseMemberWithNewPrefixesExpression(CHECK_OK);
1933
1934 while (true) {
1935 switch (peek()) {
1936 case Token::LBRACK: {
1937 Consume(Token::LBRACK);
1938 int pos = position();
1939 ExpressionT index = ParseExpression(true, CHECK_OK);
1940 result = factory()->NewProperty(result, index, pos);
1941 Expect(Token::RBRACK, CHECK_OK);
1942 break;
1943 }
1944
1945 case Token::LPAREN: {
1946 int pos;
1947 if (scanner()->current_token() == Token::IDENTIFIER) {
1948 // For call of an identifier we want to report position of
1949 // the identifier as position of the call in the stack trace.
1950 pos = position();
1951 } else {
1952 // For other kinds of calls we record position of the parenthesis as
1953 // position of the call. Note that this is extremely important for
1954 // expressions of the form function(){...}() for which call position
1955 // should not point to the closing brace otherwise it will intersect
1956 // with positions recorded for function literal and confuse debugger.
1957 pos = peek_position();
1958 // Also the trailing parenthesis are a hint that the function will
1959 // be called immediately. If we happen to have parsed a preceding
1960 // function literal eagerly, we can also compile it eagerly.
1961 if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
1962 result->AsFunctionLiteral()->set_parenthesized();
1963 }
1964 }
1965 typename Traits::Type::ExpressionList args = ParseArguments(CHECK_OK);
1966
1967 // Keep track of eval() calls since they disable all local variable
1968 // optimizations.
1969 // The calls that need special treatment are the
1970 // direct eval calls. These calls are all of the form eval(...), with
1971 // no explicit receiver.
1972 // These calls are marked as potentially direct eval calls. Whether
1973 // they are actually direct calls to eval is determined at run time.
1974 this->CheckPossibleEvalCall(result, scope_);
1975 result = factory()->NewCall(result, args, pos);
1976 if (fni_ != NULL) fni_->RemoveLastFunction();
1977 break;
1978 }
1979
1980 case Token::PERIOD: {
1981 Consume(Token::PERIOD);
1982 int pos = position();
1983 IdentifierT name = ParseIdentifierName(CHECK_OK);
1984 result = factory()->NewProperty(
1985 result, factory()->NewLiteral(name, pos), pos);
1986 if (fni_ != NULL) this->PushLiteralName(fni_, name);
1987 break;
1988 }
1989
1990 default:
1991 return result;
1992 }
1993 }
1994 }
1995
1996
1893 #undef CHECK_OK 1997 #undef CHECK_OK
1894 #undef CHECK_OK_CUSTOM 1998 #undef CHECK_OK_CUSTOM
1895 1999
1896 2000
1897 template <typename Traits> 2001 template <typename Traits>
1898 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( 2002 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty(
1899 Token::Value property, 2003 Token::Value property,
1900 PropertyKind type, 2004 PropertyKind type,
1901 bool* ok) { 2005 bool* ok) {
1902 int old; 2006 int old;
(...skipping 20 matching lines...) Expand all
1923 "accessor_get_set"); 2027 "accessor_get_set");
1924 } 2028 }
1925 *ok = false; 2029 *ok = false;
1926 } 2030 }
1927 } 2031 }
1928 2032
1929 2033
1930 } } // v8::internal 2034 } } // v8::internal
1931 2035
1932 #endif // V8_PREPARSER_H 2036 #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