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

Unified Diff: runtime/vm/parser.cc

Issue 1314993002: Use correct scope to lookup saved async context variable. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 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
« no previous file with comments | « no previous file | runtime/vm/scopes.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 6400bb2c3cdba99a59c652fb9e5bddaf15044ae4..12fbc31a7fc8728bc7090e8add970160412c3791 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -6595,8 +6595,12 @@ SequenceNode* Parser::CloseSyncGenFunction(const Function& closure,
// corresponding function block.
CloseBlock();
- closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
- closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+ LocalVariable* existing_var =
+ closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var =
+ closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
// :await_jump_var = -1;
LocalVariable* jump_var =
@@ -6898,13 +6902,24 @@ SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func,
// Make sure the implicit variables of the async generator function
// are captured.
- closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
- closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
- closure_body->scope()->LookupVariable(Symbols::Controller(), false);
- closure_body->scope()->LookupVariable(Symbols::AsyncOperation(), false);
- closure_body->scope()->LookupVariable(Symbols::AsyncThenCallback(), false);
- closure_body->scope()->LookupVariable(
+ LocalVariable* existing_var = closure_body->scope()->LookupVariable(
+ Symbols::AwaitJumpVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = closure_body->scope()->LookupVariable(
+ Symbols::AwaitContextVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = closure_body->scope()->LookupVariable(
+ Symbols::Controller(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = closure_body->scope()->LookupVariable(
+ Symbols::AsyncOperation(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = closure_body->scope()->LookupVariable(
+ Symbols::AsyncThenCallback(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = closure_body->scope()->LookupVariable(
Symbols::AsyncCatchErrorCallback(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
const Library& async_lib = Library::Handle(Library::AsyncLibrary());
@@ -7028,13 +7043,24 @@ SequenceNode* Parser::CloseAsyncGeneratorClosure(SequenceNode* body) {
// Implicitly mark those variables below as captured. We currently mark all
// variables of all scopes as captured, but as soon as we do something
// smarter we rely on these internal variables to be available.
- new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
- new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
- new_body->scope()->LookupVariable(Symbols::Controller(), false);
- new_body->scope()->LookupVariable(Symbols::AsyncOperationParam(), false);
- new_body->scope()->LookupVariable(Symbols::AsyncOperationErrorParam(), false);
- new_body->scope()->LookupVariable(
+ LocalVariable* existing_var = new_body->scope()->LookupVariable(
+ Symbols::AwaitJumpVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = new_body->scope()->LookupVariable(
+ Symbols::AwaitContextVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = new_body->scope()->LookupVariable(
+ Symbols::Controller(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var = new_body->scope()->LookupVariable(
+ Symbols::AsyncOperationParam(), false);
+ ASSERT(existing_var != NULL);
+ existing_var = new_body->scope()->LookupVariable(
+ Symbols::AsyncOperationErrorParam(), false);
+ ASSERT(existing_var != NULL);
+ existing_var = new_body->scope()->LookupVariable(
Symbols::AsyncOperationStackTraceParam(), false);
+ ASSERT(existing_var != NULL);
new_body->scope()->RecursivelyCaptureAllVariables();
return new_body;
}
@@ -7079,9 +7105,15 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
// corresponding function block.
CloseBlock();
- closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
- closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
- closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter());
+ LocalVariable* existing_var =
+ closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var =
+ closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var =
+ closure_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
// Create and return a new future that executes a closure with the current
// body.
@@ -7222,9 +7254,15 @@ SequenceNode* Parser::CloseAsyncClosure(SequenceNode* body) {
SequenceNode* new_body = CloseAsyncTryBlock(body);
ASSERT(new_body != NULL);
ASSERT(new_body->scope() != NULL);
- new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
- new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
- new_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
+ LocalVariable* existing_var =
+ new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var =
+ new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
+ existing_var =
+ new_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
+ ASSERT((existing_var != NULL) && existing_var->is_captured());
new_body->scope()->RecursivelyCaptureAllVariables();
return new_body;
}
@@ -8515,7 +8553,7 @@ static LocalVariable* LookupAsyncSavedTryContextVar(LocalScope* scope,
Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
try_index))));
LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name);
- ASSERT((var != NULL) && var->is_captured());\
+ ASSERT((var != NULL) && var->is_captured());
return var;
}
@@ -8551,7 +8589,8 @@ void Parser::CheckAsyncOpInTryBlock(
// The block declaring :saved_try_ctx_var variable is the parent of the
// pushed try block.
*saved_try_ctx = LookupSavedTryContextVar(scope->parent());
- *async_saved_try_ctx = LookupAsyncSavedTryContextVar(scope, try_index);
+ *async_saved_try_ctx = LookupAsyncSavedTryContextVar(async_temp_scope_,
+ try_index);
if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) {
// Collecting the outer try scope is not necessary if we
// are in a finally block.
@@ -8560,7 +8599,7 @@ void Parser::CheckAsyncOpInTryBlock(
if (scope->function_level() == current_function_level) {
*outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent());
*outer_async_saved_try_ctx =
- LookupAsyncSavedTryContextVar(scope, try_index);
+ LookupAsyncSavedTryContextVar(async_temp_scope_, try_index);
}
}
}
@@ -9232,7 +9271,7 @@ SequenceNode* Parser::EnsureFinallyClause(
LocalVariable* saved_try_ctx =
LookupSavedTryContextVar(scope->parent());
LocalVariable* async_saved_try_ctx =
- LookupAsyncSavedTryContextVar(scope->parent(),
+ LookupAsyncSavedTryContextVar(async_temp_scope_,
try_stack_->try_index());
current_block_->statements->Add(
new (Z) StoreLocalNode(
@@ -9506,7 +9545,7 @@ SequenceNode* Parser::ParseCatchClauses(
LocalVariable* saved_try_ctx =
LookupSavedTryContextVar(scope->parent());
LocalVariable* async_saved_try_ctx =
- LookupAsyncSavedTryContextVar(scope->parent(),
+ LookupAsyncSavedTryContextVar(async_temp_scope_,
try_block->try_index());
async_code->Add(
new (Z) StoreLocalNode(
« no previous file with comments | « no previous file | runtime/vm/scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698