Chromium Code Reviews| Index: src/debug-agent.cc |
| =================================================================== |
| --- src/debug-agent.cc (revision 6117) |
| +++ src/debug-agent.cc (working copy) |
| @@ -27,9 +27,11 @@ |
| #include "v8.h" |
| +#include "debug.h" |
| #include "debug-agent.h" |
| #ifdef ENABLE_DEBUGGER_SUPPORT |
| + |
| namespace v8 { |
| namespace internal { |
| @@ -167,22 +169,46 @@ |
| while (true) { |
| // Read data from the debugger front end. |
| SmartPointer<char> message = DebuggerAgentUtil::ReceiveMessage(client_); |
| - if (*message == NULL) { |
| - // Session is closed. |
| - agent_->OnSessionClosed(this); |
| - return; |
| + |
| + const char *msg = *message; |
|
Søren Thygesen Gjesse
2011/01/03 08:56:07
Please avoid mixed case variables, see http://goog
marklam
2011/01/04 20:12:13
Done.
|
| + bool isBreakRequest = false; |
| + bool isClosingSession = (msg == NULL); |
| + |
| + if (msg == NULL) { |
| + // If we lost the connection, then simulate a disconnect msg: |
| + msg = "{\"seq\":1,\"type\":\"request\",\"command\":\"disconnect\"}"; |
| + |
| + } else { |
| + // Check if we're getting a break request: |
|
Søren Thygesen Gjesse
2011/01/03 08:56:07
These checks seems pretty fragile, and depends on
marklam
2011/01/04 20:12:13
I see what you mean. But yes, at least as a first
|
| + const char *breakRequestStr = |
| + "\"type\":\"request\",\"command\":\"break\"}"; |
| + const char *result = strstr(msg, breakRequestStr); |
| + if (result != NULL) { |
| + isBreakRequest = true; |
| + } else { |
| + // Check if we're getting a disconnect request: |
| + const char *disconnectRequestStr = |
| + "\"type\":\"request\",\"command\":\"disconnect\"}"; |
| + result = strstr(msg, disconnectRequestStr); |
| + if (result != NULL) { |
| + isClosingSession = true; |
| + } |
| + } |
| } |
| + if (isBreakRequest && !Debug::InDebugger()) { |
|
Søren Thygesen Gjesse
2011/01/03 08:56:07
Is this required? Sending the command using v8::De
marklam
2011/01/04 20:12:13
Hmmm. This used to be needed, but I just re-teste
|
| + v8::Debug::DebugBreak(); |
| + } |
| + |
| // Convert UTF-8 to UTF-16. |
| - unibrow::Utf8InputBuffer<> buf(*message, |
| - StrLength(*message)); |
| + unibrow::Utf8InputBuffer<> buf(msg, StrLength(msg)); |
| int len = 0; |
| while (buf.has_more()) { |
| buf.GetNext(); |
| len++; |
| } |
| ScopedVector<int16_t> temp(len + 1); |
| - buf.Reset(*message, StrLength(*message)); |
| + buf.Reset(msg, StrLength(msg)); |
| for (int i = 0; i < len; i++) { |
| temp[i] = buf.GetNext(); |
| } |
| @@ -190,6 +216,12 @@ |
| // Send the request received to the debugger. |
| v8::Debug::SendCommand(reinterpret_cast<const uint16_t *>(temp.start()), |
| len); |
| + |
| + if (isClosingSession) { |
| + // Session is closed. |
| + agent_->OnSessionClosed(this); |
| + return; |
| + } |
| } |
| } |