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
(table 2 funcref)y(elem ...)llenan dos lugares con funciones.(type $unop ...)declara la firma que la llamada verificará.call_indirecttoma el argumento y luego el índice — el tipo malo atrapa.
Palabras clave y builtins usados aquí
call_indirectelemexportfuncfuncrefi32moduleparamresulttabletype
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.
Paso 3 de 3 en Llamadas; paso 15 de 28 en Fundamentos del lenguaje.