Reviewers: pfeldman, Description: Add debug command break flag for debugger host dispatch.
Ensure that debugger host dispatch is processed even though there are no debugger commands in the queue. Please review this at http://codereview.chromium.org/67180 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/debug.cc M test/cctest/test-debug.cc Index: test/cctest/test-debug.cc =================================================================== --- test/cctest/test-debug.cc (revision 1707) +++ test/cctest/test-debug.cc (working copy) @@ -4025,19 +4025,33 @@ "\"type\":\"request\"," "\"command\":\"continue\"}"; + // Create an empty function to call for processing debug commands + v8::Local<v8::Function> empty = + CompileFunction(&env, "function empty(){}", "empty"); + // Setup message and host dispatch handlers. v8::Debug::SetMessageHandler(DummyMessageHandler); v8::Debug::SetHostDispatchHandler(HostDispatchHandlerHitCount, NULL); - // Fill a host dispatch and a continue command on the command queue before - // running some code. + // Send a host dispatch by itself. v8::Debug::SendHostDispatch(NULL); + empty->Call(env->Global(), 0, NULL); // Run JavaScript to activate debugger. + CHECK_EQ(1, host_dispatch_hit_count); + + // Fill a host dispatch and a continue command on the command queue. + v8::Debug::SendHostDispatch(NULL); v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer)); - CompileRun("void 0"); + empty->Call(env->Global(), 0, NULL); // Run JavaScript to activate debugger. - // The host dispatch callback should be called. - CHECK_EQ(1, host_dispatch_hit_count); + // Fill a continue command and a host dispatch on the command queue. + v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer)); + v8::Debug::SendHostDispatch(NULL); + empty->Call(env->Global(), 0, NULL); // Run JavaScript to activate debugger. + empty->Call(env->Global(), 0, NULL); // Run JavaScript to activate debugger. + + // All the host dispatch callback should be called. + CHECK_EQ(3, host_dispatch_hit_count); } Index: src/debug.cc =================================================================== --- src/debug.cc (revision 1707) +++ src/debug.cc (working copy) @@ -1825,6 +1825,9 @@ Debugger::host_dispatch_handler_(reinterpret_cast<void*>(dispatch), Debugger::host_dispatch_handler_data_); } + if (auto_continue && !HasCommands()) { + return; + } continue; } @@ -2030,6 +2033,8 @@ Logger::DebugTag("Put command on command_queue."); command_queue_.Put(command_copy); command_received_->Signal(); + + // Set the debug command break flag to have the command processed. if (!Debug::InDebugger()) { StackGuard::DebugCommand(); } @@ -2042,7 +2047,7 @@ void Debugger::ProcessHostDispatch(void* dispatch) { -// Puts a host dispatch comming from the public API on the queue. + // Puts a host dispatch comming from the public API on the queue. uint16_t hack[3]; hack[0] = 0; hack[1] = reinterpret_cast<uint32_t>(dispatch) >> 16; @@ -2050,6 +2055,11 @@ Logger::DebugTag("Put dispatch on command_queue."); command_queue_.Put(Vector<uint16_t>(hack, 3).Clone()); command_received_->Signal(); + + // Set the debug command break flag to have the host dispatch processed. + if (!Debug::InDebugger()) { + StackGuard::DebugCommand(); + } } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
