mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-30 11:37:16 +02:00
LibJS: Fast-path own-property enumeration and reduce descriptor lookups
Before this change, PropertyNameIterator (used by for..in) and `Object::enumerable_own_property_names()` (used by `Object.keys()`, `Object.values()`, and `Object.entries()`) enumerated an object's own enumerable properties exactly as the spec prescribes: - Call `internal_own_property_keys()`, allocating a list of JS::Value keys. - For each key, call internal_get_own_property() to obtain a descriptor and check `[[Enumerable]]`. While that is required in the general case (e.g. for Proxy objects or platform/exotic objects that override `[[OwnPropertyKeys]]`), it's overkill for ordinary JS objects that store their own properties in the shape table and indexed-properties storage. This change introduces `for_each_own_property_with_enumerability()`, which, for objects where `eligible_for_own_property_enumeration_fast_path()` is `true`, lets us read the enumerability directly from shape metadata (and from indexed-properties storage) without a per-property descriptor lookup. When we cannot avoid `internal_get_own_property()`, we still benefit by skipping the temporary `Vector<Value>` of keys and avoiding the unnecessary round-trip between PropertyKey and Value.
This commit is contained in:
committed by
Alexander Kalenik
parent
66601f7d59
commit
451c947c3f
Notes:
github-actions[bot]
2025-09-21 13:07:39 +00:00
Author: https://github.com/kalenikaliaksandr Commit: https://github.com/LadybirdBrowser/ladybird/commit/451c947c3ff Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/6244 Reviewed-by: https://github.com/awesomekling
@@ -32,6 +32,8 @@ public:
|
||||
virtual ThrowCompletionOr<GC::RootVector<Value>> internal_own_property_keys() const override;
|
||||
virtual void initialize(Realm&) override;
|
||||
|
||||
virtual bool eligible_for_own_property_enumeration_fast_path() const final { return false; }
|
||||
|
||||
private:
|
||||
ModuleNamespaceObject(Realm&, Module* module, Vector<Utf16FlyString> exports);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user