WebAssembly JavaScript インターフェイス

W3C 勧告候補ドラフト

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-wasm-js-api-2-20251102/
最新公開バージョン:
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)
課題管理:
GitHub Issues

概要

この文書はWebAssemblyとやり取りするための明示的なJavaScript APIを提供します。

これは関連文書の一部です: コアWebAssembly仕様WebAssembly JSインターフェイスWebAssembly Web API です。

この文書の位置付け

このセクションは、公表時点での本書の状態を示します。W3Cの最新公表物とこの技術報告の最新版はW3C技術報告書インデックスで確認できます。

この文書はWebAssemblyワーキンググループによって勧告トラックにより候補勧告ドラフトとして発行されました。

候補勧告としての発行は、W3Cおよびそのメンバーの支持を意味しません。候補勧告ドラフトは、ワーキンググループが今後の候補勧告スナップショットに取り込む意図のある、前回の候補勧告からの変更を統合したものです。

WebAssemblyワーキンググループは、本文書を候補勧告状態で維持し、「リビングスタンダード」として継続的に更新する予定です。いずれの場合も、REC(勧告)への移行要求は2025年12月2日以前には行われません。

この文書はいつでも保守・更新されます。一部は作業途中です。

この仕様の議論はGitHub Issuesが推奨されています。 すべての課題やコメントは アーカイブされています。

本文書は WebAssemblyワーキンググループ により策定されました。

本文書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cはグループ成果物に関連する 特許開示の公開リスト を管理しています。また、そのページには特許の開示方法も案内があります。 本質的なクレーム(Essential Claim(s)) を含むと一個人が知っている場合はW3C特許ポリシー第6節に従い開示が必要です。

本文書は2025年8月18日W3Cプロセス文書により管理されています。

1. 導入

設計上、WebAssemblyコア仕様scope [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 ストアと JavaScript の相互作用

注:WebAssemblyのセマンティクスはWebAssembly抽象マシンの状態を表す抽象的なストアで定義されています。 WebAssemblyの操作はストアを受け取り、更新されたストアを返します。

エージェントには関連付けられたストアが存在します。新しいエージェントが作成されると、その関連ストアはstore_init()の結果に設定されます。

注:本仕様では、WebAssembly関連のオブジェクト・メモリ・アドレスはエージェントクラスタagent cluster間で共有されません。将来のWebAssemblyバージョンではこの点が変わる可能性があります。

WebAssemblyストアの要素はJavaScript値と紐付けられる場合があります。特に、対応するMemoryオブジェクトを持つ各WebAssemblyのmemory instanceは、JavaScriptのData Blockと対応します;このデータブロックの修正はエージェントのストアもそれに応じて更新されたものとみなされ、その逆も同様です。

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

注:いくつかのWebAssemblyオブジェクトには対応するJavaScriptオブジェクトが存在する可能性があります。この対応関係は、各エージェントごとにWebAssemblyアドレスからJavaScriptオブジェクトへのマッピングとして保持されます。 このマッピングは、あるエージェントについて、特定のWebAssemblyアドレスにつき最大1つのJavaScriptオブジェクトしか対応しないことを保証するためのものです。ただし、共有オブジェクトにはこの性質は適用されません。

エージェントには以下の順序付きマップが関連付けられています:

5. WebAssembly名前空間

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

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

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

    Promise<WebAssemblyInstantiatedSource> instantiate(
        BufferSource bytes, optional object importObject, optional WebAssemblyCompileOptions options = {});

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

    readonly attribute Tag JSTag;
};
WebAssemblyモジュールをコンパイルする ために、ソースバイト列bytesから以下の手順を実行します:
  1. modulemodule_decode(bytes)とする。moduleエラーなら、エラーを返す。

  2. module_validate(module) がエラーであればエラーを返す。

  3. moduleを返す。

WebAssemblyモジュールのビルトイン・インポート文字列を検証する ために、module module、有効なビルトインbuiltinSetNamesimportedStringModuleを用いて次の手順を実行する:

  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の検証importbuiltinSetNamesで試み、falseならfalseを返す。

  3. trueを返す。

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

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

  3. moduleerror なら、false を返す。

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

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

  6. ビルトインおよびインポート文字列の検証modulebuiltinSetNamesimportedStringModule で行い、 false を返す場合は false を返す。

  7. true を返す。

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

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

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

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

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

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

  6. moduleObject を返す。

WebAssembly モジュールを非同期にコンパイルするために、 ソースバイト列 bytesWebAssemblyCompileOptions options を用い、オプションの task source taskSource を使って、次の手順を実行する:
  1. promise新しい promise とする。

  2. 次の手順を並行して実行する:

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

    2. タスクをキューに入れるtaskSource が与えられている場合は、 そのタスクソース上にキューする。

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

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

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

      4. ビルトインおよびインポート文字列の検証modulebuiltinSetNamesimportedStringModule で行い、 結果が false なら promiseCompileError 例外で reject する。

      5. それ以外の場合、

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

        2. Resolve により promisemoduleObject で解決する。

  3. promise を返す。

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

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

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

  1. 表明: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. 表明:status は true である。

  4. exportsObject を返す。

