| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index fe94a42c4ad9fcb709c9c2af86b0a15fb34cf32f..c798343a1f32a7a2c448e237b53f79a2b3a8cd62 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -3559,16 +3559,14 @@ Object* JSObject::GetHiddenProperty(String* key) {
|
| return JSObject::cast(proxy_parent)->GetHiddenProperty(key);
|
| }
|
| ASSERT(!IsJSGlobalProxy());
|
| - MaybeObject* hidden_lookup = GetHiddenPropertiesDictionary(false);
|
| + MaybeObject* hidden_lookup = GetHiddenPropertiesArray(false);
|
| ASSERT(!hidden_lookup->IsFailure()); // No failure when passing false as arg.
|
| if (hidden_lookup->ToObjectUnchecked()->IsUndefined()) {
|
| return GetHeap()->undefined_value();
|
| }
|
| - StringDictionary* dictionary =
|
| - StringDictionary::cast(hidden_lookup->ToObjectUnchecked());
|
| - int entry = dictionary->FindEntry(key);
|
| - if (entry == StringDictionary::kNotFound) return GetHeap()->undefined_value();
|
| - return dictionary->ValueAt(entry);
|
| + HiddenPropertiesArray* hidden_properties =
|
| + HiddenPropertiesArray::cast(hidden_lookup->ToObjectUnchecked());
|
| + return hidden_properties->Get(key);
|
| }
|
|
|
|
|
| @@ -3591,28 +3589,25 @@ MaybeObject* JSObject::SetHiddenProperty(String* key, Object* value) {
|
| return JSObject::cast(proxy_parent)->SetHiddenProperty(key, value);
|
| }
|
| ASSERT(!IsJSGlobalProxy());
|
| - MaybeObject* hidden_lookup = GetHiddenPropertiesDictionary(true);
|
| - StringDictionary* dictionary;
|
| - if (!hidden_lookup->To<StringDictionary>(&dictionary)) return hidden_lookup;
|
|
|
| - // If it was found, check if the key is already in the dictionary.
|
| - int entry = dictionary->FindEntry(key);
|
| - if (entry != StringDictionary::kNotFound) {
|
| - // If key was found, just update the value.
|
| - dictionary->ValueAtPut(entry, value);
|
| - return this;
|
| + HiddenPropertiesArray* hidden_properties;
|
| + { MaybeObject* maybe_obj = GetHiddenPropertiesArray(true);
|
| + if (!maybe_obj->To<HiddenPropertiesArray>(&hidden_properties)) {
|
| + return maybe_obj;
|
| + }
|
| }
|
| - // Key was not already in the dictionary, so add the entry.
|
| - MaybeObject* insert_result = dictionary->Add(key,
|
| - value,
|
| - PropertyDetails(NONE, NORMAL));
|
| - StringDictionary* new_dict;
|
| - if (!insert_result->To<StringDictionary>(&new_dict)) return insert_result;
|
| - if (new_dict != dictionary) {
|
| - // If adding the key expanded the dictionary (i.e., Add returned a new
|
| - // dictionary), store it back to the object.
|
| - MaybeObject* store_result = SetHiddenPropertiesDictionary(new_dict);
|
| - if (store_result->IsFailure()) return store_result;
|
| +
|
| + HiddenPropertiesArray* new_hidden_properties;
|
| + MaybeObject* store_result = hidden_properties->Set(key, value);
|
| + if (!store_result->To<HiddenPropertiesArray>(&new_hidden_properties)) {
|
| + return store_result;
|
| + }
|
| +
|
| + if (new_hidden_properties != hidden_properties) {
|
| + // Update the object if the backing store has been re-allocated.
|
| + MaybeObject* maybe_obj = SetHiddenPropertiesArray(
|
| + new_hidden_properties);
|
| + if (maybe_obj->IsFailure()) return maybe_obj;
|
| }
|
| // Return this to mark success.
|
| return this;
|
| @@ -3629,18 +3624,12 @@ void JSObject::DeleteHiddenProperty(String* key) {
|
| JSObject::cast(proxy_parent)->DeleteHiddenProperty(key);
|
| return;
|
| }
|
| - MaybeObject* hidden_lookup = GetHiddenPropertiesDictionary(false);
|
| - ASSERT(!hidden_lookup->IsFailure()); // No failure when passing false as arg.
|
| + MaybeObject* hidden_lookup = GetHiddenPropertiesArray(false);
|
| + ASSERT(!hidden_lookup->IsFailure());
|
| if (hidden_lookup->ToObjectUnchecked()->IsUndefined()) return;
|
| - StringDictionary* dictionary =
|
| - StringDictionary::cast(hidden_lookup->ToObjectUnchecked());
|
| - int entry = dictionary->FindEntry(key);
|
| - if (entry == StringDictionary::kNotFound) {
|
| - // Key wasn't in dictionary. Deletion is a success.
|
| - return;
|
| - }
|
| - // Key was in the dictionary. Remove it.
|
| - dictionary->DeleteProperty(entry, JSReceiver::FORCE_DELETION);
|
| + HiddenPropertiesArray* hidden_properties =
|
| + HiddenPropertiesArray::cast(hidden_lookup->ToObjectUnchecked());
|
| + hidden_properties->Delete(key);
|
| }
|
|
|
|
|
| @@ -3651,7 +3640,7 @@ bool JSObject::HasHiddenProperties() {
|
| }
|
|
|
|
|
| -MaybeObject* JSObject::GetHiddenPropertiesDictionary(bool create_if_absent) {
|
| +MaybeObject* JSObject::GetHiddenPropertiesArray(bool create_if_absent) {
|
| ASSERT(!IsJSGlobalProxy());
|
| if (HasFastProperties()) {
|
| // If the object has fast properties, check whether the first slot
|
| @@ -3662,9 +3651,9 @@ MaybeObject* JSObject::GetHiddenPropertiesDictionary(bool create_if_absent) {
|
| if ((descriptors->number_of_descriptors() > 0) &&
|
| (descriptors->GetKey(0) == GetHeap()->hidden_symbol())) {
|
| ASSERT(descriptors->GetType(0) == FIELD);
|
| - Object* hidden_store =
|
| + Object* hidden_properties =
|
| this->FastPropertyAt(descriptors->GetFieldIndex(0));
|
| - return StringDictionary::cast(hidden_store);
|
| + return HiddenPropertiesArray::cast(hidden_properties);
|
| }
|
| } else {
|
| PropertyAttributes attributes;
|
| @@ -3676,27 +3665,31 @@ MaybeObject* JSObject::GetHiddenPropertiesDictionary(bool create_if_absent) {
|
| GetHeap()->hidden_symbol(),
|
| &attributes)->ToObjectUnchecked();
|
| if (!lookup->IsUndefined()) {
|
| - return StringDictionary::cast(lookup);
|
| + return HiddenPropertiesArray::cast(lookup);
|
| }
|
| }
|
| if (!create_if_absent) return GetHeap()->undefined_value();
|
| - const int kInitialSize = 5;
|
| - MaybeObject* dict_alloc = StringDictionary::Allocate(kInitialSize);
|
| - StringDictionary* dictionary;
|
| - if (!dict_alloc->To<StringDictionary>(&dictionary)) return dict_alloc;
|
| +
|
| + HiddenPropertiesArray* hidden_properties;
|
| + { MaybeObject* maybe_obj = HiddenPropertiesArray::Allocate();
|
| + if (!maybe_obj->To<HiddenPropertiesArray>(&hidden_properties)) {
|
| + return maybe_obj;
|
| + }
|
| + }
|
| +
|
| MaybeObject* store_result =
|
| SetPropertyPostInterceptor(GetHeap()->hidden_symbol(),
|
| - dictionary,
|
| + hidden_properties,
|
| DONT_ENUM,
|
| kNonStrictMode,
|
| OMIT_EXTENSIBILITY_CHECK);
|
| if (store_result->IsFailure()) return store_result;
|
| - return dictionary;
|
| + return hidden_properties;
|
| }
|
|
|
|
|
| -MaybeObject* JSObject::SetHiddenPropertiesDictionary(
|
| - StringDictionary* dictionary) {
|
| +MaybeObject* JSObject::SetHiddenPropertiesArray(
|
| + HiddenPropertiesArray* hidden_properties) {
|
| ASSERT(!IsJSGlobalProxy());
|
| ASSERT(HasHiddenProperties());
|
| if (HasFastProperties()) {
|
| @@ -3708,13 +3701,13 @@ MaybeObject* JSObject::SetHiddenPropertiesDictionary(
|
| if ((descriptors->number_of_descriptors() > 0) &&
|
| (descriptors->GetKey(0) == GetHeap()->hidden_symbol())) {
|
| ASSERT(descriptors->GetType(0) == FIELD);
|
| - this->FastPropertyAtPut(descriptors->GetFieldIndex(0), dictionary);
|
| + this->FastPropertyAtPut(descriptors->GetFieldIndex(0), hidden_properties);
|
| return this;
|
| }
|
| }
|
| MaybeObject* store_result =
|
| SetPropertyPostInterceptor(GetHeap()->hidden_symbol(),
|
| - dictionary,
|
| + hidden_properties,
|
| DONT_ENUM,
|
| kNonStrictMode,
|
| OMIT_EXTENSIBILITY_CHECK);
|
|
|