Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: src/parsing/parser.cc

Issue 2359513002: Remove synthetic unresolved variables from async/await desugaring (Closed)
Patch Set: Fix bug number Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698