Chromium Code Reviews| Index: src/elements.cc |
| diff --git a/src/elements.cc b/src/elements.cc |
| index 45be25ebd09fc499f44aaab805d551682e90b139..d1d9be4884e7042d702b63c35b69394933a0c369 100644 |
| --- a/src/elements.cc |
| +++ b/src/elements.cc |
| @@ -105,33 +105,56 @@ template <typename ElementsAccessorSubclass, typename BackingStoreClass> |
| class ElementsAccessorBase : public ElementsAccessor { |
| protected: |
| explicit ElementsAccessorBase(const char* name) : ElementsAccessor(name) { } |
| - virtual MaybeObject* Get(FixedArrayBase* backing_store, |
| + |
| + static bool HasElementImpl(Object* receiver, |
| + JSObject* holder, |
| + uint32_t key, |
| + BackingStoreClass* backing_store) { |
| + MaybeObject* element = |
| + ElementsAccessorSubclass::GetImpl(receiver, holder, key, backing_store); |
| + return !element->IsTheHole(); |
| + } |
| + |
| + virtual bool HasElement(Object* receiver, |
| + JSObject* holder, |
| + uint32_t key, |
| + FixedArrayBase* backing_store) { |
| + if (backing_store == NULL) { |
| + backing_store = holder->elements(); |
| + } |
| + return ElementsAccessorSubclass::HasElementImpl( |
| + receiver, holder, key, BackingStoreClass::cast(backing_store)); |
| + } |
| + |
| + virtual MaybeObject* Get(Object* receiver, |
| + JSObject* holder, |
| uint32_t key, |
| - JSObject* obj, |
| - Object* receiver) { |
| + FixedArrayBase* backing_store) { |
| + if (backing_store == NULL) { |
| + backing_store = holder->elements(); |
| + } |
| return ElementsAccessorSubclass::GetImpl( |
| - BackingStoreClass::cast(backing_store), key, obj, receiver); |
| + receiver, holder, key, BackingStoreClass::cast(backing_store)); |
| } |
| - static MaybeObject* GetImpl(BackingStoreClass* backing_store, |
| - uint32_t key, |
| + static MaybeObject* GetImpl(Object* receiver, |
| JSObject* obj, |
| - Object* receiver) { |
| + uint32_t key, |
| + BackingStoreClass* backing_store) { |
| return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store)) |
| ? backing_store->get(key) |
| : backing_store->GetHeap()->the_hole_value(); |
| } |
| - virtual MaybeObject* SetLength(JSObject* obj, |
| + virtual MaybeObject* SetLength(JSArray* array, |
| Object* length) { |
| - ASSERT(obj->IsJSArray()); |
| return ElementsAccessorSubclass::SetLengthImpl( |
| - BackingStoreClass::cast(obj->elements()), obj, length); |
| + array, length, BackingStoreClass::cast(array->elements())); |
| } |
| - static MaybeObject* SetLengthImpl(BackingStoreClass* backing_store, |
| - JSObject* obj, |
| - Object* length); |
| + static MaybeObject* SetLengthImpl(JSObject* obj, |
| + Object* length, |
| + BackingStoreClass* backing_store); |
| virtual MaybeObject* SetCapacityAndLength(JSArray* array, |
| int capacity, |
| @@ -153,10 +176,9 @@ class ElementsAccessorBase : public ElementsAccessor { |
| uint32_t key, |
| JSReceiver::DeleteMode mode) = 0; |
| - virtual MaybeObject* AddElementsToFixedArray(FixedArrayBase* from, |
| - FixedArray* to, |
| - JSObject* holder, |
| - Object* receiver) { |
| + virtual MaybeObject* AddElementsToFixedArray( |
|
Jakob Kummerow
2012/03/06 11:57:43
The Chromium styleguide says that in function decl
danno
2012/03/06 12:21:54
Done.
|
| + Object* receiver, JSObject* holder, |
| + FixedArray* to, FixedArrayBase* from) { |
| int len0 = to->length(); |
| #ifdef DEBUG |
| if (FLAG_enable_slow_asserts) { |
| @@ -165,6 +187,9 @@ class ElementsAccessorBase : public ElementsAccessor { |
| } |
| } |
| #endif |
| + if (from == NULL) { |
| + from = holder->elements(); |
| + } |
| BackingStoreClass* backing_store = BackingStoreClass::cast(from); |
| uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(backing_store); |
| @@ -178,10 +203,10 @@ class ElementsAccessorBase : public ElementsAccessor { |
| uint32_t key = |
| ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y); |
| if (ElementsAccessorSubclass::HasElementImpl( |
| - backing_store, key, holder, receiver)) { |
| + receiver, holder, key, backing_store)) { |
| MaybeObject* maybe_value = |
| - ElementsAccessorSubclass::GetImpl(backing_store, key, |
| - holder, receiver); |
| + ElementsAccessorSubclass::GetImpl(receiver, holder, |
| + key, backing_store); |
| Object* value; |
| if (!maybe_value->ToObject(&value)) return maybe_value; |
| ASSERT(!value->IsTheHole()); |
| @@ -215,10 +240,10 @@ class ElementsAccessorBase : public ElementsAccessor { |
| uint32_t key = |
| ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y); |
| if (ElementsAccessorSubclass::HasElementImpl( |
| - backing_store, key, holder, receiver)) { |
| + receiver, holder, key, backing_store)) { |
| MaybeObject* maybe_value = |
| - ElementsAccessorSubclass::GetImpl(backing_store, key, |
| - holder, receiver); |
| + ElementsAccessorSubclass::GetImpl(receiver, holder, |
| + key, backing_store); |
| Object* value; |
| if (!maybe_value->ToObject(&value)) return maybe_value; |
| if (!value->IsTheHole() && !HasKey(to, value)) { |
| @@ -241,23 +266,6 @@ class ElementsAccessorBase : public ElementsAccessor { |
| BackingStoreClass::cast(backing_store)); |
| } |
| - 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 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, |
| uint32_t index) { |
| return index; |
| @@ -454,10 +462,10 @@ class FastDoubleElementsAccessor |
| return obj->GetHeap()->true_value(); |
| } |
| - static bool HasElementImpl(FixedDoubleArray* backing_store, |
| - uint32_t key, |
| + static bool HasElementImpl(Object* receiver, |
| JSObject* holder, |
| - Object* receiver) { |
| + uint32_t key, |
| + FixedDoubleArray* backing_store) { |
| return !backing_store->is_the_hole(key); |
| } |
| }; |
| @@ -478,19 +486,19 @@ class ExternalElementsAccessor |
| friend class ElementsAccessorBase<ExternalElementsAccessorSubclass, |
| ExternalArray>; |
| - static MaybeObject* GetImpl(ExternalArray* backing_store, |
| - uint32_t key, |
| + static MaybeObject* GetImpl(Object* receiver, |
| JSObject* obj, |
| - Object* receiver) { |
| + uint32_t key, |
| + ExternalArray* backing_store) { |
| return |
| key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) |
| ? backing_store->get(key) |
| : backing_store->GetHeap()->undefined_value(); |
| } |
| - static MaybeObject* SetLengthImpl(ExternalArray* backing_store, |
| - JSObject* obj, |
| - Object* length) { |
| + static MaybeObject* SetLengthImpl(JSObject* obj, |
| + Object* length, |
| + ExternalArray* backing_store) { |
| // External arrays do not support changing their length. |
| UNREACHABLE(); |
| return obj; |
| @@ -503,10 +511,10 @@ class ExternalElementsAccessor |
| return obj->GetHeap()->true_value(); |
| } |
| - static bool HasElementImpl(ExternalArray* backing_store, |
| - uint32_t key, |
| + static bool HasElementImpl(Object* receiver, |
| JSObject* holder, |
| - Object* receiver) { |
| + uint32_t key, |
| + ExternalArray* backing_store) { |
| uint32_t capacity = |
| ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store); |
| return key < capacity; |
| @@ -724,10 +732,10 @@ class DictionaryElementsAccessor |
| return DeleteCommon(obj, key, mode); |
| } |
| - static MaybeObject* GetImpl(SeededNumberDictionary* backing_store, |
| - uint32_t key, |
| + static MaybeObject* GetImpl(Object* receiver, |
| JSObject* obj, |
| - Object* receiver) { |
| + uint32_t key, |
| + SeededNumberDictionary* backing_store) { |
| int entry = backing_store->FindEntry(key); |
| if (entry != SeededNumberDictionary::kNotFound) { |
| Object* element = backing_store->ValueAt(entry); |
| @@ -744,10 +752,10 @@ class DictionaryElementsAccessor |
| return obj->GetHeap()->the_hole_value(); |
| } |
| - static bool HasElementImpl(SeededNumberDictionary* backing_store, |
| - uint32_t key, |
| + static bool HasElementImpl(Object* receiver, |
| JSObject* holder, |
| - Object* receiver) { |
| + uint32_t key, |
| + SeededNumberDictionary* backing_store) { |
| return backing_store->FindEntry(key) != |
| SeededNumberDictionary::kNotFound; |
| } |
| @@ -771,10 +779,10 @@ class NonStrictArgumentsElementsAccessor |
| friend class ElementsAccessorBase<NonStrictArgumentsElementsAccessor, |
| FixedArray>; |
| - static MaybeObject* GetImpl(FixedArray* parameter_map, |
| - uint32_t key, |
| + static MaybeObject* GetImpl(Object* receiver, |
| JSObject* obj, |
| - Object* receiver) { |
| + uint32_t key, |
| + FixedArray* parameter_map) { |
| Object* probe = GetParameterMapArg(obj, parameter_map, key); |
| if (!probe->IsTheHole()) { |
| Context* context = Context::cast(parameter_map->get(0)); |
| @@ -785,7 +793,7 @@ class NonStrictArgumentsElementsAccessor |
| // Object is not mapped, defer to the arguments. |
| FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| MaybeObject* maybe_result = ElementsAccessor::ForArray(arguments)->Get( |
| - arguments, key, obj, receiver); |
| + receiver, obj, key, arguments); |
| Object* result; |
| if (!maybe_result->ToObject(&result)) return maybe_result; |
| // Elements of the arguments object in slow mode might be slow aliases. |
| @@ -801,9 +809,9 @@ class NonStrictArgumentsElementsAccessor |
| } |
| } |
| - static MaybeObject* SetLengthImpl(FixedArray* parameter_map, |
| - JSObject* obj, |
| - Object* length) { |
| + static MaybeObject* SetLengthImpl(JSObject* obj, |
| + Object* length, |
| + FixedArray* parameter_map) { |
| // TODO(mstarzinger): This was never implemented but will be used once we |
| // correctly implement [[DefineOwnProperty]] on arrays. |
| UNIMPLEMENTED(); |
| @@ -842,17 +850,17 @@ class NonStrictArgumentsElementsAccessor |
| return index; |
| } |
| - static bool HasElementImpl(FixedArray* parameter_map, |
| - uint32_t key, |
| + static bool HasElementImpl(Object* receiver, |
| JSObject* holder, |
| - Object* receiver) { |
| + uint32_t key, |
| + FixedArray* parameter_map) { |
| 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, key, holder, receiver)->IsTheHole(); |
| + return !accessor->Get(receiver, holder, key, arguments)->IsTheHole(); |
| } |
| } |
| @@ -952,9 +960,9 @@ void ElementsAccessor::InitializeOncePerProcess() { |
| template <typename ElementsAccessorSubclass, typename BackingStoreClass> |
| MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass, BackingStoreClass>:: |
| - SetLengthImpl(BackingStoreClass* backing_store, |
| - JSObject* obj, |
| - Object* length) { |
| + SetLengthImpl(JSObject* obj, |
| + Object* length, |
| + BackingStoreClass* backing_store) { |
| JSArray* array = JSArray::cast(obj); |
| // Fast case: The new length fits into a Smi. |