From 4d64bf9737a797b93e26de968c4e8cb0a1e61ea7 Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Mon, 23 Sep 2013 11:57:34 +0000 Subject: [PATCH] Handlify JSObject::AllocateStorageForMap method. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/23464089 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16883 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects-inl.h | 31 ------------------------------- src/objects.cc | 44 ++++++++++++++++++++++++++++++++++++-------- src/objects.h | 5 ++--- src/runtime.cc | 6 ++---- 4 files changed, 40 insertions(+), 46 deletions(-) diff --git a/src/objects-inl.h b/src/objects-inl.h index 4ee4372..dcce931 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1542,37 +1542,6 @@ MaybeObject* JSObject::ResetElements() { } -MaybeObject* JSObject::AllocateStorageForMap(Map* map) { - ASSERT(this->map()->inobject_properties() == map->inobject_properties()); - ElementsKind obj_kind = this->map()->elements_kind(); - ElementsKind map_kind = map->elements_kind(); - if (map_kind != obj_kind) { - ElementsKind to_kind = map_kind; - if (IsMoreGeneralElementsKindTransition(map_kind, obj_kind) || - IsDictionaryElementsKind(obj_kind)) { - to_kind = obj_kind; - } - MaybeObject* maybe_obj = - IsDictionaryElementsKind(to_kind) ? NormalizeElements() - : TransitionElementsKind(to_kind); - if (maybe_obj->IsFailure()) return maybe_obj; - MaybeObject* maybe_map = map->AsElementsKind(to_kind); - if (!maybe_map->To(&map)) return maybe_map; - } - int total_size = - map->NumberOfOwnDescriptors() + map->unused_property_fields(); - int out_of_object = total_size - map->inobject_properties(); - if (out_of_object != properties()->length()) { - FixedArray* new_properties; - MaybeObject* maybe_properties = properties()->CopySize(out_of_object); - if (!maybe_properties->To(&new_properties)) return maybe_properties; - set_properties(new_properties); - } - set_map(map); - return this; -} - - MaybeObject* JSObject::TryMigrateInstance() { Map* new_map = map()->CurrentMapForDeprecated(); if (new_map == NULL) return Smi::FromInt(0); diff --git a/src/objects.cc b/src/objects.cc index 66d847a..67f26f0 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -3708,10 +3708,39 @@ MUST_USE_RESULT Handle JSProxy::CallTrap(const char* name, } +// TODO(mstarzinger): Temporary wrapper until handlified. +static Handle MapAsElementsKind(Handle map, ElementsKind kind) { + CALL_HEAP_FUNCTION(map->GetIsolate(), map->AsElementsKind(kind), Map); +} + + void JSObject::AllocateStorageForMap(Handle object, Handle map) { - CALL_HEAP_FUNCTION_VOID( - object->GetIsolate(), - object->AllocateStorageForMap(*map)); + ASSERT(object->map()->inobject_properties() == map->inobject_properties()); + ElementsKind obj_kind = object->map()->elements_kind(); + ElementsKind map_kind = map->elements_kind(); + if (map_kind != obj_kind) { + ElementsKind to_kind = map_kind; + if (IsMoreGeneralElementsKindTransition(map_kind, obj_kind) || + IsDictionaryElementsKind(obj_kind)) { + to_kind = obj_kind; + } + if (IsDictionaryElementsKind(to_kind)) { + NormalizeElements(object); + } else { + TransitionElementsKind(object, to_kind); + } + map = MapAsElementsKind(map, to_kind); + } + int total_size = + map->NumberOfOwnDescriptors() + map->unused_property_fields(); + int out_of_object = total_size - map->inobject_properties(); + if (out_of_object != object->properties()->length()) { + Isolate* isolate = object->GetIsolate(); + Handle new_properties = isolate->factory()->CopySizeFixedArray( + handle(object->properties()), out_of_object); + object->set_properties(*new_properties); + } + object->set_map(*map); } @@ -12408,11 +12437,10 @@ MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, } -Handle JSObject::TransitionElementsKind(Handle object, - ElementsKind to_kind) { - CALL_HEAP_FUNCTION(object->GetIsolate(), - object->TransitionElementsKind(to_kind), - Object); +void JSObject::TransitionElementsKind(Handle object, + ElementsKind to_kind) { + CALL_HEAP_FUNCTION_VOID(object->GetIsolate(), + object->TransitionElementsKind(to_kind)); } diff --git a/src/objects.h b/src/objects.h index faddc0a..c894915 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2172,7 +2172,6 @@ class JSObject: public JSReceiver { // Extend the receiver with a single fast property appeared first in the // passed map. This also extends the property backing store if necessary. static void AllocateStorageForMap(Handle object, Handle map); - inline MUST_USE_RESULT MaybeObject* AllocateStorageForMap(Map* map); static void MigrateInstance(Handle instance); @@ -2465,8 +2464,8 @@ class JSObject: public JSReceiver { MUST_USE_RESULT MaybeObject* GetElementsTransitionMapSlow( ElementsKind elements_kind); - static Handle TransitionElementsKind(Handle object, - ElementsKind to_kind); + static void TransitionElementsKind(Handle object, + ElementsKind to_kind); MUST_USE_RESULT MaybeObject* TransitionElementsKind(ElementsKind to_kind); MUST_USE_RESULT MaybeObject* UpdateAllocationSite(ElementsKind to_kind); diff --git a/src/runtime.cc b/src/runtime.cc index 1926eda..dbc8f11 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -348,10 +348,8 @@ MaybeObject* TransitionElements(Handle object, ElementsKind from_kind = Handle::cast(object)->map()->elements_kind(); if (Map::IsValidElementsTransition(from_kind, to_kind)) { - Handle result = JSObject::TransitionElementsKind( - Handle::cast(object), to_kind); - if (result.is_null()) return isolate->ThrowIllegalOperation(); - return *result; + JSObject::TransitionElementsKind(Handle::cast(object), to_kind); + return *object; } return isolate->ThrowIllegalOperation(); } -- 2.7.4