| 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 25 matching lines...) Expand all  Loading... | 
|    36  |    36  | 
|    37 namespace v8 { |    37 namespace v8 { | 
|    38 namespace internal { |    38 namespace internal { | 
|    39  |    39  | 
|    40 // Common base class shared between parser and pre-parser. |    40 // Common base class shared between parser and pre-parser. | 
|    41 template <typename Traits> |    41 template <typename Traits> | 
|    42 class ParserBase : public Traits { |    42 class ParserBase : public Traits { | 
|    43  public: |    43  public: | 
|    44   ParserBase(Scanner* scanner, uintptr_t stack_limit, |    44   ParserBase(Scanner* scanner, uintptr_t stack_limit, | 
|    45              v8::Extension* extension, |    45              v8::Extension* extension, | 
 |    46              typename Traits::Type::Zone* zone, | 
|    46              typename Traits::Type::Parser this_object) |    47              typename Traits::Type::Parser this_object) | 
|    47       : Traits(this_object), |    48       : Traits(this_object), | 
|    48         parenthesized_function_(false), |    49         parenthesized_function_(false), | 
|    49         scope_(NULL), |    50         scope_(NULL), | 
|    50         function_state_(NULL), |    51         function_state_(NULL), | 
|    51         extension_(extension), |    52         extension_(extension), | 
|    52         scanner_(scanner), |    53         scanner_(scanner), | 
|    53         stack_limit_(stack_limit), |    54         stack_limit_(stack_limit), | 
|    54         stack_overflow_(false), |    55         stack_overflow_(false), | 
|    55         allow_lazy_(false), |    56         allow_lazy_(false), | 
|    56         allow_natives_syntax_(false), |    57         allow_natives_syntax_(false), | 
|    57         allow_generators_(false), |    58         allow_generators_(false), | 
|    58         allow_for_of_(false) { } |    59         allow_for_of_(false), | 
 |    60         zone_(zone) { } | 
|    59  |    61  | 
|    60   // Getters that indicate whether certain syntactical constructs are |    62   // Getters that indicate whether certain syntactical constructs are | 
|    61   // allowed to be parsed by this instance of the parser. |    63   // allowed to be parsed by this instance of the parser. | 
|    62   bool allow_lazy() const { return allow_lazy_; } |    64   bool allow_lazy() const { return allow_lazy_; } | 
|    63   bool allow_natives_syntax() const { return allow_natives_syntax_; } |    65   bool allow_natives_syntax() const { return allow_natives_syntax_; } | 
|    64   bool allow_generators() const { return allow_generators_; } |    66   bool allow_generators() const { return allow_generators_; } | 
|    65   bool allow_for_of() const { return allow_for_of_; } |    67   bool allow_for_of() const { return allow_for_of_; } | 
|    66   bool allow_modules() const { return scanner()->HarmonyModules(); } |    68   bool allow_modules() const { return scanner()->HarmonyModules(); } | 
|    67   bool allow_harmony_scoping() const { return scanner()->HarmonyScoping(); } |    69   bool allow_harmony_scoping() const { return scanner()->HarmonyScoping(); } | 
|    68   bool allow_harmony_numeric_literals() const { |    70   bool allow_harmony_numeric_literals() const { | 
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   178     typename Traits::Type::Factory factory_; |   180     typename Traits::Type::Factory factory_; | 
|   179  |   181  | 
|   180     friend class ParserTraits; |   182     friend class ParserTraits; | 
|   181   }; |   183   }; | 
|   182  |   184  | 
|   183   Scanner* scanner() const { return scanner_; } |   185   Scanner* scanner() const { return scanner_; } | 
|   184   int position() { return scanner_->location().beg_pos; } |   186   int position() { return scanner_->location().beg_pos; } | 
|   185   int peek_position() { return scanner_->peek_location().beg_pos; } |   187   int peek_position() { return scanner_->peek_location().beg_pos; } | 
|   186   bool stack_overflow() const { return stack_overflow_; } |   188   bool stack_overflow() const { return stack_overflow_; } | 
|   187   void set_stack_overflow() { stack_overflow_ = true; } |   189   void set_stack_overflow() { stack_overflow_ = true; } | 
 |   190   typename Traits::Type::Zone* zone() const { return zone_; } | 
|   188  |   191  | 
|   189   INLINE(Token::Value peek()) { |   192   INLINE(Token::Value peek()) { | 
|   190     if (stack_overflow_) return Token::ILLEGAL; |   193     if (stack_overflow_) return Token::ILLEGAL; | 
|   191     return scanner()->peek(); |   194     return scanner()->peek(); | 
|   192   } |   195   } | 
|   193  |   196  | 
|   194   INLINE(Token::Value Next()) { |   197   INLINE(Token::Value Next()) { | 
|   195     if (stack_overflow_) return Token::ILLEGAL; |   198     if (stack_overflow_) return Token::ILLEGAL; | 
|   196     { |   199     { | 
|   197       int marker; |   200       int marker; | 
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   328   typename Traits::Type::Identifier ParseIdentifierName(bool* ok); |   331   typename Traits::Type::Identifier ParseIdentifierName(bool* ok); | 
|   329   // Parses an identifier and determines whether or not it is 'get' or 'set'. |   332   // Parses an identifier and determines whether or not it is 'get' or 'set'. | 
|   330   typename Traits::Type::Identifier ParseIdentifierNameOrGetOrSet(bool* is_get, |   333   typename Traits::Type::Identifier ParseIdentifierNameOrGetOrSet(bool* is_get, | 
|   331                                                                 bool* is_set, |   334                                                                 bool* is_set, | 
|   332                                                                 bool* ok); |   335                                                                 bool* ok); | 
|   333  |   336  | 
|   334   typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal, |   337   typename Traits::Type::Expression ParseRegExpLiteral(bool seen_equal, | 
|   335                                                        bool* ok); |   338                                                        bool* ok); | 
|   336  |   339  | 
|   337   typename Traits::Type::Expression ParsePrimaryExpression(bool* ok); |   340   typename Traits::Type::Expression ParsePrimaryExpression(bool* ok); | 
 |   341   typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok); | 
 |   342   typename Traits::Type::Expression ParseArrayLiteral(bool* ok); | 
|   338  |   343  | 
|   339   // Used to detect duplicates in object literals. Each of the values |   344   // Used to detect duplicates in object literals. Each of the values | 
|   340   // kGetterProperty, kSetterProperty and kValueProperty represents |   345   // kGetterProperty, kSetterProperty and kValueProperty represents | 
|   341   // a type of object literal property. When parsing a property, its |   346   // a type of object literal property. When parsing a property, its | 
|   342   // type value is stored in the DuplicateFinder for the property name. |   347   // type value is stored in the DuplicateFinder for the property name. | 
|   343   // Values are chosen so that having intersection bits means the there is |   348   // Values are chosen so that having intersection bits means the there is | 
|   344   // an incompatibility. |   349   // an incompatibility. | 
|   345   // I.e., you can add a getter to a property that already has a setter, since |   350   // I.e., you can add a getter to a property that already has a setter, since | 
|   346   // kGetterProperty and kSetterProperty doesn't intersect, but not if it |   351   // kGetterProperty and kSetterProperty doesn't intersect, but not if it | 
|   347   // already has a getter or a value. Adding the getter to an existing |   352   // already has a getter or a value. Adding the getter to an existing | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   402  |   407  | 
|   403  private: |   408  private: | 
|   404   Scanner* scanner_; |   409   Scanner* scanner_; | 
|   405   uintptr_t stack_limit_; |   410   uintptr_t stack_limit_; | 
|   406   bool stack_overflow_; |   411   bool stack_overflow_; | 
|   407  |   412  | 
|   408   bool allow_lazy_; |   413   bool allow_lazy_; | 
|   409   bool allow_natives_syntax_; |   414   bool allow_natives_syntax_; | 
|   410   bool allow_generators_; |   415   bool allow_generators_; | 
|   411   bool allow_for_of_; |   416   bool allow_for_of_; | 
 |   417  | 
 |   418   typename Traits::Type::Zone* zone_;  // Only used by Parser. | 
|   412 }; |   419 }; | 
|   413  |   420  | 
|   414  |   421  | 
|   415 class PreParserIdentifier { |   422 class PreParserIdentifier { | 
|   416  public: |   423  public: | 
|   417   static PreParserIdentifier Default() { |   424   static PreParserIdentifier Default() { | 
|   418     return PreParserIdentifier(kUnknownIdentifier); |   425     return PreParserIdentifier(kUnknownIdentifier); | 
|   419   } |   426   } | 
|   420   static PreParserIdentifier Eval() { |   427   static PreParserIdentifier Eval() { | 
|   421     return PreParserIdentifier(kEvalIdentifier); |   428     return PreParserIdentifier(kEvalIdentifier); | 
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   534     kThisPropertyExpression = 8, |   541     kThisPropertyExpression = 8, | 
|   535     kStrictFunctionExpression = 12 |   542     kStrictFunctionExpression = 12 | 
|   536   }; |   543   }; | 
|   537  |   544  | 
|   538   explicit PreParserExpression(int expression_code) : code_(expression_code) {} |   545   explicit PreParserExpression(int expression_code) : code_(expression_code) {} | 
|   539  |   546  | 
|   540   int code_; |   547   int code_; | 
|   541 }; |   548 }; | 
|   542  |   549  | 
|   543  |   550  | 
 |   551 // PreParserExpressionList doesn't actually store the expressions because | 
 |   552 // PreParser doesn't need to. | 
 |   553 class PreParserExpressionList { | 
 |   554  public: | 
 |   555   // These functions make list->Add(some_expression) work (and do nothing). | 
 |   556   PreParserExpressionList* operator->() { return this; } | 
 |   557   void Add(PreParserExpression, void*) { } | 
 |   558 }; | 
 |   559  | 
 |   560  | 
|   544 class PreParserScope { |   561 class PreParserScope { | 
|   545  public: |   562  public: | 
|   546   explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type) |   563   explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type) | 
|   547       : scope_type_(scope_type) { |   564       : scope_type_(scope_type) { | 
|   548     if (outer_scope) { |   565     if (outer_scope) { | 
|   549       scope_inside_with_ = |   566       scope_inside_with_ = | 
|   550           outer_scope->scope_inside_with_ || is_with_scope(); |   567           outer_scope->scope_inside_with_ || is_with_scope(); | 
|   551       language_mode_ = outer_scope->language_mode(); |   568       language_mode_ = outer_scope->language_mode(); | 
|   552     } else { |   569     } else { | 
|   553       scope_inside_with_ = is_with_scope(); |   570       scope_inside_with_ = is_with_scope(); | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|   582 class PreParserFactory { |   599 class PreParserFactory { | 
|   583  public: |   600  public: | 
|   584   explicit PreParserFactory(void* extra_param) {} |   601   explicit PreParserFactory(void* extra_param) {} | 
|   585  |   602  | 
|   586   PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, |   603   PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, | 
|   587                                        PreParserIdentifier js_flags, |   604                                        PreParserIdentifier js_flags, | 
|   588                                        int literal_index, |   605                                        int literal_index, | 
|   589                                        int pos) { |   606                                        int pos) { | 
|   590     return PreParserExpression::Default(); |   607     return PreParserExpression::Default(); | 
|   591   } |   608   } | 
 |   609   PreParserExpression NewBinaryOperation(Token::Value op, | 
 |   610                                          PreParserExpression left, | 
 |   611                                          PreParserExpression right, int pos) { | 
 |   612     return PreParserExpression::Default(); | 
 |   613   } | 
 |   614   PreParserExpression NewArrayLiteral(PreParserExpressionList values, | 
 |   615                                       int literal_index, | 
 |   616                                       int pos) { | 
 |   617     return PreParserExpression::Default(); | 
 |   618   } | 
|   592 }; |   619 }; | 
|   593  |   620  | 
|   594  |   621  | 
|   595 class PreParser; |   622 class PreParser; | 
|   596  |   623  | 
|   597 class PreParserTraits { |   624 class PreParserTraits { | 
|   598  public: |   625  public: | 
|   599   struct Type { |   626   struct Type { | 
|   600     typedef PreParser* Parser; |   627     typedef PreParser* Parser; | 
|   601  |   628  | 
|   602     // Types used by FunctionState and BlockState. |   629     // Types used by FunctionState and BlockState. | 
|   603     typedef PreParserScope Scope; |   630     typedef PreParserScope Scope; | 
|   604     typedef PreParserFactory Factory; |   631     typedef PreParserFactory Factory; | 
|   605     // PreParser doesn't need to store generator variables. |   632     // PreParser doesn't need to store generator variables. | 
|   606     typedef void GeneratorVariable; |   633     typedef void GeneratorVariable; | 
|   607     // No interaction with Zones. |   634     // No interaction with Zones. | 
|   608     typedef void Zone; |   635     typedef void Zone; | 
|   609  |   636  | 
|   610     // Return types for traversing functions. |   637     // Return types for traversing functions. | 
|   611     typedef PreParserIdentifier Identifier; |   638     typedef PreParserIdentifier Identifier; | 
|   612     typedef PreParserExpression Expression; |   639     typedef PreParserExpression Expression; | 
 |   640     typedef PreParserExpressionList ExpressionList; | 
|   613   }; |   641   }; | 
|   614  |   642  | 
|   615   explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |   643   explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 
|   616  |   644  | 
|   617   // Custom operations executed when FunctionStates are created and |   645   // Custom operations executed when FunctionStates are created and | 
|   618   // destructed. (The PreParser doesn't need to do anything.) |   646   // destructed. (The PreParser doesn't need to do anything.) | 
|   619   template<typename FS> |   647   template<typename FS> | 
|   620   static void SetUpFunctionState(FS* function_state, void*) {} |   648   static void SetUpFunctionState(FS* function_state, void*) {} | 
|   621   template<typename FS> |   649   template<typename FS> | 
|   622   static void TearDownFunctionState(FS* function_state) {} |   650   static void TearDownFunctionState(FS* function_state) {} | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|   639                        const char* name_opt); |   667                        const char* name_opt); | 
|   640  |   668  | 
|   641   // "null" return type creators. |   669   // "null" return type creators. | 
|   642   static PreParserIdentifier EmptyIdentifier() { |   670   static PreParserIdentifier EmptyIdentifier() { | 
|   643     return PreParserIdentifier::Default(); |   671     return PreParserIdentifier::Default(); | 
|   644   } |   672   } | 
|   645   static PreParserExpression EmptyExpression() { |   673   static PreParserExpression EmptyExpression() { | 
|   646     return PreParserExpression::Default(); |   674     return PreParserExpression::Default(); | 
|   647   } |   675   } | 
|   648  |   676  | 
 |   677   // Odd-ball literal creators. | 
 |   678   static PreParserExpression GetLiteralTheHole(int position, | 
 |   679                                                PreParserFactory* factory) { | 
 |   680     return PreParserExpression::Default(); | 
 |   681   } | 
 |   682  | 
|   649   // Producing data during the recursive descent. |   683   // Producing data during the recursive descent. | 
|   650   PreParserIdentifier GetSymbol(Scanner* scanner); |   684   PreParserIdentifier GetSymbol(Scanner* scanner); | 
|   651   static PreParserIdentifier NextLiteralString(Scanner* scanner, |   685   static PreParserIdentifier NextLiteralString(Scanner* scanner, | 
|   652                                                PretenureFlag tenured) { |   686                                                PretenureFlag tenured) { | 
|   653     return PreParserIdentifier::Default(); |   687     return PreParserIdentifier::Default(); | 
|   654   } |   688   } | 
|   655  |   689  | 
|   656   static PreParserExpression ThisExpression(PreParserScope* scope, |   690   static PreParserExpression ThisExpression(PreParserScope* scope, | 
|   657                                             PreParserFactory* factory) { |   691                                             PreParserFactory* factory) { | 
|   658     return PreParserExpression::This(); |   692     return PreParserExpression::This(); | 
|   659   } |   693   } | 
|   660  |   694  | 
|   661   static PreParserExpression ExpressionFromLiteral( |   695   static PreParserExpression ExpressionFromLiteral( | 
|   662       Token::Value token, int pos, Scanner* scanner, |   696       Token::Value token, int pos, Scanner* scanner, | 
|   663       PreParserFactory* factory) { |   697       PreParserFactory* factory) { | 
|   664     return PreParserExpression::Default(); |   698     return PreParserExpression::Default(); | 
|   665   } |   699   } | 
|   666  |   700  | 
|   667   static PreParserExpression ExpressionFromIdentifier( |   701   static PreParserExpression ExpressionFromIdentifier( | 
|   668       PreParserIdentifier name, int pos, PreParserScope* scope, |   702       PreParserIdentifier name, int pos, PreParserScope* scope, | 
|   669       PreParserFactory* factory) { |   703       PreParserFactory* factory) { | 
|   670     return PreParserExpression::FromIdentifier(name); |   704     return PreParserExpression::FromIdentifier(name); | 
|   671   } |   705   } | 
|   672  |   706  | 
|   673   PreParserExpression ExpressionFromString(int pos, |   707   PreParserExpression ExpressionFromString(int pos, | 
|   674                                            Scanner* scanner, |   708                                            Scanner* scanner, | 
|   675                                            PreParserFactory* factory = NULL); |   709                                            PreParserFactory* factory = NULL); | 
|   676  |   710  | 
 |   711   static PreParserExpressionList NewExpressionList(int size, void* zone) { | 
 |   712     return PreParserExpressionList(); | 
 |   713   } | 
 |   714  | 
|   677   // Temporary glue; these functions will move to ParserBase. |   715   // Temporary glue; these functions will move to ParserBase. | 
|   678   PreParserExpression ParseArrayLiteral(bool* ok); |   716   PreParserExpression ParseAssignmentExpression(bool accept_IN, bool* ok); | 
|   679   PreParserExpression ParseObjectLiteral(bool* ok); |   717   PreParserExpression ParseObjectLiteral(bool* ok); | 
|   680   PreParserExpression ParseExpression(bool accept_IN, bool* ok); |  | 
|   681   PreParserExpression ParseV8Intrinsic(bool* ok); |   718   PreParserExpression ParseV8Intrinsic(bool* ok); | 
|   682  |   719  | 
|   683  private: |   720  private: | 
|   684   PreParser* pre_parser_; |   721   PreParser* pre_parser_; | 
|   685 }; |   722 }; | 
|   686  |   723  | 
|   687  |   724  | 
|   688 // Preparsing checks a JavaScript program and emits preparse-data that helps |   725 // Preparsing checks a JavaScript program and emits preparse-data that helps | 
|   689 // a later parsing to be faster. |   726 // a later parsing to be faster. | 
|   690 // See preparse-data-format.h for the data format. |   727 // See preparse-data-format.h for the data format. | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|   703   typedef PreParserExpression Expression; |   740   typedef PreParserExpression Expression; | 
|   704  |   741  | 
|   705   enum PreParseResult { |   742   enum PreParseResult { | 
|   706     kPreParseStackOverflow, |   743     kPreParseStackOverflow, | 
|   707     kPreParseSuccess |   744     kPreParseSuccess | 
|   708   }; |   745   }; | 
|   709  |   746  | 
|   710   PreParser(Scanner* scanner, |   747   PreParser(Scanner* scanner, | 
|   711             ParserRecorder* log, |   748             ParserRecorder* log, | 
|   712             uintptr_t stack_limit) |   749             uintptr_t stack_limit) | 
|   713       : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, this), |   750       : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, NULL, this), | 
|   714         log_(log) {} |   751         log_(log) {} | 
|   715  |   752  | 
|   716   // Pre-parse the program from the character stream; returns true on |   753   // Pre-parse the program from the character stream; returns true on | 
|   717   // success (even if parsing failed, the pre-parse data successfully |   754   // success (even if parsing failed, the pre-parse data successfully | 
|   718   // captured the syntax error), and false if a stack-overflow happened |   755   // captured the syntax error), and false if a stack-overflow happened | 
|   719   // during parsing. |   756   // during parsing. | 
|   720   PreParseResult PreParseProgram() { |   757   PreParseResult PreParseProgram() { | 
|   721     PreParserScope scope(scope_, GLOBAL_SCOPE); |   758     PreParserScope scope(scope_, GLOBAL_SCOPE); | 
|   722     FunctionState top_scope(&function_state_, &scope_, &scope, NULL); |   759     FunctionState top_scope(&function_state_, &scope_, &scope, NULL); | 
|   723     bool ok = true; |   760     bool ok = true; | 
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   839   Statement ParseReturnStatement(bool* ok); |   876   Statement ParseReturnStatement(bool* ok); | 
|   840   Statement ParseWithStatement(bool* ok); |   877   Statement ParseWithStatement(bool* ok); | 
|   841   Statement ParseSwitchStatement(bool* ok); |   878   Statement ParseSwitchStatement(bool* ok); | 
|   842   Statement ParseDoWhileStatement(bool* ok); |   879   Statement ParseDoWhileStatement(bool* ok); | 
|   843   Statement ParseWhileStatement(bool* ok); |   880   Statement ParseWhileStatement(bool* ok); | 
|   844   Statement ParseForStatement(bool* ok); |   881   Statement ParseForStatement(bool* ok); | 
|   845   Statement ParseThrowStatement(bool* ok); |   882   Statement ParseThrowStatement(bool* ok); | 
|   846   Statement ParseTryStatement(bool* ok); |   883   Statement ParseTryStatement(bool* ok); | 
|   847   Statement ParseDebuggerStatement(bool* ok); |   884   Statement ParseDebuggerStatement(bool* ok); | 
|   848  |   885  | 
|   849   Expression ParseExpression(bool accept_IN, bool* ok); |  | 
|   850   Expression ParseAssignmentExpression(bool accept_IN, bool* ok); |   886   Expression ParseAssignmentExpression(bool accept_IN, bool* ok); | 
|   851   Expression ParseYieldExpression(bool* ok); |   887   Expression ParseYieldExpression(bool* ok); | 
|   852   Expression ParseConditionalExpression(bool accept_IN, bool* ok); |   888   Expression ParseConditionalExpression(bool accept_IN, bool* ok); | 
|   853   Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); |   889   Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); | 
|   854   Expression ParseUnaryExpression(bool* ok); |   890   Expression ParseUnaryExpression(bool* ok); | 
|   855   Expression ParsePostfixExpression(bool* ok); |   891   Expression ParsePostfixExpression(bool* ok); | 
|   856   Expression ParseLeftHandSideExpression(bool* ok); |   892   Expression ParseLeftHandSideExpression(bool* ok); | 
|   857   Expression ParseMemberExpression(bool* ok); |   893   Expression ParseMemberExpression(bool* ok); | 
|   858   Expression ParseMemberExpressionContinuation(PreParserExpression expression, |   894   Expression ParseMemberExpressionContinuation(PreParserExpression expression, | 
|   859                                                bool* ok); |   895                                                bool* ok); | 
|   860   Expression ParseMemberWithNewPrefixesExpression(bool* ok); |   896   Expression ParseMemberWithNewPrefixesExpression(bool* ok); | 
|   861   Expression ParseArrayLiteral(bool* ok); |  | 
|   862   Expression ParseObjectLiteral(bool* ok); |   897   Expression ParseObjectLiteral(bool* ok); | 
|   863   Expression ParseV8Intrinsic(bool* ok); |   898   Expression ParseV8Intrinsic(bool* ok); | 
|   864  |   899  | 
|   865   Arguments ParseArguments(bool* ok); |   900   Arguments ParseArguments(bool* ok); | 
|   866   Expression ParseFunctionLiteral( |   901   Expression ParseFunctionLiteral( | 
|   867       Identifier name, |   902       Identifier name, | 
|   868       Scanner::Location function_name_location, |   903       Scanner::Location function_name_location, | 
|   869       bool name_is_strict_reserved, |   904       bool name_is_strict_reserved, | 
|   870       bool is_generator, |   905       bool is_generator, | 
|   871       bool* ok); |   906       bool* ok); | 
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1145     default: { |  1180     default: { | 
|  1146       Next(); |  1181       Next(); | 
|  1147       ReportUnexpectedToken(token); |  1182       ReportUnexpectedToken(token); | 
|  1148       *ok = false; |  1183       *ok = false; | 
|  1149     } |  1184     } | 
|  1150   } |  1185   } | 
|  1151  |  1186  | 
|  1152   return result; |  1187   return result; | 
|  1153 } |  1188 } | 
|  1154  |  1189  | 
 |  1190 // Precedence = 1 | 
 |  1191 template <class Traits> | 
 |  1192 typename Traits::Type::Expression ParserBase<Traits>::ParseExpression( | 
 |  1193     bool accept_IN, bool* ok) { | 
 |  1194   // Expression :: | 
 |  1195   //   AssignmentExpression | 
 |  1196   //   Expression ',' AssignmentExpression | 
 |  1197  | 
 |  1198   typename Traits::Type::Expression result = | 
 |  1199       this->ParseAssignmentExpression(accept_IN, CHECK_OK); | 
 |  1200   while (peek() == Token::COMMA) { | 
 |  1201     Expect(Token::COMMA, CHECK_OK); | 
 |  1202     int pos = position(); | 
 |  1203     typename Traits::Type::Expression right = | 
 |  1204         this->ParseAssignmentExpression(accept_IN, CHECK_OK); | 
 |  1205     result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos); | 
 |  1206   } | 
 |  1207   return result; | 
 |  1208 } | 
 |  1209  | 
 |  1210  | 
 |  1211 template <class Traits> | 
 |  1212 typename Traits::Type::Expression ParserBase<Traits>::ParseArrayLiteral( | 
 |  1213     bool* ok) { | 
 |  1214   // ArrayLiteral :: | 
 |  1215   //   '[' Expression? (',' Expression?)* ']' | 
 |  1216  | 
 |  1217   int pos = peek_position(); | 
 |  1218   typename Traits::Type::ExpressionList values = | 
 |  1219       this->NewExpressionList(4, zone_); | 
 |  1220   Expect(Token::LBRACK, CHECK_OK); | 
 |  1221   while (peek() != Token::RBRACK) { | 
 |  1222     typename Traits::Type::Expression elem = this->EmptyExpression(); | 
 |  1223     if (peek() == Token::COMMA) { | 
 |  1224       elem = this->GetLiteralTheHole(peek_position(), factory()); | 
 |  1225     } else { | 
 |  1226       elem = this->ParseAssignmentExpression(true, CHECK_OK); | 
 |  1227     } | 
 |  1228     values->Add(elem, zone_); | 
 |  1229     if (peek() != Token::RBRACK) { | 
 |  1230       Expect(Token::COMMA, CHECK_OK); | 
 |  1231     } | 
 |  1232   } | 
 |  1233   Expect(Token::RBRACK, CHECK_OK); | 
 |  1234  | 
 |  1235   // Update the scope information before the pre-parsing bailout. | 
 |  1236   int literal_index = function_state_->NextMaterializedLiteralIndex(); | 
 |  1237  | 
 |  1238   return factory()->NewArrayLiteral(values, literal_index, pos); | 
 |  1239 } | 
 |  1240  | 
|  1155 #undef CHECK_OK |  1241 #undef CHECK_OK | 
|  1156  |  1242  | 
|  1157  |  1243  | 
|  1158 template <typename Traits> |  1244 template <typename Traits> | 
|  1159 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( |  1245 void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( | 
|  1160     Token::Value property, |  1246     Token::Value property, | 
|  1161     PropertyKind type, |  1247     PropertyKind type, | 
|  1162     bool* ok) { |  1248     bool* ok) { | 
|  1163   int old; |  1249   int old; | 
|  1164   if (property == Token::NUMBER) { |  1250   if (property == Token::NUMBER) { | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|  1186                                "accessor_get_set"); |  1272                                "accessor_get_set"); | 
|  1187     } |  1273     } | 
|  1188     *ok = false; |  1274     *ok = false; | 
|  1189   } |  1275   } | 
|  1190 } |  1276 } | 
|  1191  |  1277  | 
|  1192  |  1278  | 
|  1193 } }  // v8::internal |  1279 } }  // v8::internal | 
|  1194  |  1280  | 
|  1195 #endif  // V8_PREPARSER_H |  1281 #endif  // V8_PREPARSER_H | 
| OLD | NEW |