WebAssembly JavaScriptインターフェイス

W3C 候補勧告草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/CRD-wasm-js-api-2-20260514/
最新公開版:
https://www.w3.org/TR/wasm-js-api-2/
編集者草案:
https://webassembly.github.io/spec/js-api/
履歴:
https://www.w3.org/standards/history/wasm-js-api-2/
実装レポート:
https://webassembly.org/features/
フィードバック:
GitHub
仕様内インライン
編集者:
Ms2ger (Igalia)
Ryan Hunt (Mozilla Foundation)
課題トラッキング:
GitHub Issues

概要

この文書は、WebAssembly と相互作用するための明示的な JavaScript API を提供する。

これは関連文書群の一部である: Core WebAssembly SpecificationWebAssembly JS Interface、 および WebAssembly Web API

この文書のステータス

この節では、この文書が公開された時点におけるステータスを記述する。現在の W3C 公開文書の一覧およびこの技術報告書の最新版は、 W3C 技術報告書 インデックスで確認できる。

この文書は、WebAssembly Working Group により、 勧告トラックを用いた 候補勧告草案として公開された。

候補勧告としての公開は、W3C およびその会員による承認を意味するものではない。候補 勧告草案は、作業部会が後続の候補勧告スナップショットに含める意図を持つ、前回の候補勧告 からの変更を統合したものである。

WebAssembly Working group は、この公開物を候補勧告の状態に維持し、 勧告段階へ移行するのではなく「リビングスタンダード」として継続的に更新していく意図を 持っている。

この文書は随時保守および更新される。この文書の一部は作業進行中である。

GitHub Issues は、この仕様に関する議論のための推奨手段である。 すべての issue とコメントは アーカイブ される。

この文書は WebAssembly Working Group によって作成された。

この文書は、 W3C Patent Policy の下で運営される グループによって作成された。 W3C は、あらゆる特許開示の 公開一覧 を維持しており、 それは当該グループの成果物に関連して行われた開示を対象とする; そのページには特許を開示するための手順も含まれている。 個人が、必須クレーム を含むとその個人が考える特許について実際の知識を有する場合、 その情報は W3C Patent Policy 第6節 に従って開示しなければならない。

この文書は、2025年8月18日付 W3C Process Document によって統治される。

1. 導入

設計上、WebAssembly コア仕様 [WEBASSEMBLY]スコープ には、WebAssembly プログラムがその周囲の実行環境とどのように相互作用するかの 記述は含まれない。 代わりに、それは WebAssembly とその環境との間の抽象的な 埋め込みインターフェイス を定義し、 (埋め込み側 と呼ばれる)。 埋め込み側が WebAssembly の意味論と相互作用するのはこのインターフェイスを通してのみであり、 埋め込み側はそのホスト環境と埋め込み API との接続を実装する。 この文書は、WebAssembly を JavaScript [ECMASCRIPT] 環境へ埋め込む方法を記述し、 WebAssembly モジュールをどのように構築しインスタンス化できるか、インポートされた関数および エクスポートされた関数がどのように呼び出されるか、データがどのように交換されるか、 そしてエラーがどのように処理されるかを含む。 JavaScript 環境自体が Web ブラウザに埋め込まれている場合、Web API 仕様 [WASMWEB] は Web 環境に関連する追加の挙動を記述する。

2. API 使用例

この節は非規範的である。

demo.watdemo.wasm にエンコード)を与えると:

(module
    (import "js" "import1" (func $i1))
    (import "js" "import2" (func $i2))
    (func $main (call $i1))
    (start $main)
    (func (export "f") (call $i2))
)

および次の JavaScript をブラウザで実行する:

var importObj = {js: {
    import1: () => console.log("hello,"),
    import2: () => console.log("world!")
}};
fetch('demo.wasm').then(response =>
    response.arrayBuffer()
).then(buffer =>
    WebAssembly.instantiate(buffer, importObj)
).then(({module, instance}) =>
    instance.exports.f()
);

3. 記法

この仕様は Infra Standard に依存する。[INFRA]

WebAssembly の sequence 型は、そこで定義される list 型と等価である; 一方の値は 他方の値として透過的に扱われる。

4. 内部ストレージ

4.1. WebAssembly Store と JavaScript の相互作用

注: WebAssembly の意味論は、WebAssembly 抽象機械の状態を表す 抽象的な store に基づいて定義される。 WebAssembly 操作は store を受け取り、更新された store を返す。

agent は、関連付けられた store を持つ。新しい agent が作成されると、その関連付けられた store は store_init() の結果に設定される。

注: この仕様では、WebAssembly に関連する オブジェクト、メモリ、アドレスはいずれも、ある agent cluster 内の agent 間で共有できない。将来の WebAssembly の版では、これが変わる可能性がある。

WebAssembly store の要素は JavaScript 値と対応付けられることがある。特に、対応する Memory オブジェクトを持つ各 WebAssembly memory instance は JavaScript の Data Block と対応付けられる; この Data Block への変更は、それらの変更を反映した store へ agent の store を更新することと対応付けられ、その逆も同様である。

4.2. WebAssembly JS オブジェクトキャッシュ

注: 対応する JavaScript オブジェクトを持つことがある WebAssembly オブジェクトはいくつか存在する。この対応関係は、WebAssembly の address から JavaScript オブジェクトへの agent ごとのマッピングに格納される。 このマッピングは、ある agent に対して、特定の WebAssembly address に対応する JavaScript オブジェクトが高々 1 つだけ存在することを保証するために用いられる。しかし、 この性質は共有オブジェクトには当てはまらない。

agent は、次の 順序付きマップ と関連付けられる:

5. WebAssembly 名前空間

dictionary WebAssemblyInstantiatedSource {
    required Module module;
    required Instance instance;
};

dictionary WebAssemblyCompileOptions {
    USVString? importedStringConstants;
    sequence<USVString> builtins;
};

[Exposed=*]
namespace WebAssembly {
    boolean validate([AllowResizable] AllowSharedBufferSource bytes, optional WebAssemblyCompileOptions options = {});
    Promise<Module> compile([AllowResizable] AllowSharedBufferSource bytes, optional WebAssemblyCompileOptions options = {});

    Promise<WebAssemblyInstantiatedSource> instantiate(
        [AllowResizable] AllowSharedBufferSource bytes, optional object importObject, optional WebAssemblyCompileOptions options = {});

    Promise<Instance> instantiate(
        Module moduleObject, optional object importObject);

    readonly attribute Tag JSTag;
};
To WebAssembly モジュールをコンパイルするには、ソースバイト列 bytes から、次の手順を実行する:
  1. modulemodule_decode(bytes) とする。moduleerror なら、error を返す。

  2. module_validate(module) が error なら、error を返す。

  3. module を返す。

モジュール module、有効化されたビルトイン builtinSetNames、および importedStringModule から WebAssembly モジュールに対するビルトインと インポート文字列を検証するには、次の手順を実行する:

  1. builtinSetNames に対する ビルトイン集合名の検証 が false なら、false を返す。

  2. import について、module_imports(module) の、

    1. importedStringModule が null ではなく、かつ import[0] が importedStringModule に等しい場合、

      1. importExternTypeimport[2] とする。

      2. stringExternTypeglobal const (ref extern) とする。

      3. match_externtype(stringExternType, importExternType) が false なら、false を返す

    2. それ以外の場合、

      1. import および builtinSetNames に対する ビルトイン用インポートの検証 が false なら、 false を返す。

  3. true を返す。

validate(bytes, options) メソッドは、 呼び出されると次の手順を実行する:
  1. stableBytes を、バッファが保持するバイト列 のコピー bytes とする。

  2. stableBytes を WebAssembly モジュールとして コンパイル し、その結果を module として保持する。

  3. moduleerror なら、false を返す。

  4. builtinSetNamesoptions["builtins"] とする。

  5. importedStringModuleoptions["importedStringConstants"] とする。

  6. module に対する ビルトインとインポート文字列の 検証 が、builtinSetNames および importedStringModule を用いて false を返した場合、false を返す。

  7. true を返す。

Module オブジェクトは、 単一の WebAssembly モジュールを表す。各 Module オブジェクトは 次の内部スロットを持つ:

モジュール module、ソースバイト列 bytes、有効化されたビルトイン builtinSetNames、および importedStringModule から WebAssembly モジュールオブジェクトを構築するには、 次の手順を実行する:
  1. moduleObjectnew Module とする。

  2. moduleObject.[[Module]] を module に設定する。

  3. moduleObject.[[Bytes]] を bytes に設定する。

  4. moduleObject.[[BuiltinSets]] を builtinSetNames に設定する。

  5. moduleObject.[[ImportedStringModule]] を importedStringModule に設定する。

  6. moduleObject を返す。

ソースバイト列 bytesWebAssemblyCompileOptions options から、 任意の task source taskSource を用いて WebAssembly モジュールを非同期にコンパイルするには、 次の手順を実行する:
  1. promise新しい promise とする。

  2. 次の手順を 並列に 実行する:

    1. WebAssembly モジュールをコンパイル し、 bytes の結果を module として保持する。

    2. taskSource が与えられていれば、それ上で タスクをキューに入れ、次の手順を実行する:

      1. moduleerror なら、promiseCompileError 例外で reject して return する。

      2. builtinSetNamesoptions["builtins"] とする。

      3. importedStringModuleoptions["importedStringConstants"] とする。

      4. module に対する ビルトインと インポート文字列の検証 が、 builtinSetNames および importedStringModule を用いて false なら、 promiseCompileError 例外で reject する。

      5. それ以外の場合、

        1. modulebytesbuiltinSetNamesimportedStringModule から WebAssembly モジュールオブジェクトを構築 し、その結果を moduleObject とする。

        2. promisemoduleObjectresolve する。

  3. promise を返す。

compile(bytes, options) メソッドは、 呼び出されると次の手順を実行する:
  1. stableBytes を、バッファが保持するバイト列 のコピー bytes とする。

  2. stableBytes から 非同期に WebAssembly モジュールをコンパイル し、options を用いて、その結果を返す。

モジュール moduleimportedStringModule を用いて インポート文字列をインスタンス化するには、次の手順を実行する:

  1. Assert: importedStringModule は null ではない。

  2. exportsObject! OrdinaryObjectCreate(null) とする。

  3. (moduleName, componentName, externtype) について、module_imports(module) の、

    1. moduleNameimportedStringModule と等しくなければ、continue する。

    2. stringConstantcomponentName とする。

    3. status! CreateDataProperty(exportsObject, stringConstant, stringConstant) とする。

    4. Assert: status は true である。

  4. exportsObject を返す。

