| Index: src/d8-debug.cc
|
| diff --git a/src/d8-debug.cc b/src/d8-debug.cc
|
| index 7c1beaf2e52a04ece8f2c24cbe9e9dcad9e56fdd..41ec670e57c5c4e091058be0fa6de5d52130fd85 100644
|
| --- a/src/d8-debug.cc
|
| +++ b/src/d8-debug.cc
|
| @@ -4,27 +4,16 @@
|
|
|
| #include "d8.h"
|
| #include "d8-debug.h"
|
| -#include "debug-agent.h"
|
| -#include "platform/socket.h"
|
| -
|
|
|
| namespace v8 {
|
|
|
| -static bool was_running = true;
|
| -
|
| void PrintPrompt(bool is_running) {
|
| const char* prompt = is_running? "> " : "dbg> ";
|
| - was_running = is_running;
|
| printf("%s", prompt);
|
| fflush(stdout);
|
| }
|
|
|
|
|
| -void PrintPrompt() {
|
| - PrintPrompt(was_running);
|
| -}
|
| -
|
| -
|
| void HandleDebugEvent(const Debug::EventDetails& event_details) {
|
| // TODO(svenpanne) There should be a way to retrieve this in the callback.
|
| Isolate* isolate = Isolate::GetCurrent();
|
| @@ -140,208 +129,4 @@ void HandleDebugEvent(const Debug::EventDetails& event_details) {
|
| }
|
| }
|
|
|
| -
|
| -void RunRemoteDebugger(Isolate* isolate, int port) {
|
| - RemoteDebugger debugger(isolate, port);
|
| - debugger.Run();
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::Run() {
|
| - bool ok;
|
| -
|
| - // Connect to the debugger agent.
|
| - conn_ = new i::Socket;
|
| - static const int kPortStrSize = 6;
|
| - char port_str[kPortStrSize];
|
| - i::OS::SNPrintF(i::Vector<char>(port_str, kPortStrSize), "%d", port_);
|
| - ok = conn_->Connect("localhost", port_str);
|
| - if (!ok) {
|
| - printf("Unable to connect to debug agent %d\n", i::Socket::GetLastError());
|
| - return;
|
| - }
|
| -
|
| - // Start the receiver thread.
|
| - ReceiverThread receiver(this);
|
| - receiver.Start();
|
| -
|
| - // Start the keyboard thread.
|
| - KeyboardThread keyboard(this);
|
| - keyboard.Start();
|
| - PrintPrompt();
|
| -
|
| - // Process events received from debugged VM and from the keyboard.
|
| - bool terminate = false;
|
| - while (!terminate) {
|
| - event_available_.Wait();
|
| - RemoteDebuggerEvent* event = GetEvent();
|
| - switch (event->type()) {
|
| - case RemoteDebuggerEvent::kMessage:
|
| - HandleMessageReceived(event->data());
|
| - break;
|
| - case RemoteDebuggerEvent::kKeyboard:
|
| - HandleKeyboardCommand(event->data());
|
| - break;
|
| - case RemoteDebuggerEvent::kDisconnect:
|
| - terminate = true;
|
| - break;
|
| -
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| - delete event;
|
| - }
|
| -
|
| - delete conn_;
|
| - conn_ = NULL;
|
| - // Wait for the receiver thread to end.
|
| - receiver.Join();
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::MessageReceived(i::SmartArrayPointer<char> message) {
|
| - RemoteDebuggerEvent* event =
|
| - new RemoteDebuggerEvent(RemoteDebuggerEvent::kMessage, message);
|
| - AddEvent(event);
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::KeyboardCommand(i::SmartArrayPointer<char> command) {
|
| - RemoteDebuggerEvent* event =
|
| - new RemoteDebuggerEvent(RemoteDebuggerEvent::kKeyboard, command);
|
| - AddEvent(event);
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::ConnectionClosed() {
|
| - RemoteDebuggerEvent* event =
|
| - new RemoteDebuggerEvent(RemoteDebuggerEvent::kDisconnect,
|
| - i::SmartArrayPointer<char>());
|
| - AddEvent(event);
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::AddEvent(RemoteDebuggerEvent* event) {
|
| - i::LockGuard<i::Mutex> lock_guard(&event_access_);
|
| - if (head_ == NULL) {
|
| - ASSERT(tail_ == NULL);
|
| - head_ = event;
|
| - tail_ = event;
|
| - } else {
|
| - ASSERT(tail_ != NULL);
|
| - tail_->set_next(event);
|
| - tail_ = event;
|
| - }
|
| - event_available_.Signal();
|
| -}
|
| -
|
| -
|
| -RemoteDebuggerEvent* RemoteDebugger::GetEvent() {
|
| - i::LockGuard<i::Mutex> lock_guard(&event_access_);
|
| - ASSERT(head_ != NULL);
|
| - RemoteDebuggerEvent* result = head_;
|
| - head_ = head_->next();
|
| - if (head_ == NULL) {
|
| - ASSERT(tail_ == result);
|
| - tail_ = NULL;
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::HandleMessageReceived(char* message) {
|
| - Locker lock(isolate_);
|
| - HandleScope scope(isolate_);
|
| -
|
| - // Print the event details.
|
| - TryCatch try_catch;
|
| - Handle<Object> details = Shell::DebugMessageDetails(
|
| - isolate_, Handle<String>::Cast(String::NewFromUtf8(isolate_, message)));
|
| - if (try_catch.HasCaught()) {
|
| - Shell::ReportException(isolate_, &try_catch);
|
| - PrintPrompt();
|
| - return;
|
| - }
|
| - String::Utf8Value str(details->Get(String::NewFromUtf8(isolate_, "text")));
|
| - if (str.length() == 0) {
|
| - // Empty string is used to signal not to process this event.
|
| - return;
|
| - }
|
| - if (*str != NULL) {
|
| - printf("%s\n", *str);
|
| - } else {
|
| - printf("???\n");
|
| - }
|
| -
|
| - bool is_running = details->Get(String::NewFromUtf8(isolate_, "running"))
|
| - ->ToBoolean()
|
| - ->Value();
|
| - PrintPrompt(is_running);
|
| -}
|
| -
|
| -
|
| -void RemoteDebugger::HandleKeyboardCommand(char* command) {
|
| - Locker lock(isolate_);
|
| - HandleScope scope(isolate_);
|
| -
|
| - // Convert the debugger command to a JSON debugger request.
|
| - TryCatch try_catch;
|
| - Handle<Value> request = Shell::DebugCommandToJSONRequest(
|
| - isolate_, String::NewFromUtf8(isolate_, command));
|
| - if (try_catch.HasCaught()) {
|
| - Shell::ReportException(isolate_, &try_catch);
|
| - PrintPrompt();
|
| - return;
|
| - }
|
| -
|
| - // If undefined is returned the command was handled internally and there is
|
| - // no JSON to send.
|
| - if (request->IsUndefined()) {
|
| - PrintPrompt();
|
| - return;
|
| - }
|
| -
|
| - // Send the JSON debugger request.
|
| - i::DebuggerAgentUtil::SendMessage(conn_, Handle<String>::Cast(request));
|
| -}
|
| -
|
| -
|
| -void ReceiverThread::Run() {
|
| - // Receive the connect message (with empty body).
|
| - i::SmartArrayPointer<char> message =
|
| - i::DebuggerAgentUtil::ReceiveMessage(remote_debugger_->conn());
|
| - ASSERT(message.get() == NULL);
|
| -
|
| - while (true) {
|
| - // Receive a message.
|
| - i::SmartArrayPointer<char> message =
|
| - i::DebuggerAgentUtil::ReceiveMessage(remote_debugger_->conn());
|
| - if (message.get() == NULL) {
|
| - remote_debugger_->ConnectionClosed();
|
| - return;
|
| - }
|
| -
|
| - // Pass the message to the main thread.
|
| - remote_debugger_->MessageReceived(message);
|
| - }
|
| -}
|
| -
|
| -
|
| -void KeyboardThread::Run() {
|
| - static const int kBufferSize = 256;
|
| - while (true) {
|
| - // read keyboard input.
|
| - char command[kBufferSize];
|
| - char* str = fgets(command, kBufferSize, stdin);
|
| - if (str == NULL) {
|
| - break;
|
| - }
|
| -
|
| - // Pass the keyboard command to the main thread.
|
| - remote_debugger_->KeyboardCommand(
|
| - i::SmartArrayPointer<char>(i::StrDup(command)));
|
| - }
|
| -}
|
| -
|
| -
|
| } // namespace v8
|
|
|