Source code

Revision control

Copy as Markdown

Other Tools

// |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');