|
1 // Test corner cases of for-of iteration over Arrays. |
|
2 // The current spidermonkey JSOP_SPREAD implementation for function calls |
|
3 // with '...rest' arguments uses a ForOfIterator to extract values from |
|
4 // the array, so we use that mechanism to test ForOfIterator here. |
|
5 |
|
6 // |
|
7 // Check array length increases changes during iteration. |
|
8 // |
|
9 function TestIncreaseArrayLength() { |
|
10 function doIter(f, arr) { |
|
11 return f(...arr) |
|
12 } |
|
13 |
|
14 function fun(a, b, c) { |
|
15 var result = 0; |
|
16 for (var i = 0; i < arguments.length; i++) |
|
17 result += arguments[i]; |
|
18 return result; |
|
19 } |
|
20 |
|
21 var GET_COUNT = 0; |
|
22 function getter() { |
|
23 GET_COUNT++; |
|
24 if (GET_COUNT == MID) { |
|
25 ARR_SUM += arr.length; |
|
26 arr.push(arr.length); |
|
27 } |
|
28 return M2; |
|
29 } |
|
30 |
|
31 var iter = ([])['@@iterator'](); |
|
32 var iterProto = Object.getPrototypeOf(iter); |
|
33 var OldNext = iterProto.next; |
|
34 var NewNext = function () { |
|
35 return OldNext.apply(this, arguments); |
|
36 }; |
|
37 |
|
38 var TRUE_SUM = 0; |
|
39 var N = 100; |
|
40 var MID = N/2; |
|
41 var M = 3; |
|
42 var arr = new Array(M); |
|
43 var ARR_SUM = 0; |
|
44 for (var j = 0; j < M; j++) { |
|
45 arr[j] = j; |
|
46 ARR_SUM += j; |
|
47 } |
|
48 var M2 = (M/2)|0; |
|
49 Object.defineProperty(arr, M2, {'get':getter}); |
|
50 |
|
51 var sum = 0; |
|
52 for (var i = 0; i < N; i++) { |
|
53 sum += doIter(fun, arr); |
|
54 TRUE_SUM += ARR_SUM; |
|
55 } |
|
56 assertEq(sum, TRUE_SUM); |
|
57 } |
|
58 TestIncreaseArrayLength(); |
|
59 |
|
60 if (typeof reportCompare === "function") |
|
61 reportCompare(true, true); |