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

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

構文

new WebAssembly.Global(descriptor, value)

引数

descriptor

GlobalDescriptor 辞書オブジェクトで、 2 つのプロパティを持っています。

  • value: USVString で、そのグローバル変数のデータ型を表します。これは i32i64f32f64 のいずれかです。 USVString は Unicode のスカラー値の取りうる並びに相当します。 USVString は JavaScript で返されたときに、 String にマップされます。一般的に、テキスト処理を行い、操作するために Unicode スカラー値の文字列を必要とする API にのみ使用されます。 USVString は、対になっていないサロゲートコードポイントを許可しないことを除いて、 DOMString と同等です。 USVString に存在する対になっていないサロゲートコードポイントは、ブラウザーが Unicode の「置換文字」 U+FFFD, (�) に変換されます。
  • mutable: 論理値で、そのグローバル変数が変更可能であるかどうかを表します。既定では false です。
value

変数が保持する値です。変数のデータ型に合う限りどんな値でも取れます。もしも何の値も渡されないと、DefaultValue アルゴリズムで指定した時のように、型付きの 0 が使われます。

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

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

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

const output = document.getElementById('output');

function assertEq(msg, got, expected) {
  output.innerHTML += `Testing ${msg}: `;
  if (got !== expected)
    output.innerHTML += `FAIL!<br>Got: ${got}<br>Expected: ${expected}<br>`;
  else
    output.innerHTML += `SUCCESS! Got: ${got}<br>`;
}

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);
});

Note: この例はGitHub 上の実行例で確認できます。また、ソースコードも参照してください。

仕様書

Specification
WebAssembly JavaScript Interface
# dom-global-global

ブラウザーの互換性

BCD tables only load in the browser

関連情報