tor-browser

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

funcall-array.js (2178B)


      1 var emptyArray = [];
      2 var denseArray = [1, 2, 3, 4];
      3 var sparseArray = [1,,2,,3,,4];
      4 var bigArray = new Array();
      5 for (var i = 0; i < 128; i++) {
      6    bigArray.push(i);
      7 }
      8 var nonArray = {0:1, 1:2, 2:3, 3:4, length:2};
      9 var indexedGetterArray = new Array();
     10 Object.defineProperty(indexedGetterArray, '2', {get:function () { return 51; }});
     11 
     12 var ARRAYS = [emptyArray, denseArray, sparseArray, bigArray, nonArray, indexedGetterArray];
     13 
     14 var targetFun = function (a, b, c, d) {
     15    if (a === undefined)
     16        a = 0;
     17    if (b === undefined)
     18        b = 0;
     19    if (c === undefined)
     20        c = 0;
     21    if (d === undefined)
     22        d = 0;
     23    this.count += arguments.length + a + b + c + d;
     24 }
     25 
     26 var PERMUTATIONS = ARRAYS.length * ARRAYS.length;
     27 function arrayPermutation(num) {
     28    var idx1 = num % ARRAYS.length;
     29    var idx2 = ((num / ARRAYS.length)|0) % ARRAYS.length;
     30    var resultArray = [];
     31    resultArray.push(ARRAYS[idx1]);
     32    resultArray.push(ARRAYS[idx2]);
     33    return resultArray;
     34 }
     35 var EXPECTED_RESULTS = {
     36    0:0, 1:280, 2:200, 3:2680, 4:100, 5:1080, 6:280, 7:560, 8:480, 9:2960,
     37    10:380, 11:1360, 12:200, 13:480, 14:400, 15:2880, 16:300, 17:1280, 18:2680,
     38    19:2960, 20:2880, 21:5360, 22:2780, 23:3760, 24:100, 25:380, 26:300, 27:2780,
     39    28:200, 29:1180, 30:1080, 31:1360, 32:1280, 33:3760, 34:1180, 35:2160
     40 };
     41 
     42 var callerNo = 0;
     43 function generateCaller() {
     44    var fn;
     45 
     46    // Salt eval-string with callerNo to make sure eval caching doesn't take effect.
     47    var s = "function caller" + callerNo + "(fn, thisObj, arrays) {" +
     48            "  for (var i = 0; i < arrays.length; i++) {" +
     49            "    fn.apply(thisObj, arrays[i]);" +
     50            "  }" +
     51            "}" +
     52            "fn = caller" + callerNo + ";";
     53    eval(s);
     54    return fn;
     55 };
     56 
     57 function main() {
     58    for (var i = 0; i < PERMUTATIONS; i++) {
     59        var obj = {count:0};
     60        var arrs = arrayPermutation(i);
     61        var fn = generateCaller(arrs.length);
     62        // Loop 20 times so baseline compiler has chance to kick in and compile the scripts.
     63        for (var j = 0; j < 20; j++)
     64            fn(targetFun, obj, arrs);
     65        assertEq(obj.count, EXPECTED_RESULTS[i]);
     66    }
     67 }
     68 
     69 main();