[vm] Fix lookup of async variables by taking ctx_level into account.

Until this CL variables are assumed to be found in current context only even though they could come from parent's contexts.

Bug: https://github.com/dart-lang/sdk/issues/34134
Change-Id: Ibcfe1449558086d0c82a85cfd213667e8c917fe0
Reviewed-on: https://dart-review.googlesource.com/c/87163
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index c31fb3d..538cb52 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -718,7 +718,9 @@
         ASSERT(kind == RawLocalVarDescriptors::kContextVar);
         if (!live_frame_) {
           ASSERT(!ctx_.IsNull());
-          return ctx_.At(variable_index.value());
+          return GetRelativeContextVar(var_info.scope_id,
+                                       variable_index.value(),
+                                       /* frame_ctx_level = */ 0);
         }
         return GetContextVar(var_info.scope_id, variable_index.value());
       }
@@ -1227,12 +1229,18 @@
 
 RawObject* ActivationFrame::GetContextVar(intptr_t var_ctx_level,
                                           intptr_t ctx_slot) {
-  const Context& ctx = GetSavedCurrentContext();
-  ASSERT(!ctx.IsNull());
-
   // The context level at the PC/token index of this activation frame.
   intptr_t frame_ctx_level = ContextLevel();
 
+  return GetRelativeContextVar(var_ctx_level, ctx_slot, frame_ctx_level);
+}
+
+RawObject* ActivationFrame::GetRelativeContextVar(intptr_t var_ctx_level,
+                                                  intptr_t ctx_slot,
+                                                  intptr_t frame_ctx_level) {
+  const Context& ctx = GetSavedCurrentContext();
+  ASSERT(!ctx.IsNull());
+
   intptr_t level_diff = frame_ctx_level - var_ctx_level;
   if (level_diff == 0) {
     if ((ctx_slot < 0) || (ctx_slot >= ctx.num_variables())) {
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 63db376..3e1a0c0 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -390,6 +390,9 @@
   }
 
   RawObject* GetStackVar(VariableIndex var_index);
+  RawObject* GetRelativeContextVar(intptr_t ctxt_level,
+                                   intptr_t slot_index,
+                                   intptr_t frame_ctx_level);
   RawObject* GetContextVar(intptr_t ctxt_level, intptr_t slot_index);
 
   uword pc_;