typestar

Tablas y call_indirect en WebAssembly

Punteros a función: una tabla de funcref elegida por índice en runtime.

(module
  ;; A table of function references, picked at run time by index:
  ;; this is how function pointers and vtables compile to wasm.
  (type $unop (func (param i32) (result i32)))
  (table 2 funcref)
  (elem (i32.const 0) $double $negate)

  (func $double (param $n i32) (result i32)
    (i32.mul (local.get $n) (i32.const 2)))
  (func $negate (param $n i32) (result i32)
    (i32.sub (i32.const 0) (local.get $n)))

  (func (export "apply") (param $which i32) (param $n i32) (result i32)
    (call_indirect (type $unop) (local.get $n) (local.get $which))))

Cómo funciona

  1. (table 2 funcref) y (elem ...) llenan dos lugares con funciones.
  2. (type $unop ...) declara la firma que la llamada verificará.
  3. call_indirect toma el argumento y luego el índice — el tipo malo atrapa.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
14
Caracteres a escribir
534
Tokens
120
Ritmo de tres estrellas
60 tpm

Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 120 segundos.

Escribe este fragmento

Paso 3 de 3 en Llamadas; paso 15 de 28 en Fundamentos del lenguaje.

← Anterior Siguiente →