インポートを読み取るために、 WebAssembly モジュール module、インポーツオブジェクト importObject、 有効なビルトイン builtinSetNames、および importedStringModule から次の手順を実行する:
  1. module.imports空でない かつ importObject が undefined なら、TypeError 例外を投げる。

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

  3. builtinSetName について、 builtinSetNames を繰り返す。

    1. 表明:builtinOrStringImportsbuiltinSetName を含まない。

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

    3. exportsObject を、ビルトインセットをインスタンス化する ことで得られた結果とする(引数は builtinSetName)。

    4. builtinSetQualifiedName を "wasm:" で前置した builtinSetName とする。

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

  4. importedStringModule が null でないなら、

    1. exportsObject を、インポートされた文字列をインスタンス化することで moduleimportedStringModule から得られた結果とする。

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

  5. imports を « » とする。

  6. (moduleName, componentName, externtype) について、module_imports(module) を繰り返す。

    1. builtinOrStringImportscontains moduleName である場合、

      1. obuiltinOrStringImports[moduleName] とする。

      2. oObject でない、または ocomponentName を含まない 場合、

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

    2. それ以外の場合、

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

    3. oObject でないなら、TypeError 例外を投げる。

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

    5. externtypefunc functype の形式なら、

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

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

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

      3. それ以外の場合、

        1. ホスト関数を作成し、 vfunctype から結果を funcaddr とする。

        2. indeximports 内の外部関数の個数とする。 この値 indexfuncaddrホスト関数のインデックス として知られる。

      4. externfuncexternal valuefunc funcaddr とする。

      5. Append により externfuncimports に追加する。

    6. externtypeglobal mut valtype の形式なら、

      1. vimplements Global である場合、

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

      2. それ以外の場合、

        1. valtypei64 で、かつ vBigInt でないなら、

          1. LinkError 例外を投げる。

        2. valtypei32f32f64 のいずれかで、かつ vNumber でないなら、

          1. LinkError 例外を投げる。

        3. valtypev128 なら、

          1. LinkError 例外を投げる。

        4. valueToWebAssemblyValue(v, valtype) とする。この操作が TypeError を投げる場合は捕捉し、代わりに LinkError 例外を投げる。

        5. storesurrounding agentassociated store とする。

        6. (store, globaladdr) を global_alloc(storeconst valtypevalue) とする。

        7. surrounding agentassociated storestore に設定する。

      3. externglobalglobal globaladdr とする。

      4. Append により externglobalimports に追加する。

    7. externtypemem memtype の形式なら、

      1. vimplement Memory でないなら、LinkError 例外を投げる。

      2. externmemexternal valuemem v.[[Memory]] とする。

      3. Append により externmemimports に追加する。

    8. externtypetable tabletype の形式なら、

      1. vimplement Table でないなら、LinkError 例外を投げる。

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

      3. externtableexternal valuetable tableaddr とする。

      4. Append により externtableimports に追加する。

    9. externtypetag attribute functype の形式なら、

      1. 表明:attributeexception である。

      2. vimplement Tag でないなら、LinkError 例外を投げる。

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

      4. externtagexternal valuetag tagaddr とする。

      5. Append により externtagimports に追加する。

  7. imports を返す。

注: このアルゴリズムは、正しい種類の JavaScript 値が渡されているかのみを検証する。 WebAssembly の型要件の検証は 「instantiate the core of a WebAssembly module」アルゴリズムに委ねられる。

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

  2. (name, externtype) について、 module_exports(module) を繰り返す。

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

    2. 表明:externvalerror ではない。

    3. externtypefunc functype の形式なら、

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

      2. func funcaddrexternval とする。

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

      4. valuefunc とする。

    4. externtypeglobal mut globaltype の形式なら、

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

      2. global globaladdrexternval とする。

      3. global新しい Global オブジェクトglobaladdr から作成)とする。

      4. valueglobal とする。

    5. externtypemem memtype の形式なら、

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

      2. mem memaddrexternval とする。

      3. memory新しい Memory オブジェクトmemaddr から作成)とする。

      4. valuememory とする。

    6. externtypetable tabletype の形式なら、

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

      2. table tableaddrexternval とする。

      3. table新しい Table オブジェクトtableaddr から作成)とする。

      4. valuetable とする。

    7. externtypetag attribute functype の形式なら、

      1. 表明:attributeexception である。

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

      3. tag tagaddrexternval とする。

      4. tag新しい Tag オブジェクトtagaddr から作成)とする。

      5. valuetag とする。

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

    9. 表明:status は true である。

    注: WebAssembly モジュールの検証で行われる妥当性と一意性の検査により、 各プロパティ名は妥当であり、同じプロパティが二重に定義されないことが保証される。

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

  4. exportsObject を返す。

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

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

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

