tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

spread-call-funapply.js (2968B)


      1 load(libdir + "asserts.js");
      2 load(libdir + "eqArrayHelper.js");
      3 load(libdir + "iteration.js");
      4 
      5 function checkCommon(f) {
      6  assertEqArray(f.apply(null, ...[[1, 2, 3]]), [1, 2, 3]);
      7  assertEqArray(f.apply(...[null], [1, 2, 3]), [1, 2, 3]);
      8  assertEqArray(f.apply(...[null], ...[[1, 2, 3]]), [1, 2, 3]);
      9  assertEqArray(f.apply(...[null, [1, 2, 3]]), [1, 2, 3]);
     10 
     11  // other iterable objects
     12  assertEqArray(f.apply(...new Set([null, [1, 2, 3]])), [1, 2, 3]);
     13  assertEqArray(f.apply(...[null, [1, 2, 3]][Symbol.iterator]()), [1, 2, 3]);
     14  let itr = {};
     15  itr[Symbol.iterator] = function() {
     16      return {
     17          i: 0,
     18          next: function() {
     19              this.i++;
     20              if (this.i == 1)
     21                  return { value: null, done: false };
     22              else if (this.i == 2)
     23                  return { value: [1, 2, 3], done: false };
     24              else
     25                  return { value: undefined, done: true };
     26          }
     27      };
     28  };
     29  assertEqArray(f.apply(...itr), [1, 2, 3]);
     30  function* gen() {
     31      yield null;
     32      yield [1, 2, 3];
     33  }
     34  assertEqArray(f.apply(...gen()), [1, 2, 3]);
     35 
     36  let a;
     37  assertEqArray(f.apply(null, ...a=[[1, 2, 3]]), [1, 2, 3]);
     38 
     39  // 12.2.4.1.2 Runtime Semantics: ArrayAccumulation
     40  // If Type(spreadObj) is not Object, then throw a TypeError exception.
     41  assertThrowsInstanceOf(() => f.apply(null, ...null, [1, 2, 3]), TypeError);
     42  assertThrowsInstanceOf(() => f.apply(null, ...undefined, [1, 2, 3]), TypeError);
     43 }
     44 
     45 function checkNormal(f) {
     46  checkCommon(f);
     47 
     48  assertEqArray(f.apply(null, ...[[]]), [undefined, undefined, undefined]);
     49  assertEqArray(f.apply(null, ...[[1]]), [1, undefined, undefined]);
     50  assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, undefined]);
     51  assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]);
     52 
     53  assertEqArray(f.apply(null, ...[[undefined]]), [undefined, undefined, undefined]);
     54 }
     55 
     56 checkNormal(function(a, b, c) { return [a, b, c]; });
     57 checkNormal((a, b, c) => [a, b, c]);
     58 
     59 function checkDefault(f) {
     60  checkCommon(f);
     61 
     62  assertEqArray(f.apply(null, ...[[]]), [-1, -2, -3]);
     63  assertEqArray(f.apply(null, ...[[1]]), [1, -2, -3]);
     64  assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, -3]);
     65  assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]);
     66 
     67  assertEqArray(f.apply(null, ...[[undefined]]), [-1, -2, -3]);
     68 }
     69 
     70 checkDefault(function(a = -1, b = -2, c = -3) { return [a, b, c]; });
     71 checkDefault((a = -1, b = -2, c = -3) => [a, b, c]);
     72 
     73 function checkRest(f) {
     74  checkCommon(f);
     75 
     76  assertEqArray(f.apply(null, ...[[]]), []);
     77  assertEqArray(f.apply(null, ...[[1]]), [1]);
     78  assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2]);
     79  assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3, 4]);
     80 
     81  assertEqArray(f.apply(null, ...[[undefined]]), [undefined]);
     82 
     83  // other iterable objects
     84  assertEqArray(f.apply(null, ...new Map([[["a", "A"], ["b", "B"]]])).map(([k, v]) => k + v), ["aA", "bB"]);
     85 }
     86 
     87 checkRest(function(...x) { return x; });
     88 checkRest((...x) => x);