mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
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: d3a1a5b6c4
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>
This commit is contained in:
@@ -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 #####
|
||||
|
||||
|
||||
16
deps/v8/src/objects/objects.cc
vendored
16
deps/v8/src/objects/objects.cc
vendored
@@ -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) {
|
||||
|
||||
2
deps/v8/src/objects/prototype-info.h
vendored
2
deps/v8/src/objects/prototype-info.h
vendored
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user