WebAssembly.Global

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

コンストラクター

WebAssembly.Global()

新しい Global オブジェクトを生成します。

Global のインスタンス

すべての Global のインスタンスは Global() コンストラクターのプロパティオブジェクトを継承します。これによりすべての Global インスタンスを変更することができます。

インスタンスプロパティ

Global.prototype.constructor

このオブジェクトのインスタンスを生成した関数を返します。既定では、これは WebAssembly.Global() コンストラクターです。

Global.prototype[@@toStringTag]

@@toStringTag プロパティの初期値で、文字列値 "WebAssembly.Global" です。

Global.prototype.value

グローバル変数の中に含まれている値です。これにより、グローバル値を直接設定および取得することができます。

インスタンスメソッド

Global.prototype.valueOf()

グローバル変数の中に含まれている値を返す古い形のメソッドです。

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

以下の例では新しいグローバルインスタンスは WebAssembly.Global() コンストラクターを用いて初期化され、初期値 0 の変更可能な i32 型として定義されます。

その後この値は、Global.value プロパティを使うことによって 42 に、global.wasm モジュールから公開された(どんな値が与えられても 1 を加算して、新しい値を返す)incGlobal() 関数を使うことによって 43 になります。

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
# globals

ブラウザーの互換性

BCD tables only load in the browser

関連情報