summaryrefslogtreecommitdiff
path: root/deps/v8/test
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-09-08 15:36:50 +0200
committerMichaël Zasso <targos@protonmail.com>2017-10-18 17:04:41 -0700
commitd7456ab2ebb3d4c45deb09420271f0da437685f8 (patch)
treeac380c89bbce966b75a69c61b9541de26f0df999 /deps/v8/test
parent2780f01392a43a0714d7f5c871eb73c04f4551e8 (diff)
downloadnode-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.cc59
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;