[vm/bytecode] Various fixes for debugging bytecode.
- Revert previously added adjustment of context level when copying overlapping
context variable from parent to closure.
- Distinguish between Code and Bytecode in activation frames when building the
asynchronous causal stack trace.
- Remove extra space when printing local variable descriptors.
Change-Id: I0e9371afafacedb59dd2e2f3abd4c38db0151cc2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107196
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index 452675f..c419296 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -394,7 +394,7 @@
function_fullname);
const auto& var_descriptors =
LocalVarDescriptors::Handle(zone, bytecode.GetLocalVarDescriptors());
- THR_Print("%s\n}\n", var_descriptors.ToCString());
+ THR_Print("%s}\n", var_descriptors.ToCString());
}
#else
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 952b031..b1fe509 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -3070,7 +3070,6 @@
function.token_pos() <= var_info.end_pos) ||
(function.token_pos() <= var_info.begin_pos &&
var_info.begin_pos <= function.end_token_pos()))) {
- var_info.scope_id++; // One level higher in the context chain.
vars.Add(
VarDesc{&String::Handle(zone, parent_vars.GetName(i)), var_info});
}
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 679e5d8..a710db9 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -2321,6 +2321,7 @@
Thread::Current(),
StackFrameIterator::kNoCrossThreadIteration);
+ Object& code_object = Object::Handle(zone);
Code& code = Code::Handle(zone);
Bytecode& bytecode = Bytecode::Handle(zone);
Smi& offset = Smi::Handle(zone);
@@ -2518,17 +2519,24 @@
// the readability of the trace.
i++;
} else {
- code = Code::RawCast(async_stack_trace.CodeAtFrame(i));
+ code_object = async_stack_trace.CodeAtFrame(i);
offset = Smi::RawCast(async_stack_trace.PcOffsetAtFrame(i));
- uword pc = code.PayloadStart() + offset.Value();
- if (code.is_optimized()) {
- for (InlinedFunctionsIterator it(code, pc); !it.Done();
- it.Advance()) {
- inlined_code = it.code();
- stack_trace->AddAsyncCausalFrame(it.pc(), inlined_code);
- }
+ if (code_object.IsBytecode()) {
+ bytecode ^= code_object.raw();
+ uword pc = bytecode.PayloadStart() + offset.Value();
+ stack_trace->AddAsyncCausalFrame(pc, bytecode);
} else {
- stack_trace->AddAsyncCausalFrame(pc, code);
+ code ^= code_object.raw();
+ uword pc = code.PayloadStart() + offset.Value();
+ if (code.is_optimized()) {
+ for (InlinedFunctionsIterator it(code, pc); !it.Done();
+ it.Advance()) {
+ inlined_code = it.code();
+ stack_trace->AddAsyncCausalFrame(it.pc(), inlined_code);
+ }
+ } else {
+ stack_trace->AddAsyncCausalFrame(pc, code);
+ }
}
}
}