tor-browser

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

regress-104077.js (7002B)


      1 /* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 /*
      7 *
      8 * Date: 10 October 2001
      9 * SUMMARY: Regression test for Bugzilla bug 104077
     10 * See http://bugzilla.mozilla.org/show_bug.cgi?id=104077
     11 * "JS crash: with/finally/return"
     12 *
     13 * Also http://bugzilla.mozilla.org/show_bug.cgi?id=120571
     14 * "JS crash: try/catch/continue."
     15 *
     16 * SpiderMonkey crashed on this code - it shouldn't.
     17 *
     18 * NOTE: the finally-blocks below should execute even if their try-blocks
     19 * have return or throw statements in them:
     20 *
     21 * ------- Additional Comment #76 From Mike Shaver 2001-12-07 01:21 -------
     22 * finally trumps return, and all other control-flow constructs that cause
     23 * program execution to jump out of the try block: throw, break, etc.  Once you
     24 * enter a try block, you will execute the finally block after leaving the try,
     25 * regardless of what happens to make you leave the try.
     26 *
     27 */
     28 //-----------------------------------------------------------------------------
     29 var UBound = 0;
     30 var BUGNUMBER = 104077;
     31 var summary = "Just testing that we don't crash on with/finally/return -";
     32 var status = '';
     33 var statusitems = [];
     34 var actual = '';
     35 var actualvalues = [];
     36 var expect= '';
     37 var expectedvalues = [];
     38 
     39 
     40 function addValues(obj)
     41 {
     42  var sum;
     43  with (obj)
     44  {
     45    try
     46    {
     47      sum = arg1 + arg2;
     48    }
     49    finally
     50    {
     51      return sum;
     52    }
     53  }
     54 }
     55 
     56 status = inSection(1);
     57 var obj = new Object();
     58 obj.arg1 = 1;
     59 obj.arg2 = 2;
     60 actual = addValues(obj);
     61 expect = 3;
     62 captureThis();
     63 
     64 
     65 
     66 function tryThis()
     67 {
     68  var sum = 4 ;
     69  var i = 0;
     70 
     71  while (sum < 10)
     72  {
     73    try
     74    {
     75      sum += 1;
     76      i += 1;
     77    }
     78    finally
     79    {
     80      print("In finally case of tryThis() function");
     81    }
     82  }
     83  return i;
     84 }
     85 
     86 status = inSection(2);
     87 actual = tryThis();
     88 expect = 6;
     89 captureThis();
     90 
     91 
     92 
     93 function myTest(x)
     94 {
     95  var obj = new Object();
     96  var msg;
     97 
     98  with (obj)
     99  {
    100    msg = (x != null) ? "NO" : "YES";
    101    print("Is the provided argument to myTest() null? : " + msg);
    102 
    103    try
    104    {
    105      throw "ZZZ";
    106    }
    107    catch(e)
    108    {
    109      print("Caught thrown exception = " + e);
    110    }
    111  }
    112 
    113  return 1;
    114 }
    115 
    116 status = inSection(3);
    117 actual = myTest(null);
    118 expect = 1;
    119 captureThis();
    120 
    121 
    122 
    123 function addValues_2(obj)
    124 {
    125  var sum = 0;
    126  with (obj)
    127  {
    128    try
    129    {
    130      sum = arg1 + arg2;
    131      with (arg3)
    132      {
    133        while (sum < 10)
    134        {
    135          try
    136          {
    137            if (sum > 5)
    138              return sum;
    139            sum += 1;
    140          }
    141          catch(e)
    142          {
    143            print('Caught an exception in addValues_2() function: ' + e);
    144          }
    145        }
    146      }
    147    }
    148    finally
    149    {
    150      return sum;
    151    }
    152  }
    153 }
    154 
    155 status = inSection(4);
    156 obj = new Object();
    157 obj.arg1 = 1;
    158 obj.arg2 = 2;
    159 obj.arg3 = new Object();
    160 obj.arg3.a = 10;
    161 obj.arg3.b = 20;
    162 actual = addValues_2(obj);
    163 expect = 6;
    164 captureThis();
    165 
    166 
    167 
    168 status = inSection(5);
    169 try
    170 {
    171  throw new A();
    172 }
    173 catch(e)
    174 {
    175 }
    176 finally
    177 {
    178  try
    179  {
    180    throw new A();
    181  }
    182  catch(e)
    183  {
    184  }
    185  finally
    186  {
    187    actual = 'a';
    188  }
    189  actual = 'b';
    190 }
    191 expect = 'b';
    192 captureThis();
    193 
    194 
    195 
    196 
    197 function testfunc(mode)
    198 {
    199  var obj = new Object();
    200  with (obj)
    201  {
    202    var num = 100;
    203    var str = "abc" ;
    204 
    205    if (str == null)
    206    {
    207      try
    208      {
    209        throw "authentication.0";
    210      }
    211      catch(e)
    212      {
    213      }
    214      finally
    215      {
    216      }
    217 
    218      return num;
    219    }
    220    else
    221    {
    222      try
    223      {
    224        if (mode == 0)
    225          throw "authentication.0";
    226        else
    227          mytest();
    228      }
    229      catch(e)
    230      {
    231      }
    232      finally
    233      {
    234      }
    235 
    236      return num;
    237    }
    238  }
    239 }
    240 
    241 status = inSection(6);
    242 actual = testfunc(0);
    243 expect = 100;
    244 captureThis();
    245 
    246 status = inSection(7);
    247 actual = testfunc();
    248 expect = 100; 
    249 captureThis();
    250 
    251 
    252 
    253 
    254 function entry_menu()
    255 {
    256  var document = new Object();
    257  var dialog = new Object();
    258  var num = 100;
    259 
    260  with (document)
    261  {
    262    with (dialog)
    263    {
    264      try
    265      {
    266        while (true)
    267        {
    268          return num;
    269        }
    270      }
    271      finally
    272      {
    273      }
    274    }
    275  }
    276 }
    277 
    278 status = inSection(8);
    279 actual = entry_menu();
    280 expect = 100;
    281 captureThis();
    282 
    283 
    284 
    285 
    286 function addValues_5(obj)
    287 {
    288  var sum = 0;
    289 
    290  with (obj)
    291  {
    292    try
    293    {
    294      sum = arg1 + arg2;
    295      with (arg3)
    296      {
    297        while (sum < 10)
    298        {
    299          try
    300          {
    301     if (sum > 5)
    302       return sum;
    303     sum += 1;
    304          }
    305          catch (e)
    306          {
    307            sum += 1;
    308          }
    309        }
    310      }
    311    }
    312    finally
    313    {
    314      try
    315      {
    316        sum += 1;
    317        print("In finally block of addValues_5() function: sum = " + sum);
    318      }
    319      catch (e)
    320      {
    321        sum += 1;
    322        print("In finally catch block of addValues_5() function: sum = " + sum + ", e = " + e);
    323      }
    324      finally
    325      {
    326        sum += 1;
    327        print("In finally finally block of addValues_5() function: sum = " + sum);
    328        return sum;
    329      }
    330    }
    331  }
    332 }
    333 
    334 status = inSection(11);
    335 obj = new Object();
    336 obj.arg1 = 1;
    337 obj.arg2 = 2;
    338 obj.arg3 = new Object();
    339 obj.arg3.a = 10;
    340 obj.arg3.b = 20;
    341 actual = addValues_5(obj);
    342 expect = 8;
    343 captureThis();
    344 
    345 
    346 
    347 
    348 function testObj(obj)
    349 {
    350  var x = 42;
    351 
    352  try
    353  {
    354    with (obj)
    355    {
    356      if (obj.p)
    357        throw obj.p;
    358      x = obj.q;
    359    }
    360  }
    361  finally
    362  {
    363    print("in finally block of testObj() function");
    364    return 999;
    365  }
    366 }
    367 
    368 status = inSection(12);
    369 obj = {p:43};
    370 actual = testObj(obj);
    371 expect = 999;
    372 captureThis();
    373 
    374 
    375 
    376 /*
    377 * Next two cases are from http://bugzilla.mozilla.org/show_bug.cgi?id=120571
    378 */
    379 function a120571()
    380 {
    381  while(0)
    382  {
    383    try
    384    {
    385    }
    386    catch(e)
    387    {
    388      continue;
    389    }
    390  }
    391 }
    392 
    393 // this caused a crash! Test to see that it doesn't now.
    394 print(a120571);
    395 
    396 // Now test that we have a non-null value for a120571.toString()
    397 status = inSection(13);
    398 try
    399 {
    400  actual = a120571.toString().match(/continue/)[0];
    401 }
    402 catch(e)
    403 {
    404  actual = 'FAILED! Did not find "continue" in function body';
    405 }
    406 expect = 'continue';
    407 captureThis();
    408 
    409 
    410 
    411 
    412 function b()
    413 {
    414  for(;;)
    415  {
    416    try
    417    {
    418    }
    419    catch(e)
    420    {
    421      continue;
    422    }
    423  }
    424 }
    425 
    426 // this caused a crash!!! Test to see that it doesn't now.
    427 print(b);
    428 
    429 // Now test that we have a non-null value for b.toString()
    430 status = inSection(14);
    431 try
    432 {
    433  actual = b.toString().match(/continue/)[0];
    434 }
    435 catch(e)
    436 {
    437  actual = 'FAILED! Did not find "continue" in function body';
    438 }
    439 expect = 'continue';
    440 captureThis();
    441 
    442 
    443 
    444 
    445 
    446 //-----------------------------------------------------------------------------
    447 test();
    448 //-----------------------------------------------------------------------------
    449 
    450 
    451 
    452 function captureThis()
    453 {
    454  statusitems[UBound] = status;
    455  actualvalues[UBound] = actual;
    456  expectedvalues[UBound] = expect;
    457  UBound++;
    458 }
    459 
    460 
    461 function test()
    462 {
    463  printBugNumber(BUGNUMBER);
    464  printStatus (summary);
    465 
    466  for (var i=0; i<UBound; i++)
    467  {
    468    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
    469  }
    470 }