| Index: runtime/vm/intermediate_language_arm64.cc | 
| diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc | 
| index b8abb9a3bd2f4bf44a1515326715ad3b3e937a99..a4f80f6e8e1827a168358e53ae329eb1145da268 100644 | 
| --- a/runtime/vm/intermediate_language_arm64.cc | 
| +++ b/runtime/vm/intermediate_language_arm64.cc | 
| @@ -2617,12 +2617,41 @@ void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
| ASSERT(fp_sp_dist <= 0); | 
| __ AddImmediate(SP, FP, fp_sp_dist); | 
|  | 
| -  // Restore stack and initialize the two exception variables: | 
| -  // exception and stack trace variables. | 
| -  __ StoreToOffset(kExceptionObjectReg, FP, | 
| -                   exception_var().index() * kWordSize); | 
| -  __ StoreToOffset(kStackTraceObjectReg, FP, | 
| -                   stacktrace_var().index() * kWordSize); | 
| +  // Auxiliary variables introduced by the try catch can be captured if we are | 
| +  // inside a function with yield/resume points. In this case we first need | 
| +  // to restore the context to match the context at entry into the closure. | 
| +  if (should_restore_closure_context()) { | 
| +    const ParsedFunction& parsed_function = compiler->parsed_function(); | 
| +    ASSERT(parsed_function.function().IsClosureFunction()); | 
| +    LocalScope* scope = parsed_function.node_sequence()->scope(); | 
| + | 
| +    LocalVariable* closure_parameter = scope->VariableAt(0); | 
| +    ASSERT(!closure_parameter->is_captured()); | 
| +    __ LoadFromOffset(CTX, FP, closure_parameter->index() * kWordSize); | 
| +    __ LoadFieldFromOffset(CTX, CTX, Closure::context_offset()); | 
| + | 
| +    const intptr_t context_index = | 
| +        parsed_function.current_context_var()->index(); | 
| +    __ StoreToOffset(CTX, FP, context_index * kWordSize); | 
| +  } | 
| + | 
| +  // Initialize exception and stack trace variables. | 
| +  if (exception_var().is_captured()) { | 
| +    ASSERT(stacktrace_var().is_captured()); | 
| +    __ StoreIntoObjectOffset(CTX, | 
| +                             Context::variable_offset(exception_var().index()), | 
| +                             kExceptionObjectReg); | 
| +    __ StoreIntoObjectOffset(CTX, | 
| +                             Context::variable_offset(stacktrace_var().index()), | 
| +                             kStackTraceObjectReg); | 
| +  } else { | 
| +    // Restore stack and initialize the two exception variables: | 
| +    // exception and stack trace variables. | 
| +    __ StoreToOffset(kExceptionObjectReg, FP, | 
| +                     exception_var().index() * kWordSize); | 
| +    __ StoreToOffset(kStackTraceObjectReg, FP, | 
| +                     stacktrace_var().index() * kWordSize); | 
| +  } | 
| } | 
|  | 
|  | 
|  |