| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index 8cb48c6ad8a418e3640b82d2d796b191eddc9a7a..8ed3729cfda5d14495949906cf3c8043e079d08a 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -586,6 +586,49 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| return backing_store->is_the_hole(key) ? ABSENT : NONE;
|
| }
|
|
|
| + MUST_USE_RESULT virtual PropertyType GetType(
|
| + Object* receiver,
|
| + JSObject* holder,
|
| + uint32_t key,
|
| + FixedArrayBase* backing_store) {
|
| + if (backing_store == NULL) {
|
| + backing_store = holder->elements();
|
| + }
|
| + return ElementsAccessorSubclass::GetTypeImpl(
|
| + receiver, holder, key, BackingStore::cast(backing_store));
|
| + }
|
| +
|
| + MUST_USE_RESULT static PropertyType GetTypeImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + BackingStore* backing_store) {
|
| + if (key >= ElementsAccessorSubclass::GetCapacityImpl(backing_store)) {
|
| + return NONEXISTENT;
|
| + }
|
| + return backing_store->is_the_hole(key) ? NONEXISTENT : FIELD;
|
| + }
|
| +
|
| + MUST_USE_RESULT virtual AccessorPair* GetAccessorPair(
|
| + Object* receiver,
|
| + JSObject* holder,
|
| + uint32_t key,
|
| + FixedArrayBase* backing_store) {
|
| + if (backing_store == NULL) {
|
| + backing_store = holder->elements();
|
| + }
|
| + return ElementsAccessorSubclass::GetAccessorPairImpl(
|
| + receiver, holder, key, BackingStore::cast(backing_store));
|
| + }
|
| +
|
| + MUST_USE_RESULT static AccessorPair* GetAccessorPairImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + BackingStore* backing_store) {
|
| + return NULL;
|
| + }
|
| +
|
| MUST_USE_RESULT virtual MaybeObject* SetLength(JSArray* array,
|
| Object* length) {
|
| return ElementsAccessorSubclass::SetLengthImpl(
|
| @@ -1172,7 +1215,17 @@ class ExternalElementsAccessor
|
| BackingStore* backing_store) {
|
| return
|
| key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
|
| - ? NONE : ABSENT;
|
| + ? NONE : ABSENT;
|
| + }
|
| +
|
| + MUST_USE_RESULT static PropertyType GetTypeImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + BackingStore* backing_store) {
|
| + return
|
| + key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
|
| + ? FIELD : NONEXISTENT;
|
| }
|
|
|
| MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
| @@ -1475,6 +1528,32 @@ class DictionaryElementsAccessor
|
| return ABSENT;
|
| }
|
|
|
| + MUST_USE_RESULT static PropertyType GetTypeImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + SeededNumberDictionary* backing_store) {
|
| + int entry = backing_store->FindEntry(key);
|
| + if (entry != SeededNumberDictionary::kNotFound) {
|
| + return backing_store->DetailsAt(entry).type();
|
| + }
|
| + return NONEXISTENT;
|
| + }
|
| +
|
| + MUST_USE_RESULT static AccessorPair* GetAccessorPairImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + BackingStore* backing_store) {
|
| + int entry = backing_store->FindEntry(key);
|
| + if (entry != SeededNumberDictionary::kNotFound &&
|
| + backing_store->DetailsAt(entry).type() == CALLBACKS &&
|
| + backing_store->ValueAt(entry)->IsAccessorPair()) {
|
| + return AccessorPair::cast(backing_store->ValueAt(entry));
|
| + }
|
| + return NULL;
|
| + }
|
| +
|
| static bool HasElementImpl(Object* receiver,
|
| JSObject* holder,
|
| uint32_t key,
|
| @@ -1550,6 +1629,38 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
| }
|
| }
|
|
|
| + MUST_USE_RESULT static PropertyType GetTypeImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + FixedArray* parameter_map) {
|
| + Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| + if (!probe->IsTheHole()) {
|
| + return FIELD;
|
| + } else {
|
| + // If not aliased, check the arguments.
|
| + FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
| + return ElementsAccessor::ForArray(arguments)->GetType(
|
| + receiver, obj, key, arguments);
|
| + }
|
| + }
|
| +
|
| + MUST_USE_RESULT static AccessorPair* GetAccessorPairImpl(
|
| + Object* receiver,
|
| + JSObject* obj,
|
| + uint32_t key,
|
| + FixedArray* parameter_map) {
|
| + Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| + if (!probe->IsTheHole()) {
|
| + return NULL;
|
| + } else {
|
| + // If not aliased, check the arguments.
|
| + FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
| + return ElementsAccessor::ForArray(arguments)->GetAccessorPair(
|
| + receiver, obj, key, arguments);
|
| + }
|
| + }
|
| +
|
| MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
| JSObject* obj,
|
| Object* length,
|
|
|