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

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

Issue 2557593004: [ignition] desugar GetIterator() via bytecode rather than via AST (Closed)
Patch Set: georg's comments Created 4 years 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/pattern-rewriter.cc » ('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 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 bool has_dot = scanner()->ContainsDot(); 497 bool has_dot = scanner()->ContainsDot();
498 double value = scanner()->DoubleValue(); 498 double value = scanner()->DoubleValue();
499 return factory()->NewNumberLiteral(value, pos, has_dot); 499 return factory()->NewNumberLiteral(value, pos, has_dot);
500 } 500 }
501 default: 501 default:
502 DCHECK(false); 502 DCHECK(false);
503 } 503 }
504 return NULL; 504 return NULL;
505 } 505 }
506 506
507 Expression* Parser::GetIterator(Expression* iterable, int pos) {
508 Expression* iterator_symbol_literal =
509 factory()->NewSymbolLiteral("iterator_symbol", kNoSourcePosition);
510 Expression* prop =
511 factory()->NewProperty(iterable, iterator_symbol_literal, pos);
512 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(0, zone());
513 return factory()->NewCall(prop, args, pos);
514 }
515
516 void Parser::MarkTailPosition(Expression* expression) { 507 void Parser::MarkTailPosition(Expression* expression) {
517 expression->MarkTail(); 508 expression->MarkTail();
518 } 509 }
519 510
520 Expression* Parser::NewV8Intrinsic(const AstRawString* name, 511 Expression* Parser::NewV8Intrinsic(const AstRawString* name,
521 ZoneList<Expression*>* args, int pos, 512 ZoneList<Expression*>* args, int pos,
522 bool* ok) { 513 bool* ok) {
523 if (extension_ != nullptr) { 514 if (extension_ != nullptr) {
524 // The extension structures are only accessible while parsing the 515 // The extension structures are only accessible while parsing the
525 // very first time, not when reparsing because of lazy compilation. 516 // very first time, not when reparsing because of lazy compilation.
(...skipping 1540 matching lines...) Expand 10 before | Expand all | Expand 10 after
2066 // proper ES6 iterator finalization. In that case, the result is not 2057 // proper ES6 iterator finalization. In that case, the result is not
2067 // immediately a ForOfStatement. 2058 // immediately a ForOfStatement.
2068 2059
2069 const int nopos = kNoSourcePosition; 2060 const int nopos = kNoSourcePosition;
2070 auto avfactory = ast_value_factory(); 2061 auto avfactory = ast_value_factory();
2071 2062
2072 Variable* iterator = NewTemporary(ast_value_factory()->dot_iterator_string()); 2063 Variable* iterator = NewTemporary(ast_value_factory()->dot_iterator_string());
2073 Variable* result = NewTemporary(ast_value_factory()->dot_result_string()); 2064 Variable* result = NewTemporary(ast_value_factory()->dot_result_string());
2074 Variable* completion = NewTemporary(avfactory->empty_string()); 2065 Variable* completion = NewTemporary(avfactory->empty_string());
2075 2066
2076 // iterator = iterable[Symbol.iterator]() 2067 // iterator = GetIterator(iterable)
2077 Expression* assign_iterator; 2068 Expression* assign_iterator;
2078 { 2069 {
2079 assign_iterator = factory()->NewAssignment( 2070 assign_iterator = factory()->NewAssignment(
2080 Token::ASSIGN, factory()->NewVariableProxy(iterator), 2071 Token::ASSIGN, factory()->NewVariableProxy(iterator),
2081 GetIterator(iterable, iterable->position()), iterable->position()); 2072 factory()->NewGetIterator(iterable, iterable->position()),
2073 iterable->position());
2082 } 2074 }
2083 2075
2084 // !%_IsJSReceiver(result = iterator.next()) && 2076 // !%_IsJSReceiver(result = iterator.next()) &&
2085 // %ThrowIteratorResultNotAnObject(result) 2077 // %ThrowIteratorResultNotAnObject(result)
2086 Expression* next_result; 2078 Expression* next_result;
2087 { 2079 {
2088 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); 2080 Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
2089 next_result = 2081 next_result =
2090 BuildIteratorNextResult(iterator_proxy, result, next_result_pos); 2082 BuildIteratorNextResult(iterator_proxy, result, next_result_pos);
2091 } 2083 }
(...skipping 2474 matching lines...) Expand 10 before | Expand all | Expand 10 after
4566 // 4558 //
4567 // do { 4559 // do {
4568 // const kNext = 0; 4560 // const kNext = 0;
4569 // const kReturn = 1; 4561 // const kReturn = 1;
4570 // const kThrow = 2; 4562 // const kThrow = 2;
4571 // 4563 //
4572 // let input = function.sent; 4564 // let input = function.sent;
4573 // let mode = kNext; 4565 // let mode = kNext;
4574 // let output = undefined; 4566 // let output = undefined;
4575 // 4567 //
4576 // let iterator = iterable[Symbol.iterator](); 4568 // let iterator = GetIterator(iterable);
4577 // if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid);
4578 // 4569 //
4579 // while (true) { 4570 // while (true) {
4580 // // From the generator to the iterator: 4571 // // From the generator to the iterator:
4581 // // Forward input according to resume mode and obtain output. 4572 // // Forward input according to resume mode and obtain output.
4582 // switch (mode) { 4573 // switch (mode) {
4583 // case kNext: 4574 // case kNext:
4584 // output = iterator.next(input); 4575 // output = iterator.next(input);
4585 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); 4576 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4586 // break; 4577 // break;
4587 // case kReturn: 4578 // case kReturn:
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
4670 Variable* var_output = NewTemporary(ast_value_factory()->empty_string()); 4661 Variable* var_output = NewTemporary(ast_value_factory()->empty_string());
4671 Statement* initialize_output; 4662 Statement* initialize_output;
4672 { 4663 {
4673 Expression* output_proxy = factory()->NewVariableProxy(var_output); 4664 Expression* output_proxy = factory()->NewVariableProxy(var_output);
4674 Expression* assignment = 4665 Expression* assignment =
4675 factory()->NewAssignment(Token::ASSIGN, output_proxy, 4666 factory()->NewAssignment(Token::ASSIGN, output_proxy,
4676 factory()->NewUndefinedLiteral(nopos), nopos); 4667 factory()->NewUndefinedLiteral(nopos), nopos);
4677 initialize_output = factory()->NewExpressionStatement(assignment, nopos); 4668 initialize_output = factory()->NewExpressionStatement(assignment, nopos);
4678 } 4669 }
4679 4670
4680 // let iterator = iterable[Symbol.iterator]; 4671 // let iterator = GetIterator(iterable);
4681 Variable* var_iterator = NewTemporary(ast_value_factory()->empty_string()); 4672 Variable* var_iterator = NewTemporary(ast_value_factory()->empty_string());
4682 Statement* get_iterator; 4673 Statement* get_iterator;
4683 { 4674 {
4684 Expression* iterator = GetIterator(iterable, nopos); 4675 Expression* iterator = factory()->NewGetIterator(iterable, nopos);
4685 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator); 4676 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
4686 Expression* assignment = factory()->NewAssignment( 4677 Expression* assignment = factory()->NewAssignment(
4687 Token::ASSIGN, iterator_proxy, iterator, nopos); 4678 Token::ASSIGN, iterator_proxy, iterator, nopos);
4688 get_iterator = factory()->NewExpressionStatement(assignment, nopos); 4679 get_iterator = factory()->NewExpressionStatement(assignment, nopos);
4689 } 4680 }
4690 4681
4691 // if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid);
4692 Statement* validate_iterator;
4693 {
4694 Expression* is_receiver_call;
4695 {
4696 auto args = new (zone()) ZoneList<Expression*>(1, zone());
4697 args->Add(factory()->NewVariableProxy(var_iterator), zone());
4698 is_receiver_call =
4699 factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
4700 }
4701
4702 Statement* throw_call;
4703 {
4704 Expression* call =
4705 NewThrowTypeError(MessageTemplate::kSymbolIteratorInvalid,
4706 ast_value_factory()->empty_string(), nopos);
4707 throw_call = factory()->NewExpressionStatement(call, nopos);
4708 }
4709
4710 validate_iterator = factory()->NewIfStatement(
4711 is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
4712 nopos);
4713 }
4714
4715 // output = iterator.next(input); 4682 // output = iterator.next(input);
4716 Statement* call_next; 4683 Statement* call_next;
4717 { 4684 {
4718 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator); 4685 Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
4719 Expression* literal = 4686 Expression* literal =
4720 factory()->NewStringLiteral(ast_value_factory()->next_string(), nopos); 4687 factory()->NewStringLiteral(ast_value_factory()->next_string(), nopos);
4721 Expression* next_property = 4688 Expression* next_property =
4722 factory()->NewProperty(iterator_proxy, literal, nopos); 4689 factory()->NewProperty(iterator_proxy, literal, nopos);
4723 Expression* input_proxy = factory()->NewVariableProxy(var_input); 4690 Expression* input_proxy = factory()->NewVariableProxy(var_input);
4724 auto args = new (zone()) ZoneList<Expression*>(1, zone()); 4691 auto args = new (zone()) ZoneList<Expression*>(1, zone());
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
5009 4976
5010 loop->Initialize(factory()->NewBooleanLiteral(true, nopos), loop_body); 4977 loop->Initialize(factory()->NewBooleanLiteral(true, nopos), loop_body);
5011 } 4978 }
5012 4979
5013 // do { ... } 4980 // do { ... }
5014 DoExpression* yield_star; 4981 DoExpression* yield_star;
5015 { 4982 {
5016 // The rewriter needs to process the get_value statement only, hence we 4983 // The rewriter needs to process the get_value statement only, hence we
5017 // put the preceding statements into an init block. 4984 // put the preceding statements into an init block.
5018 4985
5019 Block* do_block_ = factory()->NewBlock(nullptr, 7, true, nopos); 4986 Block* do_block_ = factory()->NewBlock(nullptr, 6, true, nopos);
5020 do_block_->statements()->Add(initialize_input, zone()); 4987 do_block_->statements()->Add(initialize_input, zone());
5021 do_block_->statements()->Add(initialize_mode, zone()); 4988 do_block_->statements()->Add(initialize_mode, zone());
5022 do_block_->statements()->Add(initialize_output, zone()); 4989 do_block_->statements()->Add(initialize_output, zone());
5023 do_block_->statements()->Add(get_iterator, zone()); 4990 do_block_->statements()->Add(get_iterator, zone());
5024 do_block_->statements()->Add(validate_iterator, zone());
5025 do_block_->statements()->Add(loop, zone()); 4991 do_block_->statements()->Add(loop, zone());
5026 do_block_->statements()->Add(maybe_return_value, zone()); 4992 do_block_->statements()->Add(maybe_return_value, zone());
5027 4993
5028 Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos); 4994 Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos);
5029 do_block->statements()->Add(do_block_, zone()); 4995 do_block->statements()->Add(do_block_, zone());
5030 do_block->statements()->Add(get_value, zone()); 4996 do_block->statements()->Add(get_value, zone());
5031 4997
5032 Variable* dot_result = 4998 Variable* dot_result =
5033 NewTemporary(ast_value_factory()->dot_result_string()); 4999 NewTemporary(ast_value_factory()->dot_result_string());
5034 yield_star = factory()->NewDoExpression(do_block, dot_result, nopos); 5000 yield_star = factory()->NewDoExpression(do_block, dot_result, nopos);
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
5480 5446
5481 return final_loop; 5447 return final_loop;
5482 } 5448 }
5483 5449
5484 #undef CHECK_OK 5450 #undef CHECK_OK
5485 #undef CHECK_OK_VOID 5451 #undef CHECK_OK_VOID
5486 #undef CHECK_FAILED 5452 #undef CHECK_FAILED
5487 5453
5488 } // namespace internal 5454 } // namespace internal
5489 } // namespace v8 5455 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/pattern-rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698