| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 2a5e86b916b4b01e1f585ac9a5e14b3e616dee5d..ca1d133e3fd886aae4615376f261670636a2aa43 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -5861,13 +5861,14 @@ class JSObjectWalkVisitor {
|
| copying_(copying),
|
| hints_(hints) {}
|
|
|
| - Handle<JSObject> StructureWalk(Handle<JSObject> object);
|
| + MUST_USE_RESULT MaybeHandle<JSObject> StructureWalk(Handle<JSObject> object);
|
|
|
| protected:
|
| - inline Handle<JSObject> VisitElementOrProperty(Handle<JSObject> object,
|
| - Handle<JSObject> value) {
|
| + MUST_USE_RESULT inline MaybeHandle<JSObject> VisitElementOrProperty(
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> value) {
|
| Handle<AllocationSite> current_site = site_context()->EnterNewScope();
|
| - Handle<JSObject> copy_of_value = StructureWalk(value);
|
| + MaybeHandle<JSObject> copy_of_value = StructureWalk(value);
|
| site_context()->ExitScope(current_site, value);
|
| return copy_of_value;
|
| }
|
| @@ -5885,7 +5886,7 @@ class JSObjectWalkVisitor {
|
|
|
|
|
| template <class ContextObject>
|
| -Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| +MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| Handle<JSObject> object) {
|
| Isolate* isolate = this->isolate();
|
| bool copying = this->copying();
|
| @@ -5896,7 +5897,7 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
|
|
| if (check.HasOverflowed()) {
|
| isolate->StackOverflow();
|
| - return Handle<JSObject>::null();
|
| + return MaybeHandle<JSObject>();
|
| }
|
| }
|
|
|
| @@ -5937,8 +5938,10 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| int index = descriptors->GetFieldIndex(i);
|
| Handle<Object> value(object->RawFastPropertyAt(index), isolate);
|
| if (value->IsJSObject()) {
|
| - value = VisitElementOrProperty(copy, Handle<JSObject>::cast(value));
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, value, Handle<JSObject>());
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, value,
|
| + VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
|
| + JSObject);
|
| } else {
|
| Representation representation = details.representation();
|
| value = Object::NewStorageFor(isolate, value, representation);
|
| @@ -5963,9 +5966,11 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| Handle<Object> value =
|
| Object::GetProperty(copy, key_string).ToHandleChecked();
|
| if (value->IsJSObject()) {
|
| - Handle<JSObject> result = VisitElementOrProperty(
|
| - copy, Handle<JSObject>::cast(value));
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<JSObject>());
|
| + Handle<JSObject> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, result,
|
| + VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
|
| + JSObject);
|
| if (copying) {
|
| // Creating object copy for literals. No strict mode needed.
|
| JSObject::SetProperty(
|
| @@ -5997,9 +6002,11 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| value->IsTheHole() ||
|
| (IsFastObjectElementsKind(copy->GetElementsKind())));
|
| if (value->IsJSObject()) {
|
| - Handle<JSObject> result = VisitElementOrProperty(
|
| - copy, Handle<JSObject>::cast(value));
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<JSObject>());
|
| + Handle<JSObject> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, result,
|
| + VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
|
| + JSObject);
|
| if (copying) {
|
| elements->set(i, *result);
|
| }
|
| @@ -6017,9 +6024,11 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| if (element_dictionary->IsKey(k)) {
|
| Handle<Object> value(element_dictionary->ValueAt(i), isolate);
|
| if (value->IsJSObject()) {
|
| - Handle<JSObject> result = VisitElementOrProperty(
|
| - copy, Handle<JSObject>::cast(value));
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<JSObject>());
|
| + Handle<JSObject> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, result,
|
| + VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
|
| + JSObject);
|
| if (copying) {
|
| element_dictionary->ValueAtPut(i, *result);
|
| }
|
| @@ -6051,23 +6060,26 @@ Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
|
| }
|
|
|
|
|
| -Handle<JSObject> JSObject::DeepWalk(
|
| +MaybeHandle<JSObject> JSObject::DeepWalk(
|
| Handle<JSObject> object,
|
| AllocationSiteCreationContext* site_context) {
|
| JSObjectWalkVisitor<AllocationSiteCreationContext> v(site_context, false,
|
| kNoHints);
|
| - Handle<JSObject> result = v.StructureWalk(object);
|
| - ASSERT(result.is_null() || result.is_identical_to(object));
|
| + MaybeHandle<JSObject> result = v.StructureWalk(object);
|
| + Handle<JSObject> for_assert;
|
| + ASSERT(!result.ToHandle(&for_assert) || for_assert.is_identical_to(object));
|
| return result;
|
| }
|
|
|
|
|
| -Handle<JSObject> JSObject::DeepCopy(Handle<JSObject> object,
|
| - AllocationSiteUsageContext* site_context,
|
| - DeepCopyHints hints) {
|
| +MaybeHandle<JSObject> JSObject::DeepCopy(
|
| + Handle<JSObject> object,
|
| + AllocationSiteUsageContext* site_context,
|
| + DeepCopyHints hints) {
|
| JSObjectWalkVisitor<AllocationSiteUsageContext> v(site_context, true, hints);
|
| - Handle<JSObject> copy = v.StructureWalk(object);
|
| - ASSERT(!copy.is_identical_to(object));
|
| + MaybeHandle<JSObject> copy = v.StructureWalk(object);
|
| + Handle<JSObject> for_assert;
|
| + ASSERT(!copy.ToHandle(&for_assert) || !for_assert.is_identical_to(object));
|
| return copy;
|
| }
|
|
|
| @@ -12397,9 +12409,9 @@ Handle<Map> Map::TransitionToPrototype(Handle<Map> map,
|
| }
|
|
|
|
|
| -Handle<Object> JSObject::SetPrototype(Handle<JSObject> object,
|
| - Handle<Object> value,
|
| - bool skip_hidden_prototypes) {
|
| +MaybeHandle<Object> JSObject::SetPrototype(Handle<JSObject> object,
|
| + Handle<Object> value,
|
| + bool skip_hidden_prototypes) {
|
| #ifdef DEBUG
|
| int size = object->Size();
|
| #endif
|
| @@ -12422,8 +12434,7 @@ Handle<Object> JSObject::SetPrototype(Handle<JSObject> object,
|
| Handle<Object> args[] = { object };
|
| Handle<Object> error = isolate->factory()->NewTypeError(
|
| "non_extensible_proto", HandleVector(args, ARRAY_SIZE(args)));
|
| - isolate->Throw(*error);
|
| - return Handle<Object>();
|
| + return isolate->Throw<Object>(error);
|
| }
|
|
|
| // Before we can set the prototype we need to be sure
|
| @@ -12437,8 +12448,7 @@ Handle<Object> JSObject::SetPrototype(Handle<JSObject> object,
|
| // Cycle detected.
|
| Handle<Object> error = isolate->factory()->NewError(
|
| "cyclic_proto", HandleVector<Object>(NULL, 0));
|
| - isolate->Throw(*error);
|
| - return Handle<Object>();
|
| + return isolate->Throw<Object>(error);
|
| }
|
| }
|
|
|
|
|