1. 導入
設計上、WebAssembly コア仕様 [WEBASSEMBLY] の スコープ には、WebAssembly プログラムがその周囲の実行環境とどのように相互作用するかの 記述は含まれない。 代わりに、それは WebAssembly とその環境との間の抽象的な 埋め込みインターフェイス を定義し、 (埋め込み側 と呼ばれる)。 埋め込み側が WebAssembly の意味論と相互作用するのはこのインターフェイスを通してのみであり、 埋め込み側はそのホスト環境と埋め込み API との接続を実装する。 この文書は、WebAssembly を JavaScript [ECMASCRIPT] 環境へ埋め込む方法を記述し、 WebAssembly モジュールをどのように構築しインスタンス化できるか、インポートされた関数および エクスポートされた関数がどのように呼び出されるか、データがどのように交換されるか、 そしてエラーがどのように処理されるかを含む。 JavaScript 環境自体が Web ブラウザに埋め込まれている場合、Web API 仕様 [WASMWEB] は Web 環境に関連する追加の挙動を記述する。
2. API 使用例
この節は非規範的である。
demo.wat(demo.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 は、次の 順序付きマップ と関連付けられる:
-
Memory object cache。memory address を
Memoryオブジェクトに対応付ける。 -
Table object cache。table address を
Tableオブジェクトに対応付ける。 -
Exported Function cache。function address を Exported Function オブジェクトに対応付ける。
-
Exported GC Object cache。struct address および array address を Exported GC Object オブジェクトに対応付ける。
-
Global object cache。global address を
Globalオブジェクトに対応付ける。 -
Tag object cache。tag address を
Tagオブジェクトに対応付ける。 -
Exception object cache。exception address を
Exceptionオブジェクトに対応付ける。 -
Host value cache。host address を値に対応付ける。
5. WebAssembly 名前空間
dictionary {WebAssemblyInstantiatedSource required Module ;module required Instance ; };instance dictionary {WebAssemblyCompileOptions USVString ?=importedStringConstants null ;sequence <USVString >= []; }; [Exposed=*]builtins 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 ; };
-
module を module_decode(bytes) とする。module が error なら、error を返す。
-
module_validate(module) が error なら、error を返す。
-
module を返す。
WebAssembly モジュールの組み込み機能とインポートされた 文字列を検証するには、モジュール module、有効な組み込み機能 builtinSetNames、および importedStringModule を指定して、次の手順を実行する:
-
組み込みセット名の検証で builtinSetNames に対して false が返された場合、false を返す。
-
各 import(module_imports(module) の要素)について、
-
importedStringModule が null でなく、かつ import[0] が importedStringModule と等しい場合、
-
importExternType を import[2] とする。
-
match_externtype(stringExternType, importExternType) が false の場合、false を返す
-
-
それ以外の場合、
-
組み込み機能のインポートの 検証で、import と builtinSetNames に対して false が返された場合、 false を返す。
-
-
-
true を返す。
validate(bytes, options) メソッドは、
呼び出されると次の手順を実行する:
-
stableBytes を、バッファが保持するバイト列 のコピー bytes とする。
-
stableBytes を WebAssembly モジュールとして コンパイル し、その結果を module として保持する。
-
module が error なら、false を返す。
-
builtinSetNames を options["builtins"] とする。
-
importedStringModule を options["importedStringConstants"] とする。
-
module に対する ビルトインとインポート文字列の 検証 が、builtinSetNames および importedStringModule を用いて false を返した場合、false を返す。
-
true を返す。
Module オブジェクトは、
単一の WebAssembly モジュールを表す。各 Module オブジェクトは
次の内部スロットを持つ:
-
[[Module]] : WebAssembly module
-
[[Bytes]] : [[Module]] のソースバイト列。
-
[[BuiltinSets]] : ビルトイン集合 の名前の順序付き集合
-
[[ImportedStringModule]] : 任意の文字列定数をそこからインポートできる、省略可能な モジュール指定子文字列。
WebAssemblyCompileOptions
options から、
任意の task
source taskSource を用いて
WebAssembly モジュールを非同期にコンパイルするには、
次の手順を実行する:
-
promise を 新しい promise とする。
-
次の手順を 並列に 実行する:
-
WebAssembly モジュールをコンパイルする bytes をコンパイルし、その結果を module として格納する。
-
タスクをキューに入れる。taskSource が指定されている場合は、そこで 次の手順を実行する:
-
module が エラーである場合、
CompileError例外で promise を 拒否 し、戻る。 -
builtinSetNames を options["builtins"] とする。
-
importedStringModule を options["importedStringConstants"] とする。
-
module に対して builtinSetNames および importedStringModule を用いて 組み込みおよび インポートされた文字列を検証する結果が false である場合、
CompileError例外で promise を 拒否する。 -
それ以外の場合、
-
module、bytes、builtinSetNames、 importedStringModule から WebAssembly モジュールオブジェクトを構築し、その結果を moduleObject とする。
-
moduleObject で promise を 解決する。
-
-
-
-
promise を返す。
compile(bytes, options) メソッドは、
呼び出されると次の手順を実行する:
-
stableBytes を、バッファが保持するバイト列 のコピー bytes とする。
-
stableBytes から 非同期に WebAssembly モジュールをコンパイル し、options を用いて、その結果を返す。
モジュール module および importedStringModule を用いて インポートされた文字列をインスタンス化するには、 次の手順を実行する。
-
表明: importedStringModule は null ではない。
-
exportsObject を OrdinaryObjectCreate(null) とする。
-
各 (moduleName, componentName, externtype) (module_imports(module)) について、
-
moduleName が importedStringModule と等しくない場合は、次の反復へ進む。
-
stringConstant を componentName とする。
-
status を ! CreateDataProperty(exportsObject, stringConstant, stringConstant) とする。
-
表明: status は true である。
-
-
exportsObject を返す。
インポートを読み取るには、 WebAssembly モジュール module、インポートオブジェクト importObject、有効な組み込み機能 builtinSetNames、および importedStringModule を指定して、次の手順を実行する:
-
module_imports(module) が空でなく、かつ importObject が存在しない場合、
TypeError例外をスローする。 -
builtinOrStringImports を順序付きマップ «[ ]» とする。
-
各 builtinSetName( builtinSetNames の要素)について、
-
builtinSetQualifiedName を builtinSetName の先頭に "wasm:" を付けたものとする。
-
表明:builtinOrStringImports は builtinSetQualifiedName を含まない。
-
builtinSetName が組み込みセットを参照していない場合、次の反復に進む。
-
exportsObject を builtinSetName を使用して組み込みセットを インスタンス化する結果とする。
-
設定する: builtinOrStringImports[builtinSetQualifiedName] を exportsObject に。
-
-
importedStringModule が null でない場合、
-
exportsObject を インポートされた文字列をインスタンス化する結果とする。 module と importedStringModule を使用する。
-
設定する: builtinOrStringImports[importedStringModule] を exportsObject に。
-
-
imports を « » とする。
-
各 (moduleName, componentName, externtype)(module_imports(module) の要素)について、
-
builtinOrStringImports[moduleName] が存在する場合、
-
o を builtinOrStringImports[moduleName] とする。
-
o がObject でないか、または? HasProperty(o, componentName) が false の場合、
-
-
それ以外の場合、
-
o がObject でない場合、
TypeError例外をスローする。 -
externtype が func functype の形式である場合、
-
IsCallable(v) が false の場合、
LinkError例外をスローする。 -
v が [[FunctionAddress]] 内部スロットを持ち、したがってエクスポートされた関数である場合、
-
funcaddr を v の [[FunctionAddress]] 内部スロットの値とする。
-
-
それ以外の場合、
-
ホスト関数を作成する。 v と functype を使用し、funcaddr をその 結果とする。
-
index を imports 内の外部関数の数とする。 この値 index は、ホスト関数 funcaddr のインデックスとして 知られる。
-
-
追加する:externfunc を imports に。
-
-
externtype が global mut valtype の形式である場合、
-
-
globaladdr を v.[[Global]] とする。
-
-
それ以外の場合、
-
valtype が i64 であり、かつ v が BigInt でない場合、
-
LinkError例外をスローする。
-
-
valtype が i32、f32 または f64 のいずれかであり、かつ v が Number でない場合、
-
LinkError例外をスローする。
-
-
valtype が v128 である場合、
-
LinkError例外をスローする。
-
-
value を ToWebAssemblyValue(v, valtype) とする。この操作が
TypeErrorをスローした場合、 それを捕捉し、LinkError例外をスローする。 -
store を周囲のエージェントの関連付けられたストアとする。
-
(store, globaladdr) を global_alloc(store, valtype, value) とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
-
externglobal を global globaladdr とする。
-
追加する:externglobal を imports に。
-
-
externtype が mem memtype の形式である場合、
-
externtype が table tabletype の形式である場合、
-
externtype が tag functype の形式である場合、
-
-
imports を返す。
注:このアルゴリズムは、適切な種類の JavaScript 値が渡されていることのみを検証する。 WebAssembly の型要件の検証は、 「WebAssembly モジュールのコアを インスタンス化する」アルゴリズムに委ねられる。
WebAssembly モジュール module とインスタンス instance からエクスポート オブジェクトを作成するには、 次の手順を実行する:
-
exportsObject を OrdinaryObjectCreate(null) とする。
-
各 (name, externtype)(module_exports(module) の要素)について、
-
externval を instance_export(instance, name) とする。
-
表明:externval はerror ではない。
-
externtype が func functype の形式である場合、
-
表明:externval は func funcaddr の形式である。
-
func funcaddr を externval とする。
-
func を funcaddr から新しい エクスポートされた関数を作成した結果とする。
-
value を func とする。
-
-
externtype が global mut globaltype の形式である場合、
-
表明:externval は global globaladdr の形式である。
-
global globaladdr を externval とする。
-
global を globaladdr から作成した新しい Global オブジェクトとする。
-
value を global とする。
-
-
externtype が mem memtype の形式である場合、
-
表明:externval は mem memaddr の形式である。
-
mem memaddr を externval とする。
-
memory を memaddr から作成した新しい Memory オブジェクトとする。
-
value を memory とする。
-
-
externtype が table tabletype の形式である場合、
-
表明:externval は table tableaddr の形式である。
-
table tableaddr を externval とする。
-
table を tableaddr から作成した新しい Table オブジェクトとする。
-
value を table とする。
-
-
externtype が tag functype の形式である場合、
-
表明:externval は tag tagaddr の形式である。
-
tag tagaddr を externval とする。
-
tag を tagaddr から作成した新しい Tag オブジェクトとする。
-
value を tag とする。
-
-
status を ! CreateDataProperty(exportsObject, name, value) とする。
-
表明:status は true である。
注: WebAssembly モジュールの検証中に実行される妥当性と一意性の検査により、各プロパティ名が 有効であり、どのプロパティも重複して定義されていないことが保証される。
-
-
! SetIntegrityLevel(exportsObject,
"frozen") を実行する。 -
exportsObject を返す。
-
module および instance から exports オブジェクトを作成し、exportsObject をその結果とする。
-
instanceObject.[[Instance]] を instance に設定する。
-
instanceObject.[[Exports]] を exportsObject に設定する。
-
store を 周囲のエージェントの 関連付けられたストアとする。
-
(store, result) を module_instantiate(store, module, imports) とする。
-
result が error の場合、適切な例外型を投げる。
-
リンク中に発生するほとんどの場合については
LinkError例外。 -
開始関数の実行時にエラーが発生した場合、WebAssembly から発生するほとんどのエラーについては
RuntimeErrorを投げるか、内部の ECMAScript コードから伝播されたエラーオブジェクトを投げる。 -
適切であれば別のエラー型。例えば、WebAssembly エラーマッピングに記載されている メモリ不足例外など。
-
-
周囲のエージェントの 関連付けられたストアを store に設定する。
-
result を返す。
Module
moduleObject およびインポート importObject から WebAssembly
モジュールを非同期にインスタンス化するには、次の手順を実行する。
-
promise を 新しい promise とする。
-
module を moduleObject.[[Module]] とする。
-
builtinSetNames を moduleObject.[[BuiltinSets]] とする。
-
importedStringModule を moduleObject.[[ImportedStringModule]] とする。
-
module のインポートを、インポート importObject、 builtinSetNames および importedStringModule を用いて 読み取り、imports を その結果とする。 この操作が例外を投げた場合、それを捕捉し、例外で 拒否する promise とし、promise を返す。
-
次の手順を 並行して実行する:
-
次の手順を実行するための タスクをキューに入れる: 注記: 実装固有の作業をここで実行してもよい。
-
imports を用いて module の WebAssembly モジュールの コアをインスタンス化し、instance をその結果とする。 これが例外を投げた場合、それを捕捉し、例外で 拒否する promise とし、 これらのサブステップを終了する。
-
module および instance から instanceObject を 初期化する。 これが例外を投げた場合、それを捕捉し、例外で 拒否する promise とし、 これらのサブステップを終了する。
-
instanceObject で promise を 解決する。
-
-
-
promise を返す。
-
promise を 新しい promise とする。
-
promiseOfModule に 反応する:
-
promiseOfModule が値 module で履行された場合:
-
importObject をインポートして module の WebAssembly モジュールを インスタンス化し、innerPromise をその結果とする。
-
innerPromise に 反応する:
-
innerPromise が値 instance で履行された場合。
-
result を
WebAssemblyInstantiatedSource値 «[ "module" → module, "instance" → instance ]» とする。 -
result で promise を 解決する。
-
-
innerPromise が理由 reason で拒否された場合:
-
reason で promise を 拒否する。
-
-
-
-
promiseOfModule が理由 reason で拒否された場合:
-
reason で promise を 拒否する。
-
-
-
promise を返す。
instantiate(bytes, importObject, options)
メソッドは、呼び出されたとき、次の手順を実行する:
-
stableBytes を、bytes の バッファが保持するバイトのコピーとする。
-
options を使用して stableBytes から WebAssembly モジュールを 非同期にコンパイルし、promiseOfModule をその結果とする。
-
インポート importObject を用いて promiseOfModule を インスタンス化し、その結果を返す。
instantiate(moduleObject, importObject)
メソッドは、呼び出されたとき、次の手順を実行する:
-
importObject をインポートして moduleObject の WebAssembly モジュールを非同期に インスタンス化し、その結果を返す。
注記: 後続のストリーミング API は WebAssembly Web API に文書化されている。
WebAssembly
名前空間の JSTag 属性の getter は、呼び出されたとき、次の手順を実行する:
-
JSTagAddr を JavaScript 例外タグを取得した結果とする。
-
JSTagObject を、JSTagAddr から Tag オブジェクトを作成した結果とする。
-
JSTagObject を返す。
5.1. モジュール
enum {ImportExportKind ,"function" ,"table" ,"memory" ,"global" };"tag" enum {AddressType ,"i32" , };"i64" typedef any ;AddressValue dictionary {ModuleExportDescriptor required USVString ;name required ImportExportKind ; // Note: Other fields such as signature may be added in the future. };kind 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
exports(moduleObject) メソッドは、呼び出されると、
次の手順を実行する:
-
module を moduleObject.[[Module]] とする。
-
exports を « » とする。
-
各 (name, type) について、module_exports(module) の、
-
kind を、type の extern 型の文字列値 とする。
-
obj を exports に 追加 する。
-
-
exports を返す。
imports(moduleObject) メソッドは、呼び出されると、
次の手順を実行する:
-
module を moduleObject.[[Module]] とする。
-
builtinSetNames を moduleObject.[[BuiltinSets]] とする。
-
importedStringModule を moduleObject.[[ImportedStringModule]] とする。
-
imports を « » とする。
-
各 (moduleName, name, type) について、module_imports(module) の、
-
(moduleName, name, type) に対する ビルトインの検索 が builtinSetNames について null ではないなら、continue する。
-
importedStringModule が null ではなく、かつ moduleName が importedStringModule に等しいなら、continue する。
-
kind を、type の extern 型の文字列値 とする。
-
obj を «[ "
module" → moduleName, "name" → name, "kind" → kind ]» とする。 -
obj を imports に 追加 する。
-
-
imports を返す。
customSections(moduleObject, sectionName)
メソッドは、呼び出されると、次の手順を実行する:
-
bytes を moduleObject.[[Bytes]] とする。
-
customSections を « » とする。
-
各 custom section customSection について bytes の、 module grammar に従って解釈されたものを、
-
name を、customSection の
nameを UTF-8 としてデコード したものとする。 -
Assert: name は failure ではない (moduleObject.[[Module]] は 妥当 である)。
-
name が文字列値として sectionName に等しい場合、
-
この customsec 生成規則に一致した範囲について、 bytes 内のバイト列のコピーを含む新しい
ArrayBufferを customSections に 追加 する。
-
-
-
customSections を返す。
Module(bytes, options) コンストラクターは、
呼び出されると、次の手順を実行する:
-
stableBytes を、バッファが保持するバイト列 のコピー bytes とする。
-
stableBytes を WebAssembly モジュールとしてコンパイル し、その結果を module として保持する。
-
module が error なら、
CompileError例外を throw する。 -
builtinSetNames を options["builtins"] とする。
-
importedStringModule を options["importedStringConstants"] とする。
-
module に対する ビルトインと インポート文字列の検証 が、 builtinSetNames および importedStringModule を用いて false を返す場合、
CompileError例外を throw する。 -
this.[[Module]] を module に設定する。
-
this.[[Bytes]] を stableBytes に設定する。
-
this.[[BuiltinSets]] を builtinSetNames に設定する。
-
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)
コンストラクターは、呼び出されると、次の手順を実行する:
-
builtinSetNames を moduleObject.[[BuiltinSets]] とする。
-
importedStringModule を moduleObject.[[ImportedStringModule]] とする。
-
module を moduleObject.[[Module]] とする。
-
module の インポートを読み取り、 imports importObject、 builtinSetNames および importedStringModule を用い、その結果を imports とする。
-
module を imports とともに WebAssembly モジュールのコアとして インスタンス化 し、その結果を instance とする。
-
module および instance から this を 初期化 する。
注: この同期 API の使用は 推奨されない。実装によっては、インスタンス化時に長時間実行されるコンパイル作業を行うことがあるためである。
Instance の exports 属性の 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 は
以下の内部スロットを持つ:
-
[[Memory]] : メモリアドレス
-
[[BufferObject]] :
ArrayBufferであり、その Data Block は、上記のメモリアドレスと 対応付けられている
-
block を、memaddr の基底メモリと 対応付けられている Data Block とする。
-
buffer を、内部スロット [[ArrayBufferData]]、[[ArrayBufferByteLength]]、および [[ArrayBufferDetachKey]] を持つ新しい
ArrayBufferとする。 -
buffer.[[ArrayBufferData]] を block に設定する。
-
buffer.[[ArrayBufferByteLength]] を block の長さに設定する。
-
buffer.[[ArrayBufferDetachKey]] を "WebAssembly.Memory" に設定する。
-
buffer を返す。
-
block を、memaddr の基底メモリと 対応付けられている Data Block とする。
-
length を block の長さとする。
-
buffer を、内部スロット [[ArrayBufferData]]、[[ArrayBufferByteLength]]、 [[ArrayBufferMaxByteLength]]、および [[ArrayBufferDetachKey]] を持つ新しい
ArrayBufferとする。 -
buffer.[[ArrayBufferData]] を block に設定する。
-
buffer.[[ArrayBufferByteLength]] を length に設定する。
-
buffer.[[ArrayBufferMaxByteLength]] を maxsize に設定する。
-
buffer.[[ArrayBufferDetachKey]] を "WebAssembly.Memory" に設定する。
-
buffer を返す。
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
Assert: map[memaddr] は 存在しない。
-
buffer を、memaddr から 固定長メモリバッファを作成する 結果とする。
-
memory.[[Memory]] を memaddr に設定する。
-
memory.[[BufferObject]] を buffer に設定する。
-
Set map[memaddr] を memory に設定する。
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
map[memaddr] が 存在する 場合、
-
map[memaddr] を返す。
-
-
memaddr から memory を 初期化 する。
-
memory を返す。
Memory(descriptor) コンストラクターは、呼び出されると、
次の手順を実行する:
-
descriptor["address"] が存在する場合、 addrtype を ToValueType(descriptor["address"]) とする。それ以外の場合、 addrtype を i32 とする。
-
initial を ? AddressValueToU64(descriptor["initial"], addrtype) とする。
-
descriptor["maximum"] が存在する場合、 maximum を ? AddressValueToU64(descriptor["maximum"], addrtype) とする。それ以外の場合、maximum を空とする。
-
memtype をメモリ型 addrtype [initial .. maximum] page とする。
-
memtype が妥当でない場合、
RangeError例外をスローする。 -
store を周囲のエージェントの関連付けられたストアとする。
-
(store, memaddr) を mem_alloc(store, memtype) とする。 割り当てが失敗した場合、
RangeError例外をスローする。 -
周囲のエージェントの関連付けられたストアを store に設定する。
-
初期化する this を memaddr から。
-
map を周囲のエージェントに関連付けられたMemory オブジェクトキャッシュとする。
-
表明:map[memaddr] が存在する。
-
memory を map[memaddr] とする。
-
buffer を memory.[[BufferObject]] とする。
-
IsFixedLengthArrayBuffer(buffer) が true の場合、
-
! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。
-
buffer を memaddr から固定長メモリ バッファーを作成する結果とする。
-
memory.[[BufferObject]] を buffer に設定する。
-
-
それ以外の場合、
-
store を周囲のエージェントの関連付けられたストアとする。
-
ret を mem_size(store, memaddr) とする。
-
store を mem_grow(store, memaddr, delta) とする。
-
store が error の場合、
RangeError例外をスローする。 -
周囲のエージェントの関連付けられたストアを store に設定する。
-
メモリバッファーを更新する。対象は memaddr である。
-
ret を返す。
grow(delta) メソッドは、呼び出されると、
次の手順を実行する:
-
memaddr を this.[[Memory]] とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(addrtype, limits) を mem_type(store, memaddr) とする。
-
delta64 を ? AddressValueToU64(delta, addrtype) とする。
-
ret を、memaddr に関連付けられたメモリバッファーを拡張する結果とする。 拡張量は delta64 とする。
-
U64ToAddressValue(ret, addrtype) を返す。
WebAssembly の memory.grow x 命令が実行された直後に、次の 手順を実行する。
toFixedLengthBuffer() メソッドは、呼び出されると、
次の手順を実行する。
-
buffer を this.[[BufferObject]] とする。
-
IsFixedLengthArrayBuffer(buffer) が true の場合、buffer を返す。
-
memaddr を this.[[Memory]] とする。
-
fixedBuffer を、memaddr から 固定長メモリバッファーを作成した 結果とする。
-
! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。
-
this.[[BufferObject]] を fixedBuffer に設定する。
-
fixedBuffer を返す。
toResizableBuffer() メソッドは、呼び出されると、
次の手順を実行する。
-
memaddr を this.[[Memory]] とする。
-
store を 周囲のエージェントの 関連付けられたストアとする。
-
memtype を mem_type(store, memaddr) とする。
-
memtype が max を持たない場合、
-
buffer を this.[[BufferObject]] とする。
-
IsFixedLengthArrayBuffer(buffer) が false の場合、buffer を返す。
-
表明: memtype は max を持つ。
-
maxsize を memtype の max 値 * 65536 とする。
-
resizableBuffer を、memaddr と maxsize から サイズ変更可能なメモリバッファーを作成した結果とする。
-
! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。
-
this.[[BufferObject]] を resizableBuffer に設定する。
-
resizableBuffer を返す。
ArrayBuffer
オブジェクト (Memory
オブジェクトによって返されるもの) は、
WebAssembly の ページ
サイズ (定数 65536) の倍数であるサイズを持たなければならない。このため、HostResizeArrayBuffer を次のように再定義する。
抽象
演算 HostResizeArrayBuffer は引数
buffer (ArrayBuffer)
および newLength を取る。呼び出されると次の手順を実行する。
-
buffer.[[ArrayBufferDetachKey]] が "WebAssembly.Memory" の場合、
-
map を 周囲のエージェントに関連付けられた Memory オブジェクトキャッシュとする。
-
表明: buffer は map 内のちょうど1つの値の [[BufferObject]] である。
-
map 内の 各 memaddr → mem について、
-
SameValue(mem.[[BufferObject]], buffer) が true の場合、
-
表明: buffer.[[ArrayBufferByteLength]] modulo 65536 は 0 である。
-
lengthDelta を newLength - buffer.[[ArrayBufferByteLength]] とする。
-
lengthDelta < 0、または lengthDelta modulo 65536 が 0 でない場合、
-
RangeError例外を投げる。
-
-
delta を lengthDelta ÷ 65536 とする。
-
memaddr に関連付けられた メモリバッファーを delta だけ拡張する。
-
-
-
handled を返す。
-
-
それ以外の場合、
unhandled を返す。
Memory の buffer 属性のゲッターは、
this.[[BufferObject]] を返す。
5.4. テーブル
enum {TableKind ,"externref" , // 注: 将来の反復でさらに値が追加される可能性がある, // 例: 型付き関数参照, 型付き GC 参照 };"anyfunc" 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]] 内部スロットを持ち、これは テーブルアドレス である。
-
map を、surrounding agent に関連付けられた Table object cache とする。
-
Assert: map[tableaddr] は 存在しない。
-
table.[[Table]] を tableaddr に設定する。
-
Set map[tableaddr] を table に設定する。
-
map を、surrounding agent に関連付けられた Table object cache とする。
-
map[tableaddr] が 存在する 場合、
-
map[tableaddr] を返す。
-
-
tableaddr から table を 初期化 する。
-
table を返す。
Table(descriptor, value)
コンストラクターは、呼び出されると、
次の手順を実行する:
-
elementtype を ToValueType(descriptor["element"]) とする。
-
elementtype が reftype でない場合、
-
descriptor["address"] が存在する場合、 addrtype を ToValueType(descriptor["address"]) とする。それ以外の場合、 addrtype を i32 とする。
-
initial を ? AddressValueToU64(descriptor["initial"], addrtype) とする。
-
descriptor["maximum"] が存在する場合、 maximum を ? AddressValueToU64(descriptor["maximum"], addrtype) とする。それ以外の場合、maximum を空とする。
-
type をテーブル型 addrtype [initial .. maximum] elementtype とする。
-
type が妥当でない場合、
RangeError例外をスローする。 -
value が存在しない場合、
-
ref を DefaultValue(elementtype) とする。
-
表明:ref は error ではない。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementtype) とする。
-
-
store を周囲のエージェントの関連付けられたストアとする。
-
(store, tableaddr) を table_alloc(store, type, ref) とする。割り当てが失敗した場合、
RangeError例外をスローする。 -
周囲のエージェントの関連付けられたストアを store に設定する。
-
this を tableaddr から初期化する。
grow(delta, value) メソッドは、呼び出されると、
次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
initialSize を table_size(store, tableaddr) とする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
delta64 を ? AddressValueToU64(delta, addrtype) とする。
-
value が存在しない場合、
-
ref を DefaultValue(elementtype) とする。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementtype) とする。
-
-
result を table_grow(store, tableaddr, delta64, ref) とする。
-
result が error の場合、
RangeError例外をスローする。注:上記の例外は、 メモリ不足または無効なサイズパラメーターによって発生する可能性がある。
-
周囲のエージェントの関連付けられたストアを result に設定する。
-
U64ToAddressValue(initialSize, addrtype) を返す。
Table の length 属性のゲッターは、呼び出されると、
次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
length64 を table_size(store, tableaddr) とする。
-
U64ToAddressValue(length64, addrtype) を返す。
get(index) メソッドは、呼び出されると、次の
手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
elementtype が 一致する対象が exnref である場合、
-
TypeError例外をスローする。
-
-
index64 を ? AddressValueToU64(index, addrtype) とする。
-
result を table_read(store, tableaddr, index64) とする。
-
result が error の場合、
RangeError例外をスローする。 -
ToJSValue(result) を返す。
set(index, value) メソッドは、呼び出されると、
次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
elementtype が 一致する対象が exnref である場合、
-
TypeError例外をスローする。
-
-
index64 を ? AddressValueToU64(index, addrtype) とする。
-
value が存在しない場合、
-
ref を DefaultValue(elementtype) とする。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementtype) とする。
-
-
store を table_write(store, tableaddr, index64, ref) とする。
-
store が error の場合、
RangeError例外をスローする。 -
周囲のエージェントの関連付けられたストアを store に設定する。
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 つの内部スロットを持つ:
-
[[Global]] : グローバルアドレス
-
map を、surrounding agent に関連付けられた Global object cache とする。
-
Assert: map[globaladdr] は 存在しない。
-
global.[[Global]] を globaladdr に設定する。
-
Set map[globaladdr] を global に設定する。
-
map を、surrounding agent に関連付けられた Global object cache とする。
-
map[globaladdr] が 存在する 場合、
-
map[globaladdr] を返す。
-
-
globaladdr から global を 初期化 する。
-
global を返す。
-
valuetype が externref に等しい場合、! ToWebAssemblyValue(undefined, valuetype) を返す。
-
val_default(valuetype) を返す。
Global(descriptor, v) コンストラクターは、
呼び出されると、次の手順を実行する:
-
mutable を descriptor["mutable"] とする。
-
valuetype を ToValueType(descriptor["value"]) とする。
-
valuetype が 一致する対象が v128 または exnref である場合、
-
TypeError例外をスローする。
-
-
v が存在しない場合、
-
value を DefaultValue(valuetype) とする。
-
表明:value は error ではない。
-
-
それ以外の場合、
-
value を ? ToWebAssemblyValue(v, valuetype) とする。
-
-
mutable が true の場合、globaltype を mut valuetype とする。それ以外の場合、globaltype を valuetype とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(store, globaladdr) を global_alloc(store, globaltype, value) とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
初期化する this を globaladdr から。
Global
global) は次の手順を実行する:
-
store を周囲のエージェントの関連付けられたストアとする。
-
globaladdr を global.[[Global]] とする。
-
globaltype を global_type(store, globaladdr) とする。
-
globaltype が mut valuetype の形式であり、 valuetype が 一致する対象が v128 または exnref である場合、
TypeErrorをスローする。 -
value を global_read(store, globaladdr) とする。
-
ToJSValue(value) を返す。
Global の value
属性のセッターは、呼び出されると、
次の手順を実行する:
-
store を周囲のエージェントの関連付けられたストアとする。
-
globaladdr を this.[[Global]] とする。
-
mut valuetype を global_type(store, globaladdr) とする。
-
mut が空の場合、
TypeErrorをスローする。 -
value を ? ToWebAssemblyValue(与えられた値, valuetype) とする。
-
store を global_write(store, globaladdr, value) とする。
-
store が error の場合、
RangeError例外をスローする。 -
周囲のエージェントの関連付けられたストアを store に設定する。
valueOf() メソッドは、呼び出されると、次の手順を実行する:
-
GetGlobalValue(this) を返す。
5.6. エクスポートされた関数
WebAssembly 関数は、JavaScript では Exported Function として利用可能になる。 Exported Functions は、コンストラクターではない 組み込み関数オブジェクト であり、 [[FunctionAddress]] 内部スロットを持つ。 このスロットは、関数アドレス を保持し、周囲の agent の 関連付けられた store に相対的である。
-
store を 周囲のエージェントの 関連付けられたストアとする。
-
funcinst を store.funcs[funcaddr] とする。
-
funcinst が {type functype, hostcode hostfunc} の形式である場合、
-
表明: hostfunc は JavaScript オブジェクトであり、IsCallable(hostfunc) は true である。
-
index を funcaddr の ホスト関数のインデックス とする。
-
-
それ以外の場合、
-
moduleinst を funcinst.module とする。
-
表明: funcaddr は moduleinst.funcs に含まれる。
-
index を、funcaddr が見つかる moduleinst.funcs のインデックスとする。
-
-
map を周囲のエージェントに関連付けられたエクスポートされた関数の キャッシュとする。
-
map[funcaddr] が存在する場合、
-
map[funcaddr] を返す。
-
-
steps を「エクスポートされた関数 funcaddr を 引数付きで呼び出す」とする。
-
realm を現在の Realm とする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
functype を func_type(store, funcaddr) とする。
-
arity を paramTypes のサイズとする。
-
name をWebAssembly 関数の名前 funcaddr とする。
-
function を CreateBuiltinFunction(steps, arity, name, « [[FunctionAddress]] », realm) とする。
-
function.[[FunctionAddress]] を funcaddr に設定する。
-
設定する:map[funcaddr] を function に。
-
function を返す。
-
store を周囲のエージェントの関連付けられたストアとする。
-
functype を func_type(store, funcaddr) とする。
-
parameters または results 内のいずれかの型が 一致する対象が v128 または exnref である場合、
TypeErrorをスローする。注:上記のエラーは、 [[Call]] メソッドが呼び出されるたびにスローされる。
-
args を « » とする。
-
i を 0 とする。
-
parameters の各 t について、
-
argValues のサイズ > i の場合、arg を argValues[i] とする。
-
それ以外の場合、arg を undefined とする。
-
追加する:? ToWebAssemblyValue(arg, t) を args に。
-
i を i + 1 に設定する。
-
-
(store, ret) を func_invoke(store, funcaddr, args) の結果とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
ret が error の場合、例外をスローする。この例外は、 WebAssembly のエラーマッピングで別途指定されていない限り、WebAssembly
RuntimeError例外であるべきである。 -
ret が exception exnaddr の形式である場合、
-
tagaddr を exn_tag(store, exnaddr) とする。
-
payload を exn_read(store, exnaddr) とする。
-
jsTagAddr をJavaScript 例外 タグを取得する結果とする。
-
tagaddr が jsTagAddr に等しい場合、
-
ToJSValue(payload[0]) をスローする。
-
-
それ以外の場合、
-
exception を exnaddr から作成された新しい Exception とする。
-
exception をスローする。
-
-
-
outArity を ret のサイズとする。
-
outArity が 0 の場合、undefined を返す。
-
それ以外で outArity が 1 の場合、ToJSValue(ret[0]) を返す。
-
それ以外の場合、
-
values を « » とする。
-
ret の各 r について、
-
CreateArrayFromList(values) を返す。
-
注:エクスポートされた 関数の呼び出しは、組み込み関数オブジェクトの定義に従い、呼び出し先のエクスポートされた関数の [[Realm]] で実行される。
注:エクスポートされた関数には [[Construct]]
メソッドがないため、new 演算子を使用して呼び出すことはできない。
-
parameters または results 内のいずれかの型が 一致する対象が v128 または exnref である場合、
TypeErrorをスローする。 -
jsArguments を « » とする。
-
arguments の各 arg について、
-
resultsSize を results のサイズとする。
-
resultsSize が 0 の場合、« » を返す。
-
それ以外で resultsSize が 1 の場合、« ? ToWebAssemblyValue(ret, results[0]) » を返す。
-
それ以外の場合、
-
method を ? GetMethod(ret,
%Symbol.iterator%) とする。 -
values を ? IteratorToList(? GetIteratorFromMethod(ret, method)) とする。
-
wasmValues を新しい空のリストとする。
-
values と results 内の各 value と resultType について、 順番に対応付けて、
-
追加する:? ToWebAssemblyValue(value, resultType) を wasmValues に。
-
-
wasmValues を返す。
-
-
表明:IsCallable(func)。
-
stored settings を現任設定オブジェクトとする。
-
hostfunc を、引数 arguments で呼び出されたときに次の手順を 実行するホスト関数とする。
-
realm を func の関連付けられた Realm とする。
-
relevant settings を realm の設定オブジェクトとする。
-
relevant settings を使用してスクリプトを実行する準備をする。
-
stored settings を使用してコールバックを実行する準備をする。
-
result を func、functype、arguments からホスト 関数を実行する結果とする。
-
stored settings を使用してコールバック実行後の後処理を行う。
-
relevant settings を使用してスクリプト実行後の後処理を行う。
-
表明:result.[[Type]] は
throw またはnormal である。 -
store を周囲のエージェントの関連付けられたストアとする。
-
result.[[Type]] が
throw の場合:-
v を result.[[Value]] とする。
-
-
address を v.[[Address]] とする。
-
-
それ以外の場合、
-
type をJavaScript 例外タグを取得する結果とする。
-
payload を ! ToWebAssemblyValue(v, externref) とする。
-
(store, address) を exn_alloc(store, type, « payload ») とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
-
-
それ以外の場合、result.[[Value]] を返す。
-
-
store を周囲のエージェントの関連付けられたストアとする。
-
(store, funcaddr) を func_alloc(store, functype, hostfunc) とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
funcaddr を返す。
-
表明:w は v128.const v128 の形式ではない。
-
表明:w は ref.exn exnaddr の形式ではない。
-
w が i64.const u64 の形式である場合、
-
w が i32.const u32 の形式である場合、
-
w が f32.const f32 の形式である場合、
-
w が f64.const f64 の形式である場合、
-
w が ref.null の形式である場合、null を返す。
-
w が ref.i31 u31 の形式である場合、
-
w が ref.struct structaddr の形式である場合、新しいエクスポートされた GC オブジェクトを structaddr と "struct" から作成した結果を返す。
-
w が ref.array arrayaddr の形式である場合、新しいエクスポートされた GC オブジェクトを arrayaddr と "array" から作成した結果を返す。
-
w が ref.func funcaddr の形式である場合、新しい エクスポートされた関数を funcaddr から作成した結果を返す。
-
w が ref.extern ref の形式である場合、ToJSValue(ref) を返す。
注:NaN に等しい Number 値には、 観測可能なさまざまな NaN ペイロードが存在する場合がある。詳細については NumericToRawBytes を参照。
ホストアドレス hostaddr からホスト 値を取得するには、次の手順を実行する:
-
表明:type は v128 ではない。
-
type が i64 の場合、
-
i64 を ? ToBigInt64(v) とする。
-
u64 を、i64 が signed_64(u64) となる符号なし整数とする。
-
i64.const u64 を返す。
-
-
type が i32 の場合、
-
type が f32 の場合、
-
type が f64 の場合、
-
type が ref null heaptype の形式である場合、
-
v が null の場合、
-
r を ref.null とする。
-
-
それ以外で match_valtype(type, ref null extern) が true の場合、
-
ref を ! ToWebAssemblyValue(v, ref any) とする。
-
r を ref.extern ref とする。
-
-
それ以外で v がエクスポートされた関数であり、かつ match_valtype(type, ref null func) が true の場合、
-
funcaddr を v の [[FunctionAddress]] 内部スロットの値とする。
-
r を ref.func funcaddr とする。
-
-
それ以外で v がNumber であり、かつ v が ? ToInt32(v) に等しく、かつ ℝ(v) < 230 であり、かつ ℝ(v) ⩾ -230 の場合、
-
それ以外で v がエクスポートされた GC オブジェクトである場合、
-
objectaddr を v の [[ObjectAddress]] 内部スロットの値とする。
-
objectkind を v の [[ObjectKind]] 内部 スロットの値とする。
-
objectkind が "array" の場合、
-
r を ref.array objectaddr とする。
-
-
それ以外で objectkind が "struct" の場合、
-
r を ref.struct objectaddr とする。
-
-
-
それ以外の場合、
-
store を周囲のエージェントの関連付けられたストアとする。
-
actualtype を ref_type(store, r) とする。
-
match_valtype(actualtype, type) が false の場合、
-
TypeErrorをスローする。
-
-
r を返す。
-
-
表明:この手順には到達しない。
AddressType
"i32" に適用され、その意味論を AddressType
"i64" に拡張するため、次の手順を実行する:
-
jsValue を、v をJavaScript 値に変換したものとする。
注:IDL の
any型は、 JavaScript 値の透過的なラッパーではなく、判別可能な共用体である。 -
addrtype が i32 の場合、
-
n を ? ConvertToInt(jsValue, 32, "unsigned") とする。ここで、変換先の型には[EnforceRange] が関連付けられている。
注:これは、 [EnforceRange] unsigned long のJS 変換規則と等価である。
-
-
addrtype が i64 の場合、
-
表明:この手順には到達しない。
AddressType
に対応する
AddressValue
の適切なバリアントに変換するため、次の手順を実行する:
5.7. タグ
5.7.1. タグ型
dictionary {TagType required sequence <ValueType >; }; [parameters LegacyNamespace =WebAssembly , Exposed=*]interface {Tag constructor (TagType ); };type
Tag 値は
例外タグを表す。
Tag オブジェクトを初期化する ために、タグアドレス tagAddress から tag を初期化するには、 次の手順を実行する:
-
map を 周囲の agent に関連付けられた Tag object cache とする。
-
Assert: map[tagAddress] は 存在しない。
-
tag.[[Address]] を tagAddress に設定する。
-
Set map[tagAddress] を tag に設定する。
-
map を 周囲の agent に関連付けられた Tag object cache とする。
-
map[tagAddress] が 存在する 場合、
-
map[tagAddress] を返す。
-
-
Initialize tag を tagAddress から行う。
-
tag を返す。
new Tag(type) の
コンストラクターの手順は次のとおりである:
-
parameters を type["parameters"] とする。
-
wasmParameters を «» とする。
-
各 paramType(parameters の要素)について、
-
追加する:ToValueType(paramType) を wasmParameters に。
-
-
tagtype を、定義型とする。ただし、func wasmParameters → « » は展開(tagtype のもの)である。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(store, tagAddress) を tag_alloc(store, tagtype) とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
初期化する:this を tagAddress から。
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 の内部メソッドは、 以下の実装を使用する。
-
null を返す。
-
false を返す。
-
false を返す。
-
false を返す。
-
undefined を返す。
-
false を返す。
-
false を返す。
-
undefined を返す。
-
TypeErrorを throw する。
-
TypeErrorを throw する。
-
« » を返す。
-
Assert: objectkind は "array" または "struct" のいずれかである。
-
map を 周囲の agent に関連付けられた exported GC object cache とする。
-
map[objectaddr] が 存在する 場合、
-
map[objectaddr] を返す。
-
-
object を MakeBasicObject(« [[ObjectAddress]], [[ObjectKind]] ») とする。
-
object.[[ObjectAddress]] を objectaddr に設定する。
-
object.[[ObjectKind]] を objectkind に設定する。
-
object.[[GetPrototypeOf]] を Exported GC Object の [[GetPrototypeOf]] 内部メソッド で指定されるものに設定する。
-
object.[[SetPrototypeOf]] を Exported GC Object の [[SetPrototypeOf]] 内部メソッド で指定されるものに設定する。
-
object.[[IsExtensible]] を Exported GC Object の [[IsExtensible]] 内部メソッド で指定されるものに設定する。
-
object.[[PreventExtensions]] を Exported GC Object の [[PreventExtensions]] 内部メソッド で指定されるものに設定する。
-
object.[[GetOwnProperty]] を Exported GC Object の [[GetOwnProperty]] 内部メソッド で指定されるものに設定する。
-
object.[[DefineOwnProperty]] を Exported GC Object の [[DefineOwnProperty]] 内部メソッド で指定されるものに設定する。
-
object.[[HasProperty]] を Exported GC Object の [[HasProperty]] 内部メソッド で指定されるものに設定する。
-
object.[[Get]] を Exported GC Object の [[Get]] 内部メソッド で指定されるものに設定する。
-
object.[[Set]] を Exported GC Object の [[Set]] 内部メソッド で指定されるものに設定する。
-
object.[[Delete]] を Exported GC Object の [[Delete]] 内部メソッド で指定されるものに設定する。
-
object.[[OwnPropertyKeys]] を Exported GC Object の [[OwnPropertyKeys]] 内部メソッド で指定されるものに設定する。
-
Set map[objectaddr] を object に設定する。
-
object を返す。
5.9. 例外
dictionary {ExceptionOptions boolean =traceStack false ; }; [LegacyNamespace =WebAssembly , Exposed=*]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 オブジェクトを初期化する ために、exn を Exception address exnAddress から初期化するには、 次の手順を実行する:
-
map を 周囲の agent に関連付けられた Exception object cache とする。
-
Assert: map[exnAddress] は 存在しない。
-
exn.[[Address]] を exnAddress に設定する。
-
Set map[exnAddress] を exn に設定する。
-
store を 周囲の agent の 関連付けられた store とする。
-
tagaddr を exn_tag(store, exnAddress) とする。
-
payload を exn_read(store, exnAddress) とする。
-
exn.[[Type]] を tagaddr に設定する。
-
exn.[[Payload]] を payload に設定する。
-
exn.[[Stack]] を undefined に設定する。
Exception オブジェクトを作成する ために、exception address exnAddress から、 次の手順を実行する:
-
map を 周囲の agent に関連付けられた Exception object cache とする。
-
map[exnAddress] が 存在する 場合、
-
map[exnAddress] を返す。
-
-
Initialize exn を exnAddress から行う。
-
exn を返す。
この new Exception(exceptionTag, payload, options)
コンストラクターの手順は次のとおりである:
-
JSTagAddr をJavaScript 例外タグを取得する結果とする。
-
exceptionTag.[[Address]] が JSTagAddr に等しい場合、
-
TypeErrorをスローする。
-
-
store を周囲のエージェントの関連付けられたストアとする。
-
func types → « » を展開された tag_type(store, exceptionTag.[[Address]]) とする。
-
types のサイズが payload のサイズと等しくない場合、
-
TypeErrorをスローする。
-
-
wasmPayload を « » とする。
-
各 value と resultType( payload と types の要素)を順番に対応付けて、
-
(store, exceptionAddr) を exn_alloc(store, exceptionTag.[[Address]], wasmPayload) とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
this を exceptionAddr から初期化する。
-
options["traceStack"] が true の場合、
-
this.[[Stack]] を、現在の呼び出しスタックを表す
DOMStringまたは undefined に設定する。
-
この getArg(exceptionTag, index)
メソッドの手順は次のとおりである:
-
store を周囲のエージェントの関連付けられたストアとする。
-
this.[[Type]] が exceptionTag.[[Address]] に等しくない場合、
-
TypeErrorをスローする。
-
-
tagaddr を exn_tag(store, this.[[Address]]) とする。
-
payload を exn_read(store, this.[[Address]]) とする。
-
表明:tagaddr は this.[[Type]] に等しい。
-
index ≥ payload のサイズである場合、
-
RangeErrorをスローする。
-
-
types[index] が一致する対象が v128 または exnref である場合、
-
TypeErrorをスローする。
-
-
ToJSValue(payload[index]) を返す。
この is(exceptionTag) メソッドの手順は次のとおりである:
-
this.[[Type]] が exceptionTag.[[Address]] に等しくない場合、
-
false を返す。
-
-
true を返す。
この stack ゲッターの手順は次のとおりである:
-
this.[[Stack]] を返す。
5.9.1. JavaScript 例外
この JavaScript 例外タグは、周囲のエージェントに関連付けられたタグアドレスである。 これはエージェントの関連付けられたストアに 初回使用時に割り当てられ、キャッシュされる。常に次のタグ型 « externref » → « » を持つ。
JavaScript 例外タグを取得するには、次の手順を実行する:
-
周囲のエージェントに関連付けられたJavaScript 例外 タグが初期化されている場合、
-
周囲のエージェントに関連付けられたJavaScript 例外タグを返す。
-
-
tagtype を、定義型とする。ただし、func « externref » → « » がtagtype の展開であるものとする。
-
store を周囲のエージェントの関連付けられたストアとする。
-
(store, tagAddress) を tag_alloc(store, tagtype) とする。
-
周囲のエージェントの関連付けられたストアを store に設定する。
-
周囲のエージェントに関連付けられたJavaScript 例外 タグを tagAddress に設定する。
-
tagAddress を返す。
5.10. エラーオブジェクト
WebAssembly は次の Error クラスを定義する: CompileError, LinkError, および RuntimeError。
WebAssembly
名前空間の namespace object が 作成される とき、次の手順を実行しなければならない:
-
namespaceObject を namespace object とする。
-
各 error について « "CompileError", "LinkError", "RuntimeError" » の、
-
constructor を、NativeError Object Structure を実装する 新しいオブジェクトとし、NativeError を error に設定する。
-
! DefineMethodProperty(namespaceObject, error, constructor, false)。
-
注: これにより CompileError,
LinkError,
および RuntimeError
クラスが WebAssembly
名前空間上に定義される。これらは本仕様で定義される API によって生成される。
これらは、TypeError
や RangeError
のようなネイティブ JavaScript エラーと同じインターフェイスを公開する。
注: 現時点ではこの挙動を Web IDL を使って定義することは できない。
6. ビルトイン
JS-API は、モジュールのコンパイル時に options
を通じてインポートできるビルトイン関数の集合を定義する。WebAssembly ビルトイン関数は既存の JavaScript
ビルトインを反映するが、
最小限のオーバーヘッドで WebAssembly 関数として直接利用できるよう適応されている。
すべてのビルトイン関数は集合にグループ化される。各ビルトイン集合は、
WebAssemblyCompileOptions
で使用される name
と、
インポート探索中に使用される
wasm: 接頭辞付きの qualified name を持つ。
ビルトイン集合の ビルトインを取得する ために、builtinSetName を用いて、 次の手順を実行する:
-
この節内で定義された、名前 builtinSetName を持つ集合について、 (name, funcType, steps) のリストを返す。
ビルトインを見つける ために、import および有効化されたビルトイン builtinSetNames を用いて、 次の手順を実行する:
-
Assert: ビルトイン集合名を検証する builtinSetNames は true である。
-
importModuleName を import[0] とする。
-
importName を import[1] とする。
-
各 builtinSetName について builtinSetNames の、
-
builtinSetName がビルトイン集合を指さない場合、continue する。
-
builtinSetQualifiedName を builtinSetName に "wasm:" を接頭させたものとする。
-
importModuleName が builtinSetQualifiedName と等しい場合、
-
builtins を ビルトイン集合のビルトインを取得する builtinSetName の結果とする。
-
各 builtin について builtins の、
-
builtinName を builtin[0] とする。
-
importName が builtinName と等しい場合、 (builtinSetName, builtin) を返す。
-
-
-
-
null を返す。
ビルトイン集合名を検証する ために、builtinSetNames を用いて、次の手順を実行する:
-
builtinSetNames に重複が含まれている場合、false を返す。
-
true を返す。
ビルトイン関数を作成する ために、型 funcType および実行手順 steps から、 次の手順を実行する:
-
hostfunc を、呼び出されたときに steps を実行する host function とする。
-
store を 周囲の agent の 関連付けられた store とする。
-
(store, funcaddr) を func_alloc(store, funcType, hostfunc) とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
funcaddr を返す。
名前 builtinSetName を用いて ビルトインセットを インスタンス化するには、次の手順を実行する。
-
builtins を、ビルトインセット builtinSetName の ビルトインを取得する結果とする。
-
exportsObject を OrdinaryObjectCreate(null) とする。
-
builtins の 各 (name, funcType, steps) について、
-
funcaddr を、funcType と steps を用いて ビルトイン 関数を作成する結果とする。
-
func を、funcaddr から 新しいエクスポートされた 関数を作成した結果とする。
-
value を func とする。
-
status を ! CreateDataProperty(exportsObject, name, value) とする。
-
表明: status は true である。
-
-
exportsObject を返す。
import と、有効化されたビルトイン builtinSetNames を用いて、ビルトイン用のインポートを検証するには、次の手順を実行する。
-
表明: ビルトインセット名を検証する builtinSetNames は true である。
-
maybeBuiltin を、import と builtinSetNames に対して ビルトインを検索した結果とする。
-
maybeBuiltin が null の場合、true を返す。
-
importExternType を import[2] とする。
-
builtinFuncType を maybeBuiltin[1][1] とする。
-
builtinExternType を
func |builtinFuncType|とする。 -
match_externtype(builtinExternType, importExternType) を返す。
6.1. 文字列ビルトイン
文字列ビルトインは、String ビルトイン
オブジェクトのインターフェイスを適応させる。この集合に対する name は
js-string であり、qualified name は wasm:js-string である。
注: この節のアルゴリズムは、String 上で定義される JS ビルトインを参照する。これらは実際のビルトインを指し、String オブジェクト上で動的ルックアップを行わない。
6.1.1. 抽象操作
UnwrapString(v) 抽象操作は、呼び出されると、 次の手順を実行する:
-
v が String ではない 場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
v を返す
FromCharCode(v) 抽象操作は、呼び出されたとき、 次の手順を実行する:
-
表明: v は i32 型である。
-
! Call(String.fromCharCode, undefined, « ToJSValue(v) ») を返す。
CharCodeAt(string, index) 抽象 操作は、呼び出されたとき、次の手順を実行する:
-
表明: index は i32 型である。
-
! Call(String.prototype.charCodeAt, string, « ToJSValue(index) ») を返す。
6.1.2. cast
このビルトインの funcType は
(rec (type (func (param externref) (result (ref extern))))).0 である。
このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:
-
? UnwrapString(v) を返す
6.1.3. test
このビルトインの funcType は (rec (type (func (param externref) (result i32)))).0 である。
このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:
-
v が String ではない 場合、
-
0 を返す。
-
-
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 で呼び出されたとき、 次の手順を実行しなければならない:
-
array が null の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
length を array 内の要素数とする。
-
start > end または end > length の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
result を空文字列とする。
-
i を start とする。
-
i < end の間:
-
charCode を、array のインデックス i に格納された要素の値と する。
-
charCodeString を FromCharCode(charCode) とする。
-
result を result と charCodeString の連結とする。
-
i を i + 1 に設定する。
-
-
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 で呼び出されたとき、 次の手順を実行しなければならない:
-
array が null の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
string を ? UnwrapString(string) とする。
-
stringLength を string の 長さ とする。
-
arrayLength を array 内の要素数とする。
-
start + stringLength > arrayLength の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
i を 0 とする。
-
i < stringLength の間:
-
charCode を CharCodeAt(string, i) とする。
-
array のインデックス start + i にある要素を ToWebAssemblyValue(charCode, i32) に設定する。
-
i を i + 1 に設定する。
-
-
stringLength を返す。
6.1.6. fromCharCode
このビルトインの funcType は
(rec (type (func (param i32) (result (ref extern))))).0 である。
このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:
-
FromCharCode(v) を返す。
6.1.7. fromCodePoint
このビルトインの funcType は (rec (type (func (param i32) (result externref)))).0 である。
このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:
-
v > 0x10ffff の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
! Call(String.fromCodePoint, undefined, « ToJSValue(v) ») を返す。
6.1.8. charCodeAt
この関数の型は (rec (type (func (param externref i32) (result i32)))).0 である。
このビルトインがパラメータ string および index で呼び出されたとき、次の手順 を実行しなければならない:
-
string を ? UnwrapString(string) とする。
-
length を string の 長さ とする。
-
index >= length の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
CharCodeAt(string, index) を返す。
6.1.9. codePointAt
この関数の型は (rec (type (func (param externref i32) (result i32)))).0 である。
このビルトインがパラメータ string および index で呼び出されたとき、次の手順 を実行しなければならない:
-
string を ? UnwrapString(string) とする。
-
length を string の 長さ とする。
-
index >= length の場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
! Call(String.prototype.codePointAt, string, « ToJSValue(index) ») を返す。
6.1.10. length
このビルトインの funcType は (rec (type (func (param externref) (result i32)))).0 である。
このビルトインがパラメータ v で呼び出されたとき、次の手順を実行しなければならない:
-
string を ? UnwrapString(v) とする。
-
string の 長さ を返す。
6.1.11. concat
このビルトインの funcType は
(rec (type (func (param externref externref) (result (ref extern))))).0 である。
このビルトインがパラメーター first および second を用いて呼び出された場合、次の手順を 実行しなければならない。
-
first を ? UnwrapString(first) とする。
-
second を ? UnwrapString(second) とする。
-
! 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 を用いて呼び出された場合、次の 手順を実行しなければならない。
-
string を ? UnwrapString(string) とする。
-
length を string の 長さ とする。
-
start > end または start > length の場合、
-
空文字列を返す。
-
-
! 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 を用いて呼び出された場合、次の手順を 実行しなければならない。
-
first が null ではなく、かつ first が String ではない場合、
-
トラップが実行されたかのように、
RuntimeError例外を投げる。
-
-
second が null ではなく、かつ second が String ではない場合、
-
トラップが実行されたかのように、
RuntimeError例外を投げる。
-
-
IsStrictlyEqual(first, second) が true の場合、
-
1 を返す。
-
-
0 を返す。
6.1.14. compare
このビルトインの funcType は
(rec (type (func (param externref externref) (result i32)))).0 である。
このビルトインがパラメーター first および second を用いて呼び出された場合、次の手順を 実行しなければならない。
-
first を ? UnwrapString(first) とする。
-
second を ? UnwrapString(second) とする。
-
IsStrictlyEqual(first, second) が true の場合、
-
0 を返す。
-
-
! IsLessThan(first, second, true) が true の場合、
-
-1 を返す。
-
-
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 を投げたりクラッシュしたりすることが観測されている。ここでは いずれも有効である。
-
RangeError、 これはMemoryのgrow()およびTableのgrow()操作で規定される -
memory.grow 命令の結果として -1 を返すこと
-
この節で述べられる UA 固有の OOM 挙動。
さらなる議論については Issue 879 を参照。
8. 実装定義の制限
WebAssembly コア仕様は、実装がモジュールの構文構造に対する制限を定義することを許可している。
WebAssembly の各埋め込みは独自の制限を定義してもよいが、予測可能性のために
本文書で記述される標準 WebAssembly JavaScript Interface は以下の正確な制限を定義する。
実装は、以下のいずれかの制限を超えるモジュールを CompileError
で拒否しなければならない。
実際には、実装はこれらの制限未満の妥当なモジュールに対してもリソース不足になる可能性がある。
- モジュールの最大サイズは 1,073,741,824 バイト(1 GiB)である。
- types セクションで定義できる型の最大数は 1,000,000。
- types セクションで定義できる再帰グループの最大数は 1,000,000。
- 1 つの再帰グループ内で定義できる型の最大数は 1,000,000。
- 定義された subtype 階層の最大深さは 63(supertype を持たずに定義された型の深さを 0 とする)。
- モジュール内で定義できる関数の最大数は 1,000,000。
- モジュール内で宣言できる import の最大数は 1,000,000。
- モジュール内で宣言できる export の最大数は 1,000,000。
- モジュール内で定義できる global の最大数は 1,000,000。
- モジュール内で定義できる tag の最大数は 1,000,000。
- モジュール内で定義できる data segment の最大数は 100,000。
- 宣言または import された table を含む table の最大数は 100,000。
- table の最大サイズは 10,000,000。
- 任意の table 初期化における table entry の最大数は 10,000,000。
- 定義済みおよび import 済み memory を含む memory の最大数は 100。
- 32-bit memory の
minまたはmaxフィールドの最大値は 65,536 ページ(4 GiB)。 - 64-bit memory の
minまたはmaxフィールドの最大値は 2^37-1 ページ(2^53 - 2^16 バイト)。 - 任意の関数または block のパラメータ最大数は 1,000。
- 任意の関数または block の戻り値最大数は 1,000。
- local 宣言を含む関数本体の最大サイズは 7,654,321 バイト。
- パラメータとして暗黙に宣言されるものを含む、関数内で宣言できる local の最大数は 50,000。
- struct 内の field の最大数は 10,000。
array.new_fixedの operand 最大数は 10,000。
実行時に次の制限のいずれかを超えた場合、実装は RuntimeError
を throw しなければならない:
実際には、実装はこれらの制限未満の妥当なモジュールに対してもリソース不足になる可能性がある。
- table の最大サイズは 10,000,000。
- 32-bit memory の最大サイズは 65,536 ページ(4 GiB)。
- 64-bit memory の最大サイズは 262,144 ページ(16 GiB)。
9. セキュリティおよびプライバシーに関する考慮事項
この節は非規範的である。
この文書は WebAssembly のホスト環境を定義する。これにより WebAssembly インスタンスは import オブジェクトから JavaScript のオブジェクトや関数を インポートオブジェクト として インポートできるが、それ以外で埋め込み環境へアクセスする手段は提供されない。そのため、WebAssembly インスタンスは JavaScript と同じ制約に縛られる。
10. 変更履歴
この節は非規範的である。
WebAssembly 仕様の元のリリース 1.0 以来、複数の拡張提案が統合されてきた。 以下の節では、何が変更されたかの概要を示す。