From 11d369fd58b0c7f9b8f5bf23155b8a6d760e89e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Crelier?= Date: Tue, 25 Jun 2019 19:41:28 +0000 Subject: [PATCH] [vm/bytecode] Various fixes for debugging bytecode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 Reviewed-by: Alexander Markov Reviewed-by: Ryan Macnak --- .../vm/compiler/assembler/disassembler_kbc.cc | 2 +- .../vm/compiler/frontend/bytecode_reader.cc | 1 - runtime/vm/debugger.cc | 26 ++++++++++++------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc index 452675f2b01..c4192965c84 100644 --- a/runtime/vm/compiler/assembler/disassembler_kbc.cc +++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc @@ -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 diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc index 952b031ae7f..b1fe509987f 100644 --- a/runtime/vm/compiler/frontend/bytecode_reader.cc +++ b/runtime/vm/compiler/frontend/bytecode_reader.cc @@ -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}); } diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc index 679e5d8dbd5..a710db90636 100644 --- a/runtime/vm/debugger.cc +++ b/runtime/vm/debugger.cc @@ -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); + } } } }