|
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); |