getelem-bounds-hoist.js (1760B)
1 var a = [1,2,3,4,5]; 2 3 // Basic overflow in hoisted condition. 4 function foo(x, n) { 5 var v = 0; 6 for (var i = 0; i < n; i++) 7 v += x[i]; 8 return v; 9 } 10 for (var i = 0; i < 15; i++) 11 assertEq(foo(a, 5), 15); 12 assertEq(foo(a, 6), NaN); 13 14 // Basic underflow in hoisted condition. 15 function foo2(x, m, n) { 16 var v = 0; 17 for (var i = m; i < n; i++) 18 v += x[i]; 19 return v; 20 } 21 for (var i = 0; i < 15; i++) 22 assertEq(foo2(a, 0, 5), 15); 23 assertEq(foo2(a, -1, 5), NaN); 24 25 // Overflow when hoisting consolidated condition. 26 function foo3(x, m, n) { 27 var v = 0; 28 for (var i = m; i < n; i++) 29 v += x[i] + x[i + 1] + x[i + 2]; 30 return v; 31 } 32 for (var i = 0; i < 15; i++) 33 assertEq(foo3(a, 0, 3), 27); 34 assertEq(foo3(a, 0, 4), NaN); 35 36 // Underflow when hoisting consolidated condition. 37 function foo4(x, m, n) { 38 var v = 0; 39 for (var i = m; i < n; i++) 40 v += x[i] + x[i - 1] + x[i - 2]; 41 return v; 42 } 43 for (var i = 0; i < 15; i++) 44 assertEq(foo4(a, 2, 5), 27); 45 assertEq(foo4(a, 0, 5), NaN); 46 47 // Underflow due to decreasing index. 48 function foo5(x, n) { 49 var v = 0; 50 for (var i = 0; i < n; i++) { 51 v += x[i]; 52 if (n == 4) 53 i -= 2; 54 if (i == -5) 55 break; 56 } 57 return v; 58 } 59 for (var i = 0; i < 15; i++) 60 assertEq(foo5(a, 5), 15); 61 assertEq(foo5(a, 4), NaN); 62 63 // Overflow after access at constant offset. 64 function foo6(x, m, n) { 65 var v = 0; 66 for (var i = m; i < n; i++) 67 v += x[i + 10]; 68 return v; 69 } 70 for (var i = 0; i < 15; i++) 71 assertEq(foo6(a, -10, -5), 15); 72 assertEq(foo6(a, -10, -4), NaN); 73 74 // Underflow after access at constant offset. 75 function foo7(x, m, n) { 76 var v = 0; 77 for (var i = m; i < n; i++) 78 v += x[i + 10]; 79 return v; 80 } 81 for (var i = 0; i < 15; i++) 82 assertEq(foo7(a, -10, -5), 15); 83 assertEq(foo7(a, -11, -5), NaN);