(module (memory 1 2) (type $ii (func (param i32) (result i32))) (import "env" "sleep" (func $sleep)) (import "env" "tunnel" (func $tunnel (param $x i32) (result i32))) (export "memory" (memory 0)) (export "factorial-recursive" (func $factorial-recursive)) (global $temp (mut i32) (i32.const 0)) (table 10 funcref) (elem (i32.const 5) $tablefunc) (func "minimal" (result i32) (call $sleep) (i32.const 21) ) (func "repeat" (result i32) ;; sleep twice, then return 42 (call $sleep) (call $sleep) (i32.const 42) ) (func "local" (result i32) (local $x i32) (local.set $x (i32.load (i32.const 0))) ;; a zero that the optimizer won't see (local.set $x (i32.add (local.get $x) (i32.const 10)) ;; add 10 ) (call $sleep) (local.get $x) ) (func "local2" (result i32) (local $x i32) (local.set $x (i32.load (i32.const 0))) ;; a zero that the optimizer won't see (local.set $x (i32.add (local.get $x) (i32.const 10)) ;; add 10 ) (call $sleep) (local.set $x (i32.add (local.get $x) (i32.const 12)) ;; add 12 more ) (local.get $x) ) (func "params" (param $x i32) (param $y i32) (result i32) (local.set $x (i32.add (local.get $x) (i32.const 17)) ;; add 10 ) (local.set $y (i32.add (local.get $y) (i32.const 1)) ;; add 12 more ) (call $sleep) (i32.add (local.get $x) (local.get $y)) ) (func $pre (global.set $temp (i32.const 1)) ) (func $inner (param $x i32) (if (i32.eqz (local.get $x)) (call $post)) (if (local.get $x) (call $sleep)) (if (i32.eqz (local.get $x)) (call $post)) ) (func $post (global.set $temp (i32.mul (global.get $temp) (i32.const 3) ) ) ) (func "deeper" (param $x i32) (result i32) (call $pre) (call $inner (local.get $x)) (call $post) (global.get $temp) ) (func $factorial-recursive (param $x i32) (result i32) (if (i32.eq (local.get $x) (i32.const 1) ) (return (i32.const 1)) ) (call $sleep) (return (i32.mul (local.get $x) (call $factorial-recursive (i32.sub (local.get $x) (i32.const 1) ) ) ) ) ) (func "factorial-loop" (param $x i32) (result i32) (local $i i32) (local $ret i32) (local.set $ret (i32.const 1)) (local.set $i (i32.const 2)) (loop $l (if (i32.gt_u (local.get $i) (local.get $x) ) (return (local.get $ret)) ) (local.set $ret (i32.mul (local.get $ret) (local.get $i) ) ) (call $sleep) (local.set $i (i32.add (local.get $i) (i32.const 1) ) ) (br $l) ) ) (func "end_tunnel" (param $x i32) (result i32) (local.set $x (i32.add (local.get $x) (i32.const 22)) ) (call $sleep) (i32.add (local.get $x) (i32.const 5)) ) (func "do_tunnel" (param $x i32) (result i32) (local.set $x (i32.add (local.get $x) (i32.const 11)) ) (local.set $x (call $tunnel (local.get $x)) ;; calls js which calls back into wasm for end_tunnel ) (call $sleep) (i32.add (local.get $x) (i32.const 33)) ) (func $tablefunc (param $y i32) (result i32) (local.set $y (i32.add (local.get $y) (i32.const 10)) ) (call $sleep) (i32.add (local.get $y) (i32.const 30)) ) (func "call_indirect" (param $x i32) (param $y i32) (result i32) (local.set $x (i32.add (local.get $x) (i32.const 1)) ) (call $sleep) (local.set $x (i32.add (local.get $x) (i32.const 3)) ) (local.set $y (call_indirect (type $ii) (local.get $y) (local.get $x)) ;; call function pointer x + 4, which will be 5 ) (local.set $y (i32.add (local.get $y) (i32.const 90)) ) (call $sleep) (i32.add (local.get $y) (i32.const 300)) ;; total is 10+30+90+300=430 + y's original value ) (func "if_else" (param $x i32) (param $y i32) (result i32) (if (i32.eq (local.get $x) (i32.const 1)) (local.set $y (i32.add (local.get $y) (i32.const 10)) ) (local.set $y (i32.add (local.get $y) (i32.const 20)) ) ) (if (i32.eq (local.get $x) (i32.const 1)) (local.set $y (i32.add (local.get $y) (i32.const 40)) ) (call $sleep) ) (if (i32.eq (local.get $x) (i32.const 1)) (call $sleep) (local.set $y (i32.add (local.get $y) (i32.const 90)) ) ) (if (i32.eq (local.get $x) (i32.const 1)) (call $sleep) (call $sleep) ) (local.set $y (i32.add (local.get $y) (i32.const 160)) ) (call $sleep) (local.set $y (i32.add (local.get $y) (i32.const 250)) ) (local.get $y) ) )