Bug 928917 - Use initDenseElements instead of NewDenseCopiedArray to speed up slice on arrays with holes. r=jandem

This commit is contained in:
masaya iseki 2013-11-27 12:29:40 +01:00
parent 2994ac5b84
commit dc2992372c
2 changed files with 43 additions and 12 deletions

View File

@ -0,0 +1,32 @@
function check_specified_range_zero_base_slice() {
var arr = new Array(32)
arr[0]=0, arr[1]=1, arr[7]=7;
var res = arr.slice(0,10);
assertEq(arr[0],res[0]);
assertEq(arr[1],res[1]);
assertEq(arr[7],res[7]);
assertEq(res.length,10);
}
function check_specified_range_slice() {
var arr = new Array(32)
arr[0]=0, arr[6]=1, arr[8]=3;
var res = arr.slice(5,9);
assertEq(arr[6],res[1]);
assertEq(arr[8],res[3]);
assertEq(res.length,4);
}
function check_all_range_slice() {
var arr = new Array(32)
arr[0]=0, arr[6]=1, arr[8]=3;
var res = arr.slice();
assertEq(arr[0],res[0]);
assertEq(arr[6],res[6]);
assertEq(arr[8],res[8]);
assertEq(res.length,32);
}
check_all_range_slice();
check_specified_range_slice();
check_specified_range_zero_base_slice();

View File

@ -2725,23 +2725,22 @@ array_slice(JSContext *cx, unsigned argc, Value *vp)
begin = end; begin = end;
Rooted<ArrayObject*> narr(cx); Rooted<ArrayObject*> narr(cx);
if (obj->is<ArrayObject>() && end <= obj->getDenseInitializedLength() &&
!ObjectMayHaveExtraIndexedProperties(obj))
{
narr = NewDenseCopiedArray(cx, end - begin, obj, begin);
if (!narr)
return false;
TryReuseArrayType(obj, narr);
args.rval().setObject(*narr);
return true;
}
narr = NewDenseAllocatedArray(cx, end - begin); narr = NewDenseAllocatedArray(cx, end - begin);
if (!narr) if (!narr)
return false; return false;
TryReuseArrayType(obj, narr); TryReuseArrayType(obj, narr);
if (obj->is<ArrayObject>() && !ObjectMayHaveExtraIndexedProperties(obj)) {
if (obj->getDenseInitializedLength() > begin) {
uint32_t numSourceElements = obj->getDenseInitializedLength() - begin;
uint32_t initLength = Min(numSourceElements, end - begin);
narr->setDenseInitializedLength(initLength);
narr->initDenseElements(0, &obj->getDenseElement(begin), initLength);
}
args.rval().setObject(*narr);
return true;
}
RootedValue value(cx); RootedValue value(cx);
for (slot = begin; slot < end; slot++) { for (slot = begin; slot < end; slot++) {
if (!JS_CHECK_OPERATION_LIMIT(cx) || if (!JS_CHECK_OPERATION_LIMIT(cx) ||