Reviewers: danno,

Message:
PTAL.

Description:
Remove unnecessary elements type check when allocating array in runtime.


BUG=
TEST=--smi-only-arrays should be perf-neutral to allocating big arrays in a
tight loop.


Please review this at http://codereview.chromium.org/9356002/

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

Affected files:
  M src/builtins.cc
  M src/heap.cc


Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index 1badca7bc574f4c76225c02784ba0ef0cf6f8915..e48c676b4f97a39fe45a8b0663e1cd862dfabd17 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -218,12 +218,12 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
     if (obj->IsSmi()) {
       int len = Smi::cast(obj)->value();
       if (len >= 0 && len < JSObject::kInitialMaxFastElementArray) {
-        Object* obj;
+        Object* fixed_array;
         { MaybeObject* maybe_obj = heap->AllocateFixedArrayWithHoles(len);
-          if (!maybe_obj->ToObject(&obj)) return maybe_obj;
+          if (!maybe_obj->ToObject(&fixed_array)) return maybe_obj;
         }
-        MaybeObject* maybe_obj = array->SetContent(FixedArray::cast(obj));
-        if (maybe_obj->IsFailure()) return maybe_obj;
+        array->set_elements(FixedArray::cast(fixed_array));
+        array->set_length(Smi::cast(obj));
         return array;
       }
     }
Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index ff31361866c54fdb004747e94652a56c5eafd473..cd8a03e3a6ddf90af03129d78a17e060f6385927 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -4361,10 +4361,10 @@ MaybeObject* Heap::AllocateJSArray(
   Context* global_context = isolate()->context()->global_context();
   JSFunction* array_function = global_context->array_function();
   Map* map = array_function->initial_map();
-  if (elements_kind == FAST_ELEMENTS || !FLAG_smi_only_arrays) {
-    map = Map::cast(global_context->object_js_array_map());
-  } else if (elements_kind == FAST_DOUBLE_ELEMENTS) {
+  if (elements_kind == FAST_DOUBLE_ELEMENTS) {
     map = Map::cast(global_context->double_js_array_map());
+  } else if (elements_kind == FAST_ELEMENTS || !FLAG_smi_only_arrays) {
+    map = Map::cast(global_context->object_js_array_map());
   } else {
     ASSERT(elements_kind == FAST_SMI_ONLY_ELEMENTS);
     ASSERT(map == global_context->smi_js_array_map());


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to