The table.init table instruction manually copies the references from a passive elem definition into a table.
(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.
table.init table_identifier elem_identifier
table.initThe table.init instruction type. Must always be included first.
table_identifier OptionalThe identifier for the table you want to insert the references into. This can be one of the following:
nameAn identifying name set for the table when it was first defined. This must begin with a $ symbol, for example $my_table.
indexThe table's index number, for example 0 for the first table in the wasm module, 1 for the second, etc.
If omitted, table_identifier defaults to 0.
elem_identifierThe identifier for the elem you want to copy references from. This can be one of the following:
nameAn identifying name set for the elem when it was first defined. This must begin with a $ symbol, for example $my_elem.
indexThe elem's index number, for example 0 for the first elem in the wasm module, 1 for the second, etc.
[dest_offset source_offset length] -> []
dest_offsetAn integer representing the table index to start copying the element references at. This will be an i32 or an i64, to match the index_type the table was defined with.
source_offsetAn i32 representing the starting offset in the elem element_list to start copying the element references from.
lengthAn i32 representing the number of references to copy.
The table.init instruction traps if:
dest_offset plus the length exceeds the size of the table.source_offset plus the length exceeds the size of the elem segment.elem.drop instruction was previously called on the elem segment referenced in elem_identifier.| Instruction | Binary format | Example text => binary |
|---|---|---|
table.init | 0xfc 12:u32 x:tableidx x:elemidx | table.init 0 0 => 0xfc 0x0c 0x00 0x00 |