Reviewers: Michael Starzinger,
Description:
Handlify Map::CopyForObserved
Please review this at https://codereview.chromium.org/34023002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+32, -23 lines):
M src/objects.h
M src/objects.cc
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
aec412c5d8bc846dd0218defc99a09400ae75fc0..fdfa20aaae76712d3ec4bfd10661c680e3ec760c
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -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,
@@ -6915,41 +6925,34 @@ 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, handle(isolate->heap()->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;
}
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
165261b043dacde2dfb7d99ab850e6de79ae5f74..e90c4ab3310fd5a0eec54fd889072f005b3de710
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -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);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.