michael@0: // Test corner cases of for-of iteration over Arrays. michael@0: // The current spidermonkey JSOP_SPREAD implementation for function calls michael@0: // with '...rest' arguments uses a ForOfIterator to extract values from michael@0: // the array, so we use that mechanism to test ForOfIterator here. michael@0: michael@0: // michael@0: // Check array length increases changes during iteration. michael@0: // michael@0: function TestIncreaseArrayLength() { michael@0: function doIter(f, arr) { michael@0: return f(...arr) michael@0: } michael@0: michael@0: function fun(a, b, c) { michael@0: var result = 0; michael@0: for (var i = 0; i < arguments.length; i++) michael@0: result += arguments[i]; michael@0: return result; michael@0: } michael@0: michael@0: var GET_COUNT = 0; michael@0: function getter() { michael@0: GET_COUNT++; michael@0: if (GET_COUNT == MID) { michael@0: ARR_SUM += arr.length; michael@0: arr.push(arr.length); michael@0: } michael@0: return M2; michael@0: } michael@0: michael@0: var iter = ([])['@@iterator'](); michael@0: var iterProto = Object.getPrototypeOf(iter); michael@0: var OldNext = iterProto.next; michael@0: var NewNext = function () { michael@0: return OldNext.apply(this, arguments); michael@0: }; michael@0: michael@0: var TRUE_SUM = 0; michael@0: var N = 100; michael@0: var MID = N/2; michael@0: var M = 3; michael@0: var arr = new Array(M); michael@0: var ARR_SUM = 0; michael@0: for (var j = 0; j < M; j++) { michael@0: arr[j] = j; michael@0: ARR_SUM += j; michael@0: } michael@0: var M2 = (M/2)|0; michael@0: Object.defineProperty(arr, M2, {'get':getter}); michael@0: michael@0: var sum = 0; michael@0: for (var i = 0; i < N; i++) { michael@0: sum += doIter(fun, arr); michael@0: TRUE_SUM += ARR_SUM; michael@0: } michael@0: assertEq(sum, TRUE_SUM); michael@0: } michael@0: TestIncreaseArrayLength(); michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true);