Index: src/elements.h |
diff --git a/src/elements.h b/src/elements.h |
index c238a7a2178b9b3753685ae97dac52f621e0d52a..9530d4bdecc2b822585a2334e8db5eb21b307cf1 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 |
@@ -176,6 +200,8 @@ class ElementsAccessor { |
uint32_t entry) = 0; |
private: |
+ virtual uint32_t GetCapacity(JSObject* holder, |
+ FixedArrayBase* backing_store) = 0; |
static ElementsAccessor** elements_accessors_; |
const char* name_; |