tor-browser

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

eval-scopes.js (1740B)


      1 function bytecode(f) {
      2    if (typeof disassemble !== "function")
      3        return "unavailable";
      4    var d = disassemble(f);
      5    return d.slice(d.indexOf("main:"), d.indexOf("\n\n"));
      6 }
      7 
      8 function hasGname(f, v, hasIt = true) {
      9    // Do a try-catch that prints the full stack, so we can tell
     10    // _which_ part of this test failed.
     11    try {
     12        var b = bytecode(f);
     13        if (b != "unavailable") {
     14            assertEq(b.includes(`GetGName "${v}"`), hasIt);
     15            assertEq(b.includes(`GetName "${v}"`), !hasIt);
     16        }
     17    } catch (e) {
     18        print(e.stack);
     19        throw e;
     20    }
     21 }
     22 
     23 var x = "outer";
     24 
     25 {
     26    let x = "inner";
     27    eval("function h() { assertEq(x, 'inner');} h()");
     28    eval("function h2() { (function nest() { assertEq(x, 'inner'); })(); } h2()");
     29 }
     30 
     31 // GNAME optimizations should work through lazy parsing.
     32 eval(`
     33     function h3() {
     34         assertEq(x, 'outer');
     35     }
     36     h3();
     37     hasGname(h3, 'x', true);
     38     `);
     39 eval(`
     40     function h4() {
     41         function nest() { assertEq(x, 'outer'); }
     42         nest();
     43         return nest;
     44     }
     45     hasGname(h4(), 'x', true);
     46     `);
     47 
     48 with ({}) {
     49    let x = "inner";
     50    eval("function j() { assertEq(x, 'inner');} j()");
     51    eval("function j2() { (function nest() { assertEq(x, 'inner'); })(); } j2()");
     52 }
     53 
     54 (function () {
     55    let x = "inner";
     56    eval("function l() { assertEq(x, 'inner');} l()");
     57    eval("function l2() { (function nest() { assertEq(x, 'inner'); })(); } l2()");
     58 })();
     59 
     60 var y1 = 5;
     61 eval(`
     62     'use strict';
     63     var y1 = 6;
     64     assertEq(y1, 6);
     65     (function() { assertEq(y1, 6); })()
     66     `);
     67 assertEq(y1, 5);
     68 
     69 eval(`
     70     'use strict';
     71     var y2 = 6;
     72     assertEq(y2, 6);
     73     (function() { assertEq(y2, 6); })()
     74     `);