Index: src/debug.cc |
diff --git a/src/debug.cc b/src/debug.cc |
index 058ec358735cf6a0152c6e8e99353d7f8851cfe0..ace8b557fff781ea2a720c689516675fb003f7dd 100644 |
--- a/src/debug.cc |
+++ b/src/debug.cc |
@@ -31,12 +31,22 @@ namespace v8 { |
namespace internal { |
Debug::Debug(Isolate* isolate) |
- : has_break_points_(false), |
- script_cache_(NULL), |
- debug_info_list_(NULL), |
+ : debug_context_(Handle<Context>()), |
+ event_listener_(Handle<Object>()), |
+ event_listener_data_(Handle<Object>()), |
+ message_handler_(NULL), |
+ command_received_(0), |
+ command_queue_(isolate->logger(), kQueueInitialSize), |
+ event_command_queue_(isolate->logger(), kQueueInitialSize), |
+ is_active_(false), |
+ ignore_debugger_(false), |
+ live_edit_enabled_(true), // TODO(yangguo): set to false by default. |
+ has_break_points_(false), |
disable_break_(false), |
break_on_exception_(false), |
break_on_uncaught_exception_(false), |
+ script_cache_(NULL), |
+ debug_info_list_(NULL), |
isolate_(isolate) { |
ThreadInit(); |
} |
@@ -596,9 +606,9 @@ Handle<FixedArray> ScriptCache::GetScripts() { |
void ScriptCache::ProcessCollectedScripts() { |
- Debugger* debugger = isolate_->debugger(); |
+ Debug* debug = isolate_->debug(); |
for (int i = 0; i < collected_scripts_.length(); i++) { |
- debugger->OnScriptCollected(collected_scripts_[i]); |
+ debug->OnScriptCollected(collected_scripts_[i]); |
} |
collected_scripts_.Clear(); |
} |
@@ -749,8 +759,8 @@ bool Debug::Load() { |
// Bail out if we're already in the process of compiling the native |
// JavaScript source code for the debugger. |
- if (isolate_->debugger()->ignore_debugger()) return false; |
- Debugger::IgnoreScope during_create(isolate_->debugger()); |
+ if (isolate_->debug()->ignore_debugger()) return false; |
+ Debug::IgnoreScope during_create(isolate_->debug()); |
// Disable breakpoints and interrupts while compiling and running the |
// debugger scripts including the context creation code. |
@@ -901,7 +911,7 @@ Object* Debug::Break(Arguments args) { |
PrepareStep(StepNext, step_count, StackFrame::NO_ID); |
} else { |
// Notify the debug event listeners. |
- isolate_->debugger()->OnDebugBreak(break_points_hit, false); |
+ OnDebugBreak(break_points_hit, false); |
} |
} else if (thread_local_.last_step_action_ != StepNone) { |
// Hold on to last step action as it is cleared by the call to |
@@ -2610,24 +2620,7 @@ void Debug::AfterGarbageCollection() { |
} |
-Debugger::Debugger(Isolate* isolate) |
- : event_listener_(Handle<Object>()), |
- event_listener_data_(Handle<Object>()), |
- is_active_(false), |
- ignore_debugger_(false), |
- live_edit_enabled_(true), |
- message_handler_(NULL), |
- command_queue_(isolate->logger(), kQueueInitialSize), |
- command_received_(0), |
- event_command_queue_(isolate->logger(), kQueueInitialSize), |
- isolate_(isolate) { |
-} |
- |
- |
-Debugger::~Debugger() {} |
- |
- |
-MaybeHandle<Object> Debugger::MakeJSObject( |
+MaybeHandle<Object> Debug::MakeJSObject( |
Vector<const char> constructor_name, |
int argc, |
Handle<Object> argv[]) { |
@@ -2649,7 +2642,7 @@ MaybeHandle<Object> Debugger::MakeJSObject( |
} |
-MaybeHandle<Object> Debugger::MakeExecutionState() { |
+MaybeHandle<Object> Debug::MakeExecutionState() { |
// Create the execution state object. |
Handle<Object> break_id = isolate_->factory()->NewNumberFromInt( |
isolate_->debug()->break_id()); |
@@ -2658,7 +2651,7 @@ MaybeHandle<Object> Debugger::MakeExecutionState() { |
} |
-MaybeHandle<Object> Debugger::MakeBreakEvent(Handle<Object> break_points_hit) { |
+MaybeHandle<Object> Debug::MakeBreakEvent(Handle<Object> break_points_hit) { |
Handle<Object> exec_state; |
if (!MakeExecutionState().ToHandle(&exec_state)) return MaybeHandle<Object>(); |
// Create the new break event object. |
@@ -2667,7 +2660,7 @@ MaybeHandle<Object> Debugger::MakeBreakEvent(Handle<Object> break_points_hit) { |
} |
-MaybeHandle<Object> Debugger::MakeExceptionEvent(Handle<Object> exception, |
+MaybeHandle<Object> Debug::MakeExceptionEvent(Handle<Object> exception, |
bool uncaught, |
Handle<Object> promise) { |
Handle<Object> exec_state; |
@@ -2681,7 +2674,7 @@ MaybeHandle<Object> Debugger::MakeExceptionEvent(Handle<Object> exception, |
} |
-MaybeHandle<Object> Debugger::MakeCompileEvent(Handle<Script> script, |
+MaybeHandle<Object> Debug::MakeCompileEvent(Handle<Script> script, |
bool before) { |
Handle<Object> exec_state; |
if (!MakeExecutionState().ToHandle(&exec_state)) return MaybeHandle<Object>(); |
@@ -2694,7 +2687,7 @@ MaybeHandle<Object> Debugger::MakeCompileEvent(Handle<Script> script, |
} |
-MaybeHandle<Object> Debugger::MakeScriptCollectedEvent(int id) { |
+MaybeHandle<Object> Debug::MakeScriptCollectedEvent(int id) { |
Handle<Object> exec_state; |
if (!MakeExecutionState().ToHandle(&exec_state)) return MaybeHandle<Object>(); |
// Create the script collected event object. |
@@ -2706,13 +2699,13 @@ MaybeHandle<Object> Debugger::MakeScriptCollectedEvent(int id) { |
} |
-void Debugger::OnException(Handle<Object> exception, bool uncaught) { |
+void Debug::OnException(Handle<Object> exception, bool uncaught) { |
HandleScope scope(isolate_); |
Debug* debug = isolate_->debug(); |
// Bail out based on state or if there is no listener for this event |
if (debug->InDebugger()) return; |
- if (!Debugger::EventActive()) return; |
+ if (!EventActive()) return; |
Handle<Object> promise = debug->GetPromiseForUncaughtException(); |
uncaught |= !promise->IsUndefined(); |
@@ -2748,18 +2741,15 @@ void Debugger::OnException(Handle<Object> exception, bool uncaught) { |
} |
-void Debugger::OnDebugBreak(Handle<Object> break_points_hit, |
+void Debug::OnDebugBreak(Handle<Object> break_points_hit, |
bool auto_continue) { |
HandleScope scope(isolate_); |
// Debugger has already been entered by caller. |
- ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); |
+ ASSERT(isolate_->context() == *debug_context()); |
// Bail out if there is no listener for this event |
- if (!Debugger::EventActive()) return; |
- |
- // Debugger must be entered in advance. |
- ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); |
+ if (!EventActive()) return; |
// Create the event data object. |
Handle<Object> event_data; |
@@ -2773,11 +2763,11 @@ void Debugger::OnDebugBreak(Handle<Object> break_points_hit, |
} |
-void Debugger::OnBeforeCompile(Handle<Script> script) { |
+void Debug::OnBeforeCompile(Handle<Script> script) { |
HandleScope scope(isolate_); |
// Bail out based on state or if there is no listener for this event |
- if (isolate_->debug()->InDebugger()) return; |
+ if (InDebugger()) return; |
if (!EventActive()) return; |
// Enter the debugger. |
@@ -2797,19 +2787,18 @@ void Debugger::OnBeforeCompile(Handle<Script> script) { |
// Handle debugger actions when a new script is compiled. |
-void Debugger::OnAfterCompile(Handle<Script> script, |
+void Debug::OnAfterCompile(Handle<Script> script, |
AfterCompileFlags after_compile_flags) { |
HandleScope scope(isolate_); |
- Debug* debug = isolate_->debug(); |
// Add the newly compiled script to the script cache. |
- debug->AddScriptToScriptCache(script); |
+ AddScriptToScriptCache(script); |
// No more to do if not debugging. |
- if (!Debugger::EventActive()) return; |
+ if (!EventActive()) return; |
// Store whether in debugger before entering debugger. |
- bool in_debugger = debug->InDebugger(); |
+ bool in_debugger = InDebugger(); |
// Enter the debugger. |
EnterDebugger debugger(isolate_); |
@@ -2822,7 +2811,7 @@ void Debugger::OnAfterCompile(Handle<Script> script, |
Handle<String> update_script_break_points_string = |
isolate_->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("UpdateScriptBreakPoints")); |
- Handle<GlobalObject> debug_global(debug->debug_context()->global_object()); |
+ Handle<GlobalObject> debug_global(debug_context()->global_object()); |
Handle<Object> update_script_break_points = |
Object::GetProperty( |
debug_global, update_script_break_points_string).ToHandleChecked(); |
@@ -2856,12 +2845,12 @@ void Debugger::OnAfterCompile(Handle<Script> script, |
} |
-void Debugger::OnScriptCollected(int id) { |
+void Debug::OnScriptCollected(int id) { |
HandleScope scope(isolate_); |
// No more to do if not debugging. |
- if (isolate_->debug()->InDebugger()) return; |
- if (!Debugger::EventActive()) return; |
+ if (InDebugger()) return; |
+ if (!EventActive()) return; |
// Enter the debugger. |
EnterDebugger debugger(isolate_); |
@@ -2879,15 +2868,13 @@ void Debugger::OnScriptCollected(int id) { |
} |
-void Debugger::ProcessDebugEvent(v8::DebugEvent event, |
- Handle<JSObject> event_data, |
- bool auto_continue) { |
+void Debug::ProcessDebugEvent(v8::DebugEvent event, |
+ Handle<JSObject> event_data, |
+ bool auto_continue) { |
HandleScope scope(isolate_); |
// Clear any pending debug break if this is a real break. |
- if (!auto_continue) { |
- isolate_->debug()->set_has_pending_interrupt(false); |
- } |
+ if (!auto_continue) set_has_pending_interrupt(false); |
// Create the execution state. |
Handle<Object> exec_state; |
@@ -2923,10 +2910,10 @@ void Debugger::ProcessDebugEvent(v8::DebugEvent event, |
} |
-void Debugger::CallEventCallback(v8::DebugEvent event, |
- Handle<Object> exec_state, |
- Handle<Object> event_data, |
- v8::Debug::ClientData* client_data) { |
+void Debug::CallEventCallback(v8::DebugEvent event, |
+ Handle<Object> exec_state, |
+ Handle<Object> event_data, |
+ v8::Debug::ClientData* client_data) { |
if (event_listener_->IsForeign()) { |
CallCEventCallback(event, exec_state, event_data, client_data); |
} else { |
@@ -2935,10 +2922,10 @@ void Debugger::CallEventCallback(v8::DebugEvent event, |
} |
-void Debugger::CallCEventCallback(v8::DebugEvent event, |
- Handle<Object> exec_state, |
- Handle<Object> event_data, |
- v8::Debug::ClientData* client_data) { |
+void Debug::CallCEventCallback(v8::DebugEvent event, |
+ Handle<Object> exec_state, |
+ Handle<Object> event_data, |
+ v8::Debug::ClientData* client_data) { |
Handle<Foreign> callback_obj(Handle<Foreign>::cast(event_listener_)); |
v8::Debug::EventCallback2 callback = |
FUNCTION_CAST<v8::Debug::EventCallback2>( |
@@ -2953,9 +2940,9 @@ void Debugger::CallCEventCallback(v8::DebugEvent event, |
} |
-void Debugger::CallJSEventCallback(v8::DebugEvent event, |
- Handle<Object> exec_state, |
- Handle<Object> event_data) { |
+void Debug::CallJSEventCallback(v8::DebugEvent event, |
+ Handle<Object> exec_state, |
+ Handle<Object> event_data) { |
ASSERT(event_listener_->IsJSFunction()); |
Handle<JSFunction> fun(Handle<JSFunction>::cast(event_listener_)); |
@@ -2972,17 +2959,17 @@ void Debugger::CallJSEventCallback(v8::DebugEvent event, |
} |
-Handle<Context> Debugger::GetDebugContext() { |
+Handle<Context> Debug::GetDebugContext() { |
EnterDebugger debugger(isolate_); |
// The global handle may be destroyed soon after. Return it reboxed. |
- return handle(*isolate_->debug()->debug_context(), isolate_); |
+ return handle(*debug_context(), isolate_); |
} |
-void Debugger::NotifyMessageHandler(v8::DebugEvent event, |
- Handle<JSObject> exec_state, |
- Handle<JSObject> event_data, |
- bool auto_continue) { |
+void Debug::NotifyMessageHandler(v8::DebugEvent event, |
+ Handle<JSObject> exec_state, |
+ Handle<JSObject> event_data, |
+ bool auto_continue) { |
ASSERT(is_active_); |
HandleScope scope(isolate_); |
// Process the individual events. |
@@ -3012,7 +2999,7 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event, |
// The debug command interrupt flag might have been set when the command was |
// added. It should be enough to clear the flag only once while we are in the |
// debugger. |
- ASSERT(isolate_->debug()->InDebugger()); |
+ ASSERT(InDebugger()); |
isolate_->stack_guard()->ClearDebugCommand(); |
// Notify the debugger that a debug event has occurred unless auto continue is |
@@ -3057,7 +3044,7 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event, |
CommandMessage command = command_queue_.Get(); |
isolate_->logger()->DebugTag( |
"Got request from command queue, in interactive loop."); |
- if (!Debugger::is_active()) { |
+ if (!is_active()) { |
// Delete command text and user data. |
command.Dispose(); |
return; |
@@ -3110,8 +3097,8 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event, |
} |
-void Debugger::SetEventListener(Handle<Object> callback, |
- Handle<Object> data) { |
+void Debug::SetEventListener(Handle<Object> callback, |
+ Handle<Object> data) { |
GlobalHandles* global_handles = isolate_->global_handles(); |
// Remove existing entry. |
@@ -3131,10 +3118,10 @@ void Debugger::SetEventListener(Handle<Object> callback, |
} |
-void Debugger::SetMessageHandler(v8::Debug::MessageHandler handler) { |
+void Debug::SetMessageHandler(v8::Debug::MessageHandler handler) { |
message_handler_ = handler; |
UpdateState(); |
- if (handler == NULL && isolate_->debug()->InDebugger()) { |
+ if (handler == NULL && InDebugger()) { |
// Send an empty command to the debugger if in a break to make JavaScript |
// run again if the debugger is closed. |
EnqueueCommandMessage(Vector<const uint16_t>::empty()); |
@@ -3142,29 +3129,29 @@ void Debugger::SetMessageHandler(v8::Debug::MessageHandler handler) { |
} |
-void Debugger::UpdateState() { |
- Debug* debug = isolate_->debug(); |
+ |
+void Debug::UpdateState() { |
bool activate = message_handler_ != NULL || |
!event_listener_.is_null() || |
- debug->InDebugger(); |
+ InDebugger(); |
if (!is_active_ && activate) { |
// Note that the debug context could have already been loaded to |
// bootstrap test cases. |
isolate_->compilation_cache()->Disable(); |
- activate = debug->Load(); |
- } else if (debug->IsLoaded() && !activate) { |
+ activate = Load(); |
+ } else if (IsLoaded() && !activate) { |
isolate_->compilation_cache()->Enable(); |
- debug->Unload(); |
+ Unload(); |
} |
is_active_ = activate; |
// At this point the debug context is loaded iff the debugger is active. |
- ASSERT(debug->IsLoaded() == is_active_); |
+ ASSERT(IsLoaded() == is_active_); |
} |
// Calls the registered debug message handler. This callback is part of the |
// public API. |
-void Debugger::InvokeMessageHandler(MessageImpl message) { |
+void Debug::InvokeMessageHandler(MessageImpl message) { |
if (message_handler_ != NULL) message_handler_(message); |
} |
@@ -3173,8 +3160,8 @@ void Debugger::InvokeMessageHandler(MessageImpl message) { |
// a copy of the command string managed by the debugger. Up to this |
// point, the command data was managed by the API client. Called |
// by the API client thread. |
-void Debugger::EnqueueCommandMessage(Vector<const uint16_t> command, |
- v8::Debug::ClientData* client_data) { |
+void Debug::EnqueueCommandMessage(Vector<const uint16_t> command, |
+ v8::Debug::ClientData* client_data) { |
// Need to cast away const. |
CommandMessage message = CommandMessage::New( |
Vector<uint16_t>(const_cast<uint16_t*>(command.start()), |
@@ -3191,24 +3178,21 @@ void Debugger::EnqueueCommandMessage(Vector<const uint16_t> command, |
} |
-bool Debugger::HasCommands() { |
+bool Debug::HasCommands() { |
return !command_queue_.IsEmpty(); |
} |
-void Debugger::EnqueueDebugCommand(v8::Debug::ClientData* client_data) { |
+void Debug::EnqueueDebugCommand(v8::Debug::ClientData* client_data) { |
CommandMessage message = CommandMessage::New(Vector<uint16_t>(), client_data); |
event_command_queue_.Put(message); |
// Set the debug command break flag to have the command processed. |
- if (!isolate_->debug()->InDebugger()) { |
- isolate_->stack_guard()->RequestDebugCommand(); |
- } |
+ if (!InDebugger()) isolate_->stack_guard()->RequestDebugCommand(); |
} |
-MaybeHandle<Object> Debugger::Call(Handle<JSFunction> fun, |
- Handle<Object> data) { |
+MaybeHandle<Object> Debug::Call(Handle<JSFunction> fun, Handle<Object> data) { |
// Enter the debugger. |
EnterDebugger debugger(isolate_); |
if (debugger.FailedToEnter()) { |
@@ -3225,8 +3209,7 @@ MaybeHandle<Object> Debugger::Call(Handle<JSFunction> fun, |
return Execution::Call( |
isolate_, |
fun, |
- Handle<Object>(isolate_->debug()->debug_context_->global_proxy(), |
- isolate_), |
+ Handle<Object>(debug_context()->global_proxy(), isolate_), |
ARRAY_SIZE(argv), |
argv); |
} |
@@ -3251,7 +3234,7 @@ EnterDebugger::EnterDebugger(Isolate* isolate) |
has_js_frames_ = !it.done(); |
debug->NewBreak(has_js_frames_ ? it.frame()->id() : StackFrame::NO_ID); |
- isolate_->debugger()->UpdateState(); |
+ debug->UpdateState(); |
// Make sure that debugger is loaded and enter the debugger context. |
// The previous context is kept in save_. |
load_failed_ = !debug->IsLoaded(); |
@@ -3277,7 +3260,7 @@ EnterDebugger::~EnterDebugger() { |
// If there are commands in the queue when leaving the debugger request |
// that these commands are processed. |
- if (isolate_->debugger()->HasCommands()) { |
+ if (debug->HasCommands()) { |
isolate_->stack_guard()->RequestDebugCommand(); |
} |
} |
@@ -3285,7 +3268,7 @@ EnterDebugger::~EnterDebugger() { |
// Leaving this debugger entry. |
debug->set_debugger_entry(prev_); |
- isolate_->debugger()->UpdateState(); |
+ debug->UpdateState(); |
} |