| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index a672108bdded874f05d431961bbcdaf5677ffc30..3fc74a11e6813b67e78b997c916168892fe65345 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -2267,6 +2267,8 @@ class JSObject: public JSReceiver {
|
| // index. Returns the number of properties added.
|
| int GetOwnPropertyNames(FixedArray* storage, int index,
|
| PropertyAttributes filter = NONE);
|
| + int CollectOwnPropertyNames(KeyAccumulator* keys,
|
| + PropertyAttributes filter = NONE);
|
|
|
| // Returns the number of properties on this object filtering out properties
|
| // with the specified attributes (ignoring interceptors).
|
| @@ -3416,6 +3418,8 @@ class Dictionary: public HashTable<Derived, Shape, Key> {
|
| // Returns the number of properties added.
|
| int CopyKeysTo(FixedArray* storage, int index, PropertyAttributes filter,
|
| SortMode sort_mode);
|
| + // Collect the unsorted keys into the given KeyAccumulator.
|
| + int CollectKeysTo(KeyAccumulator* keys, PropertyAttributes filter);
|
|
|
| // Copies enumerable keys to preallocated fixed array.
|
| void CopyEnumKeysTo(FixedArray* storage);
|
| @@ -10743,67 +10747,6 @@ class BooleanBit : public AllStatic {
|
| };
|
|
|
|
|
| -enum AddKeyConversion { DO_NOT_CONVERT, CONVERT_TO_ARRAY_INDEX, PROXY_MAGIC };
|
| -
|
| -// This is a helper class for JSReceiver::GetKeys which collects and sorts keys.
|
| -// GetKeys needs to sort keys per prototype level, first showing the integer
|
| -// indices from elements then the strings from the properties. However, this
|
| -// does not apply to proxies which are in full control of how the keys are
|
| -// sorted.
|
| -//
|
| -// For performance reasons the KeyAccumulator internally separates integer
|
| -// keys in |elements_| into sorted lists per prototype level. String keys are
|
| -// collected in |properties_|, a single OrderedHashSet. To separate the keys per
|
| -// level later when assembling the final list, |levelLengths_| keeps track of
|
| -// the total number of keys (integers + strings) per level.
|
| -//
|
| -// Only unique keys are kept by the KeyAccumulator, strings are stored in a
|
| -// HashSet for inexpensive lookups. Integer keys are kept in sorted lists which
|
| -// are more compact and allow for reasonably fast includes check.
|
| -class KeyAccumulator final BASE_EMBEDDED {
|
| - public:
|
| - explicit KeyAccumulator(Isolate* isolate,
|
| - KeyFilter filter = KeyFilter::SKIP_SYMBOLS)
|
| - : isolate_(isolate), filter_(filter) {}
|
| - ~KeyAccumulator();
|
| -
|
| - bool AddKey(uint32_t key);
|
| - bool AddKey(Object* key, AddKeyConversion convert = DO_NOT_CONVERT);
|
| - bool AddKey(Handle<Object> key, AddKeyConversion convert = DO_NOT_CONVERT);
|
| - void AddKeys(Handle<FixedArray> array,
|
| - AddKeyConversion convert = DO_NOT_CONVERT);
|
| - void AddKeys(Handle<JSObject> array,
|
| - AddKeyConversion convert = DO_NOT_CONVERT);
|
| - void AddKeysFromProxy(Handle<JSObject> array);
|
| - void AddElementKeysFromInterceptor(Handle<JSObject> array);
|
| - // Jump to the next level, pushing the current |levelLength_| to
|
| - // |levelLengths_| and adding a new list to |elements_|.
|
| - void NextPrototype();
|
| - // Sort the integer indices in the last list in |elements_|
|
| - void SortCurrentElementsList();
|
| - void SortCurrentElementsListRemoveDuplicates();
|
| - Handle<FixedArray> GetKeys(GetKeysConversion convert = KEEP_NUMBERS);
|
| -
|
| -
|
| - private:
|
| - Isolate* isolate_;
|
| - KeyFilter filter_;
|
| - // |elements_| contains the sorted element keys (indices) per level.
|
| - std::vector<std::vector<uint32_t>*> elements_;
|
| - // |protoLengths_| contains the total number of keys (elements + properties)
|
| - // per level. Negative values mark counts for a level with keys from a proxy.
|
| - std::vector<int> levelLengths_;
|
| - // |properties_| contains the property keys per level in insertion order.
|
| - Handle<OrderedHashSet> properties_;
|
| - // |length_| keeps track of the total number of all element and property keys.
|
| - int length_ = 0;
|
| - // |levelLength_| keeps track of the total number of keys
|
| - // (elements + properties) in the current level.
|
| - int levelLength_ = 0;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(KeyAccumulator);
|
| -};
|
| -
|
| } // NOLINT, false-positive due to second-order macros.
|
| } // NOLINT, false-positive due to second-order macros.
|
|
|
|
|