Reviewers: Igor Sheludko,

Message:
PTAL

Description:
Replace set_map_and_elements by MigrateToMap-based SetMapAndElements

BUG=

Please review this at https://codereview.chromium.org/218753005/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+46, -47 lines):
  M src/api.cc
  M src/objects.h
  M src/objects.cc
  M src/objects-inl.h
  M src/runtime.cc


Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index ab25562158cb0406b002d1e98735ce955ba0776d..765938ae168aedbf112b055ff3e2f018f79cdd8c 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -6101,7 +6101,7 @@ i::Handle<i::JSTypedArray> NewTypedArray(
           static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
   i::Handle<i::Map> map =
       i::JSObject::GetElementsTransitionMap(obj, elements_kind);
-  obj->set_map_and_elements(*map, *elements);
+  i::JSObject::SetMapAndElements(obj, map, elements);
   return obj;
 }

Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index ddd321ca28906d5b0873741e639508f8b7f80cea..40fa3175ac81944c66058e080b6d1f2c77d4120e 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1698,31 +1698,27 @@ MaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate,
 }


-void JSObject::set_map_and_elements(Map* new_map,
-                                    FixedArrayBase* value,
-                                    WriteBarrierMode mode) {
-  ASSERT(value->HasValidElements());
-  if (new_map != NULL) {
-    if (mode == UPDATE_WRITE_BARRIER) {
-      set_map(new_map);
-    } else {
-      ASSERT(mode == SKIP_WRITE_BARRIER);
-      set_map_no_write_barrier(new_map);
-    }
-  }
-  ASSERT((map()->has_fast_smi_or_object_elements() ||
-          (value == GetHeap()->empty_fixed_array())) ==
-         (value->map() == GetHeap()->fixed_array_map() ||
-          value->map() == GetHeap()->fixed_cow_array_map()));
-  ASSERT((value == GetHeap()->empty_fixed_array()) ||
- (map()->has_fast_double_elements() == value->IsFixedDoubleArray()));
-  WRITE_FIELD(this, kElementsOffset, value);
-  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
+void JSObject::SetMapAndElements(Handle<JSObject> object,
+                                 Handle<Map> new_map,
+                                 Handle<FixedArrayBase> value) {
+  JSObject::MigrateToMap(object, new_map);
+  ASSERT((object->map()->has_fast_smi_or_object_elements() ||
+          (*value == object->GetHeap()->empty_fixed_array())) ==
+         (value->map() == object->GetHeap()->fixed_array_map() ||
+          value->map() == object->GetHeap()->fixed_cow_array_map()));
+  ASSERT((*value == object->GetHeap()->empty_fixed_array()) ||
+         (object->map()->has_fast_double_elements() ==
+          value->IsFixedDoubleArray()));
+  JSObject* obj = *object;
+  FixedArrayBase* val = *value;
+  WRITE_FIELD(obj, kElementsOffset, val);
+  WRITE_BARRIER(obj->GetHeap(), obj, kElementsOffset, val);
 }


 void JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
-  set_map_and_elements(NULL, value, mode);
+  WRITE_FIELD(this, kElementsOffset, value);
+  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
 }


Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 9a6b26aaf11a9afd280ccd0bfca53a0c1e54cad5..ce31bf02f39fd7056ad9d651c34f6639dd39e46d 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -4672,6 +4672,13 @@ void JSObject::TransformToFastProperties(Handle<JSObject> object,
 }


