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
であることを示します。
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"
次に、テーブルを含むインポートオブジェクトを生成します。
var importObj = {
js: {
tbl: tbl,
},
};
最後に WebAssembly.instantiateStreaming()
を使用して wasm モジュール (table2.wasm) をロード し、インスタンス化します。table2.wasm モジュールは2の関数を持っていて (1つは42を、もう1つは83を返す) 、インポートされたテーブルの0、1番目に両方の要素が格納されます (text representationを参照) 。そして、インスタンス化された後、テーブルの長さは2のままです。しかし、今はJSから呼び出し可能な エクスポートされたWebAssembly関数 が含まれています。
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