| Index: src/lookup.cc
|
| diff --git a/src/lookup.cc b/src/lookup.cc
|
| index 1ffd888350bda9c46c8b5b6de434edb4d8d74db0..48da4fabeea4eff3db524976b3e177bc1b5c8aab 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));
|
| + }
|
| }
|
| }
|
|
|
| @@ -413,8 +417,8 @@ bool LookupIterator::InternalHolderIsReceiverOrHiddenPrototype() const {
|
|
|
| Handle<Object> LookupIterator::FetchValue() const {
|
| Object* result = NULL;
|
| - Handle<JSObject> holder = GetHolder<JSObject>();
|
| if (IsElement()) {
|
| + Handle<JSObject> holder = GetHolder<JSObject>();
|
| // TODO(verwaest): Optimize.
|
| if (holder->IsStringObjectWithCharacterAt(index_)) {
|
| Handle<JSValue> js_value = Handle<JSValue>::cast(holder);
|
| @@ -426,12 +430,14 @@ Handle<Object> LookupIterator::FetchValue() const {
|
| ElementsAccessor* accessor = holder->GetElementsAccessor();
|
| return accessor->Get(handle(holder->elements()), number_);
|
| } else if (holder_map_->IsJSGlobalObjectMap()) {
|
| + Handle<JSObject> holder = GetHolder<JSObject>();
|
| result = holder->global_dictionary()->ValueAt(number_);
|
| DCHECK(result->IsPropertyCell());
|
| result = PropertyCell::cast(result)->value();
|
| } else if (holder_map_->is_dictionary_map()) {
|
| - result = holder->property_dictionary()->ValueAt(number_);
|
| + result = holder_->property_dictionary()->ValueAt(number_);
|
| } else if (property_details_.type() == v8::internal::DATA) {
|
| + Handle<JSObject> holder = GetHolder<JSObject>();
|
| FieldIndex field_index = FieldIndex::ForDescriptor(*holder_map_, number_);
|
| return JSObject::FastPropertyAt(holder, property_details_.representation(),
|
| field_index);
|
| @@ -506,20 +512,21 @@ 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<GlobalDictionary> property_dictionary =
|
| - handle(holder->global_dictionary());
|
| + handle(JSObject::cast(*holder)->global_dictionary());
|
| 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);
|
| + JSObject::cast(*holder)->WriteToField(descriptor_number(), *value);
|
| } 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);
|
|
|