+void JSObject::ResetElements(Handle<JSObject> object) {
+  CALL_HEAP_FUNCTION_VOID(
+      object->GetIsolate(),
+      object->ResetElements());
+}
+
+
 static Handle<SeededNumberDictionary> CopyFastElementsToDictionary(
     Handle<FixedArrayBase> array,
     int length,
@@ -11174,7 +11181,7 @@ Handle<FixedArray> JSObject::SetFastElementsCapacityAndLength(
         ? GetElementsTransitionMap(object, new_elements_kind)
         : handle(object->map());
     object->ValidateElements();
-    object->set_map_and_elements(*new_map, *new_elements);
+    JSObject::SetMapAndElements(object, new_map, new_elements);

     // Transition through the allocation site as well if present.
     JSObject::UpdateAllocationSite(object, new_elements_kind);
@@ -11220,7 +11227,7 @@ void JSObject::SetFastDoubleElementsCapacityAndLength(Handle<JSObject> object,
   accessor->CopyElements(object, elems, elements_kind);

   object->ValidateElements();
-  object->set_map_and_elements(*new_map, *elems);
+  JSObject::SetMapAndElements(object, new_map, elems);

   if (FLAG_trace_elements_transitions) {
     PrintElementsTransition(stdout, object, elements_kind, old_elements,
@@ -14360,7 +14367,7 @@ Handle<Object> JSObject::PrepareElementsForSort(Handle<JSObject> object,
     dict->CopyValuesTo(*fast_elements);
     object->ValidateElements();

-    object->set_map_and_elements(*new_map, *fast_elements);
+    JSObject::SetMapAndElements(object, new_map, fast_elements);
   } else if (object->HasExternalArrayElements() ||
              object->HasFixedTypedArrayElements()) {
     // Typed arrays cannot have holes or undefined elements.
@@ -16354,7 +16361,7 @@ Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer(
   buffer->set_weak_first_view(*typed_array);
   ASSERT(typed_array->weak_next() == isolate->heap()->undefined_value());
   typed_array->set_buffer(*buffer);
-  typed_array->set_map_and_elements(*new_map, *new_elements);
+  JSObject::SetMapAndElements(typed_array, new_map, new_elements);

   return buffer;
 }
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index abfa963d2bec07814ed85e98cb2e0402255baa08..8750bd44315e19fce8bfa6336a567824fda67e75 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2189,6 +2189,10 @@ class JSObject: public JSReceiver {
   DECL_ACCESSORS(elements, FixedArrayBase)
   inline void initialize_elements();
   MUST_USE_RESULT inline MaybeObject* ResetElements();
+  static void ResetElements(Handle<JSObject> object);
+  static inline void SetMapAndElements(Handle<JSObject> object,
+                                       Handle<Map> map,
+                                       Handle<FixedArrayBase> elements);
   inline ElementsKind GetElementsKind();
   inline ElementsAccessor* GetElementsAccessor();
// Returns true if an object has elements of FAST_SMI_ELEMENTS ElementsKind.
@@ -2237,11 +2241,6 @@ class JSObject: public JSReceiver {
   bool HasDictionaryArgumentsElements();
inline SeededNumberDictionary* element_dictionary(); // Gets slow elements.

-  inline void set_map_and_elements(
-      Map* map,
-      FixedArrayBase* value,
-      WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
-
   // Requires: HasFastElements().
   static Handle<FixedArray> EnsureWritableFastElements(
       Handle<JSObject> object);
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 849de3cb1e204befd6ec0fb807cdb8dd7c07be1d..3766f02de37d336fc5548ae6f483f549ec1ef670 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -1010,7 +1010,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) {
             static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
     Handle<Map> map =
         JSObject::GetElementsTransitionMap(holder, external_elements_kind);
-    holder->set_map_and_elements(*map, *elements);
+    JSObject::SetMapAndElements(holder, map, elements);
     ASSERT(IsExternalArrayElementsKind(holder->map()->elements_kind()));
   } else {
     holder->set_buffer(Smi::FromInt(0));
@@ -1107,7 +1107,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) {
           static_cast<uint8_t*>(buffer->backing_store()));
   Handle<Map> map = JSObject::GetElementsTransitionMap(
       holder, external_elements_kind);
-  holder->set_map_and_elements(*map, *elements);
+  JSObject::SetMapAndElements(holder, map, elements);

   if (source->IsJSTypedArray()) {
     Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source));
@@ -10634,27 +10634,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) {

 // Move contents of argument 0 (an array) to argument 1 (an array)
 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
-  SealHandleScope shs(isolate);
+  HandleScope scope(isolate);
   ASSERT(args.length() == 2);
-  CONVERT_ARG_CHECKED(JSArray, from, 0);
-  CONVERT_ARG_CHECKED(JSArray, to, 1);
+  CONVERT_ARG_HANDLE_CHECKED(JSArray, from, 0);
+  CONVERT_ARG_HANDLE_CHECKED(JSArray, to, 1);
   from->ValidateElements();
   to->ValidateElements();
-  FixedArrayBase* new_elements = from->elements();
+
+  Handle<FixedArrayBase> new_elements(from->elements());
   ElementsKind from_kind = from->GetElementsKind();
-  MaybeObject* maybe_new_map;
-  maybe_new_map = to->GetElementsTransitionMap(isolate, from_kind);
-  Object* new_map;
-  if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
-  to->set_map_and_elements(Map::cast(new_map), new_elements);
+  Handle<Map> new_map = JSObject::GetElementsTransitionMap(to, from_kind);
+  JSObject::SetMapAndElements(to, new_map, new_elements);
   to->set_length(from->length());
-  Object* obj;
-  { MaybeObject* maybe_obj = from->ResetElements();
-    if (!maybe_obj->ToObject(&obj)) return maybe_obj;
-  }
+
+  JSObject::ResetElements(from);
   from->set_length(Smi::FromInt(0));
+
   to->ValidateElements();
-  return to;
+  return *to;
 }




--
--
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/d/optout.

Reply via email to