Skip to content

Commit 6567651

Browse files
dbatyaigalpeter
authored andcommitted
Fix Array index normalize helper when index is large.
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai.u-szeged@partner.samsung.com
1 parent ee8d650 commit 6567651

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -299,21 +299,29 @@ ecma_builtin_helper_array_index_normalize (ecma_number_t index, /**< index */
299299
}
300300
else
301301
{
302-
const int32_t int_index = ecma_number_to_int32 (index);
303-
304-
if (int_index < 0)
302+
if (ecma_number_is_negative (index))
305303
{
306-
const uint32_t uint_index = (uint32_t) - int_index;
307-
norm_index = uint_index > length ? 0 : length - uint_index;
304+
ecma_number_t index_neg = ecma_number_negate (index);
305+
306+
if (index_neg > length)
307+
{
308+
norm_index = 0;
309+
}
310+
else
311+
{
312+
norm_index = length - ecma_number_to_uint32 (index_neg);
313+
}
308314
}
309315
else
310316
{
311-
norm_index = (uint32_t) int_index;
312-
313-
if (norm_index > length)
317+
if (index > length)
314318
{
315319
norm_index = length;
316320
}
321+
else
322+
{
323+
norm_index = ecma_number_to_uint32 (index);
324+
}
317325
}
318326
}
319327
}

tests/jerry/array-prototype-slice.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,27 @@ assert (array7[3] == -127);
5858

5959
assert (array8.length == 0);
6060

61+
var array = [];
62+
array[4294967293] = "foo";
63+
array.length = 4294967295;
64+
var result = array.slice(4294967293, -1)
65+
assert(result.length === 1)
66+
assert(result[0] === "foo")
67+
68+
array[0] = "bar";
69+
var result = array.slice(-4294967295, -4294967294)
70+
assert(result.length === 1)
71+
assert(result[0] === "bar")
72+
73+
var array = [];
74+
array[0] = "foo";
75+
var result = array.slice(4294967296, 4294967297);
76+
assert(result.length === 0);
77+
78+
array[4294967293] = "bar";
79+
var result = array.slice(-4294967297, -4294967296);
80+
assert(result.length === 0);
81+
6182
// Checking behavior when unable to get length
6283
var obj = { slice : Array.prototype.slice };
6384
Object.defineProperty(obj, 'length', { 'get' : function () { throw new ReferenceError ("foo"); } });

tests/jerry/array-prototype-splice.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,19 @@ assert (array10[0] == undefined);
131131
assert (array10[1] == -127);
132132
assert (array10[2] == "sunshine");
133133

134+
var array = [];
135+
array[4294967294] = "foo";
136+
var result = array.splice(4294967294, 1, "x")
137+
assert(result.length === 1)
138+
assert(result[0] === "foo")
139+
assert(array[4294967294] === "x")
140+
141+
array[0] = "bar";
142+
var result = array.splice(-4294967295, 1, "y");
143+
assert(result.length === 1)
144+
assert(result[0] === "bar")
145+
assert(array[0] === "y")
146+
134147
// Checking behavior when unable to get length
135148
var obj = {splice : Array.prototype.splice};
136149
Object.defineProperty(obj, 'length', { 'get' : function () { throw new ReferenceError ("foo"); } });

0 commit comments

Comments
 (0)