From 3db2f58693faa076d4064212a7f0769bf7db470d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Fl=C3=BCckiger?= Date: Wed, 1 Oct 2025 18:59:23 +0200 Subject: [PATCH] deps: V8: cherry-pick f93055fbd5aa MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Toon Verwaest Auto-Submit: Olivier Flückiger Cr-Commit-Position: refs/heads/main@{#102878} Refs: https://github.com/v8/v8/commit/f93055fbd5aa266d64500ae7b1ad899e8be23cd5 PR-URL: https://github.com/nodejs/node/pull/60105 Reviewed-By: Michaël Zasso Reviewed-By: Colin Ihrig Reviewed-By: Chengzhong Wu --- common.gypi | 2 +- deps/v8/src/objects/keys.cc | 30 ++++++++++++++++++++++++++++++ deps/v8/src/objects/keys.h | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 8abd1be554..6dbe33f43f 100644 --- a/common.gypi +++ b/common.gypi @@ -38,7 +38,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.6', + 'v8_embedder_string': '-node.7', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/objects/keys.cc b/deps/v8/src/objects/keys.cc index 9700042fc4..10f9a70b6e 100644 --- a/deps/v8/src/objects/keys.cc +++ b/deps/v8/src/objects/keys.cc @@ -463,6 +463,8 @@ MaybeHandle FastKeyAccumulator::GetKeys( return keys; } if (isolate_->has_exception()) return MaybeHandle(); + } else if (filter_ == SKIP_STRINGS && !MayHaveSymbols()) { + return isolate_->factory()->empty_fixed_array(); } if (try_prototype_info_cache_) { @@ -471,6 +473,34 @@ MaybeHandle FastKeyAccumulator::GetKeys( return GetKeysSlow(keys_conversion); } +bool FastKeyAccumulator::MayHaveSymbols() { + bool own_only = has_empty_prototype_ || mode_ == KeyCollectionMode::kOwnOnly; + Tagged map = receiver_->map(); + if (!own_only || IsCustomElementsReceiverMap(map)) { + return true; + } + + // From this point on we are certain to only collect own keys. + DCHECK(IsJSObject(*receiver_)); + + if (map->is_dictionary_map()) { + // TODO(olivf): Keep a bit in the dictionary to remember if we have any + // symbols. + return true; + } + int num = map->NumberOfOwnDescriptors(); + if (num == 0) { + return false; + } + int enum_length = receiver_->map()->EnumLength(); + if (enum_length != kInvalidEnumCacheSentinel) { + return enum_length != num; + } + // TODO(olivf): Keep a bit in the descriptor to remember if we have any + // symbols. + return true; +} + MaybeHandle FastKeyAccumulator::GetKeysFast( GetKeysConversion keys_conversion) { bool own_only = has_empty_prototype_ || mode_ == KeyCollectionMode::kOwnOnly; diff --git a/deps/v8/src/objects/keys.h b/deps/v8/src/objects/keys.h index 20ffc6e12c..f40f3ad80c 100644 --- a/deps/v8/src/objects/keys.h +++ b/deps/v8/src/objects/keys.h @@ -197,6 +197,7 @@ class FastKeyAccumulator { bool is_receiver_simple_enum() { return is_receiver_simple_enum_; } bool has_empty_prototype() { return has_empty_prototype_; } bool may_have_elements() { return may_have_elements_; } + bool MayHaveSymbols(); MaybeHandle GetKeys( GetKeysConversion convert = GetKeysConversion::kKeepNumbers);