↑ arvau

MDN / init: Wasm table instruction

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.

Syntax

table.init table_identifier elem_identifier
  • table.init

    • : The table.init instruction type. Must always be included first.

    table_identifier

    • : 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

InstructionBinary formatExample text => binarytable.init0xfc 12:u32 x:tableidx x:elemidxtable.init 0 0 => 0xfc 0x0c 0x00 0x00

Specifications

Browser compatibility

See also