diff options
Diffstat (limited to 'deps/v8/src/debug.cc')
-rw-r--r-- | deps/v8/src/debug.cc | 179 |
1 files changed, 81 insertions, 98 deletions
diff --git a/deps/v8/src/debug.cc b/deps/v8/src/debug.cc index 990a9a5c7b..0496b8cb00 100644 --- a/deps/v8/src/debug.cc +++ b/deps/v8/src/debug.cc @@ -86,8 +86,9 @@ static void PrintLn(v8::Local<v8::Value> value) { } -static Handle<Code> ComputeCallDebugPrepareStepIn(int argc, Code::Kind kind) { - Isolate* isolate = Isolate::Current(); +static Handle<Code> ComputeCallDebugPrepareStepIn(Isolate* isolate, + int argc, + Code::Kind kind) { return isolate->stub_cache()->ComputeCallDebugPrepareStepIn(argc, kind); } @@ -403,11 +404,11 @@ void BreakLocationIterator::ClearDebugBreak() { bool BreakLocationIterator::IsStepInLocation(Isolate* isolate) { - if (RelocInfo::IsConstructCall(rmode())) { + if (RelocInfo::IsConstructCall(original_rmode())) { return true; } else if (RelocInfo::IsCodeTarget(rmode())) { HandleScope scope(debug_info_->GetIsolate()); - Address target = rinfo()->target_address(); + Address target = original_rinfo()->target_address(); Handle<Code> target_code(Code::GetCodeFromTargetAddress(target)); if (target_code->kind() == Code::STUB) { return target_code->major_key() == CodeStub::CallFunction; @@ -433,7 +434,7 @@ void BreakLocationIterator::PrepareStepIn(Isolate* isolate) { // the call in the original code as it is the code there that will be // executed in place of the debug break call. Handle<Code> stub = ComputeCallDebugPrepareStepIn( - target_code->arguments_count(), target_code->kind()); + isolate, target_code->arguments_count(), target_code->kind()); if (IsDebugBreak()) { original_rinfo()->set_target_address(stub->entry()); } else { @@ -633,7 +634,7 @@ const int Debug::kFrameDropperFrameSize = 4; void ScriptCache::Add(Handle<Script> script) { - GlobalHandles* global_handles = Isolate::Current()->global_handles(); + GlobalHandles* global_handles = isolate_->global_handles(); // Create an entry in the hash map for the script. int id = script->id()->value(); HashMap::Entry* entry = @@ -655,7 +656,7 @@ void ScriptCache::Add(Handle<Script> script) { Handle<FixedArray> ScriptCache::GetScripts() { - Factory* factory = Isolate::Current()->factory(); + Factory* factory = isolate_->factory(); Handle<FixedArray> instances = factory->NewFixedArray(occupancy()); int count = 0; for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) { @@ -670,7 +671,7 @@ Handle<FixedArray> ScriptCache::GetScripts() { void ScriptCache::ProcessCollectedScripts() { - Debugger* debugger = Isolate::Current()->debugger(); + Debugger* debugger = isolate_->debugger(); for (int i = 0; i < collected_scripts_.length(); i++) { debugger->OnScriptCollected(collected_scripts_[i]); } @@ -679,7 +680,7 @@ void ScriptCache::ProcessCollectedScripts() { void ScriptCache::Clear() { - GlobalHandles* global_handles = Isolate::Current()->global_handles(); + GlobalHandles* global_handles = isolate_->global_handles(); // Iterate the script cache to get rid of all the weak handles. for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) { ASSERT(entry != NULL); @@ -708,7 +709,7 @@ void ScriptCache::HandleWeakScript(v8::Isolate* isolate, script_cache->collected_scripts_.Add(id); // Clear the weak handle. - obj->Dispose(isolate); + obj->Dispose(); } @@ -750,7 +751,7 @@ void Debug::HandleWeakDebugInfo(v8::Isolate* isolate, DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { - GlobalHandles* global_handles = Isolate::Current()->global_handles(); + GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles(); // Globalize the request debug info object and make it weak. debug_info_ = Handle<DebugInfo>::cast( (global_handles->Create(debug_info))); @@ -761,13 +762,12 @@ DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { DebugInfoListNode::~DebugInfoListNode() { - Isolate::Current()->global_handles()->Destroy( + debug_info_->GetIsolate()->global_handles()->Destroy( reinterpret_cast<Object**>(debug_info_.location())); } -bool Debug::CompileDebuggerScript(int index) { - Isolate* isolate = Isolate::Current(); +bool Debug::CompileDebuggerScript(Isolate* isolate, int index) { Factory* factory = isolate->factory(); HandleScope scope(isolate); @@ -824,7 +824,7 @@ bool Debug::CompileDebuggerScript(int index) { ASSERT(!isolate->has_pending_exception()); if (!exception.is_null()) { isolate->set_pending_exception(*exception); - MessageHandler::ReportMessage(Isolate::Current(), NULL, message); + MessageHandler::ReportMessage(isolate, NULL, message); isolate->clear_pending_exception(); } return false; @@ -852,7 +852,7 @@ bool Debug::Load() { // Disable breakpoints and interrupts while compiling and running the // debugger scripts including the context creation code. - DisableBreak disable(true); + DisableBreak disable(isolate_, true); PostponeInterruptsScope postpone(isolate_); // Create the debugger context. @@ -886,12 +886,12 @@ bool Debug::Load() { // Compile the JavaScript for the debugger in the debugger context. debugger->set_compiling_natives(true); bool caught_exception = - !CompileDebuggerScript(Natives::GetIndex("mirror")) || - !CompileDebuggerScript(Natives::GetIndex("debug")); + !CompileDebuggerScript(isolate_, Natives::GetIndex("mirror")) || + !CompileDebuggerScript(isolate_, Natives::GetIndex("debug")); if (FLAG_enable_liveedit) { caught_exception = caught_exception || - !CompileDebuggerScript(Natives::GetIndex("liveedit")); + !CompileDebuggerScript(isolate_, Natives::GetIndex("liveedit")); } debugger->set_compiling_natives(false); @@ -958,7 +958,7 @@ Object* Debug::Break(Arguments args) { } // Enter the debugger. - EnterDebugger debugger; + EnterDebugger debugger(isolate_); if (debugger.FailedToEnter()) { return heap->undefined_value(); } @@ -1017,7 +1017,7 @@ Object* Debug::Break(Arguments args) { // Clear queue thread_local_.queued_step_count_ = 0; - PrepareStep(StepNext, step_count); + PrepareStep(StepNext, step_count, StackFrame::NO_ID); } else { // Notify the debug event listeners. isolate_->debugger()->OnDebugBreak(break_points_hit, false); @@ -1055,7 +1055,7 @@ Object* Debug::Break(Arguments args) { ClearStepping(); // Set up for the remaining steps. - PrepareStep(step_action, step_count); + PrepareStep(step_action, step_count, StackFrame::NO_ID); } if (thread_local_.frame_drop_mode_ == FRAMES_UNTOUCHED) { @@ -1376,7 +1376,9 @@ bool Debug::IsBreakOnException(ExceptionBreakType type) { } -void Debug::PrepareStep(StepAction step_action, int step_count) { +void Debug::PrepareStep(StepAction step_action, + int step_count, + StackFrame::Id frame_id) { HandleScope scope(isolate_); PrepareForBreakPoints(); @@ -1402,6 +1404,9 @@ void Debug::PrepareStep(StepAction step_action, int step_count) { // If there is no JavaScript stack don't do anything. return; } + if (frame_id != StackFrame::NO_ID) { + id = frame_id; + } JavaScriptFrameIterator frames_it(isolate_, id); JavaScriptFrame* frame = frames_it.frame(); @@ -1649,7 +1654,7 @@ bool Debug::IsBreakStub(Code* code) { // Find the builtin to use for invoking the debug break Handle<Code> Debug::FindDebugBreak(Handle<Code> code, RelocInfo::Mode mode) { - Isolate* isolate = Isolate::Current(); + Isolate* isolate = code->GetIsolate(); // Find the builtin debug break function matching the calling convention // used by the call site. @@ -1704,7 +1709,7 @@ Handle<Code> Debug::FindDebugBreak(Handle<Code> code, RelocInfo::Mode mode) { Handle<Object> Debug::GetSourceBreakLocations( Handle<SharedFunctionInfo> shared, BreakPositionAlignment position_alignment) { - Isolate* isolate = Isolate::Current(); + Isolate* isolate = shared->GetIsolate(); Heap* heap = isolate->heap(); if (!HasDebugInfo(shared)) { return Handle<Object>(heap->undefined_value(), isolate); @@ -1883,7 +1888,7 @@ static bool CompileFullCodeForDebugging(Handle<JSFunction> function, // Use compile lazy which will end up compiling the full code in the // configuration configured above. bool result = Compiler::CompileLazy(&info); - ASSERT(result != Isolate::Current()->has_pending_exception()); + ASSERT(result != info.isolate()->has_pending_exception()); info.isolate()->clear_pending_exception(); #if DEBUG if (result) { @@ -2047,7 +2052,7 @@ void Debug::PrepareForBreakPoints() { // If preparing for the first break point make sure to deoptimize all // functions as debugging does not work with optimized code. if (!has_break_points_) { - if (FLAG_parallel_recompilation) { + if (FLAG_concurrent_recompilation) { isolate_->optimizing_compiler_thread()->Flush(); } @@ -2105,10 +2110,9 @@ void Debug::PrepareForBreakPoints() { function->set_code(*lazy_compile); function->shared()->set_code(*lazy_compile); } else if (kind == Code::BUILTIN && - (function->IsMarkedForInstallingRecompiledCode() || - function->IsInRecompileQueue() || + (function->IsInRecompileQueue() || function->IsMarkedForLazyRecompilation() || - function->IsMarkedForParallelRecompilation())) { + function->IsMarkedForConcurrentRecompilation())) { // Abort in-flight compilation. Code* shared_code = function->shared()->code(); if (shared_code->kind() == Code::FUNCTION && @@ -2537,7 +2541,7 @@ void Debug::CreateScriptCache() { "Debug::CreateScriptCache"); ASSERT(script_cache_ == NULL); - script_cache_ = new ScriptCache(); + script_cache_ = new ScriptCache(isolate_); // Scan heap for Script objects. int count = 0; @@ -2612,24 +2616,18 @@ Debugger::Debugger(Isolate* isolate) message_handler_(NULL), debugger_unload_pending_(false), host_dispatch_handler_(NULL), - dispatch_handler_access_(OS::CreateMutex()), debug_message_dispatch_handler_(NULL), message_dispatch_helper_thread_(NULL), - host_dispatch_micros_(100 * 1000), + host_dispatch_period_(TimeDelta::FromMilliseconds(100)), agent_(NULL), command_queue_(isolate->logger(), kQueueInitialSize), - command_received_(OS::CreateSemaphore(0)), + command_received_(0), event_command_queue_(isolate->logger(), kQueueInitialSize), isolate_(isolate) { } -Debugger::~Debugger() { - delete dispatch_handler_access_; - dispatch_handler_access_ = 0; - delete command_received_; - command_received_ = 0; -} +Debugger::~Debugger() {} Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, @@ -2760,7 +2758,7 @@ void Debugger::OnException(Handle<Object> exception, bool uncaught) { } // Enter the debugger. - EnterDebugger debugger; + EnterDebugger debugger(isolate_); if (debugger.FailedToEnter()) return; // Clear all current stepping setup. @@ -2826,7 +2824,7 @@ void Debugger::OnBeforeCompile(Handle<Script> script) { if (!EventActive(v8::BeforeCompile)) return; // Enter the debugger. - EnterDebugger debugger; + EnterDebugger debugger(isolate_); if (debugger.FailedToEnter()) return; // Create the event data object. @@ -2863,7 +2861,7 @@ void Debugger::OnAfterCompile(Handle<Script> script, bool in_debugger = debug->InDebugger(); // Enter the debugger. - EnterDebugger debugger; + EnterDebugger debugger(isolate_); if (debugger.FailedToEnter()) return; // If debugging there might be script break points registered for this @@ -2891,7 +2889,7 @@ void Debugger::OnAfterCompile(Handle<Script> script, bool caught_exception; Handle<Object> argv[] = { wrapper }; Execution::TryCall(Handle<JSFunction>::cast(update_script_break_points), - Isolate::Current()->js_builtins_object(), + isolate_->js_builtins_object(), ARRAY_SIZE(argv), argv, &caught_exception); @@ -2926,7 +2924,7 @@ void Debugger::OnScriptCollected(int id) { if (!Debugger::EventActive(v8::ScriptCollected)) return; // Enter the debugger. - EnterDebugger debugger; + EnterDebugger debugger(isolate_); if (debugger.FailedToEnter()) return; // Create the script collected state object. @@ -3043,7 +3041,7 @@ void Debugger::CallJSEventCallback(v8::DebugEvent event, Handle<Context> Debugger::GetDebugContext() { never_unload_debugger_ = true; - EnterDebugger debugger; + EnterDebugger debugger(isolate_); return isolate_->debug()->debug_context(); } @@ -3152,14 +3150,14 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event, // Wait for new command in the queue. if (Debugger::host_dispatch_handler_) { // In case there is a host dispatch - do periodic dispatches. - if (!command_received_->Wait(host_dispatch_micros_)) { + if (!command_received_.WaitFor(host_dispatch_period_)) { // Timout expired, do the dispatch. Debugger::host_dispatch_handler_(); continue; } } else { // In case there is no host dispatch - just wait. - command_received_->Wait(); + command_received_.Wait(); } // Get the command from the queue. @@ -3272,7 +3270,7 @@ void Debugger::SetEventListener(Handle<Object> callback, void Debugger::SetMessageHandler(v8::Debug::MessageHandler2 handler) { - ScopedLock with(debugger_access_); + LockGuard<RecursiveMutex> with(debugger_access_); message_handler_ = handler; ListenersChanged(); @@ -3301,15 +3299,15 @@ void Debugger::ListenersChanged() { void Debugger::SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler, - int period) { + TimeDelta period) { host_dispatch_handler_ = handler; - host_dispatch_micros_ = period * 1000; + host_dispatch_period_ = period; } void Debugger::SetDebugMessageDispatchHandler( v8::Debug::DebugMessageDispatchHandler handler, bool provide_locker) { - ScopedLock with(dispatch_handler_access_); + LockGuard<Mutex> lock_guard(&dispatch_handler_access_); debug_message_dispatch_handler_ = handler; if (provide_locker && message_dispatch_helper_thread_ == NULL) { @@ -3322,7 +3320,7 @@ void Debugger::SetDebugMessageDispatchHandler( // Calls the registered debug message handler. This callback is part of the // public API. void Debugger::InvokeMessageHandler(MessageImpl message) { - ScopedLock with(debugger_access_); + LockGuard<RecursiveMutex> with(debugger_access_); if (message_handler_ != NULL) { message_handler_(message); @@ -3343,7 +3341,7 @@ void Debugger::ProcessCommand(Vector<const uint16_t> command, client_data); isolate_->logger()->DebugTag("Put command on command_queue."); command_queue_.Put(message); - command_received_->Signal(); + command_received_.Signal(); // Set the debug command break flag to have the command processed. if (!isolate_->debug()->InDebugger()) { @@ -3352,7 +3350,7 @@ void Debugger::ProcessCommand(Vector<const uint16_t> command, MessageDispatchHelperThread* dispatch_thread; { - ScopedLock with(dispatch_handler_access_); + LockGuard<Mutex> lock_guard(&dispatch_handler_access_); dispatch_thread = message_dispatch_helper_thread_; } @@ -3381,7 +3379,7 @@ void Debugger::EnqueueDebugCommand(v8::Debug::ClientData* client_data) { bool Debugger::IsDebuggerActive() { - ScopedLock with(debugger_access_); + LockGuard<RecursiveMutex> with(debugger_access_); return message_handler_ != NULL || !event_listener_.is_null() || @@ -3396,7 +3394,7 @@ Handle<Object> Debugger::Call(Handle<JSFunction> fun, Debugger::never_unload_debugger_ = true; // Enter the debugger. - EnterDebugger debugger; + EnterDebugger debugger(isolate_); if (debugger.FailedToEnter()) { return isolate_->factory()->undefined_value(); } @@ -3410,6 +3408,7 @@ Handle<Object> Debugger::Call(Handle<JSFunction> fun, Handle<Object> argv[] = { exec_state, data }; Handle<Object> result = Execution::Call( + isolate_, fun, Handle<Object>(isolate_->debug()->debug_context_->global_proxy(), isolate_), @@ -3427,7 +3426,6 @@ static void StubMessageHandler2(const v8::Debug::Message& message) { bool Debugger::StartAgent(const char* name, int port, bool wait_for_connection) { - ASSERT(Isolate::Current() == isolate_); if (wait_for_connection) { // Suspend V8 if it is already running or set V8 to suspend whenever // it starts. @@ -3439,20 +3437,15 @@ bool Debugger::StartAgent(const char* name, int port, v8::Debug::DebugBreak(); } - if (Socket::SetUp()) { - if (agent_ == NULL) { - agent_ = new DebuggerAgent(name, port); - agent_->Start(); - } - return true; + if (agent_ == NULL) { + agent_ = new DebuggerAgent(isolate_, name, port); + agent_->Start(); } - - return false; + return true; } void Debugger::StopAgent() { - ASSERT(Isolate::Current() == isolate_); if (agent_ != NULL) { agent_->Shutdown(); agent_->Join(); @@ -3463,7 +3456,6 @@ void Debugger::StopAgent() { void Debugger::WaitForAgent() { - ASSERT(Isolate::Current() == isolate_); if (agent_ != NULL) agent_->WaitUntilListening(); } @@ -3472,7 +3464,7 @@ void Debugger::WaitForAgent() { void Debugger::CallMessageDispatchHandler() { v8::Debug::DebugMessageDispatchHandler handler; { - ScopedLock with(dispatch_handler_access_); + LockGuard<Mutex> lock_guard(&dispatch_handler_access_); handler = Debugger::debug_message_dispatch_handler_; } if (handler != NULL) { @@ -3481,8 +3473,8 @@ void Debugger::CallMessageDispatchHandler() { } -EnterDebugger::EnterDebugger() - : isolate_(Isolate::Current()), +EnterDebugger::EnterDebugger(Isolate* isolate) + : isolate_(isolate), prev_(isolate_->debug()->debugger_entry()), it_(isolate_), has_js_frames_(!it_.done()), @@ -3517,7 +3509,6 @@ EnterDebugger::EnterDebugger() EnterDebugger::~EnterDebugger() { - ASSERT(Isolate::Current() == isolate_); Debug* debug = isolate_->debug(); // Restore to the previous break state. @@ -3632,6 +3623,11 @@ v8::Handle<v8::Object> MessageImpl::GetExecutionState() const { } +v8::Isolate* MessageImpl::GetIsolate() const { + return reinterpret_cast<v8::Isolate*>(exec_state_->GetIsolate()); +} + + v8::Handle<v8::Object> MessageImpl::GetEventData() const { return v8::Utils::ToLocal(event_data_); } @@ -3662,7 +3658,7 @@ v8::Handle<v8::String> MessageImpl::GetJSON() const { v8::Handle<v8::Context> MessageImpl::GetEventContext() const { - Isolate* isolate = Isolate::Current(); + Isolate* isolate = event_data_->GetIsolate(); v8::Handle<v8::Context> context = GetDebugEventContext(isolate); // Isolate::context() may be NULL when "script collected" event occures. ASSERT(!context.IsEmpty() || event_ == v8::ScriptCollected); @@ -3703,7 +3699,7 @@ v8::Handle<v8::Object> EventDetailsImpl::GetEventData() const { v8::Handle<v8::Context> EventDetailsImpl::GetEventContext() const { - return GetDebugEventContext(Isolate::Current()); + return GetDebugEventContext(exec_state_->GetIsolate()); } @@ -3793,24 +3789,17 @@ void CommandMessageQueue::Expand() { LockingCommandMessageQueue::LockingCommandMessageQueue(Logger* logger, int size) - : logger_(logger), queue_(size) { - lock_ = OS::CreateMutex(); -} - - -LockingCommandMessageQueue::~LockingCommandMessageQueue() { - delete lock_; -} + : logger_(logger), queue_(size) {} bool LockingCommandMessageQueue::IsEmpty() const { - ScopedLock sl(lock_); + LockGuard<Mutex> lock_guard(&mutex_); return queue_.IsEmpty(); } CommandMessage LockingCommandMessageQueue::Get() { - ScopedLock sl(lock_); + LockGuard<Mutex> lock_guard(&mutex_); CommandMessage result = queue_.Get(); logger_->DebugEvent("Get", result.text()); return result; @@ -3818,48 +3807,42 @@ CommandMessage LockingCommandMessageQueue::Get() { void LockingCommandMessageQueue::Put(const CommandMessage& message) { - ScopedLock sl(lock_); + LockGuard<Mutex> lock_guard(&mutex_); queue_.Put(message); logger_->DebugEvent("Put", message.text()); } void LockingCommandMessageQueue::Clear() { - ScopedLock sl(lock_); + LockGuard<Mutex> lock_guard(&mutex_); queue_.Clear(); } MessageDispatchHelperThread::MessageDispatchHelperThread(Isolate* isolate) : Thread("v8:MsgDispHelpr"), - isolate_(isolate), sem_(OS::CreateSemaphore(0)), - mutex_(OS::CreateMutex()), already_signalled_(false) { -} - - -MessageDispatchHelperThread::~MessageDispatchHelperThread() { - delete mutex_; - delete sem_; + isolate_(isolate), sem_(0), + already_signalled_(false) { } void MessageDispatchHelperThread::Schedule() { { - ScopedLock lock(mutex_); + LockGuard<Mutex> lock_guard(&mutex_); if (already_signalled_) { return; } already_signalled_ = true; } - sem_->Signal(); + sem_.Signal(); } void MessageDispatchHelperThread::Run() { while (true) { - sem_->Wait(); + sem_.Wait(); { - ScopedLock lock(mutex_); + LockGuard<Mutex> lock_guard(&mutex_); already_signalled_ = false; } { |