| Index: test/cctest/test-debug.cc
 | 
| ===================================================================
 | 
| --- test/cctest/test-debug.cc	(revision 3200)
 | 
| +++ test/cctest/test-debug.cc	(working copy)
 | 
| @@ -872,6 +872,26 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +// Debug event handler which re-issues a debug break until a limit has been
 | 
| +// reached.
 | 
| +int max_break_point_hit_count = 0;
 | 
| +static void DebugEventBreakMax(v8::DebugEvent event,
 | 
| +                               v8::Handle<v8::Object> exec_state,
 | 
| +                               v8::Handle<v8::Object> event_data,
 | 
| +                               v8::Handle<v8::Value> data) {
 | 
| +  // When hitting a debug event listener there must be a break set.
 | 
| +  CHECK_NE(v8::internal::Debug::break_id(), 0);
 | 
| +
 | 
| +  if (event == v8::Break && break_point_hit_count < max_break_point_hit_count) {
 | 
| +    // Count the number of breaks.
 | 
| +    break_point_hit_count++;
 | 
| +
 | 
| +    // Set the break flag again to come back here as soon as possible.
 | 
| +    v8::Debug::DebugBreak();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
|  // --- M e s s a g e   C a l l b a c k
 | 
|  
 | 
|  
 | 
| @@ -5444,3 +5464,36 @@
 | 
|    v8::Handle<v8::Value> result = run_test->Call(env->Global(), 1, &obj);
 | 
|    CHECK(result->IsTrue());
 | 
|  }
 | 
| +
 | 
| +
 | 
| +// Test that the debug break flag works with function.apply.
 | 
| +TEST(DebugBreakFunctionApply) {
 | 
| +  v8::HandleScope scope;
 | 
| +  DebugLocalContext env;
 | 
| +
 | 
| +  // Create a function for testing breaking in apply.
 | 
| +  v8::Local<v8::Function> foo = CompileFunction(
 | 
| +      &env,
 | 
| +      "function baz(x) { }"
 | 
| +      "function bar(x) { baz(); }"
 | 
| +      "function foo(){ bar.apply(this, [1]); }",
 | 
| +      "foo");
 | 
| +
 | 
| +  // Register a debug event listener which steps and counts.
 | 
| +  v8::Debug::SetDebugEventListener(DebugEventBreakMax);
 | 
| +
 | 
| +  // Set the debug break flag before calling the code using function.apply.
 | 
| +  v8::Debug::DebugBreak();
 | 
| +
 | 
| +  // Limit the number of debug breaks. This is a regression test for issue 493
 | 
| +  // where this test would enter an infinite loop.
 | 
| +  break_point_hit_count = 0;
 | 
| +  max_break_point_hit_count = 10000;  // 10000 => infinite loop.
 | 
| +  foo->Call(env->Global(), 0, NULL);
 | 
| +
 | 
| +  // When keeping the debug break several break will happen.
 | 
| +  CHECK_EQ(3, break_point_hit_count);
 | 
| +
 | 
| +  v8::Debug::SetDebugEventListener(NULL);
 | 
| +  CheckDebuggerUnloaded();
 | 
| +}
 | 
| 
 |