| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/ast/ast.h" | 5 #include "src/ast/ast.h" |
| 6 #include "src/messages.h" | 6 #include "src/messages.h" |
| 7 #include "src/parsing/parameter-initializer-rewriter.h" | 7 #include "src/parsing/parameter-initializer-rewriter.h" |
| 8 #include "src/parsing/parser.h" | 8 #include "src/parsing/parser.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 if (value->IsSpread()) { | 436 if (value->IsSpread()) { |
| 437 spread = value->AsSpread(); | 437 spread = value->AsSpread(); |
| 438 break; | 438 break; |
| 439 } | 439 } |
| 440 | 440 |
| 441 PatternContext context = SetInitializerContextIfNeeded(value); | 441 PatternContext context = SetInitializerContextIfNeeded(value); |
| 442 | 442 |
| 443 // if (!done) { | 443 // if (!done) { |
| 444 // done = true; // If .next, .done or .value throws, don't close. | 444 // done = true; // If .next, .done or .value throws, don't close. |
| 445 // result = IteratorNext(iterator); | 445 // result = IteratorNext(iterator); |
| 446 // v = (done = result.done) ? undefined : result.value; | 446 // if (result.done) { |
| 447 // v = undefined; |
| 448 // } else { |
| 449 // v = result.value; |
| 450 // done = false; |
| 451 // } |
| 447 // } | 452 // } |
| 448 Statement* if_statement; | 453 Statement* if_not_done; |
| 449 { | 454 { |
| 455 auto result_done = factory()->NewProperty( |
| 456 factory()->NewVariableProxy(result), |
| 457 factory()->NewStringLiteral(ast_value_factory()->done_string(), |
| 458 RelocInfo::kNoPosition), |
| 459 RelocInfo::kNoPosition); |
| 460 |
| 461 auto assign_undefined = factory()->NewAssignment( |
| 462 Token::ASSIGN, factory()->NewVariableProxy(v), |
| 463 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), |
| 464 RelocInfo::kNoPosition); |
| 465 |
| 466 auto assign_value = factory()->NewAssignment( |
| 467 Token::ASSIGN, factory()->NewVariableProxy(v), |
| 468 factory()->NewProperty( |
| 469 factory()->NewVariableProxy(result), |
| 470 factory()->NewStringLiteral(ast_value_factory()->value_string(), |
| 471 RelocInfo::kNoPosition), |
| 472 RelocInfo::kNoPosition), |
| 473 RelocInfo::kNoPosition); |
| 474 |
| 475 auto unset_done = factory()->NewAssignment( |
| 476 Token::ASSIGN, factory()->NewVariableProxy(done), |
| 477 factory()->NewBooleanLiteral(false, RelocInfo::kNoPosition), |
| 478 RelocInfo::kNoPosition); |
| 479 |
| 480 auto inner_else = |
| 481 factory()->NewBlock(nullptr, 2, true, RelocInfo::kNoPosition); |
| 482 inner_else->statements()->Add( |
| 483 factory()->NewExpressionStatement(assign_value, nopos), zone()); |
| 484 inner_else->statements()->Add( |
| 485 factory()->NewExpressionStatement(unset_done, nopos), zone()); |
| 486 |
| 487 auto inner_if = factory()->NewIfStatement( |
| 488 result_done, |
| 489 factory()->NewExpressionStatement(assign_undefined, nopos), |
| 490 inner_else, nopos); |
| 491 |
| 450 auto next_block = | 492 auto next_block = |
| 451 factory()->NewBlock(nullptr, 3, true, RelocInfo::kNoPosition); | 493 factory()->NewBlock(nullptr, 3, true, RelocInfo::kNoPosition); |
| 452 | |
| 453 next_block->statements()->Add( | 494 next_block->statements()->Add( |
| 454 factory()->NewExpressionStatement( | 495 factory()->NewExpressionStatement( |
| 455 factory()->NewAssignment( | 496 factory()->NewAssignment( |
| 456 Token::ASSIGN, factory()->NewVariableProxy(done), | 497 Token::ASSIGN, factory()->NewVariableProxy(done), |
| 457 factory()->NewBooleanLiteral(true, nopos), nopos), | 498 factory()->NewBooleanLiteral(true, nopos), nopos), |
| 458 nopos), | 499 nopos), |
| 459 zone()); | 500 zone()); |
| 460 | |
| 461 next_block->statements()->Add( | 501 next_block->statements()->Add( |
| 462 factory()->NewExpressionStatement( | 502 factory()->NewExpressionStatement( |
| 463 parser_->BuildIteratorNextResult( | 503 parser_->BuildIteratorNextResult( |
| 464 factory()->NewVariableProxy(iterator), result, | 504 factory()->NewVariableProxy(iterator), result, |
| 465 RelocInfo::kNoPosition), | 505 RelocInfo::kNoPosition), |
| 466 RelocInfo::kNoPosition), | 506 RelocInfo::kNoPosition), |
| 467 zone()); | 507 zone()); |
| 508 next_block->statements()->Add(inner_if, zone()); |
| 468 | 509 |
| 469 auto assign_to_done = factory()->NewAssignment( | 510 if_not_done = factory()->NewIfStatement( |
| 470 Token::ASSIGN, factory()->NewVariableProxy(done), | |
| 471 factory()->NewProperty( | |
| 472 factory()->NewVariableProxy(result), | |
| 473 factory()->NewStringLiteral(ast_value_factory()->done_string(), | |
| 474 RelocInfo::kNoPosition), | |
| 475 RelocInfo::kNoPosition), | |
| 476 RelocInfo::kNoPosition); | |
| 477 auto next_value = factory()->NewConditional( | |
| 478 assign_to_done, | |
| 479 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), | |
| 480 factory()->NewProperty( | |
| 481 factory()->NewVariableProxy(result), | |
| 482 factory()->NewStringLiteral(ast_value_factory()->value_string(), | |
| 483 RelocInfo::kNoPosition), | |
| 484 RelocInfo::kNoPosition), | |
| 485 RelocInfo::kNoPosition); | |
| 486 next_block->statements()->Add( | |
| 487 factory()->NewExpressionStatement( | |
| 488 factory()->NewAssignment(Token::ASSIGN, | |
| 489 factory()->NewVariableProxy(v), | |
| 490 next_value, RelocInfo::kNoPosition), | |
| 491 RelocInfo::kNoPosition), | |
| 492 zone()); | |
| 493 | |
| 494 if_statement = factory()->NewIfStatement( | |
| 495 factory()->NewUnaryOperation(Token::NOT, | 511 factory()->NewUnaryOperation(Token::NOT, |
| 496 factory()->NewVariableProxy(done), | 512 factory()->NewVariableProxy(done), |
| 497 RelocInfo::kNoPosition), | 513 RelocInfo::kNoPosition), |
| 498 next_block, factory()->NewEmptyStatement(RelocInfo::kNoPosition), | 514 next_block, factory()->NewEmptyStatement(RelocInfo::kNoPosition), |
| 499 RelocInfo::kNoPosition); | 515 RelocInfo::kNoPosition); |
| 500 } | 516 } |
| 501 block_->statements()->Add(if_statement, zone()); | 517 block_->statements()->Add(if_not_done, zone()); |
| 502 | 518 |
| 503 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { | 519 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { |
| 504 if (FLAG_harmony_iterator_close) { | 520 if (FLAG_harmony_iterator_close) { |
| 505 // completion = kAbruptCompletion; | 521 // completion = kAbruptCompletion; |
| 506 Expression* proxy = factory()->NewVariableProxy(completion); | 522 Expression* proxy = factory()->NewVariableProxy(completion); |
| 507 Expression* assignment = factory()->NewAssignment( | 523 Expression* assignment = factory()->NewAssignment( |
| 508 Token::ASSIGN, proxy, | 524 Token::ASSIGN, proxy, |
| 509 factory()->NewSmiLiteral(kAbruptCompletion, nopos), nopos); | 525 factory()->NewSmiLiteral(kAbruptCompletion, nopos), nopos); |
| 510 block_->statements()->Add( | 526 block_->statements()->Add( |
| 511 factory()->NewExpressionStatement(assignment, nopos), zone()); | 527 factory()->NewExpressionStatement(assignment, nopos), zone()); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 NOT_A_PATTERN(TryFinallyStatement) | 699 NOT_A_PATTERN(TryFinallyStatement) |
| 684 NOT_A_PATTERN(UnaryOperation) | 700 NOT_A_PATTERN(UnaryOperation) |
| 685 NOT_A_PATTERN(VariableDeclaration) | 701 NOT_A_PATTERN(VariableDeclaration) |
| 686 NOT_A_PATTERN(WhileStatement) | 702 NOT_A_PATTERN(WhileStatement) |
| 687 NOT_A_PATTERN(WithStatement) | 703 NOT_A_PATTERN(WithStatement) |
| 688 NOT_A_PATTERN(Yield) | 704 NOT_A_PATTERN(Yield) |
| 689 | 705 |
| 690 #undef NOT_A_PATTERN | 706 #undef NOT_A_PATTERN |
| 691 } // namespace internal | 707 } // namespace internal |
| 692 } // namespace v8 | 708 } // namespace v8 |
| OLD | NEW |