summaryrefslogtreecommitdiffstats
path: root/tools/profiler/tests/xpcshell/test_enterjit_osr.js
blob: 86845ddc76ecf1e3815c9f44f43e6ac294ab5d68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Check that the EnterJIT frame, added by the JIT trampoline and
// usable by a native unwinder to resume unwinding after encountering
// JIT code, is pushed as expected.
function run_test() {
  // This test assumes that it's starting on an empty profiler stack.
  // (Note that the other profiler tests also assume the profiler
  // isn't already started.)
  Assert.ok(!Services.profiler.IsActive());

  const ms = 5;
  Services.profiler.StartProfiler(10000, ms, ["js"]);

  function has_arbitrary_name_in_stack() {
    // A frame for |arbitrary_name| has been pushed.  Do a sequence of
    // increasingly long spins until we get a sample.
    var delayMS = 5;
    while (1) {
      info("loop: ms = " + delayMS);
      const then = Date.now();
      do {
        let n = 10000;
        // eslint-disable-next-line no-empty
        while (--n) {} // OSR happens here
        // Spin in the hope of getting a sample.
      } while (Date.now() - then < delayMS);
      let profile = Services.profiler.getProfileData().threads[0];

      // Go through all of the stacks, and search for this function name.
      for (const sample of profile.samples.data) {
        const stack = getInflatedStackLocations(profile, sample);
        info(`The following stack was found: ${stack}`);
        for (var i = 0; i < stack.length; i++) {
          if (stack[i].match(/arbitrary_name/)) {
            // This JS sample was correctly found.
            return true;
          }
        }
      }

      // Continue running this function with an increasingly long delay.
      delayMS *= 2;
      if (delayMS > 30000) {
        return false;
      }
    }
  }
  Assert.ok(
    has_arbitrary_name_in_stack(),
    "A JS frame was found before the test timeout."
  );
  Services.profiler.StopProfiler();
}