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

Unified Diff: runtime/vm/parser.cc

Issue 460763002: Fix returning from async functions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: first set of comments Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 4d0e741c47c372fae22fc0e384917383cc8aa14e..e1794f154df5297028a6e54e838c63b2a74fc9f7 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1086,8 +1086,7 @@ SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) {
// Generate code returning the field value.
ReturnNode* return_node =
- new ReturnNode(ident_pos,
- new LoadStaticFieldNode(ident_pos, field));
+ new ReturnNode(ident_pos, new LoadStaticFieldNode(ident_pos, field));
current_block_->statements->Add(return_node);
}
return CloseBlock();
@@ -1233,8 +1232,7 @@ SequenceNode* Parser::ParseInstanceGetter(const Function& func) {
LoadInstanceFieldNode* load_field =
new LoadInstanceFieldNode(ident_pos, load_receiver, field);
- ReturnNode* return_node =
- new ReturnNode(Scanner::kNoSourcePos, load_field);
+ ReturnNode* return_node = new ReturnNode(Scanner::kNoSourcePos, load_field);
current_block_->statements->Add(return_node);
return CloseBlock();
}
@@ -3117,7 +3115,8 @@ void Parser::AddEqualityNullCheck() {
Token::kEQ_STRICT,
LoadReceiver(Scanner::kNoSourcePos),
null_operand);
- SequenceNode* arg_is_null = new SequenceNode(Scanner::kNoSourcePos, NULL);
+ SequenceNode* arg_is_null = new SequenceNode(Scanner::kNoSourcePos,
+ current_block_->scope);
arg_is_null->Add(new ReturnNode(Scanner::kNoSourcePos, result));
IfNode* if_arg_null = new IfNode(Scanner::kNoSourcePos,
check_arg,
@@ -5658,40 +5657,8 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
void Parser::CloseAsyncClosure(SequenceNode* body) {
- ASSERT(body != NULL);
- // Replace an optional ReturnNode with the appropriate completer calls.
- intptr_t last_index = body->length() - 1;
- AstNode* last = NULL;
- if (last_index >= 0) {
- // Non-empty async closure.
- last = body->NodeAt(last_index);
- }
- ArgumentListNode* args = new (I) ArgumentListNode(Scanner::kNoSourcePos);
- LocalVariable* completer = body->scope()->LookupVariable(
- Symbols::AsyncCompleter(), false);
- ASSERT(completer != NULL);
- if (last != NULL && last->IsReturnNode()) {
- // Replace
- // return <expr>;
- // with
- // completer.complete(<expr>);
- args->Add(body->NodeAt(last_index)->AsReturnNode()->value());
- body->ReplaceNodeAt(last_index,
- new (I) InstanceCallNode(
- Scanner::kNoSourcePos,
- new (I) LoadLocalNode(Scanner::kNoSourcePos, completer),
- Symbols::CompleterComplete(),
- args));
- } else {
- // Add to AST:
- // completer.complete();
- body->Add(
- new (I) InstanceCallNode(
- Scanner::kNoSourcePos,
- new (I) LoadLocalNode(Scanner::kNoSourcePos, completer),
- Symbols::CompleterComplete(),
- args));
- }
+ // We need a temporary expression to store intermediate return values.
+ parsed_function()->EnsureExpressionTemp();
}
@@ -5800,7 +5767,8 @@ void Parser::ParseNativeFunctionBlock(const ParamList* params,
Dart_NativeEntryResolver resolver = library.native_entry_resolver();
bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver);
current_block_->statements->Add(new(I) ReturnNode(
- TokenPos(), new(I) NativeBodyNode(
+ TokenPos(),
+ new(I) NativeBodyNode(
TokenPos(),
Function::ZoneHandle(I, func.raw()),
native_name,

Powered by Google App Engine
This is Rietveld 408576698