Index: src/debug.h |
diff --git a/src/debug.h b/src/debug.h |
index e63af4aa097b991efb5214e7f9a1399c89c85028..950570db4fa34bed0060f777d9472ee7864f844a 100644 |
--- a/src/debug.h |
+++ b/src/debug.h |
@@ -351,70 +351,52 @@ class LockingCommandMessageQueue BASE_EMBEDDED { |
// DebugInfo. |
class Debug { |
public: |
- void OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue); |
- void OnException(Handle<Object> exception, bool uncaught); |
- void OnBeforeCompile(Handle<Script> script); |
- |
enum AfterCompileFlags { |
NO_AFTER_COMPILE_FLAGS, |
SEND_WHEN_DEBUGGING |
}; |
+ |
+ // Debug event triggers. |
+ void OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue); |
+ void OnException(Handle<Object> exception, bool uncaught); |
+ void OnBeforeCompile(Handle<Script> script); |
void OnAfterCompile(Handle<Script> script, |
AfterCompileFlags after_compile_flags); |
void OnScriptCollected(int id); |
+ // API facing. |
void SetEventListener(Handle<Object> callback, Handle<Object> data); |
void SetMessageHandler(v8::Debug::MessageHandler handler); |
- |
- // Add a debugger command to the command queue. |
void EnqueueCommandMessage(Vector<const uint16_t> command, |
v8::Debug::ClientData* client_data = NULL); |
- |
- // Check whether there are commands in the command queue. |
- bool HasCommands(); |
- |
// Enqueue a debugger command to the command queue for event listeners. |
void EnqueueDebugCommand(v8::Debug::ClientData* client_data = NULL); |
- |
MUST_USE_RESULT MaybeHandle<Object> Call(Handle<JSFunction> fun, |
Handle<Object> data); |
- |
Handle<Context> GetDebugContext(); |
+ void DebugBreakHelper(); |
+ void ProcessDebugMessages(bool debug_command_only); |
- bool ignore_debugger() const { return ignore_debugger_; } |
+ // Flags and states. |
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_; } |
- |
- class IgnoreScope { |
- public: |
- explicit IgnoreScope(Debug* debug) |
- : debug_(debug), |
- old_state_(debug->ignore_debugger_) { |
- debug_->ignore_debugger_ = true; |
- } |
- |
- ~IgnoreScope() { |
- debug_->ignore_debugger_ = old_state_; |
- } |
- |
- private: |
- Debug* debug_; |
- bool old_state_; |
- DISALLOW_COPY_AND_ASSIGN(IgnoreScope); |
- }; |
+ inline bool is_active() const { return is_active_; } |
+ inline bool is_loaded() const { return !debug_context_.is_null(); } |
+ inline bool has_break_points() const { return has_break_points_; } |
+ inline bool is_entered() const { |
+ return thread_local_.debugger_entry_ != NULL; |
+ } |
+ void set_disable_break(bool v) { break_disabled_ = v; } |
bool Load(); |
- void Unload(); |
- bool IsLoaded() { return !debug_context_.is_null(); } |
- bool InDebugger() { return thread_local_.debugger_entry_ != NULL; } |
void Break(Arguments args, JavaScriptFrame*); |
void SetAfterBreakTarget(JavaScriptFrame* frame); |
+ |
bool SetBreakPoint(Handle<JSFunction> function, |
Handle<Object> break_point_object, |
int* source_position); |
@@ -443,6 +425,12 @@ class Debug { |
bool IsStepping() { return thread_local_.step_count_ > 0; } |
bool StepNextContinue(BreakLocationIterator* break_location_iterator, |
JavaScriptFrame* frame); |
+ |
+ // Returns whether the operation succeeded. Compilation can only be triggered |
+ // if a valid closure is passed as the second argument, otherwise the shared |
+ // function needs to be compiled already. |
+ bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared, |
+ Handle<JSFunction> function); |
static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared); |
static bool HasDebugInfo(Handle<SharedFunctionInfo> shared); |
@@ -451,23 +439,16 @@ class Debug { |
// This function is used in FunctionNameUsing* tests. |
Object* FindSharedFunctionInfoInScript(Handle<Script> script, int position); |
- // Returns whether the operation succeeded. Compilation can only be triggered |
- // if a valid closure is passed as the second argument, otherwise the shared |
- // function needs to be compiled already. |
- bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared, |
- Handle<JSFunction> function); |
// Returns true if the current stub call is patched to call the debugger. |
static bool IsDebugBreak(Address addr); |
// Returns true if the current return statement has been patched to be |
// a debugger breakpoint. |
static bool IsDebugBreakAtReturn(RelocInfo* rinfo); |
- |
// Check whether a code stub with the specified major key is a possible break |
// point location. |
static bool IsSourceBreakStub(Code* code); |
static bool IsBreakStub(Code* code); |
- |
// Find the builtin to use for invoking the debug break |
static Handle<Code> FindDebugBreak(Handle<Code> code, RelocInfo::Mode mode); |
@@ -484,14 +465,7 @@ class Debug { |
// Check whether this frame is just about to return. |
bool IsBreakAtReturn(JavaScriptFrame* frame); |
- // Fast check to see if any break points are active. |
- inline bool has_break_points() { return has_break_points_; } |
- |
- void NewBreak(StackFrame::Id break_frame_id); |
- void SetBreak(StackFrame::Id break_frame_id, int break_id); |
- StackFrame::Id break_frame_id() { |
- return thread_local_.break_frame_id_; |
- } |
+ StackFrame::Id break_frame_id() { return thread_local_.break_frame_id_; } |
int break_id() { return thread_local_.break_id_; } |
bool StepInActive() { return thread_local_.step_into_fp_ != 0; } |
@@ -505,12 +479,7 @@ class Debug { |
bool StepOutActive() { return thread_local_.step_out_fp_ != 0; } |
Address step_out_fp() { return thread_local_.step_out_fp_; } |
- EnterDebugger* debugger_entry() { |
- return thread_local_.debugger_entry_; |
- } |
- void set_debugger_entry(EnterDebugger* entry) { |
- thread_local_.debugger_entry_ = entry; |
- } |
+ EnterDebugger* debugger_entry() { return thread_local_.debugger_entry_; } |
// Check whether any of the specified interrupts are pending. |
bool has_pending_interrupt() { |
@@ -522,12 +491,6 @@ class Debug { |
thread_local_.has_pending_interrupt_ = value; |
} |
- // Getter and setter for the disable break state. |
- bool disable_break() { return disable_break_; } |
- void set_disable_break(bool disable_break) { |
- disable_break_ = disable_break; |
- } |
- |
// Getters for the current exception break state. |
bool break_on_exception() { return break_on_exception_; } |
bool break_on_uncaught_exception() { |
@@ -563,9 +526,6 @@ class Debug { |
static int ArchiveSpacePerThread(); |
void FreeThreadResources() { } |
- // Mirror cache handling. |
- void ClearMirrorCache(); |
- |
// Script cache handling. |
void CreateScriptCache(); |
void DestroyScriptCache(); |
@@ -581,8 +541,22 @@ class Debug { |
private: |
explicit Debug(Isolate* isolate); |
+ void UpdateState(); |
+ void Unload(); |
+ |
+ // Mirror cache handling. |
+ void ClearMirrorCache(); |
+ |
+ void SetNextBreakId() { |
+ thread_local_.break_id_ = ++thread_local_.break_count_; |
+ } |
+ |
+ // Check whether there are commands in the command queue. |
+ inline bool has_commands() const { return !command_queue_.IsEmpty(); } |
+ |
+ // Constructors for debug event objects. |
MUST_USE_RESULT MaybeHandle<Object> MakeJSObject( |
- Vector<const char> constructor_name, |
+ const char* constructor_name, |
int argc, |
Handle<Object> argv[]); |
MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState(); |
@@ -596,18 +570,11 @@ class Debug { |
Handle<Script> script, bool before); |
MUST_USE_RESULT MaybeHandle<Object> MakeScriptCollectedEvent(int id); |
+ |
void CallEventCallback(v8::DebugEvent event, |
Handle<Object> exec_state, |
Handle<Object> event_data, |
v8::Debug::ClientData* client_data); |
- void CallCEventCallback(v8::DebugEvent event, |
- Handle<Object> exec_state, |
- Handle<Object> event_data, |
- v8::Debug::ClientData* client_data); |
- void CallJSEventCallback(v8::DebugEvent event, |
- Handle<Object> exec_state, |
- Handle<Object> event_data); |
- void UpdateState(); |
void ProcessDebugEvent(v8::DebugEvent event, |
Handle<JSObject> event_data, |
@@ -624,7 +591,7 @@ class Debug { |
// 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_; |
+ return !is_suppressed_ && is_active_; |
} |
static bool CompileDebuggerScript(Isolate* isolate, int index); |
@@ -673,10 +640,10 @@ class Debug { |
LockingCommandMessageQueue event_command_queue_; |
bool is_active_; |
- bool ignore_debugger_; |
+ bool is_suppressed_; |
bool live_edit_enabled_; |
bool has_break_points_; |
- bool disable_break_; |
+ bool break_disabled_; |
bool break_on_exception_; |
bool break_on_uncaught_exception_; |
@@ -753,6 +720,8 @@ class Debug { |
friend class Isolate; |
friend class EnterDebugger; |
friend class FrameDropper; |
+ friend class DisableBreak; |
+ friend class SuppressDebug; |
DISALLOW_COPY_AND_ASSIGN(Debug); |
}; |
@@ -793,20 +762,31 @@ class EnterDebugger BASE_EMBEDDED { |
// Stack allocated class for disabling break. |
class DisableBreak BASE_EMBEDDED { |
public: |
- explicit DisableBreak(Isolate* isolate, bool disable_break) |
- : isolate_(isolate) { |
- prev_disable_break_ = isolate_->debug()->disable_break(); |
- isolate_->debug()->set_disable_break(disable_break); |
+ explicit DisableBreak(Debug* debug, bool disable_break) |
+ : debug_(debug), old_state_(debug->break_disabled_) { |
+ debug_->break_disabled_ = disable_break; |
} |
- ~DisableBreak() { |
- isolate_->debug()->set_disable_break(prev_disable_break_); |
+ ~DisableBreak() { debug_->break_disabled_ = old_state_; } |
+ |
+ private: |
+ Debug* debug_; |
+ bool old_state_; |
+ DISALLOW_COPY_AND_ASSIGN(DisableBreak); |
+}; |
+ |
+ |
+class SuppressDebug BASE_EMBEDDED { |
+ public: |
+ explicit SuppressDebug(Debug* debug) |
+ : debug_(debug), old_state_(debug->is_suppressed_) { |
+ debug_->is_suppressed_ = true; |
} |
+ ~SuppressDebug() { debug_->is_suppressed_ = old_state_; } |
private: |
- Isolate* isolate_; |
- // The previous state of the disable break used to restore the value when this |
- // object is destructed. |
- bool prev_disable_break_; |
+ Debug* debug_; |
+ bool old_state_; |
+ DISALLOW_COPY_AND_ASSIGN(SuppressDebug); |
}; |