WebAssembly.Table

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2017.

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

関連情報