5757namespace v8 {
5858namespace internal {
5959
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;
6263}
6364
64- Heap::GCCallbackPair & Heap::GCCallbackPair ::operator =(
65- const Heap::GCCallbackPair & other) {
65+ Heap::GCCallbackTuple & Heap::GCCallbackTuple ::operator =(
66+ const Heap::GCCallbackTuple & other) {
6667 callback = other.callback ;
6768 gc_type = other.gc_type ;
68- pass_isolate = other.pass_isolate ;
69+ data = other.data ;
6970 return *this ;
7071}
7172
@@ -1513,35 +1514,21 @@ bool Heap::PerformGarbageCollection(
15131514void Heap::CallGCPrologueCallbacks (GCType gc_type, GCCallbackFlags flags) {
15141515 RuntimeCallTimerScope runtime_timer (isolate (),
15151516 &RuntimeCallStats::GCPrologueCallback);
1516- for (const GCCallbackPair & info : gc_prologue_callbacks_) {
1517+ for (const GCCallbackTuple & info : gc_prologue_callbacks_) {
15171518 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 );
15261521 }
15271522 }
15281523}
15291524
1530-
1531- void Heap::CallGCEpilogueCallbacks (GCType gc_type,
1532- GCCallbackFlags gc_callback_flags) {
1525+ void Heap::CallGCEpilogueCallbacks (GCType gc_type, GCCallbackFlags flags) {
15331526 RuntimeCallTimerScope runtime_timer (isolate (),
15341527 &RuntimeCallStats::GCEpilogueCallback);
1535- for (const GCCallbackPair & info : gc_epilogue_callbacks_) {
1528+ for (const GCCallbackTuple & info : gc_epilogue_callbacks_) {
15361529 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 );
15451532 }
15461533 }
15471534}
@@ -5973,21 +5960,21 @@ void Heap::TearDown() {
59735960 memory_allocator_ = nullptr ;
59745961}
59755962
5976-
5977- void Heap::AddGCPrologueCallback (v8::Isolate::GCCallback callback,
5978- GCType gc_type, bool pass_isolate) {
5963+ void Heap::AddGCPrologueCallback (v8::Isolate::GCCallbackWithData callback,
5964+ GCType gc_type, void * data) {
59795965 DCHECK_NOT_NULL (callback);
59805966 DCHECK (gc_prologue_callbacks_.end () ==
59815967 std::find (gc_prologue_callbacks_.begin (), gc_prologue_callbacks_.end (),
5982- GCCallbackPair (callback, gc_type, pass_isolate )));
5983- gc_prologue_callbacks_.emplace_back (callback, gc_type, pass_isolate );
5968+ GCCallbackTuple (callback, gc_type, data )));
5969+ gc_prologue_callbacks_.emplace_back (callback, gc_type, data );
59845970}
59855971
5986-
5987- void Heap::RemoveGCPrologueCallback (v8::Isolate::GCCallback callback ) {
5972+ void Heap::RemoveGCPrologueCallback (v8::Isolate::GCCallbackWithData callback,
5973+ void * data ) {
59885974 DCHECK_NOT_NULL (callback);
59895975 for (size_t i = 0 ; i < gc_prologue_callbacks_.size (); i++) {
5990- if (gc_prologue_callbacks_[i].callback == callback) {
5976+ if (gc_prologue_callbacks_[i].callback == callback &&
5977+ gc_prologue_callbacks_[i].data == data) {
59915978 gc_prologue_callbacks_[i] = gc_prologue_callbacks_.back ();
59925979 gc_prologue_callbacks_.pop_back ();
59935980 return ;
@@ -5996,21 +5983,21 @@ void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) {
59965983 UNREACHABLE ();
59975984}
59985985
5999-
6000- void Heap::AddGCEpilogueCallback (v8::Isolate::GCCallback callback,
6001- GCType gc_type, bool pass_isolate) {
5986+ void Heap::AddGCEpilogueCallback (v8::Isolate::GCCallbackWithData callback,
5987+ GCType gc_type, void * data) {
60025988 DCHECK_NOT_NULL (callback);
60035989 DCHECK (gc_epilogue_callbacks_.end () ==
60045990 std::find (gc_epilogue_callbacks_.begin (), gc_epilogue_callbacks_.end (),
6005- GCCallbackPair (callback, gc_type, pass_isolate )));
6006- gc_epilogue_callbacks_.emplace_back (callback, gc_type, pass_isolate );
5991+ GCCallbackTuple (callback, gc_type, data )));
5992+ gc_epilogue_callbacks_.emplace_back (callback, gc_type, data );
60075993}
60085994
6009-
6010- void Heap::RemoveGCEpilogueCallback (v8::Isolate::GCCallback callback ) {
5995+ void Heap::RemoveGCEpilogueCallback (v8::Isolate::GCCallbackWithData callback,
5996+ void * data ) {
60115997 DCHECK_NOT_NULL (callback);
60125998 for (size_t i = 0 ; i < gc_epilogue_callbacks_.size (); i++) {
6013- if (gc_epilogue_callbacks_[i].callback == callback) {
5999+ if (gc_epilogue_callbacks_[i].callback == callback &&
6000+ gc_epilogue_callbacks_[i].data == data) {
60146001 gc_epilogue_callbacks_[i] = gc_epilogue_callbacks_.back ();
60156002 gc_epilogue_callbacks_.pop_back ();
60166003 return ;
0 commit comments