Renamed ConvertDescriptorToFieldAndMapTransition to ConvertTransitionToMapTransition...
authorverwaest@chromium.org <verwaest@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 12 Jul 2012 16:36:10 +0000 (16:36 +0000)
committerverwaest@chromium.org <verwaest@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 12 Jul 2012 16:36:10 +0000 (16:36 +0000)
Review URL: https://chromiumcodereview.appspot.com/10694155

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12071 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/objects-inl.h
src/objects.cc
src/objects.h
src/property.h

index 4a7f8a4..23fb213 100644 (file)
@@ -3539,6 +3539,10 @@ MaybeObject* Map::AddTransition(String* key, Object* value) {
   return TransitionArray::NewWith(key, value);
 }
 
+void Map::SetTransition(int transition_index, Object* value) {
+  transitions()->SetValue(transition_index, value);
+}
+
 
 // If the map is using the empty descriptor array, install a new empty
 // descriptor array that will contain an elements transition.
index 67bb67a..de41ce1 100644 (file)
@@ -1779,12 +1779,12 @@ MaybeObject* JSObject::ReplaceSlowProperty(String* name,
 }
 
 
-MaybeObject* JSObject::ConvertDescriptorToFieldAndMapTransition(
+MaybeObject* JSObject::ConvertTransitionToMapTransition(
+    int transition_index,
     String* name,
     Object* new_value,
     PropertyAttributes attributes) {
   Map* old_map = map();
-  FixedArray* old_properties = properties();
   Object* result;
 
   MaybeObject* maybe_result =
@@ -1797,23 +1797,10 @@ MaybeObject* JSObject::ConvertDescriptorToFieldAndMapTransition(
   // with the map of "new Object()" cannot have transitions in the first place.
   ASSERT(map() != GetIsolate()->empty_object_map());
 
-  TransitionArray* new_transitions;
-  MaybeObject* maybe_new_transitions = old_map->AddTransition(name, map());
-  if (!maybe_new_transitions->To(&new_transitions)) {
-    // Undo changes and return failure.
-    set_map(old_map);
-    set_properties(old_properties);
-    return maybe_new_transitions;
-  }
-
-  MaybeObject* transition_added = old_map->set_transitions(new_transitions);
-  if (transition_added->IsFailure()) {
-    // Undo changes and return failure.
-    set_map(old_map);
-    set_properties(old_properties);
-    return transition_added;
-  }
-
+  // TODO(verwaest): From here on we lose existing map transitions, causing
+  // invalid back pointers. This will change once we can store multiple
+  // transitions with the same key.
+  old_map->SetTransition(transition_index, map());
   map()->SetBackPointer(old_map);
   return result;
 }
@@ -2906,9 +2893,8 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* result,
       }
       // Otherwise, replace with a map transition to a new map with a FIELD,
       // even if the value is a constant function.
-      return self->ConvertDescriptorToFieldAndMapTransition(*name,
-                                                            *value,
-                                                            attributes);
+      return ConvertTransitionToMapTransition(
+          result->GetTransitionIndex(), *name, *value, attributes);
     }
     case HANDLER:
     case NONEXISTENT:
@@ -3023,7 +3009,8 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
 
       // Was transition to CONSTANT_FUNCTION. Replace with a map transition to a
       // new map with a FIELD, even if the value is a function.
-      return ConvertDescriptorToFieldAndMapTransition(name, value, attributes);
+      return ConvertTransitionToMapTransition(
+          result.GetTransitionIndex(), name, value, attributes);
     }
     case HANDLER:
     case NONEXISTENT:
index 412820b..01bd0c1 100644 (file)
@@ -1938,19 +1938,15 @@ class JSObject: public JSReceiver {
 
   MUST_USE_RESULT MaybeObject* TransitionElementsKind(ElementsKind to_kind);
 
-  // Converts a descriptor of any other type to a real field,
-  // backed by the properties array.  Descriptors of visible
-  // types, such as CONSTANT_FUNCTION, keep their enumeration order.
-  // Converts the descriptor on the original object's map to a
-  // map transition, and the the new field is on the object's new map.
-  MUST_USE_RESULT MaybeObject* ConvertDescriptorToFieldAndMapTransition(
+  // Replaces an existing transition with a transition to a map with a FIELD.
+  MUST_USE_RESULT MaybeObject* ConvertTransitionToMapTransition(
+      int transition_index,
       String* name,
       Object* new_value,
       PropertyAttributes attributes);
 
-  // Converts a descriptor of any other type to a real field,
-  // backed by the properties array.  Descriptors of visible
-  // types, such as CONSTANT_FUNCTION, keep their enumeration order.
+  // Converts a descriptor of any other type to a real field, backed by the
+  // properties array.
   MUST_USE_RESULT MaybeObject* ConvertDescriptorToField(
       String* name,
       Object* new_value,
@@ -4819,8 +4815,8 @@ class Map: public HeapObject {
   MUST_USE_RESULT inline MaybeObject* set_elements_transition_map(
       Map* transitioned_map);
   inline TransitionArray* transitions();
-  MUST_USE_RESULT inline MaybeObject* AddTransition(String* key,
-                                                    Object* value);
+  inline void SetTransition(int index, Object* value);
+  MUST_USE_RESULT inline MaybeObject* AddTransition(String* key, Object* value);
   MUST_USE_RESULT inline MaybeObject* set_transitions(
       TransitionArray* transitions);
   inline void ClearTransitions(Heap* heap,
index 4ff0b2b..6ec826c 100644 (file)
@@ -330,6 +330,11 @@ class LookupResult BASE_EMBEDDED {
     return Map::cast(map->transitions()->GetValue(number_));
   }
 
+  int GetTransitionIndex() {
+    ASSERT(IsTransition());
+    return number_;
+  }
+
   int GetFieldIndex() {
     ASSERT(lookup_type_ == DESCRIPTOR_TYPE);
     ASSERT(IsField());