The table.copy table instruction copies element references from one table location to another.
(module
(table $first_table 2 funcref)
(table $second_table 3 funcref)
(func $f1 (result i32)
i32.const 42
)
(func $f2 (result i32)
i32.const 100
)
(elem $funcs (table $first_table) (i32.const 0) funcref (ref.func $f1) (ref.func $f2))
(func (export "copy")
i32.const 1 ;; destination table offset
i32.const 0 ;; source table offset
i32.const 2 ;; number of elements to copy
table.copy $second_table $first_table
)
(func (export "accessTable") (param $index i32) (result i32)
local.get $index
call_indirect $second_table (result i32)
)
)WebAssembly.instantiateStreaming(fetch("{%wasm-url%}")).then((result) => {
result.instance.exports.copy();
const value = result.instance.exports.accessTable(2);
console.log(value);
});In the above example, we define two tables: $first_table with a capacity of two elements, and $second_table with a capacity of three elements. We then define two functions that each return a different integer and store those functions in $first_table using an active elem definition.
We then define two exported functions:
copy(), which uses a table.copy instruction to copy the two references from $first_table into the second and third element slots of $second_table.accessTable(), which calls (via call_indirect) the element referenced in $second_table in the slot number equal to the function's parameter. It then returns the value returned by the called function.In the JavaScript, we call the two Wasm functions, then log the value returned from accessTable() to the console, which is equal to the return value of the function stored in the third slot of $second_table.
table.copy dest_table source_table
table.copyThe table.copy instruction type. Must always be included first.
dest_table OptionalThe identifier for the table you want to copy the references into.
source_table OptionalThe identifier for the table you want to copy the references from.
dest_table and source_table 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 dest_table or source_table are omitted, they default to 0.
[dest_offset source_offset length] -> []
dest_offsetAn integer representing the offset to start writing the copied element references to, in the destination table. This will be an i32 or an i64, to match the index_type the table was defined with.
source_offsetAn integer representing the offset to start copying element references from, in the source table. This will be an i32 or an i64, to match the index_type the table was defined with.
lengthAn integer representing the number of references to copy. This will be an i32 or an i64, to match the index_type the table was defined with. When copying between a 32-bit index table and a 64-bit index table, an i32 must be used for the length.
Note: table.copy copies references in an overlap-aware way. In other words, the copy proceeds as if the source references identified by source_offset and length was first copied into a temporary value before being copied to dest_offset, meaning that if your source and destination data overlap, they don't interfere with one another and the source is cleanly copied into the destination region as expected.
If any copied element reference would be out of bounds in the source or destination, the instruction traps.
| Instruction | Binary format | Example text => binary |
|---|---|---|
table.copy | 0xfc 14:u32 x:tableidx x:tableidx | table.copy 0 0 => 0xfc 0x0e 0x00 0x00 |
table definition