tor-browser

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

interpreter-stacks.js (2998B)


      1 // |jit-test| --no-blinterp
      2 // Disable Baseline Interpreter and JITs because we only read information about
      3 // C++ Interpreter profiling frames.
      4 
      5 enableGeckoProfilingWithSlowAssertions();
      6 
      7 function assertStack(stack, expected) {
      8    assertEq(stack.length, expected.length);
      9    for (let i = 0; i < stack.length; i++) {
     10        // Use |split| to get rid of the file name.
     11        assertEq(stack[i].dynamicString.split(" (")[0], expected[i]);
     12    }
     13 }
     14 
     15 // We currently don't push entries for frames that were already on the stack
     16 // when the profiler was enabled.
     17 assertStack(readGeckoInterpProfilingStack(), []);
     18 
     19 function testBasic() {
     20    let g1 = function() {
     21        return readGeckoInterpProfilingStack();
     22    }
     23    let f1 = () => g1();
     24    assertStack(f1(), ["testBasic", "f1", "g1"]);
     25 
     26    // Test non-function frames.
     27    assertStack(evaluate("eval(`(function foo() { return readGeckoInterpProfilingStack(); })()`)"),
     28                ["testBasic", "@evaluate", "@evaluate line 1 > eval:1:1", "foo"]);
     29 }
     30 testBasic();
     31 testBasic();
     32 
     33 function testThrow() {
     34    let stacks = [];
     35    let thrower = function() {
     36        stacks.push(readGeckoInterpProfilingStack());
     37        throw 1;
     38    };
     39    let catcher = function() {
     40        try {
     41            thrower();
     42        } catch (e) {
     43            stacks.push(readGeckoInterpProfilingStack());
     44        }
     45    };
     46    catcher();
     47    assertEq(stacks.length, 2);
     48    assertStack(stacks[0], ["testThrow", "catcher", "thrower"]);
     49    assertStack(stacks[1], ["testThrow", "catcher"]);
     50 }
     51 testThrow();
     52 testThrow();
     53 
     54 function testSelfHosted() {
     55    let stacks = [1, 2, 3].map(function() {
     56        return readGeckoInterpProfilingStack();
     57    });
     58    assertEq(stacks.length, 3);
     59    for (var stack of stacks) {
     60        assertStack(stack, ["testSelfHosted", "map", "testSelfHosted/stacks<"]);
     61    }
     62 }
     63 testSelfHosted();
     64 testSelfHosted();
     65 
     66 function testGenerator() {
     67    let stacks = [];
     68    let generator = function*() {
     69        stacks.push(readGeckoInterpProfilingStack());
     70        yield 1;
     71        stacks.push(readGeckoInterpProfilingStack());
     72        yield 2;
     73        stacks.push(readGeckoInterpProfilingStack());
     74    };
     75    for (let x of generator()) {}
     76    assertStack(readGeckoInterpProfilingStack(), ["testGenerator"]);
     77 
     78    assertEq(stacks.length, 3);
     79    for (var stack of stacks) {
     80        assertStack(stack, ["testGenerator", "next", "generator"]);
     81    }
     82 }
     83 testGenerator();
     84 testGenerator();
     85 
     86 async function testAsync() {
     87    let stacks = [];
     88    let asyncFun = async function() {
     89        stacks.push(readGeckoInterpProfilingStack());
     90        await 1;
     91        stacks.push(readGeckoInterpProfilingStack());
     92    };
     93    await asyncFun();
     94    assertStack(readGeckoInterpProfilingStack(), ["AsyncFunctionNext", "testAsync"]);
     95 
     96    assertEq(stacks.length, 2);
     97    assertStack(stacks[0], ["testAsync", "asyncFun"]);
     98    assertStack(stacks[1], ["AsyncFunctionNext", "asyncFun"]);
     99 }
    100 testAsync();
    101 drainJobQueue();
    102 testAsync();
    103 drainJobQueue();
    104 
    105 disableGeckoProfiling();