tor-browser

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

spreadcall-not-optimized-dynamic-6b.js (1449B)


      1 // Tests when JSOP_OPTIMIZE_SPREADCALL no longer apply after the initial Ion
      2 // compilation.
      3 
      4 // JSOP_OPTIMIZE_SPREADCALL can be optimised when the following conditions
      5 // are fulfilled:
      6 //   (1) the argument is an array
      7 //   (2) the array has no hole
      8 //   (3) array[@@iterator] is not modified
      9 //   (4) the array's prototype is Array.prototype
     10 //   (5) Array.prototype[@@iterator] is not modified
     11 //   (6) %ArrayIteratorPrototype%.next is not modified
     12 
     13 function add(a, b) {
     14    return a + b;
     15 }
     16 
     17 // %ArrayIteratorPrototype%.next was modified.
     18 function test() {
     19    function maybeInvalidate() {
     20        // Use a WithStatement to prevent Ion-inlining. This ensures any
     21        // bailouts due to type changes don't occur in this function, but
     22        // instead in the caller.
     23        with ({});
     24 
     25        if (i === 1900) {
     26            var ArrayIteratorPrototype = Object.getPrototypeOf(Array.prototype[Symbol.iterator]());
     27            var ArrayIteratorPrototypeNext = ArrayIteratorPrototype.next;
     28            ArrayIteratorPrototype.next = function() {
     29                var res = ArrayIteratorPrototypeNext.call(this);
     30                if (!res.done) {
     31                    res.value += 2;
     32                }
     33                return res;
     34            };
     35        }
     36    }
     37    function fn(...rest) {
     38        maybeInvalidate();
     39        return add(...rest);
     40    }
     41    for (var i = 0; i < 4000; ++i) {
     42        assertEq(fn(1, 2), i < 1900 ? 3 : 7);
     43    }
     44 }
     45 test();