// |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();
}
