tor-browser

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

simple.js (14586B)


      1 // |jit-test| --code-coverage
      2 
      3 // Currently the Jit integration has a few issues, let's keep this test
      4 // case deterministic.
      5 //
      6 //  - Baseline OSR increments the loop header twice.
      7 //  - Ion is not updating any counter yet.
      8 //
      9 if (getJitCompilerOptions()["ion.warmup.trigger"] != 30)
     10  setJitCompilerOption("ion.warmup.trigger", 30);
     11 if (getJitCompilerOptions()["baseline.warmup.trigger"] != 10)
     12  setJitCompilerOption("baseline.warmup.trigger", 10);
     13 
     14 /*
     15 * These test cases are annotated with the output produced by LCOV [1].  Comment
     16 * starting with //<key> without any spaces are used as a reference for the code
     17 * coverage output.  Any "$" in these line comments are replaced by the current
     18 * line number, and any "%" are replaced with the current function name (defined
     19 * by the FN key).
     20 *
     21 * [1]  http://ltp.sourceforge.net/coverage/lcov/geninfo.1.php
     22 */
     23 function checkLcov(fun) {
     24  var keys = [ "TN", "SF", "FN", "FNDA", "FNF", "FNH", "BRDA", "BRF", "BRH", "DA", "LF", "LH" ];
     25  function startsWithKey(s) {
     26    for (k of keys) {
     27      if (s.startsWith(k))
     28        return true;
     29    }
     30    return false;
     31  };
     32 
     33  // Extract the body of the function, as the code to be executed.
     34  var source = fun.toString();
     35  source = source.slice(source.indexOf('{') + 1, source.lastIndexOf('}'));
     36 
     37  // Extract comment starting with the previous keys, as a reference of the
     38  // output expected from getLcovInfo.
     39  var lcovRef = [];
     40  var currLine = 0;
     41  var currFun = "<badfunction>";
     42  for (var line of source.split('\n')) {
     43    currLine++;
     44    for (var comment of line.split("//").slice(1)) {
     45      if (!startsWithKey(comment))
     46        continue;
     47      comment = comment.trim();
     48      if (comment.startsWith("FN:"))
     49        currFun = comment.split(',')[1];
     50      comment = comment.replace('$', currLine);
     51      comment = comment.replace('%', currFun);
     52      lcovRef.push(comment);
     53    }
     54  }
     55 
     56  // Evaluate the code, and generate the Lcov result from the execution.
     57  // Enabling LCov disables lazy parsing, as we rely on the ZoneCellIter to
     58  // emulate the behaviour of the finalizer.
     59  var g = newGlobal();
     60  g.eval(source);
     61  var lcovResRaw = getLcovInfo(g);
     62 
     63  // Check that all the lines are present the result.
     64  var lcovRes = lcovResRaw.split('\n');
     65  for (ref of lcovRef) {
     66    if (lcovRes.indexOf(ref) == -1) {
     67      print("Cannot find `" + ref + "` in the following Lcov result:\n", lcovResRaw);
     68      print("In the following source:\n", source);
     69      assertEq(true, false);
     70    }
     71  }
     72 }
     73 
     74 checkLcov(function () { //FN:$,top-level //FNDA:1,%
     75  ",".split(','); //DA:$,1
     76  //FNF:1
     77  //FNH:1
     78  //LF:1
     79  //LH:1
     80 });
     81 
     82 checkLcov(function () { //FN:$,top-level //FNDA:1,%
     83  function f() {    //FN:$,f
     84    ",".split(','); //DA:$,0
     85  }
     86  ",".split(',');   //DA:$,1
     87  //FNF:2
     88  //FNH:1
     89  //LF:2
     90  //LH:1
     91 });
     92 
     93 checkLcov(function () { //FN:$,top-level //FNDA:1,%
     94  function f() {    //FN:$,f //FNDA:1,%
     95    ",".split(','); //DA:$,1
     96  }
     97  f();              //DA:$,1
     98  //FNF:2
     99  //FNH:2
    100  //LF:2
    101  //LH:2
    102 });
    103 
    104 checkLcov(function () { ','.split(','); //FN:$,top-level //FNDA:1,% //DA:$,1
    105  //FNF:1
    106  //FNH:1
    107  //LF:1
    108  //LH:1
    109 });
    110 
    111 checkLcov(function () { function f() { ','.split(','); } //FN:$,top-level //FNDA:1,% //FN:$,f //FNDA:1,f //DA:$,1
    112  f(); //DA:$,1
    113  //FNF:2
    114  //FNH:2
    115  //LF:2
    116  //LH:2
    117 });
    118 
    119 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    120  var l = ",".split(','); //DA:$,1
    121  if (l.length == 3)      //DA:$,1 //BRDA:$,0,0,1 //BRDA:$,0,1,0
    122    l.push('');           //DA:$,0
    123  l.pop();                //DA:$,1
    124  //FNF:1
    125  //FNH:1
    126  //LF:4
    127  //LH:3
    128  //BRF:2
    129  //BRH:1
    130 });
    131 
    132 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    133  var l = ",".split(','); //DA:$,1
    134  if (l.length == 2)      //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1
    135    l.push('');           //DA:$,1
    136  l.pop();                //DA:$,1
    137  //FNF:1
    138  //FNH:1
    139  //LF:4
    140  //LH:4
    141  //BRF:2
    142  //BRH:1
    143 });
    144 
    145 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    146  var l = ",".split(','); //DA:$,1
    147  if (l.length == 3)      //DA:$,1 //BRDA:$,0,0,1 //BRDA:$,0,1,0
    148    l.push('');           //DA:$,0
    149  else
    150    l.pop();              //DA:$,1
    151  //FNF:1
    152  //FNH:1
    153  //LF:4
    154  //LH:3
    155  //BRF:2
    156  //BRH:1
    157 });
    158 
    159 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    160  var l = ",".split(','); //DA:$,1
    161  if (l.length == 2)      //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1
    162    l.push('');           //DA:$,1
    163  else
    164    l.pop();              //DA:$,0
    165  //FNF:1
    166  //FNH:1
    167  //LF:4
    168  //LH:3
    169  //BRF:2
    170  //BRH:1
    171 });
    172 
    173 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    174  var l = ",".split(','); //DA:$,1
    175  if (l.length == 2)      //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1
    176    l.push('');           //DA:$,1
    177  else {
    178    if (l.length == 1)    //DA:$,0 //BRDA:$,1,0,- //BRDA:$,1,1,-
    179      l.pop();            //DA:$,0
    180  }
    181  //FNF:1
    182  //FNH:1
    183  //LF:5
    184  //LH:3
    185  //BRF:4
    186  //BRH:1
    187 });
    188 
    189 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    190  function f(i) { //FN:$,f //FNDA:2,%
    191    var x = 0;    //DA:$,2
    192    while (i--) { // Currently OSR wrongly count the loop header twice.
    193                  // So instead of DA:$,12 , we have DA:$,13 .
    194      x += i;     //DA:$,10
    195      x = x / 2;  //DA:$,10
    196    }
    197    return x;     //DA:$,2
    198    //BRF:2
    199    //BRH:2
    200  }
    201 
    202  f(5);           //DA:$,1
    203  f(5);           //DA:$,1
    204  //FNF:2
    205  //FNH:2
    206 });
    207 
    208 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    209  try {                     //DA:$,1
    210    var l = ",".split(','); //DA:$,1
    211    if (l.length == 2) {    //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1
    212      l.push('');           //DA:$,1
    213      throw l;              //DA:$,1
    214    }
    215    l.pop();                //DA:$,0
    216  } catch (x) {             //DA:$,1
    217    x.pop();                //DA:$,1
    218  }
    219  //FNF:1
    220  //FNH:1
    221  //LF:8
    222  //LH:7
    223  //BRF:2
    224  //BRH:1
    225 });
    226 
    227 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    228  var l = ",".split(',');   //DA:$,1
    229  try {                     //DA:$,1
    230    try {                   //DA:$,1
    231      if (l.length == 2) {  //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1
    232        l.push('');         //DA:$,1
    233        throw l;            //DA:$,1
    234      }
    235      l.pop();              //DA:$,0
    236    } finally {             //DA:$,1
    237      l.pop();              //DA:$,1
    238    }
    239  } catch (x) {             //DA:$,1
    240  }
    241  //FNF:1
    242  //FNH:1
    243  //LF:10
    244  //LH:9
    245  //BRF:4
    246  //BRH:2
    247 });
    248 
    249 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    250  function f() {            //FN:$,f //FNDA:1,%
    251    throw 1;                //DA:$,1
    252    f();                    //DA:$,0
    253  }
    254  var l = ",".split(',');   //DA:$,1
    255  try {                     //DA:$,1
    256    f();                    //DA:$,1
    257    f();                    //DA:$,0
    258  } catch (x) {             //DA:$,1
    259  }
    260  //FNF:2
    261  //FNH:2
    262  //LF:7
    263  //LH:5
    264  //BRF:0
    265  //BRH:0
    266 });
    267 
    268 // Test TableSwitch opcode
    269 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    270  var l = ",".split(','); //DA:$,1
    271  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0 //BRDA:$,0,4,0
    272    case 0:
    273      l.push('0');        //DA:$,0
    274      break;
    275    case 1:
    276      l.push('1');        //DA:$,0
    277      break;
    278    case 2:
    279      l.push('2');        //DA:$,1
    280      break;
    281    case 3:
    282      l.push('3');        //DA:$,0
    283      break;
    284  }
    285  l.pop();                //DA:$,1
    286  //FNF:1
    287  //FNH:1
    288  //LF:7
    289  //LH:4
    290  //BRF:5
    291  //BRH:1
    292 });
    293 
    294 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    295  var l = ",".split(','); //DA:$,1
    296  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0 //BRDA:$,0,4,0
    297    case 0:
    298      l.push('0');        //DA:$,0
    299    case 1:
    300      l.push('1');        //DA:$,0
    301    case 2:
    302      l.push('2');        //DA:$,1
    303    case 3:
    304      l.push('3');        //DA:$,1
    305  }
    306  l.pop();                //DA:$,1
    307  //FNF:1
    308  //FNH:1
    309  //LF:7
    310  //LH:5
    311  //BRF:5
    312  //BRH:1
    313 });
    314 
    315 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    316  var l = ",".split(','); //DA:$,1
    317                          // Branches are ordered, and starting at 0
    318  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,1 //BRDA:$,0,1,0 //BRDA:$,0,2,0 //BRDA:$,0,3,0 //BRDA:$,0,4,0
    319    case 5:
    320      l.push('5');        //DA:$,0
    321    case 4:
    322      l.push('4');        //DA:$,0
    323    case 3:
    324      l.push('3');        //DA:$,0
    325    case 2:
    326      l.push('2');        //DA:$,1
    327  }
    328  l.pop();                //DA:$,1
    329  //FNF:1
    330  //FNH:1
    331  //LF:7
    332  //LH:4
    333  //BRF:5
    334  //BRH:1
    335 });
    336 
    337 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    338  var l = ",".split(','); //DA:$,1
    339  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,1 //BRDA:$,0,1,0 //BRDA:$,0,2,0
    340    case 2:
    341      l.push('2');        //DA:$,1
    342    case 5:
    343      l.push('5');        //DA:$,1
    344  }
    345  l.pop();                //DA:$,1
    346  //FNF:1
    347  //FNH:1
    348  //LF:5
    349  //LH:5
    350  //BRF:3
    351  //BRH:1
    352 });
    353 
    354 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    355  var l = ",".split(','); //DA:$,1
    356  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1 //BRDA:$,0,2,0
    357    case 3:
    358      l.push('1');        //DA:$,0
    359    case 5:
    360      l.push('5');        //DA:$,0
    361  }
    362  l.pop();                //DA:$,1
    363  //FNF:1
    364  //FNH:1
    365  //LF:5
    366  //LH:3
    367  //BRF:3
    368  //BRH:1
    369 });
    370 
    371 // Unfortunately the differences between switch implementations leaks in the
    372 // code coverage reports.
    373 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    374  function f(a) {         //FN:$,f //FNDA:2,%
    375    return a;             //DA:$,2
    376  }
    377  var l = ",".split(','); //DA:$,1
    378  switch (l.length) {     //DA:$,1
    379    case f(-42):          //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1
    380      l.push('1');        //DA:$,0
    381    case f(51):           //DA:$,1 //BRDA:$,1,0,0 //BRDA:$,1,1,1
    382      l.push('5');        //DA:$,0
    383  }
    384  l.pop();                //DA:$,1
    385  //FNF:2
    386  //FNH:2
    387  //LF:8
    388  //LH:6
    389  //BRF:4
    390  //BRH:2
    391 });
    392 
    393 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    394  var l = ",".split(','); //DA:$,1
    395  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,1 //BRDA:$,0,2,0 //BRDA:$,0,3,0
    396    case 0:
    397    case 1:
    398      l.push('0');        //DA:$,0
    399      l.push('1');        //DA:$,0
    400    case 2:
    401      l.push('2');        //DA:$,1
    402    case 3:
    403      l.push('3');        //DA:$,1
    404  }
    405  l.pop();                //DA:$,1
    406  //FNF:1
    407  //FNH:1
    408  //LF:7
    409  //LH:5
    410  //BRF:4
    411  //BRH:1
    412 });
    413 
    414 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    415  var l = ",".split(','); //DA:$,1
    416  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0
    417    case 0:
    418      l.push('0');        //DA:$,0
    419    case 1:
    420      l.push('1');        //DA:$,0
    421    case 2:
    422    case 3:
    423      l.push('2');        //DA:$,1
    424      l.push('3');        //DA:$,1
    425  }
    426  l.pop();                //DA:$,1
    427  //FNF:1
    428  //FNH:1
    429  //LF:7
    430  //LH:5
    431  //BRF:4
    432  //BRH:1
    433 });
    434 
    435 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    436  var l = ",".split(','); //DA:$,1
    437  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0
    438    case 0:
    439      l.push('0');        //DA:$,0
    440    case 1:
    441    default:
    442      l.push('1');        //DA:$,0
    443    case 2:
    444      l.push('2');        //DA:$,1
    445    case 3:
    446      l.push('3');        //DA:$,1
    447  }
    448  l.pop();                //DA:$,1
    449  //FNF:1
    450  //FNH:1
    451  //LF:7
    452  //LH:5
    453  //BRF:4
    454  //BRH:1
    455 });
    456 
    457 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    458  var l = ",".split(','); //DA:$,1
    459  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0
    460    case 0:
    461      l.push('0');        //DA:$,0
    462    case 1:
    463      l.push('1');        //DA:$,0
    464    default:
    465    case 2:
    466      l.push('2');        //DA:$,1
    467    case 3:
    468      l.push('3');        //DA:$,1
    469  }
    470  l.pop();                //DA:$,1
    471  //FNF:1
    472  //FNH:1
    473  //LF:7
    474  //LH:5
    475  //BRF:4
    476  //BRH:1
    477 });
    478 
    479 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    480  var l = ",".split(','); //DA:$,1
    481  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0 //BRDA:$,0,4,0
    482    case 0:
    483      l.push('0');        //DA:$,0
    484    case 1:
    485      l.push('1');        //DA:$,0
    486    default:
    487      l.push('default');  //DA:$,0
    488    case 2:
    489      l.push('2');        //DA:$,1
    490    case 3:
    491      l.push('3');        //DA:$,1
    492  }
    493  l.pop();                //DA:$,1
    494  //FNF:1
    495  //FNH:1
    496  //LF:8
    497  //LH:5
    498  //BRF:5
    499  //BRH:1
    500 });
    501 
    502 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    503  var l = ",".split(','); //DA:$,1
    504  switch (l.length) {     //DA:$,1 //BRDA:$,0,0,0 //BRDA:$,0,1,0 //BRDA:$,0,2,1 //BRDA:$,0,3,0
    505    case 0:
    506      l.push('0');        //DA:$,0
    507    case 1:
    508      l.push('1');        //DA:$,0
    509    default:
    510      l.push('2');        //DA:$,1
    511    case 3:
    512      l.push('3');        //DA:$,1
    513  }
    514  l.pop();                //DA:$,1
    515  //FNF:1
    516  //FNH:1
    517  //LF:7
    518  //LH:5
    519  //BRF:4
    520  //BRH:1
    521 });
    522 
    523 checkLcov(function () { //FN:$,top-level //FNDA:1,%
    524  var l = ','.split(','); //DA:$,1
    525  if (l.length === 45) {  //DA:$,1 //BRDA:$,0,0,1 //BRDA:$,0,1,0
    526    switch (l[0]) {       //DA:$,0 //BRDA:$,1,0,- //BRDA:$,1,1,-
    527      case ',':
    528        l.push('0');      //DA:$,0
    529      default:
    530        l.push('1');      //DA:$,0
    531    }
    532  }
    533  l.pop();                //DA:$,1
    534  //FNF:1
    535  //FNH:1
    536  //LF:6
    537  //LH:3
    538  //BRF:4
    539  //BRH:1
    540 });
    541 
    542 // These tests are not included in ../debug/Script-getOffsetsCoverage-01.js
    543 // because we're specifically testing a feature of Lcov output that
    544 // Debugger.Script doesn't have (the aggregation of hits that are on the
    545 // same line but in different functions).
    546 {
    547    checkLcov(function () { //FN:$,top-level //FNDA:1,%
    548        function f() { return 0; } var l = f(); //DA:$,2
    549        //FNF:2
    550        //FNH:2
    551        //LF:1
    552        //LH:1
    553    });
    554 
    555    // A single line has two functions on it, and both hit.
    556    checkLcov(function () { //FN:$,top-level //FNDA:1,%
    557        function f() { return 0; } function g() { return 1; } //DA:$,2
    558        var v = f() + g(); //DA:$,1
    559        //FNF:3
    560        //FNH:3
    561        //LF:2
    562        //LH:2
    563    });
    564 
    565    // A line has both function code and toplevel code, and only one of them hits.
    566    checkLcov(function () { //FN:$,top-level //FNDA:1,%
    567        if (1 === 2)  //DA:$,1
    568            throw "0 hits here"; function f() { return "1 hit here"; } //DA:$,1
    569        f();  //DA:$,1
    570        //FNF:2
    571        //FNH:2
    572        //LF:3
    573        //LH:3
    574    });
    575 }
    576 
    577 // These tests are not included in ../debug/Script-getOffsetsCoverage-01.js
    578 // because they are testing behaviour of --code-coverage.
    579 {
    580  // Test function names
    581  checkLcov(function () {
    582    //FN:1,top-level
    583    //FNDA:1,top-level
    584 
    585    var x = function() {};  //FN:$,x
    586    let y = function() {};  //FN:$,y
    587 
    588    let z = {
    589      z_method() { },       //FN:$,z_method
    590      get z_prop() { },     //FN:$,get z_prop
    591    }
    592  });
    593 }
    594 
    595 // If you add a test case here, do the same in
    596 // jit-test/tests/debug/Script-getOffsetsCoverage-01.js