summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/gc/incremental-abort.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/gc/incremental-abort.js')
-rw-r--r--js/src/jit-test/tests/gc/incremental-abort.js54
1 files changed, 54 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/gc/incremental-abort.js b/js/src/jit-test/tests/gc/incremental-abort.js
new file mode 100644
index 000000000..db42c7051
--- /dev/null
+++ b/js/src/jit-test/tests/gc/incremental-abort.js
@@ -0,0 +1,54 @@
+// Test aborting an incremental GC in all possible states
+
+if (!("gcstate" in this && "gczeal" in this && "abortgc" in this))
+ quit();
+
+gczeal(0);
+gc();
+
+function testAbort(zoneCount, objectCount, sliceCount, abortState)
+{
+ // Allocate objectCount objects in zoneCount zones and run a incremental
+ // shrinking GC.
+
+ var zones = [];
+ for (var i = 0; i < zoneCount; i++) {
+ var zone = newGlobal();
+ evaluate("var objects; " +
+ "function makeObjectGraph(objectCount) { " +
+ " objects = []; " +
+ " for (var i = 0; i < objectCount; i++) " +
+ " objects.push({i: i}); " +
+ "}",
+ { global: zone });
+ zone.makeObjectGraph(objectCount);
+ zones.push(zone);
+ }
+
+ var didAbort = false;
+ startgc(sliceCount, "shrinking");
+ while (gcstate() !== "NotActive") {
+ var state = gcstate();
+ if (state == abortState) {
+ abortgc();
+ didAbort = true;
+ break;
+ }
+
+ gcslice(sliceCount);
+ }
+
+ assertEq(gcstate(), "NotActive");
+ if (abortState)
+ assertEq(didAbort, true);
+
+ return zones;
+}
+
+gczeal(0);
+testAbort(10, 10000, 10000);
+testAbort(10, 10000, 10000, "Mark");
+testAbort(10, 10000, 10000, "Sweep");
+testAbort(10, 10000, 10000, "Compact");
+// Note: we do not yield automatically before Finalize or Decommit, as they yield internally.
+// Thus, we may not witness an incremental state in this phase and cannot test it explicitly.