Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index e6c9b66ce3ec1b330de327b3cd1315800295ea57..73a25ff9fd8a3dfa0dc08988ac14318e0c48b27b 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -701,44 +701,48 @@ MaybeObject* JSObject::SetNormalizedProperty(Name* name, |
| } |
| -MaybeObject* JSObject::DeleteNormalizedProperty(Name* name, DeleteMode mode) { |
| - ASSERT(!HasFastProperties()); |
| - NameDictionary* dictionary = property_dictionary(); |
| - int entry = dictionary->FindEntry(name); |
| +// TODO(mstarzinger): Temporary wrapper until target is handlified. |
| +Handle<NameDictionary> NameDictionaryShrink(Handle<NameDictionary> dict, |
| + Handle<Name> name) { |
| + CALL_HEAP_FUNCTION(dict->GetIsolate(), dict->Shrink(*name), NameDictionary); |
| +} |
| + |
| + |
| +Handle<Object> JSObject::DeleteNormalizedProperty(Handle<JSObject> object, |
| + Handle<Name> name, |
| + DeleteMode mode) { |
| + ASSERT(!object->HasFastProperties()); |
| + Isolate* isolate = object->GetIsolate(); |
| + Handle<NameDictionary> dictionary = handle(object->property_dictionary()); |
|
Toon Verwaest
2013/07/12 12:37:34
What about just Handle<NameDictionary> dictionary(
Michael Starzinger
2013/07/16 11:37:41
Done.
|
| + int entry = dictionary->FindEntry(*name); |
| if (entry != NameDictionary::kNotFound) { |
| // If we have a global object set the cell to the hole. |
| - if (IsGlobalObject()) { |
| + if (object->IsGlobalObject()) { |
| PropertyDetails details = dictionary->DetailsAt(entry); |
| if (details.IsDontDelete()) { |
| - if (mode != FORCE_DELETION) return GetHeap()->false_value(); |
| + if (mode != FORCE_DELETION) return isolate->factory()->false_value(); |
| // When forced to delete global properties, we have to make a |
| // map change to invalidate any ICs that think they can load |
| // from the DontDelete cell without checking if it contains |
| // the hole value. |
| - Map* new_map; |
| - MaybeObject* maybe_new_map = map()->CopyDropDescriptors(); |
| - if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| - |
| + Handle<Map> new_map = Map::CopyDropDescriptors(handle(object->map())); |
| ASSERT(new_map->is_dictionary_map()); |
| - set_map(new_map); |
| + object->set_map(*new_map); |
| } |
| PropertyCell* cell = PropertyCell::cast(dictionary->ValueAt(entry)); |
| - cell->set_value(cell->GetHeap()->the_hole_value()); |
| + cell->set_value(isolate->heap()->the_hole_value()); |
| dictionary->DetailsAtPut(entry, details.AsDeleted()); |
| } else { |
| - Object* deleted = dictionary->DeleteProperty(entry, mode); |
| - if (deleted == GetHeap()->true_value()) { |
| - FixedArray* new_properties = NULL; |
| - MaybeObject* maybe_properties = dictionary->Shrink(name); |
| - if (!maybe_properties->To(&new_properties)) { |
| - return maybe_properties; |
| - } |
| - set_properties(new_properties); |
| + Handle<Object> deleted(dictionary->DeleteProperty(entry, mode), isolate); |
| + if (*deleted == isolate->heap()->true_value()) { |
| + Handle<NameDictionary> new_properties = |
| + NameDictionaryShrink(dictionary, name); |
| + object->set_properties(*new_properties); |
| } |
| return deleted; |
| } |
| } |
| - return GetHeap()->true_value(); |
| + return isolate->factory()->true_value(); |
| } |
| @@ -3510,33 +3514,30 @@ MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyViaPrototypesWithHandler( |
| } |
| -MUST_USE_RESULT MaybeObject* JSProxy::DeletePropertyWithHandler( |
| - Name* name_raw, DeleteMode mode) { |
| - Isolate* isolate = GetIsolate(); |
| - HandleScope scope(isolate); |
| - Handle<JSProxy> receiver(this); |
| - Handle<Object> name(name_raw, isolate); |
| +Handle<Object> JSProxy::DeletePropertyWithHandler( |
| + Handle<JSProxy> object, Handle<Name> name, DeleteMode mode) { |
| + Isolate* isolate = object->GetIsolate(); |
| // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| - if (name->IsSymbol()) return isolate->heap()->false_value(); |
| + if (name->IsSymbol()) return isolate->factory()->false_value(); |
| Handle<Object> args[] = { name }; |
| - Handle<Object> result = CallTrap( |
| - "delete", Handle<Object>(), ARRAY_SIZE(args), args); |
| - if (isolate->has_pending_exception()) return Failure::Exception(); |
| + Handle<Object> result = object->CallTrap( |
| + "delete", Handle<Object>(), ARRAY_SIZE(args), args); |
| + if (isolate->has_pending_exception()) return Handle<Object>(); |
| bool result_bool = result->BooleanValue(); |
| if (mode == STRICT_DELETION && !result_bool) { |
| - Handle<Object> handler(receiver->handler(), isolate); |
| + Handle<Object> handler(object->handler(), isolate); |
| Handle<String> trap_name = isolate->factory()->InternalizeOneByteString( |
| STATIC_ASCII_VECTOR("delete")); |
| Handle<Object> args[] = { handler, trap_name }; |
| Handle<Object> error = isolate->factory()->NewTypeError( |
| "handler_failed", HandleVector(args, ARRAY_SIZE(args))); |
| isolate->Throw(*error); |
| - return Failure::Exception(); |
| + return Handle<Object>(); |
| } |
| - return isolate->heap()->ToBoolean(result_bool); |
| + return isolate->factory()->ToBoolean(result_bool); |
| } |
| @@ -3545,8 +3546,9 @@ MUST_USE_RESULT MaybeObject* JSProxy::DeleteElementWithHandler( |
| DeleteMode mode) { |
| Isolate* isolate = GetIsolate(); |
| HandleScope scope(isolate); |
| + Handle<JSProxy> object(this, isolate); |
| Handle<String> name = isolate->factory()->Uint32ToString(index); |
| - return JSProxy::DeletePropertyWithHandler(*name, mode); |
| + return *JSProxy::DeletePropertyWithHandler(object, name, mode); |
|
Toon Verwaest
2013/07/12 12:37:34
It seems a bit scary to call from non-handlified c
Michael Starzinger
2013/07/16 11:37:41
Done.
|
| } |
| @@ -4947,52 +4949,52 @@ MaybeObject* JSObject::SetHiddenPropertiesHashTable(Object* value) { |
| } |
| -MaybeObject* JSObject::DeletePropertyPostInterceptor(Name* name, |
| - DeleteMode mode) { |
| +Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object, |
| + Handle<Name> name, |
| + DeleteMode mode) { |
| // Check local property, ignore interceptor. |
| - LookupResult result(GetIsolate()); |
| - LocalLookupRealNamedProperty(name, &result); |
| - if (!result.IsFound()) return GetHeap()->true_value(); |
| + Isolate* isolate = object->GetIsolate(); |
| + LookupResult result(isolate); |
| + object->LocalLookupRealNamedProperty(*name, &result); |
| + if (!result.IsFound()) return isolate->factory()->true_value(); |
| // Normalize object if needed. |
| - Object* obj; |
| - { MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); |
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| - } |
| + NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
| - return DeleteNormalizedProperty(name, mode); |
| + return DeleteNormalizedProperty(object, name, mode); |
| } |
| -MaybeObject* JSObject::DeletePropertyWithInterceptor(Name* name) { |
| +Handle<Object> JSObject::DeletePropertyWithInterceptor(Handle<JSObject> object, |
| + Handle<Name> name) { |
| + Isolate* isolate = object->GetIsolate(); |
| + |
| // TODO(rossberg): Support symbols in the API. |
| - if (name->IsSymbol()) return GetHeap()->false_value(); |
| + if (name->IsSymbol()) return isolate->factory()->false_value(); |
| - Isolate* isolate = GetIsolate(); |
| - HandleScope scope(isolate); |
| - Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
| - Handle<String> name_handle(String::cast(name)); |
| - Handle<JSObject> this_handle(this); |
| + Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| if (!interceptor->deleter()->IsUndefined()) { |
| v8::NamedPropertyDeleter deleter = |
| v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); |
| LOG(isolate, |
| - ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); |
| - PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
| + ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); |
| + PropertyCallbackArguments args( |
| + isolate, interceptor->data(), *object, *object); |
| v8::Handle<v8::Boolean> result = |
| - args.Call(deleter, v8::Utils::ToLocal(name_handle)); |
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| + args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); |
| + 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->DeletePropertyPostInterceptor(*name_handle, NORMAL_DELETION); |
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| - return raw_result; |
| + Handle<Object> result = |
| + DeletePropertyPostInterceptor(object, name, NORMAL_DELETION); |
| + RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| + return result; |
| } |
| @@ -5102,91 +5104,76 @@ MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
| } |
| -Handle<Object> JSObject::DeleteProperty(Handle<JSObject> obj, |
| - Handle<Name> prop) { |
| - CALL_HEAP_FUNCTION(obj->GetIsolate(), |
| - obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), |
| - Object); |
| -} |
| - |
| - |
| -MaybeObject* JSObject::DeleteProperty(Name* name, DeleteMode mode) { |
| - Isolate* isolate = GetIsolate(); |
| +Handle<Object> JSObject::DeleteProperty(Handle<JSObject> object, |
| + Handle<Name> name, |
| + DeleteMode mode) { |
| + Isolate* isolate = object->GetIsolate(); |
| // ECMA-262, 3rd, 8.6.2.5 |
| ASSERT(name->IsName()); |
| // Check access rights if needed. |
| - if (IsAccessCheckNeeded() && |
| - !isolate->MayNamedAccess(this, name, v8::ACCESS_DELETE)) { |
| - isolate->ReportFailedAccessCheck(this, v8::ACCESS_DELETE); |
| - return isolate->heap()->false_value(); |
| + if (object->IsAccessCheckNeeded() && |
| + !isolate->MayNamedAccess(*object, *name, v8::ACCESS_DELETE)) { |
| + isolate->ReportFailedAccessCheck(*object, v8::ACCESS_DELETE); |
| + return isolate->factory()->false_value(); |
| } |
| - if (IsJSGlobalProxy()) { |
| - Object* proto = GetPrototype(); |
| - if (proto->IsNull()) return isolate->heap()->false_value(); |
| + if (object->IsJSGlobalProxy()) { |
| + Object* proto = object->GetPrototype(); |
| + if (proto->IsNull()) return isolate->factory()->false_value(); |
| ASSERT(proto->IsJSGlobalObject()); |
| - return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); |
| + return JSGlobalObject::DeleteProperty( |
| + handle(JSGlobalObject::cast(proto)), name, mode); |
| } |
| uint32_t index = 0; |
| if (name->AsArrayIndex(&index)) { |
| - return DeleteElement(index, mode); |
| + CALL_HEAP_FUNCTION(isolate, object->DeleteElement(index, mode), Object); |
|
Toon Verwaest
2013/07/12 12:37:34
What about just calling into the handlified versio
Michael Starzinger
2013/07/16 11:37:41
Done.
|
| } |
| LookupResult lookup(isolate); |
| - LocalLookup(name, &lookup, true); |
| - if (!lookup.IsFound()) return isolate->heap()->true_value(); |
| + object->LocalLookup(*name, &lookup, true); |
| + if (!lookup.IsFound()) return isolate->factory()->true_value(); |
| // Ignore attributes if forcing a deletion. |
| if (lookup.IsDontDelete() && mode != FORCE_DELETION) { |
| if (mode == STRICT_DELETION) { |
| // Deleting a non-configurable property in strict mode. |
| - HandleScope scope(isolate); |
| - Handle<Object> args[2] = { Handle<Object>(name, isolate), |
| - Handle<Object>(this, isolate) }; |
| - return isolate->Throw(*isolate->factory()->NewTypeError( |
| - "strict_delete_property", HandleVector(args, 2))); |
| + Handle<Object> args[2] = { name, object }; |
| + Handle<Object> error = isolate->factory()->NewTypeError( |
| + "strict_delete_property", HandleVector(args, ARRAY_SIZE(args))); |
| + isolate->Throw(*error); |
| + return Handle<Object>(); |
| } |
| - return isolate->heap()->false_value(); |
| + return isolate->factory()->false_value(); |
| } |
| - // From this point on everything needs to be handlified. |
| - HandleScope scope(isolate); |
| - Handle<JSObject> self(this); |
| - Handle<Name> hname(name); |
| - |
| Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| - bool is_observed = FLAG_harmony_observation && self->map()->is_observed(); |
| + bool is_observed = FLAG_harmony_observation && object->map()->is_observed(); |
| if (is_observed && lookup.IsDataProperty()) { |
| - old_value = Object::GetProperty(self, hname); |
| + old_value = Object::GetProperty(object, name); |
| } |
| - MaybeObject* result; |
| + Handle<Object> result; |
| // Check for interceptor. |
| if (lookup.IsInterceptor()) { |
| // Skip interceptor if forcing a deletion. |
| if (mode == FORCE_DELETION) { |
| - result = self->DeletePropertyPostInterceptor(*hname, mode); |
| + result = DeletePropertyPostInterceptor(object, name, mode); |
| } else { |
| - result = self->DeletePropertyWithInterceptor(*hname); |
| + result = DeletePropertyWithInterceptor(object, name); |
| } |
| } else { |
| // Normalize object if needed. |
| - Object* obj; |
| - result = self->NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); |
| - if (!result->To(&obj)) return result; |
| + NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
| // Make sure the properties are normalized before removing the entry. |
| - result = self->DeleteNormalizedProperty(*hname, mode); |
| + result = DeleteNormalizedProperty(object, name, mode); |
| } |
| - Handle<Object> hresult; |
| - if (!result->ToHandle(&hresult, isolate)) return result; |
| - |
| - if (is_observed && !self->HasLocalProperty(*hname)) { |
| - EnqueueChangeRecord(self, "deleted", hname, old_value); |
| + if (is_observed && !object->HasLocalProperty(*name)) { |
| + EnqueueChangeRecord(object, "deleted", name, old_value); |
| } |
| - return *hresult; |
| + return result; |
| } |
| @@ -5198,11 +5185,14 @@ MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { |
| } |
| -MaybeObject* JSReceiver::DeleteProperty(Name* name, DeleteMode mode) { |
| - if (IsJSProxy()) { |
| - return JSProxy::cast(this)->DeletePropertyWithHandler(name, mode); |
| +Handle<Object> JSReceiver::DeleteProperty(Handle<JSReceiver> object, |
| + Handle<Name> name, |
| + DeleteMode mode) { |
| + if (object->IsJSProxy()) { |
| + return JSProxy::DeletePropertyWithHandler( |
| + Handle<JSProxy>::cast(object), name, mode); |
| } |
| - return JSObject::cast(this)->DeleteProperty(name, mode); |
| + return JSObject::DeleteProperty(Handle<JSObject>::cast(object), name, mode); |
| } |
| @@ -6446,6 +6436,11 @@ MaybeObject* Map::CopyNormalized(PropertyNormalizationMode mode, |
| } |
| +Handle<Map> Map::CopyDropDescriptors(Handle<Map> map) { |
| + CALL_HEAP_FUNCTION(map->GetIsolate(), map->CopyDropDescriptors(), Map); |
| +} |
| + |
| + |
| MaybeObject* Map::CopyDropDescriptors() { |
| Map* result; |
| MaybeObject* maybe_result = RawCopy(instance_size()); |