Bug 664528 - [].sort misbehaves when the array being sorted starts with at least one hole and otherwise contains only holes and |undefined| as its elements. r=jandem

This commit is contained in:
Jeff Walden 2013-02-13 15:47:25 -08:00
parent 08aae12ab6
commit 3265481090
2 changed files with 39 additions and 2 deletions

View File

@ -1582,10 +1582,15 @@ js::array_sort(JSContext *cx, unsigned argc, Value *vp)
allInts = allInts && v.isInt32();
}
/*
* If the array only contains holes, we're done. But if it contains
* undefs, those must be sorted to the front of the array.
*/
n = vec.length();
if (n == 0) {
if (n == 0 && undefs == 0) {
args.rval().setObject(*obj);
return true; /* The array has only holes and undefs. */
return true;
}
/* Here len == n + undefs + number_of_holes. */

View File

@ -0,0 +1,32 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
//-----------------------------------------------------------------------------
var BUGNUMBER = 664528;
var summary =
"Sorting an array containing only holes and |undefined| should move all " +
"|undefined| to the start of the array";
print(BUGNUMBER + ": " + summary);
/**************
* BEGIN TEST *
**************/
var a = [, , , undefined];
a.sort();
assertEq(a.hasOwnProperty(0), true);
assertEq(a[0], undefined);
assertEq(a.hasOwnProperty(1), false);
assertEq(a.hasOwnProperty(2), false);
assertEq(a.hasOwnProperty(3), false);
/******************************************************************************/
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");