[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_;