WebAssembly.Table

Объект WebAssembly.Table() - это JavaScript обёртка — структура похожая на массив, представляющая таблицу функций WebAssembly. Таблица, созданная через JavaScript или в коде WebAssembly, будет доступна и может быть изменена как из JavaScript, так и из WebAssembly.

Примечание: Таблицы сейчас хранят только ссылки на функции, но это может быть расширено в будущем.

Конструктор

WebAssembly.Table() (en-US)

Создаёт новый объект Table.

Экземпляры Table

Все экземпляры Table наследуются от прототипа конструктора (en-US) Table(), следовательно изменения прототипа затронут все экземпляры Table.

Свойства экземпляра

Table.prototype.constructor

Возвращает функцию которая создала этот объект. По умолчанию это конструктор WebAssembly.Table().

Table.prototype.length (en-US)

Возвращает длину таблицы (количество элементов в таблице).

Instance methods

Table.prototype.get(index) (en-US)

Возвращает указанное значение из таблицы.

Table.prototype.grow(count) (en-US)

Увеличивает размер таблицы на указанное количество элементов.

Table.prototype.set(index, value) (en-US)

Сохраняет указанное значение в таблицу под указанным индексом.

Примеры

Следующий пример (смотри исходный код и живую версию table2.html) создаёт новый экземпляр WebAssembly Table с 2 элементами. После этого выводит длину таблицы и содержимое первых двух элементов (полученных через Table.prototype.get() (en-US) чтобы показать что длина равняется 2 и элементы равны null.

js
var tbl = new WebAssembly.Table({ initial: 2, element: "anyfunc" });
console.log(tbl.length); // "2"
console.log(tbl.get(0)); // "null"
console.log(tbl.get(1)); // "null"

После этого мы создаём объект импорта содержащий таблицу:

js
var importObj = {
  js: {
    tbl: tbl,
  },
};

После этого, мы создаём экземпляр модуля wasm (table2.wasm) используя метод WebAssembly.instantiateStreaming() (en-US). Модуль table2.wasm содержит две функции, одна возвращает 42, а вторая - 83) и сохраняет эти функции под индексами 0 и 1 в импортированную таблицу (смотри текстовую версию). Таким образом, после создания wasm-модуля, таблица имеет туже длину, но элементы таблицы стали функциями экспортированными из WebAssembly которые можно вызывать из JS.

js
WebAssembly.instantiateStreaming(fetch("table2.wasm"), importObject).then(
  function (obj) {
    console.log(tbl.length);
    console.log(tbl.get(0)());
    console.log(tbl.get(1)());
  },
);

Заметьте что понадобилось добавить второй оператор вызова функции чтобы вызвать функцию возвращённую из талицы (т.е. get(0)() вместо get(0)) .

Этот пример показывает что мы создаём и работаем с таблицей из JavaScript, но экземпляр таблицы также виден и доступен внутри модуля wasm.

Спецификации

Specification
WebAssembly JavaScript Interface
# tables

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также