tor-browser

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

spread-call-rest.js (1969B)


      1 // bug 1235092
      2 // Optimize spread call with rest parameter.
      3 
      4 load(libdir + "asserts.js");
      5 
      6 function makeArray(...args) {
      7  return args;
      8 }
      9 
     10 // Optimizable Case.
     11 function test(...args) {
     12  return makeArray(...args);
     13 }
     14 assertDeepEq(test(1, 2, 3), [1, 2, 3]);
     15 
     16 // Not optimizable case 1: the array has hole.
     17 function hole1(...args) {
     18  args[4] = 5;
     19  return makeArray(...args);
     20 }
     21 assertDeepEq(hole1(1, 2, 3), [1, 2, 3, undefined, 5]);
     22 
     23 function hole2(...args) {
     24  args.length = 5;
     25  return makeArray(...args);
     26 }
     27 assertDeepEq(hole2(1, 2, 3), [1, 2, 3, undefined, undefined]);
     28 
     29 function hole3(...args) {
     30  delete args[1];
     31  return makeArray(...args);
     32 }
     33 assertDeepEq(hole3(1, 2, 3), [1, undefined, 3]);
     34 
     35 // Not optimizable case 2: array[@@iterator] is modified.
     36 function modifiedIterator(...args) {
     37  args[Symbol.iterator] = function*() {
     38    for (let i = 0; i < this.length; i++)
     39      yield this[i] * 10;
     40  };
     41  return makeArray(...args);
     42 }
     43 assertDeepEq(modifiedIterator(1, 2, 3), [10, 20, 30]);
     44 
     45 // Not optimizable case 3: the array's prototype is modified.
     46 function modifiedProto(...args) {
     47  args.__proto__ = {
     48    __proto__: Array.prototype,
     49    *[Symbol.iterator]() {
     50      for (let i = 0; i < this.length; i++)
     51        yield this[i] * 10;
     52    }
     53  };
     54  return makeArray(...args);
     55 }
     56 assertDeepEq(modifiedProto(1, 2, 3), [10, 20, 30]);
     57 
     58 // Not optimizable case 4: Array.prototype[@@iterator] is modified.
     59 let ArrayValues = Array.prototype[Symbol.iterator];
     60 Array.prototype[Symbol.iterator] = function*() {
     61  for (let i = 0; i < this.length; i++)
     62    yield this[i] * 10;
     63 };
     64 assertDeepEq(test(1, 2, 3), [10, 20, 30]);
     65 Array.prototype[Symbol.iterator] = ArrayValues;
     66 
     67 // Not optimizable case 5: %ArrayIteratorPrototype%.next is modified.
     68 let ArrayIteratorPrototype = Object.getPrototypeOf(Array.prototype[Symbol.iterator]());
     69 let i = 1;
     70 ArrayIteratorPrototype.next = function() {
     71  return { done: i % 4 == 0, value: 10 * i++ };
     72 };
     73 assertDeepEq(test(1, 2, 3), [10, 20, 30]);