call
call calls a function, return_call being the tail-call version of it. call_indirect calls a function in a table with the return_call_indirect tail-call version as well.
Examples
Calling the greet function imported from JavaScript using call:
Try it
(module ;; Import the `greet` function from the environment (import "env" "greet" (func $greet)) (func ;; Call the imported `greet` function call $greet ) ;; Automatically run the first function when the module starts (start 1) ) const url = "{%wasm-url%}"; await WebAssembly.instantiateStreaming(fetch(url), { env: { greet() { console.log("Hello"); // Expected output: "Hello" }, }, }); Calculating factorial for a number using return_call and logging the result using the exported fac function:
Try it
(module ;; Calculate the factorial of a number (func $fac (export "fac") (param $x i64) (result i64) ;; Call the `fac-aux` function with $x and 1 parameters (return_call $fac-aux (local.get $x) (i64.const 1)) ) ;; Perform the factorial calculation (func $fac-aux (param $x i64) (param $r i64) (result i64) ;; If $x is zero, return the accumulated result $r (if (result i64) (i64.eqz (local.get $x)) (then (return (local.get $r))) (else ;; Otherwise, recursively call `fac-aux` with $x-1 and $x*$r (return_call $fac-aux (i64.sub (local.get $x) (i64.const 1)) (i64.mul (local.get $x) (local.get $r)) ) ) ) ) ) const url = "{%wasm-url%}"; const { instance } = await WebAssembly.instantiateStreaming(fetch(url)); const result = instance.exports.fac(5n); console.log(result); // Expected output: 120n Syntax
wat
call $greet | Instruction | Binary opcode |
|---|---|
call | 0x10 |
call_indirect | 0x11 |
return_call | 0x12 |
return_call_indirect | 0x13 |