| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent e1828eb commit b4ad15b
5 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -7169,6 +7169,8 @@ class V8_EXPORT Isolate { | |||
| 7169 | 7169 | ||
| 7170 | 7170 | typedef void (*GCCallback)(Isolate* isolate, GCType type, | |
| 7171 | 7171 | GCCallbackFlags flags); | |
| 7172 | + typedef void (*GCCallbackWithData)(Isolate* isolate, GCType type, | ||
| 7173 | + GCCallbackFlags flags, void* data); | ||
| 7172 | 7174 | ||
| 7173 | 7175 | /** | |
| 7174 | 7176 | * Enables the host application to receive a notification before a | |
@@ -7179,13 +7181,16 @@ class V8_EXPORT Isolate { | |||
| 7179 | 7181 | * not possible to register the same callback function two times with | |
| 7180 | 7182 | * different GCType filters. | |
| 7181 | 7183 | */ | |
| 7184 | + void AddGCPrologueCallback(GCCallbackWithData callback, void* data = nullptr, | ||
| 7185 | + GCType gc_type_filter = kGCTypeAll); | ||
| 7182 | 7186 | void AddGCPrologueCallback(GCCallback callback, | |
| 7183 | 7187 | GCType gc_type_filter = kGCTypeAll); | |
| 7184 | 7188 | ||
| 7185 | 7189 | /** | |
| 7186 | 7190 | * This function removes callback which was installed by | |
| 7187 | 7191 | * AddGCPrologueCallback function. | |
| 7188 | 7192 | */ | |
| 7193 | + void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr); | ||
| 7189 | 7194 | void RemoveGCPrologueCallback(GCCallback callback); | |
| 7190 | 7195 | ||
| 7191 | 7196 | /** | |
@@ -7202,13 +7207,17 @@ class V8_EXPORT Isolate { | |||
| 7202 | 7207 | * not possible to register the same callback function two times with | |
| 7203 | 7208 | * different GCType filters. | |
| 7204 | 7209 | */ | |
| 7210 | + void AddGCEpilogueCallback(GCCallbackWithData callback, void* data = nullptr, | ||
| 7211 | + GCType gc_type_filter = kGCTypeAll); | ||
| 7205 | 7212 | void AddGCEpilogueCallback(GCCallback callback, | |
| 7206 | 7213 | GCType gc_type_filter = kGCTypeAll); | |
| 7207 | 7214 | ||
| 7208 | 7215 | /** | |
| 7209 | 7216 | * This function removes callback which was installed by | |
| 7210 | 7217 | * AddGCEpilogueCallback function. | |
| 7211 | 7218 | */ | |
| 7219 | + void RemoveGCEpilogueCallback(GCCallbackWithData callback, | ||
| 7220 | + void* data = nullptr); | ||
| 7212 | 7221 | void RemoveGCEpilogueCallback(GCCallback callback); | |
| 7213 | 7222 | ||
| 7214 | 7223 | typedef size_t (*GetExternallyAllocatedMemoryInBytesCallback)(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -8338,41 +8338,70 @@ v8::Local<Value> Isolate::ThrowException(v8::Local<v8::Value> value) { | |||
| 8338 | 8338 | return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | |
| 8339 | 8339 | } | |
| 8340 | 8340 | ||
| 8341 | - void Isolate::AddGCPrologueCallback(GCCallback callback, GCType gc_type) { | ||
| 8341 | + void Isolate::AddGCPrologueCallback(GCCallbackWithData callback, void* data, | ||
| 8342 | + GCType gc_type) { | ||
| 8342 | 8343 | i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | |
| 8343 | - isolate->heap()->AddGCPrologueCallback(callback, gc_type); | ||
| 8344 | + isolate->heap()->AddGCPrologueCallback(callback, gc_type, data); | ||
| 8344 | 8345 | } | |
| 8345 | 8346 | ||
| 8346 | - | ||
| 8347 | - void Isolate::RemoveGCPrologueCallback(GCCallback callback) { | ||
| 8347 | + void Isolate::RemoveGCPrologueCallback(GCCallbackWithData callback, | ||
| 8348 | + void* data) { | ||
| 8348 | 8349 | i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | |
| 8349 | - isolate->heap()->RemoveGCPrologueCallback(callback); | ||
| 8350 | + isolate->heap()->RemoveGCPrologueCallback(callback, data); | ||
| 8350 | 8351 | } | |
| 8351 | 8352 | ||
| 8353 | + void Isolate::AddGCEpilogueCallback(GCCallbackWithData callback, void* data, | ||
| 8354 | + GCType gc_type) { | ||
| 8355 | + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | ||
| 8356 | + isolate->heap()->AddGCEpilogueCallback(callback, gc_type, data); | ||
| 8357 | + } | ||
| 8352 | 8358 | ||
| 8353 | - void Isolate::AddGCEpilogueCallback(GCCallback callback, GCType gc_type) { | ||
| 8359 | + void Isolate::RemoveGCEpilogueCallback(GCCallbackWithData callback, | ||
| 8360 | + void* data) { | ||
| 8354 | 8361 | i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | |
| 8355 | - isolate->heap()->AddGCEpilogueCallback(callback, gc_type); | ||
| 8362 | + isolate->heap()->RemoveGCEpilogueCallback(callback, data); | ||
| 8356 | 8363 | } | |
| 8357 | 8364 | ||
| 8365 | + static void CallGCCallbackWithoutData(Isolate* isolate, GCType type, | ||
| 8366 | + GCCallbackFlags flags, void* data) { | ||
| 8367 | + reinterpret_cast<Isolate::GCCallback>(data)(isolate, type, flags); | ||
| 8368 | + } | ||
| 8358 | 8369 | ||
| 8359 | - void Isolate::RemoveGCEpilogueCallback(GCCallback callback) { | ||
| 8360 | - i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | ||
| 8361 | - isolate->heap()->RemoveGCEpilogueCallback(callback); | ||
| 8370 | + void Isolate::AddGCPrologueCallback(GCCallback callback, GCType gc_type) { | ||
| 8371 | + void* data = reinterpret_cast<void*>(callback); | ||
| 8372 | + AddGCPrologueCallback(CallGCCallbackWithoutData, data, gc_type); | ||
| 8362 | 8373 | } | |
| 8363 | 8374 | ||
| 8375 | + void Isolate::RemoveGCPrologueCallback(GCCallback callback) { | ||
| 8376 | + void* data = reinterpret_cast<void*>(callback); | ||
| 8377 | + RemoveGCPrologueCallback(CallGCCallbackWithoutData, data); | ||
| 8378 | + } | ||
| 8364 | 8379 | ||
| 8365 | - void V8::AddGCPrologueCallback(GCCallback callback, GCType gc_type) { | ||
| 8366 | - i::Isolate* isolate = i::Isolate::Current(); | ||
| 8367 | - isolate->heap()->AddGCPrologueCallback( | ||
| 8368 | - reinterpret_cast<v8::Isolate::GCCallback>(callback), gc_type, false); | ||
| 8380 | + void Isolate::AddGCEpilogueCallback(GCCallback callback, GCType gc_type) { | ||
| 8381 | + void* data = reinterpret_cast<void*>(callback); | ||
| 8382 | + AddGCEpilogueCallback(CallGCCallbackWithoutData, data, gc_type); | ||
| 8383 | + } | ||
| 8384 | + | ||
| 8385 | + void Isolate::RemoveGCEpilogueCallback(GCCallback callback) { | ||
| 8386 | + void* data = reinterpret_cast<void*>(callback); | ||
| 8387 | + RemoveGCEpilogueCallback(CallGCCallbackWithoutData, data); | ||
| 8369 | 8388 | } | |
| 8370 | 8389 | ||
| 8390 | + static void CallGCCallbackWithoutIsolate(Isolate* isolate, GCType type, | ||
| 8391 | + GCCallbackFlags flags, void* data) { | ||
| 8392 | + reinterpret_cast<v8::GCCallback>(data)(type, flags); | ||
| 8393 | + } | ||
| 8371 | 8394 | ||
| 8372 | - void V8::AddGCEpilogueCallback(GCCallback callback, GCType gc_type) { | ||
| 8373 | - i::Isolate* isolate = i::Isolate::Current(); | ||
| 8374 | - isolate->heap()->AddGCEpilogueCallback( | ||
| 8375 | - reinterpret_cast<v8::Isolate::GCCallback>(callback), gc_type, false); | ||
| 8395 | + void V8::AddGCPrologueCallback(v8::GCCallback callback, GCType gc_type) { | ||
| 8396 | + void* data = reinterpret_cast<void*>(callback); | ||
| 8397 | + Isolate::GetCurrent()->AddGCPrologueCallback(CallGCCallbackWithoutIsolate, | ||
| 8398 | + data, gc_type); | ||
| 8399 | + } | ||
| 8400 | + | ||
| 8401 | + void V8::AddGCEpilogueCallback(v8::GCCallback callback, GCType gc_type) { | ||
| 8402 | + void* data = reinterpret_cast<void*>(callback); | ||
| 8403 | + Isolate::GetCurrent()->AddGCEpilogueCallback(CallGCCallbackWithoutIsolate, | ||
| 8404 | + data, gc_type); | ||
| 8376 | 8405 | } | |
| 8377 | 8406 | ||
| 8378 | 8407 | void Isolate::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -57,15 +57,16 @@ | |||
| 57 | 57 | namespace v8 { | |
| 58 | 58 | namespace internal { | |
| 59 | 59 | ||
| 60 | - bool Heap::GCCallbackPair::operator==(const Heap::GCCallbackPair& other) const { | ||
| 61 | - return other.callback == callback; | ||
| 60 | + bool Heap::GCCallbackTuple::operator==( | ||
| 61 | + const Heap::GCCallbackTuple& other) const { | ||
| 62 | + return other.callback == callback && other.data == data; | ||
| 62 | 63 | } | |
| 63 | 64 | ||
| 64 | - Heap::GCCallbackPair& Heap::GCCallbackPair::operator=( | ||
| 65 | - const Heap::GCCallbackPair& other) { | ||
| 65 | + Heap::GCCallbackTuple& Heap::GCCallbackTuple::operator=( | ||
| 66 | + const Heap::GCCallbackTuple& other) { | ||
| 66 | 67 | callback = other.callback; | |
| 67 | 68 | gc_type = other.gc_type; | |
| 68 | - pass_isolate = other.pass_isolate; | ||
| 69 | + data = other.data; | ||
| 69 | 70 | return *this; | |
| 70 | 71 | } | |
| 71 | 72 | ||
@@ -1513,35 +1514,21 @@ bool Heap::PerformGarbageCollection( | |||
| 1513 | 1514 | void Heap::CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags) { | |
| 1514 | 1515 | RuntimeCallTimerScope runtime_timer(isolate(), | |
| 1515 | 1516 | &RuntimeCallStats::GCPrologueCallback); | |
| 1516 | - for (const GCCallbackPair& info : gc_prologue_callbacks_) { | ||
| 1517 | + for (const GCCallbackTuple& info : gc_prologue_callbacks_) { | ||
| 1517 | 1518 | if (gc_type & info.gc_type) { | |
| 1518 | - if (!info.pass_isolate) { | ||
| 1519 | - v8::GCCallback callback = | ||
| 1520 | - reinterpret_cast<v8::GCCallback>(info.callback); | ||
| 1521 | - callback(gc_type, flags); | ||
| 1522 | - } else { | ||
| 1523 | - v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | ||
| 1524 | - info.callback(isolate, gc_type, flags); | ||
| 1525 | - } | ||
| 1519 | + v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | ||
| 1520 | + info.callback(isolate, gc_type, flags, info.data); | ||
| 1526 | 1521 | } | |
| 1527 | 1522 | } | |
| 1528 | 1523 | } | |
| 1529 | 1524 | ||
| 1530 | - | ||
| 1531 | - void Heap::CallGCEpilogueCallbacks(GCType gc_type, | ||
| 1532 | - GCCallbackFlags gc_callback_flags) { | ||
| 1525 | + void Heap::CallGCEpilogueCallbacks(GCType gc_type, GCCallbackFlags flags) { | ||
| 1533 | 1526 | RuntimeCallTimerScope runtime_timer(isolate(), | |
| 1534 | 1527 | &RuntimeCallStats::GCEpilogueCallback); | |
| 1535 | - for (const GCCallbackPair& info : gc_epilogue_callbacks_) { | ||
| 1528 | + for (const GCCallbackTuple& info : gc_epilogue_callbacks_) { | ||
| 1536 | 1529 | if (gc_type & info.gc_type) { | |
| 1537 | - if (!info.pass_isolate) { | ||
| 1538 | - v8::GCCallback callback = | ||
| 1539 | - reinterpret_cast<v8::GCCallback>(info.callback); | ||
| 1540 | - callback(gc_type, gc_callback_flags); | ||
| 1541 | - } else { | ||
| 1542 | - v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | ||
| 1543 | - info.callback(isolate, gc_type, gc_callback_flags); | ||
| 1544 | - } | ||
| 1530 | + v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | ||
| 1531 | + info.callback(isolate, gc_type, flags, info.data); | ||
| 1545 | 1532 | } | |
| 1546 | 1533 | } | |
| 1547 | 1534 | } | |
@@ -5963,21 +5950,21 @@ void Heap::TearDown() { | |||
| 5963 | 5950 | memory_allocator_ = nullptr; | |
| 5964 | 5951 | } | |
| 5965 | 5952 | ||
| 5966 | - | ||
| 5967 | - void Heap::AddGCPrologueCallback(v8::Isolate::GCCallback callback, | ||
| 5968 | - GCType gc_type, bool pass_isolate) { | ||
| 5953 | + void Heap::AddGCPrologueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 5954 | + GCType gc_type, void* data) { | ||
| 5969 | 5955 | DCHECK_NOT_NULL(callback); | |
| 5970 | 5956 | DCHECK(gc_prologue_callbacks_.end() == | |
| 5971 | 5957 | std::find(gc_prologue_callbacks_.begin(), gc_prologue_callbacks_.end(), | |
| 5972 | - GCCallbackPair(callback, gc_type, pass_isolate))); | ||
| 5973 | - gc_prologue_callbacks_.emplace_back(callback, gc_type, pass_isolate); | ||
| 5958 | + GCCallbackTuple(callback, gc_type, data))); | ||
| 5959 | + gc_prologue_callbacks_.emplace_back(callback, gc_type, data); | ||
| 5974 | 5960 | } | |
| 5975 | 5961 | ||
| 5976 | - | ||
| 5977 | - void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) { | ||
| 5962 | + void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 5963 | + void* data) { | ||
| 5978 | 5964 | DCHECK_NOT_NULL(callback); | |
| 5979 | 5965 | for (size_t i = 0; i < gc_prologue_callbacks_.size(); i++) { | |
| 5980 | - if (gc_prologue_callbacks_[i].callback == callback) { | ||
| 5966 | + if (gc_prologue_callbacks_[i].callback == callback && | ||
| 5967 | + gc_prologue_callbacks_[i].data == data) { | ||
| 5981 | 5968 | gc_prologue_callbacks_[i] = gc_prologue_callbacks_.back(); | |
| 5982 | 5969 | gc_prologue_callbacks_.pop_back(); | |
| 5983 | 5970 | return; | |
@@ -5986,21 +5973,21 @@ void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) { | |||
| 5986 | 5973 | UNREACHABLE(); | |
| 5987 | 5974 | } | |
| 5988 | 5975 | ||
| 5989 | - | ||
| 5990 | - void Heap::AddGCEpilogueCallback(v8::Isolate::GCCallback callback, | ||
| 5991 | - GCType gc_type, bool pass_isolate) { | ||
| 5976 | + void Heap::AddGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 5977 | + GCType gc_type, void* data) { | ||
| 5992 | 5978 | DCHECK_NOT_NULL(callback); | |
| 5993 | 5979 | DCHECK(gc_epilogue_callbacks_.end() == | |
| 5994 | 5980 | std::find(gc_epilogue_callbacks_.begin(), gc_epilogue_callbacks_.end(), | |
| 5995 | - GCCallbackPair(callback, gc_type, pass_isolate))); | ||
| 5996 | - gc_epilogue_callbacks_.emplace_back(callback, gc_type, pass_isolate); | ||
| 5981 | + GCCallbackTuple(callback, gc_type, data))); | ||
| 5982 | + gc_epilogue_callbacks_.emplace_back(callback, gc_type, data); | ||
| 5997 | 5983 | } | |
| 5998 | 5984 | ||
| 5999 | - | ||
| 6000 | - void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) { | ||
| 5985 | + void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 5986 | + void* data) { | ||
| 6001 | 5987 | DCHECK_NOT_NULL(callback); | |
| 6002 | 5988 | for (size_t i = 0; i < gc_epilogue_callbacks_.size(); i++) { | |
| 6003 | - if (gc_epilogue_callbacks_[i].callback == callback) { | ||
| 5989 | + if (gc_epilogue_callbacks_[i].callback == callback && | ||
| 5990 | + gc_epilogue_callbacks_[i].data == data) { | ||
| 6004 | 5991 | gc_epilogue_callbacks_[i] = gc_epilogue_callbacks_.back(); | |
| 6005 | 5992 | gc_epilogue_callbacks_.pop_back(); | |
| 6006 | 5993 | return; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1414,13 +1414,15 @@ class Heap { | |||
| 1414 | 1414 | // Prologue/epilogue callback methods.======================================== | |
| 1415 | 1415 | // =========================================================================== | |
| 1416 | 1416 | ||
| 1417 | - void AddGCPrologueCallback(v8::Isolate::GCCallback callback, | ||
| 1418 | - GCType gc_type_filter, bool pass_isolate = true); | ||
| 1419 | - void RemoveGCPrologueCallback(v8::Isolate::GCCallback callback); | ||
| 1417 | + void AddGCPrologueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 1418 | + GCType gc_type_filter, void* data); | ||
| 1419 | + void RemoveGCPrologueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 1420 | + void* data); | ||
| 1420 | 1421 | ||
| 1421 | - void AddGCEpilogueCallback(v8::Isolate::GCCallback callback, | ||
| 1422 | - GCType gc_type_filter, bool pass_isolate = true); | ||
| 1423 | - void RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback); | ||
| 1422 | + void AddGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 1423 | + GCType gc_type_filter, void* data); | ||
| 1424 | + void RemoveGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback, | ||
| 1425 | + void* data); | ||
| 1424 | 1426 | ||
| 1425 | 1427 | void CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags); | |
| 1426 | 1428 | void CallGCEpilogueCallbacks(GCType gc_type, GCCallbackFlags flags); | |
@@ -1580,17 +1582,17 @@ class Heap { | |||
| 1580 | 1582 | RootListIndex index; | |
| 1581 | 1583 | }; | |
| 1582 | 1584 | ||
| 1583 | - struct GCCallbackPair { | ||
| 1584 | - GCCallbackPair(v8::Isolate::GCCallback callback, GCType gc_type, | ||
| 1585 | - bool pass_isolate) | ||
| 1586 | - : callback(callback), gc_type(gc_type), pass_isolate(pass_isolate) {} | ||
| 1585 | + struct GCCallbackTuple { | ||
| 1586 | + GCCallbackTuple(v8::Isolate::GCCallbackWithData callback, GCType gc_type, | ||
| 1587 | + void* data) | ||
| 1588 | + : callback(callback), gc_type(gc_type), data(data) {} | ||
| 1587 | 1589 | ||
| 1588 | - bool operator==(const GCCallbackPair& other) const; | ||
| 1589 | - GCCallbackPair& operator=(const GCCallbackPair& other); | ||
| 1590 | + bool operator==(const GCCallbackTuple& other) const; | ||
| 1591 | + GCCallbackTuple& operator=(const GCCallbackTuple& other); | ||
| 1590 | 1592 | ||
| 1591 | - v8::Isolate::GCCallback callback; | ||
| 1593 | + v8::Isolate::GCCallbackWithData callback; | ||
| 1592 | 1594 | GCType gc_type; | |
| 1593 | - bool pass_isolate; | ||
| 1595 | + void* data; | ||
| 1594 | 1596 | }; | |
| 1595 | 1597 | ||
| 1596 | 1598 | typedef String* (*ExternalStringTableUpdaterCallback)(Heap* heap, | |
@@ -2254,8 +2256,8 @@ class Heap { | |||
| 2254 | 2256 | ||
| 2255 | 2257 | Object* encountered_transition_arrays_; | |
| 2256 | 2258 | ||
| 2257 | - std::vector<GCCallbackPair> gc_epilogue_callbacks_; | ||
| 2258 | - std::vector<GCCallbackPair> gc_prologue_callbacks_; | ||
| 2259 | + std::vector<GCCallbackTuple> gc_epilogue_callbacks_; | ||
| 2260 | + std::vector<GCCallbackTuple> gc_prologue_callbacks_; | ||
| 2259 | 2261 | ||
| 2260 | 2262 | GetExternallyAllocatedMemoryInBytesCallback external_memory_callback_; | |
| 2261 | 2263 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -19592,6 +19592,19 @@ void EpilogueCallbackSecond(v8::Isolate* isolate, | |||
| 19592 | 19592 | ++epilogue_call_count_second; | |
| 19593 | 19593 | } | |
| 19594 | 19594 | ||
| 19595 | + void PrologueCallbackNew(v8::Isolate* isolate, v8::GCType, | ||
| 19596 | + v8::GCCallbackFlags flags, void* data) { | ||
| 19597 | + CHECK_EQ(flags, v8::kNoGCCallbackFlags); | ||
| 19598 | + CHECK_EQ(gc_callbacks_isolate, isolate); | ||
| 19599 | + ++*static_cast<int*>(data); | ||
| 19600 | + } | ||
| 19601 | + | ||
| 19602 | + void EpilogueCallbackNew(v8::Isolate* isolate, v8::GCType, | ||
| 19603 | + v8::GCCallbackFlags flags, void* data) { | ||
| 19604 | + CHECK_EQ(flags, v8::kNoGCCallbackFlags); | ||
| 19605 | + CHECK_EQ(gc_callbacks_isolate, isolate); | ||
| 19606 | + ++*static_cast<int*>(data); | ||
| 19607 | + } | ||
| 19595 | 19608 | ||
| 19596 | 19609 | void PrologueCallbackAlloc(v8::Isolate* isolate, | |
| 19597 | 19610 | v8::GCType, | |
@@ -19666,6 +19679,52 @@ TEST(GCCallbacksOld) { | |||
| 19666 | 19679 | CHECK_EQ(2, epilogue_call_count_second); | |
| 19667 | 19680 | } | |
| 19668 | 19681 | ||
| 19682 | + TEST(GCCallbacksWithData) { | ||
| 19683 | + LocalContext context; | ||
| 19684 | + | ||
| 19685 | + gc_callbacks_isolate = context->GetIsolate(); | ||
| 19686 | + int prologue1 = 0; | ||
| 19687 | + int epilogue1 = 0; | ||
| 19688 | + int prologue2 = 0; | ||
| 19689 | + int epilogue2 = 0; | ||
| 19690 | + | ||
| 19691 | + context->GetIsolate()->AddGCPrologueCallback(PrologueCallbackNew, &prologue1); | ||
| 19692 | + context->GetIsolate()->AddGCEpilogueCallback(EpilogueCallbackNew, &epilogue1); | ||
| 19693 | + CHECK_EQ(0, prologue1); | ||
| 19694 | + CHECK_EQ(0, epilogue1); | ||
| 19695 | + CHECK_EQ(0, prologue2); | ||
| 19696 | + CHECK_EQ(0, epilogue2); | ||
| 19697 | + CcTest::CollectAllGarbage(); | ||
| 19698 | + CHECK_EQ(1, prologue1); | ||
| 19699 | + CHECK_EQ(1, epilogue1); | ||
| 19700 | + CHECK_EQ(0, prologue2); | ||
| 19701 | + CHECK_EQ(0, epilogue2); | ||
| 19702 | + context->GetIsolate()->AddGCPrologueCallback(PrologueCallbackNew, &prologue2); | ||
| 19703 | + context->GetIsolate()->AddGCEpilogueCallback(EpilogueCallbackNew, &epilogue2); | ||
| 19704 | + CcTest::CollectAllGarbage(); | ||
| 19705 | + CHECK_EQ(2, prologue1); | ||
| 19706 | + CHECK_EQ(2, epilogue1); | ||
| 19707 | + CHECK_EQ(1, prologue2); | ||
| 19708 | + CHECK_EQ(1, epilogue2); | ||
| 19709 | + context->GetIsolate()->RemoveGCPrologueCallback(PrologueCallbackNew, | ||
| 19710 | + &prologue1); | ||
| 19711 | + context->GetIsolate()->RemoveGCEpilogueCallback(EpilogueCallbackNew, | ||
| 19712 | + &epilogue1); | ||
| 19713 | + CcTest::CollectAllGarbage(); | ||
| 19714 | + CHECK_EQ(2, prologue1); | ||
| 19715 | + CHECK_EQ(2, epilogue1); | ||
| 19716 | + CHECK_EQ(2, prologue2); | ||
| 19717 | + CHECK_EQ(2, epilogue2); | ||
| 19718 | + context->GetIsolate()->RemoveGCPrologueCallback(PrologueCallbackNew, | ||
| 19719 | + &prologue2); | ||
| 19720 | + context->GetIsolate()->RemoveGCEpilogueCallback(EpilogueCallbackNew, | ||
| 19721 | + &epilogue2); | ||
| 19722 | + CcTest::CollectAllGarbage(); | ||
| 19723 | + CHECK_EQ(2, prologue1); | ||
| 19724 | + CHECK_EQ(2, epilogue1); | ||
| 19725 | + CHECK_EQ(2, prologue2); | ||
| 19726 | + CHECK_EQ(2, epilogue2); | ||
| 19727 | + } | ||
| 19669 | 19728 | ||
| 19670 | 19729 | TEST(GCCallbacks) { | |
| 19671 | 19730 | LocalContext context; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments