Index: test/cctest/test-debug.cc |
=================================================================== |
--- test/cctest/test-debug.cc (revision 5352) |
+++ test/cctest/test-debug.cc (working copy) |
@@ -869,7 +869,7 @@ |
// Scavenge. |
Heap::CollectGarbage(0, v8::internal::NEW_SPACE); |
} else { |
- // Mark sweep (and perhaps compact). |
+ // Mark sweep compact. |
Heap::CollectAllGarbage(true); |
} |
} |
@@ -1177,6 +1177,40 @@ |
} |
+// Test that a break point can be set at an IC call location and survive a GC. |
+TEST(BreakPointConstructCallWithGC) { |
+ break_point_hit_count = 0; |
+ v8::HandleScope scope; |
+ DebugLocalContext env; |
+ v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage, |
+ v8::Undefined()); |
+ v8::Script::Compile(v8::String::New("function bar(){ this.x = 1;}"))->Run(); |
+ v8::Script::Compile(v8::String::New( |
+ "function foo(){return new bar(1).x;}"))->Run(); |
+ v8::Local<v8::Function> foo = |
+ v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); |
+ |
+ // Run without breakpoints. |
+ CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); |
+ CHECK_EQ(0, break_point_hit_count); |
+ |
+ // Run with breakpoint. |
+ int bp = SetBreakPoint(foo, 0); |
+ CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); |
+ CHECK_EQ(1, break_point_hit_count); |
+ CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); |
+ CHECK_EQ(2, break_point_hit_count); |
+ |
+ // Run without breakpoints. |
+ ClearBreakPoint(bp); |
+ foo->Call(env->Global(), 0, NULL); |
+ CHECK_EQ(2, break_point_hit_count); |
+ |
+ v8::Debug::SetDebugEventListener(NULL); |
+ CheckDebuggerUnloaded(); |
+} |
+ |
+ |
// Test that a break point can be set at a return store location. |
TEST(BreakPointReturn) { |
break_point_hit_count = 0; |