WebAssembly モジュールのコアをインスタンス化するために、 モジュール module とインポート imports から、次の手順を実行する:
  1. storesurrounding agentassociated store とする。

  2. resultmodule_instantiate(storemoduleimports) とする。

  3. resulterror なら、適切な例外型を投げる:

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

    • start 関数の実行中に発生したエラーであれば、WebAssembly からの多くのエラーには RuntimeError、 もしくは内側の ECMAScript コードから伝播したエラーオブジェクト。

    • 必要に応じて別のエラー型(例:メモリ不足例外)。詳細は WebAssembly のエラー対応表を参照。

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

  5. surrounding agentassociated storestore に設定する。

  6. instance を返す。

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

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

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

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

  5. インポートを読み取る を実行し、 moduleimportObjectbuiltinSetNamesimportedStringModule を用いて 結果を imports とする。 この操作が例外を投げた場合は、捕捉して reject により promise をその例外で拒否し、promise を返す。

  6. 次の手順を並行して実行する:

    1. タスクをキューに入れる: 注:ここで実装依存の処理が行われることがある。

      1. WebAssembly モジュールのコアをインスタンス化し、 moduleimports を用いて結果を instance とする。 これが例外を投げた場合は捕捉し、reject により promise をその例外で拒否し、 これ以降のサブステップを終了する。

      2. instanceObjectnewInstance とする。

      3. 初期化により instanceObjectmoduleinstance から初期化する。 これが例外を投げた場合は捕捉し、reject により promise をその例外で拒否し、 これ以降のサブステップを終了する。

      4. Resolve により promiseinstanceObject で解決する。

  7. promise を返す。

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

  2. React により promiseOfModule に反応する:

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

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

      2. React により innerPromise に反応する:

        • innerPromise が値 instance で fulfilled された場合、

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

          2. Resolve により promiseresult で解決する。

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

          1. Reject により promisereason で拒否する。

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

      1. Reject により promisereason で拒否する。

  3. promise を返す。

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

  2. WebAssembly モジュールを非同期にコンパイルし、 stableBytesoptions を用いて結果を promiseOfModule とする。

  3. インスタンス化により promiseOfModuleimportObject をインポートして実行し、その結果を返す。

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

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

JSTag 属性の getter(WebAssembly 名前空間のもの)は、呼び出されると次の手順を実行する:

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

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

  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(BufferSource bytes, optional WebAssemblyCompileOptions options = {});
  static sequence<ModuleExportDescriptor> exports(Module moduleObject);
  static sequence<ModuleImportDescriptor> imports(Module moduleObject);
  static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
};
外部型の文字列表現 type は、次のとおりである。
exports(moduleObject) メソッドは、呼び出されると次の手順を実行する。
  1. modulemoduleObject.[[Module]] とする。

  2. exports を « » とする。

  3. (name, type) について、module_exports(module) を繰り返す。

    1. kind を、外部型の文字列表現 type とする。

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

    3. Append により 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 を、外部型の文字列表現 type とする。

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

    5. Append により objimports に追加する。

  6. imports を返す。

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

  2. customSections を « » とする。

  3. カスタムセクション customSection を、 モジュール文法に従って解釈した bytes から取り出して処理する。

    1. namecustomSectionnameUTF-8 デコードした値とする。

    2. 表明:name は失敗ではない (moduleObject.[[Module]] は valid である)。

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

      1. この customsec 生成規則に一致する範囲の bytes のコピーを格納した 新しい ArrayBufferAppend により customSections に追加する。

  4. customSections を返す。

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

  2. WebAssembly モジュールをコンパイルして stableBytes から結果を得て、module とする。

  3. moduleerror なら、CompileError 例外を投げる。

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

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

  6. ビルトインおよびインポート文字列の検証modulebuiltinSetNamesimportedStringModule で行い、false を返す場合は CompileError 例外を投げる。

  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(module, importObject) コンストラクターは、呼び出されると次の手順を実行する。
  1. modulemodule.[[Module]] とする。

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

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

  4. インポートを読み取る を実行し、 module に対し importObjectbuiltinSetNamesimportedStringModule を用いて 結果を imports とする。

  5. WebAssembly モジュールのコアをインスタンス化する を実行し、 moduleimports から結果を instance とする。

  6. 初期化 により、thismoduleinstance から初期化する。

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

