| 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_H_ | 5 #ifndef V8_PARSING_PARSER_H_ |
| 6 #define V8_PARSING_PARSER_H_ | 6 #define V8_PARSING_PARSER_H_ |
| 7 | 7 |
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/parsing/parser-base.h" | 10 #include "src/parsing/parser-base.h" |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 friend class ParserBase<Parser>; | 204 friend class ParserBase<Parser>; |
| 205 friend class v8::internal::ExpressionClassifier<ParserTypes<Parser>>; | 205 friend class v8::internal::ExpressionClassifier<ParserTypes<Parser>>; |
| 206 | 206 |
| 207 // Runtime encoding of different completion modes. | 207 // Runtime encoding of different completion modes. |
| 208 enum CompletionKind { | 208 enum CompletionKind { |
| 209 kNormalCompletion, | 209 kNormalCompletion, |
| 210 kThrowCompletion, | 210 kThrowCompletion, |
| 211 kAbruptCompletion | 211 kAbruptCompletion |
| 212 }; | 212 }; |
| 213 | 213 |
| 214 enum class FunctionBodyType { kNormal, kSingleExpression }; | |
| 215 | |
| 216 Variable* NewTemporary(const AstRawString* name) { | 214 Variable* NewTemporary(const AstRawString* name) { |
| 217 return scope()->NewTemporary(name); | 215 return scope()->NewTemporary(name); |
| 218 } | 216 } |
| 219 | 217 |
| 220 // Limit the allowed number of local variables in a function. The hard limit | 218 // Limit the allowed number of local variables in a function. The hard limit |
| 221 // is that offsets computed by FullCodeGenerator::StackOperand and similar | 219 // is that offsets computed by FullCodeGenerator::StackOperand and similar |
| 222 // functions are ints, and they should not overflow. In addition, accessing | 220 // functions are ints, and they should not overflow. In addition, accessing |
| 223 // local variables creates user-controlled constants in the generated code, | 221 // local variables creates user-controlled constants in the generated code, |
| 224 // and we don't want too much user-controlled memory inside the code (this was | 222 // and we don't want too much user-controlled memory inside the code (this was |
| 225 // the reason why this limit was introduced in the first place; see | 223 // the reason why this limit was introduced in the first place; see |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 const AstRawString* local_name; | 262 const AstRawString* local_name; |
| 265 const Scanner::Location location; | 263 const Scanner::Location location; |
| 266 NamedImport(const AstRawString* import_name, const AstRawString* local_name, | 264 NamedImport(const AstRawString* import_name, const AstRawString* local_name, |
| 267 Scanner::Location location) | 265 Scanner::Location location) |
| 268 : import_name(import_name), | 266 : import_name(import_name), |
| 269 local_name(local_name), | 267 local_name(local_name), |
| 270 location(location) {} | 268 location(location) {} |
| 271 }; | 269 }; |
| 272 ZoneList<const NamedImport*>* ParseNamedImports(int pos, bool* ok); | 270 ZoneList<const NamedImport*>* ParseNamedImports(int pos, bool* ok); |
| 273 Statement* ParseFunctionDeclaration(bool* ok); | 271 Statement* ParseFunctionDeclaration(bool* ok); |
| 274 Statement* ParseAsyncFunctionDeclaration(ZoneList<const AstRawString*>* names, | |
| 275 bool default_export, bool* ok); | |
| 276 Expression* ParseAsyncFunctionExpression(bool* ok); | |
| 277 Statement* ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 272 Statement* ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
| 278 bool default_export, bool* ok); | 273 bool default_export, bool* ok); |
| 279 Statement* ParseNativeDeclaration(bool* ok); | 274 Statement* ParseNativeDeclaration(bool* ok); |
| 280 Block* BuildInitializationBlock(DeclarationParsingResult* parsing_result, | 275 Block* BuildInitializationBlock(DeclarationParsingResult* parsing_result, |
| 281 ZoneList<const AstRawString*>* names, | 276 ZoneList<const AstRawString*>* names, |
| 282 bool* ok); | 277 bool* ok); |
| 283 void DeclareAndInitializeVariables( | 278 void DeclareAndInitializeVariables( |
| 284 Block* block, const DeclarationDescriptor* declaration_descriptor, | 279 Block* block, const DeclarationDescriptor* declaration_descriptor, |
| 285 const DeclarationParsingResult::Declaration* declaration, | 280 const DeclarationParsingResult::Declaration* declaration, |
| 286 ZoneList<const AstRawString*>* names, bool* ok); | 281 ZoneList<const AstRawString*>* names, bool* ok); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 Block* RewriteForVarInLegacy(const ForInfo& for_info); | 399 Block* RewriteForVarInLegacy(const ForInfo& for_info); |
| 405 void DesugarBindingInForEachStatement(ForInfo* for_info, Block** body_block, | 400 void DesugarBindingInForEachStatement(ForInfo* for_info, Block** body_block, |
| 406 Expression** each_variable, bool* ok); | 401 Expression** each_variable, bool* ok); |
| 407 Block* CreateForEachStatementTDZ(Block* init_block, const ForInfo& for_info, | 402 Block* CreateForEachStatementTDZ(Block* init_block, const ForInfo& for_info, |
| 408 bool* ok); | 403 bool* ok); |
| 409 | 404 |
| 410 Statement* DesugarLexicalBindingsInForStatement( | 405 Statement* DesugarLexicalBindingsInForStatement( |
| 411 ForStatement* loop, Statement* init, Expression* cond, Statement* next, | 406 ForStatement* loop, Statement* init, Expression* cond, Statement* next, |
| 412 Statement* body, Scope* inner_scope, const ForInfo& for_info, bool* ok); | 407 Statement* body, Scope* inner_scope, const ForInfo& for_info, bool* ok); |
| 413 | 408 |
| 414 void DesugarAsyncFunctionBody(Scope* scope, ZoneList<Statement*>* body, | |
| 415 FunctionKind kind, FunctionBodyType type, | |
| 416 bool accept_IN, int pos, bool* ok); | |
| 417 | |
| 418 Expression* RewriteDoExpression(Block* body, int pos, bool* ok); | 409 Expression* RewriteDoExpression(Block* body, int pos, bool* ok); |
| 419 | 410 |
| 420 FunctionLiteral* ParseFunctionLiteral( | 411 FunctionLiteral* ParseFunctionLiteral( |
| 421 const AstRawString* name, Scanner::Location function_name_location, | 412 const AstRawString* name, Scanner::Location function_name_location, |
| 422 FunctionNameValidity function_name_validity, FunctionKind kind, | 413 FunctionNameValidity function_name_validity, FunctionKind kind, |
| 423 int function_token_position, FunctionLiteral::FunctionType type, | 414 int function_token_position, FunctionLiteral::FunctionType type, |
| 424 LanguageMode language_mode, bool* ok); | 415 LanguageMode language_mode, bool* ok); |
| 425 | 416 |
| 426 Expression* InstallHomeObject(Expression* function_literal, | 417 Expression* InstallHomeObject(Expression* function_literal, |
| 427 Expression* home_object); | 418 Expression* home_object); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 typedef TemplateLiteral* TemplateLiteralState; | 525 typedef TemplateLiteral* TemplateLiteralState; |
| 535 | 526 |
| 536 TemplateLiteralState OpenTemplateLiteral(int pos); | 527 TemplateLiteralState OpenTemplateLiteral(int pos); |
| 537 void AddTemplateSpan(TemplateLiteralState* state, bool tail); | 528 void AddTemplateSpan(TemplateLiteralState* state, bool tail); |
| 538 void AddTemplateExpression(TemplateLiteralState* state, | 529 void AddTemplateExpression(TemplateLiteralState* state, |
| 539 Expression* expression); | 530 Expression* expression); |
| 540 Expression* CloseTemplateLiteral(TemplateLiteralState* state, int start, | 531 Expression* CloseTemplateLiteral(TemplateLiteralState* state, int start, |
| 541 Expression* tag); | 532 Expression* tag); |
| 542 uint32_t ComputeTemplateLiteralHash(const TemplateLiteral* lit); | 533 uint32_t ComputeTemplateLiteralHash(const TemplateLiteral* lit); |
| 543 | 534 |
| 544 void ParseAsyncArrowSingleExpressionBody(ZoneList<Statement*>* body, | |
| 545 bool accept_IN, | |
| 546 int pos, bool* ok) { | |
| 547 DesugarAsyncFunctionBody(scope(), body, kAsyncArrowFunction, | |
| 548 FunctionBodyType::kSingleExpression, accept_IN, | |
| 549 pos, ok); | |
| 550 } | |
| 551 | |
| 552 ZoneList<Expression*>* PrepareSpreadArguments(ZoneList<Expression*>* list); | 535 ZoneList<Expression*>* PrepareSpreadArguments(ZoneList<Expression*>* list); |
| 553 Expression* SpreadCall(Expression* function, ZoneList<Expression*>* args, | 536 Expression* SpreadCall(Expression* function, ZoneList<Expression*>* args, |
| 554 int pos); | 537 int pos); |
| 555 Expression* SpreadCallNew(Expression* function, ZoneList<Expression*>* args, | 538 Expression* SpreadCallNew(Expression* function, ZoneList<Expression*>* args, |
| 556 int pos); | 539 int pos); |
| 557 Expression* CallClassFieldInitializer(Scope* scope, Expression* this_expr); | 540 Expression* CallClassFieldInitializer(Scope* scope, Expression* this_expr); |
| 558 Expression* RewriteSuperCall(Expression* call_expression); | 541 Expression* RewriteSuperCall(Expression* call_expression); |
| 559 | 542 |
| 560 void SetLanguageMode(Scope* scope, LanguageMode mode); | 543 void SetLanguageMode(Scope* scope, LanguageMode mode); |
| 561 void SetAsmModule(); | 544 void SetAsmModule(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 Statement* FinalizeForOfStatement(ForOfStatement* loop, Variable* completion, | 583 Statement* FinalizeForOfStatement(ForOfStatement* loop, Variable* completion, |
| 601 int pos); | 584 int pos); |
| 602 void BuildIteratorClose(ZoneList<Statement*>* statements, Variable* iterator, | 585 void BuildIteratorClose(ZoneList<Statement*>* statements, Variable* iterator, |
| 603 Variable* input, Variable* output); | 586 Variable* input, Variable* output); |
| 604 void BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements, | 587 void BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements, |
| 605 Variable* iterator, | 588 Variable* iterator, |
| 606 Expression* completion); | 589 Expression* completion); |
| 607 Statement* CheckCallable(Variable* var, Expression* error, int pos); | 590 Statement* CheckCallable(Variable* var, Expression* error, int pos); |
| 608 | 591 |
| 609 V8_INLINE Expression* RewriteAwaitExpression(Expression* value, int pos); | 592 V8_INLINE Expression* RewriteAwaitExpression(Expression* value, int pos); |
| 593 V8_INLINE void PrepareAsyncFunctionBody(ZoneList<Statement*>* body, |
| 594 FunctionKind kind, int pos); |
| 595 V8_INLINE void RewriteAsyncFunctionBody(ZoneList<Statement*>* body, |
| 596 Block* block, |
| 597 Expression* return_value, bool* ok); |
| 610 | 598 |
| 611 Expression* RewriteYieldStar(Expression* generator, Expression* expression, | 599 Expression* RewriteYieldStar(Expression* generator, Expression* expression, |
| 612 int pos); | 600 int pos); |
| 613 | 601 |
| 614 void ParseArrowFunctionFormalParameters(ParserFormalParameters* parameters, | 602 void AddArrowFunctionFormalParameters(ParserFormalParameters* parameters, |
| 615 Expression* params, int end_pos, | 603 Expression* params, int end_pos, |
| 616 bool* ok); | 604 bool* ok); |
| 617 void SetFunctionName(Expression* value, const AstRawString* name); | 605 void SetFunctionName(Expression* value, const AstRawString* name); |
| 618 | 606 |
| 619 // Helper functions for recursive descent. | 607 // Helper functions for recursive descent. |
| 620 V8_INLINE bool IsEval(const AstRawString* identifier) const { | 608 V8_INLINE bool IsEval(const AstRawString* identifier) const { |
| 621 return identifier == ast_value_factory()->eval_string(); | 609 return identifier == ast_value_factory()->eval_string(); |
| 622 } | 610 } |
| 623 | 611 |
| 624 V8_INLINE bool IsArguments(const AstRawString* identifier) const { | 612 V8_INLINE bool IsArguments(const AstRawString* identifier) const { |
| 625 return identifier == ast_value_factory()->arguments_string(); | 613 return identifier == ast_value_factory()->arguments_string(); |
| 626 } | 614 } |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1018 classifier()->RecordDuplicateFormalParameterError(scanner()->location()); | 1006 classifier()->RecordDuplicateFormalParameterError(scanner()->location()); |
| 1019 } | 1007 } |
| 1020 if (is_sloppy(scope->language_mode())) { | 1008 if (is_sloppy(scope->language_mode())) { |
| 1021 // TODO(sigurds) Mark every parameter as maybe assigned. This is a | 1009 // TODO(sigurds) Mark every parameter as maybe assigned. This is a |
| 1022 // conservative approximation necessary to account for parameters | 1010 // conservative approximation necessary to account for parameters |
| 1023 // that are assigned via the arguments array. | 1011 // that are assigned via the arguments array. |
| 1024 var->set_maybe_assigned(); | 1012 var->set_maybe_assigned(); |
| 1025 } | 1013 } |
| 1026 } | 1014 } |
| 1027 | 1015 |
| 1028 void ParseArrowFunctionFormalParameterList( | 1016 void DeclareArrowFunctionFormalParameters(ParserFormalParameters* parameters, |
| 1029 ParserFormalParameters* parameters, Expression* params, | 1017 Expression* params, |
| 1030 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, | 1018 const Scanner::Location& params_loc, |
| 1031 const Scope::Snapshot& scope_snapshot, bool* ok); | 1019 Scanner::Location* duplicate_loc, |
| 1020 bool* ok); |
| 1032 | 1021 |
| 1033 void ReindexLiterals(const ParserFormalParameters& parameters); | 1022 void ReindexLiterals(const ParserFormalParameters& parameters); |
| 1034 | 1023 |
| 1035 V8_INLINE Expression* NoTemplateTag() { return NULL; } | 1024 V8_INLINE Expression* NoTemplateTag() { return NULL; } |
| 1036 V8_INLINE static bool IsTaggedTemplate(const Expression* tag) { | 1025 V8_INLINE static bool IsTaggedTemplate(const Expression* tag) { |
| 1037 return tag != NULL; | 1026 return tag != NULL; |
| 1038 } | 1027 } |
| 1039 | 1028 |
| 1040 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {} | 1029 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {} |
| 1041 | 1030 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1087 int total_preparse_skipped_; | 1076 int total_preparse_skipped_; |
| 1088 HistogramTimer* pre_parse_timer_; | 1077 HistogramTimer* pre_parse_timer_; |
| 1089 | 1078 |
| 1090 bool parsing_on_main_thread_; | 1079 bool parsing_on_main_thread_; |
| 1091 }; | 1080 }; |
| 1092 | 1081 |
| 1093 } // namespace internal | 1082 } // namespace internal |
| 1094 } // namespace v8 | 1083 } // namespace v8 |
| 1095 | 1084 |
| 1096 #endif // V8_PARSING_PARSER_H_ | 1085 #endif // V8_PARSING_PARSER_H_ |
| OLD | NEW |