| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 1f4881037bdd80375a9a503981714dedc880a72a..afa430397a2f9011cf843f60fe8a6a78b78b35df 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -291,7 +291,7 @@ MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver,
|
| if (structure->IsAccessorInfo()) {
|
| Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
|
| if (!info->IsCompatibleReceiver(*receiver)) {
|
| - Handle<Object> args[2] = { name, receiver };
|
| + Handle<Object> args[] = {name, receiver};
|
| THROW_NEW_ERROR(isolate,
|
| NewTypeError("incompatible_method_receiver",
|
| HandleVector(args, arraysize(args))),
|
| @@ -356,7 +356,7 @@ MaybeHandle<Object> Object::SetPropertyWithAccessor(
|
| // api style callbacks
|
| ExecutableAccessorInfo* info = ExecutableAccessorInfo::cast(*structure);
|
| if (!info->IsCompatibleReceiver(*receiver)) {
|
| - Handle<Object> args[2] = { name, receiver };
|
| + Handle<Object> args[] = {name, receiver};
|
| THROW_NEW_ERROR(isolate,
|
| NewTypeError("incompatible_method_receiver",
|
| HandleVector(args, arraysize(args))),
|
| @@ -383,10 +383,11 @@ MaybeHandle<Object> Object::SetPropertyWithAccessor(
|
| receiver, Handle<JSReceiver>::cast(setter), value);
|
| } else {
|
| if (is_sloppy(language_mode)) return value;
|
| - Handle<Object> args[2] = { name, holder };
|
| - THROW_NEW_ERROR(
|
| - isolate, NewTypeError("no_setter_in_callback", HandleVector(args, 2)),
|
| - Object);
|
| + Handle<Object> args[] = {name, holder};
|
| + THROW_NEW_ERROR(isolate,
|
| + NewTypeError("no_setter_in_callback",
|
| + HandleVector(args, arraysize(args))),
|
| + Object);
|
| }
|
| }
|
|
|
| @@ -755,13 +756,17 @@ MaybeHandle<Object> Object::SetElementWithReceiver(
|
| Handle<JSObject> target = Handle<JSObject>::cast(receiver);
|
| ElementsAccessor* accessor = target->GetElementsAccessor();
|
| PropertyAttributes attrs = accessor->GetAttributes(receiver, target, index);
|
| + if (attrs == ABSENT) {
|
| + return JSObject::SetElement(target, index, value, NONE, language_mode,
|
| + false);
|
| + }
|
| if ((attrs & READ_ONLY) != 0) {
|
| return WriteToReadOnlyElement(isolate, receiver, index, value,
|
| language_mode);
|
| }
|
| - PropertyAttributes new_attrs = attrs != ABSENT ? attrs : NONE;
|
| - return JSObject::SetElement(target, index, value, new_attrs, language_mode,
|
| - false);
|
| +
|
| + return JSObject::SetElement(target, index, value, attrs, language_mode, false,
|
| + DEFINE_PROPERTY);
|
| }
|
|
|
|
|
| @@ -3137,18 +3142,46 @@ MaybeHandle<Object> Object::SetProperty(LookupIterator* it,
|
| // the property did not exist yet on the global object itself, we have to
|
| // throw a reference error in strict mode.
|
| if (it->GetReceiver()->IsJSGlobalObject() && is_strict(language_mode)) {
|
| - Handle<Object> args[1] = {it->name()};
|
| - THROW_NEW_ERROR(it->isolate(),
|
| - NewReferenceError("not_defined", HandleVector(args, 1)),
|
| - Object);
|
| + Handle<Object> args[] = {it->name()};
|
| + THROW_NEW_ERROR(
|
| + it->isolate(),
|
| + NewReferenceError("not_defined", HandleVector(args, arraysize(args))),
|
| + Object);
|
| }
|
|
|
| + // super.property = value
|
| + // No property was found starting from the prototype of [[HomeObject]].
|
| if (data_store_mode == SUPER_PROPERTY) {
|
| LookupIterator own_lookup(it->GetReceiver(), it->name(),
|
| LookupIterator::OWN);
|
| + if (!own_lookup.IsFound()) {
|
| + return AddDataProperty(&own_lookup, value, NONE, language_mode,
|
| + store_mode);
|
| + }
|
| +
|
| + PropertyDetails details = own_lookup.property_details();
|
| +
|
| + // Otherwise reconfigure property with descriptor {value: value}.
|
| + if (details.IsConfigurable()) {
|
| + return JSObject::SetOwnPropertyIgnoreAttributes(
|
| + Handle<JSObject>::cast(it->GetReceiver()), it->name(), value,
|
| + details.attributes());
|
| + }
|
| +
|
| + if (details.IsReadOnly()) {
|
| + return WriteToReadOnlyProperty(&own_lookup, value, language_mode);
|
| + }
|
|
|
| - return JSObject::SetProperty(&own_lookup, value, language_mode, store_mode,
|
| - NORMAL_PROPERTY);
|
| + // Not configurable but writable.
|
| + if (details.kind() == kData) {
|
| + return SetDataProperty(&own_lookup, value);
|
| + }
|
| +
|
| + Handle<Object> args[] = {it->name()};
|
| + THROW_NEW_ERROR(it->isolate(),
|
| + NewTypeError("redefine_disallowed",
|
| + HandleVector(args, arraysize(args))),
|
| + Object);
|
| }
|
|
|
| return AddDataProperty(it, value, NONE, language_mode, store_mode);
|
| @@ -3245,7 +3278,7 @@ MaybeHandle<Object> Object::AddDataProperty(LookupIterator* it,
|
| if (it->state() != LookupIterator::TRANSITION) {
|
| if (is_sloppy(language_mode)) return value;
|
|
|
| - Handle<Object> args[1] = {it->name()};
|
| + Handle<Object> args[] = {it->name()};
|
| THROW_NEW_ERROR(it->isolate(),
|
| NewTypeError("object_not_extensible",
|
| HandleVector(args, arraysize(args))),
|
| @@ -5154,9 +5187,10 @@ MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object,
|
| if (is_strict(language_mode)) {
|
| // Deleting a non-configurable property in strict mode.
|
| Handle<Object> name = factory->NewNumberFromUint(index);
|
| - Handle<Object> args[2] = { name, object };
|
| - THROW_NEW_ERROR(isolate, NewTypeError("strict_delete_property",
|
| - HandleVector(args, 2)),
|
| + Handle<Object> args[] = {name, object};
|
| + THROW_NEW_ERROR(isolate,
|
| + NewTypeError("strict_delete_property",
|
| + HandleVector(args, arraysize(args))),
|
| Object);
|
| }
|
| return factory->false_value();
|
| @@ -5287,7 +5321,7 @@ MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object,
|
| if (!it.IsConfigurable()) {
|
| // Fail if the property is not configurable.
|
| if (is_strict(language_mode)) {
|
| - Handle<Object> args[2] = {name, object};
|
| + Handle<Object> args[] = {name, object};
|
| THROW_NEW_ERROR(it.isolate(),
|
| NewTypeError("strict_delete_property",
|
| HandleVector(args, arraysize(args))),
|
| @@ -12645,10 +12679,11 @@ MaybeHandle<Object> JSObject::SetElementWithCallback(
|
| } else {
|
| if (is_sloppy(language_mode)) return value;
|
| Handle<Object> key(isolate->factory()->NewNumberFromUint(index));
|
| - Handle<Object> args[2] = { key, holder };
|
| - THROW_NEW_ERROR(
|
| - isolate, NewTypeError("no_setter_in_callback", HandleVector(args, 2)),
|
| - Object);
|
| + Handle<Object> args[] = {key, holder};
|
| + THROW_NEW_ERROR(isolate,
|
| + NewTypeError("no_setter_in_callback",
|
| + HandleVector(args, arraysize(args))),
|
| + Object);
|
| }
|
| }
|
|
|
| @@ -12835,6 +12870,14 @@ MaybeHandle<Object> JSObject::SetDictionaryElement(
|
| if (details.type() == ACCESSOR_CONSTANT && set_mode == SET_PROPERTY) {
|
| return SetElementWithCallback(object, element, index, value, object,
|
| language_mode);
|
| + } else if (set_mode == DEFINE_PROPERTY && !details.IsConfigurable() &&
|
| + details.kind() == kAccessor) {
|
| + Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
|
| + Handle<Object> args[] = {number};
|
| + THROW_NEW_ERROR(isolate,
|
| + NewTypeError("redefine_disallowed",
|
| + HandleVector(args, arraysize(args))),
|
| + Object);
|
| } else {
|
| dictionary->UpdateMaxNumberKey(index);
|
| // If a value has not been initialized we allow writing to it even if it
|
| @@ -12848,9 +12891,10 @@ MaybeHandle<Object> JSObject::SetDictionaryElement(
|
| return isolate->factory()->undefined_value();
|
| } else {
|
| Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
|
| - Handle<Object> args[2] = { number, object };
|
| - THROW_NEW_ERROR(isolate, NewTypeError("strict_read_only_property",
|
| - HandleVector(args, 2)),
|
| + Handle<Object> args[] = {number, object};
|
| + THROW_NEW_ERROR(isolate,
|
| + NewTypeError("strict_read_only_property",
|
| + HandleVector(args, arraysize(args))),
|
| Object);
|
| }
|
| }
|
| @@ -12885,9 +12929,10 @@ MaybeHandle<Object> JSObject::SetDictionaryElement(
|
| } else {
|
| Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
|
| Handle<String> name = isolate->factory()->NumberToString(number);
|
| - Handle<Object> args[1] = { name };
|
| - THROW_NEW_ERROR(isolate, NewTypeError("object_not_extensible",
|
| - HandleVector(args, 1)),
|
| + Handle<Object> args[] = {name};
|
| + THROW_NEW_ERROR(isolate,
|
| + NewTypeError("object_not_extensible",
|
| + HandleVector(args, arraysize(args))),
|
| Object);
|
| }
|
| }
|
| @@ -13597,7 +13642,7 @@ bool JSArray::WouldChangeReadOnlyLength(Handle<JSArray> array,
|
| MaybeHandle<Object> JSArray::ReadOnlyLengthError(Handle<JSArray> array) {
|
| Isolate* isolate = array->GetIsolate();
|
| Handle<Name> length = isolate->factory()->length_string();
|
| - Handle<Object> args[2] = { length, array };
|
| + Handle<Object> args[] = {length, array};
|
| THROW_NEW_ERROR(isolate, NewTypeError("strict_read_only_property",
|
| HandleVector(args, arraysize(args))),
|
| Object);
|
|
|