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; |