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;
62
+ }
63
+
64
+ Heap::GCCallbackPair& Heap::GCCallbackPair::operator =(
65
+ const Heap::GCCallbackPair& other) {
66
+ callback = other.callback ;
67
+ gc_type = other.gc_type ;
68
+ pass_isolate = other.pass_isolate ;
69
+ return *this ;
70
+ }
71
+
60
72
struct Heap ::StrongRootsList {
61
73
Object** start;
62
74
Object** end;
@@ -1501,15 +1513,15 @@ bool Heap::PerformGarbageCollection(
1501
1513
void Heap::CallGCPrologueCallbacks (GCType gc_type, GCCallbackFlags flags) {
1502
1514
RuntimeCallTimerScope runtime_timer (isolate (),
1503
1515
&RuntimeCallStats::GCPrologueCallback);
1504
- for (int i = 0 ; i < gc_prologue_callbacks_. length (); ++i ) {
1505
- if (gc_type & gc_prologue_callbacks_[i] .gc_type ) {
1506
- if (!gc_prologue_callbacks_[i] .pass_isolate ) {
1507
- v8::GCCallback callback = reinterpret_cast <v8::GCCallback>(
1508
- gc_prologue_callbacks_[i] .callback );
1516
+ for (const GCCallbackPair& info : gc_prologue_callbacks_) {
1517
+ if (gc_type & info .gc_type ) {
1518
+ if (!info .pass_isolate ) {
1519
+ v8::GCCallback callback =
1520
+ reinterpret_cast <v8::GCCallback>(info .callback );
1509
1521
callback (gc_type, flags);
1510
1522
} else {
1511
1523
v8::Isolate* isolate = reinterpret_cast <v8::Isolate*>(this ->isolate ());
1512
- gc_prologue_callbacks_[i] .callback (isolate, gc_type, flags);
1524
+ info .callback (isolate, gc_type, flags);
1513
1525
}
1514
1526
}
1515
1527
}
@@ -1520,15 +1532,15 @@ void Heap::CallGCEpilogueCallbacks(GCType gc_type,
1520
1532
GCCallbackFlags gc_callback_flags) {
1521
1533
RuntimeCallTimerScope runtime_timer (isolate (),
1522
1534
&RuntimeCallStats::GCEpilogueCallback);
1523
- for (int i = 0 ; i < gc_epilogue_callbacks_. length (); ++i ) {
1524
- if (gc_type & gc_epilogue_callbacks_[i] .gc_type ) {
1525
- if (!gc_epilogue_callbacks_[i] .pass_isolate ) {
1526
- v8::GCCallback callback = reinterpret_cast <v8::GCCallback>(
1527
- gc_epilogue_callbacks_[i] .callback );
1535
+ for (const GCCallbackPair& info : gc_epilogue_callbacks_) {
1536
+ if (gc_type & info .gc_type ) {
1537
+ if (!info .pass_isolate ) {
1538
+ v8::GCCallback callback =
1539
+ reinterpret_cast <v8::GCCallback>(info .callback );
1528
1540
callback (gc_type, gc_callback_flags);
1529
1541
} else {
1530
1542
v8::Isolate* isolate = reinterpret_cast <v8::Isolate*>(this ->isolate ());
1531
- gc_epilogue_callbacks_[i] .callback (isolate, gc_type, gc_callback_flags);
1543
+ info .callback (isolate, gc_type, gc_callback_flags);
1532
1544
}
1533
1545
}
1534
1546
}
@@ -5954,18 +5966,20 @@ void Heap::TearDown() {
5954
5966
5955
5967
void Heap::AddGCPrologueCallback (v8::Isolate::GCCallback callback,
5956
5968
GCType gc_type, bool pass_isolate) {
5957
- DCHECK (callback != NULL );
5958
- GCCallbackPair pair (callback, gc_type, pass_isolate);
5959
- DCHECK (!gc_prologue_callbacks_.Contains (pair));
5960
- return gc_prologue_callbacks_.Add (pair);
5969
+ DCHECK_NOT_NULL (callback);
5970
+ DCHECK (gc_prologue_callbacks_.end () ==
5971
+ 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);
5961
5974
}
5962
5975
5963
5976
5964
5977
void Heap::RemoveGCPrologueCallback (v8::Isolate::GCCallback callback) {
5965
- DCHECK (callback != NULL );
5966
- for (int i = 0 ; i < gc_prologue_callbacks_.length (); ++i ) {
5978
+ DCHECK_NOT_NULL (callback);
5979
+ for (size_t i = 0 ; i < gc_prologue_callbacks_.size (); i++ ) {
5967
5980
if (gc_prologue_callbacks_[i].callback == callback) {
5968
- gc_prologue_callbacks_.Remove (i);
5981
+ gc_prologue_callbacks_[i] = gc_prologue_callbacks_.back ();
5982
+ gc_prologue_callbacks_.pop_back ();
5969
5983
return ;
5970
5984
}
5971
5985
}
@@ -5975,18 +5989,20 @@ void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) {
5975
5989
5976
5990
void Heap::AddGCEpilogueCallback (v8::Isolate::GCCallback callback,
5977
5991
GCType gc_type, bool pass_isolate) {
5978
- DCHECK (callback != NULL );
5979
- GCCallbackPair pair (callback, gc_type, pass_isolate);
5980
- DCHECK (!gc_epilogue_callbacks_.Contains (pair));
5981
- return gc_epilogue_callbacks_.Add (pair);
5992
+ DCHECK_NOT_NULL (callback);
5993
+ DCHECK (gc_epilogue_callbacks_.end () ==
5994
+ 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);
5982
5997
}
5983
5998
5984
5999
5985
6000
void Heap::RemoveGCEpilogueCallback (v8::Isolate::GCCallback callback) {
5986
- DCHECK (callback != NULL );
5987
- for (int i = 0 ; i < gc_epilogue_callbacks_.length (); ++i ) {
6001
+ DCHECK_NOT_NULL (callback);
6002
+ for (size_t i = 0 ; i < gc_epilogue_callbacks_.size (); i++ ) {
5988
6003
if (gc_epilogue_callbacks_[i].callback == callback) {
5989
- gc_epilogue_callbacks_.Remove (i);
6004
+ gc_epilogue_callbacks_[i] = gc_epilogue_callbacks_.back ();
6005
+ gc_epilogue_callbacks_.pop_back ();
5990
6006
return ;
5991
6007
}
5992
6008
}
0 commit comments