summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/basic/withSourceHook.js
blob: 460c4efe1373700d9820ba54a1b1ee360a3a0f68 (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
53
54
55
56
// Check that withSourceHook passes URLs, propagates exceptions, and
// properly restores the original source hooks.

load(libdir + 'asserts.js');

// withSourceHook isn't defined if you pass the shell the --fuzzing-safe
// option. Skip this test silently, to avoid spurious failures.
if (typeof withSourceHook != 'function')
  quit(0);

var log = '';

// Establish an outermost source hook.
withSourceHook(function (url) {
  log += 'o';
  assertEq(url, 'outer');
  return '(function outer() { 3; })';
}, function () {
  log += 'O';
  // Verify that withSourceHook propagates exceptions thrown by source hooks.
  assertThrowsValue(function () {
    // Establish a source hook that throws.
    withSourceHook(function (url) {
      log += 'm';
      assertEq(url, 'middle');
      throw 'borborygmus'; // middle
    }, function () {
      log += 'M';
      // Establish an innermost source hook that does not throw,
      // and verify that it is in force.
      assertEq(withSourceHook(function (url) {
                                log += 'i';
                                assertEq(url, 'inner');
                                return '(function inner() { 1; })';
                              }, function () {
                                log += 'I';
                                return evaluate('(function inner() { 2; })',
                                                { fileName: 'inner', sourceIsLazy: true })
                                       .toSource();
                              }),
               '(function inner() { 1; })');
      // Verify that the source hook that throws has been reinstated.
      evaluate('(function middle() { })',
               { fileName: 'middle', sourceIsLazy: true })
      .toSource();
    });
  }, 'borborygmus');

  // Verify that the outermost source hook has been restored.
  assertEq(evaluate('(function outer() { 4; })',
                    { fileName: 'outer', sourceIsLazy: true })
           .toSource(),
           '(function outer() { 3; })');
});

assertEq(log, 'OMIimo');