| 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);
|
| }
|
|
|
|
|
|
|