Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 094b1b03976ba2354b33d3333a90f05e8b2044c7..abc038a7adf056e1461ab22ad6d4a01837f7b1d9 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -5030,113 +5030,110 @@ Handle<Object> JSObject::DeletePropertyWithInterceptor(Handle<JSObject> object, |
} |
-MaybeObject* JSObject::DeleteElementWithInterceptor(uint32_t index) { |
- Isolate* isolate = GetIsolate(); |
- Heap* heap = isolate->heap(); |
- HandleScope scope(isolate); |
+// TODO(mstarzinger): Temporary wrapper until handlified. |
+static Handle<Object> AccessorDelete(Handle<JSObject> object, |
+ uint32_t index, |
+ JSObject::DeleteMode mode) { |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), |
+ object->GetElementsAccessor()->Delete(*object, |
+ index, |
+ mode), |
+ Object); |
+} |
+ |
+ |
+Handle<Object> JSObject::DeleteElementWithInterceptor(Handle<JSObject> object, |
+ uint32_t index) { |
+ Isolate* isolate = object->GetIsolate(); |
+ Factory* factory = isolate->factory(); |
// Make sure that the top context does not change when doing |
// callbacks or interceptor calls. |
AssertNoContextChange ncc; |
- Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
- if (interceptor->deleter()->IsUndefined()) return heap->false_value(); |
+ Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
+ if (interceptor->deleter()->IsUndefined()) return factory->false_value(); |
v8::IndexedPropertyDeleterCallback deleter = |
v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); |
- Handle<JSObject> this_handle(this); |
LOG(isolate, |
- ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); |
- PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
+ ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); |
+ PropertyCallbackArguments args( |
+ isolate, interceptor->data(), *object, *object); |
v8::Handle<v8::Boolean> result = args.Call(deleter, index); |
- RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
+ RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
if (!result.IsEmpty()) { |
ASSERT(result->IsBoolean()); |
Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
result_internal->VerifyApiCallResultType(); |
- return *result_internal; |
+ // Rebox CustomArguments::kReturnValueOffset before returning. |
+ return handle(*result_internal, isolate); |
} |
- MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( |
- *this_handle, |
- index, |
- NORMAL_DELETION); |
- RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
- return raw_result; |
+ Handle<Object> delete_result = AccessorDelete(object, index, NORMAL_DELETION); |
+ RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ return delete_result; |
} |
-Handle<Object> JSObject::DeleteElement(Handle<JSObject> obj, |
+Handle<Object> JSObject::DeleteElement(Handle<JSObject> object, |
uint32_t index, |
DeleteMode mode) { |
- CALL_HEAP_FUNCTION(obj->GetIsolate(), |
- obj->DeleteElement(index, mode), |
- Object); |
-} |
- |
+ Isolate* isolate = object->GetIsolate(); |
+ Factory* factory = isolate->factory(); |
-MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
- Isolate* isolate = GetIsolate(); |
// Check access rights if needed. |
- if (IsAccessCheckNeeded() && |
- !isolate->MayIndexedAccess(this, index, v8::ACCESS_DELETE)) { |
- isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
- RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
- return isolate->heap()->false_value(); |
+ if (object->IsAccessCheckNeeded() && |
+ !isolate->MayIndexedAccess(*object, index, v8::ACCESS_DELETE)) { |
+ isolate->ReportFailedAccessCheck(*object, v8::ACCESS_DELETE); |
+ RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ return factory->false_value(); |
} |
- if (IsStringObjectWithCharacterAt(index)) { |
+ if (object->IsStringObjectWithCharacterAt(index)) { |
if (mode == STRICT_DELETION) { |
// Deleting a non-configurable property in strict mode. |
- HandleScope scope(isolate); |
- Handle<Object> holder(this, isolate); |
- Handle<Object> name = isolate->factory()->NewNumberFromUint(index); |
- Handle<Object> args[2] = { name, holder }; |
+ Handle<Object> name = factory->NewNumberFromUint(index); |
+ Handle<Object> args[2] = { name, object }; |
Handle<Object> error = |
- isolate->factory()->NewTypeError("strict_delete_property", |
- HandleVector(args, 2)); |
- return isolate->Throw(*error); |
+ factory->NewTypeError("strict_delete_property", |
+ HandleVector(args, 2)); |
+ isolate->Throw(*error); |
+ return Handle<Object>(); |
} |
- return isolate->heap()->false_value(); |
+ return factory->false_value(); |
} |
- if (IsJSGlobalProxy()) { |
- Object* proto = GetPrototype(); |
- if (proto->IsNull()) return isolate->heap()->false_value(); |
+ if (object->IsJSGlobalProxy()) { |
+ Handle<Object> proto(object->GetPrototype(), isolate); |
+ if (proto->IsNull()) return factory->false_value(); |
ASSERT(proto->IsJSGlobalObject()); |
- return JSGlobalObject::cast(proto)->DeleteElement(index, mode); |
+ return DeleteElement(Handle<JSObject>::cast(proto), index, mode); |
} |
- // From this point on everything needs to be handlified. |
- HandleScope scope(isolate); |
- Handle<JSObject> self(this); |
- |
Handle<Object> old_value; |
bool should_enqueue_change_record = false; |
- if (FLAG_harmony_observation && self->map()->is_observed()) { |
- should_enqueue_change_record = self->HasLocalElement(index); |
+ if (FLAG_harmony_observation && object->map()->is_observed()) { |
+ should_enqueue_change_record = object->HasLocalElement(index); |
if (should_enqueue_change_record) { |
- old_value = self->GetLocalElementAccessorPair(index) != NULL |
- ? Handle<Object>::cast(isolate->factory()->the_hole_value()) |
- : Object::GetElement(self, index); |
+ old_value = object->GetLocalElementAccessorPair(index) != NULL |
+ ? Handle<Object>::cast(factory->the_hole_value()) |
+ : Object::GetElement(object, index); |
} |
} |
- MaybeObject* result; |
// Skip interceptor if forcing deletion. |
- if (self->HasIndexedInterceptor() && mode != FORCE_DELETION) { |
- result = self->DeleteElementWithInterceptor(index); |
+ Handle<Object> result; |
+ if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { |
+ result = DeleteElementWithInterceptor(object, index); |
} else { |
- result = self->GetElementsAccessor()->Delete(*self, index, mode); |
+ result = AccessorDelete(object, index, mode); |
} |
- Handle<Object> hresult; |
- if (!result->ToHandle(&hresult, isolate)) return result; |
- |
- if (should_enqueue_change_record && !self->HasLocalElement(index)) { |
- Handle<String> name = isolate->factory()->Uint32ToString(index); |
- EnqueueChangeRecord(self, "deleted", name, old_value); |
+ if (should_enqueue_change_record && !object->HasLocalElement(index)) { |
+ Handle<String> name = factory->Uint32ToString(index); |
+ EnqueueChangeRecord(object, "deleted", name, old_value); |
} |
- return *hresult; |
+ return result; |
} |