Handlify Map::CopyForObserved
R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/34023002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17327 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
3ec2f19560
commit
146eb9e0ee
@ -2434,6 +2434,16 @@ void JSObject::MigrateToMap(Handle<JSObject> object, Handle<Map> new_map) {
|
||||
}
|
||||
|
||||
|
||||
Handle<TransitionArray> Map::AddTransition(Handle<Map> map,
|
||||
Handle<Name> key,
|
||||
Handle<Map> target,
|
||||
SimpleTransitionFlag flag) {
|
||||
CALL_HEAP_FUNCTION(map->GetIsolate(),
|
||||
map->AddTransition(*key, *target, flag),
|
||||
TransitionArray);
|
||||
}
|
||||
|
||||
|
||||
void JSObject::GeneralizeFieldRepresentation(Handle<JSObject> object,
|
||||
int modify_index,
|
||||
Representation new_representation,
|
||||
@ -6930,41 +6940,33 @@ MaybeObject* Map::CopyAsElementsKind(ElementsKind kind, TransitionFlag flag) {
|
||||
|
||||
|
||||
Handle<Map> Map::CopyForObserved(Handle<Map> map) {
|
||||
CALL_HEAP_FUNCTION(map->GetIsolate(),
|
||||
map->CopyForObserved(),
|
||||
Map);
|
||||
}
|
||||
ASSERT(!map->is_observed());
|
||||
|
||||
|
||||
MaybeObject* Map::CopyForObserved() {
|
||||
ASSERT(!is_observed());
|
||||
Isolate* isolate = map->GetIsolate();
|
||||
|
||||
// In case the map owned its own descriptors, share the descriptors and
|
||||
// transfer ownership to the new map.
|
||||
Map* new_map;
|
||||
MaybeObject* maybe_new_map;
|
||||
if (owns_descriptors()) {
|
||||
maybe_new_map = CopyDropDescriptors();
|
||||
Handle<Map> new_map;
|
||||
if (map->owns_descriptors()) {
|
||||
new_map = Map::CopyDropDescriptors(map);
|
||||
} else {
|
||||
maybe_new_map = Copy();
|
||||
new_map = Map::Copy(map);
|
||||
}
|
||||
if (!maybe_new_map->To(&new_map)) return maybe_new_map;
|
||||
|
||||
TransitionArray* transitions;
|
||||
MaybeObject* maybe_transitions = AddTransition(GetHeap()->observed_symbol(),
|
||||
new_map,
|
||||
FULL_TRANSITION);
|
||||
if (!maybe_transitions->To(&transitions)) return maybe_transitions;
|
||||
set_transitions(transitions);
|
||||
Handle<TransitionArray> transitions =
|
||||
Map::AddTransition(map, isolate->factory()->observed_symbol(), new_map,
|
||||
FULL_TRANSITION);
|
||||
|
||||
map->set_transitions(*transitions);
|
||||
|
||||
new_map->set_is_observed(true);
|
||||
|
||||
if (owns_descriptors()) {
|
||||
new_map->InitializeDescriptors(instance_descriptors());
|
||||
set_owns_descriptors(false);
|
||||
if (map->owns_descriptors()) {
|
||||
new_map->InitializeDescriptors(map->instance_descriptors());
|
||||
map->set_owns_descriptors(false);
|
||||
}
|
||||
|
||||
new_map->SetBackPointer(this);
|
||||
new_map->SetBackPointer(*map);
|
||||
return new_map;
|
||||
}
|
||||
|
||||
|
@ -5749,6 +5749,12 @@ class Map: public HeapObject {
|
||||
Map* transitioned_map);
|
||||
inline void SetTransition(int transition_index, Map* target);
|
||||
inline Map* GetTransition(int transition_index);
|
||||
|
||||
static Handle<TransitionArray> AddTransition(Handle<Map> map,
|
||||
Handle<Name> key,
|
||||
Handle<Map> target,
|
||||
SimpleTransitionFlag flag);
|
||||
|
||||
MUST_USE_RESULT inline MaybeObject* AddTransition(Name* key,
|
||||
Map* target,
|
||||
SimpleTransitionFlag flag);
|
||||
@ -5986,7 +5992,6 @@ class Map: public HeapObject {
|
||||
TransitionFlag flag);
|
||||
|
||||
static Handle<Map> CopyForObserved(Handle<Map> map);
|
||||
MUST_USE_RESULT MaybeObject* CopyForObserved();
|
||||
|
||||
static Handle<Map> CopyNormalized(Handle<Map> map,
|
||||
PropertyNormalizationMode mode,
|
||||
|
Loading…
Reference in New Issue
Block a user