| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 39c30336ea755b86a1c9a25fccbba19d76adb284..91fd624f54df229c9ecc435d18b0a5f43ed3d754 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -6024,6 +6024,17 @@ bool JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate,
|
| LookupIterator it = LookupIterator::PropertyOrElement(
|
| isolate, object, key, &success, LookupIterator::HIDDEN);
|
| DCHECK(success); // ...so creating a LookupIterator can't fail.
|
| +
|
| + // Deal with access checks first.
|
| + if (it.state() == LookupIterator::ACCESS_CHECK) {
|
| + if (!it.HasAccess()) {
|
| + isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>());
|
| + RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, false);
|
| + return false;
|
| + }
|
| + it.Next();
|
| + }
|
| +
|
| return OrdinaryDefineOwnProperty(&it, desc, should_throw);
|
| }
|
|
|
| @@ -6063,6 +6074,13 @@ bool JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it,
|
| }
|
| return false;
|
| }
|
| + // We have to use a fresh LookupIterator to handle interceptors properly.
|
| + LookupIterator lookup_for_store =
|
| + it->IsElement() ? LookupIterator(isolate, it->GetReceiver(),
|
| + it->index(), LookupIterator::HIDDEN)
|
| + : LookupIterator(it->GetReceiver(), it->name(),
|
| + LookupIterator::HIDDEN);
|
| +
|
| // 2c. If IsGenericDescriptor(Desc) or IsDataDescriptor(Desc) is true, then:
|
| // (This is equivalent to !IsAccessorDescriptor(desc).)
|
| DCHECK((desc_is_generic_descriptor || desc_is_data_descriptor) ==
|
| @@ -6082,8 +6100,9 @@ bool JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it,
|
| ? desc->value()
|
| : Handle<Object>::cast(isolate->factory()->undefined_value()));
|
| MaybeHandle<Object> result =
|
| - JSObject::DefineOwnPropertyIgnoreAttributes(it, value,
|
| - desc->ToAttributes());
|
| + JSObject::DefineOwnPropertyIgnoreAttributes(
|
| + &lookup_for_store, value, desc->ToAttributes(),
|
| + JSObject::DONT_FORCE_FIELD);
|
| if (result.is_null()) return false;
|
| }
|
| } else {
|
| @@ -6105,8 +6124,8 @@ bool JSReceiver::OrdinaryDefineOwnProperty(LookupIterator* it,
|
| desc->has_set()
|
| ? desc->set()
|
| : Handle<Object>::cast(isolate->factory()->undefined_value()));
|
| - MaybeHandle<Object> result =
|
| - JSObject::DefineAccessor(it, getter, setter, desc->ToAttributes());
|
| + MaybeHandle<Object> result = JSObject::DefineAccessor(
|
| + &lookup_for_store, getter, setter, desc->ToAttributes());
|
| if (result.is_null()) return false;
|
| }
|
| }
|
| @@ -6515,7 +6534,7 @@ bool JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
|
| if (!success && should_throw == THROW_ON_ERROR) {
|
| isolate->Throw(*isolate->factory()->NewTypeError(
|
| MessageTemplate::kStrictDeleteProperty,
|
| - isolate->factory()->NewNumberFromUint(actual_new_len - 1)));
|
| + isolate->factory()->NewNumberFromUint(actual_new_len - 1), a));
|
| }
|
| return success;
|
| }
|
| @@ -7795,7 +7814,10 @@ MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object,
|
| DCHECK(filter == INCLUDE_SYMBOLS);
|
| PropertyAttributes attr_filter =
|
| static_cast<PropertyAttributes>(DONT_ENUM | PRIVATE_SYMBOL);
|
| - JSObject::CollectOwnElementKeys(current, &accumulator, attr_filter);
|
| + Handle<FixedArray> property_keys = isolate->factory()->NewFixedArray(
|
| + current->NumberOfOwnProperties(attr_filter));
|
| + current->GetOwnPropertyNames(*property_keys, 0, attr_filter);
|
| + accumulator.AddKeys(property_keys);
|
| }
|
|
|
| // Add the property keys from the interceptor.
|
|
|