1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_6/Array/for_of_2.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,59 @@ 1.4 +// Test corner cases of for-of iteration over Arrays. 1.5 +// The current spidermonky JSOP_SPREAD implementation for function calls 1.6 +// with '...rest' arguments uses a ForOfIterator to extract values from 1.7 +// the array, so we use that mechanism to test ForOfIterator here. 1.8 + 1.9 +// 1.10 +// Check case where ArrayIterator.prototype.next changes in the middle of iteration. 1.11 +// 1.12 +function TestChangeArrayIteratorNext() { 1.13 + function doIter(f, arr) { 1.14 + return f(...arr) 1.15 + } 1.16 + 1.17 + function fun(a, b, c) { 1.18 + var result = 0; 1.19 + for (var i = 0; i < arguments.length; i++) 1.20 + result += arguments[i]; 1.21 + return result; 1.22 + } 1.23 + 1.24 + var GET_COUNT = 0; 1.25 + function getter() { 1.26 + GET_COUNT++; 1.27 + if (GET_COUNT == MID) 1.28 + iterProto.next = NewNext; 1.29 + return M2; 1.30 + } 1.31 + 1.32 + var iter = ([])['@@iterator'](); 1.33 + var iterProto = Object.getPrototypeOf(iter); 1.34 + var OldNext = iterProto.next; 1.35 + var NewNext = function () { 1.36 + return OldNext.apply(this, arguments); 1.37 + }; 1.38 + 1.39 + var TRUE_SUM = 0; 1.40 + var N = 100; 1.41 + var MID = N/2; 1.42 + var M = 3; 1.43 + var arr = new Array(M); 1.44 + var ARR_SUM = 0; 1.45 + for (var j = 0; j < M; j++) { 1.46 + arr[j] = j; 1.47 + ARR_SUM += j; 1.48 + } 1.49 + var M2 = (M/2)|0; 1.50 + Object.defineProperty(arr, M2, {'get':getter}); 1.51 + 1.52 + var sum = 0; 1.53 + for (var i = 0; i < N; i++) { 1.54 + sum += doIter(fun, arr); 1.55 + TRUE_SUM += ARR_SUM; 1.56 + } 1.57 + assertEq(sum, TRUE_SUM); 1.58 +} 1.59 +TestChangeArrayIteratorNext(); 1.60 + 1.61 +if (typeof reportCompare === "function") 1.62 + reportCompare(true, true);