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 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 } | 540 } |
541 } | 541 } |
542 set_context(context); | 542 set_context(context); |
543 } | 543 } |
544 | 544 |
545 if (spread != nullptr) { | 545 if (spread != nullptr) { |
546 // A spread can only occur as the last component. It is not handled by | 546 // A spread can only occur as the last component. It is not handled by |
547 // RecurseIntoSubpattern above. | 547 // RecurseIntoSubpattern above. |
548 | 548 |
549 // let array = []; | 549 // let array = []; |
550 // if (!done) %concat_iterable_to_array(array, iterator); | 550 // while (!done) { |
| 551 // result = IteratorNext(iterator); |
| 552 // if (result.done) { |
| 553 // done = true; |
| 554 // } else { |
| 555 // %AppendElement(array, result.value); |
| 556 // } |
| 557 // } |
| 558 |
| 559 // let array = []; |
| 560 Variable* array; |
| 561 { |
| 562 auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone()); |
| 563 array = CreateTempVar(factory()->NewArrayLiteral( |
| 564 empty_exprs, |
| 565 // Reuse pattern's literal index - it is unused since there is no |
| 566 // actual literal allocated. |
| 567 node->literal_index(), RelocInfo::kNoPosition)); |
| 568 } |
| 569 |
| 570 // result = IteratorNext(iterator); |
| 571 Statement* get_next = factory()->NewExpressionStatement( |
| 572 parser_->BuildIteratorNextResult(factory()->NewVariableProxy(iterator), |
| 573 result, nopos), |
| 574 nopos); |
| 575 |
551 // done = true; | 576 // done = true; |
| 577 Statement* set_done = factory()->NewExpressionStatement( |
| 578 factory()->NewAssignment( |
| 579 Token::ASSIGN, factory()->NewVariableProxy(done), |
| 580 factory()->NewBooleanLiteral(true, nopos), nopos), |
| 581 nopos); |
552 | 582 |
553 auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone()); | 583 // %AppendElement(array, result.value); |
554 auto array = CreateTempVar(factory()->NewArrayLiteral( | 584 Statement* append_element; |
555 empty_exprs, | 585 { |
556 // Reuse pattern's literal index - it is unused since there is no | 586 auto args = new (zone()) ZoneList<Expression*>(2, zone()); |
557 // actual literal allocated. | 587 args->Add(factory()->NewVariableProxy(array), zone()); |
558 node->literal_index(), RelocInfo::kNoPosition)); | 588 args->Add(factory()->NewProperty( |
| 589 factory()->NewVariableProxy(result), |
| 590 factory()->NewStringLiteral( |
| 591 ast_value_factory()->value_string(), nopos), |
| 592 nopos), |
| 593 zone()); |
| 594 append_element = factory()->NewExpressionStatement( |
| 595 factory()->NewCallRuntime(Runtime::kAppendElement, args, nopos), |
| 596 nopos); |
| 597 } |
559 | 598 |
560 auto arguments = new (zone()) ZoneList<Expression*>(2, zone()); | 599 // if (result.done) { #set_done } else { #append_element } |
561 arguments->Add(factory()->NewVariableProxy(array), zone()); | 600 Statement* set_done_or_append; |
562 arguments->Add(factory()->NewVariableProxy(iterator), zone()); | 601 { |
563 auto spread_into_array_call = | 602 Expression* result_done = |
564 factory()->NewCallRuntime(Context::CONCAT_ITERABLE_TO_ARRAY_INDEX, | 603 factory()->NewProperty(factory()->NewVariableProxy(result), |
565 arguments, RelocInfo::kNoPosition); | 604 factory()->NewStringLiteral( |
| 605 ast_value_factory()->done_string(), nopos), |
| 606 nopos); |
| 607 set_done_or_append = factory()->NewIfStatement(result_done, set_done, |
| 608 append_element, nopos); |
| 609 } |
566 | 610 |
567 auto if_statement = factory()->NewIfStatement( | 611 // while (!done) { |
568 factory()->NewUnaryOperation(Token::NOT, | 612 // #get_next; |
569 factory()->NewVariableProxy(done), | 613 // #set_done_or_append; |
570 RelocInfo::kNoPosition), | 614 // } |
571 factory()->NewExpressionStatement(spread_into_array_call, | 615 WhileStatement* loop = factory()->NewWhileStatement(nullptr, nopos); |
572 RelocInfo::kNoPosition), | 616 { |
573 factory()->NewEmptyStatement(RelocInfo::kNoPosition), | 617 Expression* condition = factory()->NewUnaryOperation( |
574 RelocInfo::kNoPosition); | 618 Token::NOT, factory()->NewVariableProxy(done), nopos); |
575 block_->statements()->Add(if_statement, zone()); | 619 Block* body = factory()->NewBlock(nullptr, 2, true, nopos); |
| 620 body->statements()->Add(get_next, zone()); |
| 621 body->statements()->Add(set_done_or_append, zone()); |
| 622 loop->Initialize(condition, body); |
| 623 } |
576 | 624 |
577 auto set_done = factory()->NewAssignment( | 625 block_->statements()->Add(loop, zone()); |
578 Token::ASSIGN, factory()->NewVariableProxy(done), | |
579 factory()->NewBooleanLiteral(true, nopos), nopos); | |
580 block_->statements()->Add( | |
581 factory()->NewExpressionStatement(set_done, nopos), zone()); | |
582 | |
583 RecurseIntoSubpattern(spread->expression(), | 626 RecurseIntoSubpattern(spread->expression(), |
584 factory()->NewVariableProxy(array)); | 627 factory()->NewVariableProxy(array)); |
585 } | 628 } |
586 | 629 |
587 if (FLAG_harmony_iterator_close) { | 630 if (FLAG_harmony_iterator_close) { |
588 Expression* closing_condition = factory()->NewUnaryOperation( | 631 Expression* closing_condition = factory()->NewUnaryOperation( |
589 Token::NOT, factory()->NewVariableProxy(done), nopos); | 632 Token::NOT, factory()->NewVariableProxy(done), nopos); |
590 parser_->FinalizeIteratorUse(completion, closing_condition, iterator, | 633 parser_->FinalizeIteratorUse(completion, closing_condition, iterator, |
591 block_, target); | 634 block_, target); |
592 block_ = target; | 635 block_ = target; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 NOT_A_PATTERN(TryFinallyStatement) | 742 NOT_A_PATTERN(TryFinallyStatement) |
700 NOT_A_PATTERN(UnaryOperation) | 743 NOT_A_PATTERN(UnaryOperation) |
701 NOT_A_PATTERN(VariableDeclaration) | 744 NOT_A_PATTERN(VariableDeclaration) |
702 NOT_A_PATTERN(WhileStatement) | 745 NOT_A_PATTERN(WhileStatement) |
703 NOT_A_PATTERN(WithStatement) | 746 NOT_A_PATTERN(WithStatement) |
704 NOT_A_PATTERN(Yield) | 747 NOT_A_PATTERN(Yield) |
705 | 748 |
706 #undef NOT_A_PATTERN | 749 #undef NOT_A_PATTERN |
707 } // namespace internal | 750 } // namespace internal |
708 } // namespace v8 | 751 } // namespace v8 |
OLD | NEW |