Skip to content

Commit e1828eb

Browse files
addaleaxMylesBorins
authored andcommitted
deps: cherry-pick b6158eb6befae from V8 upstream
Original commit message: [heap] Move gc callbacks from List to std::vector Bug: v8:6333 Change-Id: I4434c6cc59f886f1e37dfd315a3ad5fee28d3f63 Reviewed-on: https://chromium-review.googlesource.com/634907 Reviewed-by: Ulan Degenbaev <[email protected]> Commit-Queue: Michael Lippautz <[email protected]> Cr-Commit-Position: refs/heads/master@{#47601} PR-URL: #15391 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Michaël Zasso <[email protected]>
1 parent aa1a3ea commit e1828eb

File tree

2 files changed

+46
-31
lines changed

2 files changed

+46
-31
lines changed

deps/v8/src/heap/heap.cc

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@
5757
namespace v8 {
5858
namespace internal {
5959

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+
6072
struct Heap::StrongRootsList {
6173
Object** start;
6274
Object** end;
@@ -1501,15 +1513,15 @@ bool Heap::PerformGarbageCollection(
15011513
void Heap::CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags) {
15021514
RuntimeCallTimerScope runtime_timer(isolate(),
15031515
&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);
15091521
callback(gc_type, flags);
15101522
} else {
15111523
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);
15131525
}
15141526
}
15151527
}
@@ -1520,15 +1532,15 @@ void Heap::CallGCEpilogueCallbacks(GCType gc_type,
15201532
GCCallbackFlags gc_callback_flags) {
15211533
RuntimeCallTimerScope runtime_timer(isolate(),
15221534
&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);
15281540
callback(gc_type, gc_callback_flags);
15291541
} else {
15301542
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);
15321544
}
15331545
}
15341546
}
@@ -5954,18 +5966,20 @@ void Heap::TearDown() {
59545966

59555967
void Heap::AddGCPrologueCallback(v8::Isolate::GCCallback callback,
59565968
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);
59615974
}
59625975

59635976

59645977
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++) {
59675980
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();
59695983
return;
59705984
}
59715985
}
@@ -5975,18 +5989,20 @@ void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) {
59755989

59765990
void Heap::AddGCEpilogueCallback(v8::Isolate::GCCallback callback,
59775991
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);
59825997
}
59835998

59845999

59856000
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++) {
59886003
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();
59906006
return;
59916007
}
59926008
}

deps/v8/src/heap/heap.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,9 +1585,8 @@ class Heap {
15851585
bool pass_isolate)
15861586
: callback(callback), gc_type(gc_type), pass_isolate(pass_isolate) {}
15871587

1588-
bool operator==(const GCCallbackPair& other) const {
1589-
return other.callback == callback;
1590-
}
1588+
bool operator==(const GCCallbackPair& other) const;
1589+
GCCallbackPair& operator=(const GCCallbackPair& other);
15911590

15921591
v8::Isolate::GCCallback callback;
15931592
GCType gc_type;
@@ -2255,8 +2254,8 @@ class Heap {
22552254

22562255
Object* encountered_transition_arrays_;
22572256

2258-
List<GCCallbackPair> gc_epilogue_callbacks_;
2259-
List<GCCallbackPair> gc_prologue_callbacks_;
2257+
std::vector<GCCallbackPair> gc_epilogue_callbacks_;
2258+
std::vector<GCCallbackPair> gc_prologue_callbacks_;
22602259

22612260
GetExternallyAllocatedMemoryInBytesCallback external_memory_callback_;
22622261

0 commit comments

Comments
 (0)