tor-browser

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

getprop-primitive.js (1623B)


      1 // |jit-test| --ion-warmup-threshold=50
      2 setJitCompilerOption("offthread-compilation.enable", 0);
      3 gcPreserveCode();
      4 
      5 var testSet1 = [1, "", Symbol("a"), true];
      6 var testSet2 = [1, "", Symbol("a"), true, { bar: 5 }];
      7 
      8 Number.prototype.bar = 1;
      9 String.prototype.bar = 2;
     10 Symbol.prototype.bar = 3;
     11 Boolean.prototype.bar = 4;
     12 
     13 function assertEqIf(prev, curr, expected) {
     14    // Branch pruning absolutely want to get rid of the next branch
     15    // which causes bailouts, so we forbid inlining of this function.
     16    with({}){}
     17    if (prev) {
     18        assertEq(curr, expected);
     19        return false;
     20    }
     21    return true;
     22 }
     23 
     24 var f;
     25 var template = function (set) {
     26    var lastX = 0, x = 0, i = 0, y = 0;
     27    var cont = true;
     28    while (cont) { // OSR here.
     29        for (var i = 0; i < set.length; i++) {
     30            x = x + (inIon() ? 1 : 0);
     31            if (set[i].placeholder != set[(i + 1) % set.length].placeholder)
     32                y += 1;
     33        }
     34 
     35        // If we bailout in the inner loop, then x will have a smaller value
     36        // than the number of iterations.
     37        cont = assertEqIf(lastX > 0, x, set.length);
     38        if (inIon())
     39            lastX = x;
     40        x = 0;
     41    }
     42    return y;
     43 }
     44 
     45 // Set 1, Non existing properties.
     46 f = eval(`(${template})`.replace(".placeholder", ".foo"));
     47 f(testSet1);
     48 
     49 // Set 2, Non existing properties.
     50 f = eval(`(${template})`.replace(".placeholder", ".foo"));
     51 f(testSet2);
     52 
     53 // Set 1, Existing properties.
     54 f = eval(`(${template})`.replace(".placeholder", ".bar"));
     55 f(testSet1);
     56 
     57 // Set 2, Existing properties.
     58 f = eval(`(${template})`.replace(".placeholder", ".bar"));
     59 f(testSet2);