tor-browser

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

tobool.js (3106B)


      1 var success         = 0;
      2 var expected_bool   = 0;
      3 var expected_int    = 0;
      4 var expected_double = 0;
      5 var expected_string = 0;
      6 var expected_object = 0;
      7 var expected_symbol = 0;
      8 
      9 function test_type_stable_ic() {
     10    // Initialize as falsy where possible.
     11    var a = undefined; // No Change, never succeeds
     12    var b = null;      // No Change, never succeeds
     13    var c = false;     // Alternate between true and false.
     14    var d = 0;         // Int32 cache checker, change int values
     15    var e = "";        // String cache checker, change string values
     16    var f = Symbol();  // No change, always succeed, no cache.
     17    var g = {};        // Change objects, always succeed.
     18    var h = -0;        // Double cache checker, change double values.
     19 
     20    for (var i =0; i < 30; i++) {
     21        // Switch between values to ensure the caches fire.
     22        switch (i % 3) {
     23            case 0:
     24                d = 0;
     25                e = "hi"; expected_string++;
     26                c = true; expected_bool++;
     27                h = 0;
     28                break;
     29            case 1:
     30                d = 1; expected_int++;
     31                e = "";
     32                c = false;
     33                h = NaN;
     34                break;
     35            case 2:
     36                d = 2; expected_int++;
     37                h = 1.234; expected_double++;
     38                g = {};
     39                break;
     40        }
     41 
     42        if (a) { success++; }
     43        if (b) { success++; }
     44        if (c) { success++; }
     45        if (d) { success++; }
     46        if (e) { success++; }
     47        if (f) { success++; } expected_symbol++; // Symbol succeed
     48        if (g) { success++; } expected_object++; // Object success
     49        if (h) { success++; }
     50    }
     51 }
     52 
     53 test_type_stable_ic();
     54 
     55 assertEq(success, expected_bool + expected_double + expected_int + expected_object + expected_string + expected_symbol);
     56 
     57 
     58 // Test cache failures.
     59 function helper(fun, arg, n)
     60 {
     61    var r = 0;
     62    for (var i = 0; i < n; i++) {
     63        r = fun(arg);
     64    }
     65    return r ? 1 : 0;
     66 }
     67 
     68 function test_transition(fun, load, test, before, after) {
     69    var a = helper(fun, load, 30);
     70    var x = helper(fun, test, 5)
     71    assertEq(a, before);
     72    assertEq(x, after)
     73 }
     74 
     75 var fun1 = (x) => { if (x) return true; else return false; };
     76 var fun2 = (x) => { if (x) return true; else return false; };
     77 var fun3 = (x) => { if (x) return true; else return false; };
     78 var fun4 = (x) => { if (x) return true; else return false; };
     79 var fun5 = (x) => { if (x) return true; else return false; };
     80 var fun6 = (x) => { if (x) return true; else return false; };
     81 var fun7 = (x) => { if (x) return true; else return false; };
     82 var fun8 = (x) => { if (x) return true; else return false; };
     83 
     84 // NaN -> Int32
     85 test_transition(fun1, NaN, 1, 0, 1);
     86 test_transition(fun2, 1, NaN, 1, 0);
     87 // NaN -> Object / Object -> NaN
     88 test_transition(fun3, NaN, {}, 0, 1);
     89 test_transition(fun4, {}, NaN, 1, 0);
     90 // Object -> null / null -> Object
     91 test_transition(fun5, {}, null, 1, 0);
     92 test_transition(fun6, null, {},  0, 1);
     93 // Symbol -> null, null -> Symbol
     94 test_transition(fun7, Symbol('hi'), null, 1, 0);
     95 test_transition(fun8, null, Symbol('lo'),  0, 1);