init: Wasm table instruction
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2021.
The table.init table instruction manually copies the references from a passive elem definition into a table.
Try it
(module
(table $return_values 2 funcref)
(func $f1 (result i32)
i32.const 42
)
(func $f2 (result i32)
i32.const 100
)
(elem $funcs funcref (ref.func $f1) (ref.func $f2))
(func (export "init")
i32.const 0 ;; destination table index
i32.const 0 ;; offset into elem segment
i32.const 2 ;; number of elements to copy
table.init $funcs
elem.drop $funcs
)
(func (export "accessTable") (param $index i32) (result i32)
local.get $index
call_indirect (result i32)
)
)
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}")).then((result) => {
result.instance.exports.init();
const value = result.instance.exports.accessTable(1);
console.log(value);
});
In the above example, we define a table, two functions, and an elem segment called $funcs that references the two functions. We then invoke table.init to copy the references from the $funcs elem over to the table, and drop the elem segment using elem.drop when it is no longer needed.
Syntax
table.init table_identifier elem_identifier
table.init-
The
table.initinstruction type. Must always be included first. table_identifierOptional-
The identifier for the
tableyou want to insert the references into. This can be one of the following:name-
An identifying name set for the
tablewhen it was first defined. This must begin with a$symbol, for example$my_table. index-
The
table's index number, for example0for the firsttablein the wasm module,1for the second, etc.
If omitted,
table_identifierdefaults to0. elem_identifier-
The identifier for the
elemyou want to copy references from. This can be one of the following:name-
An identifying name set for the
elemwhen it was first defined. This must begin with a$symbol, for example$my_elem. index-
The
elem's index number, for example0for the firstelemin the wasm module,1for the second, etc.
Type
[dest_offset source_offset length] -> []
dest_offset-
An integer representing the table index to start copying the element references at. This will be an
i32or ani64, to match theindex_typethetablewas defined with. source_offset-
An
i32representing the starting offset in theelemelement_listto start copying the element references from. length-
An
i32representing the number of references to copy.
Traps
The table.init instruction traps if:
- The
dest_offsetplus thelengthexceeds the size of thetable. - The
source_offsetplus thelengthexceeds the size of theelemsegment. - The
elem.dropinstruction was previously called on theelemsegment referenced inelem_identifier.
Binary encoding
| Instruction | Binary format | Example text => binary |
|---|---|---|
table.init |
0xfc 12:u32 x:tableidx x:elemidx |
table.init 0 0 => 0xfc 0x0c 0x00 0x00 |
Specifications
| Specification |
|---|
| WebAssembly Core Specification> # -hrefsyntax-instr-tablemathsftableinitxy> |