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 October 2017.

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

関連情報