js/src/tests/ecma_6/Array/for_of_3.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/tests/ecma_6/Array/for_of_3.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,61 @@
     1.4 +// Test corner cases of for-of iteration over Arrays.
     1.5 +// The current spidermonkey 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 array length increases changes during iteration.
    1.11 +//
    1.12 +function TestIncreaseArrayLength() {
    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 +            ARR_SUM += arr.length;
    1.29 +            arr.push(arr.length);
    1.30 +        }
    1.31 +        return M2;
    1.32 +    }
    1.33 +
    1.34 +    var iter = ([])['@@iterator']();
    1.35 +    var iterProto = Object.getPrototypeOf(iter);
    1.36 +    var OldNext = iterProto.next;
    1.37 +    var NewNext = function () {
    1.38 +        return OldNext.apply(this, arguments);
    1.39 +    };
    1.40 +
    1.41 +    var TRUE_SUM = 0;
    1.42 +    var N = 100;
    1.43 +    var MID = N/2;
    1.44 +    var M = 3;
    1.45 +    var arr = new Array(M);
    1.46 +    var ARR_SUM = 0;
    1.47 +    for (var j = 0; j < M; j++) {
    1.48 +        arr[j] = j;
    1.49 +        ARR_SUM += j;
    1.50 +    }
    1.51 +    var M2 = (M/2)|0;
    1.52 +    Object.defineProperty(arr, M2, {'get':getter});
    1.53 +
    1.54 +    var sum = 0;
    1.55 +    for (var i = 0; i < N; i++) {
    1.56 +        sum += doIter(fun, arr);
    1.57 +        TRUE_SUM += ARR_SUM;
    1.58 +    }
    1.59 +    assertEq(sum, TRUE_SUM);
    1.60 +}
    1.61 +TestIncreaseArrayLength();
    1.62 +
    1.63 +if (typeof reportCompare === "function")
    1.64 +  reportCompare(true, true);

mercurial