WebAssembly モジュール module から、imports オブジェクト importObject、 有効化されたビルトイン builtinSetNames、および importedStringModule を用いて インポートを読み取るには、 次の手順を実行する:
  1. module.imports空でない にもかかわらず、importObject が undefined なら、TypeError 例外を throw する。

  2. builtinOrStringImports を順序付きマップ « » とする。

  3. builtinSetName について builtinSetNames の、

    1. builtinSetQualifiedName を、builtinSetName の前に "wasm:" を付けたものとする。

    2. Assert: builtinOrStringImportsbuiltinSetQualifiedName を含まない

    3. builtinSetName がビルトイン集合を指していなければ、continue する。

    4. exportsObject を、builtinSetName を用いた ビルトイン集合の インスタンス化 の結果とする

    5. Set builtinOrStringImports[builtinSetQualifiedName] を exportsObject に設定する

  4. importedStringModule が null ではない場合、

    1. exportsObject を、module および importedStringModule を用いた インポート文字列のインスタンス化 の結果とする

    2. Set builtinOrStringImports[importedStringModule] を exportsObject に設定する

  5. imports を « » とする。

  6. (moduleName, componentName, externtype) について、module_imports(module) の、

    1. builtinOrStringImports含む moduleName の場合、

      1. obuiltinOrStringImports[moduleName] とする。

      2. oObject ではない、または HasProperty(o, componentName) が false の場合、

        1. o? Get(importObject, moduleName) に設定する。

    2. それ以外の場合、

      1. o? Get(importObject, moduleName) とする。

    3. oObject ではない なら、TypeError 例外を throw する。

    4. v? Get(o, componentName) とする。

    5. externtypefunc functype の形式である場合、

      1. IsCallable(v) が false なら、LinkError 例外を throw する。

      2. v が [[FunctionAddress]] 内部スロットを持ち、したがって Exported Function である場合、

        1. funcaddrv の [[FunctionAddress]] 内部スロットの値とする。

      3. それ以外の場合、

        1. v および functype から ホスト関数を作成 し、その結果を funcaddr とする。

        2. indeximports 内の外部関数の数とする。この値 index は、ホスト関数 funcaddrホスト関数インデックス と呼ばれる。

      4. externfunc を外部値 func funcaddr とする。

      5. externfuncimports追加 する。

    6. externtypeglobal mut valtype の形式である場合、

      1. vimplements Global なら、

        1. globaladdrv.[[Global]] とする。

      2. それ以外の場合、

        1. valtypei64 であり、かつ vBigInt では ない 場合、

          1. LinkError 例外を throw する。

        2. valtypei32f32、または f64 のいずれかであり、かつ vNumber では ない 場合、

          1. LinkError 例外を throw する。

        3. valtypev128 の場合、

          1. LinkError 例外を throw する。

        4. valueToWebAssemblyValue(v, valtype) とする。この操作が TypeError を throw した場合、それを捕捉し、LinkError 例外を throw する。

        5. storesurrounding agent関連付けられた store とする。

        6. (store, globaladdr) を global_alloc(store, const valtype, value) とする。

        7. surrounding agent関連付けられた storestore に設定する。

      3. externglobalglobal globaladdr とする。

      4. externglobalimports追加 する。

    7. externtypemem memtype の形式である場合、

      1. vimplement Memory しないなら、LinkError 例外を throw する。

      2. externmem を外部値 mem v.[[Memory]] とする。

      3. externmemimports追加 する。

    8. externtypetable tabletype の形式である場合、

      1. vimplement Table しないなら、LinkError 例外を throw する。

      2. tableaddrv.[[Table]] とする。

      3. externtable を外部値 table tableaddr とする。

      4. externtableimports追加 する。

    9. externtypetag attribute functype の形式である場合、

      1. Assert: attributeexception である。

      2. vimplement Tag しないなら、LinkError 例外を throw する。

      3. tagaddrv.[[Address]] とする。

      4. externtag を外部値 tag tagaddr とする。

      5. externtagimports追加 する。

  7. imports を返す。

注: このアルゴリズムは、正しい種類の JavaScript 値が渡されたことだけを検証する。 WebAssembly の型要件の検証は、 「WebAssembly モジュールのコアを インスタンス化する」アルゴリズムに委ねられる。

WebAssembly モジュール module およびインスタンス instance から エクスポート オブジェクトを作成するには、次の手順を実行する:
  1. exportsObject! OrdinaryObjectCreate(null) とする。

  2. (name, externtype) について、module_exports(module) の、

    1. externvalinstance_export(instance, name) とする。

    2. Assert: externvalerror ではない。

    3. externtypefunc functype の形式である場合、

      1. Assert: externvalfunc funcaddr の形式である。

      2. func funcaddrexternval とする。

      3. func を、funcaddr から 新しい Exported Function を作成した結果とする。

      4. valuefunc とする。

    4. externtypeglobal mut globaltype の形式である場合、

      1. Assert: externvalglobal globaladdr の形式である。

      2. global globaladdrexternval とする。

      3. global を、globaladdr から作成された 新しい Global オブジェクト とする。

      4. valueglobal とする。

    5. externtypemem memtype の形式である場合、

      1. Assert: externvalmem memaddr の形式である。

      2. mem memaddrexternval とする。

      3. memory を、memaddr から作成された 新しい Memory オブジェクト とする。

      4. valuememory とする。

    6. externtypetable tabletype の形式である場合、

      1. Assert: externvaltable tableaddr の形式である。

      2. table tableaddrexternval とする。

      3. table を、tableaddr から作成された 新しい Table オブジェクト とする。

      4. valuetable とする。

    7. externtypetag attribute functype の形式である場合、

      1. Assert: attributeexception である。

      2. Assert: externvaltag tagaddr の形式である。

      3. tag tagaddrexternval とする。

      4. tag を、tagaddr から作成された 新しい Tag オブジェクト とする。

      5. valuetag とする。

    8. status! CreateDataProperty(exportsObject, name, value) とする。

    9. Assert: status は true である。

    注: WebAssembly モジュール検証 の間に実行される妥当性および一意性の検査により、 各プロパティ名が妥当であり、重複して定義されるプロパティが存在しないことが保証される。

  3. exportsObject に対して ! SetIntegrityLevel(exportsObject, "frozen") を実行する。

  4. exportsObject を返す。

WebAssembly モジュール module およびインスタンス instance から インスタンス オブジェクトを初期化する instanceObjectには、次の手順を実行する:
  1. module および instance から エクスポートオブジェクトを作成 し、その結果を exportsObject とする。

  2. instanceObject.[[Instance]] を instance に設定する。

  3. instanceObject.[[Exports]] を exportsObject に設定する。

モジュール module およびインポート群 imports から WebAssembly モジュールのコアをインスタンス化するには、 次の手順を実行する:
  1. storesurrounding agent関連付けられた store とする。

  2. resultmodule_instantiate(store, module, imports) とする。

  3. resulterror なら、適切な例外型を throw する:

    • リンク時に発生するほとんどの場合については、 LinkError 例外。

    • エラーが start 関数の実行中に発生した場合は、WebAssembly から発生するほとんどのエラーについて RuntimeError を throw するか、内側の ECMAScript コードから伝播したエラーオブジェクトを throw する。

    • 適切であれば別のエラー型。たとえば、 WebAssembly エラー対応付け に記述されているメモリ不足例外など。

  4. (store, instance) を result とする。

  5. surrounding agent関連付けられた storestore に設定する。

  6. instance を返す。

Module moduleObject およびインポート群 importObject から WebAssembly モジュールを非同期に インスタンス化するには、次の手順を実行する:
  1. promise新しい promise とする。

  2. modulemoduleObject.[[Module]] とする。

  3. builtinSetNamesmoduleObject.[[BuiltinSets]] とする。

  4. importedStringModulemoduleObject.[[ImportedStringModule]] とする。

  5. moduleインポートを読み取り、 imports importObjectbuiltinSetNames および importedStringModule を用い、その結果を imports とする。 この操作が例外を throw した場合、それを捕捉し、reject promise をその例外で行い、promise を返す。

  6. 次の手順を 並列に 実行する:

    1. 次の手順を実行するために タスクをキューに入れる: 注: 実装固有の作業がここで行われることがある。

      1. moduleimports を用いて WebAssembly モジュールのコアをインスタンス化 し、その結果を instance とする。 これが例外を throw した場合、それを捕捉し、reject promise をその例外で行い、 これらの副手順を終了する。

      2. instanceObjectnew Instance とする。

      3. module および instance から instanceObject初期化 する。 これが例外を throw した場合、それを捕捉し、reject promise をその例外で行い、 これらの副手順を終了する。

      4. instanceObjectpromiseresolve する。

  7. promise を返す。

モジュールの promise をインスタンス化する promiseOfModule に imports importObject を用いるには、次の手順を実行する:
  1. promise新しい promise とする。

  2. promiseOfModule に対して 反応 する:

    • promiseOfModule が値 module で fulfill された場合:

      1. moduleimportObject をインポートして WebAssembly モジュールをインスタンス化 し、その結果を innerPromise とする。

      2. innerPromise に対して 反応 する:

        • innerPromise が値 instance で fulfill された場合。

          1. resultWebAssemblyInstantiatedSource 値 «[ "module" → module, "instance" → instance ]» とする。

          2. resultpromiseresolve する。

        • innerPromise が理由 reason で reject された場合:

          1. reasonpromisereject する。

    • promiseOfModule が理由 reason で reject された場合:

      1. reasonpromisereject する。

  3. promise を返す。

instantiate(bytes, importObject, options) メソッドは、呼び出されると次の手順を実行する:
  1. stableBytes を、バッファが保持するバイト列 のコピー bytes とする。

  2. stableBytes から 非同期に WebAssembly モジュールをコンパイル し、options を用い、その結果を promiseOfModule とする。

  3. promiseOfModuleインスタンス化 し、 imports importObject を用いて、その結果を返す。

instantiate(moduleObject, importObject) メソッドは、呼び出されると次の手順を実行する:
  1. moduleObjectimportObject をインポートして 非同期に WebAssembly モジュールをインスタンス化 し、その結果を返す。

注: 後続のストリーミング API は WebAssembly Web API に記載されている。

JSTag 属性の getter は、JSTag attribute of the WebAssembly Namespace, when invoked, performs the following steps:

  1. JSTagAddr を、JavaScript 例外タグを取得する 結果とする。

  2. JSTagObject を、JSTagAddr から Tag オブジェクトを作成する 結果とする。

  3. JSTagObject を返す。

5.1. モジュール

enum ImportExportKind {
  "function",
  "table",
  "memory",
  "global",
  "tag"
};

enum AddressType {
  "i32",
  "i64",
};

typedef any AddressValue;

dictionary ModuleExportDescriptor {
  required USVString name;
  required ImportExportKind kind;
  // Note: Other fields such as signature may be added in the future.
};

