OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/debugger.h" | 5 #include "vm/debugger.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 | 8 |
9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
369 | 369 |
370 | 370 |
371 Breakpoint* BreakpointLocation::AddPerClosure(Debugger* dbg, | 371 Breakpoint* BreakpointLocation::AddPerClosure(Debugger* dbg, |
372 const Instance& closure, | 372 const Instance& closure, |
373 bool for_over_await) { | 373 bool for_over_await) { |
374 Breakpoint* bpt = breakpoints(); | 374 Breakpoint* bpt = breakpoints(); |
375 while (bpt != NULL) { | 375 while (bpt != NULL) { |
376 if (bpt->IsPerClosure() && bpt->closure() == closure.raw()) break; | 376 if (bpt->IsPerClosure() && bpt->closure() == closure.raw()) break; |
377 bpt = bpt->next(); | 377 bpt = bpt->next(); |
378 } | 378 } |
379 if (for_over_await && | |
380 (bpt != NULL) && | |
381 (bpt == dbg->synthetic_async_breakpoint_)) { | |
382 // If the debugger is paused after stepping over an await statement, | |
Cutch
2016/09/21 23:43:45
I wonder if we could just do the following in this
hausner
2016/09/21 23:59:28
Why is it important to create a new synthetic BP e
| |
383 // the synthetic breakpoint is temporarily kept in | |
384 // synthetic_async_breakpoint_ so it can be deleted when the step | |
385 // command resumes. | |
386 // If another step request over an async statement is issued, make | |
387 // sure the synthetic breakpoint does not get deleted. | |
388 dbg->synthetic_async_breakpoint_ = NULL; | |
389 } | |
379 if (bpt == NULL) { | 390 if (bpt == NULL) { |
380 bpt = new Breakpoint(dbg->nextId(), this); | 391 bpt = new Breakpoint(dbg->nextId(), this); |
381 bpt->SetIsPerClosure(closure); | 392 bpt->SetIsPerClosure(closure); |
382 bpt->set_is_synthetic_async(for_over_await); | 393 bpt->set_is_synthetic_async(for_over_await); |
383 AddBreakpoint(bpt, dbg); | 394 AddBreakpoint(bpt, dbg); |
384 } | 395 } |
385 return bpt; | 396 return bpt; |
386 } | 397 } |
387 | 398 |
388 | 399 |
(...skipping 2317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2706 String::Handle(frame->SourceUrl()).ToCString(), | 2717 String::Handle(frame->SourceUrl()).ToCString(), |
2707 frame->LineNumber(), | 2718 frame->LineNumber(), |
2708 String::Handle(frame->QualifiedFunctionName()).ToCString(), | 2719 String::Handle(frame->QualifiedFunctionName()).ToCString(), |
2709 frame->TokenPos().ToCString()); | 2720 frame->TokenPos().ToCString()); |
2710 } | 2721 } |
2711 | 2722 |
2712 ASSERT(stack_trace_ == NULL); | 2723 ASSERT(stack_trace_ == NULL); |
2713 stack_trace_ = CollectStackTrace(); | 2724 stack_trace_ = CollectStackTrace(); |
2714 // If this step callback is part of stepping over an await statement, | 2725 // If this step callback is part of stepping over an await statement, |
2715 // we saved the synthetic async breakpoint in PauseBreakpoint. We report | 2726 // we saved the synthetic async breakpoint in PauseBreakpoint. We report |
2716 // that we are paused at that breakpoint and then delete it after continuing. | 2727 // that we are paused at that breakpoint and then delete it after continuing. |
Cutch
2016/09/21 23:43:45
remove_synthetic_async_breakpoint = true;
| |
2717 SignalPausedEvent(frame, synthetic_async_breakpoint_); | 2728 SignalPausedEvent(frame, synthetic_async_breakpoint_); |
2718 if (synthetic_async_breakpoint_ != NULL) { | 2729 if (synthetic_async_breakpoint_ != NULL) { |
Cutch
2016/09/21 23:43:45
if (remove_synthetic_async_breakpoint && (syntheti
| |
2719 RemoveBreakpoint(synthetic_async_breakpoint_->id()); | 2730 RemoveBreakpoint(synthetic_async_breakpoint_->id()); |
2720 synthetic_async_breakpoint_ = NULL; | 2731 synthetic_async_breakpoint_ = NULL; |
2721 } | 2732 } |
2722 HandleSteppingRequest(stack_trace_); | 2733 HandleSteppingRequest(stack_trace_); |
2723 stack_trace_ = NULL; | 2734 stack_trace_ = NULL; |
2724 | 2735 |
2725 // If any error occurred while in the debug message loop, return it here. | 2736 // If any error occurred while in the debug message loop, return it here. |
2726 const Error& error = Error::Handle(Thread::Current()->sticky_error()); | 2737 const Error& error = Error::Handle(Thread::Current()->sticky_error()); |
2727 Thread::Current()->clear_sticky_error(); | 2738 Thread::Current()->clear_sticky_error(); |
2728 return error.raw(); | 2739 return error.raw(); |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3326 | 3337 |
3327 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 3338 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
3328 ASSERT(bpt->next() == NULL); | 3339 ASSERT(bpt->next() == NULL); |
3329 bpt->set_next(code_breakpoints_); | 3340 bpt->set_next(code_breakpoints_); |
3330 code_breakpoints_ = bpt; | 3341 code_breakpoints_ = bpt; |
3331 } | 3342 } |
3332 | 3343 |
3333 #endif // !PRODUCT | 3344 #endif // !PRODUCT |
3334 | 3345 |
3335 } // namespace dart | 3346 } // namespace dart |
OLD | NEW |