Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index c5c932b7516cc70738ad918a9311dabe1e985427..5252b102e40bd1d480f282c17e4513096fb56dfd 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -18563,6 +18563,8 @@ int prologue_call_count = 0; |
int epilogue_call_count = 0; |
int prologue_call_count_second = 0; |
int epilogue_call_count_second = 0; |
+int prologue_call_count_alloc = 0; |
+int epilogue_call_count_alloc = 0; |
void PrologueCallback(v8::GCType, v8::GCCallbackFlags flags) { |
CHECK_EQ(flags, v8::kNoGCCallbackFlags); |
@@ -18624,6 +18626,46 @@ void EpilogueCallbackSecond(v8::Isolate* isolate, |
} |
+void PrologueCallbackAlloc(v8::Isolate* isolate, |
+ v8::GCType, |
+ v8::GCCallbackFlags flags) { |
+ v8::HandleScope scope(isolate); |
+ |
+ CHECK_EQ(flags, v8::kNoGCCallbackFlags); |
+ CHECK_EQ(gc_callbacks_isolate, isolate); |
+ ++prologue_call_count_alloc; |
+ |
+ // Simulate full heap to see if we will reenter this callback |
+ SimulateFullSpace(CcTest::heap()->new_space()); |
+ |
+ Local<Object> obj = Object::New(isolate); |
+ ASSERT(!obj.IsEmpty()); |
+ |
+ CcTest::heap()->CollectAllGarbage( |
+ i::Heap::Heap::kAbortIncrementalMarkingMask); |
+} |
+ |
+ |
+void EpilogueCallbackAlloc(v8::Isolate* isolate, |
+ v8::GCType, |
+ v8::GCCallbackFlags flags) { |
+ v8::HandleScope scope(isolate); |
+ |
+ CHECK_EQ(flags, v8::kNoGCCallbackFlags); |
+ CHECK_EQ(gc_callbacks_isolate, isolate); |
+ ++epilogue_call_count_alloc; |
+ |
+ // Simulate full heap to see if we will reenter this callback |
+ SimulateFullSpace(CcTest::heap()->new_space()); |
+ |
+ Local<Object> obj = Object::New(isolate); |
+ ASSERT(!obj.IsEmpty()); |
+ |
+ CcTest::heap()->CollectAllGarbage( |
+ i::Heap::Heap::kAbortIncrementalMarkingMask); |
+} |
+ |
+ |
TEST(GCCallbacksOld) { |
LocalContext context; |
@@ -18690,6 +18732,17 @@ TEST(GCCallbacks) { |
CHECK_EQ(2, epilogue_call_count); |
CHECK_EQ(2, prologue_call_count_second); |
CHECK_EQ(2, epilogue_call_count_second); |
+ |
+ CHECK_EQ(0, prologue_call_count_alloc); |
+ CHECK_EQ(0, epilogue_call_count_alloc); |
+ isolate->AddGCPrologueCallback(PrologueCallbackAlloc); |
+ isolate->AddGCEpilogueCallback(EpilogueCallbackAlloc); |
+ CcTest::heap()->CollectAllGarbage( |
+ i::Heap::Heap::kAbortIncrementalMarkingMask); |
+ CHECK_EQ(1, prologue_call_count_alloc); |
+ CHECK_EQ(1, epilogue_call_count_alloc); |
+ isolate->RemoveGCPrologueCallback(PrologueCallbackAlloc); |
+ isolate->RemoveGCEpilogueCallback(EpilogueCallbackAlloc); |
} |