call

call ruft eine Funktion auf, wobei return_call die Tail-Call-Version davon ist. call_indirect ruft eine Funktion in einer Tabelle auf, wobei return_call_indirect ebenfalls als Tail-Call-Version dient.

Beispiele

Aufrufen der greet-Funktion, die aus JavaScript importiert wurde, unter Verwendung von call:

Probieren Sie es aus

(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: function () {
      console.log("Hello");
      // Expected output: "Hello"
    },
  },
});

Berechnen der Fakultät einer Zahl unter Verwendung von return_call und Protokollierung des Ergebnisses mit der exportierten fac-Funktion:

Probieren Sie es aus

(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

wasm
call $greet
Anweisung Binärer Opcode
call 0x10
call_indirect 0x11
return_call 0x12
return_call_indirect 0x13

Siehe auch