Index: src/debug.h |
diff --git a/src/debug.h b/src/debug.h |
index 80e6970e34caccbceb0d0f499443b9b6f7bd1dc2..35b29c0d22c6d1d0f84af9724bc7c28086b16f33 100644 |
--- a/src/debug.h |
+++ b/src/debug.h |
@@ -490,6 +490,7 @@ class Debug { |
private: |
explicit Debug(Isolate* isolate); |
+ ~Debug(); |
static bool CompileDebuggerScript(Isolate* isolate, int index); |
void ClearOneShot(); |
@@ -742,6 +743,25 @@ class LockingCommandMessageQueue BASE_EMBEDDED { |
class Debugger { |
public: |
+ ~Debugger(); |
+ |
+ void DebugRequest(const uint16_t* json_request, int length); |
+ |
+ MUST_USE_RESULT MaybeHandle<Object> MakeJSObject( |
+ Vector<const char> constructor_name, |
+ int argc, |
+ Handle<Object> argv[]); |
+ MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); |
+ MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( |
+ Handle<Object> break_points_hit); |
+ MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( |
+ Handle<Object> exception, |
+ bool uncaught, |
+ Handle<Object> promise); |
+ MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent( |
+ Handle<Script> script, bool before); |
+ MUST_USE_RESULT MaybeHandle<Object> MakeScriptCollectedEvent(int id); |
+ |
void OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue); |
void OnException(Handle<Object> exception, bool uncaught); |
void OnBeforeCompile(Handle<Script> script); |
@@ -753,7 +773,13 @@ class Debugger { |
void OnAfterCompile(Handle<Script> script, |
AfterCompileFlags after_compile_flags); |
void OnScriptCollected(int id); |
- |
+ void ProcessDebugEvent(v8::DebugEvent event, |
+ Handle<JSObject> event_data, |
+ bool auto_continue); |
+ void NotifyMessageHandler(v8::DebugEvent event, |
+ Handle<JSObject> exec_state, |
+ Handle<JSObject> event_data, |
+ bool auto_continue); |
void SetEventListener(Handle<Object> callback, Handle<Object> data); |
void SetMessageHandler(v8::Debug::MessageHandler handler); |
@@ -772,13 +798,36 @@ class Debugger { |
Handle<Context> GetDebugContext(); |
+ // Unload the debugger if possible. Only called when no debugger is currently |
+ // active. |
+ void UnloadDebugger(); |
+ friend void ForceUnloadDebugger(); // In test-debug.cc |
+ |
+ inline bool EventActive() { |
+ LockGuard<RecursiveMutex> lock_guard(&debugger_access_); |
+ |
+ // Check whether the message handler was been cleared. |
+ // TODO(yangguo): handle loading and unloading of the debugger differently. |
+ if (debugger_unload_pending_) { |
+ if (isolate_->debug()->debugger_entry() == NULL) { |
+ UnloadDebugger(); |
+ } |
+ } |
+ |
+ // Currently argument event is not used. |
+ return !ignore_debugger_ && is_active_; |
+ } |
+ |
bool ignore_debugger() const { return ignore_debugger_; } |
void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; } |
bool live_edit_enabled() const { |
return FLAG_enable_liveedit && live_edit_enabled_ ; |
} |
- bool is_active() { return is_active_; } |
+ bool is_active() { |
+ LockGuard<RecursiveMutex> lock_guard(&debugger_access_); |
+ return is_active_; |
+ } |
class IgnoreScope { |
public: |
@@ -800,22 +849,6 @@ class Debugger { |
private: |
explicit Debugger(Isolate* isolate); |
- ~Debugger(); |
- |
- MUST_USE_RESULT MaybeHandle<Object> MakeJSObject( |
- Vector<const char> constructor_name, |
- int argc, |
- Handle<Object> argv[]); |
- MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); |
- MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent( |
- Handle<Object> break_points_hit); |
- MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent( |
- Handle<Object> exception, |
- bool uncaught, |
- Handle<Object> promise); |
- MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent( |
- Handle<Script> script, bool before); |
- MUST_USE_RESULT MaybeHandle<Object> MakeScriptCollectedEvent(int id); |
void CallEventCallback(v8::DebugEvent event, |
Handle<Object> exec_state, |
@@ -828,31 +861,18 @@ class Debugger { |
void CallJSEventCallback(v8::DebugEvent event, |
Handle<Object> exec_state, |
Handle<Object> event_data); |
- void UpdateState(); |
- |
- void ProcessDebugEvent(v8::DebugEvent event, |
- Handle<JSObject> event_data, |
- bool auto_continue); |
- void NotifyMessageHandler(v8::DebugEvent event, |
- Handle<JSObject> exec_state, |
- Handle<JSObject> event_data, |
- bool auto_continue); |
+ void ListenersChanged(); |
// Invoke the message handler function. |
void InvokeMessageHandler(MessageImpl message); |
- inline bool EventActive() { |
- // Check whether the message handler was been cleared. |
- // TODO(yangguo): handle loading and unloading of the debugger differently. |
- // Currently argument event is not used. |
- return !ignore_debugger_ && is_active_; |
- } |
- |
+ RecursiveMutex debugger_access_; // Mutex guarding debugger variables. |
Handle<Object> event_listener_; // Global handle to listener. |
Handle<Object> event_listener_data_; |
bool is_active_; |
bool ignore_debugger_; // Are we temporarily ignoring the debugger? |
bool live_edit_enabled_; // Enable LiveEdit. |
+ bool never_unload_debugger_; // Can we unload the debugger? |
v8::Debug::MessageHandler message_handler_; |
bool debugger_unload_pending_; // Was message handler cleared? |
@@ -891,7 +911,8 @@ class EnterDebugger BASE_EMBEDDED { |
private: |
Isolate* isolate_; |
EnterDebugger* prev_; // Previous debugger entry if entered recursively. |
- bool has_js_frames_; // Were there any JavaScript frames? |
+ JavaScriptFrameIterator it_; |
+ const bool has_js_frames_; // Were there any JavaScript frames? |
StackFrame::Id break_frame_id_; // Previous break frame id. |
int break_id_; // Previous break id. |
bool load_failed_; // Did the debugger fail to load? |