summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/ion-gc.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/ion-gc.js')
-rw-r--r--js/src/jit-test/tests/wasm/ion-gc.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/ion-gc.js b/js/src/jit-test/tests/wasm/ion-gc.js
new file mode 100644
index 0000000000..358afb2548
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/ion-gc.js
@@ -0,0 +1,53 @@
+// |jit-test| skip-if: !getJitCompilerOptions()['baseline.enable']
+// These tests need at least baseline to make sense.
+
+const options = getJitCompilerOptions();
+const TRIGGER = options['baseline.warmup.trigger'] + 10;
+const ITER = 2 * TRIGGER;
+const EXCEPTION_ITER = TRIGGER + 5;
+
+for (let type of ['i32', 'f32', 'f64']) {
+ var instance = wasmEvalText(`(module
+ (func $add (export "add") (param ${type}) (param ${type}) (result ${type})
+ local.get 0
+ local.get 1
+ ${type}.add
+ )
+ )`).exports;
+
+ function loopBody(a, b) {
+ var caught = null;
+ try {
+ instance.add(a, b);
+ } catch(e) {
+ caught = e;
+ }
+ assertEq(!!caught, b === EXCEPTION_ITER);
+ }
+
+ var x = 0;
+ function main() {
+ for (var i = 0; i <= EXCEPTION_ITER; i++) {
+ loopBody(i + 1, i + EXCEPTION_ITER + 1);
+
+ let otherArg = { valueOf() { return i|0; } };
+
+ if (i === EXCEPTION_ITER) {
+ x = { valueOf: function innerValueOf() {
+ // Supress callee.
+ instance = null;
+ // Suppress other arguments.
+ otherArg = null;
+ gc();
+ return 42;
+ }};
+ } else {
+ x = i;
+ }
+
+ loopBody({valueOf: function outerValueOf() { return x|0; }}, otherArg);
+ }
+ }
+
+ main();
+}