dictionary ModuleImportDescriptor {
  required USVString module;
  required USVString name;
  required ImportExportKind kind;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Module {
  constructor([AllowResizable] AllowSharedBufferSource bytes, optional WebAssemblyCompileOptions options = {});
  static sequence<ModuleExportDescriptor> exports(Module moduleObject);
  static sequence<ModuleImportDescriptor> imports(Module moduleObject);
  static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
};
extern 型の 文字列値 type は次のとおりである
exports(moduleObject) メソッドは、呼び出されると、 次の手順を実行する:
  1. modulemoduleObject.[[Module]] とする。

  2. exports を « » とする。

  3. (name, type) について、module_exports(module) の、

    1. kind を、typeextern 型の文字列値 とする。

    2. obj を «[ "name" → name, "kind" → kind ]» とする。

    3. objexports追加 する。

  4. exports を返す。

imports(moduleObject) メソッドは、呼び出されると、 次の手順を実行する:
  1. modulemoduleObject.[[Module]] とする。

  2. builtinSetNamesmoduleObject.[[BuiltinSets]] とする。

  3. importedStringModulemoduleObject.[[ImportedStringModule]] とする。

  4. imports を « » とする。

  5. (moduleName, name, type) について、module_imports(module) の、

    1. (moduleName, name, type) に対する ビルトインの検索builtinSetNames について null ではないなら、continue する。

    2. importedStringModule が null ではなく、かつ moduleNameimportedStringModule に等しいなら、continue する。

    3. kind を、typeextern 型の文字列値 とする。

    4. obj を «[ "module" → moduleName, "name" → name, "kind" → kind ]» とする。

    5. objimports追加 する。

  6. imports を返す。

customSections(moduleObject, sectionName) メソッドは、呼び出されると、次の手順を実行する:
  1. bytesmoduleObject.[[Bytes]] とする。

  2. customSections を « » とする。

  3. custom section customSection について bytes の、 module grammar に従って解釈されたものを、

    1. name を、customSectionnameUTF-8 としてデコード したものとする。

    2. Assert: name は failure ではない (moduleObject.[[Module]] は 妥当 である)。

    3. name が文字列値として sectionName に等しい場合、

      1. この customsec 生成規則に一致した範囲について、 bytes 内のバイト列のコピーを含む新しい ArrayBuffercustomSections追加 する。

  4. customSections を返す。

Module(bytes, options) コンストラクターは、 呼び出されると、次の手順を実行する:
  1. stableBytes を、バッファが保持するバイト列 のコピー bytes とする。

  2. stableBytesWebAssembly モジュールとしてコンパイル し、その結果を module として保持する。

  3. moduleerror なら、CompileError 例外を throw する。

  4. builtinSetNamesoptions["builtins"] とする。

  5. importedStringModuleoptions["importedStringConstants"] とする。

  6. module に対する ビルトインと インポート文字列の検証 が、 builtinSetNames および importedStringModule を用いて false を返す場合、 CompileError 例外を throw する。

  7. this.[[Module]] を module に設定する。

  8. this.[[Bytes]] を stableBytes に設定する。

  9. this.[[BuiltinSets]] を builtinSetNames に設定する。

  10. this.[[ImportedStringModule]] を importedStringModule に設定する。

注: 実装によっては bytes に対して サイズ制限を課すものがある。この API の使用は推奨されず、非同期 API が推奨される。

5.2. インスタンス

[LegacyNamespace=WebAssembly, Exposed=*]
interface Instance {
  constructor(Module module, optional object importObject);
  readonly attribute object exports;
};
Instance(moduleObject, importObject) コンストラクターは、呼び出されると、次の手順を実行する:
  1. builtinSetNamesmoduleObject.[[BuiltinSets]] とする。

  2. importedStringModulemoduleObject.[[ImportedStringModule]] とする。

  3. modulemoduleObject.[[Module]] とする。

  4. moduleインポートを読み取り、 imports importObjectbuiltinSetNames および importedStringModule を用い、その結果を imports とする。

  5. moduleimports とともに WebAssembly モジュールのコアとして インスタンス化 し、その結果を instance とする。

  6. module および instance から this初期化 する。

注: この同期 API の使用は 推奨されない。実装によっては、インスタンス化時に長時間実行されるコンパイル作業を行うことがあるためである。

Instanceexports 属性の getter は、 this.[[Exports]] を返す。

5.3. メモリ

dictionary MemoryDescriptor {
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Memory {
  constructor(MemoryDescriptor descriptor);
  AddressValue grow(AddressValue delta);
  ArrayBuffer toFixedLengthBuffer();
  ArrayBuffer toResizableBuffer();
  readonly attribute ArrayBuffer buffer;
};

A Memory object は、単一の メモリインスタンス を表し、 これは複数の Instance オブジェクトから 同時に参照され得る。 各 Memory object は 以下の内部スロットを持つ:

メモリアドレス memaddr から 固定長メモリバッファを作成するには、次の手順を実行する:
  1. block を、memaddr の基底メモリと 対応付けられている Data Block とする。

  2. buffer を、内部スロット [[ArrayBufferData]]、[[ArrayBufferByteLength]]、および [[ArrayBufferDetachKey]] を持つ新しい ArrayBuffer とする。

  3. buffer.[[ArrayBufferData]] を block に設定する。

  4. buffer.[[ArrayBufferByteLength]] を block の長さに設定する。

  5. buffer.[[ArrayBufferDetachKey]] を "WebAssembly.Memory" に設定する。

  6. buffer を返す。

メモリアドレス memaddr および maxsize から リサイズ可能な メモリバッファを作成するには、次の手順を実行する:
  1. block を、memaddr の基底メモリと 対応付けられている Data Block とする。

  2. lengthblock の長さとする。

  3. buffer を、内部スロット [[ArrayBufferData]]、[[ArrayBufferByteLength]]、 [[ArrayBufferMaxByteLength]]、および [[ArrayBufferDetachKey]] を持つ新しい ArrayBuffer とする。

  4. buffer.[[ArrayBufferData]] を block に設定する。

  5. buffer.[[ArrayBufferByteLength]] を length に設定する。

  6. buffer.[[ArrayBufferMaxByteLength]] を maxsize に設定する。

  7. buffer.[[ArrayBufferDetachKey]] を "WebAssembly.Memory" に設定する。

  8. buffer を返す。

メモリアドレス memaddr から メモリオブジェクトを 初期化する memoryには、次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Memory object cache とする。

  2. Assert: map[memaddr] は 存在しない

  3. buffer を、memaddr から 固定長メモリバッファを作成する 結果とする。

  4. memory.[[Memory]] を memaddr に設定する。

  5. memory.[[BufferObject]] を buffer に設定する。

  6. Set map[memaddr] を memory に設定する。

メモリアドレス memaddr から メモリオブジェクトを作成するには、 次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Memory object cache とする。

  2. map[memaddr] が 存在する 場合、

    1. map[memaddr] を返す。

  3. memorynew Memory とする。

  4. memaddr から memory初期化 する。

  5. memory を返す。

Memory(descriptor) コンストラクターは、呼び出されると、 次の手順を実行する:
  1. descriptor["address"] が 存在する 場合、 addrtypedescriptor["address"] とする; そうでなければ、 addrtype を "i32" とする。

  2. initial? AddressValueToU64(descriptor["initial"], addrtype) とする。

  3. descriptor["maximum"] が 存在する 場合、 maximum? AddressValueToU64(descriptor["maximum"], addrtype) とする; そうでなければ、maximum を empty とする。

  4. memtypememory type addrtype { min initial, max maximum } とする。

  5. memtype妥当 でない場合、RangeError 例外を throw する。

  6. store を、surrounding agentassociated store とする。

  7. (store, memaddr) を mem_alloc(store, memtype) とする。 割り当てに失敗した場合、RangeError 例外を throw する。

  8. surrounding agentassociated storestore に設定する。

  9. memaddr から this初期化 する。

memaddrMemory バッファを更新するには、 次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Memory object cache とする。

  2. Assert: map[memaddr] は 存在する

  3. memorymap[memaddr] とする。

  4. buffermemory.[[BufferObject]] とする。

  5. IsFixedLengthArrayBuffer(buffer) が true の場合、

    1. ! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。

    2. buffer を、memaddr から 固定長メモリバッファを作成する 結果とする。

    3. memory.[[BufferObject]] を buffer に設定する。

  6. それ以外の場合、

    1. block を、memaddr の基底メモリと 対応付けられている Data Block とする。

    2. buffer.[[ArrayBufferData]] を block に設定する。

    3. buffer.[[ArrayBufferByteLength]] を block の長さに設定する。

メモリアドレス memaddr に関連付けられた メモリバッファを拡張する には、delta だけ、次の手順を実行する:
  1. store を、surrounding agentassociated store とする。

  2. retmem_size(store, memaddr) とする。

  3. storemem_grow(store, memaddr, delta) とする。

  4. storeerror なら、RangeError 例外を throw する。

  5. surrounding agentassociated storestore に設定する。

  6. memaddrメモリバッファを更新する

  7. ret を返す。

grow(delta) メソッドは、呼び出されると、次の手順を実行する:
  1. memaddrthis.[[Memory]] とする。

  2. store を、surrounding agentassociated store とする。

  3. addrtype を、address type in mem_type(store, memaddr) とする。

  4. delta64? AddressValueToU64(delta, addrtype) とする。

  5. retmemaddr に関連付けられた メモリバッファを拡張する 結果とし、 delta64 だけ。

  6. U64ToAddressValue(ret, addrtype) を返す。

WebAssembly の memory.grow x 命令が実行された直後に、次の手順を実行する:

  1. スタック最上部が i32.const (−1) でなく、かつスタック最上部が i64.const (−1) でもない場合、

    1. frame現在のフレーム とする。

    2. Assert: 検証により、frame.module.memaddrs[x] は存在する。

    3. memaddr をメモリアドレス frame.module.memaddrs[x] とする。

    4. memaddrメモリバッファを更新する

toFixedLengthBuffer() メソッドは、呼び出されると、 次の手順を実行する:
  1. bufferthis.[[BufferObject]] とする。

  2. IsFixedLengthArrayBuffer(buffer) が true なら、buffer を返す。

  3. memaddrthis.[[Memory]] とする。

  4. fixedBuffer を、memaddr から 固定長メモリバッファを作成する 結果とする。

  5. ! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。

  6. this.[[BufferObject]] を fixedBuffer に設定する。

  7. fixedBuffer を返す。

toResizableBuffer() メソッドは、呼び出されると、 次の手順を実行する:
  1. memaddrthis.[[Memory]] とする。

  2. store を、surrounding agentassociated store とする。

  3. memtypemem_type(store, memaddr) とする。

  4. memtype が max を持たない場合、

    1. Throw a TypeError exception.

  5. bufferthis.[[BufferObject]] とする。

  6. IsFixedLengthArrayBuffer(buffer) が false なら、buffer を返す。

  7. Assert: memtype は max を持つ。

  8. maxsizememtype の max 値 * 65536 とする。

  9. resizableBuffer を、memaddrmaxsize から リサイズ可能なメモリバッファを作成する 結果とする。

  10. ! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。

  11. this.[[BufferObject]] を resizableBuffer に設定する。

  12. resizableBuffer を返す。

ArrayBuffer objects returned by a Memory object は、 WebAssembly の ページ サイズ(定数 65536)の倍数であるサイズを持たなければならない。この理由により HostResizeArrayBuffer は以下のように再定義される。

抽象操作 HostResizeArrayBuffer は、 引数 bufferArrayBuffer) および newLength を取る。呼び出されたとき、次の手順を実行する。

  1. buffer.[[ArrayBufferDetachKey]] が "WebAssembly.Memory" の場合、

    1. map を、surrounding agent に関連付けられた Memory object cache とする。

    2. Assert: buffer は、map 内のちょうど 1 つの値の [[BufferObject]] である。

    3. memaddrmem について map 内の、

      1. SameValue(mem.[[BufferObject]], buffer) が true の場合、

        1. Assert: buffer.[[ArrayBufferByteLength]] modulo 65536 は 0 である。

        2. lengthDeltanewLength - buffer.[[ArrayBufferByteLength]] とする。

        3. lengthDelta < 0、または lengthDelta modulo 65536 が 0 でない場合、

          1. RangeError 例外を throw する。

        4. deltalengthDelta ÷ 65536 とする。

        5. memaddr に関連付けられた メモリバッファを拡張するdelta だけ行う。

    4. handled を返す。

  2. それ以外の場合、unhandled を返す。

Memorybuffer 属性の getter は、 this.[[BufferObject]] を返す。

5.4. テーブル

enum TableKind {
  "externref",
  "anyfunc",
  // 注: 将来の反復でさらに値が追加される可能性がある,
  // 例: 型付き関数参照, 型付き GC 参照
};

dictionary TableDescriptor {
  required TableKind element;
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Table {
  constructor(TableDescriptor descriptor, optional any value);
  AddressValue grow(AddressValue delta, optional any value);
  any get(AddressValue index);
  undefined set(AddressValue index, optional any value);
  readonly attribute AddressValue length;
};

A Table object は、単一の テーブルインスタンス を表し、 これは複数の Instance オブジェクトから 同時に参照され得る。 各 Table object は [[Table]] 内部スロットを持ち、これは テーブルアドレス である。

テーブルアドレス tableaddr から テーブルオブジェクトを 初期化する tableには、次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Table object cache とする。

  2. Assert: map[tableaddr] は 存在しない

  3. table.[[Table]] を tableaddr に設定する。

  4. Set map[tableaddr] を table に設定する。

テーブルアドレス tableaddr から テーブルオブジェクトを作成するには、 次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Table object cache とする。

  2. map[tableaddr] が 存在する 場合、

    1. map[tableaddr] を返す。

  3. tablenew Table とする。

  4. tableaddr から table初期化 する。

  5. table を返す。

Table(descriptor, value) コンストラクターは、呼び出されると、 次の手順を実行する:
  1. elementtypeToValueType(descriptor["element"]) とする。

  2. elementtypereftype でない場合、

    1. Throw a TypeError exception.

  3. descriptor["address"] が 存在する 場合、 addrtypedescriptor["address"] とする; そうでなければ、 addrtype を "i32" とする。

  4. initial? AddressValueToU64(descriptor["initial"], addrtype) とする。

  5. descriptor["maximum"] が 存在する 場合、 maximum? AddressValueToU64(descriptor["maximum"], addrtype) とする; そうでなければ、maximum を empty とする。

  6. typetable type addrtype { min initial, max maximum } elementtype とする。

  7. type妥当 でない場合、RangeError 例外を throw する。

  8. value が欠けている場合、

    1. refDefaultValue(elementtype) とする。

    2. Assert: referror ではない。

  9. それ以外の場合、

    1. ref? ToWebAssemblyValue(value, elementtype) とする。

  10. store を、surrounding agentassociated store とする。

  11. (store, tableaddr) を table_alloc(store, type, ref) とする。割り当てに失敗した場合、RangeError 例外を throw する。

  12. surrounding agentassociated storestore に設定する。

  13. tableaddr から this初期化 する。

grow(delta, value) メソッドは、呼び出されると、 次の手順を実行する:
  1. tableaddrthis.[[Table]] とする。

  2. store を、surrounding agentassociated store とする。

  3. initialSizetable_size(store, tableaddr) とする。

  4. (addrtype, limits, elementtype) を table_type(store, tableaddr) とする。

  5. delta64? AddressValueToU64(delta, addrtype) とする。

  6. value が欠けている場合、

    1. refDefaultValue(elementtype) とする。

    2. referror なら、TypeError 例外を throw する。

  7. それ以外の場合、

    1. ref? ToWebAssemblyValue(value, elementtype) とする。

  8. resulttable_grow(store, tableaddr, delta64, ref) とする。

  9. resulterror なら、RangeError 例外を throw する。

    注: 上記の例外は、 メモリ不足または無効なサイズパラメーターのいずれかにより発生し得る。

  10. surrounding agentassociated storeresult に設定する。

  11. U64ToAddressValue(initialSize, addrtype) を返す。

Tablelength 属性の getter は、呼び出されると、 次の手順を実行する:
  1. tableaddrthis.[[Table]] とする。

  2. store を、surrounding agentassociated store とする。

  3. addrtype を、address type in table_type(store, tableaddr) とする。

  4. length64table_size(store, tableaddr) とする。

  5. U64ToAddressValue(length64, addrtype) を返す。

get(index) メソッドは、呼び出されると、次の手順を実行する:
  1. tableaddrthis.[[Table]] とする。

  2. store を、surrounding agentassociated store とする。

  3. (addrtype, limits, elementtype) を table_type(store, tableaddr) とする。

  4. elementtypematches exnref の場合、

    1. TypeError 例外を throw する。

  5. index64? AddressValueToU64(index, addrtype) とする。

  6. resulttable_read(store, tableaddr, index64) とする。

  7. resulterror なら、RangeError 例外を throw する。

  8. ! ToJSValue(result) を返す。

set(index, value) メソッドは、呼び出されると、 次の手順を実行する:
  1. tableaddrthis.[[Table]] とする。

  2. store を、surrounding agentassociated store とする。

  3. (addrtype, limits, elementtype) を table_type(store, tableaddr) とする。

  4. elementtypematches exnref の場合、

    1. TypeError 例外を throw する。

  5. index64? AddressValueToU64(index, addrtype) とする。

  6. value が欠けている場合、

    1. refDefaultValue(elementtype) とする。

    2. referror なら、TypeError 例外を throw する。

  7. それ以外の場合、

    1. ref? ToWebAssemblyValue(value, elementtype) とする。

  8. storetable_write(store, tableaddr, index64, ref) とする。

  9. storeerror なら、RangeError 例外を throw する。

  10. surrounding agentassociated storestore に設定する。

5.5. グローバル

enum ValueType {
  "i32",
  "i64",
  "f32",
  "f64",
  "v128",
  "externref",
  "anyfunc",
};

注: この型は、将来の WebAssembly のバージョンで 追加のケースに拡張される可能性がある。

dictionary GlobalDescriptor {
  required ValueType value;
  boolean mutable = false;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Global {
  constructor(GlobalDescriptor descriptor, optional any v);
  any valueOf();
  attribute any value;
};

A Global object は、単一の グローバルインスタンス を表し、 これは複数の Instance オブジェクトから 同時に参照され得る。 各 Global object は 1 つの内部スロットを持つ:

グローバルアドレス globaladdr から グローバルオブジェクトを 初期化する globalには、次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Global object cache とする。

  2. Assert: map[globaladdr] は 存在しない

  3. global.[[Global]] を globaladdr に設定する。

  4. Set map[globaladdr] を global に設定する。

グローバルアドレス globaladdr から グローバルオブジェクトを作成するには、 次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Global object cache とする。

  2. map[globaladdr] が 存在する 場合、

    1. map[globaladdr] を返す。

  3. globalnew Global とする。

  4. globaladdr から global初期化 する。

  5. global を返す。

アルゴリズム ToValueType(s) は、次の手順を実行する:
  1. s が "i32" に等しい場合、i32 を返す。

  2. s が "i64" に等しい場合、i64 を返す。

  3. s が "f32" に等しい場合、f32 を返す。

  4. s が "f64" に等しい場合、f64 を返す。

  5. s が "v128" に等しい場合、v128 を返す。

  6. s が "anyfunc" に等しい場合、funcref を返す。

  7. s が "externref" に等しい場合、externref を返す。

  8. Assert: この段階には到達しない。

アルゴリズム DefaultValue(valuetype) は、次の手順を実行する:
  1. valuetypeexternref に等しい場合、! ToWebAssemblyValue(undefined, valuetype) を返す。

  2. val_default(valuetype) を返す。

Global(descriptor, v) コンストラクターは、呼び出されると、 次の手順を実行する:
  1. mutabledescriptor["mutable"] とする。

  2. valuetypeToValueType(descriptor["value"]) とする。

  3. valuetypematches v128 または exnref の場合、

    1. TypeError 例外を throw する。

  4. v が欠けている場合、

    1. valueDefaultValue(valuetype) とする。

    2. Assert: valueerror ではない。

  5. それ以外の場合、

    1. value? ToWebAssemblyValue(v, valuetype) とする。

  6. mutable が true の場合、globaltypevar valuetype とする; そうでなければ、 globaltypeconst valuetype とする。

  7. store を、surrounding agentassociated store とする。

  8. (store, globaladdr) を global_alloc(store, globaltype, value) とする。

  9. surrounding agentassociated storestore に設定する。

  10. globaladdr から this初期化 する。

アルゴリズム GetGlobalValue(Global global) は、次の手順を実行する:
  1. store を、surrounding agentassociated store とする。

  2. globaladdrglobal.[[Global]] とする。

  3. globaltypeglobal_type(store, globaladdr) とする。

  4. globaltypemut valuetype の形式であり、 valuetypematches v128 または exnref の場合、TypeError を throw する。

  5. valueglobal_read(store, globaladdr) とする。

  6. ! ToJSValue(value) を返す。

Globalvalue 属性の getter は、呼び出されると、 次の手順を実行する:
  1. GetGlobalValue(this) を返す。

Global の value 属性の setter は、 呼び出されると、次の手順を実行する:

  1. store を、surrounding agentassociated store とする。

  2. globaladdrthis.[[Global]] とする。

  3. mut valuetypeglobal_type(store, globaladdr) とする。

  4. valuetypematches v128 または exnref の場合、TypeError を throw する。

  5. mutconst の場合、TypeError を throw する。

  6. value? ToWebAssemblyValue(the given value, valuetype) とする。

  7. storeglobal_write(store, globaladdr, value) とする。

  8. storeerror なら、RangeError 例外を throw する。

  9. surrounding agentassociated storestore に設定する。

valueOf() メソッドは、呼び出されると、次の手順を実行する:
  1. GetGlobalValue(this) を返す。

5.6. エクスポートされた関数

WebAssembly 関数は、JavaScript では Exported Function として利用可能になる。 Exported Functions は、コンストラクターではない 組み込み関数オブジェクト であり、 [[FunctionAddress]] 内部スロットを持つ。 このスロットは、関数アドレス を保持し、周囲の agent関連付けられた store に相対的である。

WebAssembly 関数の名前 funcaddr は、次の手順を実行して求められる:
  1. store周囲の agent関連付けられた store とする。

  2. funcinststore.funcs[funcaddr] とする。

  3. funcinst が {type functype, hostcode hostfunc} の形式である場合、

    1. Assert: hostfunc は JavaScript オブジェクトであり、IsCallable(hostfunc) は true である。

    2. index を、ホスト関数 funcaddrホスト関数インデックス とする。

  4. それ以外の場合、

    1. moduleinstfuncinst.module とする。

    2. Assert: funcaddrmoduleinst.funcaddrs に含まれている。

    3. index を、funcaddr が見つかる moduleinst.funcaddrs のインデックスとする。

  5. ! ToString(index) を返す。

WebAssembly の 関数アドレス funcaddr から 新しい Exported Function を作成するには、次の手順を実行する:
  1. map周囲の agent の関連する Exported Function cache とする。

  2. map[funcaddr] が 存在する 場合、

    1. map[funcaddr] を返す。

  3. steps を「"Exported Function を呼び出す funcaddr with arguments."」とする。

  4. realm現在の Realm とする。

  5. store周囲の agent関連付けられた store とする。

  6. functypefunc_type(store, funcaddr) とする。

  7. [paramTypes] → [resultTypes] を functype とする。

  8. arityparamTypessize とする。

  9. name を、funcaddr に対応する WebAssembly 関数の名前 とする。

  10. function! CreateBuiltinFunction(steps, arity, name, « [[FunctionAddress]] », realm) とする。

  11. function.[[FunctionAddress]] を funcaddr に設定する。

  12. Set map[funcaddr] を function に設定する。

  13. function を返す。

関数アドレス funcaddr と、 JavaScript 引数の リスト argValues を用いて Exported Function を呼び出すには、次の手順を実行する:
  1. store周囲の agent関連付けられた store とする。

  2. functypefunc_type(store, funcaddr) とする。

  3. [parameters] → [results] を functype とする。

  4. parameters または results のいずれかの型が matches v128 または exnref である場合、TypeError を throw する。

    注: 上記のエラーは、 [[Call]] メソッドが呼び出されるたびに throw される。

  5. args を « » とする。

  6. i を 0 とする。

  7. t について parameters の、

    1. argValuessize > i なら、argargValues[i] とする。

    2. それ以外の場合、arg を undefined とする。

    3. Append ? ToWebAssemblyValue(arg, t) を args に追加する。

    4. ii + 1 に設定する。

  8. (store, ret) を func_invoke(store, funcaddr, args) の結果とする。

  9. 周囲の agent関連付けられた storestore に設定する。

  10. reterror なら、例外を throw する。この例外は、 特に WebAssembly エラー対応付け に別段の記載がない限り、 WebAssembly の RuntimeError 例外であるべきである。

  11. retexception exnaddr である場合、

    1. tagaddrexn_tag(store, exnaddr) とする。

    2. payloadexn_read(store, exnaddr) とする。

    3. jsTagAddr を、JavaScript 例外タグを取得する 結果とする。

    4. tagaddrjsTagAddr と等しい場合、

      1. ! ToJSValue(payload[0]) を throw する。

    5. それ以外の場合、

      1. exception を、exnaddr から作成された 新しい Exception とする。

      2. exception を throw する。

  12. outArityretsize とする。

  13. outArity が 0 なら、undefined を返す。

  14. それ以外で、outArity が 1 なら、! ToJSValue(ret[0]) を返す。

  15. それ以外の場合、

    1. values を « » とする。

    2. r について ret の、

      1. Append ! ToJSValue(r) を values に追加する。

    3. CreateArrayFromList(values) を返す。

注: Exported Function の呼び出し は、 組み込み関数オブジェクト の定義に従い、 呼び出される側の Exported Function の [[Realm]] で実行される。

注: Exported Functions は [[Construct]] メソッドを持たないため、new 演算子で呼び出すことはできない。

JavaScript オブジェクト func、型 functype、 および リストWebAssembly 値 arguments から ホスト関数を実行するには、 次の手順を実行する:
  1. [parameters] → [results] を functype とする。

  2. parameters または results のいずれかの型が matches v128 または exnref である場合、TypeError を throw する。

  3. jsArguments を « » とする。

  4. arg について arguments の、

    1. Append ! ToJSValue(arg) を jsArguments に追加する。

  5. ret? Call(func, undefined, jsArguments) の結果とする。

  6. resultsSizeresultssize とする。

  7. resultsSize が 0 なら、« » を返す。

  8. それ以外で、resultsSize が 1 なら、« ? ToWebAssemblyValue(ret, results[0]) » を返す。

  9. それ以外の場合、

    1. method? GetMethod(ret, %Symbol.iterator%) とする。

    2. method が undefined なら、throw a TypeError

    3. values? IteratorToList(? GetIteratorFromMethod(ret, method)) とする。

    4. wasmValues を新しい空の リスト とする。

    5. valuessizeresultsSize でない場合、TypeError 例外を throw する。

    6. values の各 valueresults の各 resultType を線形に対応付けて、

      1. Append ? ToWebAssemblyValue(value, resultType) を wasmValues に追加する。

    7. wasmValues を返す。

JavaScript オブジェクト func と型 functype から ホスト関数を作成するには、 次の手順を実行する:
  1. Assert: IsCallable(func)。

  2. stored settings現在の設定オブジェクト とする。

  3. hostfunc を、引数 arguments で呼び出されたときに 次の手順を実行する ホスト関数 とする:

    1. realmfunc関連付けられた Realm とする。

    2. relevant settingsrealmsettings object とする。

    3. Prepare to run script with relevant settings.

    4. Prepare to run a callback with stored settings.

    5. result を、funcfunctype、および arguments から ホスト関数を実行する 結果とする。

    6. Clean up after running a callback with stored settings.

    7. Clean up after running script with relevant settings.

    8. Assert: result.[[Type]] は throw または normal である。

    9. store周囲の agent関連付けられた store とする。

    10. result.[[Type]] が throw の場合、:

      1. vresult.[[Value]] とする。

      2. vimplements Exception の場合、

        1. addressv.[[Address]] とする。

      3. それ以外の場合、

        1. type を、JavaScript 例外タグを取得する 結果とする。

        2. payload! ToWebAssemblyValue(v, externref) とする。

        3. (store, address) を exn_alloc(store, type, « payload ») とする。

        4. 周囲の agent関連付けられた storestore に設定する。

      4. WebAssembly 命令 (ref.exn address) (throw_ref) を実行する。

    11. それ以外の場合、result.[[Value]] を返す。

  4. store周囲の agent関連付けられた store とする。

  5. (store, funcaddr) を func_alloc(store, functype, hostfunc) とする。

  6. 周囲の agent関連付けられた storestore に設定する。

  7. funcaddr を返す。

アルゴリズム ToJSValue(w) は、 WebAssembly 値 を JavaScript 値へ強制変換する。 次の手順を実行する:
  1. Assert: wv128.const v128 の形式ではない。

  2. Assert: wref.exn exnaddr の形式ではない。

  3. wi64.const u64 の形式である場合、

    1. i64signed_64(u64) とする。

    2. (i64 interpreted as a 数学的値) を返す。

  4. wi32.const u32 の形式である場合、

    1. i32signed_32(u32) とする。

    2. 𝔽(i32 interpreted as a 数学的値) を返す。

  5. wf32.const f32 の形式である場合、

    1. f32+∞ または −∞ の場合、それぞれ +∞𝔽 または -∞𝔽 を返す。

    2. f32nan の場合、NaN を返す。

    3. 𝔽(f32 interpreted as a 数学的値) を返す。

  6. wf64.const f64 の形式である場合、

    1. f64+∞ または −∞ の場合、それぞれ +∞𝔽 または -∞𝔽 を返す。

    2. f64nan の場合、NaN を返す。

    3. 𝔽(f64 interpreted as a 数学的値) を返す。

  7. wref.null t の形式である場合、null を返す。

  8. wref.i31 u31 の形式である場合、

    1. i31signed_31(u31) とする。

    2. 𝔽(i31) を返す。

  9. wref.struct structaddr の形式である場合、新しい Exported GC Objectstructaddr と "struct" から作成した結果を返す。

  10. wref.array arrayaddr の形式である場合、新しい Exported GC Objectarrayaddr と "array" から作成した結果を返す。

  11. wref.func funcaddr の形式である場合、新しい Exported Functionfuncaddr から作成した結果を返す。

  12. wref.host hostaddr の形式である場合、ホスト値を取得するhostaddr から行った結果を返す。

  13. wref.extern ref の形式である場合、ToJSValue(ref) を返す。

注: NaN に等しい Number 値は、 観測可能なさまざまな NaN ペイロードを持ち得る; 詳細は NumericToRawBytes を参照。

ホスト値を取得する ために、ホストアドレス hostaddr から、次の手順を実行する:

  1. map周囲の agent の関連する host value cache とする。

  2. Assert: map[hostaddr] は 存在する

  3. map[hostaddr] を返す。

アルゴリズム ToWebAssemblyValue(v, type) は、JavaScript 値を WebAssembly 値 に強制変換する。 次の手順を実行する:
  1. Assert: typev128 ではない。

  2. Assert: typematch exnref しない。

  3. typei64 の場合、

    1. i64? ToBigInt64(v) とする。

    2. u64 を、i64signed_64(u64) となるような符号なし整数とする。

    3. i64.const u64 を返す。

  4. typei32 の場合、

    1. i32? ToInt32(v) とする。

    2. u32 を、i32signed_32(u32) となるような符号なし整数とする。

    3. i32.const u32 を返す。

  5. typef32 の場合、

    1. number? ToNumber(v) とする。

    2. numberNaN の場合、

      1. n を、canon32n < 2signif(32) を満たす 実装定義の整数とする。

      2. f32nan(n) とする。

    3. それ以外の場合、

      1. f32 を、IEEE 754-2019 の最近接丸め・同値の場合偶数丸めモードを用いて、 number を最も近い表現可能値へ丸めたものとする。[IEEE-754]

    4. f32.const f32 を返す。

  6. typef64 の場合、

    1. number? ToNumber(v) とする。

    2. numberNaN の場合、

      1. n を、canon64n < 2signif(64) を満たす 実装定義の整数とする。

      2. f64nan(n) とする。

    3. それ以外の場合、

      1. f64number とする。

    4. f64.const f64 を返す。

  7. typeref null heaptype の形式である場合、

    1. v が null の場合、

      1. rref.null heaptype とする。

    2. Else if match_valtype(type, ref null extern) の場合、

      1. ref! ToWebAssemblyValue(v, ref any) とする。

      2. rref.extern ref とする。

    3. Else if vExported Function であり、かつ match_valtype(type, ref null func) の場合、

      1. funcaddrv の [[FunctionAddress]] 内部スロットの値とする。

      2. rref.func funcaddr とする。

    4. Else if vNumber でありv? ToInt32(v) と等しく、かつ (v) < 230 かつ (v) ⩾ -230 の場合、

      1. i31? ToInt32(v) とする。

      2. u31 を、i31signed_31(u31) となるような符号なし整数とする。

      3. rref.i31 u31 とする。

    5. Else if vExported GC Object の場合、

      1. objectaddrv の [[ObjectAddress]] 内部スロットの値とする。

      2. objectkindv の [[ObjectKind]] 内部スロットの値とする。

      3. objectkind が "array" の場合、

        1. rref.array objectaddr とする。

      4. Else if objectkind が "struct" の場合、

        1. rref.struct objectaddr とする。

    6. Else,

      1. map周囲の agent の関連する host value cache とする。

      2. map[hostaddr] が v と同一であるような host address hostaddr が存在する場合、

        1. ref.host hostaddr を返す。

      3. map[hostaddr] exists が false であるような最小の host address hostaddr をとる。

      4. Set map[hostaddr] を v に設定する。

      5. rref.host hostaddr とする。

    7. store周囲の agent関連付けられた store とする。

    8. actualtyperef_type(store, r) とする。

    9. match_valtype(actualtype, type) が false の場合、

      1. TypeError を throw する。

    10. r を返す。

  8. Assert: この段階には到達しない。

アルゴリズム AddressValueToU64(v, addrtype) は、JavaScript 値を埋め込み操作で使用するための WebAssembly u64 に変換する。これは、 AddressType "i32" に対しては [EnforceRange] unsigned long のように振る舞うよう設計されており、 さらにその意味論を AddressType "i64" に拡張する。次の手順を実行する:
  1. addrtype が "i32" の場合、

    1. n? ConvertToInt(v, 32, "unsigned") とする。ここで、宛先型は [EnforceRange] に関連付けられている。

      注: これは、JS conversion rules for [EnforceRange] unsigned long と等価である。

    2. WebAssembly の u64 として (n) を返す。

  2. addrtype が "i64" の場合、

    1. n? ToBigInt(v) とする。

    2. n < 0 または n > 264 − 1 の場合、throw a TypeError

      注: この操作は、 [EnforceRange] を模倣するよう設計されている。

    3. WebAssembly の u64 として (n) を返す。

  3. Assert: この段階には到達しない。

アルゴリズム U64ToAddressValue(v, addrtype) は、 WebAssembly 埋め込み操作から得られた u64 値を、正しい種類の AddressValue に変換する。これは AddressType に対するものであり、次の手順を実行する:
  1. addrtype が "i32" の場合、𝔽(v interpreted as a 数学的値) を返す。

  2. Else if addrtype が "i64" の場合、(v interpreted as a 数学的値) を返す。

  3. Assert: この段階には到達しない。

5.7. タグ

5.7.1. タグ型

dictionary TagType {
  required sequence<ValueType> parameters;
};

[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
interface Tag {
  constructor(TagType type);
};

Tag 値は 例外タグを表す。

Tag オブジェクトを初期化する ために、タグアドレス tagAddress から tag を初期化するには、 次の手順を実行する:

  1. map周囲の agent に関連付けられた Tag object cache とする。

  2. Assert: map[tagAddress] は 存在しない

  3. tag.[[Address]] を tagAddress に設定する。

  4. Set map[tagAddress] を tag に設定する。

Tag オブジェクトを作成する ために、タグアドレス tagAddress から、次の手順を実行する:
  1. map周囲の agent に関連付けられた Tag object cache とする。

  2. map[tagAddress] が 存在する 場合、

    1. map[tagAddress] を返す。

  3. tagnew Tag とする。

  4. Initialize tagtagAddress から行う。

  5. tag を返す。

new Tag(type) コンストラクターの手順は次のとおり:

  1. parameterstype["parameters"] とする。

  2. wasmParameters を «» とする。

  3. paramType について parameters の、

    1. Append ToValueType(paramType) を wasmParameters に追加する。

  4. store周囲の agent関連付けられた store とする。

  5. (store, tagAddress) を tag_alloc(store, wasmParameters → « ») とする。

  6. 周囲の agent関連付けられた storestore に設定する。

  7. Initialize thistagAddress から行う。

5.8. ガベージコレクトされるオブジェクト

WebAssembly の struct または array は、JavaScript では Exported GC Object として利用可能になる。 Exported GC Object は、ガベージコレクトされる WebAssembly 参照値を包む特殊オブジェクトである。 Exported GC Object に対するほとんどの JavaScript 操作は、 例外を投げるか undefined を返す。

注: これらの操作は将来、 JavaScript から WebAssembly の struct や array とのより豊かな相互作用を可能にするよう 改良される可能性がある。

Exported GC Object は [[ObjectAddress]] 内部スロットを含み、これは object address を保持する。 それは 周囲の agent関連付けられた store に相対的であり、 また [[ObjectKind]] 内部スロットを含み、これは文字列値 "struct" または "array" を保持する。

Exported GC Object の内部メソッドは、 以下の実装を使用する。

Exported GC Object の [[GetPrototypeOf]] 内部メソッド O は引数を取らず null を返す。呼び出されたとき、次の手順を実行する:
  1. null を返す。

Exported GC Object の [[SetPrototypeOf]] 内部メソッド O は引数 V(Object または null)を取り、 boolean を返す。呼び出されたとき、次の手順を実行する:
  1. false を返す。

Exported GC Object の [[IsExtensible]] 内部メソッド O は引数を取らず boolean を返す。呼び出されたとき、 次の手順を実行する:
  1. false を返す。

Exported GC Object の [[PreventExtensions]] 内部メソッド O は引数を取らず boolean を返す。呼び出されたとき、 次の手順を実行する:
  1. false を返す。

Exported GC Object の [[GetOwnProperty]] 内部メソッド O は引数 P(property key)を取り、 undefined を返す。呼び出されたとき、次の手順を実行する:
  1. undefined を返す。

Exported GC Object の [[DefineOwnProperty]] 内部メソッド O は引数 P(property key)および Desc(property descriptor)を取り、boolean を返す。呼び出されたとき、 次の手順を実行する:
  1. false を返す。

Exported GC Object の [[HasProperty]] 内部メソッド O は引数 P(property key)を取り、 boolean を返す。呼び出されたとき、次の手順を実行する:
  1. false を返す。

Exported GC Object の [[Get]] 内部メソッド O は引数 P(property key)および Receiver(ECMAScript 言語値) を取り、undefined を返す。呼び出されたとき、次の手順を実行する:
  1. undefined を返す。

Exported GC Object の [[Set]] 内部メソッド O は引数 P(property key)、V(ECMAScript 言語値)、 および Receiver(ECMAScript 言語値)を取り、例外を投げる。 呼び出されたとき、次の手順を実行する:
  1. TypeError を throw する。

Exported GC Object の [[Delete]] 内部メソッド O は引数 P(property key)を取り、 例外を投げる。呼び出されたとき、次の手順を実行する:
  1. TypeError を throw する。

Exported GC Object の [[OwnPropertyKeys]] 内部メソッド O は引数を取らず list を返す。呼び出されたとき、 次の手順を実行する:
  1. keys を新しい空の list とする。

  2. keys を返す。

新しい Exported GC Object を WebAssembly の object address objectaddr と文字列 objectkind から作成するには、次の手順を実行する:
  1. Assert: objectkind は "array" または "struct" のいずれかである。

  2. map周囲の agent に関連付けられた exported GC object cache とする。

  3. map[objectaddr] が 存在する 場合、

    1. map[objectaddr] を返す。

  4. objectMakeBasicObject(« [[ObjectAddress]], [[ObjectKind]] ») とする。

  5. object.[[ObjectAddress]] を objectaddr に設定する。

  6. object.[[ObjectKind]] を objectkind に設定する。

  7. object.[[GetPrototypeOf]] を Exported GC Object の [[GetPrototypeOf]] 内部メソッド で指定されるものに設定する。

  8. object.[[SetPrototypeOf]] を Exported GC Object の [[SetPrototypeOf]] 内部メソッド で指定されるものに設定する。

  9. object.[[IsExtensible]] を Exported GC Object の [[IsExtensible]] 内部メソッド で指定されるものに設定する。

  10. object.[[PreventExtensions]] を Exported GC Object の [[PreventExtensions]] 内部メソッド で指定されるものに設定する。

  11. object.[[GetOwnProperty]] を Exported GC Object の [[GetOwnProperty]] 内部メソッド で指定されるものに設定する。

  12. object.[[DefineOwnProperty]] を Exported GC Object の [[DefineOwnProperty]] 内部メソッド で指定されるものに設定する。

  13. object.[[HasProperty]] を Exported GC Object の [[HasProperty]] 内部メソッド で指定されるものに設定する。

  14. object.[[Get]] を Exported GC Object の [[Get]] 内部メソッド で指定されるものに設定する。

  15. object.[[Set]] を Exported GC Object の [[Set]] 内部メソッド で指定されるものに設定する。

  16. object.[[Delete]] を Exported GC Object の [[Delete]] 内部メソッド で指定されるものに設定する。

  17. object.[[OwnPropertyKeys]] を Exported GC Object の [[OwnPropertyKeys]] 内部メソッド で指定されるものに設定する。

  18. Set map[objectaddr] を object に設定する。

  19. object を返す。

5.9. 例外

dictionary ExceptionOptions {
  boolean traceStack = false;
};

[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
interface Exception {
  constructor(Tag exceptionTag, sequence<any> payload, optional ExceptionOptions options = {});
  any getArg(Tag exceptionTag, [EnforceRange] unsigned long index);
  boolean is(Tag exceptionTag);
  readonly attribute (DOMString or undefined) stack;
};

Exception 値は例外を表す。

Exception オブジェクトを初期化する ために、exnException address exnAddress から初期化するには、 次の手順を実行する:

  1. map周囲の agent に関連付けられた Exception object cache とする。

  2. Assert: map[exnAddress] は 存在しない

  3. exn.[[Address]] を exnAddress に設定する。

  4. Set map[exnAddress] を exn に設定する。

  5. store周囲の agent関連付けられた store とする。

  6. tagaddrexn_tag(store, exnAddress) とする。

  7. payloadexn_read(store, exnAddress) とする。

  8. exn.[[Type]] を tagaddr に設定する。

  9. exn.[[Payload]] を payload に設定する。

  10. exn.[[Stack]] を undefined に設定する。

Exception オブジェクトを作成する ために、exception address exnAddress から、 次の手順を実行する:

  1. map周囲の agent に関連付けられた Exception object cache とする。

  2. map[exnAddress] が 存在する 場合、

    1. map[exnAddress] を返す。

  3. exnnew Exception とする。

  4. Initialize exnexnAddress から行う。

  5. exn を返す。

new Exception(exceptionTag, payload, options) コンストラクターの手順は次のとおり:

  1. JSTagAddrJavaScript 例外タグを取得する 結果とする。

  2. exceptionTag.[[Address]] が JSTagAddr と等しい場合、

    1. TypeError を throw する。

  3. store周囲の agent関連付けられた store とする。

  4. [types] → [] を tag_type(store, exceptionTag.[[Address]]) とする。

  5. typessizepayloadsize と等しくない場合、

    1. TypeError を throw する。

  6. wasmPayload を « » とする。

  7. valueresultType について、 payloadtypes を線形に対応付けて、

    1. resultTypematches v128 または exnref の場合、

      1. TypeError を throw する。

    2. Append ? ToWebAssemblyValue(value, resultType) を wasmPayload に追加する。

  8. (store, exceptionAddr) を exn_alloc(store, exceptionTag.[[Address]], wasmPayload) とする。

  9. 周囲の agent関連付けられた storestore に設定する。

  10. Initialize thisexceptionAddr から行う。

  11. options["traceStack"] が true の場合、

    1. this.[[Stack]] を、現在のコールスタックの DOMString 表現または undefined のいずれかに設定する。

getArg(exceptionTag, index) メソッドの手順は次のとおり:

  1. store周囲の agent関連付けられた store とする。

  2. this.[[Type]] が exceptionTag.[[Address]] と等しくない場合、

    1. TypeError を throw する。

  3. tagaddrexn_tag(store, this.[[Address]]) とする。

  4. payloadexn_read(store, this.[[Address]]) とする。

  5. Assert: tagaddrthis.[[Type]] と等しい。

  6. indexpayloadsize の場合、

    1. RangeError を throw する。

  7. [types] → [] を tag_type(store, tagaddr) とする。

  8. types[index] が matches v128 または exnref の場合、

    1. TypeError を throw する。

  9. ! ToJSValue(payload[index]) を返す。

is(exceptionTag) メソッドの手順は次のとおり:

  1. this.[[Type]] が exceptionTag.[[Address]] と等しくない場合、

    1. false を返す。

  2. true を返す。

stack getter の手順は次のとおり:

  1. this.[[Stack]] を返す。

5.9.1. JavaScript 例外

JavaScript 例外タグ は、 タグアドレス であり、 周囲の agent に関連付けられている。これは agent の 関連付けられた store において 初回使用時に割り当てられ、キャッシュされる。常に tag type « externref » → « » を持つ。

JavaScript 例外タグを取得する には、次の手順を実行する:

  1. 周囲の agent に関連付けられた JavaScript exception tag が初期化済みである場合、

    1. 周囲の agent に関連付けられた JavaScript exception tag を返す

  2. store周囲の agent関連付けられた store とする。

  3. (store, tagAddress) を tag_alloc(store, « externref » → « ») とする。

  4. 周囲の agent関連付けられた storestore に設定する。

  5. 周囲の agent に関連付けられた JavaScript exception tagtagAddress に設定する。

  6. tagAddress を返す。

5.10. エラーオブジェクト

WebAssembly は次の Error クラスを定義する: CompileError, LinkError, および RuntimeError

WebAssembly 名前空間の namespace object作成される とき、次の手順を実行しなければならない:
  1. namespaceObjectnamespace object とする。

  2. error について « "CompileError", "LinkError", "RuntimeError" » の、

    1. constructor を、NativeError Object Structure を実装する 新しいオブジェクトとし、NativeErrorerror に設定する。

    2. ! DefineMethodProperty(namespaceObject, error, constructor, false)。

注: これにより CompileError, LinkError, および RuntimeError クラスが WebAssembly 名前空間上に定義される。これらは本仕様で定義される API によって生成される。 これらは、TypeErrorRangeError のようなネイティブ JavaScript エラーと同じインターフェイスを公開する。

注: 現時点ではこの挙動を Web IDL を使って定義することは できない。

6. ビルトイン

JS-API は、モジュールのコンパイル時に options を通じてインポートできるビルトイン関数の集合を定義する。WebAssembly ビルトイン関数は既存の JavaScript ビルトインを反映するが、 最小限のオーバーヘッドで WebAssembly 関数として直接利用できるよう適応されている。

すべてのビルトイン関数は集合にグループ化される。各ビルトイン集合は、 WebAssemblyCompileOptions で使用される name と、 インポート探索中に使用される wasm: 接頭辞付きの qualified name を持つ。

ビルトイン集合の ビルトインを取得する ために、builtinSetName を用いて、 次の手順を実行する:

  1. この節内で定義された、名前 builtinSetName を持つ集合について、 (name, funcType, steps) のリストを返す。

ビルトインを見つける ために、import および有効化されたビルトイン builtinSetNames を用いて、 次の手順を実行する:

  1. Assert: ビルトイン集合名を検証する builtinSetNames は true である。

  2. importModuleNameimport[0] とする。

  3. importNameimport[1] とする。

  4. builtinSetName について builtinSetNames の、

    1. builtinSetName がビルトイン集合を指さない場合、continue する。

    2. builtinSetQualifiedNamebuiltinSetName に "wasm:" を接頭させたものとする。

    3. importModuleNamebuiltinSetQualifiedName と等しい場合、

      1. builtinsビルトイン集合のビルトインを取得する builtinSetName の結果とする。

      2. builtin について builtins の、

        1. builtinNamebuiltin[0] とする。

        2. importNamebuiltinName と等しい場合、 (builtinSetName, builtin) を返す。

  5. null を返す。

ビルトイン集合名を検証する ために、builtinSetNames を用いて、次の手順を実行する:

  1. builtinSetNames に重複が含まれている場合、false を返す。

  2. true を返す。

ビルトイン関数を作成する ために、型 funcType および実行手順 steps から、 次の手順を実行する:

  1. hostfunc を、呼び出されたときに steps を実行する host function とする。

  2. store周囲の agent関連付けられた store とする。

  3. (store, funcaddr) を func_alloc(store, funcType, hostfunc) とする。

  4. 周囲の agent関連付けられた storestore に設定する。

  5. funcaddr を返す。

ビルトイン集合を実体化する ために、名前 builtinSetName を用いて、次の手順を実行する:

  1. builtinsビルトイン集合のビルトインを取得する builtinSetName の結果とする。

  2. exportsObject! OrdinaryObjectCreate(null) とする。

  3. (name, funcType, steps) について builtins の、

    1. funcaddrビルトイン関数を作成する funcTypesteps を用いた結果とする。

    2. func を、funcaddr から 新しい Exported Function を作成する結果とする。

    3. valuefunc とする。

    4. status! CreateDataProperty(exportsObject, name, value) とする。

    5. Assert: status は true である。

  4. exportsObject を返す。

ビルトインに対するインポートを検証する ために、import、 有効化されたビルトイン builtinSetNames を用いて、次の手順を実行する:

  1. Assert: ビルトイン集合名を検証する builtinSetNames は true である。

  2. maybeBuiltinビルトインを見つける importbuiltinSetNames に対する結果とする。

  3. maybeBuiltin が null なら、true を返す。

  4. importExternTypeimport[2] とする。

  5. builtinFuncTypemaybeBuiltin[1][1] とする。

  6. builtinExternTypefunc |builtinFuncType| とする。

  7. match_externtype(builtinExternType, importExternType) を返す。

6.1. 文字列ビルトイン

文字列ビルトインは、String ビルトイン オブジェクトのインターフェイスを適応させる。この集合に対する namejs-string であり、qualified namewasm:js-string である。

注: この節のアルゴリズムは、String 上で定義される JS ビルトインを参照する。これらは実際のビルトインを指し、String オブジェクト上で動的ルックアップを行わない。

6.1.1. 抽象操作

UnwrapString(v) 抽象操作は、呼び出されると、 次の手順を実行する:

  1. vString ではない 場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  2. v を返す

FromCharCode(v) 抽象操作は、呼び出されると、 次の手順を実行する:

  1. Assert: vi32 型である。

  2. ! Call(String.fromCharCode, undefined, « ToJSValue(v) ») を返す。

CharCodeAt(string, index) 抽象 操作は、呼び出されると、次の手順を実行する:

  1. Assert: indexi32 型である。

  2. ! Call(String.prototype.charCodeAt, string, « ToJSValue(index) ») を返す。

6.1.2. cast

このビルトインの funcType(rec (type (func (param externref) (result (ref extern))))).0 である。

このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:

  1. ? UnwrapString(v) を返す

6.1.3. test

このビルトインの funcType(rec (type (func (param externref) (result i32)))).0 である。

このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:

  1. vString ではない 場合、

    1. 0 を返す。

  2. 1 を返す。

6.1.4. fromCharCodeArray

arrayType(rec (type (array (mut i16)))).0 とする。

このビルトインの funcType(rec (type (func (param (ref null arrayType) i32 i32) (result (ref extern))))).0 である。

このビルトインがパラメータ array, start, および end で呼び出されたとき、 次の手順を実行しなければならない:

  1. array が null の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  2. lengtharray 内の要素数とする。

  3. start > end または end > length の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  4. result を空文字列とする。

  5. istart とする。

  6. i < end の間:

    1. charCode を、array のインデックス i に格納された要素の値と する。

    2. charCodeStringFromCharCode(charCode) とする。

    3. resultresultcharCodeString の連結とする。

    4. ii + 1 に設定する。

  7. result を返す。

6.1.5. intoCharCodeArray

arrayType(rec (type (array (mut i16)))).0 とする。

このビルトインの funcType(rec (type (func (param externref (ref null arrayType) i32) (result i32)))).0 である。

このビルトインがパラメータ string, array, および start で呼び出されたとき、 次の手順を実行しなければならない:

  1. array が null の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  2. string? UnwrapString(string) とする。

  3. stringLengthstring長さ とする。

  4. arrayLengtharray 内の要素数とする。

  5. start + stringLength > arrayLength の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  6. i を 0 とする。

  7. i < stringLength の間:

    1. charCodeCharCodeAt(string, i) とする。

    2. array のインデックス start + i にある要素を ToWebAssemblyValue(charCode, i32) に設定する。

    3. ii + 1 に設定する。

  8. stringLength を返す。

6.1.6. fromCharCode

このビルトインの funcType(rec (type (func (param i32) (result (ref extern))))).0 である。

このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:

  1. FromCharCode(v) を返す。

6.1.7. fromCodePoint

このビルトインの funcType(rec (type (func (param i32) (result externref)))).0 である。

このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:

  1. v > 0x10ffff の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  2. ! Call(String.fromCodePoint, undefined, « ToJSValue(v) ») を返す。

6.1.8. charCodeAt

この関数の型は (rec (type (func (param externref i32) (result i32)))).0 である。

このビルトインがパラメータ string および index で呼び出されたとき、次の手順 を実行しなければならない:

  1. string? UnwrapString(string) とする。

  2. lengthstring長さ とする。

  3. index >= length の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  4. CharCodeAt(string, index) を返す。

6.1.9. codePointAt

この関数の型は (rec (type (func (param externref i32) (result i32)))).0 である。

このビルトインがパラメータ string および index で呼び出されたとき、次の手順 を実行しなければならない:

  1. string? UnwrapString(string) とする。

  2. lengthstring長さ とする。

  3. index >= length の場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  4. ! Call(String.prototype.codePointAt, string, « ToJSValue(index) ») を返す。

6.1.10. length

このビルトインの funcType(rec (type (func (param externref) (result i32)))).0 である。

このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:

  1. string? UnwrapString(v) とする。

  2. string長さ を返す。

6.1.11. concat

このビルトインの funcType(rec (type (func (param externref externref) (result (ref extern))))).0 である。

このビルトインがパラメータ first および second で呼び出されたとき、次の手順 を実行しなければならない:

  1. first? UnwrapString(first) とする。

  2. second? UnwrapString(second) とする。

  3. ! Call(String.prototype.concat, first, « second ») を返す。

6.1.12. substring

このビルトインの funcType(rec (type (func (param externref i32 i32) (result (ref extern))))).0 である。

このビルトインがパラメータ string, start, および end で呼び出されたとき、 次の手順を実行しなければならない:

  1. string? UnwrapString(string) とする。

  2. lengthstring長さ とする。

  3. start > end または start > length の場合、

    1. 空文字列を返す。

  4. ! Call(String.prototype.substring, string, « ToJSValue(start), ToJSValue(end) ») を返す。

6.1.13. equals

このビルトインの funcType(rec (type (func (param externref externref) (result i32)))).0 である。

注: null 文字列の等価比較は意味があるため、 それを明示的に許可する。

このビルトインがパラメータ first および second で呼び出されたとき、次の手順 を実行しなければならない:

  1. first が null ではなく、かつ firstString ではない 場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  2. second が null ではなく、かつ secondString ではない 場合、

    1. RuntimeError 例外を、あたかも trap が実行されたかのように throw する。

  3. ! IsStrictlyEqual(first, second) が true の場合、

    1. 1 を返す。

  4. 0 を返す。

6.1.14. compare

このビルトインの funcType(rec (type (func (param externref externref) (result i32)))).0 である。

このビルトインがパラメータ first および second で呼び出されたとき、次の手順 を実行しなければならない:

  1. first? UnwrapString(first) とする。

  2. second? UnwrapString(second) とする。

  3. ! IsStrictlyEqual(first, second) が true である場合、

    1. 0 を返す。

  4. ! IsLessThan(first, second, true) が true である場合、

    1. -1 を返す。

  5. 1 を返す。

7. エラー 条件の JavaScript への対応付け

WebAssembly プログラムの実行では、WebAssembly コードの実行を停止させる特定の事象に遭遇する。 WebAssembly コードは(現在のところ) これらの条件を捕捉する手段を持たないため、例外は必然的に 外側の非 WebAssembly 呼び出し元(ブラウザ、JavaScript、あるいは他のランタイムシステムであるかを問わず) に伝播し、そこで通常の JavaScript 例外として処理される。

WebAssembly が import を介して JavaScript を呼び出し、その JavaScript が 例外を投げた場合、その例外は WebAssembly のアクティベーションを通って 外側の呼び出し元へ伝播する。

JavaScript 例外は処理可能であり、また JavaScript は trap が処理された後でも WebAssembly export を引き続き呼び出せるため、trap は一般に 将来の実行を妨げない。

7.1. スタックオーバーフロー

WebAssembly コード内でスタックオーバーフローが発生した場合は常に、 JavaScript におけるスタックオーバーフローと同じ種類の例外が投げられる。 ここでの具体的な例外は、両方の場合において実装定義である。

注: ECMAScript はスタックオーバーフロー時の挙動を いかなる形でも規定していない; 実装では RangeError, InternalError または Error を投げることが観測されている。ここではいずれも有効である。

7.2. メモリ不足

検証、コンパイル、またはインスタンス化の実行中にメモリ不足になった場合は常に、 JavaScript におけるメモリ不足条件と同じ種類の例外が投げられる。 ここでの具体的な例外は、両方の場合において実装定義である。

注: ECMAScript はメモリ不足条件時の挙動を いかなる形でも規定していない; 実装では OOMError を投げたりクラッシュしたりすることが観測されている。ここでは いずれも有効である。

大きなテーブルまたはメモリの割り当て失敗は、次のいずれかの結果となり得る 将来の改訂では、大量のメモリの割り当てに対する より信頼性が高く回復可能なエラーについて再検討する可能性がある。

さらなる議論については Issue 879 を参照。

8. 実装定義の制限

WebAssembly コア仕様は、実装がモジュールの構文構造に対する制限を定義することを許可している。 WebAssembly の各埋め込みは独自の制限を定義してもよいが、予測可能性のために 本文書で記述される標準 WebAssembly JavaScript Interface は以下の正確な制限を定義する。 実装は、以下のいずれかの制限を超えるモジュールを CompileError で拒否しなければならない。 実際には、実装はこれらの制限未満の妥当なモジュールに対してもリソース不足になる可能性がある。

実行時に次の制限のいずれかを超えた場合、実装は RuntimeError を throw しなければならない: 実際には、実装はこれらの制限未満の妥当なモジュールに対してもリソース不足になる可能性がある。

9. セキュリティおよびプライバシーに関する考慮事項

この節は非規範的である。

この文書は WebAssembly のホスト環境を定義する。これにより WebAssembly インスタンスは import オブジェクトから JavaScript のオブジェクトや関数を インポートオブジェクト として インポートできるが、それ以外で埋め込み環境へアクセスする手段は提供されない。そのため、WebAssembly インスタンスは JavaScript と同じ制約に縛られる。

10. 変更履歴

この節は非規範的である。

WebAssembly 仕様の元のリリース 1.0 以来、複数の拡張提案が統合されてきた。 以下の節では、何が変更されたかの概要を示す。

10.1. リリース 2.0

複数値

複数の値を、Array オブジェクトとして、JavaScript 関数との間で返したり受け取ったりできる。

BigInt 統合

WebAssembly の i64 値は、JavaScript との間で(import/export された global、table の get または set 操作、関数の戻り値または引数を介して)BigInt オブジェクトとして受け渡しできる。

参照型

JavaScript 値は、WebAssembly との間で(import/export された global、table の set または get 操作、および関数引数または戻り値を介して)externref 値として受け渡しできる。

複数テーブル

複数の table を JavaScript との間で export および import できる。

10.2. リリース 3.0

複数メモリ

複数の memory を JavaScript との間で export および import できる。

JS 文字列ビルトイン

モジュールのコンパイル時に builtins オプションが追加され、JS 文字列を操作するためのビルトイン関数群が追加された。

適合性

文書 の慣例

適合要件は、 記述的な断定 と RFC 2119 用語の組み合わせで 表現される。 この文書の規範的部分における キーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、 RFC 2119 で記述されるとおりに 解釈される。 ただし、可読性のために、 本仕様ではこれらの語はすべて大文字では記載されない。

本仕様のすべての本文は規範的である。 ただし、明示的に非規範的と記された節、例、および注は除く。 [RFC2119]

本仕様における例は、“for example” という語で導入されるか、 または規範的本文から class="example" によって区別される。 次のように:

これは参考用の例の一例である。

参考用の注は “Note” という語で始まり、 規範的本文から class="note" によって区別される。 次のように:

Note, これは参考用の注である。

適合する アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (たとえば「先頭の空白文字をすべて取り除く」 や「false を返してこれらの手順を中止する」など) は、そのアルゴリズムの導入で使われる キーワード ("must", "should", "may" など) の意味で解釈される。

アルゴリズムまたは特定の手順として表現された適合要件は、 最終結果が等価である限り、 どのような方法で実装してもよい。 特に、本仕様で定義されるアルゴリズムは、 理解しやすいことを意図しており、 性能を目的としたものではない。 実装者には最適化が推奨される。

索引

この 仕様で定義される用語

参照により定義される 用語

参考文献

規範的参考文献

[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC において要件レベルを示すために 用いるキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBASSEMBLY]
WebAssembly Core Specification. Draft. URL: https://webassembly.github.io/spec/core/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考用参考文献

[IEEE-754]
浮動小数点演算のための IEEE 標準 . 2019年7月22日. URL: https://ieeexplore.ieee.org/document/8766229
[WASMWEB]
WebAssembly Web API Specification. Draft. URL: https://webassembly.github.io/spec/web-api/

IDL 索引

dictionary WebAssemblyInstantiatedSource {
    required Module module;
    required Instance instance;
};

dictionary WebAssemblyCompileOptions {
    USVString? importedStringConstants;
    sequence<USVString> builtins;
};

[Exposed=*]
namespace WebAssembly {
    boolean validate([AllowResizable] AllowSharedBufferSource bytes, optional WebAssemblyCompileOptions options = {});
    Promise<Module> compile([AllowResizable] AllowSharedBufferSource bytes, optional WebAssemblyCompileOptions options = {});

    Promise<WebAssemblyInstantiatedSource> instantiate(
        [AllowResizable] AllowSharedBufferSource bytes, optional object importObject, optional WebAssemblyCompileOptions options = {});

    Promise<Instance> instantiate(
        Module moduleObject, optional object importObject);

    readonly attribute Tag JSTag;
};

enum ImportExportKind {
  "function",
  "table",
  "memory",
  "global",
  "tag"
};

enum AddressType {
  "i32",
  "i64",
};

typedef any AddressValue;

dictionary ModuleExportDescriptor {
  required USVString name;
  required ImportExportKind kind;
  // Note: Other fields such as signature may be added in the future.
};

dictionary ModuleImportDescriptor {
  required USVString module;
  required USVString name;
  required ImportExportKind kind;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Module {
  constructor([AllowResizable] AllowSharedBufferSource bytes, optional WebAssemblyCompileOptions options = {});
  static sequence<ModuleExportDescriptor> exports(Module moduleObject);
  static sequence<ModuleImportDescriptor> imports(Module moduleObject);
  static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Instance {
  constructor(Module module, optional object importObject);
  readonly attribute object exports;
};

dictionary MemoryDescriptor {
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Memory {
  constructor(MemoryDescriptor descriptor);
  AddressValue grow(AddressValue delta);
  ArrayBuffer toFixedLengthBuffer();
  ArrayBuffer toResizableBuffer();
  readonly attribute ArrayBuffer buffer;
};

enum TableKind {
  "externref",
  "anyfunc",
  // Note: More values may be added in future iterations,
  // e.g., typed function references, typed GC references
};

dictionary TableDescriptor {
  required TableKind element;
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Table {
  constructor(TableDescriptor descriptor, optional any value);
  AddressValue grow(AddressValue delta, optional any value);
  any get(AddressValue index);
  undefined set(AddressValue index, optional any value);
  readonly attribute AddressValue length;
};

enum ValueType {
  "i32",
  "i64",
  "f32",
  "f64",
  "v128",
  "externref",
  "anyfunc",
};

dictionary GlobalDescriptor {
  required ValueType value;
  boolean mutable = false;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Global {
  constructor(GlobalDescriptor descriptor, optional any v);
  any valueOf();
  attribute any value;
};

dictionary TagType {
  required sequence<ValueType> parameters;
};

[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
interface Tag {
  constructor(TagType type);
};

dictionary ExceptionOptions {
  boolean traceStack = false;
};

[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
interface Exception {
  constructor(Tag exceptionTag, sequence<any> payload, optional ExceptionOptions options = {});
  any getArg(Tag exceptionTag, [EnforceRange] unsigned long index);
  boolean is(Tag exceptionTag);
  readonly attribute (DOMString or undefined) stack;
};

課題索引

大きな table または memory の割り当て失敗は、次のいずれかの結果となり得る 将来の改訂では、大量の memory の割り当てに対する、より信頼性が高く回復可能なエラーを再検討する可能性がある。

さらなる議論については Issue 879 を参照。