diff options
author | Fedor Indutny <fedor.indutny@gmail.com> | 2014-03-13 20:47:02 +0400 |
---|---|---|
committer | Fedor Indutny <fedor.indutny@gmail.com> | 2014-03-13 20:56:56 +0400 |
commit | 0c5a0ecc7c8b203aa34a43f0fb8f3bf81cce7f41 (patch) | |
tree | e9c2b2de91c5284c381cbb5b307109fb66cd29ea /deps/v8/test/cctest | |
parent | 030d03190f3daf323b78138717b2e84cf299cdbe (diff) | |
download | node-new-0c5a0ecc7c8b203aa34a43f0fb8f3bf81cce7f41.tar.gz |
deps: allow allocations in gc epilogue/prologue
See https://codereview.chromium.org/177243012/
Diffstat (limited to 'deps/v8/test/cctest')
-rw-r--r-- | deps/v8/test/cctest/test-api.cc | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 9312057fa2..d2dbe63f56 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/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); } |