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.js56
1 files changed, 56 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 000000000..460c4efe1
--- /dev/null
+++ b/js/src/jit-test/tests/basic/withSourceHook.js
@@ -0,0 +1,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');