| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 67a7b2bc7a18bd23e861f46be4f08f8b4bc9ac69..496c26c2c23337055b41336d814bf0861d2c76f4 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -3275,54 +3275,58 @@ MaybeHandle<Object> Object::SetSuperProperty(LookupIterator* it,
|
| if (found) return result;
|
|
|
| LookupIterator own_lookup(it->GetReceiver(), it->name(), LookupIterator::OWN);
|
| + for (; own_lookup.IsFound(); own_lookup.Next()) {
|
| + switch (own_lookup.state()) {
|
| + case LookupIterator::ACCESS_CHECK:
|
| + if (!own_lookup.HasAccess()) {
|
| + return JSObject::SetPropertyWithFailedAccessCheck(&own_lookup, value,
|
| + SLOPPY);
|
| + }
|
| + break;
|
|
|
| - switch (own_lookup.state()) {
|
| - case LookupIterator::NOT_FOUND:
|
| - return JSObject::AddDataProperty(&own_lookup, value, NONE, language_mode,
|
| - store_mode);
|
| -
|
| - case LookupIterator::INTEGER_INDEXED_EXOTIC:
|
| - return result;
|
| + case LookupIterator::INTEGER_INDEXED_EXOTIC:
|
| + return RedefineNonconfigurableProperty(it->isolate(), it->name(), value,
|
| + language_mode);
|
|
|
| - case LookupIterator::DATA: {
|
| - PropertyDetails details = own_lookup.property_details();
|
| - if (details.IsConfigurable() || !details.IsReadOnly()) {
|
| - return JSObject::SetOwnPropertyIgnoreAttributes(
|
| - Handle<JSObject>::cast(it->GetReceiver()), it->name(), value,
|
| - details.attributes());
|
| + case LookupIterator::DATA: {
|
| + PropertyDetails details = own_lookup.property_details();
|
| + if (details.IsConfigurable() || !details.IsReadOnly()) {
|
| + return JSObject::SetOwnPropertyIgnoreAttributes(
|
| + Handle<JSObject>(it->GetReceiver()), it->name(), value,
|
| + details.attributes());
|
| + }
|
| + return WriteToReadOnlyProperty(&own_lookup, value, language_mode);
|
| }
|
| - return WriteToReadOnlyProperty(&own_lookup, value, language_mode);
|
| - }
|
|
|
| - case LookupIterator::ACCESSOR: {
|
| - PropertyDetails details = own_lookup.property_details();
|
| - if (details.IsConfigurable()) {
|
| - return JSObject::SetOwnPropertyIgnoreAttributes(
|
| - Handle<JSObject>::cast(it->GetReceiver()), it->name(), value,
|
| - details.attributes());
|
| - }
|
| + case LookupIterator::ACCESSOR: {
|
| + PropertyDetails details = own_lookup.property_details();
|
| + if (details.IsConfigurable()) {
|
| + return JSObject::SetOwnPropertyIgnoreAttributes(
|
| + Handle<JSObject>(it->GetReceiver()), it->name(), value,
|
| + details.attributes());
|
| + }
|
|
|
| - return RedefineNonconfigurableProperty(it->isolate(), it->name(), value,
|
| - language_mode);
|
| - }
|
| + return RedefineNonconfigurableProperty(it->isolate(), it->name(), value,
|
| + language_mode);
|
| + }
|
|
|
| - case LookupIterator::TRANSITION:
|
| - UNREACHABLE();
|
| - break;
|
| + case LookupIterator::INTERCEPTOR:
|
| + case LookupIterator::JSPROXY: {
|
| + bool found = false;
|
| + MaybeHandle<Object> result = SetPropertyInternal(
|
| + &own_lookup, value, language_mode, store_mode, &found);
|
| + if (found) return result;
|
| + break;
|
| + }
|
|
|
| - case LookupIterator::INTERCEPTOR:
|
| - case LookupIterator::JSPROXY:
|
| - case LookupIterator::ACCESS_CHECK: {
|
| - bool found = false;
|
| - MaybeHandle<Object> result = SetPropertyInternal(
|
| - &own_lookup, value, language_mode, store_mode, &found);
|
| - if (found) return result;
|
| - return SetDataProperty(&own_lookup, value);
|
| + case LookupIterator::NOT_FOUND:
|
| + case LookupIterator::TRANSITION:
|
| + UNREACHABLE();
|
| }
|
| }
|
|
|
| - UNREACHABLE();
|
| - return MaybeHandle<Object>();
|
| + return JSObject::AddDataProperty(&own_lookup, value, NONE, language_mode,
|
| + store_mode);
|
| }
|
|
|
|
|
|
|