tor-browser

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

args-exists-own.js (2803B)


      1 // Test |Object.hasOwn| on arguments objects.
      2 
      3 function testBasic() {
      4  function arg0() { return Object.hasOwn(arguments, 0); }
      5  function arg1() { return Object.hasOwn(arguments, 1); }
      6  function arg100() { return Object.hasOwn(arguments, 100); }
      7  function argn1() { return Object.hasOwn(arguments, -1); }
      8  function argv(i) { return Object.hasOwn(arguments, i); }
      9 
     10  for (let i = 0; i < 100; ++i) {
     11    assertEq(arg0(), false);
     12    assertEq(arg0(1), true);
     13    assertEq(arg0(1, 2), true);
     14    assertEq(arg0(1, 2, 3), true);
     15    assertEq(arg0(1, 2, 3, 4), true);
     16    assertEq(arg0(1, 2, 3, 4, 5), true);
     17 
     18    assertEq(arg1(), false);
     19    assertEq(arg1(1), false);
     20    assertEq(arg1(1, 2), true);
     21    assertEq(arg1(1, 2, 3), true);
     22    assertEq(arg1(1, 2, 3, 4), true);
     23    assertEq(arg1(1, 2, 3, 4, 5), true);
     24 
     25    assertEq(arg100(), false);
     26    assertEq(arg100(1), false);
     27    assertEq(arg100(1, 2), false);
     28    assertEq(arg100(1, 2, 3), false);
     29    assertEq(arg100(1, 2, 3, 4), false);
     30    assertEq(arg100(1, 2, 3, 4, 5), false);
     31 
     32    assertEq(argn1(), false);
     33    assertEq(argn1(1), false);
     34    assertEq(argn1(1, 2), false);
     35    assertEq(argn1(1, 2, 3), false);
     36    assertEq(argn1(1, 2, 3, 4), false);
     37    assertEq(argn1(1, 2, 3, 4, 5), false);
     38 
     39    assertEq(argv(i & 3), (i&3) <= 0);
     40    assertEq(argv(i & 3, 1), (i&3) <= 1);
     41    assertEq(argv(i & 3, 1, 2), (i&3) <= 2);
     42    assertEq(argv(i & 3, 1, 2, 3), true);
     43    assertEq(argv(i & 3, 1, 2, 3, 4), true);
     44    assertEq(argv(i & 3, 1, 2, 3, 4, 5), true);
     45  }
     46 }
     47 testBasic();
     48 
     49 // Modifying |arguments.length| doesn't change the result.
     50 function testOverriddenLength() {
     51  function f(i) {
     52    if (i === 100) {
     53      arguments.length = 100;
     54    }
     55    return Object.hasOwn(arguments, 1);
     56  }
     57 
     58  for (let i = 0; i <= 150; ++i) {
     59    assertEq(f(i), false);
     60  }
     61 }
     62 testOverriddenLength();
     63 
     64 // Overridden elements are correctly detected.
     65 function testOverriddenElement() {
     66  function f(i) {
     67    if (i === 100) {
     68      arguments[1] = 0;
     69    }
     70    return Object.hasOwn(arguments, 1);
     71  }
     72 
     73  for (let i = 0; i <= 150; ++i) {
     74    assertEq(f(i), i === 100);
     75  }
     76 }
     77 testOverriddenElement();
     78 
     79 // Deleted elements are correctly detected.
     80 function testDeletedElement() {
     81  function f(i) {
     82    if (i === 100) {
     83      delete arguments[0];
     84    }
     85    return Object.hasOwn(arguments, 0);
     86  }
     87 
     88  for (let i = 0; i <= 150; ++i) {
     89    assertEq(f(i), i !== 100);
     90  }
     91 }
     92 testDeletedElement();
     93 
     94 // Contrary to most other arguments object optimisations, forwarded arguments
     95 // don't inhibit optimising |Object.hasOwn|.
     96 function testForwardedArg() {
     97  function f(i) {
     98    function closedOver() {
     99      if (i === 100) i = 0;
    100    }
    101    closedOver();
    102    return Object.hasOwn(arguments, 0);
    103  }
    104 
    105  for (let i = 0; i <= 150; ++i) {
    106    assertEq(f(i), true);
    107  }
    108 }
    109 testForwardedArg();