michael@0: // Test corner cases of for-of iteration over Arrays. michael@0: // The current spidermonky 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: // Test the properties and prototype of a generator object. michael@0: function TestManySmallArrays() { 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: michael@0: var TRUE_SUM = 0; michael@0: var N = 100; michael@0: var M = 3; michael@0: var sum = 0; michael@0: for (var i = 0; i < N; i++) { michael@0: var arr = new Array(M); michael@0: for (var j = 0; j < M; j++) { michael@0: arr[j] = j; michael@0: TRUE_SUM += j; michael@0: } michael@0: sum += doIter(fun, arr); michael@0: } michael@0: assertEq(sum, TRUE_SUM); michael@0: } michael@0: TestManySmallArrays(); michael@0: michael@0: // Test the properties and prototype of a generator object. michael@0: function TestSingleSmallArray() { 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: michael@0: var TRUE_SUM = 0; michael@0: var N = 100; michael@0: var M = 3; michael@0: var arr = new Array(M); michael@0: for (var j = 0; j < M; j++) { michael@0: arr[j] = j; michael@0: TRUE_SUM += j; michael@0: } michael@0: TRUE_SUM *= N; michael@0: michael@0: var sum = 0; michael@0: for (var i = 0; i < N; i++) { michael@0: sum += doIter(fun, arr); michael@0: } michael@0: assertEq(sum, TRUE_SUM); michael@0: } michael@0: TestSingleSmallArray(); michael@0: michael@0: michael@0: function TestChangeArrayPrototype() { 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 Proto1 = Object.create(Array.prototype); 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: michael@0: var sum = 0; michael@0: for (var i = 0; i < N; i++) { michael@0: sum += doIter(fun, arr); michael@0: if (i == MID) michael@0: arr.__proto__ = Proto1; michael@0: TRUE_SUM += ARR_SUM; michael@0: } michael@0: assertEq(sum, TRUE_SUM); michael@0: } michael@0: TestChangeArrayPrototype(); michael@0: michael@0: michael@0: function TestChangeManyArrayShape() { 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 TRUE_SUM = 0; michael@0: var N = 100; michael@0: var MID = N/2; michael@0: var M = 3; michael@0: var sum = 0; michael@0: for (var i = 0; i < N; i++) { 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: arr['v_' + i] = 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: TestChangeManyArrayShape(); michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true);