Chromium Code Reviews| Index: src/elements.h |
| diff --git a/src/elements.h b/src/elements.h |
| index c238a7a2178b9b3753685ae97dac52f621e0d52a..f2008c6f0e1b1fc41d12c6207f182d8b8763d69e 100644 |
| --- a/src/elements.h |
| +++ b/src/elements.h |
| @@ -22,6 +22,14 @@ class ElementsAccessor { |
| const char* name() const { return name_; } |
| + // Returns a shared ElementsAccessor for the specified ElementsKind. |
| + static ElementsAccessor* ForKind(ElementsKind elements_kind) { |
| + DCHECK(static_cast<int>(elements_kind) < kElementsKindCount); |
| + return elements_accessors_[elements_kind]; |
| + } |
| + |
| + static ElementsAccessor* ForArray(Handle<FixedArrayBase> array); |
| + |
| // Checks the elements of an object for consistency, asserting when a problem |
| // is found. |
| virtual void Validate(Handle<JSObject> obj) = 0; |
| @@ -30,12 +38,19 @@ class ElementsAccessor { |
| // without iterating up the prototype chain. The caller can optionally pass |
| // in the backing store to use for the check, which must be compatible with |
| // the ElementsKind of the ElementsAccessor. If backing_store is NULL, the |
| - // holder->elements() is used as the backing store. |
| + // holder->elements() is used as the backing store. If a |filter| is |
| + // specified the PropertyAttributes of the element at the given index |
| + // are compared to the given |filter|. If they match/overlap the given |
| + // index is ignored. Note that only Dictionary elements have custom |
| + // PropertyAttributes associated, hence the |filter| argument is ignored for |
| + // all but DICTIONARY_ELEMENTS and SLOW_SLOPPY_ARGUMENTS_ELEMENTS. |
| virtual bool HasElement(Handle<JSObject> holder, uint32_t index, |
| - Handle<FixedArrayBase> backing_store) = 0; |
| + Handle<FixedArrayBase> backing_store, |
| + PropertyAttributes filter = NONE) = 0; |
| - inline bool HasElement(Handle<JSObject> holder, uint32_t index) { |
| - return HasElement(holder, index, handle(holder->elements())); |
| + inline bool HasElement(Handle<JSObject> holder, uint32_t index, |
| + PropertyAttributes filter = NONE) { |
| + return HasElement(holder, index, handle(holder->elements()), filter); |
| } |
| // Returns true if the backing store is compact in the given range |
| @@ -97,20 +112,31 @@ class ElementsAccessor { |
| *from_holder, 0, from_kind, to, 0, kCopyToEndAndInitializeToHole); |
| } |
| - virtual void GrowCapacityAndConvert(Handle<JSObject> object, |
| - uint32_t capacity) = 0; |
| + // Copy all indices that have elements from |object| into the given |
| + // KeyAccumulator. For Dictionary-based element-kinds we filter out elements |
| + // whose PropertyAttribute match |filter|. |
| + virtual void CollectElementIndices(Handle<JSObject> object, |
| + Handle<FixedArrayBase> backing_store, |
| + KeyAccumulator* keys, |
| + uint32_t range = kMaxUInt32, |
| + PropertyAttributes filter = NONE, |
| + uint32_t offset = 0) = 0; |
| + |
| + inline void CollectElementIndices(Handle<JSObject> object, |
| + KeyAccumulator* keys, |
| + uint32_t range = kMaxUInt32, |
| + PropertyAttributes filter = NONE, |
| + uint32_t offset = 0) { |
| + CollectElementIndices(object, handle(object->elements()), keys, range, |
| + filter, offset); |
| + } |
| virtual void AddElementsToKeyAccumulator(Handle<JSObject> receiver, |
| KeyAccumulator* accumulator, |
| - KeyFilter filter) = 0; |
| - |
| - // Returns a shared ElementsAccessor for the specified ElementsKind. |
| - static ElementsAccessor* ForKind(ElementsKind elements_kind) { |
| - DCHECK(static_cast<int>(elements_kind) < kElementsKindCount); |
| - return elements_accessors_[elements_kind]; |
| - } |
| + AddKeyConversion convert) = 0; |
| - static ElementsAccessor* ForArray(Handle<FixedArrayBase> array); |
| + virtual void GrowCapacityAndConvert(Handle<JSObject> object, |
| + uint32_t capacity) = 0; |
| static void InitializeOncePerProcess(); |
| static void TearDown(); |
| @@ -158,8 +184,6 @@ class ElementsAccessor { |
| static ElementsAccessor* ForArray(FixedArrayBase* array); |
| - virtual uint32_t GetCapacity(JSObject* holder, |
| - FixedArrayBase* backing_store) = 0; |
| // Element handlers distinguish between entries and indices when they |
| // manipulate elements. Entries refer to elements in terms of their location |
| @@ -174,6 +198,8 @@ class ElementsAccessor { |
| uint32_t index) = 0; |
| virtual PropertyDetails GetDetails(FixedArrayBase* backing_store, |
| uint32_t entry) = 0; |
| + virtual uint32_t GetCapacity(JSObject* holder, |
|
Igor Sheludko
2015/10/19 13:11:19
Spurious change.
|
| + FixedArrayBase* backing_store) = 0; |
| private: |
| static ElementsAccessor** elements_accessors_; |