Chromium Code Reviews| Index: src/keys.h | 
| diff --git a/src/keys.h b/src/keys.h | 
| index c73f10911df3c81f54ea875fa12bd1bfbfcf3b68..14aef2c14e0131f17496c7f02068b0cd036a64e2 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,35 @@ 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); | 
| + // Computes the enumerable keys for a JSObject. Used for implementing | 
| 
 
Jakob Kummerow
2016/05/23 16:25:21
I think this comment is outdated (and overly restr
 
Camillo Bruni
2016/05/23 19:10:13
removed.
 
 | 
| + // "for (n in object) { }". | 
| + 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 +77,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 +106,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 +120,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; |