WebAssembly.Global() コンストラクター
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2020年3月.
WebAssembly.Global() コンストラクターは、グローバル変数のインスタンスを表す新しい Global オブジェクトを表します。これは JavaScript からアクセス可能で、1 つ以上の WebAssembly.Module インスタンスの間でインポート/エクスポート可能です。これにより、複数のモジュールを動的リンクすることができます。
構文
new WebAssembly.Global(descriptor, value)
引数
descriptor-
オブジェクトで、 2 つのプロパティを持ちます。
value: 文字列で、そのグローバル変数のデータ型を表します。 これは以下のいずれかです。i32: 32 ビット整数。i64: 64 ビット整数。(JavaScript では、これはBigIntとして表される)f32: 32 ビット浮動小数点数。f64: 64 ビット浮動小数点数。v128: 128 ビットベクトル。externref: ホスト参照。anyfunc: 関数参照。
mutable: 論理値で、そのグローバル変数が変更可能であるかどうかを表します。既定ではfalseです。
value-
変数が保持する値です。変数のデータ型に合う限り、どんな値でも取れます。 もしも何の値も渡されないと、
descriptor.valueの値がi32、i64、f32、f64のいずれかである場合は型付きの 0 が使用され、descriptor.valueがexternrefまたはanyfuncであれば、nullが使用されます(DefaultValueアルゴリズムで定義されているとおりです)。
例
>新しい Global インスタンスの生成
以下の例は、WebAssembly.Global() コンストラクターを用いて生成された新しいグローバルインスタンスです。
これは変更可能 (mutable) な i32 型で、値は 0 です。
その後、グローバルの値は、まず Global.value プロパティを使用して 42 に変更され、次に global.wasm モジュールからエクスポートされた incGlobal() 関数を使用して 43 に変更されます(これは、与えられた値に 1 を追加してから新しい値を返します)。
const output = document.getElementById("output");
function assertEq(msg, got, expected) {
const result =
got === expected
? `SUCCESS! Got: ${got}<br>`
: `FAIL!<br>Got: ${got}<br>Expected: ${expected}<br>`;
output.innerHTML += `Testing ${msg}: ${result}`;
}
assertEq("WebAssembly.Global exists", typeof WebAssembly.Global, "function");
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0);
WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
({ instance }) => {
assertEq(
"getting initial value from wasm",
instance.exports.getGlobal(),
0,
);
global.value = 42;
assertEq(
"getting JS-updated value from wasm",
instance.exports.getGlobal(),
42,
);
instance.exports.incGlobal();
assertEq("getting wasm-updated value from JS", global.value, 43);
},
);
メモ: この例は GitHub 上の実行例で確認できます。また、ソースコードも参照してください。
仕様書
| Specification |
|---|
| WebAssembly JavaScript Interface> # dom-global-global> |