js/src/jit-test/tests/basic/spread-call.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 load(libdir + "asserts.js");
     2 load(libdir + "eqArrayHelper.js");
     3 load(libdir + "iteration.js");
     5 let makeCall    = farg => Function("f", "arg", "return f(" + farg + ");");
     6 let makeFunCall = farg => Function("f", "arg", "return f.call(null, " + farg + ");");
     7 let makeNew     = farg => Function("f", "arg", "return new f(" + farg + ").value;");
     9 function checkCommon(f, makeFn) {
    10   assertEqArray(makeFn("...[1, 2, 3]")(f), [1, 2, 3]);
    11   assertEqArray(makeFn("1, ...[2], 3")(f), [1, 2, 3]);
    12   assertEqArray(makeFn("1, ...[2], ...[3]")(f), [1, 2, 3]);
    13   assertEqArray(makeFn("1, ...[2, 3]")(f), [1, 2, 3]);
    14   assertEqArray(makeFn("1, ...[], 2, 3")(f), [1, 2, 3]);
    16   // other iterable objects
    17   assertEqArray(makeFn("...arg")(f, new Int32Array([1, 2, 3])), [1, 2, 3]);
    18   assertEqArray(makeFn("...arg")(f, "abc"), ["a", "b", "c"]);
    19   assertEqArray(makeFn("...arg")(f, [1, 2, 3][std_iterator]()), [1, 2, 3]);
    20   assertEqArray(makeFn("...arg")(f, Set([1, 2, 3])), [1, 2, 3]);
    21   assertEqArray(makeFn("...arg")(f, Map([["a", "A"], ["b", "B"], ["c", "C"]])).map(([k, v]) => k + v), ["aA", "bB", "cC"]);
    22   let itr = {};
    23   itr[std_iterator] = function() {
    24       return {
    25           i: 1,
    26           next: function() {
    27               if (this.i < 4)
    28                   return { value: this.i++, done: false };
    29               else
    30                   return { value: undefined, done: true };
    31           }
    32       };
    33   };
    34   assertEqArray(makeFn("...arg")(f, itr), [1, 2, 3]);
    35   function gen() {
    36       for (let i = 1; i < 4; i ++)
    37           yield i;
    38   }
    39   assertEqArray(makeFn("...arg")(f, gen()), [1, 2, 3]);
    41   assertEqArray(makeFn("...arg=[1, 2, 3]")(f), [1, 2, 3]);
    43   // According to the draft spec, null and undefined are to be treated as empty
    44   // arrays. However, they are not iterable. If the spec is not changed to be in
    45   // terms of iterables, these tests should be fixed.
    46   //assertEqArray(makeFn(1, ...null, 2, 3)(f), [1, 2, 3]);
    47   //assertEqArray(makeFn(1, ...undefined, 2, 3)(f), [1, 2, 3]);
    48   assertThrowsInstanceOf(makeFn("1, ...null, 2, 3"), TypeError);
    49   assertThrowsInstanceOf(makeFn("1, ...undefined, 2, 3"), TypeError);
    50 }
    52 function checkNormal(f, makeFn) {
    53   checkCommon(f, makeFn);
    55   assertEqArray(makeFn("...[]")(f), [undefined, undefined, undefined]);
    56   assertEqArray(makeFn("...[1]")(f), [1, undefined, undefined]);
    57   assertEqArray(makeFn("...[1, 2]")(f), [1, 2, undefined]);
    58   assertEqArray(makeFn("...[1, 2, 3, 4]")(f), [1, 2, 3]);
    60   assertEqArray(makeFn("...[undefined]")(f), [undefined, undefined, undefined]);
    61 }
    63 checkNormal(function(a, b, c) [a, b, c], makeCall);
    64 checkNormal(function(a, b, c) [a, b, c], makeFunCall);
    65 checkNormal((a, b, c) => [a, b, c], makeCall);
    66 checkNormal((a, b, c) => [a, b, c], makeFunCall);
    67 function normalClass(a, b, c) {
    68   this.value = [a, b, c];
    69   assertEq(Object.getPrototypeOf(this), normalClass.prototype);
    70 }
    71 checkNormal(normalClass, makeNew);
    73 function checkDefault(f, makeFn) {
    74   checkCommon(f, makeFn);
    76   assertEqArray(makeFn("...[]")(f), [-1, -2, -3]);
    77   assertEqArray(makeFn("...[1]")(f), [1, -2, -3]);
    78   assertEqArray(makeFn("...[1, 2]")(f), [1, 2, -3]);
    79   assertEqArray(makeFn("...[1, 2, 3, 4]")(f), [1, 2, 3]);
    81   assertEqArray(makeFn("...[undefined]")(f), [-1, -2, -3]);
    82 }
    84 checkDefault(function(a = -1, b = -2, c = -3) [a, b, c], makeCall);
    85 checkDefault(function(a = -1, b = -2, c = -3) [a, b, c], makeFunCall);
    86 checkDefault((a = -1, b = -2, c = -3) => [a, b, c], makeCall);
    87 checkDefault((a = -1, b = -2, c = -3) => [a, b, c], makeFunCall);
    88 function defaultClass(a = -1, b = -2, c = -3) {
    89   this.value = [a, b, c];
    90   assertEq(Object.getPrototypeOf(this), defaultClass.prototype);
    91 }
    92 checkDefault(defaultClass, makeNew);
    94 function checkRest(f, makeFn) {
    95   checkCommon(f, makeFn);
    97   assertEqArray(makeFn("...[]")(f), []);
    98   assertEqArray(makeFn("1, ...[2, 3, 4], 5")(f), [1, 2, 3, 4, 5]);
    99   assertEqArray(makeFn("1, ...[], 2")(f), [1, 2]);
   100   assertEqArray(makeFn("1, ...[2, 3], 4, ...[5, 6]")(f), [1, 2, 3, 4, 5, 6]);
   102   assertEqArray(makeFn("...[undefined]")(f), [undefined]);
   103 }
   105 checkRest(function(...x) x, makeCall);
   106 checkRest(function(...x) x, makeFunCall);
   107 checkRest((...x) => x, makeCall);
   108 checkRest((...x) => x, makeFunCall);
   109 function restClass(...x) {
   110   this.value = x;
   111   assertEq(Object.getPrototypeOf(this), restClass.prototype);
   112 }
   113 checkRest(restClass, makeNew);

mercurial