Chromium Code Reviews| Index: src/lookup.cc |
| diff --git a/src/lookup.cc b/src/lookup.cc |
| index 1ffd888350bda9c46c8b5b6de434edb4d8d74db0..e9faba5a82f11fac136778d055b8040bae916177 100644 |
| --- a/src/lookup.cc |
| +++ b/src/lookup.cc |
| @@ -270,23 +270,27 @@ void LookupIterator::ApplyTransitionToDataProperty() { |
| void LookupIterator::Delete() { |
| - Handle<JSObject> holder = Handle<JSObject>::cast(holder_); |
| + Handle<JSReceiver> holder = Handle<JSReceiver>::cast(holder_); |
| if (IsElement()) { |
| - ElementsAccessor* accessor = holder->GetElementsAccessor(); |
| - accessor->Delete(holder, number_); |
| + Handle<JSObject> object = Handle<JSObject>::cast(holder); |
| + ElementsAccessor* accessor = object->GetElementsAccessor(); |
| + accessor->Delete(object, number_); |
| } else { |
| PropertyNormalizationMode mode = holder->map()->is_prototype_map() |
| ? KEEP_INOBJECT_PROPERTIES |
| : CLEAR_INOBJECT_PROPERTIES; |
| if (holder->HasFastProperties()) { |
| - JSObject::NormalizeProperties(holder, mode, 0, "DeletingProperty"); |
| + JSObject::NormalizeProperties(Handle<JSObject>::cast(holder), mode, 0, |
| + "DeletingProperty"); |
| holder_map_ = handle(holder->map(), isolate_); |
| ReloadPropertyInformation(); |
| } |
| // TODO(verwaest): Get rid of the name_ argument. |
| - JSObject::DeleteNormalizedProperty(holder, name_, number_); |
| - JSObject::ReoptimizeIfPrototype(holder); |
| + JSReceiver::DeleteNormalizedProperty(holder, name_, number_); |
| + if (holder->IsJSObject()) { |
| + JSObject::ReoptimizeIfPrototype(Handle<JSObject>::cast(holder)); |
| + } |
| } |
| } |
| @@ -506,20 +510,23 @@ Handle<Object> LookupIterator::GetDataValue() const { |
| void LookupIterator::WriteDataValue(Handle<Object> value) { |
| DCHECK_EQ(DATA, state_); |
| - Handle<JSObject> holder = GetHolder<JSObject>(); |
| + Handle<JSReceiver> holder = GetHolder<JSReceiver>(); |
| if (IsElement()) { |
| - ElementsAccessor* accessor = holder->GetElementsAccessor(); |
| - accessor->Set(holder->elements(), number_, *value); |
| + Handle<JSObject> object = Handle<JSObject>::cast(holder); |
| + ElementsAccessor* accessor = object->GetElementsAccessor(); |
| + accessor->Set(object->elements(), number_, *value); |
| } else if (holder->IsJSGlobalObject()) { |
| + Handle<JSObject> object = Handle<JSObject>::cast(holder); |
| Handle<GlobalDictionary> property_dictionary = |
| - handle(holder->global_dictionary()); |
| + handle(object->global_dictionary()); |
|
Toon Verwaest
2016/01/15 14:22:42
Handle<GlobalDictionary> dictionary(
JSObject:
|
| PropertyCell::UpdateCell(property_dictionary, dictionary_entry(), value, |
| property_details_); |
| } else if (holder_map_->is_dictionary_map()) { |
| NameDictionary* property_dictionary = holder->property_dictionary(); |
| property_dictionary->ValueAtPut(dictionary_entry(), *value); |
| } else if (property_details_.type() == v8::internal::DATA) { |
| - holder->WriteToField(descriptor_number(), *value); |
| + Handle<JSObject> object = Handle<JSObject>::cast(holder); |
| + object->WriteToField(descriptor_number(), *value); |
|
Toon Verwaest
2016/01/15 14:22:42
JSObject::cast(*holder)->WriteToField(descriptor_n
|
| } else { |
| DCHECK_EQ(v8::internal::DATA_CONSTANT, property_details_.type()); |
| } |
| @@ -611,8 +618,7 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* const map, |
| case NOT_FOUND: |
| if (map->IsJSProxyMap()) { |
| // Do not leak private property names. |
| - if (!name_.is_null() && name_->IsPrivate()) return NOT_FOUND; |
| - return JSPROXY; |
| + if (IsElement() || !name_->IsPrivate()) return JSPROXY; |
| } |
| if (map->is_access_check_needed() && |
| (IsElement() || !isolate_->IsInternallyUsedPropertyName(name_))) { |
| @@ -668,7 +674,7 @@ LookupIterator::State LookupIterator::LookupInHolder(Map* const map, |
| if (cell->value()->IsTheHole()) return NOT_FOUND; |
| property_details_ = cell->property_details(); |
| } else { |
| - NameDictionary* dict = JSObject::cast(holder)->property_dictionary(); |
| + NameDictionary* dict = holder->property_dictionary(); |
| int number = dict->FindEntry(name_); |
| if (number == NameDictionary::kNotFound) return NOT_FOUND; |
| number_ = static_cast<uint32_t>(number); |