From: yangguo@chromium.org Date: Wed, 15 Feb 2012 12:13:55 +0000 (+0000) Subject: Remove unnecessary elements type check when allocating array in runtime. X-Git-Tag: upstream/4.7.83~17358 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b21ada9a984c0b59c9b4fcea5fd1356fd361a330;p=platform%2Fupstream%2Fv8.git 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. Review URL: https://chromiumcodereview.appspot.com/9356002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10711 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/builtins.cc b/src/builtins.cc index 1badca7..0d5b2b2 100644 --- a/src/builtins.cc +++ b/src/builtins.cc @@ -218,12 +218,13 @@ 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; + // We do not use SetContent to skip the unnecessary elements type check. + array->set_elements(FixedArray::cast(fixed_array)); + array->set_length(Smi::cast(obj)); return array; } } diff --git a/src/heap.cc b/src/heap.cc index ff31361..cd8a03e 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());