tor-browser

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

spreadsupercall-optimization.js (1420B)


      1 // Test case adapted from "apply-optimization.js" to test SpreadNew instead of FunApply.
      2 
      3 // Uses fewer iterations than "apply-optimization.js" to keep the overall runtime reasonable.
      4 const iterations = 40;
      5 
      6 function make(k) {
      7    var a = new Array(k);
      8    for ( let i=0 ; i < k ; i++ )
      9        a[i] = {}
     10    return a;
     11 }
     12 
     13 class Base {
     14    constructor() {
     15        // Ensure |new.target| and |this| are correct.
     16        assertEq(new.target, g);
     17        assertEq(typeof this, "object");
     18        assertEq(Object.getPrototypeOf(this), g.prototype);
     19 
     20        // Returns a Number object, because constructor calls need to return an object!
     21        return new Number(arguments.length);
     22    }
     23 }
     24 
     25 class g extends Base {
     26    constructor(...args) {
     27        super(...args);
     28    }
     29 }
     30 
     31 function f(a) {
     32    var sum = 0;
     33    for ( let i=0 ; i < iterations ; i++ )
     34        sum += new g(...a);
     35    return sum;
     36 }
     37 
     38 function time(k, t) {
     39    var then = Date.now();
     40    assertEq(t(), iterations*k);
     41    var now = Date.now();
     42    return now - then;
     43 }
     44 
     45 function p(v) {
     46    // Uncomment to see timings
     47    // print(v);
     48 }
     49 
     50 f(make(200));
     51 
     52 // There is currently a cutoff after 375 where we bailout in order to avoid
     53 // handling very large stack frames.  This slows the operation down by a factor
     54 // of 100 or so.
     55 
     56 p(time(374, () => f(make(374))));
     57 p(time(375, () => f(make(375))));
     58 p(time(376, () => f(make(376))));
     59 p(time(377, () => f(make(377))));