exports 属性の getter は、 Instancethis.[[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;
};

Memory オブジェクトは、複数の Instance オブジェクトから同時に参照可能な 単一の メモリインスタンス を表す。 各 Memory オブジェクトは次の内部スロットを持つ。

メモリアドレス memaddr から 固定長メモリバッファを作成する には、次の手順を実行する。
  1. block を、データブロックであって、同定される対象が memaddr の基礎メモリであるものとする。

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

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

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

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

  6. buffer を返す。

メモリアドレス memaddrmaxsize から 可変長メモリバッファを作成する には、次の手順を実行する。
  1. block を、データブロックであって、同定される対象が memaddr の基礎メモリであるものとする。

  2. lengthblock の長さとする。

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

  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. 表明: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. memory を、newMemory とする。

  4. 初期化 により memorymemaddr から初期化する。

  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 を空とする。

  4. memtypeメモリ型 addrtype { min initial, max maximum } とする。

  5. memtypevalid でなければ、RangeError 例外を投げる。

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

  7. (store, memaddr) を mem_alloc(store, memtype) とする。 もし割り当てに失敗したら、RangeError 例外を投げる。

  8. surrounding agentassociated storestore に設定する。

  9. 初期化 により thismemaddr から初期化する。

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

  2. 表明: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 の基礎メモリであるものとする。

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

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

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

  2. ret を、mem_size(store, memaddr) とする。

  3. store を、mem_grow(store, memaddr, delta) とする。

  4. storeerror なら、RangeError 例外を投げる。

  5. surrounding agentassociated storestore に設定する。

  6. Memory バッファを更新するmemaddr に対して実行する。

  7. ret を返す。

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

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

  3. addrtype を、アドレス型における mem_type(store, memaddr) の値とする。

  4. delta64 を、? AddressValueToU64(delta, addrtype) の結果とする。

  5. ret を、メモリバッファの拡張memaddr に対して delta64 分行った結果とする。

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

WebAssembly の memory.grow 命令の実行直後に、次の手順を実行する。

  1. スタックの先頭が i32.const (−1) でない場合、

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

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

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

    4. Memory バッファを更新する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. memtype を、mem_type(store, memaddr) とする。

  4. memtype に max がない場合、

    1. Throw により TypeError 例外を投げる。

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

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

  7. 表明:memtype は max を持つ。

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

  9. resizableBuffer を、可変長メモリバッファの作成memaddrmaxsize に対して実行した結果とする。

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

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

  12. resizableBuffer を返す。

ArrayBuffer は、Memory オブジェクトから返される場合、 そのサイズが WebAssembly の ページサイズ(定数 65536)の倍数でなければならない。 この理由により、HostResizeArrayBuffer は次のように再定義される。

抽象操作 HostResizeArrayBuffer は、 引数 bufferArrayBuffer)と newLength を取り、呼び出し時に次の手順を実行する。

  1. もし buffer.[[ArrayBufferDetachKey]] が "WebAssembly.Memory" なら、

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

    2. 表明:buffermap 内のちょうど 1 つの値の [[BufferObject]] である。

    3. memaddrmem について map を反復する。

      1. もし SameValue(mem.[[BufferObject]], buffer) が true なら、

        1. 表明:buffer.[[ArrayBufferByteLength]] の 65536 による剰余は 0 である。

        2. lengthDeltanewLengthbuffer.[[ArrayBufferByteLength]] とする。

        3. もし lengthDelta < 0 または lengthDelta の 65536 による剰余が 0 でないなら、

          1. RangeError 例外を投げる。

        4. deltalengthDelta ÷ 65536 とする。

        5. メモリバッファの拡張memaddr に対して delta 分行う。

    4. handled を返す。

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

