summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/common/gc.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/common/gc.js')
-rw-r--r--testing/web-platform/tests/common/gc.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/testing/web-platform/tests/common/gc.js b/testing/web-platform/tests/common/gc.js
new file mode 100644
index 0000000000..ac43a4cfaf
--- /dev/null
+++ b/testing/web-platform/tests/common/gc.js
@@ -0,0 +1,52 @@
+/**
+ * Does a best-effort attempt at invoking garbage collection. Attempts to use
+ * the standardized `TestUtils.gc()` function, but falls back to other
+ * environment-specific nonstandard functions, with a final result of just
+ * creating a lot of garbage (in which case you will get a console warning).
+ *
+ * This should generally only be used to attempt to trigger bugs and crashes
+ * inside tests, i.e. cases where if garbage collection happened, then this
+ * should not trigger some misbehavior. You cannot rely on garbage collection
+ * successfully trigger, or that any particular unreachable object will be
+ * collected.
+ *
+ * @returns {Promise<undefined>} A promise you should await to ensure garbage
+ * collection has had a chance to complete.
+ */
+self.garbageCollect = async () => {
+ // https://testutils.spec.whatwg.org/#the-testutils-namespace
+ if (self.TestUtils?.gc) {
+ return TestUtils.gc();
+ }
+
+ // Use --expose_gc for V8 (and Node.js)
+ // to pass this flag at chrome launch use: --js-flags="--expose-gc"
+ // Exposed in SpiderMonkey shell as well
+ if (self.gc) {
+ return self.gc();
+ }
+
+ // Present in some WebKit development environments
+ if (self.GCController) {
+ return GCController.collect();
+ }
+
+ console.warn(
+ 'Tests are running without the ability to do manual garbage collection. ' +
+ 'They will still work, but coverage will be suboptimal.');
+
+ for (var i = 0; i < 1000; i++) {
+ gcRec(10);
+ }
+
+ function gcRec(n) {
+ if (n < 1) {
+ return {};
+ }
+
+ let temp = { i: "ab" + i + i / 100000 };
+ temp += "foo";
+
+ gcRec(n - 1);
+ }
+};