| 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 2107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2118 // Don't infer if it is "a = function(){...}();"-like expression. | 2118 // Don't infer if it is "a = function(){...}();"-like expression. |
| 2119 if (single_name) { | 2119 if (single_name) { |
| 2120 if (fni_ != NULL && value->AsCall() == NULL && | 2120 if (fni_ != NULL && value->AsCall() == NULL && |
| 2121 value->AsCallNew() == NULL) { | 2121 value->AsCallNew() == NULL) { |
| 2122 fni_->Infer(); | 2122 fni_->Infer(); |
| 2123 } else { | 2123 } else { |
| 2124 fni_->RemoveLastFunction(); | 2124 fni_->RemoveLastFunction(); |
| 2125 } | 2125 } |
| 2126 } | 2126 } |
| 2127 | 2127 |
| 2128 ParserBaseTraits<Parser>::SetFunctionNameFromIdentifierRef(value, | 2128 SetFunctionNameFromIdentifierRef(value, pattern); |
| 2129 pattern); | |
| 2130 | 2129 |
| 2131 // End position of the initializer is after the assignment expression. | 2130 // End position of the initializer is after the assignment expression. |
| 2132 initializer_position = scanner()->location().end_pos; | 2131 initializer_position = scanner()->location().end_pos; |
| 2133 } else { | 2132 } else { |
| 2134 // Initializers may be either required or implied unless this is a | 2133 // Initializers may be either required or implied unless this is a |
| 2135 // for-in/of iteration variable. | 2134 // for-in/of iteration variable. |
| 2136 if (var_context != kForStatement || !PeekInOrOf()) { | 2135 if (var_context != kForStatement || !PeekInOrOf()) { |
| 2137 // ES6 'const' and binding patterns require initializers. | 2136 // ES6 'const' and binding patterns require initializers. |
| 2138 if (parsing_result->descriptor.mode == CONST || | 2137 if (parsing_result->descriptor.mode == CONST || |
| 2139 !pattern->IsVariableProxy()) { | 2138 !pattern->IsVariableProxy()) { |
| (...skipping 1411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3551 expression->IsObjectLiteral()); | 3550 expression->IsObjectLiteral()); |
| 3552 | 3551 |
| 3553 if (is_destructuring) { | 3552 if (is_destructuring) { |
| 3554 ValidateAssignmentPattern(&classifier, CHECK_OK); | 3553 ValidateAssignmentPattern(&classifier, CHECK_OK); |
| 3555 } else { | 3554 } else { |
| 3556 RewriteNonPattern(&classifier, CHECK_OK); | 3555 RewriteNonPattern(&classifier, CHECK_OK); |
| 3557 } | 3556 } |
| 3558 | 3557 |
| 3559 if (is_for_each) { | 3558 if (is_for_each) { |
| 3560 if (!is_destructuring) { | 3559 if (!is_destructuring) { |
| 3561 expression = this->CheckAndRewriteReferenceExpression( | 3560 expression = CheckAndRewriteReferenceExpression( |
| 3562 expression, lhs_beg_pos, lhs_end_pos, | 3561 expression, lhs_beg_pos, lhs_end_pos, |
| 3563 MessageTemplate::kInvalidLhsInFor, kSyntaxError, CHECK_OK); | 3562 MessageTemplate::kInvalidLhsInFor, kSyntaxError, CHECK_OK); |
| 3564 } | 3563 } |
| 3565 | 3564 |
| 3566 ForEachStatement* loop = | 3565 ForEachStatement* loop = |
| 3567 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3566 factory()->NewForEachStatement(mode, labels, stmt_pos); |
| 3568 Target target(&this->target_stack_, loop); | 3567 Target target(&this->target_stack_, loop); |
| 3569 | 3568 |
| 3570 int each_keyword_position = scanner()->location().beg_pos; | 3569 int each_keyword_position = scanner()->location().beg_pos; |
| 3571 | 3570 |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3842 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); | 3841 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); |
| 3843 Block* block = ParseBlock(nullptr, CHECK_OK); | 3842 Block* block = ParseBlock(nullptr, CHECK_OK); |
| 3844 DoExpression* expr = factory()->NewDoExpression(block, result, pos); | 3843 DoExpression* expr = factory()->NewDoExpression(block, result, pos); |
| 3845 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) { | 3844 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) { |
| 3846 *ok = false; | 3845 *ok = false; |
| 3847 return nullptr; | 3846 return nullptr; |
| 3848 } | 3847 } |
| 3849 return expr; | 3848 return expr; |
| 3850 } | 3849 } |
| 3851 | 3850 |
| 3852 void ParserBaseTraits<Parser>::ParseArrowFunctionFormalParameterList( | 3851 void Parser::ParseArrowFunctionFormalParameterList( |
| 3853 ParserFormalParameters* parameters, Expression* expr, | 3852 ParserFormalParameters* parameters, Expression* expr, |
| 3854 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, | 3853 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| 3855 const Scope::Snapshot& scope_snapshot, bool* ok) { | 3854 const Scope::Snapshot& scope_snapshot, bool* ok) { |
| 3856 if (expr->IsEmptyParentheses()) return; | 3855 if (expr->IsEmptyParentheses()) return; |
| 3857 | 3856 |
| 3858 delegate()->ParseArrowFunctionFormalParameters( | 3857 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos, |
| 3859 parameters, expr, params_loc.end_pos, CHECK_OK_VOID); | 3858 CHECK_OK_VOID); |
| 3860 | 3859 |
| 3861 scope_snapshot.Reparent(parameters->scope); | 3860 scope_snapshot.Reparent(parameters->scope); |
| 3862 | 3861 |
| 3863 if (parameters->Arity() > Code::kMaxArguments) { | 3862 if (parameters->Arity() > Code::kMaxArguments) { |
| 3864 delegate()->ReportMessageAt(params_loc, | 3863 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
| 3865 MessageTemplate::kMalformedArrowFunParamList); | |
| 3866 *ok = false; | 3864 *ok = false; |
| 3867 return; | 3865 return; |
| 3868 } | 3866 } |
| 3869 | 3867 |
| 3870 Type::ExpressionClassifier classifier(delegate()); | 3868 Type::ExpressionClassifier classifier(this); |
| 3871 if (!parameters->is_simple) { | 3869 if (!parameters->is_simple) { |
| 3872 classifier.RecordNonSimpleParameter(); | 3870 classifier.RecordNonSimpleParameter(); |
| 3873 } | 3871 } |
| 3874 for (int i = 0; i < parameters->Arity(); ++i) { | 3872 for (int i = 0; i < parameters->Arity(); ++i) { |
| 3875 auto parameter = parameters->at(i); | 3873 auto parameter = parameters->at(i); |
| 3876 DeclareFormalParameter(parameters->scope, parameter, &classifier); | 3874 DeclareFormalParameter(parameters->scope, parameter, &classifier); |
| 3877 if (!duplicate_loc->IsValid()) { | 3875 if (!duplicate_loc->IsValid()) { |
| 3878 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; | 3876 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; |
| 3879 } | 3877 } |
| 3880 } | 3878 } |
| 3881 DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters()); | 3879 DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters()); |
| 3882 } | 3880 } |
| 3883 | 3881 |
| 3884 void ParserBaseTraits<Parser>::ReindexLiterals( | 3882 void Parser::ReindexLiterals(const ParserFormalParameters& parameters) { |
| 3885 const ParserFormalParameters& parameters) { | 3883 if (function_state_->materialized_literal_count() > 0) { |
| 3886 if (delegate()->function_state_->materialized_literal_count() > 0) { | |
| 3887 AstLiteralReindexer reindexer; | 3884 AstLiteralReindexer reindexer; |
| 3888 | 3885 |
| 3889 for (const auto p : parameters.params) { | 3886 for (const auto p : parameters.params) { |
| 3890 if (p.pattern != nullptr) reindexer.Reindex(p.pattern); | 3887 if (p.pattern != nullptr) reindexer.Reindex(p.pattern); |
| 3891 if (p.initializer != nullptr) reindexer.Reindex(p.initializer); | 3888 if (p.initializer != nullptr) reindexer.Reindex(p.initializer); |
| 3892 } | 3889 } |
| 3893 | 3890 |
| 3894 DCHECK(reindexer.count() <= | 3891 DCHECK(reindexer.count() <= function_state_->materialized_literal_count()); |
| 3895 delegate()->function_state_->materialized_literal_count()); | |
| 3896 } | 3892 } |
| 3897 } | 3893 } |
| 3898 | 3894 |
| 3899 | 3895 |
| 3900 FunctionLiteral* Parser::ParseFunctionLiteral( | 3896 FunctionLiteral* Parser::ParseFunctionLiteral( |
| 3901 const AstRawString* function_name, Scanner::Location function_name_location, | 3897 const AstRawString* function_name, Scanner::Location function_name_location, |
| 3902 FunctionNameValidity function_name_validity, FunctionKind kind, | 3898 FunctionNameValidity function_name_validity, FunctionKind kind, |
| 3903 int function_token_pos, FunctionLiteral::FunctionType function_type, | 3899 int function_token_pos, FunctionLiteral::FunctionType function_type, |
| 3904 LanguageMode language_mode, bool* ok) { | 3900 LanguageMode language_mode, bool* ok) { |
| 3905 // Function :: | 3901 // Function :: |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3959 | 3955 |
| 3960 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume | 3956 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume |
| 3961 // parenthesis before the function means that it will be called | 3957 // parenthesis before the function means that it will be called |
| 3962 // immediately). The inner function *must* be parsed eagerly to resolve the | 3958 // immediately). The inner function *must* be parsed eagerly to resolve the |
| 3963 // possible reference to the variable in foo's scope. However, it's possible | 3959 // possible reference to the variable in foo's scope. However, it's possible |
| 3964 // that it will be compiled lazily. | 3960 // that it will be compiled lazily. |
| 3965 | 3961 |
| 3966 // To make this additional case work, both Parser and PreParser implement a | 3962 // To make this additional case work, both Parser and PreParser implement a |
| 3967 // logic where only top-level functions will be parsed lazily. | 3963 // logic where only top-level functions will be parsed lazily. |
| 3968 bool is_lazily_parsed = mode() == PARSE_LAZILY && | 3964 bool is_lazily_parsed = mode() == PARSE_LAZILY && |
| 3969 this->scope()->AllowsLazyParsing() && | 3965 scope()->AllowsLazyParsing() && |
| 3970 !function_state_->next_function_is_parenthesized(); | 3966 !function_state_->next_function_is_parenthesized(); |
| 3971 | 3967 |
| 3972 // Determine whether the function body can be discarded after parsing. | 3968 // Determine whether the function body can be discarded after parsing. |
| 3973 // The preconditions are: | 3969 // The preconditions are: |
| 3974 // - Lazy compilation has to be enabled. | 3970 // - Lazy compilation has to be enabled. |
| 3975 // - Neither V8 natives nor native function declarations can be allowed, | 3971 // - Neither V8 natives nor native function declarations can be allowed, |
| 3976 // since parsing one would retroactively force the function to be | 3972 // since parsing one would retroactively force the function to be |
| 3977 // eagerly compiled. | 3973 // eagerly compiled. |
| 3978 // - The invoker of this parser can't depend on the AST being eagerly | 3974 // - The invoker of this parser can't depend on the AST being eagerly |
| 3979 // built (either because the function is about to be compiled, or | 3975 // built (either because the function is about to be compiled, or |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4259 | 4255 |
| 4260 Expression* condition = factory()->NewBinaryOperation( | 4256 Expression* condition = factory()->NewBinaryOperation( |
| 4261 Token::OR, | 4257 Token::OR, |
| 4262 factory()->NewCompareOperation( | 4258 factory()->NewCompareOperation( |
| 4263 Token::EQ_STRICT, factory()->NewVariableProxy(var), | 4259 Token::EQ_STRICT, factory()->NewVariableProxy(var), |
| 4264 factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition), | 4260 factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition), |
| 4265 factory()->NewCompareOperation( | 4261 factory()->NewCompareOperation( |
| 4266 Token::EQ_STRICT, factory()->NewVariableProxy(var), | 4262 Token::EQ_STRICT, factory()->NewVariableProxy(var), |
| 4267 factory()->NewNullLiteral(kNoSourcePosition), kNoSourcePosition), | 4263 factory()->NewNullLiteral(kNoSourcePosition), kNoSourcePosition), |
| 4268 kNoSourcePosition); | 4264 kNoSourcePosition); |
| 4269 Expression* throw_type_error = this->NewThrowTypeError( | 4265 Expression* throw_type_error = |
| 4270 MessageTemplate::kNonCoercible, ast_value_factory()->empty_string(), | 4266 NewThrowTypeError(MessageTemplate::kNonCoercible, |
| 4271 kNoSourcePosition); | 4267 ast_value_factory()->empty_string(), kNoSourcePosition); |
| 4272 IfStatement* if_statement = factory()->NewIfStatement( | 4268 IfStatement* if_statement = factory()->NewIfStatement( |
| 4273 condition, | 4269 condition, |
| 4274 factory()->NewExpressionStatement(throw_type_error, kNoSourcePosition), | 4270 factory()->NewExpressionStatement(throw_type_error, kNoSourcePosition), |
| 4275 factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); | 4271 factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); |
| 4276 return if_statement; | 4272 return if_statement; |
| 4277 } | 4273 } |
| 4278 | 4274 |
| 4279 | 4275 |
| 4280 class InitializerRewriter final | 4276 class InitializerRewriter final |
| 4281 : public AstTraversalVisitor<InitializerRewriter> { | 4277 : public AstTraversalVisitor<InitializerRewriter> { |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4533 } else if (IsAsyncFunction(kind)) { | 4529 } else if (IsAsyncFunction(kind)) { |
| 4534 const bool accept_IN = true; | 4530 const bool accept_IN = true; |
| 4535 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, | 4531 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, |
| 4536 FunctionBodyType::kNormal, accept_IN, pos, | 4532 FunctionBodyType::kNormal, accept_IN, pos, |
| 4537 CHECK_OK); | 4533 CHECK_OK); |
| 4538 } else { | 4534 } else { |
| 4539 ParseStatementList(body, Token::RBRACE, CHECK_OK); | 4535 ParseStatementList(body, Token::RBRACE, CHECK_OK); |
| 4540 } | 4536 } |
| 4541 | 4537 |
| 4542 if (IsSubclassConstructor(kind)) { | 4538 if (IsSubclassConstructor(kind)) { |
| 4543 body->Add(factory()->NewReturnStatement( | 4539 body->Add(factory()->NewReturnStatement(ThisExpression(kNoSourcePosition), |
| 4544 this->ThisExpression(kNoSourcePosition), kNoSourcePosition), | 4540 kNoSourcePosition), |
| 4545 zone()); | 4541 zone()); |
| 4546 } | 4542 } |
| 4547 } | 4543 } |
| 4548 | 4544 |
| 4549 Expect(Token::RBRACE, CHECK_OK); | 4545 Expect(Token::RBRACE, CHECK_OK); |
| 4550 scope()->set_end_position(scanner()->location().end_pos); | 4546 scope()->set_end_position(scanner()->location().end_pos); |
| 4551 | 4547 |
| 4552 if (!parameters.is_simple) { | 4548 if (!parameters.is_simple) { |
| 4553 DCHECK_NOT_NULL(inner_scope); | 4549 DCHECK_NOT_NULL(inner_scope); |
| 4554 DCHECK_EQ(function_scope, scope()); | 4550 DCHECK_EQ(function_scope, scope()); |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5406 for (int i = 0; i < tail_call_expressions.length(); ++i) { | 5402 for (int i = 0; i < tail_call_expressions.length(); ++i) { |
| 5407 Expression* expression = tail_call_expressions[i]; | 5403 Expression* expression = tail_call_expressions[i]; |
| 5408 // If only FLAG_harmony_explicit_tailcalls is enabled then expression | 5404 // If only FLAG_harmony_explicit_tailcalls is enabled then expression |
| 5409 // must be a Call expression. | 5405 // must be a Call expression. |
| 5410 DCHECK(FLAG_harmony_tailcalls || !FLAG_harmony_explicit_tailcalls || | 5406 DCHECK(FLAG_harmony_tailcalls || !FLAG_harmony_explicit_tailcalls || |
| 5411 expression->IsCall()); | 5407 expression->IsCall()); |
| 5412 MarkTailPosition(expression); | 5408 MarkTailPosition(expression); |
| 5413 } | 5409 } |
| 5414 } | 5410 } |
| 5415 | 5411 |
| 5416 Expression* ParserBaseTraits<Parser>::ExpressionListToExpression( | 5412 Expression* Parser::ExpressionListToExpression(ZoneList<Expression*>* args) { |
| 5417 ZoneList<Expression*>* args) { | |
| 5418 AstNodeFactory* factory = delegate()->factory(); | |
| 5419 Expression* expr = args->at(0); | 5413 Expression* expr = args->at(0); |
| 5420 for (int i = 1; i < args->length(); ++i) { | 5414 for (int i = 1; i < args->length(); ++i) { |
| 5421 expr = factory->NewBinaryOperation(Token::COMMA, expr, args->at(i), | 5415 expr = factory()->NewBinaryOperation(Token::COMMA, expr, args->at(i), |
| 5422 expr->position()); | 5416 expr->position()); |
| 5423 } | 5417 } |
| 5424 return expr; | 5418 return expr; |
| 5425 } | 5419 } |
| 5426 | 5420 |
| 5427 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { | 5421 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { |
| 5428 // yield %AsyncFunctionAwait(.generator_object, <operand>) | 5422 // yield %AsyncFunctionAwait(.generator_object, <operand>) |
| 5429 Variable* generator_object_variable = | 5423 Variable* generator_object_variable = |
| 5430 delegate()->function_state_->generator_object_variable(); | 5424 function_state_->generator_object_variable(); |
| 5431 | 5425 |
| 5432 // If generator_object_variable is null, | 5426 // If generator_object_variable is null, |
| 5433 if (!generator_object_variable) return value; | 5427 if (!generator_object_variable) return value; |
| 5434 | 5428 |
| 5435 auto factory = delegate()->factory(); | |
| 5436 const int nopos = kNoSourcePosition; | 5429 const int nopos = kNoSourcePosition; |
| 5437 | 5430 |
| 5438 Variable* temp_var = | 5431 Variable* temp_var = NewTemporary(ast_value_factory()->empty_string()); |
| 5439 delegate()->NewTemporary(delegate()->ast_value_factory()->empty_string()); | 5432 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp_var); |
| 5440 VariableProxy* temp_proxy = factory->NewVariableProxy(temp_var); | 5433 Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos); |
| 5441 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); | |
| 5442 | 5434 |
| 5443 // Wrap value evaluation to provide a break location. | 5435 // Wrap value evaluation to provide a break location. |
| 5444 Expression* value_assignment = | 5436 Expression* value_assignment = |
| 5445 factory->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos); | 5437 factory()->NewAssignment(Token::ASSIGN, temp_proxy, value, nopos); |
| 5446 do_block->statements()->Add( | 5438 do_block->statements()->Add( |
| 5447 factory->NewExpressionStatement(value_assignment, value->position()), | 5439 factory()->NewExpressionStatement(value_assignment, value->position()), |
| 5448 zone()); | 5440 zone()); |
| 5449 | 5441 |
| 5450 ZoneList<Expression*>* async_function_await_args = | 5442 ZoneList<Expression*>* async_function_await_args = |
| 5451 new (zone()) ZoneList<Expression*>(2, zone()); | 5443 new (zone()) ZoneList<Expression*>(2, zone()); |
| 5452 Expression* generator_object = | 5444 Expression* generator_object = |
| 5453 factory->NewVariableProxy(generator_object_variable); | 5445 factory()->NewVariableProxy(generator_object_variable); |
| 5454 async_function_await_args->Add(generator_object, zone()); | 5446 async_function_await_args->Add(generator_object, zone()); |
| 5455 async_function_await_args->Add(temp_proxy, zone()); | 5447 async_function_await_args->Add(temp_proxy, zone()); |
| 5456 Expression* async_function_await = delegate()->factory()->NewCallRuntime( | 5448 Expression* async_function_await = factory()->NewCallRuntime( |
| 5457 Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args, nopos); | 5449 Context::ASYNC_FUNCTION_AWAIT_INDEX, async_function_await_args, nopos); |
| 5458 // Wrap await to provide a break location between value evaluation and yield. | 5450 // Wrap await to provide a break location between value evaluation and yield. |
| 5459 Expression* await_assignment = factory->NewAssignment( | 5451 Expression* await_assignment = factory()->NewAssignment( |
| 5460 Token::ASSIGN, temp_proxy, async_function_await, nopos); | 5452 Token::ASSIGN, temp_proxy, async_function_await, nopos); |
| 5461 do_block->statements()->Add( | 5453 do_block->statements()->Add( |
| 5462 factory->NewExpressionStatement(await_assignment, await_pos), zone()); | 5454 factory()->NewExpressionStatement(await_assignment, await_pos), zone()); |
| 5463 Expression* do_expr = factory->NewDoExpression(do_block, temp_var, nopos); | 5455 Expression* do_expr = factory()->NewDoExpression(do_block, temp_var, nopos); |
| 5464 | 5456 |
| 5465 generator_object = factory->NewVariableProxy(generator_object_variable); | 5457 generator_object = factory()->NewVariableProxy(generator_object_variable); |
| 5466 return factory->NewYield(generator_object, do_expr, nopos, | 5458 return factory()->NewYield(generator_object, do_expr, nopos, |
| 5467 Yield::kOnExceptionRethrow); | 5459 Yield::kOnExceptionRethrow); |
| 5468 } | 5460 } |
| 5469 | 5461 |
| 5470 ZoneList<Expression*>* ParserBaseTraits<Parser>::GetNonPatternList() const { | |
| 5471 return delegate()->function_state_->non_patterns_to_rewrite(); | |
| 5472 } | |
| 5473 | |
| 5474 ZoneList<typename ParserBaseTraits<Parser>::Type::ExpressionClassifier::Error>* | |
| 5475 ParserBaseTraits<Parser>::GetReportedErrorList() const { | |
| 5476 return delegate()->function_state_->GetReportedErrorList(); | |
| 5477 } | |
| 5478 | |
| 5479 Zone* ParserBaseTraits<Parser>::zone() const { return delegate()->zone(); } | |
| 5480 | |
| 5481 class NonPatternRewriter : public AstExpressionRewriter { | 5462 class NonPatternRewriter : public AstExpressionRewriter { |
| 5482 public: | 5463 public: |
| 5483 NonPatternRewriter(uintptr_t stack_limit, Parser* parser) | 5464 NonPatternRewriter(uintptr_t stack_limit, Parser* parser) |
| 5484 : AstExpressionRewriter(stack_limit), parser_(parser) {} | 5465 : AstExpressionRewriter(stack_limit), parser_(parser) {} |
| 5485 ~NonPatternRewriter() override {} | 5466 ~NonPatternRewriter() override {} |
| 5486 | 5467 |
| 5487 private: | 5468 private: |
| 5488 bool RewriteExpression(Expression* expr) override { | 5469 bool RewriteExpression(Expression* expr) override { |
| 5489 if (expr->IsRewritableExpression()) return true; | 5470 if (expr->IsRewritableExpression()) return true; |
| 5490 // Rewrite only what could have been a pattern but is not. | 5471 // Rewrite only what could have been a pattern but is not. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5558 } | 5539 } |
| 5559 | 5540 |
| 5560 Expression* Parser::RewriteAssignExponentiation(Expression* left, | 5541 Expression* Parser::RewriteAssignExponentiation(Expression* left, |
| 5561 Expression* right, int pos) { | 5542 Expression* right, int pos) { |
| 5562 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 5543 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
| 5563 if (left->IsVariableProxy()) { | 5544 if (left->IsVariableProxy()) { |
| 5564 VariableProxy* lhs = left->AsVariableProxy(); | 5545 VariableProxy* lhs = left->AsVariableProxy(); |
| 5565 | 5546 |
| 5566 Expression* result; | 5547 Expression* result; |
| 5567 DCHECK_NOT_NULL(lhs->raw_name()); | 5548 DCHECK_NOT_NULL(lhs->raw_name()); |
| 5568 result = this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), | 5549 result = ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), |
| 5569 lhs->end_position()); | 5550 lhs->end_position()); |
| 5570 args->Add(left, zone()); | 5551 args->Add(left, zone()); |
| 5571 args->Add(right, zone()); | 5552 args->Add(right, zone()); |
| 5572 Expression* call = | 5553 Expression* call = |
| 5573 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); | 5554 factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos); |
| 5574 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); | 5555 return factory()->NewAssignment(Token::ASSIGN, result, call, pos); |
| 5575 } else if (left->IsProperty()) { | 5556 } else if (left->IsProperty()) { |
| 5576 Property* prop = left->AsProperty(); | 5557 Property* prop = left->AsProperty(); |
| 5577 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); | 5558 auto temp_obj = NewTemporary(ast_value_factory()->empty_string()); |
| 5578 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); | 5559 auto temp_key = NewTemporary(ast_value_factory()->empty_string()); |
| 5579 Expression* assign_obj = factory()->NewAssignment( | 5560 Expression* assign_obj = factory()->NewAssignment( |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5671 } | 5652 } |
| 5672 // Now, rewind the original array literal to truncate everything from the | 5653 // Now, rewind the original array literal to truncate everything from the |
| 5673 // first spread (included) until the end. This fixes $R's initialization. | 5654 // first spread (included) until the end. This fixes $R's initialization. |
| 5674 lit->RewindSpreads(); | 5655 lit->RewindSpreads(); |
| 5675 return factory()->NewDoExpression(do_block, result, lit->position()); | 5656 return factory()->NewDoExpression(do_block, result, lit->position()); |
| 5676 } | 5657 } |
| 5677 | 5658 |
| 5678 void Parser::QueueDestructuringAssignmentForRewriting(Expression* expr) { | 5659 void Parser::QueueDestructuringAssignmentForRewriting(Expression* expr) { |
| 5679 DCHECK(expr->IsRewritableExpression()); | 5660 DCHECK(expr->IsRewritableExpression()); |
| 5680 function_state_->AddDestructuringAssignment( | 5661 function_state_->AddDestructuringAssignment( |
| 5681 DestructuringAssignment(expr, delegate()->scope())); | 5662 DestructuringAssignment(expr, scope())); |
| 5682 } | 5663 } |
| 5683 | 5664 |
| 5684 void Parser::QueueNonPatternForRewriting(Expression* expr, bool* ok) { | 5665 void Parser::QueueNonPatternForRewriting(Expression* expr, bool* ok) { |
| 5685 DCHECK(expr->IsRewritableExpression()); | 5666 DCHECK(expr->IsRewritableExpression()); |
| 5686 function_state_->AddNonPatternForRewriting(expr, ok); | 5667 function_state_->AddNonPatternForRewriting(expr, ok); |
| 5687 } | 5668 } |
| 5688 | 5669 |
| 5689 void ParserBaseTraits<Parser>::SetFunctionNameFromPropertyName( | 5670 void Parser::SetFunctionNameFromPropertyName(ObjectLiteralProperty* property, |
| 5690 ObjectLiteralProperty* property, const AstRawString* name) { | 5671 const AstRawString* name) { |
| 5691 Expression* value = property->value(); | 5672 Expression* value = property->value(); |
| 5692 | 5673 |
| 5693 // Computed name setting must happen at runtime. | 5674 // Computed name setting must happen at runtime. |
| 5694 if (property->is_computed_name()) return; | 5675 if (property->is_computed_name()) return; |
| 5695 | 5676 |
| 5696 // Getter and setter names are handled here because their names | 5677 // Getter and setter names are handled here because their names |
| 5697 // change in ES2015, even though they are not anonymous. | 5678 // change in ES2015, even though they are not anonymous. |
| 5698 auto function = value->AsFunctionLiteral(); | 5679 auto function = value->AsFunctionLiteral(); |
| 5699 if (function != nullptr) { | 5680 if (function != nullptr) { |
| 5700 bool is_getter = property->kind() == ObjectLiteralProperty::GETTER; | 5681 bool is_getter = property->kind() == ObjectLiteralProperty::GETTER; |
| 5701 bool is_setter = property->kind() == ObjectLiteralProperty::SETTER; | 5682 bool is_setter = property->kind() == ObjectLiteralProperty::SETTER; |
| 5702 if (is_getter || is_setter) { | 5683 if (is_getter || is_setter) { |
| 5703 DCHECK_NOT_NULL(name); | 5684 DCHECK_NOT_NULL(name); |
| 5704 const AstRawString* prefix = | 5685 const AstRawString* prefix = |
| 5705 is_getter ? delegate()->ast_value_factory()->get_space_string() | 5686 is_getter ? ast_value_factory()->get_space_string() |
| 5706 : delegate()->ast_value_factory()->set_space_string(); | 5687 : ast_value_factory()->set_space_string(); |
| 5707 function->set_raw_name( | 5688 function->set_raw_name(ast_value_factory()->NewConsString(prefix, name)); |
| 5708 delegate()->ast_value_factory()->NewConsString(prefix, name)); | |
| 5709 return; | 5689 return; |
| 5710 } | 5690 } |
| 5711 } | 5691 } |
| 5712 | 5692 |
| 5713 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] | 5693 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] |
| 5714 // of an object literal. | 5694 // of an object literal. |
| 5715 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; | 5695 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; |
| 5716 | 5696 |
| 5717 DCHECK(!value->IsAnonymousFunctionDefinition() || | 5697 DCHECK(!value->IsAnonymousFunctionDefinition() || |
| 5718 property->kind() == ObjectLiteralProperty::COMPUTED); | 5698 property->kind() == ObjectLiteralProperty::COMPUTED); |
| 5719 delegate()->SetFunctionName(value, name); | 5699 SetFunctionName(value, name); |
| 5720 } | 5700 } |
| 5721 | 5701 |
| 5722 void ParserBaseTraits<Parser>::SetFunctionNameFromIdentifierRef( | 5702 void Parser::SetFunctionNameFromIdentifierRef(Expression* value, |
| 5723 Expression* value, Expression* identifier) { | 5703 Expression* identifier) { |
| 5724 if (!identifier->IsVariableProxy()) return; | 5704 if (!identifier->IsVariableProxy()) return; |
| 5725 delegate()->SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); | 5705 SetFunctionName(value, identifier->AsVariableProxy()->raw_name()); |
| 5726 } | 5706 } |
| 5727 | 5707 |
| 5728 void Parser::SetFunctionName(Expression* value, const AstRawString* name) { | 5708 void Parser::SetFunctionName(Expression* value, const AstRawString* name) { |
| 5729 DCHECK_NOT_NULL(name); | 5709 DCHECK_NOT_NULL(name); |
| 5730 if (!value->IsAnonymousFunctionDefinition()) return; | 5710 if (!value->IsAnonymousFunctionDefinition()) return; |
| 5731 auto function = value->AsFunctionLiteral(); | 5711 auto function = value->AsFunctionLiteral(); |
| 5732 if (function != nullptr) { | 5712 if (function != nullptr) { |
| 5733 function->set_raw_name(name); | 5713 function->set_raw_name(name); |
| 5734 } else { | 5714 } else { |
| 5735 DCHECK(value->IsDoExpression()); | 5715 DCHECK(value->IsDoExpression()); |
| (...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6668 node->Print(Isolate::Current()); | 6648 node->Print(Isolate::Current()); |
| 6669 } | 6649 } |
| 6670 #endif // DEBUG | 6650 #endif // DEBUG |
| 6671 | 6651 |
| 6672 #undef CHECK_OK | 6652 #undef CHECK_OK |
| 6673 #undef CHECK_OK_VOID | 6653 #undef CHECK_OK_VOID |
| 6674 #undef CHECK_FAILED | 6654 #undef CHECK_FAILED |
| 6675 | 6655 |
| 6676 } // namespace internal | 6656 } // namespace internal |
| 6677 } // namespace v8 | 6657 } // namespace v8 |
| OLD | NEW |