WebAssembly.Table

WebAssembly.Table() オブジェクトは JavaScript のラッパーオブジェクトであり、関数の参照を格納する WebAssembly Table を表す配列風の構造を持っています。 JavaScript や WebAssembly のコードで作成されたテーブルは、 JavaScript と WebAssembly の両方からアクセスでき、変更もできます。

メモ: 現在、テーブルには関数の参照のみが格納できますが、将来的に拡張される予定です。

コンストラクター

WebAssembly.Table()

新しい Table オブジェクトを生成します。

インスタンスプロパティ

Table.prototype.length

テーブルの長さを返します。すなわち、要素数です。

インスタンスメソッド

Table.prototype.get()

アクセサー関数です。指定した位置に格納された要素を取得します。

Table.prototype.grow()

Table インスタンスを指定した要素数だけ拡張します。

Table.prototype.set()

指定した位置に要素を格納します。

新しい WebAssembly Table インスタンスの生成

次の例では (table2.html動作例を確認してください)、新しい WebAssembly Table メソッドを初期サイズ 2 要素で生成します。それからそのテーブルの長さと 2 つの位置の内容を (Table.prototype.get() を使用して受け取って) 表示し、長さが 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,
  },
};

最後に WebAssembly.instantiateStreaming() を使用して wasm モジュール (table2.wasm) をロード し、インスタンス化します。table2.wasm モジュールは2の関数を持っていて (1つは42を、もう1つは83を返す) 、インポートされたテーブルの0、1番目に両方の要素が格納されます (text representationを参照) 。そして、インスタンス化された後、テーブルの長さは2のままです。しかし、今はJSから呼び出し可能な エクスポートされたWebAssembly関数 が含まれています。

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

内部の値を表示するためには、参照された関数のアクセサの呼び出しの後に、2つ目の関数呼び出しを含める必要があることに注意して下さい (get(0) ではなく get(0)())。

この例では、JavaScript からテーブルを作成してアクセスしていますが、wasm インスタンス内で同じテーブルを参照して呼び出すこともできます。

仕様書

Specification
WebAssembly JavaScript Interface
# tables

ブラウザーの互換性

BCD tables only load in the browser

関連情報