buffer 属性の getter は、 Memorythis.[[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;
};

Table オブジェクトは、 複数の Instance オブジェクトから同時に参照可能な 単一の table instance を表す。 各 Table オブジェクトは [[Table]] という内部スロットを持ち、これは table address である。

table オブジェクトを初期化する ために、 table address tableaddr から table を初期化する手順は次のとおり:
  1. map を、surrounding agent に関連付けられた Table object cache とする。

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

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

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

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

  2. もし map[tableaddr] が 存在する なら、

    1. map[tableaddr] を返す。

  3. table を、newTable とする。

  4. 初期化 により tabletableaddr から初期化する。

  5. table を返す。

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

  2. もし elementtypereftype でなければ、

    1. Throw により TypeError 例外を投げる。

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

  4. initial を、? AddressValueToU64(descriptor["initial"], addrtype) の結果とする。

  5. もし descriptor["maximum"] が 存在する なら maximum? AddressValueToU64(descriptor["maximum"], addrtype) の結果とし、そうでなければ maximum を空とする。

  6. type を、table type addrtype { min initial, max maximum } elementType とする。

  7. もし typevalid でなければ、RangeError 例外を投げる。

  8. もし value が与えられていなければ、

    1. refDefaultValue(elementtype) とする。

    2. 表明:referror ではない。

  9. それ以外の場合、

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

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

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

  12. surrounding agentassociated storestore に設定する。

  13. 初期化 により thistableaddr から初期化する。

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 例外を投げる。

  7. それ以外の場合、

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

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

  9. もし resulterror なら、RangeError 例外を投げる。

    注: 上記の例外は、メモリ不足または不正なサイズ引数により発生することがある。

  10. surrounding agentassociated storeresult に設定する。

  11. initialSize を返す。

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

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

  3. addrtype を、address type における 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 例外を投げる。

  5. index64 を、? AddressValueToU64(index, addrtype) の結果とする。

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

  7. もし resulterror なら、RangeError 例外を投げる。

  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 例外を投げる。

  5. index64 を、? AddressValueToU64(index, addrtype) の結果とする。

  6. もし value が与えられていなければ、

    1. refDefaultValue(elementtype) とする。

    2. もし referror なら、TypeError 例外を投げる。

  7. それ以外の場合、

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

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

  9. もし storeerror なら、RangeError 例外を投げる。

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

Global オブジェクトは、 複数の Instance オブジェクトから同時に参照可能な 単一の global instance を表す。 各 Global オブジェクトは 1 つの内部スロットを持つ:

global オブジェクトを初期化する ために、 global address globaladdr から global を初期化する手順は次のとおり:
  1. map を、surrounding agent に関連付けられた Global object cache とする。

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

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

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

global address globaladdr から global オブジェクトを作成する には、次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Global object cache とする。

  2. もし map[globaladdr] が 存在する なら、

    1. map[globaladdr] を返す。

  3. global を、newGlobal とする。

  4. 初期化 により globalglobaladdr から初期化する。

  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. 表明:このステップには到達しない。

アルゴリズム 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 例外を投げる。

  4. もし v が与えられていなければ、

    1. valueDefaultValue(valuetype) とする。

    2. 表明:valueerror ではない。

  5. それ以外の場合、

    1. valueToWebAssemblyValue(v, valuetype) とする。

  6. もし mutable が true なら globaltypevar valuetype とし、そうでなければ globaltypeconst valuetype とする。

  7. store を現在のエージェントの associated store とする。

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

  9. 現在のエージェントの associated storestore に設定する。

  10. 初期化 により thisglobaladdr から初期化する。

アルゴリズム GetGlobalValue(Global global) は次の手順を実行する:
  1. store を現在のエージェントの associated store とする。

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

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

  4. もし globaltypemut valuetype の形式で、 その valuetypematches v128 または exnref なら、TypeError を投げる。

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

  6. ToJSValue(value) を返す。

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

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

  1. store を現在のエージェントの associated store とする。

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

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

  4. もし valuetypematches v128 または exnref なら、TypeError を投げる。

  5. もし mutconst なら、TypeError を投げる。

  6. valueToWebAssemblyValue(与えられた値, valuetype) とする。

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

  8. もし storeerror なら、RangeError 例外を投げる。

  9. 現在のエージェントの associated storestore に設定する。

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

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

WebAssembly の関数は、JavaScript では Exported Function として利用可能になる。 Exported Function は、組み込み関数オブジェクトでありコンストラクターではなく、[[FunctionAddress]] 内部スロットを持つ。 このスロットは、function address を、surrounding agentassociated store に対して相対的に保持する。

WebAssembly 関数の名前 funcaddr は、次の手順で求められる:
  1. store を、surrounding agentassociated store とする。

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

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

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

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

  4. それ以外の場合、

    1. moduleinstfuncinst.module とする。

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

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

  5. ! ToString(index) を返す。

WebAssembly の function address funcaddr から 新しい Exported Function を作成するには、次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Exported Function cache とする。

  2. もし map[funcaddr] が 存在するなら、

    1. map[funcaddr] を返す。

  3. steps を「引数付きで Exported Function を呼び出す funcaddr」とする。

  4. realm現在の Realm とする。

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

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

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

  8. arityparamTypes大きさとする。

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

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

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

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

  13. function を返す。

function address funcaddr と JavaScript 引数のリスト argValues を用いて、Exported Function を呼び出すには、次の手順を実行する:
  1. store を、surrounding agentassociated store とする。

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

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

  4. もし parameters または results 内のいずれかの型が matches v128 または exnref なら、TypeError を投げる。

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

  5. args を « » とする。

  6. i を 0 とする。

  7. t について、parameters を繰り返す。

    1. もし argValues大きさ > i なら、argargValues[i] とする。

    2. それ以外なら、arg を undefined とする。

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

    4. ii + 1 に設定する。

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

  9. surrounding agentassociated storestore に設定する。

  10. もし reterror なら、例外を投げる。この例外は、特に指定がない限り WebAssembly のエラー対応表に従って、WebAssembly の RuntimeError であるべきである。

  11. もし retTHROW ref.exn exnaddr なら、

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

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

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

    4. もし tagaddrjsTagAddr に等しいなら、

      1. ホスト値の取得 の結果 payload[0] を投げる。

    5. それ以外の場合、

      1. exception を、新しい Exceptionexnaddr から作成)とする。

      2. exception を投げる。

  12. outArityret大きさとする。

  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 Function は [[Construct]] メソッドを持たないため、new 演算子で呼び出すことはできない。

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

  2. もし parameters または results 内のいずれかの型が matches v128 または exnref なら、TypeError を投げる。

  3. jsArguments を « » とする。

  4. arg について、arguments を繰り返す。

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

  5. ret を、? Call(func, undefined, jsArguments) とする。

  6. resultsSizeresults大きさとする。

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

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

  9. それ以外の場合、

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

    2. もし method が undefined なら、throw により TypeError を投げる。

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

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

    5. もし values大きさresultsSize と等しくなければ、TypeError 例外を投げる。

    6. valuesresults の各 value および resultType を同順で対応付けて反復し、

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

    7. wasmValues を返す。

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

  2. stored settingsインカンベント設定オブジェクトとする。

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

    1. realmfunc関連 Realm とする。

    2. relevant settingsrealm設定オブジェクト とする。

    3. スクリプト実行の準備relevant settings で行う。

    4. コールバック実行の準備stored settings で行う。

    5. result を、ホスト関数の実行funcfunctypearguments で行った結果とする。

    6. コールバック実行後のクリーンアップstored settings で行う。

    7. スクリプト実行後のクリーンアップrelevant settings で行う。

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

    9. store を、surrounding agentassociated 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. surrounding agentassociated storestore に設定する。

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

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

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

  5. surrounding agentassociated storestore に設定する。

  6. funcaddr を返す。

