| 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 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 Zone* zone = delegate()->zone(); | 671 Zone* zone = delegate()->zone(); |
| 672 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone); | 672 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(0, zone); |
| 673 return factory->NewCall(prop, args, pos); | 673 return factory->NewCall(prop, args, pos); |
| 674 } | 674 } |
| 675 | 675 |
| 676 Literal* ParserBaseTraits<Parser>::GetLiteralTheHole( | 676 Literal* ParserBaseTraits<Parser>::GetLiteralTheHole( |
| 677 int position, AstNodeFactory* factory) const { | 677 int position, AstNodeFactory* factory) const { |
| 678 return factory->NewTheHoleLiteral(kNoSourcePosition); | 678 return factory->NewTheHoleLiteral(kNoSourcePosition); |
| 679 } | 679 } |
| 680 | 680 |
| 681 Expression* ParserBaseTraits<Parser>::ParseV8Intrinsic(bool* ok) { | 681 void Parser::MarkTailPosition(Expression* expression) { |
| 682 return delegate()->ParseV8Intrinsic(ok); | |
| 683 } | |
| 684 | |
| 685 FunctionLiteral* ParserBaseTraits<Parser>::ParseFunctionLiteral( | |
| 686 const AstRawString* name, Scanner::Location function_name_location, | |
| 687 FunctionNameValidity function_name_validity, FunctionKind kind, | |
| 688 int function_token_position, FunctionLiteral::FunctionType type, | |
| 689 LanguageMode language_mode, bool* ok) { | |
| 690 return delegate()->ParseFunctionLiteral( | |
| 691 name, function_name_location, function_name_validity, kind, | |
| 692 function_token_position, type, language_mode, ok); | |
| 693 } | |
| 694 | |
| 695 Expression* ParserBaseTraits<Parser>::ParseClassLiteral( | |
| 696 Type::ExpressionClassifier* classifier, const AstRawString* name, | |
| 697 Scanner::Location class_name_location, bool name_is_strict_reserved, | |
| 698 int pos, bool* ok) { | |
| 699 return delegate()->ParseClassLiteral(classifier, name, class_name_location, | |
| 700 name_is_strict_reserved, pos, ok); | |
| 701 } | |
| 702 | |
| 703 void ParserBaseTraits<Parser>::MarkTailPosition(Expression* expression) { | |
| 704 expression->MarkTail(); | 682 expression->MarkTail(); |
| 705 } | 683 } |
| 706 | 684 |
| 707 void ParserBaseTraits<Parser>::MarkCollectedTailCallExpressions() { | |
| 708 delegate()->MarkCollectedTailCallExpressions(); | |
| 709 } | |
| 710 | |
| 711 Parser::Parser(ParseInfo* info) | 685 Parser::Parser(ParseInfo* info) |
| 712 : ParserBase<Parser>(info->zone(), &scanner_, info->stack_limit(), | 686 : ParserBase<Parser>(info->zone(), &scanner_, info->stack_limit(), |
| 713 info->extension(), info->ast_value_factory(), NULL), | 687 info->extension(), info->ast_value_factory(), NULL), |
| 714 scanner_(info->unicode_cache()), | 688 scanner_(info->unicode_cache()), |
| 715 reusable_preparser_(NULL), | 689 reusable_preparser_(NULL), |
| 716 original_scope_(NULL), | 690 original_scope_(NULL), |
| 717 target_stack_(NULL), | 691 target_stack_(NULL), |
| 718 compile_options_(info->compile_options()), | 692 compile_options_(info->compile_options()), |
| 719 cached_parse_data_(NULL), | 693 cached_parse_data_(NULL), |
| 720 total_preparse_skipped_(0), | 694 total_preparse_skipped_(0), |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 933 if (body->length() != 1 || | 907 if (body->length() != 1 || |
| 934 !body->at(0)->IsExpressionStatement() || | 908 !body->at(0)->IsExpressionStatement() || |
| 935 !body->at(0)->AsExpressionStatement()-> | 909 !body->at(0)->AsExpressionStatement()-> |
| 936 expression()->IsFunctionLiteral()) { | 910 expression()->IsFunctionLiteral()) { |
| 937 ReportMessage(MessageTemplate::kSingleFunctionLiteral); | 911 ReportMessage(MessageTemplate::kSingleFunctionLiteral); |
| 938 ok = false; | 912 ok = false; |
| 939 } | 913 } |
| 940 } | 914 } |
| 941 | 915 |
| 942 if (ok) { | 916 if (ok) { |
| 943 ParserBaseTraits<Parser>::RewriteDestructuringAssignments(); | 917 RewriteDestructuringAssignments(); |
| 944 result = factory()->NewScriptOrEvalFunctionLiteral( | 918 result = factory()->NewScriptOrEvalFunctionLiteral( |
| 945 scope, body, function_state.materialized_literal_count(), | 919 scope, body, function_state.materialized_literal_count(), |
| 946 function_state.expected_property_count()); | 920 function_state.expected_property_count()); |
| 947 } | 921 } |
| 948 } | 922 } |
| 949 | 923 |
| 950 // Make sure the target stack is empty. | 924 // Make sure the target stack is empty. |
| 951 DCHECK(target_stack_ == NULL); | 925 DCHECK(target_stack_ == NULL); |
| 952 | 926 |
| 953 return result; | 927 return result; |
| (...skipping 3023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3977 if (expr->IsAssignment()) { | 3951 if (expr->IsAssignment()) { |
| 3978 Assignment* assignment = expr->AsAssignment(); | 3952 Assignment* assignment = expr->AsAssignment(); |
| 3979 DCHECK(!assignment->is_compound()); | 3953 DCHECK(!assignment->is_compound()); |
| 3980 initializer = assignment->value(); | 3954 initializer = assignment->value(); |
| 3981 expr = assignment->target(); | 3955 expr = assignment->target(); |
| 3982 } | 3956 } |
| 3983 | 3957 |
| 3984 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest); | 3958 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest); |
| 3985 } | 3959 } |
| 3986 | 3960 |
| 3987 void ParserBaseTraits<Parser>::ParseAsyncArrowSingleExpressionBody( | |
| 3988 ZoneList<Statement*>* body, bool accept_IN, | |
| 3989 Type::ExpressionClassifier* classifier, int pos, bool* ok) { | |
| 3990 delegate()->DesugarAsyncFunctionBody( | |
| 3991 delegate()->ast_value_factory()->empty_string(), delegate()->scope(), | |
| 3992 body, classifier, kAsyncArrowFunction, | |
| 3993 Parser::FunctionBodyType::kSingleExpression, accept_IN, pos, ok); | |
| 3994 } | |
| 3995 | |
| 3996 void Parser::DesugarAsyncFunctionBody(const AstRawString* function_name, | 3961 void Parser::DesugarAsyncFunctionBody(const AstRawString* function_name, |
| 3997 Scope* scope, ZoneList<Statement*>* body, | 3962 Scope* scope, ZoneList<Statement*>* body, |
| 3998 ExpressionClassifier* classifier, | 3963 ExpressionClassifier* classifier, |
| 3999 FunctionKind kind, | 3964 FunctionKind kind, |
| 4000 FunctionBodyType body_type, | 3965 FunctionBodyType body_type, |
| 4001 bool accept_IN, int pos, bool* ok) { | 3966 bool accept_IN, int pos, bool* ok) { |
| 4002 // function async_function() { | 3967 // function async_function() { |
| 4003 // try { | 3968 // try { |
| 4004 // .generator_object = %CreateGeneratorObject(); | 3969 // .generator_object = %CreateGeneratorObject(); |
| 4005 // ... function body ... | 3970 // ... function body ... |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4023 | 3988 |
| 4024 ZoneList<Statement*>* inner_body = try_block->statements(); | 3989 ZoneList<Statement*>* inner_body = try_block->statements(); |
| 4025 | 3990 |
| 4026 Expression* return_value = nullptr; | 3991 Expression* return_value = nullptr; |
| 4027 if (body_type == FunctionBodyType::kNormal) { | 3992 if (body_type == FunctionBodyType::kNormal) { |
| 4028 ParseStatementList(inner_body, Token::RBRACE, CHECK_OK_VOID); | 3993 ParseStatementList(inner_body, Token::RBRACE, CHECK_OK_VOID); |
| 4029 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition); | 3994 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition); |
| 4030 } else { | 3995 } else { |
| 4031 return_value = | 3996 return_value = |
| 4032 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_VOID); | 3997 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_VOID); |
| 4033 ParserBaseTraits<Parser>::RewriteNonPattern(classifier, CHECK_OK_VOID); | 3998 RewriteNonPattern(classifier, CHECK_OK_VOID); |
| 4034 } | 3999 } |
| 4035 | 4000 |
| 4036 return_value = BuildPromiseResolve(return_value, return_value->position()); | 4001 return_value = BuildPromiseResolve(return_value, return_value->position()); |
| 4037 inner_body->Add( | 4002 inner_body->Add( |
| 4038 factory()->NewReturnStatement(return_value, return_value->position()), | 4003 factory()->NewReturnStatement(return_value, return_value->position()), |
| 4039 zone()); | 4004 zone()); |
| 4040 body->Add(BuildRejectPromiseOnException(try_block), zone()); | 4005 body->Add(BuildRejectPromiseOnException(try_block), zone()); |
| 4041 scope->set_end_position(scanner()->location().end_pos); | 4006 scope->set_end_position(scanner()->location().end_pos); |
| 4042 } | 4007 } |
| 4043 | 4008 |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4327 if (is_strict(language_mode)) { | 4292 if (is_strict(language_mode)) { |
| 4328 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), | 4293 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), |
| 4329 CHECK_OK); | 4294 CHECK_OK); |
| 4330 CheckDecimalLiteralWithLeadingZero(use_counts_, scope->start_position(), | 4295 CheckDecimalLiteralWithLeadingZero(use_counts_, scope->start_position(), |
| 4331 scope->end_position()); | 4296 scope->end_position()); |
| 4332 } | 4297 } |
| 4333 CheckConflictingVarDeclarations(scope, CHECK_OK); | 4298 CheckConflictingVarDeclarations(scope, CHECK_OK); |
| 4334 | 4299 |
| 4335 if (body) { | 4300 if (body) { |
| 4336 // If body can be inspected, rewrite queued destructuring assignments | 4301 // If body can be inspected, rewrite queued destructuring assignments |
| 4337 ParserBaseTraits<Parser>::RewriteDestructuringAssignments(); | 4302 RewriteDestructuringAssignments(); |
| 4338 } | 4303 } |
| 4339 has_duplicate_parameters = | 4304 has_duplicate_parameters = |
| 4340 !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); | 4305 !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); |
| 4341 | 4306 |
| 4342 if (use_temp_zone) { | 4307 if (use_temp_zone) { |
| 4343 DCHECK(main_scope != scope); | 4308 DCHECK(main_scope != scope); |
| 4344 scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory); | 4309 scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory); |
| 4345 } | 4310 } |
| 4346 } // DiscardableZoneScope goes out of scope. | 4311 } // DiscardableZoneScope goes out of scope. |
| 4347 | 4312 |
| (...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5349 | 5314 |
| 5350 // We cannot internalize on a background thread; a foreground task will take | 5315 // We cannot internalize on a background thread; a foreground task will take |
| 5351 // care of calling Parser::Internalize just before compilation. | 5316 // care of calling Parser::Internalize just before compilation. |
| 5352 | 5317 |
| 5353 if (produce_cached_parse_data()) { | 5318 if (produce_cached_parse_data()) { |
| 5354 if (result != NULL) *info->cached_data() = recorder.GetScriptData(); | 5319 if (result != NULL) *info->cached_data() = recorder.GetScriptData(); |
| 5355 log_ = NULL; | 5320 log_ = NULL; |
| 5356 } | 5321 } |
| 5357 } | 5322 } |
| 5358 | 5323 |
| 5359 ParserBaseTraits<Parser>::TemplateLiteralState Parser::OpenTemplateLiteral( | 5324 Parser::TemplateLiteralState Parser::OpenTemplateLiteral(int pos) { |
| 5360 int pos) { | 5325 return new (zone()) TemplateLiteral(zone(), pos); |
| 5361 return new (zone()) ParserBaseTraits<Parser>::TemplateLiteral(zone(), pos); | |
| 5362 } | 5326 } |
| 5363 | 5327 |
| 5364 | 5328 |
| 5365 void Parser::AddTemplateSpan(TemplateLiteralState* state, bool tail) { | 5329 void Parser::AddTemplateSpan(TemplateLiteralState* state, bool tail) { |
| 5366 int pos = scanner()->location().beg_pos; | 5330 int pos = scanner()->location().beg_pos; |
| 5367 int end = scanner()->location().end_pos - (tail ? 1 : 2); | 5331 int end = scanner()->location().end_pos - (tail ? 1 : 2); |
| 5368 const AstRawString* tv = scanner()->CurrentSymbol(ast_value_factory()); | 5332 const AstRawString* tv = scanner()->CurrentSymbol(ast_value_factory()); |
| 5369 const AstRawString* trv = scanner()->CurrentRawSymbol(ast_value_factory()); | 5333 const AstRawString* trv = scanner()->CurrentRawSymbol(ast_value_factory()); |
| 5370 Literal* cooked = factory()->NewStringLiteral(tv, pos); | 5334 Literal* cooked = factory()->NewStringLiteral(tv, pos); |
| 5371 Literal* raw = factory()->NewStringLiteral(trv, pos); | 5335 Literal* raw = factory()->NewStringLiteral(trv, pos); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5627 ZoneList<Expression*>* args) { | 5591 ZoneList<Expression*>* args) { |
| 5628 AstNodeFactory* factory = delegate()->factory(); | 5592 AstNodeFactory* factory = delegate()->factory(); |
| 5629 Expression* expr = args->at(0); | 5593 Expression* expr = args->at(0); |
| 5630 for (int i = 1; i < args->length(); ++i) { | 5594 for (int i = 1; i < args->length(); ++i) { |
| 5631 expr = factory->NewBinaryOperation(Token::COMMA, expr, args->at(i), | 5595 expr = factory->NewBinaryOperation(Token::COMMA, expr, args->at(i), |
| 5632 expr->position()); | 5596 expr->position()); |
| 5633 } | 5597 } |
| 5634 return expr; | 5598 return expr; |
| 5635 } | 5599 } |
| 5636 | 5600 |
| 5637 void ParserBaseTraits<Parser>::RewriteDestructuringAssignments() { | 5601 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
| 5638 delegate()->RewriteDestructuringAssignments(); | |
| 5639 } | |
| 5640 | |
| 5641 Expression* ParserBaseTraits<Parser>::RewriteExponentiation(Expression* left, | |
| 5642 Expression* right, | |
| 5643 int pos) { | |
| 5644 return delegate()->RewriteExponentiation(left, right, pos); | |
| 5645 } | |
| 5646 | |
| 5647 Expression* ParserBaseTraits<Parser>::RewriteAssignExponentiation( | |
| 5648 Expression* left, Expression* right, int pos) { | |
| 5649 return delegate()->RewriteAssignExponentiation(left, right, pos); | |
| 5650 } | |
| 5651 | |
| 5652 void ParserBaseTraits<Parser>::RewriteNonPattern( | |
| 5653 Type::ExpressionClassifier* classifier, bool* ok) { | |
| 5654 delegate()->RewriteNonPattern(classifier, ok); | |
| 5655 } | |
| 5656 | |
| 5657 Expression* ParserBaseTraits<Parser>::RewriteAwaitExpression(Expression* value, | |
| 5658 int await_pos) { | |
| 5659 // yield %AsyncFunctionAwait(.generator_object, <operand>) | 5602 // yield %AsyncFunctionAwait(.generator_object, <operand>) |
| 5660 Variable* generator_object_variable = | 5603 Variable* generator_object_variable = |
| 5661 delegate()->function_state_->generator_object_variable(); | 5604 delegate()->function_state_->generator_object_variable(); |
| 5662 | 5605 |
| 5663 // If generator_object_variable is null, | 5606 // If generator_object_variable is null, |
| 5664 if (!generator_object_variable) return value; | 5607 if (!generator_object_variable) return value; |
| 5665 | 5608 |
| 5666 auto factory = delegate()->factory(); | 5609 auto factory = delegate()->factory(); |
| 5667 const int nopos = kNoSourcePosition; | 5610 const int nopos = kNoSourcePosition; |
| 5668 | 5611 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5900 append_body, finalize); | 5843 append_body, finalize); |
| 5901 do_block->statements()->Add(loop, zone()); | 5844 do_block->statements()->Add(loop, zone()); |
| 5902 } | 5845 } |
| 5903 } | 5846 } |
| 5904 // Now, rewind the original array literal to truncate everything from the | 5847 // Now, rewind the original array literal to truncate everything from the |
| 5905 // first spread (included) until the end. This fixes $R's initialization. | 5848 // first spread (included) until the end. This fixes $R's initialization. |
| 5906 lit->RewindSpreads(); | 5849 lit->RewindSpreads(); |
| 5907 return factory()->NewDoExpression(do_block, result, lit->position()); | 5850 return factory()->NewDoExpression(do_block, result, lit->position()); |
| 5908 } | 5851 } |
| 5909 | 5852 |
| 5910 void ParserBaseTraits<Parser>::QueueDestructuringAssignmentForRewriting( | 5853 void Parser::QueueDestructuringAssignmentForRewriting(Expression* expr) { |
| 5911 Expression* expr) { | |
| 5912 DCHECK(expr->IsRewritableExpression()); | 5854 DCHECK(expr->IsRewritableExpression()); |
| 5913 delegate()->function_state_->AddDestructuringAssignment( | 5855 function_state_->AddDestructuringAssignment( |
| 5914 Parser::DestructuringAssignment(expr, delegate()->scope())); | 5856 DestructuringAssignment(expr, delegate()->scope())); |
| 5915 } | 5857 } |
| 5916 | 5858 |
| 5917 void ParserBaseTraits<Parser>::QueueNonPatternForRewriting(Expression* expr, | 5859 void Parser::QueueNonPatternForRewriting(Expression* expr, bool* ok) { |
| 5918 bool* ok) { | |
| 5919 DCHECK(expr->IsRewritableExpression()); | 5860 DCHECK(expr->IsRewritableExpression()); |
| 5920 delegate()->function_state_->AddNonPatternForRewriting(expr, ok); | 5861 function_state_->AddNonPatternForRewriting(expr, ok); |
| 5921 } | 5862 } |
| 5922 | 5863 |
| 5923 void ParserBaseTraits<Parser>::SetFunctionNameFromPropertyName( | 5864 void ParserBaseTraits<Parser>::SetFunctionNameFromPropertyName( |
| 5924 ObjectLiteralProperty* property, const AstRawString* name) { | 5865 ObjectLiteralProperty* property, const AstRawString* name) { |
| 5925 Expression* value = property->value(); | 5866 Expression* value = property->value(); |
| 5926 | 5867 |
| 5927 // Computed name setting must happen at runtime. | 5868 // Computed name setting must happen at runtime. |
| 5928 if (property->is_computed_name()) return; | 5869 if (property->is_computed_name()) return; |
| 5929 | 5870 |
| 5930 // Getter and setter names are handled here because their names | 5871 // Getter and setter names are handled here because their names |
| (...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6902 node->Print(Isolate::Current()); | 6843 node->Print(Isolate::Current()); |
| 6903 } | 6844 } |
| 6904 #endif // DEBUG | 6845 #endif // DEBUG |
| 6905 | 6846 |
| 6906 #undef CHECK_OK | 6847 #undef CHECK_OK |
| 6907 #undef CHECK_OK_VOID | 6848 #undef CHECK_OK_VOID |
| 6908 #undef CHECK_FAILED | 6849 #undef CHECK_FAILED |
| 6909 | 6850 |
| 6910 } // namespace internal | 6851 } // namespace internal |
| 6911 } // namespace v8 | 6852 } // namespace v8 |
| OLD | NEW |