| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 3904e6794d1da4817c514c44f101ff0ea6e5778d..66ff70ff8d5516dc67de3ccd70c1c865752c897a 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -7233,6 +7233,70 @@ bool JSObject::ReferencesObject(Object* obj) {
|
| }
|
|
|
|
|
| +Maybe<bool> JSReceiver::SetIntegrityLevel(Handle<JSReceiver> receiver,
|
| + IntegrityLevel level,
|
| + ShouldThrow should_throw) {
|
| + DCHECK(level == SEALED || level == FROZEN);
|
| +
|
| + if (receiver->IsJSObject()) {
|
| + Handle<JSObject> object = Handle<JSObject>::cast(receiver);
|
| + if (!object->HasSloppyArgumentsElements() &&
|
| + !object->map()->is_observed() &&
|
| + (!object->map()->is_strong() || level == SEALED)) { // Fast path.
|
| + if (level == SEALED) {
|
| + return JSObject::PreventExtensionsWithTransition<SEALED>(object,
|
| + should_throw);
|
| + } else {
|
| + return JSObject::PreventExtensionsWithTransition<FROZEN>(object,
|
| + should_throw);
|
| + }
|
| + }
|
| + }
|
| +
|
| + Isolate* isolate = receiver->GetIsolate();
|
| +
|
| + MAYBE_RETURN(JSReceiver::PreventExtensions(receiver, should_throw),
|
| + Nothing<bool>());
|
| +
|
| + Handle<FixedArray> keys;
|
| + ASSIGN_RETURN_ON_EXCEPTION_VALUE(
|
| + isolate, keys, JSReceiver::OwnPropertyKeys(receiver), Nothing<bool>());
|
| +
|
| + PropertyDescriptor no_conf;
|
| + no_conf.set_configurable(false);
|
| +
|
| + PropertyDescriptor no_conf_no_write;
|
| + no_conf_no_write.set_configurable(false);
|
| + no_conf_no_write.set_writable(false);
|
| +
|
| + if (level == SEALED) {
|
| + for (int i = 0; i < keys->length(); ++i) {
|
| + Handle<Object> key(keys->get(i), isolate);
|
| + DefineOwnProperty(isolate, receiver, key, &no_conf, THROW_ON_ERROR);
|
| + if (isolate->has_pending_exception()) return Nothing<bool>();
|
| + }
|
| + return Just(true);
|
| + }
|
| +
|
| + for (int i = 0; i < keys->length(); ++i) {
|
| + Handle<Object> key(keys->get(i), isolate);
|
| + PropertyDescriptor current_desc;
|
| + bool owned = JSReceiver::GetOwnPropertyDescriptor(isolate, receiver, key,
|
| + ¤t_desc);
|
| + if (isolate->has_pending_exception()) return Nothing<bool>();
|
| + if (owned) {
|
| + PropertyDescriptor desc =
|
| + PropertyDescriptor::IsAccessorDescriptor(¤t_desc)
|
| + ? no_conf
|
| + : no_conf_no_write;
|
| + DefineOwnProperty(isolate, receiver, key, &desc, THROW_ON_ERROR);
|
| + if (isolate->has_pending_exception()) return Nothing<bool>();
|
| + }
|
| + }
|
| + return Just(true);
|
| +}
|
| +
|
| +
|
| Maybe<bool> JSReceiver::PreventExtensions(Handle<JSReceiver> object,
|
| ShouldThrow should_throw) {
|
| if (object->IsJSProxy()) {
|
| @@ -7555,20 +7619,6 @@ Maybe<bool> JSObject::PreventExtensionsWithTransition(
|
| }
|
|
|
|
|
| -MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) {
|
| - MAYBE_RETURN_NULL(
|
| - PreventExtensionsWithTransition<FROZEN>(object, THROW_ON_ERROR));
|
| - return object;
|
| -}
|
| -
|
| -
|
| -MaybeHandle<Object> JSObject::Seal(Handle<JSObject> object) {
|
| - MAYBE_RETURN_NULL(
|
| - PreventExtensionsWithTransition<SEALED>(object, THROW_ON_ERROR));
|
| - return object;
|
| -}
|
| -
|
| -
|
| void JSObject::SetObserved(Handle<JSObject> object) {
|
| DCHECK(!object->IsJSGlobalProxy());
|
| DCHECK(!object->IsJSGlobalObject());
|
| @@ -8416,11 +8466,8 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
|
| bool extensible_target = maybe_extensible.FromJust();
|
| // 10. Let targetKeys be ? target.[[OwnPropertyKeys]]().
|
| Handle<FixedArray> target_keys;
|
| - ASSIGN_RETURN_ON_EXCEPTION_VALUE(
|
| - isolate, target_keys,
|
| - JSReceiver::GetKeys(target, JSReceiver::OWN_ONLY, ALL_PROPERTIES,
|
| - CONVERT_TO_STRING),
|
| - false);
|
| + ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, target_keys,
|
| + JSReceiver::OwnPropertyKeys(target), false);
|
| // 11. (Assert)
|
| // 12. Let targetConfigurableKeys be an empty List.
|
| // To save memory, we're re-using target_keys and will modify it in-place.
|
|
|