| Index: runtime/vm/debugger.h
|
| diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
|
| index ab833391403b1037ca22021b0ad12b1101edaf7b..1d7e1ce1c528992f58f461def5c2781ceb584edd 100644
|
| --- a/runtime/vm/debugger.h
|
| +++ b/runtime/vm/debugger.h
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "vm/object.h"
|
| #include "vm/port.h"
|
| +#include "vm/service_event.h"
|
|
|
| namespace dart {
|
|
|
| @@ -369,105 +370,9 @@ class DebuggerStackTrace : public ZoneAllocated {
|
| };
|
|
|
|
|
| -class DebuggerEvent {
|
| - public:
|
| - enum EventType {
|
| - kBreakpointReached = 1,
|
| - kBreakpointResolved = 2,
|
| - kExceptionThrown = 3,
|
| - kIsolateCreated = 4,
|
| - kIsolateShutdown = 5,
|
| - kIsolateInterrupted = 6,
|
| - };
|
| -
|
| - explicit DebuggerEvent(Isolate* isolate, EventType event_type)
|
| - : isolate_(isolate),
|
| - type_(event_type),
|
| - top_frame_(NULL),
|
| - breakpoint_(NULL),
|
| - exception_(NULL),
|
| - async_continuation_(NULL),
|
| - at_async_jump_(false),
|
| - timestamp_(-1) {}
|
| -
|
| - Isolate* isolate() const { return isolate_; }
|
| -
|
| - EventType type() const { return type_; }
|
| -
|
| - bool IsPauseEvent() const {
|
| - return (type_ == kBreakpointReached ||
|
| - type_ == kIsolateInterrupted ||
|
| - type_ == kExceptionThrown);
|
| - }
|
| -
|
| - ActivationFrame* top_frame() const {
|
| - ASSERT(IsPauseEvent());
|
| - return top_frame_;
|
| - }
|
| - void set_top_frame(ActivationFrame* frame) {
|
| - ASSERT(IsPauseEvent());
|
| - top_frame_ = frame;
|
| - }
|
| -
|
| - Breakpoint* breakpoint() const {
|
| - ASSERT(type_ == kBreakpointReached || type_ == kBreakpointResolved);
|
| - return breakpoint_;
|
| - }
|
| - void set_breakpoint(Breakpoint* bpt) {
|
| - ASSERT(type_ == kBreakpointReached || type_ == kBreakpointResolved);
|
| - breakpoint_ = bpt;
|
| - }
|
| -
|
| - const Object* exception() const {
|
| - ASSERT(type_ == kExceptionThrown);
|
| - return exception_;
|
| - }
|
| - void set_exception(const Object* exception) {
|
| - ASSERT(type_ == kExceptionThrown);
|
| - exception_ = exception;
|
| - }
|
| -
|
| - const Object* async_continuation() const {
|
| - ASSERT(type_ == kBreakpointReached);
|
| - return async_continuation_;
|
| - }
|
| - void set_async_continuation(const Object* closure) {
|
| - ASSERT(type_ == kBreakpointReached);
|
| - async_continuation_ = closure;
|
| - }
|
| -
|
| - bool at_async_jump() const {
|
| - return at_async_jump_;
|
| - }
|
| - void set_at_async_jump(bool value) {
|
| - at_async_jump_ = value;
|
| - }
|
| -
|
| - Dart_Port isolate_id() const {
|
| - return isolate_->main_port();
|
| - }
|
| -
|
| - void UpdateTimestamp();
|
| -
|
| - int64_t timestamp() const {
|
| - return timestamp_;
|
| - }
|
| -
|
| - private:
|
| - Isolate* isolate_;
|
| - EventType type_;
|
| - ActivationFrame* top_frame_;
|
| - Breakpoint* breakpoint_;
|
| - const Object* exception_;
|
| - const Object* async_continuation_;
|
| - bool at_async_jump_;
|
| - int64_t timestamp_;
|
| -};
|
| -
|
| -
|
| class Debugger {
|
| public:
|
| - typedef void EventHandler(DebuggerEvent* event);
|
| + typedef void EventHandler(ServiceEvent* event);
|
|
|
| Debugger();
|
| ~Debugger();
|
| @@ -525,7 +430,7 @@ class Debugger {
|
| // is not paused, this returns NULL. Note that the debugger can be
|
| // paused for breakpoints, isolate interruption, and (sometimes)
|
| // exceptions.
|
| - const DebuggerEvent* PauseEvent() const { return pause_event_; }
|
| + const ServiceEvent* PauseEvent() const { return pause_event_; }
|
|
|
| void SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info);
|
| Dart_ExceptionPauseInfo GetExceptionPauseInfo() const;
|
| @@ -580,14 +485,21 @@ class Debugger {
|
| RawObject* GetStaticField(const Class& cls,
|
| const String& field_name);
|
|
|
| - RawError* SignalBpReached();
|
| - RawError* DebuggerStepCallback();
|
| - RawError* SignalIsolateInterrupted();
|
| + // Pause execution for a breakpoint. Called from generated code.
|
| + RawError* PauseBreakpoint();
|
|
|
| - void BreakHere(const String& msg);
|
| + // Pause execution due to stepping. Called from generated code.
|
| + RawError* PauseStepping();
|
|
|
| - void SignalExceptionThrown(const Instance& exc);
|
| - void SignalIsolateEvent(DebuggerEvent::EventType type);
|
| + // Pause execution due to isolate interrupt.
|
| + RawError* PauseInterrupted();
|
| +
|
| + // Pause execution due to an uncaught exception.
|
| + void PauseException(const Instance& exc);
|
| +
|
| + // Pause execution due to a call to the debugger() function from
|
| + // Dart.
|
| + void PauseDeveloper(const String& msg);
|
|
|
| RawCode* GetPatchedStubAddress(uword breakpoint_address);
|
|
|
| @@ -606,9 +518,12 @@ class Debugger {
|
| kSingleStep
|
| };
|
|
|
| - static bool HasAnyEventHandler();
|
| - static bool HasDebugEventHandler();
|
| - void InvokeEventHandler(DebuggerEvent* event);
|
| + bool NeedsIsolateEvents();
|
| + bool NeedsDebugEvents();
|
| + void InvokeEventHandler(ServiceEvent* event);
|
| +
|
| + void SendBreakpointEvent(ServiceEvent::EventKind kind, Breakpoint* bpt);
|
| +
|
| bool IsAtAsyncJump(ActivationFrame* top_frame);
|
| void FindCompiledFunctions(const Script& script,
|
| TokenPosition start_pos,
|
| @@ -655,7 +570,6 @@ class Debugger {
|
| StackFrame* frame,
|
| const Code& code);
|
| static DebuggerStackTrace* CollectStackTrace();
|
| - void SignalBpResolved(Breakpoint *bpt);
|
| void SignalPausedEvent(ActivationFrame* top_frame,
|
| Breakpoint* bpt);
|
|
|
| @@ -671,7 +585,7 @@ class Debugger {
|
|
|
| // Handles any events which pause vm execution. Breakpoints,
|
| // interrupts, etc.
|
| - void Pause(DebuggerEvent* event);
|
| + void Pause(ServiceEvent* event);
|
|
|
| void HandleSteppingRequest(DebuggerStackTrace* stack_trace,
|
| bool skip_next_step = false);
|
| @@ -679,7 +593,6 @@ class Debugger {
|
| Isolate* isolate_;
|
| Dart_Port isolate_id_; // A unique ID for the isolate in the debugger.
|
| bool initialized_;
|
| - bool creation_message_sent_; // The creation message has been sent.
|
|
|
| // ID number generator.
|
| intptr_t next_id_;
|
| @@ -700,7 +613,7 @@ class Debugger {
|
| // is not paused, this is NULL. Note that the debugger can be
|
| // paused for breakpoints, isolate interruption, and (sometimes)
|
| // exceptions.
|
| - DebuggerEvent* pause_event_;
|
| + ServiceEvent* pause_event_;
|
|
|
| // An id -> object map. Valid only while IsPaused().
|
| RemoteObjectCache* obj_cache_;
|
|
|