summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2019-12-17 17:44:07 +0100
committerMichaël Zasso <targos@protonmail.com>2019-12-23 17:50:19 +0100
commit05041d3ab1ed4e25f44406ebc288e3961f2b0299 (patch)
tree10cece99452b01bf7382ac5c6813450e57fd61a7
parent38a593b0f3bc4fa52ed9216d75a98bbf7ab5bd9e (diff)
downloadnode-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.gypi2
-rw-r--r--deps/v8/src/objects/objects.cc16
-rw-r--r--deps/v8/src/objects/prototype-info.h2
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);
};