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() {
|
MaybeObject* JSObject::TryMigrateInstance() {
|
||||||
Map* new_map = map()->CurrentMapForDeprecated();
|
Map* new_map = map()->CurrentMapForDeprecated();
|
||||||
if (new_map == NULL) return Smi::FromInt(0);
|
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) {
|
void JSObject::AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map) {
|
||||||
CALL_HEAP_FUNCTION_VOID(
|
ASSERT(object->map()->inobject_properties() == map->inobject_properties());
|
||||||
object->GetIsolate(),
|
ElementsKind obj_kind = object->map()->elements_kind();
|
||||||
object->AllocateStorageForMap(*map));
|
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,
|
void JSObject::TransitionElementsKind(Handle<JSObject> object,
|
||||||
ElementsKind to_kind) {
|
ElementsKind to_kind) {
|
||||||
CALL_HEAP_FUNCTION(object->GetIsolate(),
|
CALL_HEAP_FUNCTION_VOID(object->GetIsolate(),
|
||||||
object->TransitionElementsKind(to_kind),
|
object->TransitionElementsKind(to_kind));
|
||||||
Object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2172,7 +2172,6 @@ class JSObject: public JSReceiver {
|
|||||||
// Extend the receiver with a single fast property appeared first in the
|
// Extend the receiver with a single fast property appeared first in the
|
||||||
// passed map. This also extends the property backing store if necessary.
|
// passed map. This also extends the property backing store if necessary.
|
||||||
static void AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map);
|
static void AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map);
|
||||||
inline MUST_USE_RESULT MaybeObject* AllocateStorageForMap(Map* map);
|
|
||||||
|
|
||||||
static void MigrateInstance(Handle<JSObject> instance);
|
static void MigrateInstance(Handle<JSObject> instance);
|
||||||
|
|
||||||
@ -2465,8 +2464,8 @@ class JSObject: public JSReceiver {
|
|||||||
MUST_USE_RESULT MaybeObject* GetElementsTransitionMapSlow(
|
MUST_USE_RESULT MaybeObject* GetElementsTransitionMapSlow(
|
||||||
ElementsKind elements_kind);
|
ElementsKind elements_kind);
|
||||||
|
|
||||||
static Handle<Object> TransitionElementsKind(Handle<JSObject> object,
|
static void TransitionElementsKind(Handle<JSObject> object,
|
||||||
ElementsKind to_kind);
|
ElementsKind to_kind);
|
||||||
|
|
||||||
MUST_USE_RESULT MaybeObject* TransitionElementsKind(ElementsKind to_kind);
|
MUST_USE_RESULT MaybeObject* TransitionElementsKind(ElementsKind to_kind);
|
||||||
MUST_USE_RESULT MaybeObject* UpdateAllocationSite(ElementsKind to_kind);
|
MUST_USE_RESULT MaybeObject* UpdateAllocationSite(ElementsKind to_kind);
|
||||||
|
@ -348,10 +348,8 @@ MaybeObject* TransitionElements(Handle<Object> object,
|
|||||||
ElementsKind from_kind =
|
ElementsKind from_kind =
|
||||||
Handle<JSObject>::cast(object)->map()->elements_kind();
|
Handle<JSObject>::cast(object)->map()->elements_kind();
|
||||||
if (Map::IsValidElementsTransition(from_kind, to_kind)) {
|
if (Map::IsValidElementsTransition(from_kind, to_kind)) {
|
||||||
Handle<Object> result = JSObject::TransitionElementsKind(
|
JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), to_kind);
|
||||||
Handle<JSObject>::cast(object), to_kind);
|
return *object;
|
||||||
if (result.is_null()) return isolate->ThrowIllegalOperation();
|
|
||||||
return *result;
|
|
||||||
}
|
}
|
||||||
return isolate->ThrowIllegalOperation();
|
return isolate->ThrowIllegalOperation();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user