diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-09-08 15:36:50 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2017-10-18 17:04:41 -0700 |
commit | d7456ab2ebb3d4c45deb09420271f0da437685f8 (patch) | |
tree | ac380c89bbce966b75a69c61b9541de26f0df999 /deps/v8/test | |
parent | 2780f01392a43a0714d7f5c871eb73c04f4551e8 (diff) | |
download | node-new-d7456ab2ebb3d4c45deb09420271f0da437685f8.tar.gz |
deps: cherry-pick 9b21865822243 from V8 upstream
Original commit message:
[api] Add optional data pointer to GC callbacks
This can be useful when there may be multiple callbacks attached by
code that's not directly tied to a single isolate, e.g. working
on a per-context basis.
This also allows rephrasing the global non-isolate APIs in terms
of this new API, rather than working around it inside `src/heap`.
TBR=hpayer@chromium.org
Bug:
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_rel_ng
Change-Id: I2e490ec40d1a34ea812f25f41ef9741d2116d965
Reviewed-on: https://chromium-review.googlesource.com/647548
Reviewed-by: Yang Guo <yangguo@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Commit-Queue: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47923}
PR-URL: https://github.com/nodejs/node/pull/15391
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Diffstat (limited to 'deps/v8/test')
-rw-r--r-- | deps/v8/test/cctest/test-api.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index be8869671a..5fce13bdfa 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -19686,6 +19686,19 @@ void EpilogueCallbackSecond(v8::Isolate* isolate, ++epilogue_call_count_second; } +void PrologueCallbackNew(v8::Isolate* isolate, v8::GCType, + v8::GCCallbackFlags flags, void* data) { + CHECK_EQ(flags, v8::kNoGCCallbackFlags); + CHECK_EQ(gc_callbacks_isolate, isolate); + ++*static_cast<int*>(data); +} + +void EpilogueCallbackNew(v8::Isolate* isolate, v8::GCType, + v8::GCCallbackFlags flags, void* data) { + CHECK_EQ(flags, v8::kNoGCCallbackFlags); + CHECK_EQ(gc_callbacks_isolate, isolate); + ++*static_cast<int*>(data); +} void PrologueCallbackAlloc(v8::Isolate* isolate, v8::GCType, @@ -19760,6 +19773,52 @@ TEST(GCCallbacksOld) { CHECK_EQ(2, epilogue_call_count_second); } +TEST(GCCallbacksWithData) { + LocalContext context; + + gc_callbacks_isolate = context->GetIsolate(); + int prologue1 = 0; + int epilogue1 = 0; + int prologue2 = 0; + int epilogue2 = 0; + + context->GetIsolate()->AddGCPrologueCallback(PrologueCallbackNew, &prologue1); + context->GetIsolate()->AddGCEpilogueCallback(EpilogueCallbackNew, &epilogue1); + CHECK_EQ(0, prologue1); + CHECK_EQ(0, epilogue1); + CHECK_EQ(0, prologue2); + CHECK_EQ(0, epilogue2); + CcTest::CollectAllGarbage(); + CHECK_EQ(1, prologue1); + CHECK_EQ(1, epilogue1); + CHECK_EQ(0, prologue2); + CHECK_EQ(0, epilogue2); + context->GetIsolate()->AddGCPrologueCallback(PrologueCallbackNew, &prologue2); + context->GetIsolate()->AddGCEpilogueCallback(EpilogueCallbackNew, &epilogue2); + CcTest::CollectAllGarbage(); + CHECK_EQ(2, prologue1); + CHECK_EQ(2, epilogue1); + CHECK_EQ(1, prologue2); + CHECK_EQ(1, epilogue2); + context->GetIsolate()->RemoveGCPrologueCallback(PrologueCallbackNew, + &prologue1); + context->GetIsolate()->RemoveGCEpilogueCallback(EpilogueCallbackNew, + &epilogue1); + CcTest::CollectAllGarbage(); + CHECK_EQ(2, prologue1); + CHECK_EQ(2, epilogue1); + CHECK_EQ(2, prologue2); + CHECK_EQ(2, epilogue2); + context->GetIsolate()->RemoveGCPrologueCallback(PrologueCallbackNew, + &prologue2); + context->GetIsolate()->RemoveGCEpilogueCallback(EpilogueCallbackNew, + &epilogue2); + CcTest::CollectAllGarbage(); + CHECK_EQ(2, prologue1); + CHECK_EQ(2, epilogue1); + CHECK_EQ(2, prologue2); + CHECK_EQ(2, epilogue2); +} TEST(GCCallbacks) { LocalContext context; |