|
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 decreases changes during iteration. |
|
8 // |
|
9 function TestDecreaseArrayLength() { |
|
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.length = 0; |
|
26 } |
|
27 return M2; |
|
28 } |
|
29 |
|
30 var iter = ([])['@@iterator'](); |
|
31 var iterProto = Object.getPrototypeOf(iter); |
|
32 var OldNext = iterProto.next; |
|
33 var NewNext = function () { |
|
34 return OldNext.apply(this, arguments); |
|
35 }; |
|
36 |
|
37 var TRUE_SUM = 0; |
|
38 var N = 100; |
|
39 var MID = N/2; |
|
40 var M = 3; |
|
41 var arr = new Array(M); |
|
42 var ARR_SUM = 0; |
|
43 for (var j = 0; j < M; j++) { |
|
44 arr[j] = j; |
|
45 ARR_SUM += j; |
|
46 } |
|
47 var M2 = (M/2)|0; |
|
48 Object.defineProperty(arr, M2, {'get':getter}); |
|
49 |
|
50 var sum = 0; |
|
51 for (var i = 0; i < N; i++) { |
|
52 var oldLen = arr.length; |
|
53 sum += doIter(fun, arr); |
|
54 var newLen = arr.length; |
|
55 if (oldLen == newLen) |
|
56 TRUE_SUM += arr.length > 0 ? ARR_SUM : 0; |
|
57 else |
|
58 TRUE_SUM += 1 |
|
59 } |
|
60 assertEq(sum, TRUE_SUM); |
|
61 } |
|
62 TestDecreaseArrayLength(); |
|
63 |
|
64 if (typeof reportCompare === "function") |
|
65 reportCompare(true, true); |