1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/ion/bug851792.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,135 @@ 1.4 +// Based on tests/ion/typed-arrays-1.js, but with string indexes 1.5 +function testInt8() { 1.6 + var arr1 = new Int8Array(50); 1.7 + var arr2 = new Uint8Array(50); 1.8 + var arr3 = new Uint8ClampedArray(50); 1.9 + 1.10 + for (var i=0; i<arr1.length; i++) { 1.11 + arr1[i] = arr2[i] = arr3[i] = i * 8; 1.12 + } 1.13 + var res = 0; 1.14 + for (var i=0; i<arr1.length; i++) { 1.15 + res += arr1[i+""] + arr2[i+""] + arr3[i+""] + arr2["10".concat("")]; 1.16 + } 1.17 + assertEq(res, 18334); 1.18 +} 1.19 +testInt8(); 1.20 + 1.21 +function testInt16() { 1.22 + var arr1 = new Int16Array(70); 1.23 + var arr2 = new Uint16Array(70); 1.24 + 1.25 + for (var i=0; i<arr1.length; i++) { 1.26 + arr1[i] = arr2[i] = i * 1000; 1.27 + } 1.28 + var res = 0; 1.29 + for (var i=0; i<arr1.length; i++) { 1.30 + res += arr1[i+""] + arr2[i+""] + arr2["1".concat("")] + arr1["3".concat("")]; 1.31 + } 1.32 + assertEq(res, 2423024); 1.33 +} 1.34 +testInt16(); 1.35 + 1.36 +function testInt32() { 1.37 + var arr = new Int32Array(60); 1.38 + arr[0] = -50; 1.39 + for (var i=1; i<arr.length; i++) { 1.40 + arr[i] = arr[(i-1)+""] + arr["0".concat("")]; 1.41 + ++arr[0]; 1.42 + } 1.43 + assertEq(arr[(arr.length-1)+""], -1289); 1.44 +} 1.45 +testInt32(); 1.46 + 1.47 +function testUint32() { 1.48 + function sum(arr) { 1.49 + var res = 0; 1.50 + for (var i=0; i<arr.length; i++) { 1.51 + res += arr[i+""]; 1.52 + } 1.53 + return res; 1.54 + } 1.55 + var arr = new Uint32Array(100); 1.56 + for (var i=0; i<arr.length; i++) { 1.57 + arr[i] = i; 1.58 + } 1.59 + 1.60 + // Compile sum() to read int32 values. 1.61 + assertEq(sum(arr), 4950); 1.62 + 1.63 + // Add a large uint32 so that the sum no longer fits in an 1.64 + // int32. sum() should be recompiled to return a double. 1.65 + arr[50] = 0xffffeeee; 1.66 + assertEq(sum(arr), 4294967826); 1.67 +} 1.68 +testUint32(); 1.69 + 1.70 +function testFloat() { 1.71 + var arr1 = new Float32Array(75); 1.72 + var arr2 = new Float64Array(75); 1.73 + arr1[0] = arr2[0] = Math.PI * 1234567.8; 1.74 + 1.75 + for (var i=1; i<75; i++) { 1.76 + arr1[i] = arr1[(i-1)+""] + arr1[0]; 1.77 + arr2[i] = arr2[(i-1)+""] + arr2[0]; 1.78 + } 1.79 + assertEq(arr1["74".concat("")] > 290888255, true); 1.80 + assertEq(arr1["74".concat("")] < 290888257, true); 1.81 + 1.82 + assertEq(arr2["74".concat("")] > 290888184, true); 1.83 + assertEq(arr2["74".concat("")] < 290888185, true); 1.84 +} 1.85 +testFloat(); 1.86 + 1.87 +function testCanonicalNaN() { 1.88 + // NaN values have to be canonicalized. Otherwise, malicious scripts could 1.89 + // construct arbitrary Value's (due to our NaN boxing Value representation). 1.90 + var buf = new ArrayBuffer(16); 1.91 + var uint32 = new Uint32Array(buf); 1.92 + var f64 = new Float64Array(buf); 1.93 + var f32 = new Float32Array(buf); 1.94 + 1.95 + // Evil: write a JSVAL_TYPE_OBJECT type tag... 1.96 + uint32[0] = 0xffffff87; 1.97 + uint32[1] = 0xffffff87; 1.98 + 1.99 + // Make sure this value is interpreted as a double. 1.100 + for (var i=0; i<3; i++) { 1.101 + assertEq(isNaN(f64["0".concat("")]), true); 1.102 + assertEq(isNaN(f32["0".concat("")]), true); 1.103 + } 1.104 +} 1.105 +testCanonicalNaN(); 1.106 + 1.107 +function testOutOfBounds() { 1.108 + var buf = new ArrayBuffer(16); 1.109 + var uint32 = new Uint32Array(buf); 1.110 + 1.111 + uint32[0] = 0; 1.112 + uint32[1] = 1; 1.113 + 1.114 + for (var i=0; i<3; i++) { 1.115 + assertEq(uint32["0".concat("")], 0); 1.116 + assertEq(uint32["1".concat("")], 1); 1.117 + assertEq(uint32["2".concat("")], 0); 1.118 + assertEq(uint32["17".concat("")], undefined); 1.119 + } 1.120 +} 1.121 +testOutOfBounds(); 1.122 + 1.123 +function testStrangeIndexes() { 1.124 + var buf = new ArrayBuffer(16); 1.125 + var uint32 = new Uint32Array(buf); 1.126 + 1.127 + uint32[0] = 0; 1.128 + uint32[1] = 1; 1.129 + 1.130 + indexes = ["0", "1", "2", "3", "17", "3.5", "NaN", "undefined", "null"]; 1.131 + solutions = [0, 1, 0, 0, undefined, undefined, undefined, undefined, undefined]; 1.132 + 1.133 + for (var i=0; i<indexes.length; i++) { 1.134 + assertEq(uint32[indexes[i]], solutions[i]); 1.135 + } 1.136 +} 1.137 +testStrangeIndexes(); 1.138 +