Index: test/cctest/test-debug.cc |
diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc |
index 436084af3724122e9727b3358b91bd7d8e287ae0..87c5ff1c3913a90a814be2cd9cd77b5fb2f21afd 100644 |
--- a/test/cctest/test-debug.cc |
+++ b/test/cctest/test-debug.cc |
@@ -3539,6 +3539,52 @@ bool IsBreakEventMessage(char *message) { |
} |
+// We match parts of the message to decide if it is a exception message. |
+bool IsExceptionEventMessage(char *message) { |
+ const char* type_event = "\"type\":\"event\""; |
+ const char* event_exception = "\"event\":\"exception\""; |
+ // Does the message contain both type:event and event:exception? |
+ return strstr(message, type_event) != NULL && |
+ strstr(message, event_exception) != NULL; |
+} |
+ |
+ |
+// We match the message wether it is an evaluate response message. |
+bool IsEvaluateResponseMessage(char* message) { |
+ const char* type_response = "\"type\":\"response\""; |
+ const char* command_evaluate = "\"command\":\"evaluate\""; |
+ // Does the message contain both type:response and command:evaluate? |
+ return strstr(message, type_response) != NULL && |
+ strstr(message, command_evaluate) != NULL; |
+} |
+ |
+ |
+// We match parts of the message to get evaluate result int value. |
+int GetEvaluateIntResult(char *message) { |
+ const char* value = "\"value\":"; |
+ char* pos = strstr(message, value); |
+ if (pos == NULL) { |
+ return -1; |
+ } |
+ int res = -1; |
+ sscanf(pos + strlen(value), "%d", &res); |
+ return res; |
+} |
+ |
+ |
+// We match parts of the message to get hit breakpoint id. |
+int GetBreakpointIdFromBreakEventMessage(char *message) { |
+ const char* breakpoints = "\"breakpoints\":["; |
+ char* pos = strstr(message, breakpoints); |
+ if (pos == NULL) { |
+ return -1; |
+ } |
+ int res = -1; |
+ sscanf(pos + strlen(breakpoints), "%d", &res); |
+ return res; |
+} |
+ |
+ |
/* Test MessageQueues */ |
/* Tests the message queues that hold debugger commands and |
* response messages to the debugger. Fills queues and makes |
@@ -3566,8 +3612,6 @@ static void MessageHandler(const uint16_t* message, int length, |
// Allow message handler to block on a semaphore, to test queueing of |
// messages while blocked. |
message_queue_barriers.semaphore_1->Wait(); |
- printf("%s\n", print_buffer); |
- fflush(stdout); |
} |
void MessageQueueDebuggerThread::Run() { |
@@ -3822,8 +3866,6 @@ static void ThreadedMessageHandler(const v8::Debug::Message& message) { |
if (IsBreakEventMessage(print_buffer)) { |
threaded_debugging_barriers.barrier_2.Wait(); |
} |
- printf("%s\n", print_buffer); |
- fflush(stdout); |
} |
@@ -3911,16 +3953,20 @@ class BreakpointsDebuggerThread : public v8::internal::Thread { |
Barriers* breakpoints_barriers; |
+int break_event_breakpoint_id; |
+int evaluate_int_result; |
static void BreakpointsMessageHandler(const v8::Debug::Message& message) { |
static char print_buffer[1000]; |
v8::String::Value json(message.GetJSON()); |
Utf16ToAscii(*json, json.length(), print_buffer); |
- printf("%s\n", print_buffer); |
- fflush(stdout); |
- // Is break_template a prefix of the message? |
if (IsBreakEventMessage(print_buffer)) { |
+ break_event_breakpoint_id = |
+ GetBreakpointIdFromBreakEventMessage(print_buffer); |
+ breakpoints_barriers->semaphore_1->Signal(); |
+ } else if (IsEvaluateResponseMessage(print_buffer)) { |
+ evaluate_int_result = GetEvaluateIntResult(print_buffer); |
breakpoints_barriers->semaphore_1->Signal(); |
} |
} |
@@ -3930,9 +3976,9 @@ void BreakpointsV8Thread::Run() { |
const char* source_1 = "var y_global = 3;\n" |
"function cat( new_value ) {\n" |
" var x = new_value;\n" |
- " y_global = 4;\n" |
+ " y_global = y_global + 4;\n" |
" x = 3 * x + 1;\n" |
- " y_global = 5;\n" |
+ " y_global = y_global + 5;\n" |
" return x;\n" |
"}\n" |
"\n" |
@@ -3970,59 +4016,76 @@ void BreakpointsDebuggerThread::Run() { |
"\"type\":\"request\"," |
"\"command\":\"setbreakpoint\"," |
"\"arguments\":{\"type\":\"function\",\"target\":\"dog\",\"line\":3}}"; |
- const char* command_3 = "{\"seq\":104," |
+ const char* command_3 = "{\"seq\":103," |
"\"type\":\"request\"," |
"\"command\":\"evaluate\"," |
"\"arguments\":{\"expression\":\"dog()\",\"disable_break\":false}}"; |
- const char* command_4 = "{\"seq\":105," |
+ const char* command_4 = "{\"seq\":104," |
"\"type\":\"request\"," |
"\"command\":\"evaluate\"," |
- "\"arguments\":{\"expression\":\"x\",\"disable_break\":true}}"; |
- const char* command_5 = "{\"seq\":106," |
+ "\"arguments\":{\"expression\":\"x + 1\",\"disable_break\":true}}"; |
+ const char* command_5 = "{\"seq\":105," |
"\"type\":\"request\"," |
"\"command\":\"continue\"}"; |
- const char* command_6 = "{\"seq\":107," |
+ const char* command_6 = "{\"seq\":106," |
"\"type\":\"request\"," |
"\"command\":\"continue\"}"; |
- const char* command_7 = "{\"seq\":108," |
+ const char* command_7 = "{\"seq\":107," |
"\"type\":\"request\"," |
"\"command\":\"evaluate\"," |
"\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true}}"; |
- const char* command_8 = "{\"seq\":109," |
+ const char* command_8 = "{\"seq\":108," |
"\"type\":\"request\"," |
"\"command\":\"continue\"}"; |
// v8 thread initializes, runs source_1 |
breakpoints_barriers->barrier_1.Wait(); |
- // 1:Set breakpoint in cat(). |
+ // 1:Set breakpoint in cat() (will get id 1). |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer)); |
- // 2:Set breakpoint in dog() |
+ // 2:Set breakpoint in dog() (will get id 2). |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer)); |
breakpoints_barriers->barrier_2.Wait(); |
- // v8 thread starts compiling source_2. |
+ // V8 thread starts compiling source_2. |
// Automatic break happens, to run queued commands |
// breakpoints_barriers->semaphore_1->Wait(); |
// Commands 1 through 3 run, thread continues. |
// v8 thread runs source_2 to breakpoint in cat(). |
// message callback receives break event. |
breakpoints_barriers->semaphore_1->Wait(); |
+ // Must have hit breakpoint #1. |
+ CHECK_EQ(1, break_event_breakpoint_id); |
// 4:Evaluate dog() (which has a breakpoint). |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_3, buffer)); |
- // v8 thread hits breakpoint in dog() |
+ // V8 thread hits breakpoint in dog(). |
breakpoints_barriers->semaphore_1->Wait(); // wait for break event |
- // 5:Evaluate x |
+ // Must have hit breakpoint #2. |
+ CHECK_EQ(2, break_event_breakpoint_id); |
+ // 5:Evaluate (x + 1). |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_4, buffer)); |
- // 6:Continue evaluation of dog() |
+ // Evaluate (x + 1) finishes. |
+ breakpoints_barriers->semaphore_1->Wait(); |
+ // Must have result 108. |
+ CHECK_EQ(108, evaluate_int_result); |
+ // 6:Continue evaluation of dog(). |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_5, buffer)); |
- // dog() finishes. |
+ // Evaluate dog() finishes. |
+ breakpoints_barriers->semaphore_1->Wait(); |
+ // Must have result 107. |
+ CHECK_EQ(107, evaluate_int_result); |
// 7:Continue evaluation of source_2, finish cat(17), hit breakpoint |
// in cat(19). |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_6, buffer)); |
- // message callback gets break event |
+ // Message callback gets break event. |
breakpoints_barriers->semaphore_1->Wait(); // wait for break event |
- // 8: Evaluate dog() with breaks disabled |
+ // Must have hit breakpoint #1. |
+ CHECK_EQ(1, break_event_breakpoint_id); |
+ // 8: Evaluate dog() with breaks disabled. |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_7, buffer)); |
+ // Evaluate dog() finishes. |
+ breakpoints_barriers->semaphore_1->Wait(); |
+ // Must have result 116. |
+ CHECK_EQ(116, evaluate_int_result); |
// 9: Continue evaluation of source2, reach end. |
v8::Debug::SendCommand(buffer, AsciiToUtf16(command_8, buffer)); |
} |
@@ -4325,7 +4388,13 @@ static int message_handler_hit_count = 0; |
static void MessageHandlerHitCount(const v8::Debug::Message& message) { |
message_handler_hit_count++; |
- SendContinueCommand(); |
+ static char print_buffer[1000]; |
+ v8::String::Value json(message.GetJSON()); |
+ Utf16ToAscii(*json, json.length(), print_buffer); |
+ if (IsExceptionEventMessage(print_buffer)) { |
+ // Send a continue command for exception events. |
+ SendContinueCommand(); |
+ } |
} |
@@ -4415,8 +4484,6 @@ static void HostDispatchMessageHandler(const v8::Debug::Message& message) { |
static char print_buffer[1000]; |
v8::String::Value json(message.GetJSON()); |
Utf16ToAscii(*json, json.length(), print_buffer); |
- printf("%s\n", print_buffer); |
- fflush(stdout); |
} |
@@ -4775,8 +4842,12 @@ static void ContextCheckMessageHandler(const v8::Debug::Message& message) { |
expected_context_data)); |
message_handler_hit_count++; |
+ static char print_buffer[1000]; |
+ v8::String::Value json(message.GetJSON()); |
+ Utf16ToAscii(*json, json.length(), print_buffer); |
+ |
// Send a continue command for break events. |
- if (message.GetEvent() == v8::Break) { |
+ if (IsBreakEventMessage(print_buffer)) { |
SendContinueCommand(); |
} |
} |
@@ -5015,7 +5086,11 @@ static void DebugEvalContextCheckMessageHandler( |
expected_context_data)); |
message_handler_hit_count++; |
- if (message.IsEvent() && message.GetEvent() == v8::Break) { |
+ static char print_buffer[1000]; |
+ v8::String::Value json(message.GetJSON()); |
+ Utf16ToAscii(*json, json.length(), print_buffer); |
+ |
+ if (IsBreakEventMessage(print_buffer)) { |
break_count++; |
if (!sent_eval) { |
sent_eval = true; |
@@ -5037,7 +5112,8 @@ static void DebugEvalContextCheckMessageHandler( |
SendContinueCommand(); |
continue_command_send_count++; |
} |
- } else if (message.IsResponse() && continue_command_send_count < 2) { |
+ } else if (IsEvaluateResponseMessage(print_buffer) && |
+ continue_command_send_count < 2) { |
// Response to the evaluation request. We're still on the breakpoint so |
// send continue. |
SendContinueCommand(); |