| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H | 
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H | 
| 7 | 7 | 
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" | 
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" | 
| 10 #include "src/base/hashmap.h" | 10 #include "src/base/hashmap.h" | 
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 199 | 199 | 
| 200   ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 200   ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, | 
| 201              v8::Extension* extension, AstValueFactory* ast_value_factory, | 201              v8::Extension* extension, AstValueFactory* ast_value_factory, | 
| 202              ParserRecorder* log, typename Traits::Type::Parser this_object) | 202              ParserRecorder* log, typename Traits::Type::Parser this_object) | 
| 203       : Traits(this_object), | 203       : Traits(this_object), | 
| 204         scope_state_(nullptr), | 204         scope_state_(nullptr), | 
| 205         function_state_(nullptr), | 205         function_state_(nullptr), | 
| 206         extension_(extension), | 206         extension_(extension), | 
| 207         fni_(nullptr), | 207         fni_(nullptr), | 
| 208         ast_value_factory_(ast_value_factory), | 208         ast_value_factory_(ast_value_factory), | 
|  | 209         ast_node_factory_(ast_value_factory), | 
| 209         log_(log), | 210         log_(log), | 
| 210         mode_(PARSE_EAGERLY),  // Lazy mode must be set explicitly. | 211         mode_(PARSE_EAGERLY),  // Lazy mode must be set explicitly. | 
| 211         parsing_module_(false), | 212         parsing_module_(false), | 
| 212         stack_limit_(stack_limit), | 213         stack_limit_(stack_limit), | 
| 213         zone_(zone), | 214         zone_(zone), | 
| 214         scanner_(scanner), | 215         scanner_(scanner), | 
| 215         stack_overflow_(false), | 216         stack_overflow_(false), | 
| 216         allow_lazy_(false), | 217         allow_lazy_(false), | 
| 217         allow_natives_(false), | 218         allow_natives_(false), | 
| 218         allow_tailcalls_(false), | 219         allow_tailcalls_(false), | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 365     kInsideValidBlock, | 366     kInsideValidBlock, | 
| 366 | 367 | 
| 367     // Tail call expressions are not allowed in the following blocks. | 368     // Tail call expressions are not allowed in the following blocks. | 
| 368     kInsideTryBlock, | 369     kInsideTryBlock, | 
| 369     kInsideForInOfBody, | 370     kInsideForInOfBody, | 
| 370   }; | 371   }; | 
| 371 | 372 | 
| 372   class FunctionState final : public ScopeState { | 373   class FunctionState final : public ScopeState { | 
| 373    public: | 374    public: | 
| 374     FunctionState(FunctionState** function_state_stack, | 375     FunctionState(FunctionState** function_state_stack, | 
| 375                   ScopeState** scope_stack, Scope* scope, FunctionKind kind, | 376                   ScopeState** scope_stack, Scope* scope, FunctionKind kind); | 
| 376                   typename Traits::Type::Factory* factory); |  | 
| 377     ~FunctionState(); | 377     ~FunctionState(); | 
| 378 | 378 | 
| 379     int NextMaterializedLiteralIndex() { | 379     int NextMaterializedLiteralIndex() { | 
| 380       return next_materialized_literal_index_++; | 380       return next_materialized_literal_index_++; | 
| 381     } | 381     } | 
| 382     int materialized_literal_count() { | 382     int materialized_literal_count() { | 
| 383       return next_materialized_literal_index_; | 383       return next_materialized_literal_index_; | 
| 384     } | 384     } | 
| 385 | 385 | 
| 386     void SkipMaterializedLiterals(int count) { | 386     void SkipMaterializedLiterals(int count) { | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 414         typename Traits::Type::GeneratorVariable* variable) { | 414         typename Traits::Type::GeneratorVariable* variable) { | 
| 415       DCHECK(variable != NULL); | 415       DCHECK(variable != NULL); | 
| 416       DCHECK(is_resumable()); | 416       DCHECK(is_resumable()); | 
| 417       generator_object_variable_ = variable; | 417       generator_object_variable_ = variable; | 
| 418     } | 418     } | 
| 419     typename Traits::Type::GeneratorVariable* generator_object_variable() | 419     typename Traits::Type::GeneratorVariable* generator_object_variable() | 
| 420         const { | 420         const { | 
| 421       return generator_object_variable_; | 421       return generator_object_variable_; | 
| 422     } | 422     } | 
| 423 | 423 | 
| 424     typename Traits::Type::Factory* factory() { return factory_; } |  | 
| 425 |  | 
| 426     const ZoneList<DestructuringAssignment>& | 424     const ZoneList<DestructuringAssignment>& | 
| 427         destructuring_assignments_to_rewrite() const { | 425         destructuring_assignments_to_rewrite() const { | 
| 428       return destructuring_assignments_to_rewrite_; | 426       return destructuring_assignments_to_rewrite_; | 
| 429     } | 427     } | 
| 430 | 428 | 
| 431     TailCallExpressionList& tail_call_expressions() { | 429     TailCallExpressionList& tail_call_expressions() { | 
| 432       return tail_call_expressions_; | 430       return tail_call_expressions_; | 
| 433     } | 431     } | 
| 434     void AddImplicitTailCallExpression(ExpressionT expression) { | 432     void AddImplicitTailCallExpression(ExpressionT expression) { | 
| 435       if (return_expr_context() == | 433       if (return_expr_context() == | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 507     FunctionState** function_state_stack_; | 505     FunctionState** function_state_stack_; | 
| 508     FunctionState* outer_function_state_; | 506     FunctionState* outer_function_state_; | 
| 509 | 507 | 
| 510     ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; | 508     ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; | 
| 511     TailCallExpressionList tail_call_expressions_; | 509     TailCallExpressionList tail_call_expressions_; | 
| 512     ReturnExprContext return_expr_context_; | 510     ReturnExprContext return_expr_context_; | 
| 513     ZoneList<ExpressionT> non_patterns_to_rewrite_; | 511     ZoneList<ExpressionT> non_patterns_to_rewrite_; | 
| 514 | 512 | 
| 515     ZoneList<typename ExpressionClassifier::Error> reported_errors_; | 513     ZoneList<typename ExpressionClassifier::Error> reported_errors_; | 
| 516 | 514 | 
| 517     typename Traits::Type::Factory* factory_; |  | 
| 518 |  | 
| 519     // If true, the next (and immediately following) function literal is | 515     // If true, the next (and immediately following) function literal is | 
| 520     // preceded by a parenthesis. | 516     // preceded by a parenthesis. | 
| 521     bool next_function_is_parenthesized_; | 517     bool next_function_is_parenthesized_; | 
| 522 | 518 | 
| 523     // The value of the parents' next_function_is_parenthesized_, as it applies | 519     // The value of the parents' next_function_is_parenthesized_, as it applies | 
| 524     // to this function. Filled in by constructor. | 520     // to this function. Filled in by constructor. | 
| 525     bool this_function_is_parenthesized_; | 521     bool this_function_is_parenthesized_; | 
| 526 | 522 | 
| 527     friend class ParserTraits; | 523     friend class ParserTraits; | 
| 528     friend class PreParserTraits; | 524     friend class PreParserTraits; | 
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 832     } | 828     } | 
| 833   } | 829   } | 
| 834 | 830 | 
| 835   // Determine precedence of given token. | 831   // Determine precedence of given token. | 
| 836   static int Precedence(Token::Value token, bool accept_IN) { | 832   static int Precedence(Token::Value token, bool accept_IN) { | 
| 837     if (token == Token::IN && !accept_IN) | 833     if (token == Token::IN && !accept_IN) | 
| 838       return 0;  // 0 precedence will terminate binary expression parsing | 834       return 0;  // 0 precedence will terminate binary expression parsing | 
| 839     return Token::Precedence(token); | 835     return Token::Precedence(token); | 
| 840   } | 836   } | 
| 841 | 837 | 
| 842   typename Traits::Type::Factory* factory() { | 838   typename Traits::Type::Factory* factory() { return &ast_node_factory_; } | 
| 843     return function_state_->factory(); |  | 
| 844   } |  | 
| 845 | 839 | 
| 846   LanguageMode language_mode() { return scope()->language_mode(); } | 840   LanguageMode language_mode() { return scope()->language_mode(); } | 
| 847   bool is_generator() const { return function_state_->is_generator(); } | 841   bool is_generator() const { return function_state_->is_generator(); } | 
| 848   bool is_async_function() const { | 842   bool is_async_function() const { | 
| 849     return function_state_->is_async_function(); | 843     return function_state_->is_async_function(); | 
| 850   } | 844   } | 
| 851   bool is_resumable() const { return function_state_->is_resumable(); } | 845   bool is_resumable() const { return function_state_->is_resumable(); } | 
| 852 | 846 | 
| 853   // Report syntax errors. | 847   // Report syntax errors. | 
| 854   void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, | 848   void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, | 
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1220   }; | 1214   }; | 
| 1221 | 1215 | 
| 1222   ModuleDescriptor* module() const { return scope()->module(); } | 1216   ModuleDescriptor* module() const { return scope()->module(); } | 
| 1223   Scope* scope() const { return scope_state_->scope(); } | 1217   Scope* scope() const { return scope_state_->scope(); } | 
| 1224 | 1218 | 
| 1225   ScopeState* scope_state_;        // Scope stack. | 1219   ScopeState* scope_state_;        // Scope stack. | 
| 1226   FunctionState* function_state_;  // Function state stack. | 1220   FunctionState* function_state_;  // Function state stack. | 
| 1227   v8::Extension* extension_; | 1221   v8::Extension* extension_; | 
| 1228   FuncNameInferrer* fni_; | 1222   FuncNameInferrer* fni_; | 
| 1229   AstValueFactory* ast_value_factory_;  // Not owned. | 1223   AstValueFactory* ast_value_factory_;  // Not owned. | 
|  | 1224   typename Traits::Type::Factory ast_node_factory_; | 
| 1230   ParserRecorder* log_; | 1225   ParserRecorder* log_; | 
| 1231   Mode mode_; | 1226   Mode mode_; | 
| 1232   bool parsing_module_; | 1227   bool parsing_module_; | 
| 1233   uintptr_t stack_limit_; | 1228   uintptr_t stack_limit_; | 
| 1234 | 1229 | 
| 1235  private: | 1230  private: | 
| 1236   Zone* zone_; | 1231   Zone* zone_; | 
| 1237 | 1232 | 
| 1238   Scanner* scanner_; | 1233   Scanner* scanner_; | 
| 1239   bool stack_overflow_; | 1234   bool stack_overflow_; | 
| 1240 | 1235 | 
| 1241   bool allow_lazy_; | 1236   bool allow_lazy_; | 
| 1242   bool allow_natives_; | 1237   bool allow_natives_; | 
| 1243   bool allow_tailcalls_; | 1238   bool allow_tailcalls_; | 
| 1244   bool allow_harmony_restrictive_declarations_; | 1239   bool allow_harmony_restrictive_declarations_; | 
| 1245   bool allow_harmony_do_expressions_; | 1240   bool allow_harmony_do_expressions_; | 
| 1246   bool allow_harmony_for_in_; | 1241   bool allow_harmony_for_in_; | 
| 1247   bool allow_harmony_function_sent_; | 1242   bool allow_harmony_function_sent_; | 
| 1248   bool allow_harmony_async_await_; | 1243   bool allow_harmony_async_await_; | 
| 1249   bool allow_harmony_restrictive_generators_; | 1244   bool allow_harmony_restrictive_generators_; | 
| 1250   bool allow_harmony_trailing_commas_; | 1245   bool allow_harmony_trailing_commas_; | 
| 1251 }; | 1246 }; | 
| 1252 | 1247 | 
| 1253 template <class Traits> | 1248 template <class Traits> | 
| 1254 ParserBase<Traits>::FunctionState::FunctionState( | 1249 ParserBase<Traits>::FunctionState::FunctionState( | 
| 1255     FunctionState** function_state_stack, ScopeState** scope_stack, | 1250     FunctionState** function_state_stack, ScopeState** scope_stack, | 
| 1256     Scope* scope, FunctionKind kind, typename Traits::Type::Factory* factory) | 1251     Scope* scope, FunctionKind kind) | 
| 1257     : ScopeState(scope_stack, scope), | 1252     : ScopeState(scope_stack, scope), | 
| 1258       next_materialized_literal_index_(0), | 1253       next_materialized_literal_index_(0), | 
| 1259       expected_property_count_(0), | 1254       expected_property_count_(0), | 
| 1260       this_location_(Scanner::Location::invalid()), | 1255       this_location_(Scanner::Location::invalid()), | 
| 1261       return_location_(Scanner::Location::invalid()), | 1256       return_location_(Scanner::Location::invalid()), | 
| 1262       super_location_(Scanner::Location::invalid()), | 1257       super_location_(Scanner::Location::invalid()), | 
| 1263       kind_(kind), | 1258       kind_(kind), | 
| 1264       generator_object_variable_(NULL), | 1259       generator_object_variable_(NULL), | 
| 1265       function_state_stack_(function_state_stack), | 1260       function_state_stack_(function_state_stack), | 
| 1266       outer_function_state_(*function_state_stack), | 1261       outer_function_state_(*function_state_stack), | 
| 1267       destructuring_assignments_to_rewrite_(16, scope->zone()), | 1262       destructuring_assignments_to_rewrite_(16, scope->zone()), | 
| 1268       tail_call_expressions_(scope->zone()), | 1263       tail_call_expressions_(scope->zone()), | 
| 1269       return_expr_context_(ReturnExprContext::kInsideValidBlock), | 1264       return_expr_context_(ReturnExprContext::kInsideValidBlock), | 
| 1270       non_patterns_to_rewrite_(0, scope->zone()), | 1265       non_patterns_to_rewrite_(0, scope->zone()), | 
| 1271       reported_errors_(16, scope->zone()), | 1266       reported_errors_(16, scope->zone()), | 
| 1272       factory_(factory), |  | 
| 1273       next_function_is_parenthesized_(false), | 1267       next_function_is_parenthesized_(false), | 
| 1274       this_function_is_parenthesized_(false) { | 1268       this_function_is_parenthesized_(false) { | 
| 1275   *function_state_stack = this; | 1269   *function_state_stack = this; | 
| 1276   if (outer_function_state_) { | 1270   if (outer_function_state_) { | 
| 1277     this_function_is_parenthesized_ = | 1271     this_function_is_parenthesized_ = | 
| 1278         outer_function_state_->next_function_is_parenthesized_; | 1272         outer_function_state_->next_function_is_parenthesized_; | 
| 1279     outer_function_state_->next_function_is_parenthesized_ = false; | 1273     outer_function_state_->next_function_is_parenthesized_ = false; | 
| 1280   } | 1274   } | 
| 1281 } | 1275 } | 
| 1282 | 1276 | 
| (...skipping 2095 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3378   } | 3372   } | 
| 3379 | 3373 | 
| 3380   typename Traits::Type::StatementList body; | 3374   typename Traits::Type::StatementList body; | 
| 3381   int num_parameters = formal_parameters.scope->num_parameters(); | 3375   int num_parameters = formal_parameters.scope->num_parameters(); | 
| 3382   int materialized_literal_count = -1; | 3376   int materialized_literal_count = -1; | 
| 3383   int expected_property_count = -1; | 3377   int expected_property_count = -1; | 
| 3384   Scanner::Location super_loc; | 3378   Scanner::Location super_loc; | 
| 3385 | 3379 | 
| 3386   FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction; | 3380   FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction; | 
| 3387   { | 3381   { | 
| 3388     typename Traits::Type::Factory function_factory(ast_value_factory()); |  | 
| 3389     FunctionState function_state(&function_state_, &scope_state_, | 3382     FunctionState function_state(&function_state_, &scope_state_, | 
| 3390                                  formal_parameters.scope, arrow_kind, | 3383                                  formal_parameters.scope, arrow_kind); | 
| 3391                                  &function_factory); |  | 
| 3392 | 3384 | 
| 3393     function_state.SkipMaterializedLiterals( | 3385     function_state.SkipMaterializedLiterals( | 
| 3394         formal_parameters.materialized_literals_count); | 3386         formal_parameters.materialized_literals_count); | 
| 3395 | 3387 | 
| 3396     this->ReindexLiterals(formal_parameters); | 3388     this->ReindexLiterals(formal_parameters); | 
| 3397 | 3389 | 
| 3398     Expect(Token::ARROW, CHECK_OK); | 3390     Expect(Token::ARROW, CHECK_OK); | 
| 3399 | 3391 | 
| 3400     if (peek() == Token::LBRACE) { | 3392     if (peek() == Token::LBRACE) { | 
| 3401       // Multiple statement body | 3393       // Multiple statement body | 
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3697     has_seen_constructor_ = true; | 3689     has_seen_constructor_ = true; | 
| 3698     return; | 3690     return; | 
| 3699   } | 3691   } | 
| 3700 } | 3692 } | 
| 3701 | 3693 | 
| 3702 | 3694 | 
| 3703 }  // namespace internal | 3695 }  // namespace internal | 
| 3704 }  // namespace v8 | 3696 }  // namespace v8 | 
| 3705 | 3697 | 
| 3706 #endif  // V8_PARSING_PARSER_BASE_H | 3698 #endif  // V8_PARSING_PARSER_BASE_H | 
| OLD | NEW | 
|---|