| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index b66ffe56391bc86eddaac7dbdf4dddd02ba9164b..32eb21d94a35daa04603c4eb0d1a63ce2abccb7e 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -6722,13 +6722,34 @@ bool JSObject::ReferencesObject(Object* obj) {
|
| }
|
|
|
|
|
| -Maybe<bool> JSObject::PreventExtensionsInternal(Handle<JSObject> object) {
|
| +#define RETURN_FAILURE(isolate, should_throw, call) \
|
| + do { \
|
| + if ((should_throw) == DONT_THROW) { \
|
| + return Just(false); \
|
| + } else { \
|
| + isolate->Throw(*isolate->factory()->call); \
|
| + return Nothing<bool>(); \
|
| + } \
|
| + } while (false)
|
| +
|
| +
|
| +Maybe<bool> JSReceiver::PreventExtensions(Handle<JSReceiver> object,
|
| + ShouldThrow should_throw) {
|
| + if (!object->IsJSObject()) return Just(false);
|
| + // TODO(neis): Deal with proxies.
|
| + return JSObject::PreventExtensions(Handle<JSObject>::cast(object),
|
| + should_throw);
|
| +}
|
| +
|
| +
|
| +Maybe<bool> JSObject::PreventExtensions(Handle<JSObject> object,
|
| + ShouldThrow should_throw) {
|
| Isolate* isolate = object->GetIsolate();
|
|
|
| if (!object->map()->is_extensible()) return Just(true);
|
|
|
| if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) {
|
| - return PreventExtensionsWithTransition<NONE>(object);
|
| + return PreventExtensionsWithTransition<NONE>(object, should_throw);
|
| }
|
|
|
| if (object->IsAccessCheckNeeded() &&
|
| @@ -6736,15 +6757,16 @@ Maybe<bool> JSObject::PreventExtensionsInternal(Handle<JSObject> object) {
|
| isolate->ReportFailedAccessCheck(object);
|
| RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>());
|
| UNREACHABLE();
|
| - return Just(false);
|
| + RETURN_FAILURE(isolate, should_throw,
|
| + NewTypeError(MessageTemplate::kNoAccess));
|
| }
|
|
|
| if (object->IsJSGlobalProxy()) {
|
| PrototypeIterator iter(isolate, object);
|
| if (iter.IsAtEnd()) return Just(true);
|
| DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject());
|
| - return PreventExtensionsInternal(
|
| - PrototypeIterator::GetCurrent<JSObject>(iter));
|
| + return PreventExtensions(PrototypeIterator::GetCurrent<JSObject>(iter),
|
| + should_throw);
|
| }
|
|
|
| // It's not possible to seal objects with external array elements
|
| @@ -6781,21 +6803,6 @@ Maybe<bool> JSObject::PreventExtensionsInternal(Handle<JSObject> object) {
|
| }
|
|
|
|
|
| -static MaybeHandle<Object> ReturnObjectOrThrowTypeError(
|
| - Handle<JSObject> object, Maybe<bool> maybe, MessageTemplate::Template msg) {
|
| - if (!maybe.IsJust()) return MaybeHandle<Object>();
|
| - if (maybe.FromJust()) return object;
|
| - Isolate* isolate = object->GetIsolate();
|
| - THROW_NEW_ERROR(isolate, NewTypeError(msg), Object);
|
| -}
|
| -
|
| -
|
| -MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) {
|
| - return ReturnObjectOrThrowTypeError(object, PreventExtensionsInternal(object),
|
| - MessageTemplate::kCannotPreventExt);
|
| -}
|
| -
|
| -
|
| bool JSObject::IsExtensible(Handle<JSObject> object) {
|
| Isolate* isolate = object->GetIsolate();
|
| if (object->IsAccessCheckNeeded() &&
|
| @@ -6837,7 +6844,8 @@ static void ApplyAttributesToDictionary(Dictionary* dictionary,
|
|
|
|
|
| template <PropertyAttributes attrs>
|
| -Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) {
|
| +Maybe<bool> JSObject::PreventExtensionsWithTransition(
|
| + Handle<JSObject> object, ShouldThrow should_throw) {
|
| STATIC_ASSERT(attrs == NONE || attrs == SEALED || attrs == FROZEN);
|
|
|
| // Sealing/freezing sloppy arguments should be handled elsewhere.
|
| @@ -6850,6 +6858,8 @@ Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) {
|
| isolate->ReportFailedAccessCheck(object);
|
| RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>());
|
| UNREACHABLE();
|
| + RETURN_FAILURE(isolate, should_throw,
|
| + NewTypeError(MessageTemplate::kNoAccess));
|
| }
|
|
|
| if (object->IsJSGlobalProxy()) {
|
| @@ -6857,7 +6867,7 @@ Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) {
|
| if (iter.IsAtEnd()) return Just(true);
|
| DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject());
|
| return PreventExtensionsWithTransition<attrs>(
|
| - PrototypeIterator::GetCurrent<JSObject>(iter));
|
| + PrototypeIterator::GetCurrent<JSObject>(iter), should_throw);
|
| }
|
|
|
| // It's not possible to seal or freeze objects with external array elements
|
| @@ -6944,16 +6954,18 @@ Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) {
|
|
|
|
|
| MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) {
|
| - return ReturnObjectOrThrowTypeError(
|
| - object, PreventExtensionsWithTransition<FROZEN>(object),
|
| - MessageTemplate::kCannotPreventExt);
|
| + return PreventExtensionsWithTransition<FROZEN>(object, THROW_ON_ERROR)
|
| + .IsJust()
|
| + ? object
|
| + : MaybeHandle<Object>();
|
| }
|
|
|
|
|
| MaybeHandle<Object> JSObject::Seal(Handle<JSObject> object) {
|
| - return ReturnObjectOrThrowTypeError(
|
| - object, PreventExtensionsWithTransition<SEALED>(object),
|
| - MessageTemplate::kCannotPreventExt);
|
| + return PreventExtensionsWithTransition<SEALED>(object, THROW_ON_ERROR)
|
| + .IsJust()
|
| + ? object
|
| + : MaybeHandle<Object>();
|
| }
|
|
|
|
|
|
|