From d591b59fcd01519076d84ce22362552265d34d0e Mon Sep 17 00:00:00 2001 From: Jens Johansen Date: Tue, 3 Jan 2017 10:23:31 +0100 Subject: [PATCH] Setup local var descriptors in kernel mode. Closes https://github.com/dart-lang/sdk/issues/28054 R=kmillikin@google.com Review-Url: https://codereview.chromium.org/2589733002 . --- runtime/vm/compiler.cc | 8 ++++++-- runtime/vm/kernel_to_il.cc | 9 ++++++++- runtime/vm/object.cc | 3 --- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc index 1b22da28e09..fee4b89553a 100644 --- a/runtime/vm/compiler.cc +++ b/runtime/vm/compiler.cc @@ -1593,8 +1593,12 @@ void Compiler::ComputeLocalVarDescriptors(const Code& code) { // if state changed while compiling in background. LongJumpScope jump; if (setjmp(*jump.Set()) == 0) { - Parser::ParseFunction(parsed_function); - parsed_function->AllocateVariables(); + if (function.kernel_function() == NULL) { + Parser::ParseFunction(parsed_function); + parsed_function->AllocateVariables(); + } else { + parsed_function->EnsureKernelScopes(); + } const LocalVarDescriptors& var_descs = LocalVarDescriptors::Handle( parsed_function->node_sequence()->scope()->GetVarDescriptors(function)); ASSERT(!var_descs.IsNull()); diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc index e5d75e77ec3..98f83f875c0 100644 --- a/runtime/vm/kernel_to_il.cc +++ b/runtime/vm/kernel_to_il.cc @@ -662,7 +662,7 @@ void ScopeBuilder::VisitFunctionNode(FunctionNode* node) { node->body()->AcceptStatementVisitor(this); } - // Ensure that :await_jump_var and :await_ctx_var are captured. + // Ensure that :await_jump_var, :await_ctx_var and :async_op are captured. if (node->async_marker() == FunctionNode::kSyncYielding) { { LocalVariable* temp = NULL; @@ -676,6 +676,13 @@ void ScopeBuilder::VisitFunctionNode(FunctionNode* node) { (depth_.function_ == 0) ? &result_->yield_context_variable : &temp, Symbols::AwaitContextVar()); } + { + LocalVariable* temp = + scope_->LookupVariable(Symbols::AsyncOperation(), true); + if (temp != NULL) { + scope_->CaptureVariable(temp); + } + } } } diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index bd3efd6736e..c438d9ff213 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc @@ -13822,9 +13822,6 @@ RawLocalVarDescriptors* Code::GetLocalVarDescriptors() const { if (v.IsNull()) { ASSERT(!is_optimized()); const Function& f = Function::Handle(function()); - if (f.kernel_function() != NULL) { - return v.raw(); - } ASSERT(!f.IsIrregexpFunction()); // Not yet implemented. Compiler::ComputeLocalVarDescriptors(*this); }