1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/arrays/ion-push-nonwritable-length.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,61 @@ 1.4 +function f(arr) 1.5 +{ 1.6 + assertEq(arr.push(4), 5); // if it doesn't throw :-) 1.7 +} 1.8 + 1.9 +function test(out) 1.10 +{ 1.11 + // Create an array of arrays, to be iterated over for [].push-calling. We 1.12 + // can't just loop on push on a single array with non-writable length because 1.13 + // push throws when called on an array with non-writable length. 1.14 + var arrs = out.arrs = []; 1.15 + for (var i = 0; i < 100; i++) 1.16 + arrs.push([0, 1, 2, 3]); 1.17 + 1.18 + // Use a much-greater capacity than the eventual non-writable length, so that 1.19 + // the inline-push will work. 1.20 + var a = [0, 1, 2, 3, 4, 5, 6, 7]; 1.21 + Object.defineProperty(a, "length", { writable: false, value: 4 }); 1.22 + 1.23 + arrs.push(a); 1.24 + 1.25 + for (var i = 0, sz = arrs.length; i < sz; i++) 1.26 + { 1.27 + var arr = arrs[i]; 1.28 + f(arr); 1.29 + } 1.30 +} 1.31 + 1.32 +var obj = {}; 1.33 +var a, arrs; 1.34 + 1.35 +try 1.36 +{ 1.37 + test(obj); 1.38 + throw new Error("didn't throw!"); 1.39 +} 1.40 +catch (e) 1.41 +{ 1.42 + assertEq(e instanceof TypeError, true, "expected TypeError, got " + e); 1.43 + 1.44 + arrs = obj.arrs; 1.45 + assertEq(arrs.length, 101); 1.46 + for (var i = 0; i < 100; i++) 1.47 + { 1.48 + assertEq(arrs[i].length, 5, "unexpected length for arrs[" + i + "]"); 1.49 + assertEq(arrs[i][0], 0, "bad element for arrs[" + i + "][0]"); 1.50 + assertEq(arrs[i][1], 1, "bad element for arrs[" + i + "][1]"); 1.51 + assertEq(arrs[i][2], 2, "bad element for arrs[" + i + "][2]"); 1.52 + assertEq(arrs[i][3], 3, "bad element for arrs[" + i + "][3]"); 1.53 + assertEq(arrs[i][4], 4, "bad element for arrs[" + i + "][4]"); 1.54 + } 1.55 + 1.56 + a = arrs[100]; 1.57 + assertEq(a[0], 0, "bad element for a[" + i + "]"); 1.58 + assertEq(a[1], 1, "bad element for a[" + i + "]"); 1.59 + assertEq(a[2], 2, "bad element for a[" + i + "]"); 1.60 + assertEq(a[3], 3, "bad element for a[" + i + "]"); 1.61 + assertEq(a.hasOwnProperty(4), false, "element addition should have thrown"); 1.62 + assertEq(a[4], undefined); 1.63 + assertEq(a.length, 4, "length shouldn't have been changed"); 1.64 +}