summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/gc/finalizationRegistry-cleanupSome-recursive.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/gc/finalizationRegistry-cleanupSome-recursive.js')
-rw-r--r--js/src/jit-test/tests/gc/finalizationRegistry-cleanupSome-recursive.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/gc/finalizationRegistry-cleanupSome-recursive.js b/js/src/jit-test/tests/gc/finalizationRegistry-cleanupSome-recursive.js
new file mode 100644
index 0000000000..3245c1cff3
--- /dev/null
+++ b/js/src/jit-test/tests/gc/finalizationRegistry-cleanupSome-recursive.js
@@ -0,0 +1,51 @@
+// Test trying to call cleanupSome recursively in callback.
+
+// 0: Initial state.
+// 1: Attempt recursive calls.
+// 2: After recursive calls.
+let state = 0;
+
+let registry = new FinalizationRegistry(x => {
+ if (state === 0) {
+ state = 1;
+ try {
+ registry.cleanupSome();
+ } catch (e) {
+ // Pass the test if any error was thrown.
+ return;
+ } finally {
+ state = 2;
+ }
+ throw new Error("expected stack overflow error");
+ }
+
+ if (state === 1) {
+ registry.cleanupSome();
+ }
+});
+
+// Attempt to find the maximum supported stack depth.
+var stackSize = 0;
+function findStackSize(i) {
+ try {
+ stackSize = i;
+ findStackSize(i + 1);
+ } catch (e) {
+ return;
+ }
+}
+findStackSize(0);
+
+// Multiply the calculated stack size by some factor just to be on the safe side.
+const exceedStackDepthLimit = stackSize * 5;
+
+let values = [];
+for (let i = 0; i < exceedStackDepthLimit; ++i) {
+ let v = {};
+ registry.register(v, i);
+ values.push(v);
+}
+values.length = 0;
+
+gc();
+drainJobQueue();