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
This commit is contained in:
mstarzinger@chromium.org 2013-09-23 11:57:34 +00:00
parent 9a62b1dab7
commit 4d64bf9737
4 changed files with 40 additions and 46 deletions

View File

@ -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);

View File

@ -3708,10 +3708,39 @@ MUST_USE_RESULT Handle<Object> JSProxy::CallTrap(const char* name,
}
// TODO(mstarzinger): Temporary wrapper until handlified.
static Handle<Map> MapAsElementsKind(Handle<Map> map, ElementsKind kind) {
CALL_HEAP_FUNCTION(map->GetIsolate(), map->AsElementsKind(kind), Map);
}
void JSObject::AllocateStorageForMap(Handle<JSObject> object, Handle<Map> 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<FixedArray> 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<Object> JSObject::TransitionElementsKind(Handle<JSObject> object,
ElementsKind to_kind) {
CALL_HEAP_FUNCTION(object->GetIsolate(),
object->TransitionElementsKind(to_kind),
Object);
void JSObject::TransitionElementsKind(Handle<JSObject> object,
ElementsKind to_kind) {
CALL_HEAP_FUNCTION_VOID(object->GetIsolate(),
object->TransitionElementsKind(to_kind));
}

View File

@ -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<JSObject> object, Handle<Map> map);
inline MUST_USE_RESULT MaybeObject* AllocateStorageForMap(Map* map);
static void MigrateInstance(Handle<JSObject> instance);
@ -2465,8 +2464,8 @@ class JSObject: public JSReceiver {
MUST_USE_RESULT MaybeObject* GetElementsTransitionMapSlow(
ElementsKind elements_kind);
static Handle<Object> TransitionElementsKind(Handle<JSObject> object,
ElementsKind to_kind);
static void TransitionElementsKind(Handle<JSObject> object,
ElementsKind to_kind);
MUST_USE_RESULT MaybeObject* TransitionElementsKind(ElementsKind to_kind);
MUST_USE_RESULT MaybeObject* UpdateAllocationSite(ElementsKind to_kind);

View File

@ -348,10 +348,8 @@ MaybeObject* TransitionElements(Handle<Object> object,
ElementsKind from_kind =
Handle<JSObject>::cast(object)->map()->elements_kind();
if (Map::IsValidElementsTransition(from_kind, to_kind)) {
Handle<Object> result = JSObject::TransitionElementsKind(
Handle<JSObject>::cast(object), to_kind);
if (result.is_null()) return isolate->ThrowIllegalOperation();
return *result;
JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), to_kind);
return *object;
}
return isolate->ThrowIllegalOperation();
}