Index: test/cctest/test-debug.cc |
=================================================================== |
--- test/cctest/test-debug.cc (revision 2523) |
+++ test/cctest/test-debug.cc (working copy) |
@@ -4875,7 +4875,7 @@ |
v8::Debug::SetMessageHandler2(DebugBreakMessageHandler); |
// Test functions. |
- const char* script = "function f() { debugger; } function g() { }"; |
+ const char* script = "function f() { debugger; g(); } function g() { }"; |
CompileRun(script); |
v8::Local<v8::Function> f = |
v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); |
@@ -4954,8 +4954,10 @@ |
v8::Debug::DebugBreak(); |
result = f->Call(env->Global(), argc, argv); |
- CHECK_EQ(20, break_point_hit_count); |
- CHECK_EQ("exec", last_function_hit); |
+ // Check that there was only one break event. Matching RegExp should not |
+ // cause Break events. |
+ CHECK_EQ(1, break_point_hit_count); |
+ CHECK_EQ("f", last_function_hit); |
} |
#endif // V8_NATIVE_REGEXP |
@@ -5295,3 +5297,63 @@ |
ClearBreakPointFromJS(sbp2); |
v8::Debug::SetMessageHandler2(NULL); |
} |
+ |
+ |
+static void BreakMessageHandler(const v8::Debug::Message& message) { |
+ if (message.IsEvent() && message.GetEvent() == v8::Break) { |
+ // Count the number of breaks. |
+ break_point_hit_count++; |
+ |
+ v8::HandleScope scope; |
+ v8::Handle<v8::String> json = message.GetJSON(); |
+ |
+ SendContinueCommand(); |
+ } else if (message.IsEvent() && message.GetEvent() == v8::AfterCompile) { |
+ v8::HandleScope scope; |
+ |
+ bool is_debug_break = i::StackGuard::IsDebugBreak(); |
+ // Force DebugBreak flag while serializer is working. |
+ i::StackGuard::DebugBreak(); |
+ |
+ // Force serialization to trigger some internal JS execution. |
+ v8::Handle<v8::String> json = message.GetJSON(); |
+ |
+ // Restore previous state. |
+ if (is_debug_break) { |
+ i::StackGuard::DebugBreak(); |
+ } else { |
+ i::StackGuard::Continue(i::DEBUGBREAK); |
+ } |
+ } |
+} |
+ |
+ |
+// Test that if DebugBreak is forced it is ignored when code from |
+// debug-delay.js is executed. |
+TEST(NoDebugBreakInAfterCompileMessageHandler) { |
+ v8::HandleScope scope; |
+ DebugLocalContext env; |
+ |
+ // Register a debug event listener which sets the break flag and counts. |
+ v8::Debug::SetMessageHandler2(BreakMessageHandler); |
+ |
+ // Set the debug break flag. |
+ v8::Debug::DebugBreak(); |
+ |
+ // Create a function for testing stepping. |
+ const char* src = "function f() { eval('var x = 10;'); } "; |
+ v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
+ |
+ // There should be only one break event. |
+ CHECK_EQ(1, break_point_hit_count); |
+ |
+ // Set the debug break flag again. |
+ v8::Debug::DebugBreak(); |
+ f->Call(env->Global(), 0, NULL); |
+ // There should be one more break event when the script is evaluated in 'f'. |
+ CHECK_EQ(2, break_point_hit_count); |
+ |
+ // Get rid of the debug message handler. |
+ v8::Debug::SetMessageHandler2(NULL); |
+ CheckDebuggerUnloaded(); |
+} |