diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index 3d3e988a56e..9e1f7216786 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -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. */ diff --git a/js/src/tests/ecma_5/Array/sort-array-with-holes-and-undefined.js b/js/src/tests/ecma_5/Array/sort-array-with-holes-and-undefined.js new file mode 100644 index 00000000000..b77c6d3411f --- /dev/null +++ b/js/src/tests/ecma_5/Array/sort-array-with-holes-and-undefined.js @@ -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");