アルゴリズム ToJSValue(w) は、次の手順により WebAssembly 値を JavaScript 値に変換する:
  1. 表明:wv128.const v128 の形式ではない。

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

  3. もし wi64.const u64 の形式なら、

    1. i64signed_64(u64) とする。

    2. (i64数学的値として解釈したもの) を返す。

  4. もし wi32.const u32 の形式なら、

    1. i32signed_32(u32) とする。

    2. 𝔽(i32数学的値として解釈したもの) を返す。

  5. もし wf32.const f32 の形式なら、

    1. もし f32+∞ または −∞ なら、それぞれ +∞𝔽 または -∞𝔽 を返す。

    2. もし f32nan なら、NaN を返す。

    3. 𝔽(f32数学的値として解釈したもの) を返す。

  6. もし wf64.const f64 の形式なら、

    1. もし f64+∞ または −∞ なら、それぞれ +∞𝔽 または -∞𝔽 を返す。

    2. もし f64nan なら、NaN を返す。

    3. 𝔽(f64数学的値として解釈したもの) を返す。

  7. もし wref.null t の形式なら、null を返す。

  8. もし wref.i31 u31 の形式なら、

    1. i31signed_31(u31) とする。

    2. return 𝔽(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 と等しい数値は、観測可能な NaN ペイロードがさまざまであり得る。詳細は NumericToRawBytes を参照。

host address hostaddr から ホスト値を取得するには、次の手順を実行する:

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

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

  3. map[hostaddr] を返す。

アルゴリズム ToWebAssemblyValue(v, type) は、次の手順により JavaScript 値を WebAssembly 値に変換する:
  1. 表明:typev128 ではない。

  2. 表明: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. refToWebAssemblyValue(v, ref any) とする。

      2. rref.extern ref とする。

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

      1. funcaddr を、v の [[FunctionAddress]] 内部スロットの値とする。

      2. rref.func funcaddr とする。

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

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

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

      3. rref.i31 u31 とする。

    5. Else if vExported GC Object なら、

      1. objectaddr を、v の [[ObjectAddress]] 内部スロットの値とする。

      2. objectkind を、v の [[ObjectKind]] 内部スロットの値とする。

      3. もし objectkind が "array" なら、

        1. rref.array objectaddr とする。

      4. もし objectkind が "struct" なら、

        1. rref.struct objectaddr とする。

    6. Else、

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

      2. もし host address hostaddr が存在し、 map[hostaddr] が v と同一であるなら、

        1. ref.host hostaddr を返す。

      3. host address hostaddr を、 map[hostaddr] が 存在しない となる最小のアドレスとする。

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

      5. rref.host hostaddr とする。

    7. store を、現在のエージェントの associated store とする。

    8. actualtype を、ref_type(store, r) とする。

    9. もし match_valtype(actualtype, type) が false なら、

      1. TypeError を投げる。

    10. r を返す。

  8. 表明:このステップには到達しない。

アルゴリズム AddressValueToU64(v, addrtype) は、埋め込み操作で使用する WebAssembly の u64 に JavaScript 値を変換する。これは [EnforceRange]unsigned longAddressType "i32" に対して模倣し、さらに AddressType "i64" に対してそのセマンティクスを拡張することを意図しており、次の手順を実行する:
  1. もし addrtype が "i32" なら、

    1. n を、? ConvertToInt(v, 32, "unsigned") とし、変換先型は [EnforceRange] に従うものとする。

      注: これは JS 変換規則における [EnforceRange] unsigned long と同等である。

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

  2. もし addrtype が "i64" なら、

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

    2. もし n < 0 または n > 264 − 1 なら、throw により TypeError を投げる。

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

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

  3. 表明:このステップには到達しない。

アルゴリズム U64ToAddressValue(v, addrtype) は、埋め込み操作からの u64 値を、AddressValue の 適切なバリアント(AddressType に対応)に変換し、次の手順を実行する:
  1. もし addrtype が "i32" なら、𝔽(v数学的値として解釈したもの) を返す。

  2. Else if addrtype が "i64" なら、(v数学的値として解釈したもの) を返す。

  3. 表明:このステップには到達しない。

5.7. タグ

tag_alloc(store, parameters) アルゴリズムは、store 内の parameters に対する新しい tag address を作成し、更新された store と tag address を返す。

5.7.1. タグの型

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

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

Tag 値は例外タグを表す。

tag address tagAddress から Tag オブジェクトを初期化する tag には、次の手順を実行する:

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

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

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

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

tag address tagAddress から Tag オブジェクトを作成するには、次の手順を実行する:
  1. map を、surrounding agent に関連付けられた Tag object cache とする。

  2. もし map[tagAddress] が 存在するなら、

    1. map[tagAddress] を返す。

  3. tag を、newTag とする。

  4. 初期化 により tagtagAddress から初期化する。

  5. tag を返す。

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

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

  2. wasmParameters を «» とする。

  3. type について、parameters を繰り返す。

    1. Append により ToValueType(type) を wasmParameters に追加する。

  4. store を、現在のエージェントの associated store とする。

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

  6. 現在のエージェントの associated storestore に設定する。

  7. 初期化 により 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 addresssurrounding agentassociated 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(プロパティキー)を取り、undefined を返す。呼び出されたとき次の手順を実行する:
  1. undefined を返す。

Exported GC Object の [[DefineOwnProperty]] 内部メソッド O は引数 P(プロパティキー)と Desc(プロパティ記述子)を取り、boolean を返す。呼び出されたとき次の手順を実行する:
  1. false を返す。

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

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

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

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

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

  2. keys を返す。

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

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

  3. もし map[objectaddr] が 存在するなら、

    1. map[objectaddr] を返す。

  4. object を、MakeBasicObject(« [[ObjectAddress]] ») とする。

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

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

  7. object.[[GetPrototypeOf]] を、[[GetPrototypeOf]] 内部メソッドに規定されたとおりに設定する。

  8. object.[[SetPrototypeOf]] を、[[SetPrototypeOf]] 内部メソッドに規定されたとおりに設定する。

  9. object.[[IsExtensible]] を、[[IsExtensible]] 内部メソッドに規定されたとおりに設定する。

  10. object.[[PreventExtensions]] を、[[PreventExtensions]] 内部メソッドに規定されたとおりに設定する。

  11. object.[[GetOwnProperty]] を、[[GetOwnProperty]] 内部メソッドに規定されたとおりに設定する。

  12. object.[[DefineOwnProperty]] を、[[DefineOwnProperty]] 内部メソッドに規定されたとおりに設定する。

  13. object.[[HasProperty]] を、[[HasProperty]] 内部メソッドに規定されたとおりに設定する。

  14. object.[[Get]] を、[[Get]] 内部メソッドに規定されたとおりに設定する。

  15. object.[[Set]] を、[[Set]] 内部メソッドに規定されたとおりに設定する。

  16. object.[[Delete]] を、[[Delete]] 内部メソッドに規定されたとおりに設定する。

  17. object.[[OwnPropertyKeys]] を、[[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([EnforceRange] unsigned long index);
  boolean is(Tag exceptionTag);
  readonly attribute (DOMString or undefined) stack;
};

Exception 値は例外を表す。

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

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

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

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

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

  5. store を、surrounding agentassociated 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 を、surrounding agent に関連付けられた Exception object cache とする。

  2. もし map[exnAddress] が 存在するなら、

    1. map[exnAddress] を返す。

  3. exn を、newException とする。

  4. 初期化 により exnexnAddress から初期化する。

  5. exn を返す。

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

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

  2. もし exceptionTag.[[Address]] が JSTagAddr に等しければ、

    1. TypeError を投げる。

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

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

  5. もし types大きさpayload大きさと等しくなければ、

    1. TypeError を投げる。

  6. wasmPayload を « » とする。

  7. value および resultType について、payloadtypes を同順で対応付けて反復する。

    1. もし resultTypematches v128 または exnref なら、

      1. TypeError を投げる。

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

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

  9. surrounding agentassociated storestore に設定する。

  10. 初期化 により thisexceptionAddr から初期化する。

  11. もし options["traceStack"] が true なら、

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

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

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

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

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

  4. 表明:tagaddrthis.[[Type]] に等しい。

  5. もし indexpayload大きさなら、

    1. RangeError を投げる。

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

  7. もし types[index] が matches v128 または exnref なら、

    1. TypeError を投げる。

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

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

  1. もし this.[[Type]] が exceptionTag.[[Address]] に等しくなければ、

    1. false を返す。

  2. true を返す。

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

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

5.9.1. JavaScript 例外

JavaScript 例外タグは、surrounding agent に関連付けられた tag address である。初回使用時にエージェントの associated store に割り当てられ、キャッシュされる。常に tag type « externref » → « » を持つ。

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

  1. もし surrounding agent に関連付けられた JavaScript 例外タグが初期化済みなら、

    1. surrounding agent に関連付けられた JavaScript 例外タグを返す。

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

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

  4. 現在のエージェントの associated storestore に設定する。

  5. 現在のエージェントに関連付けられた JavaScript 例外タグtagAddress に設定する。

  6. tagAddress を返す。

5.10. エラーオブジェクト

WebAssembly は次の Error クラスを定義する:CompileErrorLinkError、および RuntimeError

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

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

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

    2. ! DefineMethodProperty(namespaceObject, error, constructor, false) を実行する。

注: これは、当仕様で定義される API によって生成される、CompileErrorLinkError、 および RuntimeError クラスを WebAssembly 名前空間上に定義する。これらは、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. 表明:validate builtin set names(builtinSetNames) は true である。

  2. importModuleNameimport[0] とする。

  3. importNameimport[1] とする。

  4. builtinSetName について、builtinSetNames を反復する。

    1. もし builtinSetName がビルトインセットを指していなければ、continue

    2. builtinSetQualifiedName を "wasm:" を前置した builtinSetName とする。

    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, funcaddr) を func_alloc(store, functype, hostfunc) とする。

  3. surrounding agentassociated storestore に設定する。

  4. funcaddr を返す。

名前 builtinSetNameビルトインセットをインスタンス化するには、次の手順を実行する:

  1. builtins を、ビルトインセットのビルトインを取得する(builtinSetName) の結果とする。

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

  3. (name, funcType, steps) について、builtins を反復する。

    1. funcaddr を、ビルトイン関数を作成する(funcType, steps) の結果とする。

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

    3. valuefunc とする。

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

    5. 表明:status は true である。

  4. exportsObject を返す。

ビルトイン用のインポートを検証するために、import と有効なビルトイン builtinSetNames を与えて次の手順を実行する:

  1. 表明:validate builtin set names(builtinSetNames) は true である。

  2. maybeBuiltin を、ビルトインを検索する(import, builtinSetNames) の結果とする。

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

  4. importExternTypeimport[2] とする。

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

  6. builtinExternTypefunc |builtinFuncType| とする。

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

6.1. 文字列ビルトイン

文字列ビルトインは、String ビルトインオブジェクトのインターフェイスを適合させる。このセットの namejs-stringqualified namewasm:js-string である。

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

6.1.1. 抽象操作

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

  1. もし vString でないなら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

  2. v を返す。

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

  1. 表明:vi32 型である。

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

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

  1. 表明:indexi32 型である。

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

6.1.2. cast

このビルトインの funcType(rec (type (func (param externref) (result externref)))).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 externref)))).0 である。

