summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/saved-stacks/async-implicit.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/saved-stacks/async-implicit.js')
-rw-r--r--js/src/jit-test/tests/saved-stacks/async-implicit.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/saved-stacks/async-implicit.js b/js/src/jit-test/tests/saved-stacks/async-implicit.js
new file mode 100644
index 0000000000..d0b9328906
--- /dev/null
+++ b/js/src/jit-test/tests/saved-stacks/async-implicit.js
@@ -0,0 +1,52 @@
+// Test AutoSetAsyncStackForNewCalls's IMPLICIT kind.
+
+// Given a SavedFrame stack, return a string listing the frame's function names
+// and their async causes, if any.
+function stackFunctions(stack) {
+ const frames = [];
+ for (; stack; stack = stack.parent || stack.asyncParent) {
+ if (!stack.functionDisplayName) {
+ frames.push('(top level)');
+ } else if (stack.asyncCause) {
+ frames.push(`${stack.asyncCause}*${stack.functionDisplayName}`);
+ } else {
+ frames.push(stack.functionDisplayName);
+ }
+ }
+ return frames.join(', ');
+}
+
+let fakeStack = (function fake1() {
+ function fake2() {
+ return saveStack();
+ }
+ return fake2();
+})();
+
+function bindAndExpect(options, expected) {
+ function bindee() {
+ assertEq(stackFunctions(saveStack()), expected);
+ }
+
+ return bindToAsyncStack(bindee, options);
+}
+
+function caller(f) {
+ return f();
+}
+
+// An explicit async stack always overrides the actual callers of the bindee.
+// An implicit async stack never overrides callers; it is only attached when
+// the stack is otherwise empty.
+caller(bindAndExpect({ stack: fakeStack, cause: 'ano', explicit: false },
+ "bindee, caller, (top level)"));
+
+caller(bindAndExpect({ stack: fakeStack, cause: 'hi', explicit: true },
+ "bindee, hi*fake2, fake1, (top level)"));
+
+enqueueJob(bindAndExpect({ stack: fakeStack, cause: 'mita', explicit: false },
+ "bindee, mita*fake2, fake1, (top level)"));
+
+enqueueJob(bindAndExpect({ stack: fakeStack, cause: 'hana', explicit: true },
+ "bindee, hana*fake2, fake1, (top level)"));
+