summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/basic/withSourceHook.js
blob: 5df79c97214564b88a5060f6225fb11a393fd5a0 (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
// |jit-test| skip-if: typeof withSourceHook !== 'function'

// Check that withSourceHook passes URLs, propagates exceptions, and
// properly restores the original source hooks.

load(libdir + 'asserts.js');

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 })
                                       .toString();
                              }),
               'function inner() { 1; }');
      // Verify that the source hook that throws has been reinstated.
      evaluate('(function middle() { })',
               { fileName: 'middle', sourceIsLazy: true })
      .toString();
    });
  }, 'borborygmus');

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

assertEq(log, 'OMIimo');