WebAssembly.Global() コンストラクター

WebAssembly.Global() コンストラクターは、グローバル変数のインスタンスを表す新しい Global オブジェクトを表します。これは JavaScript からアクセス可能で、1 つ以上の WebAssembly.Module インスタンスの間でインポート/エクスポート可能です。これにより、複数のモジュールを動的リンクすることができます。

構文

js
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 の値が i32i64f32f64 のいずれかである場合は型付きの 0 が使用され、descriptor.valueexternref または anyfunc であれば、null が使用されます(DefaultValue アルゴリズムで定義されているとおりです)。

新しい Global インスタンスの生成

以下の例は、WebAssembly.Global() コンストラクターを用いて生成された新しいグローバルインスタンスです。 これは変更可能 (mutable) な i32 型で、値は 0 です。

その後、グローバルの値は、まず Global.value プロパティを使用して 42 に変更され、次に global.wasm モジュールからエクスポートされた incGlobal() 関数を使用して 43 に変更されます(これは、与えられた値に 1 を追加してから新しい値を返します)。

js
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

ブラウザーの互換性

BCD tables only load in the browser

関連情報