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:
parent
9a62b1dab7
commit
4d64bf9737
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user