| 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 3344 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3355       if (param_scope != nullptr) { | 3355       if (param_scope != nullptr) { | 
| 3356         CheckConflictingVarDeclarations(param_scope, CHECK_OK); | 3356         CheckConflictingVarDeclarations(param_scope, CHECK_OK); | 
| 3357       } | 3357       } | 
| 3358       init_block->statements()->Add(param_block, zone()); | 3358       init_block->statements()->Add(param_block, zone()); | 
| 3359     } | 3359     } | 
| 3360   } | 3360   } | 
| 3361   return init_block; | 3361   return init_block; | 
| 3362 } | 3362 } | 
| 3363 | 3363 | 
| 3364 Block* Parser::BuildRejectPromiseOnException(Block* inner_block, bool* ok) { | 3364 Block* Parser::BuildRejectPromiseOnException(Block* inner_block, bool* ok) { | 
| 3365   // var .promise = %CreatePromise(); | 3365   // .promise = %CreatePromise(); | 
| 3366   // var .debug_is_active = %_DebugIsActive(); | 3366   // .debug_is_active = %_DebugIsActive(); | 
| 3367   // if (.debug_is_active) %DebugPushPromise(.promise); | 3367   // if (.debug_is_active) %DebugPushPromise(.promise); | 
| 3368   // try { | 3368   // try { | 
| 3369   //   <inner_block> | 3369   //   <inner_block> | 
| 3370   // } catch (.catch) { | 3370   // } catch (.catch) { | 
| 3371   //   %RejectPromise(.promise, .catch); | 3371   //   %RejectPromise(.promise, .catch); | 
| 3372   //   return .promise; | 3372   //   return .promise; | 
| 3373   // } finally { | 3373   // } finally { | 
| 3374   //   if (.debug_is_active) %DebugPopPromise(); | 3374   //   if (.debug_is_active) %DebugPopPromise(); | 
| 3375   // } | 3375   // } | 
| 3376   Block* result = factory()->NewBlock(nullptr, 4, true, kNoSourcePosition); | 3376   Block* result = factory()->NewBlock(nullptr, 4, true, kNoSourcePosition); | 
| 3377 | 3377 | 
| 3378   // var .promise = %CreatePromise(); | 3378   // .promise = %CreatePromise(); | 
| 3379   Statement* set_promise; | 3379   Statement* set_promise; | 
| 3380   { | 3380   { | 
| 3381     DeclareVariable(ast_value_factory()->dot_promise_string(), VAR, |  | 
| 3382                     kNoSourcePosition, CHECK_OK); |  | 
| 3383     Expression* create_promise = factory()->NewCallRuntime( | 3381     Expression* create_promise = factory()->NewCallRuntime( | 
| 3384         Context::PROMISE_CREATE_INDEX, | 3382         Context::PROMISE_CREATE_INDEX, | 
| 3385         new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition); | 3383         new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition); | 
| 3386     Assignment* assign_promise = factory()->NewAssignment( | 3384     Assignment* assign_promise = factory()->NewAssignment( | 
| 3387         Token::INIT, BuildDotPromise(), create_promise, kNoSourcePosition); | 3385         Token::INIT, factory()->NewVariableProxy(PromiseVariable()), | 
|  | 3386         create_promise, kNoSourcePosition); | 
| 3388     set_promise = | 3387     set_promise = | 
| 3389         factory()->NewExpressionStatement(assign_promise, kNoSourcePosition); | 3388         factory()->NewExpressionStatement(assign_promise, kNoSourcePosition); | 
| 3390   } | 3389   } | 
| 3391   result->statements()->Add(set_promise, zone()); | 3390   result->statements()->Add(set_promise, zone()); | 
| 3392 | 3391 | 
| 3393   // var .debug_is_active = %_DebugIsActive(); | 3392   Variable* debug_is_active = | 
|  | 3393       scope()->NewTemporary(ast_value_factory()->empty_string()); | 
|  | 3394   // .debug_is_active = %_DebugIsActive(); | 
| 3394   Statement* set_debug_is_active; | 3395   Statement* set_debug_is_active; | 
| 3395   { | 3396   { | 
| 3396     DeclareVariable(ast_value_factory()->dot_debug_is_active_string(), VAR, | 3397     Expression* call_debug_is_active = factory()->NewCallRuntime( | 
| 3397                     kNoSourcePosition, CHECK_OK); |  | 
| 3398     Expression* debug_is_active = factory()->NewCallRuntime( |  | 
| 3399         Runtime::kInlineDebugIsActive, | 3398         Runtime::kInlineDebugIsActive, | 
| 3400         new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition); | 3399         new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition); | 
| 3401     Assignment* assign_debug_is_active = | 3400     Assignment* assign_debug_is_active = factory()->NewAssignment( | 
| 3402         factory()->NewAssignment(Token::INIT, BuildDotDebugIsActive(), | 3401         Token::INIT, factory()->NewVariableProxy(debug_is_active), | 
| 3403                                  debug_is_active, kNoSourcePosition); | 3402         call_debug_is_active, kNoSourcePosition); | 
| 3404     set_debug_is_active = factory()->NewExpressionStatement( | 3403     set_debug_is_active = factory()->NewExpressionStatement( | 
| 3405         assign_debug_is_active, kNoSourcePosition); | 3404         assign_debug_is_active, kNoSourcePosition); | 
| 3406   } | 3405   } | 
| 3407   result->statements()->Add(set_debug_is_active, zone()); | 3406   result->statements()->Add(set_debug_is_active, zone()); | 
| 3408 | 3407 | 
| 3409   //   if (.debug_is_active) %DebugPushPromise(.promise); | 3408   //   if (.debug_is_active) %DebugPushPromise(.promise); | 
| 3410   Statement* conditionally_debug_push_promise; | 3409   Statement* conditionally_debug_push_promise; | 
| 3411   { | 3410   { | 
| 3412     ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); | 3411     ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); | 
| 3413     args->Add(BuildDotPromise(), zone()); | 3412     args->Add(factory()->NewVariableProxy(PromiseVariable()), zone()); | 
| 3414     Expression* call_push_promise = factory()->NewCallRuntime( | 3413     Expression* call_push_promise = factory()->NewCallRuntime( | 
| 3415         Runtime::kDebugPushPromise, args, kNoSourcePosition); | 3414         Runtime::kDebugPushPromise, args, kNoSourcePosition); | 
| 3416     Statement* debug_push_promise = | 3415     Statement* debug_push_promise = | 
| 3417         factory()->NewExpressionStatement(call_push_promise, kNoSourcePosition); | 3416         factory()->NewExpressionStatement(call_push_promise, kNoSourcePosition); | 
| 3418     conditionally_debug_push_promise = factory()->NewIfStatement( | 3417     conditionally_debug_push_promise = factory()->NewIfStatement( | 
| 3419         BuildDotDebugIsActive(), debug_push_promise, | 3418         factory()->NewVariableProxy(debug_is_active), debug_push_promise, | 
| 3420         factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); | 3419         factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); | 
| 3421   } | 3420   } | 
| 3422   result->statements()->Add(conditionally_debug_push_promise, zone()); | 3421   result->statements()->Add(conditionally_debug_push_promise, zone()); | 
| 3423 | 3422 | 
| 3424   // catch (.catch) { return %RejectPromise(.promise, .catch), .promise } | 3423   // catch (.catch) { return %RejectPromise(.promise, .catch), .promise } | 
| 3425   Scope* catch_scope = NewScope(CATCH_SCOPE); | 3424   Scope* catch_scope = NewScope(CATCH_SCOPE); | 
| 3426   catch_scope->set_is_hidden(); | 3425   catch_scope->set_is_hidden(); | 
| 3427   Variable* catch_variable = | 3426   Variable* catch_variable = | 
| 3428       catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, | 3427       catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR, | 
| 3429                                 kCreatedInitialized, NORMAL_VARIABLE); | 3428                                 kCreatedInitialized, NORMAL_VARIABLE); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 3448   // finally { if (.debug_is_active) %DebugPopPromise(); } | 3447   // finally { if (.debug_is_active) %DebugPopPromise(); } | 
| 3449   Block* finally_block = | 3448   Block* finally_block = | 
| 3450       factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); | 3449       factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); | 
| 3451   { | 3450   { | 
| 3452     ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(0, zone()); | 3451     ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(0, zone()); | 
| 3453     Expression* call_pop_promise = factory()->NewCallRuntime( | 3452     Expression* call_pop_promise = factory()->NewCallRuntime( | 
| 3454         Runtime::kDebugPopPromise, args, kNoSourcePosition); | 3453         Runtime::kDebugPopPromise, args, kNoSourcePosition); | 
| 3455     Statement* debug_pop_promise = | 3454     Statement* debug_pop_promise = | 
| 3456         factory()->NewExpressionStatement(call_pop_promise, kNoSourcePosition); | 3455         factory()->NewExpressionStatement(call_pop_promise, kNoSourcePosition); | 
| 3457     Statement* conditionally_debug_pop_promise = factory()->NewIfStatement( | 3456     Statement* conditionally_debug_pop_promise = factory()->NewIfStatement( | 
| 3458         BuildDotDebugIsActive(), debug_pop_promise, | 3457         factory()->NewVariableProxy(debug_is_active), debug_pop_promise, | 
| 3459         factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); | 3458         factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition); | 
| 3460     finally_block->statements()->Add(conditionally_debug_pop_promise, zone()); | 3459     finally_block->statements()->Add(conditionally_debug_pop_promise, zone()); | 
| 3461   } | 3460   } | 
| 3462 | 3461 | 
| 3463   Statement* try_finally_statement = factory()->NewTryFinallyStatement( | 3462   Statement* try_finally_statement = factory()->NewTryFinallyStatement( | 
| 3464       outer_try_block, finally_block, kNoSourcePosition); | 3463       outer_try_block, finally_block, kNoSourcePosition); | 
| 3465 | 3464 | 
| 3466   result->statements()->Add(try_finally_statement, zone()); | 3465   result->statements()->Add(try_finally_statement, zone()); | 
| 3467   return result; | 3466   return result; | 
| 3468 } | 3467 } | 
| 3469 | 3468 | 
| 3470 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { | 3469 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { | 
| 3471   DCHECK_NOT_NULL(function_state_->generator_object_variable()); | 3470   DCHECK_NOT_NULL(function_state_->generator_object_variable()); | 
| 3472   ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 3471   ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 
| 3473   args->Add(factory()->NewThisFunction(pos), zone()); | 3472   args->Add(factory()->NewThisFunction(pos), zone()); | 
| 3474   args->Add(IsArrowFunction(kind) ? GetLiteralUndefined(pos) | 3473   args->Add(IsArrowFunction(kind) ? GetLiteralUndefined(pos) | 
| 3475                                   : ThisExpression(kNoSourcePosition), | 3474                                   : ThisExpression(kNoSourcePosition), | 
| 3476             zone()); | 3475             zone()); | 
| 3477   return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, | 3476   return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, | 
| 3478                                    pos); | 3477                                    pos); | 
| 3479 } | 3478 } | 
| 3480 | 3479 | 
| 3481 Expression* Parser::BuildResolvePromise(Expression* value, int pos) { | 3480 Expression* Parser::BuildResolvePromise(Expression* value, int pos) { | 
| 3482   // %ResolvePromise(.promise, value), .promise | 3481   // %ResolvePromise(.promise, value), .promise | 
| 3483   ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 3482   ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 
| 3484   args->Add(BuildDotPromise(), zone()); | 3483   args->Add(factory()->NewVariableProxy(PromiseVariable()), zone()); | 
| 3485   args->Add(value, zone()); | 3484   args->Add(value, zone()); | 
| 3486   Expression* call_runtime = | 3485   Expression* call_runtime = | 
| 3487       factory()->NewCallRuntime(Context::PROMISE_RESOLVE_INDEX, args, pos); | 3486       factory()->NewCallRuntime(Context::PROMISE_RESOLVE_INDEX, args, pos); | 
| 3488   return factory()->NewBinaryOperation(Token::COMMA, call_runtime, | 3487   return factory()->NewBinaryOperation( | 
| 3489                                        BuildDotPromise(), pos); | 3488       Token::COMMA, call_runtime, | 
|  | 3489       factory()->NewVariableProxy(PromiseVariable()), pos); | 
| 3490 } | 3490 } | 
| 3491 | 3491 | 
| 3492 Expression* Parser::BuildRejectPromise(Expression* value, int pos) { | 3492 Expression* Parser::BuildRejectPromise(Expression* value, int pos) { | 
| 3493   // %RejectPromiseNoDebugEvent(.promise, value, true), .promise | 3493   // %RejectPromiseNoDebugEvent(.promise, value, true), .promise | 
| 3494   // The NoDebugEvent variant disables the additional debug event for the | 3494   // The NoDebugEvent variant disables the additional debug event for the | 
| 3495   // rejection since a debug event already happened for the exception that got | 3495   // rejection since a debug event already happened for the exception that got | 
| 3496   // us here. | 3496   // us here. | 
| 3497   ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 3497   ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 
| 3498   args->Add(BuildDotPromise(), zone()); | 3498   args->Add(factory()->NewVariableProxy(PromiseVariable()), zone()); | 
| 3499   args->Add(value, zone()); | 3499   args->Add(value, zone()); | 
| 3500   Expression* call_runtime = factory()->NewCallRuntime( | 3500   Expression* call_runtime = factory()->NewCallRuntime( | 
| 3501       Context::REJECT_PROMISE_NO_DEBUG_EVENT_INDEX, args, pos); | 3501       Context::REJECT_PROMISE_NO_DEBUG_EVENT_INDEX, args, pos); | 
| 3502   return factory()->NewBinaryOperation(Token::COMMA, call_runtime, | 3502   return factory()->NewBinaryOperation( | 
| 3503                                        BuildDotPromise(), pos); | 3503       Token::COMMA, call_runtime, | 
|  | 3504       factory()->NewVariableProxy(PromiseVariable()), pos); | 
| 3504 } | 3505 } | 
| 3505 | 3506 | 
| 3506 VariableProxy* Parser::BuildDotPromise() { | 3507 Variable* Parser::PromiseVariable() { | 
| 3507   return NewUnresolved(ast_value_factory()->dot_promise_string(), VAR); | 3508   // Based on the various compilation paths, there are many different code | 
| 3508 } | 3509   // paths which may be the first to access the Promise temporary. Whichever | 
| 3509 | 3510   // comes first should create it and stash it in the FunctionState. | 
| 3510 VariableProxy* Parser::BuildDotDebugIsActive() { | 3511   Variable* promise = function_state_->promise_variable(); | 
| 3511   return NewUnresolved(ast_value_factory()->dot_debug_is_active_string(), VAR); | 3512   if (function_state_->promise_variable() == nullptr) { | 
|  | 3513     promise = scope()->NewTemporary(ast_value_factory()->empty_string()); | 
|  | 3514     function_state_->set_promise_variable(promise); | 
|  | 3515   } | 
|  | 3516   return promise; | 
| 3512 } | 3517 } | 
| 3513 | 3518 | 
| 3514 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 3519 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 
| 3515     const AstRawString* function_name, int pos, | 3520     const AstRawString* function_name, int pos, | 
| 3516     const ParserFormalParameters& parameters, FunctionKind kind, | 3521     const ParserFormalParameters& parameters, FunctionKind kind, | 
| 3517     FunctionLiteral::FunctionType function_type, bool* ok) { | 3522     FunctionLiteral::FunctionType function_type, bool* ok) { | 
| 3518   // Everything inside an eagerly parsed function will be parsed eagerly | 3523   // Everything inside an eagerly parsed function will be parsed eagerly | 
| 3519   // (see comment above). | 3524   // (see comment above). | 
| 3520   ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 3525   ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 
| 3521   ZoneList<Statement*>* result = new(zone()) ZoneList<Statement*>(8, zone()); | 3526   ZoneList<Statement*>* result = new(zone()) ZoneList<Statement*>(8, zone()); | 
| (...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4555   Expression* expr = args->at(0); | 4560   Expression* expr = args->at(0); | 
| 4556   for (int i = 1; i < args->length(); ++i) { | 4561   for (int i = 1; i < args->length(); ++i) { | 
| 4557     expr = factory()->NewBinaryOperation(Token::COMMA, expr, args->at(i), | 4562     expr = factory()->NewBinaryOperation(Token::COMMA, expr, args->at(i), | 
| 4558                                          expr->position()); | 4563                                          expr->position()); | 
| 4559   } | 4564   } | 
| 4560   return expr; | 4565   return expr; | 
| 4561 } | 4566 } | 
| 4562 | 4567 | 
| 4563 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { | 4568 Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) { | 
| 4564   // yield do { | 4569   // yield do { | 
| 4565   //   promise_tmp = .promise; |  | 
| 4566   //   tmp = <operand>; | 4570   //   tmp = <operand>; | 
| 4567   //   %AsyncFunctionAwait(.generator_object, tmp, promise_tmp); | 4571   //   %AsyncFunctionAwait(.generator_object, tmp, .promise); | 
| 4568   //   promise_tmp | 4572   //   .promise | 
| 4569   // } | 4573   // } | 
| 4570   // The value of the expression is returned to the caller of the async | 4574   // The value of the expression is returned to the caller of the async | 
| 4571   // function for the first yield statement; for this, .promise is the | 4575   // function for the first yield statement; for this, .promise is the | 
| 4572   // appropriate return value, being a Promise that will be fulfilled or | 4576   // appropriate return value, being a Promise that will be fulfilled or | 
| 4573   // rejected with the appropriate value by the desugaring. Subsequent yield | 4577   // rejected with the appropriate value by the desugaring. Subsequent yield | 
| 4574   // occurrences will return to the AsyncFunctionNext call within the | 4578   // occurrences will return to the AsyncFunctionNext call within the | 
| 4575   // implemementation of the intermediate throwaway Promise's then handler. | 4579   // implemementation of the intermediate throwaway Promise's then handler. | 
| 4576   // This handler has nothing useful to do with the value, as the Promise is | 4580   // This handler has nothing useful to do with the value, as the Promise is | 
| 4577   // ignored. If we yielded the value of the throwawayPromise that | 4581   // ignored. If we yielded the value of the throwawayPromise that | 
| 4578   // AsyncFunctionAwait creates as an intermediate, it would create a memory | 4582   // AsyncFunctionAwait creates as an intermediate, it would create a memory | 
| 4579   // leak; we must return .promise instead; | 4583   // leak; we must return .promise instead; | 
| 4580   // The operand needs to be evaluated on a separate statement in order to get | 4584   // The operand needs to be evaluated on a separate statement in order to get | 
| 4581   // a break location, and the .promise needs to be read earlier so that it | 4585   // a break location, and the .promise needs to be read earlier so that it | 
| 4582   // doesn't insert a false location. | 4586   // doesn't insert a false location. | 
| 4583   // TODO(littledan): investigate why this ordering is needed in more detail. | 4587   // TODO(littledan): investigate why this ordering is needed in more detail. | 
| 4584   Variable* generator_object_variable = | 4588   Variable* generator_object_variable = | 
| 4585       function_state_->generator_object_variable(); | 4589       function_state_->generator_object_variable(); | 
| 4586 | 4590 | 
| 4587   // If generator_object_variable is null, | 4591   // If generator_object_variable is null, | 
| 4588   // TODO(littledan): Is this necessary? | 4592   // TODO(littledan): Is this necessary? | 
| 4589   if (!generator_object_variable) return value; | 4593   if (!generator_object_variable) return value; | 
| 4590 | 4594 | 
| 4591   const int nopos = kNoSourcePosition; | 4595   const int nopos = kNoSourcePosition; | 
| 4592 | 4596 | 
| 4593   Block* do_block = factory()->NewBlock(nullptr, 3, false, nopos); | 4597   Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos); | 
| 4594 | 4598 | 
| 4595   Variable* promise_temp_var = | 4599   Variable* promise = PromiseVariable(); | 
| 4596       NewTemporary(ast_value_factory()->empty_string()); |  | 
| 4597   Expression* promise_assignment = factory()->NewAssignment( |  | 
| 4598       Token::ASSIGN, factory()->NewVariableProxy(promise_temp_var), |  | 
| 4599       BuildDotPromise(), nopos); |  | 
| 4600   do_block->statements()->Add( |  | 
| 4601       factory()->NewExpressionStatement(promise_assignment, nopos), zone()); |  | 
| 4602 | 4600 | 
| 4603   // Wrap value evaluation to provide a break location. | 4601   // Wrap value evaluation to provide a break location. | 
| 4604   Variable* temp_var = NewTemporary(ast_value_factory()->empty_string()); | 4602   Variable* temp_var = NewTemporary(ast_value_factory()->empty_string()); | 
| 4605   Expression* value_assignment = factory()->NewAssignment( | 4603   Expression* value_assignment = factory()->NewAssignment( | 
| 4606       Token::ASSIGN, factory()->NewVariableProxy(temp_var), value, nopos); | 4604       Token::ASSIGN, factory()->NewVariableProxy(temp_var), value, nopos); | 
| 4607   do_block->statements()->Add( | 4605   do_block->statements()->Add( | 
| 4608       factory()->NewExpressionStatement(value_assignment, value->position()), | 4606       factory()->NewExpressionStatement(value_assignment, value->position()), | 
| 4609       zone()); | 4607       zone()); | 
| 4610 | 4608 | 
| 4611   ZoneList<Expression*>* async_function_await_args = | 4609   ZoneList<Expression*>* async_function_await_args = | 
| 4612       new (zone()) ZoneList<Expression*>(3, zone()); | 4610       new (zone()) ZoneList<Expression*>(3, zone()); | 
| 4613   Expression* generator_object = | 4611   Expression* generator_object = | 
| 4614       factory()->NewVariableProxy(generator_object_variable); | 4612       factory()->NewVariableProxy(generator_object_variable); | 
| 4615   async_function_await_args->Add(generator_object, zone()); | 4613   async_function_await_args->Add(generator_object, zone()); | 
| 4616   async_function_await_args->Add(factory()->NewVariableProxy(temp_var), zone()); | 4614   async_function_await_args->Add(factory()->NewVariableProxy(temp_var), zone()); | 
| 4617   async_function_await_args->Add(factory()->NewVariableProxy(promise_temp_var), | 4615   async_function_await_args->Add(factory()->NewVariableProxy(promise), zone()); | 
| 4618                                  zone()); |  | 
| 4619 | 4616 | 
| 4620   // The parser emits calls to AsyncFunctionAwaitCaught, but the | 4617   // The parser emits calls to AsyncFunctionAwaitCaught, but the | 
| 4621   // AstNumberingVisitor will rewrite this to AsyncFunctionAwaitUncaught | 4618   // AstNumberingVisitor will rewrite this to AsyncFunctionAwaitUncaught | 
| 4622   // if there is no local enclosing try/catch block. | 4619   // if there is no local enclosing try/catch block. | 
| 4623   Expression* async_function_await = | 4620   Expression* async_function_await = | 
| 4624       factory()->NewCallRuntime(Context::ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX, | 4621       factory()->NewCallRuntime(Context::ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX, | 
| 4625                                 async_function_await_args, nopos); | 4622                                 async_function_await_args, nopos); | 
| 4626   do_block->statements()->Add( | 4623   do_block->statements()->Add( | 
| 4627       factory()->NewExpressionStatement(async_function_await, await_pos), | 4624       factory()->NewExpressionStatement(async_function_await, await_pos), | 
| 4628       zone()); | 4625       zone()); | 
| 4629 | 4626 | 
| 4630   // Wrap await to provide a break location between value evaluation and yield. | 4627   // Wrap await to provide a break location between value evaluation and yield. | 
| 4631   Expression* do_expr = | 4628   Expression* do_expr = factory()->NewDoExpression(do_block, promise, nopos); | 
| 4632       factory()->NewDoExpression(do_block, promise_temp_var, nopos); |  | 
| 4633 | 4629 | 
| 4634   generator_object = factory()->NewVariableProxy(generator_object_variable); | 4630   generator_object = factory()->NewVariableProxy(generator_object_variable); | 
| 4635   return factory()->NewYield(generator_object, do_expr, nopos, | 4631   return factory()->NewYield(generator_object, do_expr, nopos, | 
| 4636                              Yield::kOnExceptionRethrow); | 4632                              Yield::kOnExceptionRethrow); | 
| 4637 } | 4633 } | 
| 4638 | 4634 | 
| 4639 class NonPatternRewriter : public AstExpressionRewriter { | 4635 class NonPatternRewriter : public AstExpressionRewriter { | 
| 4640  public: | 4636  public: | 
| 4641   NonPatternRewriter(uintptr_t stack_limit, Parser* parser) | 4637   NonPatternRewriter(uintptr_t stack_limit, Parser* parser) | 
| 4642       : AstExpressionRewriter(stack_limit), parser_(parser) {} | 4638       : AstExpressionRewriter(stack_limit), parser_(parser) {} | 
| (...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5829 | 5825 | 
| 5830   return final_loop; | 5826   return final_loop; | 
| 5831 } | 5827 } | 
| 5832 | 5828 | 
| 5833 #undef CHECK_OK | 5829 #undef CHECK_OK | 
| 5834 #undef CHECK_OK_VOID | 5830 #undef CHECK_OK_VOID | 
| 5835 #undef CHECK_FAILED | 5831 #undef CHECK_FAILED | 
| 5836 | 5832 | 
| 5837 }  // namespace internal | 5833 }  // namespace internal | 
| 5838 }  // namespace v8 | 5834 }  // namespace v8 | 
| OLD | NEW | 
|---|