1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/arrays/push-slowly-loopy-nonwritable-length.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,51 @@ 1.4 +load(libdir + "asserts.js"); 1.5 + 1.6 +function f(arr, v1, v2) 1.7 +{ 1.8 + // Ensure array_push_slowly is called by passing more than one argument. 1.9 + arr.push(v1, v2); 1.10 +} 1.11 + 1.12 +var N = 100; 1.13 + 1.14 +function test(out) 1.15 +{ 1.16 + // Create an array of arrays, to be iterated over for [].push-calling. We 1.17 + // can't just loop on push on a single array with non-writable length because 1.18 + // push throws when called on an array with non-writable length. 1.19 + var arrs = out.arrs = []; 1.20 + for (var i = 0; i < N; i++) 1.21 + arrs.push([]); 1.22 + 1.23 + // Use a much-greater capacity than the eventual non-writable length. 1.24 + var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; 1.25 + Object.defineProperty(a, "length", { writable: false, value: 6 }); 1.26 + 1.27 + arrs.push(a); 1.28 + 1.29 + for (var i = 0, sz = arrs.length; i < sz; i++) 1.30 + { 1.31 + var arr = arrs[i]; 1.32 + f(arr, 8675309, 3141592); 1.33 + } 1.34 +} 1.35 + 1.36 +var obj = {}; 1.37 + 1.38 +assertThrowsInstanceOf(function() { test(obj); }, TypeError); 1.39 + 1.40 +var arrs = obj.arrs; 1.41 +assertEq(arrs.length, N + 1); 1.42 +for (var i = 0; i < N; i++) 1.43 +{ 1.44 + assertEq(arrs[i].length, 2, "unexpected length for arrs[" + i + "]"); 1.45 + assertEq(arrs[i][0], 8675309, "bad element for arrs[" + i + "][0]"); 1.46 + assertEq(arrs[i][1], 3141592, "bad element for arrs[" + i + "][1]"); 1.47 +} 1.48 + 1.49 +var a = arrs[N]; 1.50 +assertEq(a.hasOwnProperty(6), false); 1.51 +assertEq(a[6], undefined); 1.52 +assertEq(a.hasOwnProperty(7), false); 1.53 +assertEq(a[7], undefined); 1.54 +assertEq(a.length, 6);