diff options
Diffstat (limited to '')
-rw-r--r-- | js/src/jit-test/tests/wasm/ion-gc.js | 53 |
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(); +} |