このビルトインが引数 array, start, end で呼び出されたとき、次の手順を実行する:

  1. もし array が null なら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

  2. lengtharray の要素数とする。

  3. もし start > end または end > length なら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

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

  5. istart とする。

  6. i < end の間、次を行う:

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

    2. charCodeString を、FromCharCode(charCode) とする。

    3. result を、resultcharCodeString の連結とする。

    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. trap が実行されたかのように、RuntimeError 例外を投げる。

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

  3. stringLength を、string長さとする。

  4. arrayLengtharray の要素数とする。

  5. もし start + stringLength > arrayLength なら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

  6. i を 0 とする。

  7. i < stringLength の間、次を行う:

    1. charCode を、CharCodeAt(string, i) とする。

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

    3. ii + 1 に設定する。

  8. stringLength を返す。

6.1.6. fromCharCode

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

このビルトインが引数 v で呼び出されたとき、次の手順を実行する:

  1. FromCharCode(v) を返す。

6.1.7. fromCodePoint

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

このビルトインが引数 v で呼び出されたとき、次の手順を実行する:

  1. もし v > 0x10ffff なら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

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

6.1.8. charCodeAt

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

このビルトインが引数 stringindex で呼び出されたとき、次の手順を実行する:

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

  2. length を、length(長さ) を用いて string の長さとする。

  3. もし index >= length なら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

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

