summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/basic/withSourceHook.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/basic/withSourceHook.js')
-rw-r--r--js/src/jit-test/tests/basic/withSourceHook.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/basic/withSourceHook.js b/js/src/jit-test/tests/basic/withSourceHook.js
new file mode 100644
index 0000000000..5df79c9721
--- /dev/null
+++ b/js/src/jit-test/tests/basic/withSourceHook.js
@@ -0,0 +1,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');