1. WebAssembly
  2. Reference
  3. WebAssembly control flow instructions
  4. call

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

See also

Help improve MDN

Learn how to contribute

This page was last modified on by MDN contributors.

AltStyle によって変換されたページ (->オリジナル) /