diff options
author | Michaël Zasso <targos@protonmail.com> | 2019-12-17 17:44:07 +0100 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2019-12-23 17:50:19 +0100 |
commit | 05041d3ab1ed4e25f44406ebc288e3961f2b0299 (patch) | |
tree | 10cece99452b01bf7382ac5c6813450e57fd61a7 | |
parent | 38a593b0f3bc4fa52ed9216d75a98bbf7ab5bd9e (diff) | |
download | node-new-05041d3ab1ed4e25f44406ebc288e3961f2b0299.tar.gz |
deps: V8: cherry-pick d3a1a5b6c491
Original commit message:
[objects] Fix memory leak in PrototypeUsers::Add
PrototypeUsers::Add now iterates the WeakArrayList to find empty slots
before growing the array. Not reusing empty slots caused a memory leak.
It might also be desirable to shrink the WeakArrayList in the future.
Right now it is only compacted when invoking CreateBlob.
Also removed unused PrototypeUsers::IsEmptySlot declaration.
Bug: v8:10031
Change-Id: I570ec78fca37e8f0c794f1f40846a4daab47c225
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1967317
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: Igor Sheludko <ishell@chromium.org>
Commit-Queue: Dominik Inführ <dinfuehr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#65456}
Refs: https://github.com/v8/v8/commit/d3a1a5b6c4916f22e076e3349ed3619bfb014f29
Fixes: https://github.com/nodejs/node/issues/30753
PR-URL: https://github.com/nodejs/node/pull/31005
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rich Trott <rtrott@gmail.com>
-rw-r--r-- | common.gypi | 2 | ||||
-rw-r--r-- | deps/v8/src/objects/objects.cc | 16 | ||||
-rw-r--r-- | deps/v8/src/objects/prototype-info.h | 2 |
3 files changed, 18 insertions, 2 deletions
diff --git a/common.gypi b/common.gypi index 210e86eeb2..008ac88929 100644 --- a/common.gypi +++ b/common.gypi @@ -39,7 +39,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.23', + 'v8_embedder_string': '-node.24', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/objects/objects.cc b/deps/v8/src/objects/objects.cc index 227cff8da4..723023b707 100644 --- a/deps/v8/src/objects/objects.cc +++ b/deps/v8/src/objects/objects.cc @@ -4038,6 +4038,13 @@ Handle<WeakArrayList> PrototypeUsers::Add(Isolate* isolate, // If there are empty slots, use one of them. int empty_slot = Smi::ToInt(empty_slot_index(*array)); + + if (empty_slot == kNoEmptySlotsMarker) { + // GCs might have cleared some references, rescan the array for empty slots. + PrototypeUsers::ScanForEmptySlots(*array); + empty_slot = Smi::ToInt(empty_slot_index(*array)); + } + if (empty_slot != kNoEmptySlotsMarker) { DCHECK_GE(empty_slot, kFirstIndex); CHECK_LT(empty_slot, array->length()); @@ -4060,6 +4067,15 @@ Handle<WeakArrayList> PrototypeUsers::Add(Isolate* isolate, return array; } +// static +void PrototypeUsers::ScanForEmptySlots(WeakArrayList array) { + for (int i = kFirstIndex; i < array.length(); i++) { + if (array.Get(i)->IsCleared()) { + PrototypeUsers::MarkSlotEmpty(array, i); + } + } +} + WeakArrayList PrototypeUsers::Compact(Handle<WeakArrayList> array, Heap* heap, CompactionCallback callback, AllocationType allocation) { diff --git a/deps/v8/src/objects/prototype-info.h b/deps/v8/src/objects/prototype-info.h index 94d86d2e19..6f777eda89 100644 --- a/deps/v8/src/objects/prototype-info.h +++ b/deps/v8/src/objects/prototype-info.h @@ -99,7 +99,7 @@ class V8_EXPORT_PRIVATE PrototypeUsers : public WeakArrayList { static inline Smi empty_slot_index(WeakArrayList array); static inline void set_empty_slot_index(WeakArrayList array, int index); - static void IsSlotEmpty(WeakArrayList array, int index); + static void ScanForEmptySlots(WeakArrayList array); DISALLOW_IMPLICIT_CONSTRUCTORS(PrototypeUsers); }; |