Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index e137e3f606b3ab3ceea293aa24151fbe3252197a..82e37b8a139c4ea3fc23e11d000818557bb56d0c 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -5961,33 +5961,35 @@ bool JSObject::ReferencesObject(Object* obj) { |
} |
-MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
- if (!object->map()->is_extensible()) return object; |
+Maybe<bool> JSObject::PreventExtensionsInternal(Handle<JSObject> object) { |
+ Isolate* isolate = object->GetIsolate(); |
+ |
+ if (!object->map()->is_extensible()) return Just(true); |
if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) { |
return PreventExtensionsWithTransition<NONE>(object); |
} |
- Isolate* isolate = object->GetIsolate(); |
- |
if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { |
isolate->ReportFailedAccessCheck(object); |
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
- return isolate->factory()->false_value(); |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
+ UNREACHABLE(); |
+ return Just(false); |
} |
if (object->IsJSGlobalProxy()) { |
PrototypeIterator iter(isolate, object); |
- if (iter.IsAtEnd()) return object; |
+ if (iter.IsAtEnd()) return Just(true); |
DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
- return PreventExtensions(PrototypeIterator::GetCurrent<JSObject>(iter)); |
+ return PreventExtensionsInternal( |
+ PrototypeIterator::GetCurrent<JSObject>(iter)); |
} |
// It's not possible to seal objects with external array elements |
if (object->HasFixedTypedArrayElements()) { |
- THROW_NEW_ERROR( |
- isolate, NewTypeError(MessageTemplate::kCannotPreventExtExternalArray), |
- Object); |
+ isolate->Throw(*isolate->factory()->NewTypeError( |
+ MessageTemplate::kCannotPreventExtExternalArray)); |
+ return Nothing<bool>(); |
} |
// If there are fast elements we normalize. |
@@ -6007,13 +6009,28 @@ MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
DCHECK(!object->map()->is_extensible()); |
if (object->map()->is_observed()) { |
- RETURN_ON_EXCEPTION( |
+ RETURN_ON_EXCEPTION_VALUE( |
isolate, |
EnqueueChangeRecord(object, "preventExtensions", Handle<Name>(), |
isolate->factory()->the_hole_value()), |
- Object); |
+ Nothing<bool>()); |
} |
- return object; |
+ return Just(true); |
+} |
+ |
+ |
+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); |
} |
@@ -6057,8 +6074,7 @@ static void ApplyAttributesToDictionary(Dictionary* dictionary, |
template <PropertyAttributes attrs> |
-MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( |
- Handle<JSObject> object) { |
+Maybe<bool> JSObject::PreventExtensionsWithTransition(Handle<JSObject> object) { |
STATIC_ASSERT(attrs == NONE || attrs == SEALED || attrs == FROZEN); |
// Sealing/freezing sloppy arguments should be handled elsewhere. |
@@ -6068,13 +6084,13 @@ MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( |
Isolate* isolate = object->GetIsolate(); |
if (object->IsAccessCheckNeeded() && !isolate->MayAccess(object)) { |
isolate->ReportFailedAccessCheck(object); |
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
- return isolate->factory()->false_value(); |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
+ UNREACHABLE(); |
} |
if (object->IsJSGlobalProxy()) { |
PrototypeIterator iter(isolate, object); |
- if (iter.IsAtEnd()) return object; |
+ if (iter.IsAtEnd()) return Just(true); |
DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
return PreventExtensionsWithTransition<attrs>( |
PrototypeIterator::GetCurrent<JSObject>(iter)); |
@@ -6082,9 +6098,9 @@ MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( |
// It's not possible to seal or freeze objects with external array elements |
if (object->HasFixedTypedArrayElements()) { |
- THROW_NEW_ERROR( |
- isolate, NewTypeError(MessageTemplate::kCannotPreventExtExternalArray), |
- Object); |
+ isolate->Throw(*isolate->factory()->NewTypeError( |
+ MessageTemplate::kCannotPreventExtExternalArray)); |
+ return Nothing<bool>(); |
} |
Handle<SeededNumberDictionary> new_element_dictionary; |
@@ -6159,17 +6175,21 @@ MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( |
} |
} |
- return object; |
+ return Just(true); |
} |
MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) { |
- return PreventExtensionsWithTransition<FROZEN>(object); |
+ return ReturnObjectOrThrowTypeError( |
+ object, PreventExtensionsWithTransition<FROZEN>(object), |
+ MessageTemplate::kCannotPreventExt); |
} |
MaybeHandle<Object> JSObject::Seal(Handle<JSObject> object) { |
- return PreventExtensionsWithTransition<SEALED>(object); |
+ return ReturnObjectOrThrowTypeError( |
+ object, PreventExtensionsWithTransition<SEALED>(object), |
+ MessageTemplate::kCannotPreventExt); |
} |