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

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

Issue 1740293002: Remove duplicated ForOfStatement init code code from RewriteSpreads (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 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 | « no previous file | no next file » | 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 "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 5649 matching lines...) Expand 10 before | Expand all | Expand 10 after
5660 factory()->NewCallRuntime(Runtime::kAppendElement, 5660 factory()->NewCallRuntime(Runtime::kAppendElement,
5661 append_element_args, 5661 append_element_args,
5662 RelocInfo::kNoPosition), 5662 RelocInfo::kNoPosition),
5663 RelocInfo::kNoPosition), 5663 RelocInfo::kNoPosition),
5664 zone()); 5664 zone());
5665 } else { 5665 } else {
5666 // If it's a spread, we're adding a for/of loop iterating through it. 5666 // If it's a spread, we're adding a for/of loop iterating through it.
5667 Variable* each = 5667 Variable* each =
5668 scope_->NewTemporary(ast_value_factory()->dot_for_string()); 5668 scope_->NewTemporary(ast_value_factory()->dot_for_string());
5669 Expression* subject = spread->expression(); 5669 Expression* subject = spread->expression();
5670 Variable* iterator =
5671 scope_->NewTemporary(ast_value_factory()->dot_iterator_string());
5672 Variable* element =
5673 scope_->NewTemporary(ast_value_factory()->dot_result_string());
5674 // iterator = subject[Symbol.iterator]()
5675 Expression* assign_iterator = factory()->NewAssignment(
5676 Token::ASSIGN, factory()->NewVariableProxy(iterator),
5677 GetIterator(subject, factory(), spread->expression_position()),
nickie 2016/02/29 08:43:38 The only reason I can see that this may not be equ
5678 subject->position());
5679 // !%_IsJSReceiver(element = iterator.next()) &&
5680 // %ThrowIteratorResultNotAnObject(element)
5681 Expression* next_element;
5682 {
5683 // element = iterator.next()
5684 Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
5685 next_element = BuildIteratorNextResult(iterator_proxy, element,
5686 spread->expression_position());
nickie 2016/02/29 08:43:38 Same here, InitializeForEachStatement uses a "hack
5687 }
5688 // element.done
5689 Expression* element_done;
5690 {
5691 Expression* done_literal = factory()->NewStringLiteral(
5692 ast_value_factory()->done_string(), RelocInfo::kNoPosition);
5693 Expression* element_proxy = factory()->NewVariableProxy(element);
5694 element_done = factory()->NewProperty(element_proxy, done_literal,
5695 RelocInfo::kNoPosition);
5696 }
5697 // each = element.value
5698 Expression* assign_each;
5699 {
5700 Expression* value_literal = factory()->NewStringLiteral(
5701 ast_value_factory()->value_string(), RelocInfo::kNoPosition);
5702 Expression* element_proxy = factory()->NewVariableProxy(element);
5703 Expression* element_value = factory()->NewProperty(
5704 element_proxy, value_literal, RelocInfo::kNoPosition);
5705 assign_each = factory()->NewAssignment(
5706 Token::ASSIGN, factory()->NewVariableProxy(each), element_value,
5707 RelocInfo::kNoPosition);
5708 }
5709 // %AppendElement($R, each) 5670 // %AppendElement($R, each)
5710 Statement* append_body; 5671 Statement* append_body;
5711 { 5672 {
5712 ZoneList<Expression*>* append_element_args = 5673 ZoneList<Expression*>* append_element_args =
5713 NewExpressionList(2, zone()); 5674 NewExpressionList(2, zone());
5714 append_element_args->Add(factory()->NewVariableProxy(result), zone()); 5675 append_element_args->Add(factory()->NewVariableProxy(result), zone());
5715 append_element_args->Add(factory()->NewVariableProxy(each), zone()); 5676 append_element_args->Add(factory()->NewVariableProxy(each), zone());
5716 append_body = factory()->NewExpressionStatement( 5677 append_body = factory()->NewExpressionStatement(
5717 factory()->NewCallRuntime(Runtime::kAppendElement, 5678 factory()->NewCallRuntime(Runtime::kAppendElement,
5718 append_element_args, 5679 append_element_args,
5719 RelocInfo::kNoPosition), 5680 RelocInfo::kNoPosition),
5720 RelocInfo::kNoPosition); 5681 RelocInfo::kNoPosition);
5721 } 5682 }
5722 // for (each of spread) %AppendElement($R, each) 5683 // for (each of spread) %AppendElement($R, each)
5723 ForEachStatement* loop = factory()->NewForEachStatement( 5684 ForEachStatement* loop = factory()->NewForEachStatement(
5724 ForEachStatement::ITERATE, nullptr, RelocInfo::kNoPosition); 5685 ForEachStatement::ITERATE, nullptr, RelocInfo::kNoPosition);
5725 ForOfStatement* for_of = loop->AsForOfStatement(); 5686 InitializeForEachStatement(loop, factory()->NewVariableProxy(each),
5726 for_of->Initialize(factory()->NewVariableProxy(each), subject, 5687 subject, append_body, false);
5727 append_body, iterator, assign_iterator, next_element, 5688 do_block->statements()->Add(loop, zone());
5728 element_done, assign_each);
5729 do_block->statements()->Add(for_of, zone());
5730 } 5689 }
5731 } 5690 }
5732 // Now, rewind the original array literal to truncate everything from the 5691 // Now, rewind the original array literal to truncate everything from the
5733 // first spread (included) until the end. This fixes $R's initialization. 5692 // first spread (included) until the end. This fixes $R's initialization.
5734 lit->RewindSpreads(); 5693 lit->RewindSpreads();
5735 return factory()->NewDoExpression(do_block, result, lit->position()); 5694 return factory()->NewDoExpression(do_block, result, lit->position());
5736 } 5695 }
5737 5696
5738 5697
5739 void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) { 5698 void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) {
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
6930 Expression* do_each = 6889 Expression* do_each =
6931 factory->NewDoExpression(new_assign_each, var_each, nopos); 6890 factory->NewDoExpression(new_assign_each, var_each, nopos);
6932 loop->set_assign_each(do_each); 6891 loop->set_assign_each(do_each);
6933 6892
6934 return final_loop; 6893 return final_loop;
6935 } 6894 }
6936 6895
6937 6896
6938 } // namespace internal 6897 } // namespace internal
6939 } // namespace v8 6898 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698