[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>
This commit is contained in:
Régis Crelier
2019-06-25 19:41:28 +00:00
committed by commit-bot@chromium.org
parent 3e732e5bbe
commit 11d369fd58
3 changed files with 18 additions and 11 deletions
@@ -394,7 +394,7 @@ void KernelBytecodeDisassembler::Disassemble(const Function& function) {
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
@@ -3070,7 +3070,6 @@ RawLocalVarDescriptors* BytecodeReader::ComputeLocalVarDescriptors(
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});
}
+17 -9
View File
@@ -2321,6 +2321,7 @@ DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() {
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 @@ DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() {
// 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);
}
}
}
}