summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/ion-error-throw.js
blob: c760dbe2375af72b191f21ed578aa8a2d0c13d09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// |jit-test| skip-if: !getJitCompilerOptions()['baseline.enable']
// These tests need at least baseline to make sense.

const { assertStackTrace, startProfiling, endProfiling, assertEqPreciseStacks } = WasmHelpers;

enableGeckoProfiling();

let { add } = wasmEvalText(`(module
    (func (export "add") (param i32) (param i32) (result i32)
     local.get 0
     i32.const 42
     i32.eq
     if
         unreachable
     end

     local.get 0
     local.get 1
     i32.add
    )
)`).exports;

const SLOW_ENTRY_STACK = ['', '!>', '0,!>', '!>', ''];
const FAST_ENTRY_STACK = ['', '>', '0,>', '>', ''];
const FAST_ENTRY_STACK_THROW = ['', '>', '0,>', '>', '', '>', ''];
const INLINED_CALL_STACK = ['', '0', ''];

function main() {
    for (let i = 0; i < 50; i++) {
        startProfiling();
        try {
            assertEq(add(i, i+1), 2*i+1);
        } catch (e) {
            assertEq(i, 42);
            assertEq(e.message.includes("unreachable"), true);
            assertStackTrace(e, ['wasm-function[0]', 'main', '']);
        }
        let stack = endProfiling();
        assertEqPreciseStacks(stack, [INLINED_CALL_STACK, FAST_ENTRY_STACK, FAST_ENTRY_STACK_THROW, SLOW_ENTRY_STACK]);
    }
}

main();