WebAssembly.Global

WebAssembly.Global はグローバル変数として存在し、JavaScript または WebAssembly.Module インスタンスから参照することができます。これにより動的に複数のモジュールをリンクすることができます。

コンストラクターの文法

var myGlobal = new WebAssembly.Global(descriptor, value);

パラメーター

descriptor
GlobalDescriptor 辞書オブジェクト、2 つの要素を持っている:
  • valueUSVString はグローバルデータ形式を表し値として i32i64f32f64 のうち一つを取ります。
  • mutable: グローバルがミュータブルかどうかの真偽値です。デフォルトでは false です。
value
変数が保持する値です。変数のデータ型に合う限りどんな値でも取れます。もしも何の値も渡されないと、DefaultValue algorithm で指定した時の様な 型ありの 0 が使われます。

グローバルコンストラクターによる関数プロパティ

無し

グローバルインスタンス

すべてのグローバルインスタンスは Global() コンストラクターのプロパティオブジェクトを受け継ぐ — これによりすべての Global インスタンスを変更できる

インスタンスプロパティ

インスタンスメソッド

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

その後この値は、Global.value プロパティを使うことによって 42 に、global.wasm モジュールから公開された incGlobal() 関数 (入力に限らず 1 を加算する) を使うことによって 43 になります。

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

メモ: GitHub 上で動くデモが試せます。ソースコードも確認してみてください。

仕様

仕様 策定状況 コメント
WebAssembly JavaScript Interface
WebAssembly.Global() の定義
草案 初回ドラフト定義

ブラウザー実装状況

BCD tables only load in the browser

参考