Fix Array.prototype.splice() deletecount calculation

JerryScript-DCO-1.0-Signed-off-by: Zsolt Borbély zsborbely.u-szeged@partner.samsung.com
This commit is contained in:
Zsolt Borbély 2015-07-20 09:01:36 +02:00 committed by Peter Gal
parent 64c81cc44d
commit 33be4883a2
2 changed files with 25 additions and 8 deletions

View File

@ -1462,6 +1462,11 @@ ecma_builtin_array_prototype_object_splice (ecma_value_t this_arg, /**< this arg
else else
{ {
delete_count = ecma_number_is_infinity (delete_num) ? len : ecma_number_to_uint32 (delete_num); delete_count = ecma_number_is_infinity (delete_num) ? len : ecma_number_to_uint32 (delete_num);
if (delete_count > len - start)
{
delete_count = len - start;
}
} }
} }
else else

View File

@ -29,7 +29,7 @@ assert (array[3] == "sunshine");
assert (array1.length == 0); assert (array1.length == 0);
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array2 = array.splice(2); var array2 = array.splice(2);
assert (array.length == 2); assert (array.length == 2);
@ -40,7 +40,7 @@ assert (array2[0] == -127);
assert (array2[1] == "sunshine"); assert (array2[1] == "sunshine");
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array3 = array.splice(2, 1); var array3 = array.splice(2, 1);
assert (array.length == 3); assert (array.length == 3);
@ -51,7 +51,7 @@ assert (array3.length == 1);
assert (array3[0] == -127); assert (array3[0] == -127);
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array4 = array.splice(0, 3, 6720, "Szeged"); var array4 = array.splice(0, 3, 6720, "Szeged");
assert (array.length == 3); assert (array.length == 3);
@ -64,7 +64,7 @@ assert (array4[1] == undefined);
assert (array4[2] == -127); assert (array4[2] == -127);
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array5 = array.splice(-2, -2, 6720, "Szeged"); var array5 = array.splice(-2, -2, 6720, "Szeged");
assert (array.length == 6); assert (array.length == 6);
@ -77,7 +77,7 @@ assert (array[5] == "sunshine");
assert (array5.length == 0); assert (array5.length == 0);
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array6 = array.splice(undefined, undefined, undefined); var array6 = array.splice(undefined, undefined, undefined);
assert (array.length == 5); assert (array.length == 5);
@ -89,7 +89,7 @@ assert (array[4] == "sunshine");
assert (array6.length == 0); assert (array6.length == 0);
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array7 = array.splice(Infinity, NaN); var array7 = array.splice(Infinity, NaN);
assert (array.length == 4); assert (array.length == 4);
assert (array[0] == 54); assert (array[0] == 54);
@ -99,7 +99,7 @@ assert (array[3] == "sunshine");
assert (array7.length == 0); assert (array7.length == 0);
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array8 = array.splice(-Infinity, Infinity); var array8 = array.splice(-Infinity, Infinity);
assert (array.length == 0); assert (array.length == 0);
@ -110,7 +110,7 @@ assert (array8[2] == -127);
assert (array8[3] == "sunshine"); assert (array8[3] == "sunshine");
// -------------------------------------------------------- // --------------------------------------------------------
array = setDefaultValues(); array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array9 = array.splice(NaN, -Infinity); var array9 = array.splice(NaN, -Infinity);
assert (array.length == 4); assert (array.length == 4);
assert (array[0] == 54); assert (array[0] == 54);
@ -119,6 +119,18 @@ assert (array[2] == -127);
assert (array[3] == "sunshine"); assert (array[3] == "sunshine");
assert (array9.length == 0); assert (array9.length == 0);
// --------------------------------------------------------
array = setDefaultValues(); // 54, undefined, -127, "sunshine"
var array10 = array.splice(-3, 4, Infinity, "university");
assert (array.length == 3);
assert (array[0] == 54);
assert (array[1] == Infinity);
assert (array[2] == "university");
assert (array10.length == 3);
assert (array10[0] == undefined);
assert (array10[1] == -127);
assert (array10[2] == "sunshine");
// Checking behavior when unable to get length // Checking behavior when unable to get length
var obj = {splice : Array.prototype.splice}; var obj = {splice : Array.prototype.splice};
Object.defineProperty(obj, 'length', { 'get' : function () { throw new ReferenceError ("foo"); } }); Object.defineProperty(obj, 'length', { 'get' : function () { throw new ReferenceError ("foo"); } });