| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index d951b0ee5f39d196b5e6880d73da56fcb5a774ba..63bf0907417790390a22c930fca7dd02cdd57953 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2011 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -173,12 +173,12 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| if (len1 == 0) return to;
|
|
|
| // Compute how many elements are not in other.
|
| - int extra = 0;
|
| + uint32_t extra = 0;
|
| for (uint32_t y = 0; y < len1; y++) {
|
| - if (ElementsAccessorSubclass::HasElementAtIndexImpl(
|
| - backing_store, y, holder, receiver)) {
|
| - uint32_t key =
|
| - ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
|
| + uint32_t key =
|
| + ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
|
| + if (ElementsAccessorSubclass::HasElementImpl(
|
| + backing_store, key, holder, receiver)) {
|
| MaybeObject* maybe_value =
|
| ElementsAccessorSubclass::GetImpl(backing_store, key,
|
| holder, receiver);
|
| @@ -210,12 +210,12 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| }
|
| }
|
| // Fill in the extra values.
|
| - int index = 0;
|
| + uint32_t index = 0;
|
| for (uint32_t y = 0; y < len1; y++) {
|
| - if (ElementsAccessorSubclass::HasElementAtIndexImpl(
|
| - backing_store, y, holder, receiver)) {
|
| - uint32_t key =
|
| - ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
|
| + uint32_t key =
|
| + ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
|
| + if (ElementsAccessorSubclass::HasElementImpl(
|
| + backing_store, key, holder, receiver)) {
|
| MaybeObject* maybe_value =
|
| ElementsAccessorSubclass::GetImpl(backing_store, key,
|
| holder, receiver);
|
| @@ -241,23 +241,21 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| BackingStoreClass::cast(backing_store));
|
| }
|
|
|
| - static bool HasElementAtIndexImpl(BackingStoreClass* backing_store,
|
| - uint32_t index,
|
| - JSObject* holder,
|
| - Object* receiver) {
|
| - uint32_t key =
|
| - ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index);
|
| + static bool HasElementImpl(BackingStoreClass* backing_store,
|
| + uint32_t key,
|
| + JSObject* holder,
|
| + Object* receiver) {
|
| MaybeObject* element =
|
| ElementsAccessorSubclass::GetImpl(backing_store, key, holder, receiver);
|
| return !element->IsTheHole();
|
| }
|
|
|
| - virtual bool HasElementAtIndex(FixedArrayBase* backing_store,
|
| - uint32_t index,
|
| - JSObject* holder,
|
| - Object* receiver) {
|
| - return ElementsAccessorSubclass::HasElementAtIndexImpl(
|
| - BackingStoreClass::cast(backing_store), index, holder, receiver);
|
| + virtual bool HasElement(FixedArrayBase* backing_store,
|
| + uint32_t key,
|
| + JSObject* holder,
|
| + Object* receiver) {
|
| + return ElementsAccessorSubclass::HasElementImpl(
|
| + BackingStoreClass::cast(backing_store), key, holder, receiver);
|
| }
|
|
|
| static uint32_t GetKeyForIndexImpl(BackingStoreClass* backing_store,
|
| @@ -266,7 +264,7 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| }
|
|
|
| virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
|
| - uint32_t index) {
|
| + uint32_t index) {
|
| return ElementsAccessorSubclass::GetKeyForIndexImpl(
|
| BackingStoreClass::cast(backing_store), index);
|
| }
|
| @@ -441,11 +439,11 @@ class FastDoubleElementsAccessor
|
| return obj->GetHeap()->true_value();
|
| }
|
|
|
| - static bool HasElementAtIndexImpl(FixedDoubleArray* backing_store,
|
| - uint32_t index,
|
| - JSObject* holder,
|
| - Object* receiver) {
|
| - return !backing_store->is_the_hole(index);
|
| + static bool HasElementImpl(FixedDoubleArray* backing_store,
|
| + uint32_t key,
|
| + JSObject* holder,
|
| + Object* receiver) {
|
| + return !backing_store->is_the_hole(key);
|
| }
|
| };
|
|
|
| @@ -484,6 +482,15 @@ class ExternalElementsAccessor
|
| // External arrays always ignore deletes.
|
| return obj->GetHeap()->true_value();
|
| }
|
| +
|
| + static bool HasElementImpl(ExternalArray* backing_store,
|
| + uint32_t key,
|
| + JSObject* holder,
|
| + Object* receiver) {
|
| + uint32_t capacity =
|
| + ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store);
|
| + return key < capacity;
|
| + }
|
| };
|
|
|
|
|
| @@ -677,6 +684,14 @@ class DictionaryElementsAccessor
|
| return obj->GetHeap()->the_hole_value();
|
| }
|
|
|
| + static bool HasElementImpl(SeededNumberDictionary* backing_store,
|
| + uint32_t key,
|
| + JSObject* holder,
|
| + Object* receiver) {
|
| + return backing_store->FindEntry(key) !=
|
| + SeededNumberDictionary::kNotFound;
|
| + }
|
| +
|
| static uint32_t GetKeyForIndexImpl(SeededNumberDictionary* dict,
|
| uint32_t index) {
|
| Object* key = dict->KeyAt(index);
|
| @@ -696,7 +711,7 @@ class NonStrictArgumentsElementsAccessor
|
| uint32_t key,
|
| JSObject* obj,
|
| Object* receiver) {
|
| - Object* probe = GetParameterMapArg(parameter_map, key);
|
| + Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| Context* context = Context::cast(parameter_map->get(0));
|
| int context_index = Smi::cast(probe)->value();
|
| @@ -735,7 +750,7 @@ class NonStrictArgumentsElementsAccessor
|
| uint32_t key,
|
| JSReceiver::DeleteMode mode) {
|
| FixedArray* parameter_map = FixedArray::cast(obj->elements());
|
| - Object* probe = GetParameterMapArg(parameter_map, key);
|
| + Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| // TODO(kmillikin): We could check if this was the last aliased
|
| // parameter, and revert to normal elements in that case. That
|
| @@ -763,24 +778,27 @@ class NonStrictArgumentsElementsAccessor
|
| return index;
|
| }
|
|
|
| - static bool HasElementAtIndexImpl(FixedArray* parameter_map,
|
| - uint32_t index,
|
| - JSObject* holder,
|
| - Object* receiver) {
|
| - Object* probe = GetParameterMapArg(parameter_map, index);
|
| + static bool HasElementImpl(FixedArray* parameter_map,
|
| + uint32_t key,
|
| + JSObject* holder,
|
| + Object* receiver) {
|
| + Object* probe = GetParameterMapArg(holder, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| return true;
|
| } else {
|
| FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
|
| ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
|
| - return !accessor->Get(arguments, index, holder, receiver)->IsTheHole();
|
| + return !accessor->Get(arguments, key, holder, receiver)->IsTheHole();
|
| }
|
| }
|
|
|
| private:
|
| - static Object* GetParameterMapArg(FixedArray* parameter_map,
|
| + static Object* GetParameterMapArg(JSObject* holder,
|
| + FixedArray* parameter_map,
|
| uint32_t key) {
|
| - uint32_t length = parameter_map->length();
|
| + uint32_t length = holder->IsJSArray()
|
| + ? Smi::cast(JSArray::cast(holder)->length())->value()
|
| + : parameter_map->length();
|
| return key < (length - 2 )
|
| ? parameter_map->get(key + 2)
|
| : parameter_map->GetHeap()->the_hole_value();
|
|
|