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 |