diff --git a/common.gypi b/common.gypi index a5588d43e3401f..33e39334594b7f 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.21', + 'v8_embedder_string': '-node.22', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/objects/keys.cc b/deps/v8/src/objects/keys.cc index c4f3794c8ae4c3..4941c5cf12d52c 100644 --- a/deps/v8/src/objects/keys.cc +++ b/deps/v8/src/objects/keys.cc @@ -464,6 +464,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_) { @@ -472,6 +474,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 20ffc6e12cf5b9..f40f3ad80cc489 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);