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.init instruction type. Must always be included first.

table_identifier Optional

The identifier for the table you want to insert the references into. This can be one of the following:

name

An identifying name set for the table when it was first defined. This must begin with a $ symbol, for example $my_table.

index

The 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_identifier

The identifier for the elem you want to copy references from. This can be one of the following:

name

An identifying name set for the elem when it was first defined. This must begin with a $ symbol, for example $my_elem.

index

The elem's index number, for example 0 for the first elem in the wasm module, 1 for 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 i32 or an i64, to match the index_type the table was defined with.

source_offset

An i32 representing the starting offset in the elem element_list to start copying the element references from.

length

An i32 representing the number of references to copy.

Traps

The table.init instruction traps if:

  • The dest_offset plus the length exceeds the size of the table.
  • The source_offset plus the length exceeds the size of the elem segment.
  • The elem.drop instruction was previously called on the elem segment referenced in elem_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

Browser compatibility

See also