6.1.9. codePointAt

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

このビルトインが引数 stringindex で呼び出されたとき、次の手順を実行する:

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

  2. length を、length(長さ) を用いて string の長さとする。

  3. もし index >= length なら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

  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. length(長さ)を用いた string の長さを返す。

6.1.11. concat

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

このビルトインが引数 firstsecond で呼び出されたとき、次の手順を実行する:

  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 externref)))).0 である。

このビルトインが引数 stringstartend で呼び出されたとき、次の手順を実行する:

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

  2. length を、length(長さ) を用いて string の長さとする。

  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 文字列同士の等値比較を明示的に許可する。

このビルトインが引数 firstsecond で呼び出されたとき、次の手順を実行する:

  1. もし first が null ではなく、かつ firstString でないなら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

  2. もし second が null ではなく、かつ secondString でないなら、

    1. trap が実行されたかのように、RuntimeError 例外を投げる。

  3. もし ! IsStrictlyEqual(first, second) が true なら、

    1. 1 を返す。

  4. 0 を返す。

6.1.14. compare

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

このビルトインが引数 firstsecond で呼び出されたとき、次の手順を実行する:

  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 の例外は処理でき、かつ trap が処理された後に JavaScript から WebAssembly のエクスポートを引き続き呼び出すことができるため、trap は一般に 将来の実行を妨げるものではない。

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

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

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

7.2. メモリ不足(Out of Memory)

検証、コンパイル、またはインスタンス化の過程でメモリ不足になった場合は常に、 JavaScript のメモリ不足時と同じ種類の例外が投げられる。 どの例外になるかは、いずれの場合も実装定義である。

注: ECMAScript は OOM(メモリ不足)時の挙動を規定していない。 実装では OOMError を投げたりクラッシュすることが観測されている。どちらもここでは妥当である。

大きな table や memory の確保に失敗した場合、次のいずれかの結果になり得る: 将来の改訂では、大量のメモリ確保に対して、より信頼でき回復可能なエラーの再検討を行う可能性がある。

詳細は Issue 879 を参照。

8. 実装定義の制限

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

実行時に以下のいずれかの制限を超えた場合、実装は RuntimeError を投げなければならない。 実際には、これらの制限未満の妥当なモジュールであっても、実装のリソースが不足する場合がある。

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

この節は規範的ではない(非規範的)。

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

10. 変更履歴

この節は規範的ではない(非規範的)。

WebAssembly 仕様の初版 1.0 以降、多数の拡張提案が統合されている。 以下の節では、何が変更されたかの概要を示す。

10.1. リリース 2.0

複数値

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

BigInt の統合

WebAssembly の i64 値は、(import/export された)global、table の get/set 操作、関数の戻り値や引数を介して JavaScript と相互に受け渡しが可能であり、BigInt オブジェクトとして扱われる。

参照型(Reference Types)

JavaScript の値は、(import/export された)global、table の set/get 操作、関数の引数や戻り値を介して WebAssembly と相互に受け渡しでき、 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 Language Specification. 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. Key words for use in RFCs to Indicate Requirement Levels. March 1997. 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 Standard for Floating-Point Arithmetic. 22 July 2019. 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(BufferSource bytes, optional WebAssemblyCompileOptions options = {});
    Promise<Module> compile(BufferSource bytes, optional WebAssemblyCompileOptions options = {});

    Promise<WebAssemblyInstantiatedSource> instantiate(
        BufferSource 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(BufferSource 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([EnforceRange] unsigned long index);
  boolean is(Tag exceptionTag);
  readonly attribute (DOMString or undefined) stack;
};

課題索引

大きな table または memory の確保に失敗した場合、次のいずれかの結果になる可能性がある 将来の改訂では、大量のメモリ確保に対して、より信頼でき回復可能なエラーの再検討を行う可能性がある。

詳細は Issue 879 を参照。