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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/pattern-rewriter.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/parser.cc
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
index b4f85dce559c3865b75fd562194fd0f637428af3..b56bc7feb839a221e418644e4cc58432484a44ac 100644
--- a/src/parsing/parser.cc
+++ b/src/parsing/parser.cc
@@ -504,15 +504,6 @@ Literal* Parser::ExpressionFromLiteral(Token::Value token, int pos) {
return NULL;
}
-Expression* Parser::GetIterator(Expression* iterable, int pos) {
- Expression* iterator_symbol_literal =
- factory()->NewSymbolLiteral("iterator_symbol", kNoSourcePosition);
- Expression* prop =
- factory()->NewProperty(iterable, iterator_symbol_literal, pos);
- ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(0, zone());
- return factory()->NewCall(prop, args, pos);
-}
-
void Parser::MarkTailPosition(Expression* expression) {
expression->MarkTail();
}
@@ -2073,12 +2064,13 @@ Statement* Parser::InitializeForOfStatement(ForOfStatement* for_of,
Variable* result = NewTemporary(ast_value_factory()->dot_result_string());
Variable* completion = NewTemporary(avfactory->empty_string());
- // iterator = iterable[Symbol.iterator]()
+ // iterator = GetIterator(iterable)
Expression* assign_iterator;
{
assign_iterator = factory()->NewAssignment(
Token::ASSIGN, factory()->NewVariableProxy(iterator),
- GetIterator(iterable, iterable->position()), iterable->position());
+ factory()->NewGetIterator(iterable, iterable->position()),
+ iterable->position());
}
// !%_IsJSReceiver(result = iterator.next()) &&
@@ -4573,8 +4565,7 @@ void Parser::SetFunctionName(Expression* value, const AstRawString* name) {
// let mode = kNext;
// let output = undefined;
//
-// let iterator = iterable[Symbol.iterator]();
-// if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid);
+// let iterator = GetIterator(iterable);
//
// while (true) {
// // From the generator to the iterator:
@@ -4677,41 +4668,17 @@ Expression* Parser::RewriteYieldStar(Expression* generator,
initialize_output = factory()->NewExpressionStatement(assignment, nopos);
}
- // let iterator = iterable[Symbol.iterator];
+ // let iterator = GetIterator(iterable);
Variable* var_iterator = NewTemporary(ast_value_factory()->empty_string());
Statement* get_iterator;
{
- Expression* iterator = GetIterator(iterable, nopos);
+ Expression* iterator = factory()->NewGetIterator(iterable, nopos);
Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
Expression* assignment = factory()->NewAssignment(
Token::ASSIGN, iterator_proxy, iterator, nopos);
get_iterator = factory()->NewExpressionStatement(assignment, nopos);
}
- // if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid);
- Statement* validate_iterator;
- {
- Expression* is_receiver_call;
- {
- auto args = new (zone()) ZoneList<Expression*>(1, zone());
- args->Add(factory()->NewVariableProxy(var_iterator), zone());
- is_receiver_call =
- factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
- }
-
- Statement* throw_call;
- {
- Expression* call =
- NewThrowTypeError(MessageTemplate::kSymbolIteratorInvalid,
- ast_value_factory()->empty_string(), nopos);
- throw_call = factory()->NewExpressionStatement(call, nopos);
- }
-
- validate_iterator = factory()->NewIfStatement(
- is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
- nopos);
- }
-
// output = iterator.next(input);
Statement* call_next;
{
@@ -5016,12 +4983,11 @@ Expression* Parser::RewriteYieldStar(Expression* generator,
// The rewriter needs to process the get_value statement only, hence we
// put the preceding statements into an init block.
- Block* do_block_ = factory()->NewBlock(nullptr, 7, true, nopos);
+ Block* do_block_ = factory()->NewBlock(nullptr, 6, true, nopos);
do_block_->statements()->Add(initialize_input, zone());
do_block_->statements()->Add(initialize_mode, zone());
do_block_->statements()->Add(initialize_output, zone());
do_block_->statements()->Add(get_iterator, zone());
- do_block_->statements()->Add(validate_iterator, zone());
do_block_->statements()->Add(loop, zone());
do_block_->statements()->Add(maybe_return_value, zone());
« 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