init: Wasm table instruction
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> |