1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/arrays/splice-nonwritable-length.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,53 @@ 1.4 +load(libdir + "asserts.js"); 1.5 + 1.6 +function f(arr) 1.7 +{ 1.8 + assertEq(arr.splice(1, 2, 9, 8, 7, 6).length, 2); // if it doesn't throw :-) 1.9 +} 1.10 + 1.11 +var N = 100; 1.12 + 1.13 +function test(out) 1.14 +{ 1.15 + // Create an array of arrays, to be iterated over for [].splice-calling. 1.16 + var arrs = out.arrs = []; 1.17 + for (var i = 0; i < N; i++) 1.18 + arrs.push([0, 1, 2, 3]); 1.19 + 1.20 + // Use a much-greater capacity than the eventual non-writable length, just for 1.21 + // variability. 1.22 + var a = [0, 1, 2, 3, 4, 5, 6, 7]; 1.23 + Object.defineProperty(a, "length", { writable: false, value: 4 }); 1.24 + 1.25 + arrs.push(a); 1.26 + 1.27 + for (var i = 0, sz = arrs.length; i < sz; i++) 1.28 + f(arrs[i]); 1.29 +} 1.30 + 1.31 +var obj = {}; 1.32 +assertThrowsInstanceOf(function() { test(obj); }, TypeError); 1.33 + 1.34 +var arrs = obj.arrs; 1.35 +assertEq(arrs.length, N + 1); 1.36 +for (var i = 0; i < N; i++) 1.37 +{ 1.38 + assertEq(arrs[i].length, 6, "unexpected length for arrs[" + i + "]"); 1.39 + assertEq(arrs[i][0], 0, "bad element for arrs[" + i + "][0]"); 1.40 + assertEq(arrs[i][1], 9, "bad element for arrs[" + i + "][1]"); 1.41 + assertEq(arrs[i][2], 8, "bad element for arrs[" + i + "][2]"); 1.42 + assertEq(arrs[i][3], 7, "bad element for arrs[" + i + "][3]"); 1.43 + assertEq(arrs[i][4], 6, "bad element for arrs[" + i + "][4]"); 1.44 + assertEq(arrs[i][5], 3, "bad element for arrs[" + i + "][5]"); 1.45 +} 1.46 + 1.47 +var a = arrs[N]; 1.48 +assertEq(a[0], 0, "bad element for a[0]"); 1.49 +assertEq(a[1], 1, "bad element for a[1]"); 1.50 +assertEq(a[2], 2, "bad element for a[2]"); 1.51 +assertEq(a[3], 3, "bad element for a[3]"); 1.52 +assertEq(a.hasOwnProperty(4), false, "shouldn't have added any elements"); 1.53 +assertEq(a[4], undefined); 1.54 +assertEq(a.hasOwnProperty(5), false, "shouldn't have added any elements"); 1.55 +assertEq(a[5], undefined); 1.56 +assertEq(a.length, 4, "length shouldn't have been changed");