5858namespace v8 {
5959namespace internal {
6060
61- bool Heap::GCCallbackPair::operator ==(const Heap::GCCallbackPair& other) const {
62- return other.callback == callback;
61+ bool Heap::GCCallbackTuple::operator ==(
62+ const Heap::GCCallbackTuple& other) const {
63+ return other.callback == callback && other.data == data;
6364}
6465
65- Heap::GCCallbackPair & Heap::GCCallbackPair ::operator =(
66- const Heap::GCCallbackPair & other) {
66+ Heap::GCCallbackTuple & Heap::GCCallbackTuple ::operator =(
67+ const Heap::GCCallbackTuple & other) {
6768 callback = other.callback ;
6869 gc_type = other.gc_type ;
69- pass_isolate = other.pass_isolate ;
70+ data = other.data ;
7071 return *this ;
7172}
7273
@@ -1592,35 +1593,21 @@ bool Heap::PerformGarbageCollection(
15921593void Heap::CallGCPrologueCallbacks (GCType gc_type, GCCallbackFlags flags) {
15931594 RuntimeCallTimerScope runtime_timer (isolate (),
15941595 &RuntimeCallStats::GCPrologueCallback);
1595- for (const GCCallbackPair & info : gc_prologue_callbacks_) {
1596+ for (const GCCallbackTuple & info : gc_prologue_callbacks_) {
15961597 if (gc_type & info.gc_type ) {
1597- if (!info.pass_isolate ) {
1598- v8::GCCallback callback =
1599- reinterpret_cast <v8::GCCallback>(info.callback );
1600- callback (gc_type, flags);
1601- } else {
1602- v8::Isolate* isolate = reinterpret_cast <v8::Isolate*>(this ->isolate ());
1603- info.callback (isolate, gc_type, flags);
1604- }
1598+ v8::Isolate* isolate = reinterpret_cast <v8::Isolate*>(this ->isolate ());
1599+ info.callback (isolate, gc_type, flags, info.data );
16051600 }
16061601 }
16071602}
16081603
1609-
1610- void Heap::CallGCEpilogueCallbacks (GCType gc_type,
1611- GCCallbackFlags gc_callback_flags) {
1604+ void Heap::CallGCEpilogueCallbacks (GCType gc_type, GCCallbackFlags flags) {
16121605 RuntimeCallTimerScope runtime_timer (isolate (),
16131606 &RuntimeCallStats::GCEpilogueCallback);
1614- for (const GCCallbackPair & info : gc_epilogue_callbacks_) {
1607+ for (const GCCallbackTuple & info : gc_epilogue_callbacks_) {
16151608 if (gc_type & info.gc_type ) {
1616- if (!info.pass_isolate ) {
1617- v8::GCCallback callback =
1618- reinterpret_cast <v8::GCCallback>(info.callback );
1619- callback (gc_type, gc_callback_flags);
1620- } else {
1621- v8::Isolate* isolate = reinterpret_cast <v8::Isolate*>(this ->isolate ());
1622- info.callback (isolate, gc_type, gc_callback_flags);
1623- }
1609+ v8::Isolate* isolate = reinterpret_cast <v8::Isolate*>(this ->isolate ());
1610+ info.callback (isolate, gc_type, flags, info.data );
16241611 }
16251612 }
16261613}
@@ -6192,21 +6179,21 @@ void Heap::TearDown() {
61926179 memory_allocator_ = nullptr ;
61936180}
61946181
6195-
6196- void Heap::AddGCPrologueCallback (v8::Isolate::GCCallback callback,
6197- GCType gc_type, bool pass_isolate) {
6182+ void Heap::AddGCPrologueCallback (v8::Isolate::GCCallbackWithData callback,
6183+ GCType gc_type, void * data) {
61986184 DCHECK_NOT_NULL (callback);
61996185 DCHECK (gc_prologue_callbacks_.end () ==
62006186 std::find (gc_prologue_callbacks_.begin (), gc_prologue_callbacks_.end (),
6201- GCCallbackPair (callback, gc_type, pass_isolate )));
6202- gc_prologue_callbacks_.emplace_back (callback, gc_type, pass_isolate );
6187+ GCCallbackTuple (callback, gc_type, data )));
6188+ gc_prologue_callbacks_.emplace_back (callback, gc_type, data );
62036189}
62046190
6205-
6206- void Heap::RemoveGCPrologueCallback (v8::Isolate::GCCallback callback ) {
6191+ void Heap::RemoveGCPrologueCallback (v8::Isolate::GCCallbackWithData callback,
6192+ void * data ) {
62076193 DCHECK_NOT_NULL (callback);
62086194 for (size_t i = 0 ; i < gc_prologue_callbacks_.size (); i++) {
6209- if (gc_prologue_callbacks_[i].callback == callback) {
6195+ if (gc_prologue_callbacks_[i].callback == callback &&
6196+ gc_prologue_callbacks_[i].data == data) {
62106197 gc_prologue_callbacks_[i] = gc_prologue_callbacks_.back ();
62116198 gc_prologue_callbacks_.pop_back ();
62126199 return ;
@@ -6215,21 +6202,21 @@ void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) {
62156202 UNREACHABLE ();
62166203}
62176204
6218-
6219- void Heap::AddGCEpilogueCallback (v8::Isolate::GCCallback callback,
6220- GCType gc_type, bool pass_isolate) {
6205+ void Heap::AddGCEpilogueCallback (v8::Isolate::GCCallbackWithData callback,
6206+ GCType gc_type, void * data) {
62216207 DCHECK_NOT_NULL (callback);
62226208 DCHECK (gc_epilogue_callbacks_.end () ==
62236209 std::find (gc_epilogue_callbacks_.begin (), gc_epilogue_callbacks_.end (),
6224- GCCallbackPair (callback, gc_type, pass_isolate )));
6225- gc_epilogue_callbacks_.emplace_back (callback, gc_type, pass_isolate );
6210+ GCCallbackTuple (callback, gc_type, data )));
6211+ gc_epilogue_callbacks_.emplace_back (callback, gc_type, data );
62266212}
62276213
6228-
6229- void Heap::RemoveGCEpilogueCallback (v8::Isolate::GCCallback callback ) {
6214+ void Heap::RemoveGCEpilogueCallback (v8::Isolate::GCCallbackWithData callback,
6215+ void * data ) {
62306216 DCHECK_NOT_NULL (callback);
62316217 for (size_t i = 0 ; i < gc_epilogue_callbacks_.size (); i++) {
6232- if (gc_epilogue_callbacks_[i].callback == callback) {
6218+ if (gc_epilogue_callbacks_[i].callback == callback &&
6219+ gc_epilogue_callbacks_[i].data == data) {
62336220 gc_epilogue_callbacks_[i] = gc_epilogue_callbacks_.back ();
62346221 gc_epilogue_callbacks_.pop_back ();
62356222 return ;
0 commit comments