| Index: src/keys.h
|
| diff --git a/src/keys.h b/src/keys.h
|
| index c73f10911df3c81f54ea875fa12bd1bfbfcf3b68..4f99bb5bd43e5e03ac9536fe01dea2de83cba18d 100644
|
| --- a/src/keys.h
|
| +++ b/src/keys.h
|
| @@ -11,7 +11,7 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -enum AddKeyConversion { DO_NOT_CONVERT, CONVERT_TO_ARRAY_INDEX, PROXY_MAGIC };
|
| +enum AddKeyConversion { DO_NOT_CONVERT, CONVERT_TO_ARRAY_INDEX };
|
|
|
| // 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
|
| @@ -36,36 +36,33 @@ class KeyAccumulator final BASE_EMBEDDED {
|
| : isolate_(isolate), type_(type), filter_(filter) {}
|
| ~KeyAccumulator();
|
|
|
| - static MaybeHandle<FixedArray> GetKeys(Handle<JSReceiver> object,
|
| - KeyCollectionType type,
|
| - PropertyFilter filter,
|
| - GetKeysConversion keys_conversion,
|
| - bool filter_proxy_keys);
|
| + static MaybeHandle<FixedArray> GetKeys(
|
| + Handle<JSReceiver> object, KeyCollectionType type, PropertyFilter filter,
|
| + GetKeysConversion keys_conversion = KEEP_NUMBERS,
|
| + bool filter_proxy_keys = true, bool is_for_in = false);
|
| Handle<FixedArray> GetKeys(GetKeysConversion convert = KEEP_NUMBERS);
|
| Maybe<bool> CollectKeys(Handle<JSReceiver> receiver,
|
| Handle<JSReceiver> object);
|
| - void CollectOwnElementIndices(Handle<JSObject> object);
|
| - void CollectOwnPropertyNames(Handle<JSObject> object);
|
| + Maybe<bool> CollectOwnElementIndices(Handle<JSReceiver> receiver,
|
| + Handle<JSObject> object);
|
| + Maybe<bool> CollectOwnPropertyNames(Handle<JSReceiver> receiver,
|
| + Handle<JSObject> object);
|
|
|
| static Handle<FixedArray> GetEnumPropertyKeys(Isolate* isolate,
|
| Handle<JSObject> object);
|
|
|
| - bool AddKey(uint32_t key);
|
| - bool AddKey(Object* key, AddKeyConversion convert);
|
| - bool AddKey(Handle<Object> key, AddKeyConversion convert);
|
| + void AddKey(Object* key, AddKeyConversion convert = DO_NOT_CONVERT);
|
| + void AddKey(Handle<Object> key, AddKeyConversion convert = DO_NOT_CONVERT);
|
| void AddKeys(Handle<FixedArray> array, AddKeyConversion convert);
|
| - void AddKeys(Handle<JSObject> array, AddKeyConversion convert);
|
| - void AddElementKeysFromInterceptor(Handle<JSObject> array);
|
| + void AddKeys(Handle<JSObject> array_like, AddKeyConversion convert);
|
|
|
| // 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();
|
| - int length() { return length_; }
|
| Isolate* isolate() { return isolate_; }
|
| PropertyFilter filter() { return filter_; }
|
| void set_filter_proxy_keys(bool filter) { filter_proxy_keys_ = filter; }
|
| + void set_is_for_in(bool value) { is_for_in_ = value; }
|
| + void set_skip_indices(bool value) { skip_indices_ = value; }
|
|
|
| private:
|
| Maybe<bool> CollectOwnKeys(Handle<JSReceiver> receiver,
|
| @@ -78,35 +75,17 @@ class KeyAccumulator final BASE_EMBEDDED {
|
| Maybe<bool> AddKeysFromJSProxy(Handle<JSProxy> proxy,
|
| Handle<FixedArray> keys);
|
|
|
| - bool AddIntegerKey(uint32_t key);
|
| - bool AddStringKey(Handle<Object> key, AddKeyConversion convert);
|
| - bool AddSymbolKey(Handle<Object> array);
|
| - void SortCurrentElementsListRemoveDuplicates();
|
| + Handle<OrderedHashSet> keys() { return Handle<OrderedHashSet>::cast(keys_); }
|
|
|
| Isolate* isolate_;
|
| + // keys_ is either an Handle<OrderedHashSet> or in the case of own JSProxy
|
| + // keys a Handle<FixedArray>.
|
| + Handle<FixedArray> keys_;
|
| KeyCollectionType type_;
|
| PropertyFilter filter_;
|
| bool filter_proxy_keys_ = true;
|
| - // |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> level_lengths_;
|
| - // |string_properties_| contains the unique String property keys for all
|
| - // levels in insertion order per level.
|
| - Handle<OrderedHashSet> string_properties_;
|
| - // |symbol_properties_| contains the unique Symbol property keys for all
|
| - // levels in insertion order per level.
|
| - Handle<OrderedHashSet> symbol_properties_;
|
| - Handle<FixedArray> ownProxyKeys_;
|
| - // |length_| keeps track of the total number of all element and property keys.
|
| - int length_ = 0;
|
| - // |levelLength_| keeps track of the number of String keys in the current
|
| - // level.
|
| - int level_string_length_ = 0;
|
| - // |levelSymbolLength_| keeps track of the number of Symbol keys in the
|
| - // current level.
|
| - int level_symbol_length_ = 0;
|
| + bool is_for_in_ = false;
|
| + bool skip_indices_ = false;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(KeyAccumulator);
|
| };
|
| @@ -125,6 +104,7 @@ class FastKeyAccumulator {
|
| bool is_receiver_simple_enum() { return is_receiver_simple_enum_; }
|
| bool has_empty_prototype() { return has_empty_prototype_; }
|
| void set_filter_proxy_keys(bool filter) { filter_proxy_keys_ = filter; }
|
| + void set_is_for_in(bool value) { is_for_in_ = value; }
|
|
|
| MaybeHandle<FixedArray> GetKeys(GetKeysConversion convert = KEEP_NUMBERS);
|
|
|
| @@ -138,6 +118,7 @@ class FastKeyAccumulator {
|
| KeyCollectionType type_;
|
| PropertyFilter filter_;
|
| bool filter_proxy_keys_ = true;
|
| + bool is_for_in_ = false;
|
| bool is_receiver_simple_enum_ = false;
|
| bool has_empty_prototype_ = false;
|
|
|
|
|