Skip to content

Commit 006fd28

Browse files
o-marco-ippolito
authored andcommitted
deps: V8: cherry-pick f93055fbd5aa
Original commit message: [runtime] Fastcase for empty getOwnPropertySymbols() Since symbols are not enumerable we can rule them out in case all properties are in the enum cache. Bug: 447154198 Change-Id: Ib2d58b67e5058d98323fcebaef3daba88c6304b5 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6983286 Commit-Queue: Olivier Flückiger <olivf@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Auto-Submit: Olivier Flückiger <olivf@chromium.org> Cr-Commit-Position: refs/heads/main@{#102878} Refs: v8/v8@f93055f PR-URL: #60105 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent dd38ecc commit 006fd28

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

common.gypi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
# Reset this number to 0 on major V8 upgrades.
4040
# Increment by one for each non-official patch applied to deps/v8.
41-
'v8_embedder_string': '-node.56',
41+
'v8_embedder_string': '-node.57',
4242

4343
##### V8 defaults for Node.js #####
4444

deps/v8/src/objects/keys.cc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ MaybeHandle<FixedArray> FastKeyAccumulator::GetKeys(
458458
return keys;
459459
}
460460
if (isolate_->has_exception()) return MaybeHandle<FixedArray>();
461+
} else if (filter_ == SKIP_STRINGS && !MayHaveSymbols()) {
462+
return isolate_->factory()->empty_fixed_array();
461463
}
462464

463465
if (try_prototype_info_cache_) {
@@ -466,6 +468,34 @@ MaybeHandle<FixedArray> FastKeyAccumulator::GetKeys(
466468
return GetKeysSlow(keys_conversion);
467469
}
468470

471+
bool FastKeyAccumulator::MayHaveSymbols() {
472+
bool own_only = has_empty_prototype_ || mode_ == KeyCollectionMode::kOwnOnly;
473+
Tagged<Map> map = receiver_->map();
474+
if (!own_only || IsCustomElementsReceiverMap(map)) {
475+
return true;
476+
}
477+
478+
// From this point on we are certain to only collect own keys.
479+
DCHECK(IsJSObject(*receiver_));
480+
481+
if (map->is_dictionary_map()) {
482+
// TODO(olivf): Keep a bit in the dictionary to remember if we have any
483+
// symbols.
484+
return true;
485+
}
486+
int num = map->NumberOfOwnDescriptors();
487+
if (num == 0) {
488+
return false;
489+
}
490+
int enum_length = receiver_->map()->EnumLength();
491+
if (enum_length != kInvalidEnumCacheSentinel) {
492+
return enum_length != num;
493+
}
494+
// TODO(olivf): Keep a bit in the descriptor to remember if we have any
495+
// symbols.
496+
return true;
497+
}
498+
469499
MaybeHandle<FixedArray> FastKeyAccumulator::GetKeysFast(
470500
GetKeysConversion keys_conversion) {
471501
bool own_only = has_empty_prototype_ || mode_ == KeyCollectionMode::kOwnOnly;

deps/v8/src/objects/keys.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ class FastKeyAccumulator {
197197
bool is_receiver_simple_enum() { return is_receiver_simple_enum_; }
198198
bool has_empty_prototype() { return has_empty_prototype_; }
199199
bool may_have_elements() { return may_have_elements_; }
200+
bool MayHaveSymbols();
200201

201202
MaybeHandle<FixedArray> GetKeys(
202203
GetKeysConversion convert = GetKeysConversion::kKeepNumbers);

0 commit comments

Comments
 (0)