| 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|