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 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 を返す。
モジュール module、有効化されたビルトイン builtinSetNames、および importedStringModule から WebAssembly モジュールに対するビルトインと インポート文字列を検証するには、次の手順を実行する:
-
builtinSetNames に対する ビルトイン集合名の検証 が false なら、false を返す。
-
各 import について、module_imports(module) の、
-
importedStringModule が null ではなく、かつ import[0] が importedStringModule に等しい場合、
-
importExternType を import[2] とする。
-
stringExternType を
global const (ref extern)とする。 -
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 が error なら、promise を
CompileError例外で reject して return する。 -
builtinSetNames を options["builtins"] とする。
-
importedStringModule を options["importedStringConstants"] とする。
-
module に対する ビルトインと インポート文字列の検証 が、 builtinSetNames および importedStringModule を用いて false なら、 promise を
CompileError例外で reject する。 -
それ以外の場合、
-
module、 bytes、builtinSetNames、 importedStringModule から WebAssembly モジュールオブジェクトを構築 し、その結果を moduleObject とする。
-
promise を moduleObject で resolve する。
-
-
-
-
promise を返す。
compile(bytes, options) メソッドは、
呼び出されると次の手順を実行する:
-
stableBytes を、バッファが保持するバイト列 のコピー bytes とする。
-
stableBytes から 非同期に WebAssembly モジュールをコンパイル し、options を用いて、その結果を返す。
モジュール module と importedStringModule を用いて インポート文字列をインスタンス化するには、次の手順を実行する:
-
Assert: importedStringModule は null ではない。
-
exportsObject を ! OrdinaryObjectCreate(null) とする。
-
各 (moduleName, componentName, externtype) について、module_imports(module) の、
-
moduleName が importedStringModule と等しくなければ、continue する。
-
stringConstant を componentName とする。
-
status を ! CreateDataProperty(exportsObject, stringConstant, stringConstant) とする。
-
Assert: status は true である。
-
-
exportsObject を返す。
-
module.imports が 空でない にもかかわらず、importObject が undefined なら、
TypeError例外を throw する。 -
builtinOrStringImports を順序付きマップ « » とする。
-
各 builtinSetName について builtinSetNames の、
-
builtinSetQualifiedName を、builtinSetName の前に "wasm:" を付けたものとする。
-
Assert: builtinOrStringImports は builtinSetQualifiedName を含まない
-
builtinSetName がビルトイン集合を指していなければ、continue する。
-
exportsObject を、builtinSetName を用いた ビルトイン集合の インスタンス化 の結果とする
-
Set builtinOrStringImports[builtinSetQualifiedName] を exportsObject に設定する
-
-
importedStringModule が null ではない場合、
-
exportsObject を、module および importedStringModule を用いた インポート文字列のインスタンス化 の結果とする
-
Set builtinOrStringImports[importedStringModule] を exportsObject に設定する
-
-
imports を « » とする。
-
各 (moduleName, componentName, externtype) について、module_imports(module) の、
-
builtinOrStringImports が 含む moduleName の場合、
-
o を builtinOrStringImports[moduleName] とする。
-
o が Object ではない、または HasProperty(o, componentName) が false の場合、
-
-
それ以外の場合、
-
o が Object ではない なら、
TypeError例外を throw する。 -
externtype が func functype の形式である場合、
-
IsCallable(v) が false なら、
LinkError例外を throw する。 -
v が [[FunctionAddress]] 内部スロットを持ち、したがって Exported Function である場合、
-
funcaddr を v の [[FunctionAddress]] 内部スロットの値とする。
-
-
それ以外の場合、
-
v および functype から ホスト関数を作成 し、その結果を funcaddr とする。
-
index を imports 内の外部関数の数とする。この値 index は、ホスト関数 funcaddr の ホスト関数インデックス と呼ばれる。
-
-
externfunc を外部値 func funcaddr とする。
-
externfunc を imports に 追加 する。
-
-
externtype が global mut valtype の形式である場合、
-
v が implements
Globalなら、-
globaladdr を v.[[Global]] とする。
-
-
それ以外の場合、
-
valtype が i64 であり、かつ v が BigInt では ない 場合、
-
LinkError例外を throw する。
-
-
valtype が i32、f32、または f64 のいずれかであり、かつ v が Number では ない 場合、
-
LinkError例外を throw する。
-
-
valtype が v128 の場合、
-
LinkError例外を throw する。
-
-
value を ToWebAssemblyValue(v, valtype) とする。この操作が
TypeErrorを throw した場合、それを捕捉し、LinkError例外を throw する。 -
store を surrounding agent の 関連付けられた store とする。
-
(store, globaladdr) を global_alloc(store, const valtype, value) とする。
-
surrounding agent の 関連付けられた store を store に設定する。
-
-
externglobal を global globaladdr とする。
-
externglobal を imports に 追加 する。
-
-
externtype が mem memtype の形式である場合、
-
externtype が table tabletype の形式である場合、
-
externtype が tag attribute functype の形式である場合、
-
-
imports を返す。
注: このアルゴリズムは、正しい種類の JavaScript 値が渡されたことだけを検証する。 WebAssembly の型要件の検証は、 「WebAssembly モジュールのコアを インスタンス化する」アルゴリズムに委ねられる。
-
exportsObject を ! OrdinaryObjectCreate(null) とする。
-
各 (name, externtype) について、module_exports(module) の、
-
externval を instance_export(instance, name) とする。
-
Assert: externval は error ではない。
-
externtype が func functype の形式である場合、
-
Assert: externval は func funcaddr の形式である。
-
func funcaddr を externval とする。
-
func を、funcaddr から 新しい Exported Function を作成した結果とする。
-
value を func とする。
-
-
externtype が global mut globaltype の形式である場合、
-
Assert: externval は global globaladdr の形式である。
-
global globaladdr を externval とする。
-
global を、globaladdr から作成された 新しい Global オブジェクト とする。
-
value を global とする。
-
-
externtype が mem memtype の形式である場合、
-
Assert: externval は mem memaddr の形式である。
-
mem memaddr を externval とする。
-
memory を、memaddr から作成された 新しい Memory オブジェクト とする。
-
value を memory とする。
-
-
externtype が table tabletype の形式である場合、
-
Assert: externval は table tableaddr の形式である。
-
table tableaddr を externval とする。
-
table を、tableaddr から作成された 新しい Table オブジェクト とする。
-
value を table とする。
-
-
externtype が tag attribute functype の形式である場合、
-
Assert: attribute は exception である。
-
Assert: externval は tag tagaddr の形式である。
-
tag tagaddr を externval とする。
-
tag を、tagaddr から作成された 新しい Tag オブジェクト とする。
-
value を tag とする。
-
-
status を ! CreateDataProperty(exportsObject, name, value) とする。
-
Assert: status は true である。
注: WebAssembly モジュール検証 の間に実行される妥当性および一意性の検査により、 各プロパティ名が妥当であり、重複して定義されるプロパティが存在しないことが保証される。
-
-
exportsObject に対して ! SetIntegrityLevel(exportsObject,
"frozen") を実行する。 -
exportsObject を返す。
-
module および instance から エクスポートオブジェクトを作成 し、その結果を exportsObject とする。
-
instanceObject.[[Instance]] を instance に設定する。
-
instanceObject.[[Exports]] を exportsObject に設定する。
-
store を surrounding agent の 関連付けられた store とする。
-
result を module_instantiate(store, module, imports) とする。
-
result が error なら、適切な例外型を throw する:
-
リンク時に発生するほとんどの場合については、
LinkError例外。 -
エラーが start 関数の実行中に発生した場合は、WebAssembly から発生するほとんどのエラーについて
RuntimeErrorを throw するか、内側の ECMAScript コードから伝播したエラーオブジェクトを throw する。 -
適切であれば別のエラー型。たとえば、 WebAssembly エラー対応付け に記述されているメモリ不足例外など。
-
-
(store, instance) を result とする。
-
surrounding agent の 関連付けられた store を store に設定する。
-
instance を返す。
Module
moduleObject およびインポート群 importObject から
WebAssembly モジュールを非同期に
インスタンス化するには、次の手順を実行する:
-
promise を 新しい promise とする。
-
module を moduleObject.[[Module]] とする。
-
builtinSetNames を moduleObject.[[BuiltinSets]] とする。
-
importedStringModule を moduleObject.[[ImportedStringModule]] とする。
-
module の インポートを読み取り、 imports importObject、 builtinSetNames および importedStringModule を用い、その結果を imports とする。 この操作が例外を throw した場合、それを捕捉し、reject promise をその例外で行い、promise を返す。
-
次の手順を 並列に 実行する:
-
次の手順を実行するために タスクをキューに入れる: 注: 実装固有の作業がここで行われることがある。
-
module と imports を用いて WebAssembly モジュールのコアをインスタンス化 し、その結果を instance とする。 これが例外を throw した場合、それを捕捉し、reject promise をその例外で行い、 これらの副手順を終了する。
-
module および instance から instanceObject を 初期化 する。 これが例外を throw した場合、それを捕捉し、reject promise をその例外で行い、 これらの副手順を終了する。
-
instanceObject で promise を resolve する。
-
-
-
promise を返す。
-
promise を 新しい promise とする。
-
promiseOfModule に対して 反応 する:
-
promiseOfModule が値 module で fulfill された場合:
-
module を importObject をインポートして WebAssembly モジュールをインスタンス化 し、その結果を innerPromise とする。
-
innerPromise に対して 反応 する:
-
innerPromise が値 instance で fulfill された場合。
-
result を
WebAssemblyInstantiatedSource値 «[ "module" → module, "instance" → instance ]» とする。 -
result で promise を resolve する。
-
-
innerPromise が理由 reason で reject された場合:
-
reason で promise を reject する。
-
-
-
-
promiseOfModule が理由 reason で reject された場合:
-
reason で promise を reject する。
-
-
-
promise を返す。
instantiate(bytes, importObject, options)
メソッドは、呼び出されると次の手順を実行する:
-
stableBytes を、バッファが保持するバイト列 のコピー bytes とする。
-
stableBytes から 非同期に WebAssembly モジュールをコンパイル し、options を用い、その結果を promiseOfModule とする。
-
promiseOfModule を インスタンス化 し、 imports importObject を用いて、その結果を返す。
instantiate(moduleObject, importObject)
メソッドは、呼び出されると次の手順を実行する:
-
moduleObject を importObject をインポートして 非同期に WebAssembly モジュールをインスタンス化 し、その結果を返す。
注: 後続のストリーミング API は WebAssembly Web API に記載されている。
JSTag 属性の getter は、JSTag attribute of
the WebAssembly
Namespace, when invoked, performs the following steps:
-
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 を descriptor["address"] とする; そうでなければ、 addrtype を "i32" とする。
-
initial を ? AddressValueToU64(descriptor["initial"], addrtype) とする。
-
descriptor["maximum"] が 存在する 場合、 maximum を ? AddressValueToU64(descriptor["maximum"], addrtype) とする; そうでなければ、maximum を empty とする。
-
memtype を memory type addrtype { min initial, max maximum } とする。
-
memtype が 妥当 でない場合、
RangeError例外を throw する。 -
store を、surrounding agent の associated store とする。
-
(store, memaddr) を mem_alloc(store, memtype) とする。 割り当てに失敗した場合、
RangeError例外を throw する。 -
surrounding agent の associated store を store に設定する。
-
memaddr から this を 初期化 する。
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
Assert: map[memaddr] は 存在する。
-
memory を map[memaddr] とする。
-
buffer を memory.[[BufferObject]] とする。
-
IsFixedLengthArrayBuffer(buffer) が true の場合、
-
! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。
-
buffer を、memaddr から 固定長メモリバッファを作成する 結果とする。
-
memory.[[BufferObject]] を buffer に設定する。
-
-
それ以外の場合、
-
block を、memaddr の基底メモリと 対応付けられている Data Block とする。
-
buffer.[[ArrayBufferData]] を block に設定する。
-
buffer.[[ArrayBufferByteLength]] を block の長さに設定する。
-
-
store を、surrounding agent の associated store とする。
-
ret を mem_size(store, memaddr) とする。
-
store を mem_grow(store, memaddr, delta) とする。
-
store が error なら、
RangeError例外を throw する。 -
surrounding agent の associated store を store に設定する。
-
memaddr の メモリバッファを更新する。
-
ret を返す。
grow(delta) メソッドは、呼び出されると、次の手順を実行する:
-
memaddr を this.[[Memory]] とする。
-
store を、surrounding agent の associated store とする。
-
addrtype を、address type in 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 を、surrounding agent の associated store とする。
-
memtype を mem_type(store, memaddr) とする。
-
memtype が max を持たない場合、
-
buffer を this.[[BufferObject]] とする。
-
IsFixedLengthArrayBuffer(buffer) が false なら、buffer を返す。
-
Assert: memtype は max を持つ。
-
maxsize を memtype の max 値 * 65536 とする。
-
resizableBuffer を、memaddr と maxsize から リサイズ可能なメモリバッファを作成する 結果とする。
-
! DetachArrayBuffer(buffer, "WebAssembly.Memory") を実行する。
-
this.[[BufferObject]] を resizableBuffer に設定する。
-
resizableBuffer を返す。
ArrayBuffer
objects returned by a Memory object は、
WebAssembly の ページ
サイズ(定数 65536)の倍数であるサイズを持たなければならない。この理由により HostResizeArrayBuffer は以下のように再定義される。
抽象操作
HostResizeArrayBuffer は、
引数 buffer(ArrayBuffer)
および newLength を取る。呼び出されたとき、次の手順を実行する。
-
buffer.[[ArrayBufferDetachKey]] が "WebAssembly.Memory" の場合、
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
Assert: buffer は、map 内のちょうど 1 つの値の [[BufferObject]] である。
-
各 memaddr → mem について map 内の、
-
SameValue(mem.[[BufferObject]], buffer) が true の場合、
-
Assert: buffer.[[ArrayBufferByteLength]] modulo 65536 は 0 である。
-
lengthDelta を newLength - buffer.[[ArrayBufferByteLength]] とする。
-
lengthDelta < 0、または lengthDelta modulo 65536 が 0 でない場合、
-
RangeError例外を throw する。
-
-
delta を lengthDelta ÷ 65536 とする。
-
memaddr に関連付けられた メモリバッファを拡張する を delta だけ行う。
-
-
-
handled を返す。
-
-
それ以外の場合、
unhandled を返す。
Memory の buffer 属性の getter は、
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 を descriptor["address"] とする; そうでなければ、 addrtype を "i32" とする。
-
initial を ? AddressValueToU64(descriptor["initial"], addrtype) とする。
-
descriptor["maximum"] が 存在する 場合、 maximum を ? AddressValueToU64(descriptor["maximum"], addrtype) とする; そうでなければ、maximum を empty とする。
-
type を table type addrtype { min initial, max maximum } elementtype とする。
-
type が 妥当 でない場合、
RangeError例外を throw する。 -
value が欠けている場合、
-
ref を DefaultValue(elementtype) とする。
-
Assert: ref は error ではない。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementtype) とする。
-
-
store を、surrounding agent の associated store とする。
-
(store, tableaddr) を table_alloc(store, type, ref) とする。割り当てに失敗した場合、
RangeError例外を throw する。 -
surrounding agent の associated store を store に設定する。
-
tableaddr から this を 初期化 する。
grow(delta, value) メソッドは、呼び出されると、
次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を、surrounding agent の associated 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例外を throw する。注: 上記の例外は、 メモリ不足または無効なサイズパラメーターのいずれかにより発生し得る。
-
surrounding agent の associated store を result に設定する。
-
U64ToAddressValue(initialSize, addrtype) を返す。
Table の length 属性の getter は、呼び出されると、
次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を、surrounding agent の associated store とする。
-
addrtype を、address type in table_type(store, tableaddr) とする。
-
length64 を table_size(store, tableaddr) とする。
-
U64ToAddressValue(length64, addrtype) を返す。
get(index) メソッドは、呼び出されると、次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を、surrounding agent の associated store とする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
elementtype が matches exnref の場合、
-
TypeError例外を throw する。
-
-
index64 を ? AddressValueToU64(index, addrtype) とする。
-
result を table_read(store, tableaddr, index64) とする。
-
result が error なら、
RangeError例外を throw する。
set(index, value) メソッドは、呼び出されると、
次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を、surrounding agent の associated store とする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
elementtype が matches exnref の場合、
-
TypeError例外を throw する。
-
-
index64 を ? AddressValueToU64(index, addrtype) とする。
-
value が欠けている場合、
-
ref を DefaultValue(elementtype) とする。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementtype) とする。
-
-
store を table_write(store, tableaddr, index64, ref) とする。
-
store が error なら、
RangeError例外を throw する。 -
surrounding agent の associated store を 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 が matches v128 または exnref の場合、
-
TypeError例外を throw する。
-
-
v が欠けている場合、
-
value を DefaultValue(valuetype) とする。
-
Assert: value は error ではない。
-
-
それ以外の場合、
-
value を ? ToWebAssemblyValue(v, valuetype) とする。
-
-
mutable が true の場合、globaltype を var valuetype とする; そうでなければ、 globaltype を const valuetype とする。
-
store を、surrounding agent の associated store とする。
-
(store, globaladdr) を global_alloc(store, globaltype, value) とする。
-
surrounding agent の associated store を store に設定する。
-
globaladdr から this を 初期化 する。
Global
global) は、次の手順を実行する:
-
store を、surrounding agent の associated store とする。
-
globaladdr を global.[[Global]] とする。
-
globaltype を global_type(store, globaladdr) とする。
-
globaltype が mut valuetype の形式であり、 valuetype が matches v128 または exnref の場合、
TypeErrorを throw する。 -
value を global_read(store, globaladdr) とする。
Global の value 属性の getter は、呼び出されると、
次の手順を実行する:
-
GetGlobalValue(this) を返す。
Global の value
属性の setter は、
呼び出されると、次の手順を実行する:
-
store を、surrounding agent の associated store とする。
-
globaladdr を this.[[Global]] とする。
-
mut valuetype を global_type(store, globaladdr) とする。
-
valuetype が matches v128 または exnref の場合、
TypeErrorを throw する。 -
value を ? ToWebAssemblyValue(the given value, valuetype) とする。
-
store を global_write(store, globaladdr, value) とする。
-
store が error なら、
RangeError例外を throw する。 -
surrounding agent の associated store を store に設定する。
valueOf() メソッドは、呼び出されると、次の手順を実行する:
-
GetGlobalValue(this) を返す。
5.6. エクスポートされた関数
WebAssembly 関数は、JavaScript では Exported Function として利用可能になる。 Exported Functions は、コンストラクターではない 組み込み関数オブジェクト であり、 [[FunctionAddress]] 内部スロットを持つ。 このスロットは、関数アドレス を保持し、周囲の agent の 関連付けられた store に相対的である。
-
store を 周囲の agent の 関連付けられた store とする。
-
funcinst を store.funcs[funcaddr] とする。
-
funcinst が {type functype, hostcode hostfunc} の形式である場合、
-
Assert: hostfunc は JavaScript オブジェクトであり、IsCallable(hostfunc) は true である。
-
index を、ホスト関数 funcaddr の ホスト関数インデックス とする。
-
-
それ以外の場合、
-
moduleinst を funcinst.module とする。
-
Assert: funcaddr は moduleinst.funcaddrs に含まれている。
-
index を、funcaddr が見つかる moduleinst.funcaddrs のインデックスとする。
-
-
map を 周囲の agent の関連する Exported Function cache とする。
-
map[funcaddr] が 存在する 場合、
-
map[funcaddr] を返す。
-
-
steps を「"Exported Function を呼び出す funcaddr with arguments."」とする。
-
realm を 現在の Realm とする。
-
store を 周囲の agent の 関連付けられた store とする。
-
functype を func_type(store, funcaddr) とする。
-
[paramTypes] → [resultTypes] を functype とする。
-
arity を paramTypes の size とする。
-
name を、funcaddr に対応する WebAssembly 関数の名前 とする。
-
function を ! CreateBuiltinFunction(steps, arity, name, « [[FunctionAddress]] », realm) とする。
-
function.[[FunctionAddress]] を funcaddr に設定する。
-
Set map[funcaddr] を function に設定する。
-
function を返す。
-
store を 周囲の agent の 関連付けられた store とする。
-
functype を func_type(store, funcaddr) とする。
-
[parameters] → [results] を functype とする。
-
parameters または results のいずれかの型が matches v128 または exnref である場合、
TypeErrorを throw する。注: 上記のエラーは、 [[Call]] メソッドが呼び出されるたびに throw される。
-
args を « » とする。
-
i を 0 とする。
-
各 t について parameters の、
-
argValues の size > i なら、arg を argValues[i] とする。
-
それ以外の場合、arg を undefined とする。
-
Append ? ToWebAssemblyValue(arg, t) を args に追加する。
-
i を i + 1 に設定する。
-
-
(store, ret) を func_invoke(store, funcaddr, args) の結果とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
ret が error なら、例外を throw する。この例外は、 特に WebAssembly エラー対応付け に別段の記載がない限り、 WebAssembly の
RuntimeError例外であるべきである。 -
ret が exception exnaddr である場合、
-
tagaddr を exn_tag(store, exnaddr) とする。
-
payload を exn_read(store, exnaddr) とする。
-
jsTagAddr を、JavaScript 例外タグを取得する 結果とする。
-
tagaddr が jsTagAddr と等しい場合、
-
それ以外の場合、
-
exception を、exnaddr から作成された 新しい Exception とする。
-
exception を throw する。
-
-
-
outArity を ret の size とする。
-
outArity が 0 なら、undefined を返す。
-
それ以外の場合、
-
values を « » とする。
-
各 r について ret の、
-
CreateArrayFromList(values) を返す。
-
注: Exported Function の呼び出し は、 組み込み関数オブジェクト の定義に従い、 呼び出される側の Exported Function の [[Realm]] で実行される。
注: Exported Functions は [[Construct]]
メソッドを持たないため、new 演算子で呼び出すことはできない。
-
[parameters] → [results] を functype とする。
-
parameters または results のいずれかの型が matches v128 または exnref である場合、
TypeErrorを throw する。 -
jsArguments を « » とする。
-
各 arg について arguments の、
-
resultsSize を results の size とする。
-
resultsSize が 0 なら、« » を返す。
-
それ以外で、resultsSize が 1 なら、« ? ToWebAssemblyValue(ret, results[0]) » を返す。
-
それ以外の場合、
-
method を ? GetMethod(ret,
%Symbol.iterator%) とする。 -
values を ? IteratorToList(? GetIteratorFromMethod(ret, method)) とする。
-
wasmValues を新しい空の リスト とする。
-
values の各 value と results の各 resultType を線形に対応付けて、
-
Append ? ToWebAssemblyValue(value, resultType) を wasmValues に追加する。
-
-
wasmValues を返す。
-
-
Assert: IsCallable(func)。
-
stored settings を 現在の設定オブジェクト とする。
-
hostfunc を、引数 arguments で呼び出されたときに 次の手順を実行する ホスト関数 とする:
-
realm を func の 関連付けられた Realm とする。
-
relevant settings を realm の settings object とする。
-
Prepare to run script with relevant settings.
-
Prepare to run a callback with stored settings.
-
result を、func、functype、および arguments から ホスト関数を実行する 結果とする。
-
Clean up after running a callback with stored settings.
-
Clean up after running script with relevant settings.
-
Assert: result.[[Type]] は
throw またはnormal である。 -
store を 周囲の agent の 関連付けられた store とする。
-
result.[[Type]] が
throw の場合、:-
v を result.[[Value]] とする。
-
v が implements
Exceptionの場合、-
address を v.[[Address]] とする。
-
-
それ以外の場合、
-
type を、JavaScript 例外タグを取得する 結果とする。
-
payload を ! ToWebAssemblyValue(v, externref) とする。
-
(store, address) を exn_alloc(store, type, « payload ») とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
-
-
それ以外の場合、result.[[Value]] を返す。
-
-
store を 周囲の agent の 関連付けられた store とする。
-
(store, funcaddr) を func_alloc(store, functype, hostfunc) とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
funcaddr を返す。
-
Assert: w は v128.const v128 の形式ではない。
-
Assert: w は ref.exn exnaddr の形式ではない。
-
w が i64.const u64 の形式である場合、
-
w が i32.const u32 の形式である場合、
-
w が f32.const f32 の形式である場合、
-
w が f64.const f64 の形式である場合、
-
w が ref.null t の形式である場合、null を返す。
-
w が ref.i31 u31 の形式である場合、
-
w が ref.struct structaddr の形式である場合、新しい Exported GC Object を structaddr と "struct" から作成した結果を返す。
-
w が ref.array arrayaddr の形式である場合、新しい Exported GC Object を arrayaddr と "array" から作成した結果を返す。
-
w が ref.func funcaddr の形式である場合、新しい Exported Function を funcaddr から作成した結果を返す。
-
w が ref.host hostaddr の形式である場合、ホスト値を取得する を hostaddr から行った結果を返す。
-
w が ref.extern ref の形式である場合、ToJSValue(ref) を返す。
注: NaN に等しい Number 値は、 観測可能なさまざまな NaN ペイロードを持ち得る; 詳細は NumericToRawBytes を参照。
ホスト値を取得する ために、ホストアドレス hostaddr から、次の手順を実行する:
-
map を 周囲の agent の関連する host value cache とする。
-
Assert: map[hostaddr] は 存在する。
-
map[hostaddr] を返す。
-
Assert: 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 heaptype とする。
-
-
Else if match_valtype(type, ref null extern) の場合、
-
ref を ! ToWebAssemblyValue(v, ref any) とする。
-
r を ref.extern ref とする。
-
-
Else if v が Exported Function であり、かつ match_valtype(type, ref null func) の場合、
-
funcaddr を v の [[FunctionAddress]] 内部スロットの値とする。
-
r を ref.func funcaddr とする。
-
-
Else if v が Number であり、 v が ? ToInt32(v) と等しく、かつ ℝ(v) < 230 かつ ℝ(v) ⩾ -230 の場合、
-
Else if v が Exported GC Object の場合、
-
objectaddr を v の [[ObjectAddress]] 内部スロットの値とする。
-
objectkind を v の [[ObjectKind]] 内部スロットの値とする。
-
objectkind が "array" の場合、
-
r を ref.array objectaddr とする。
-
-
Else if objectkind が "struct" の場合、
-
r を ref.struct objectaddr とする。
-
-
-
Else,
-
map を 周囲の agent の関連する host value cache とする。
-
map[hostaddr] が v と同一であるような host address hostaddr が存在する場合、
-
ref.host hostaddr を返す。
-
-
map[hostaddr] exists が false であるような最小の host address hostaddr をとる。
-
Set map[hostaddr] を v に設定する。
-
r を ref.host hostaddr とする。
-
-
store を 周囲の agent の 関連付けられた store とする。
-
actualtype を ref_type(store, r) とする。
-
match_valtype(actualtype, type) が false の場合、
-
TypeErrorを throw する。
-
-
r を返す。
-
-
Assert: この段階には到達しない。
AddressType
"i32" に対しては [EnforceRange] unsigned
long のように振る舞うよう設計されており、
さらにその意味論を AddressType
"i64" に拡張する。次の手順を実行する:
-
addrtype が "i32" の場合、
-
n を ? ConvertToInt(v, 32, "unsigned") とする。ここで、宛先型は [EnforceRange] に関連付けられている。
注: これは、JS conversion rules for [EnforceRange] unsigned long と等価である。
-
-
addrtype が "i64" の場合、
-
Assert: この段階には到達しない。
AddressValue
に変換する。これは AddressType
に対するものであり、次の手順を実行する:
5.7. タグ
5.7.1. タグ型
dictionary {TagType required sequence <ValueType >; }; [parameters LegacyNamespace =WebAssembly ,Exposed =(Window ,Worker ,Worklet )]interface {Tag constructor (TagType ); };type
Tag 値は
例外タグを表す。
Tag オブジェクトを初期化する ために、タグアドレス tagAddress から tag を初期化するには、 次の手順を実行する:
-
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 の、
-
Append ToValueType(paramType) を wasmParameters に追加する。
-
-
store を 周囲の agent の 関連付けられた store とする。
-
(store, tagAddress) を tag_alloc(store, wasmParameters → « ») とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
Initialize 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 する。
-
keys を新しい空の list とする。
-
keys を返す。
-
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 =(Window ,Worker ,Worklet )]interface {Exception constructor (Tag ,exceptionTag sequence <any >,payload optional ExceptionOptions = {});options any getArg (Tag , [exceptionTag EnforceRange ]unsigned long );index boolean is (Tag );exceptionTag readonly attribute (DOMString or undefined )stack ; };
Exception
値は例外を表す。
Exception オブジェクトを初期化する ために、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を throw する。
-
-
store を 周囲の agent の 関連付けられた store とする。
-
[types] → [] を tag_type(store, exceptionTag.[[Address]]) とする。
-
types の size が payload の size と等しくない場合、
-
TypeErrorを throw する。
-
-
wasmPayload を « » とする。
-
各 value と resultType について、 payload と types を線形に対応付けて、
-
(store, exceptionAddr) を exn_alloc(store, exceptionTag.[[Address]], wasmPayload) とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
Initialize this を exceptionAddr から行う。
-
options["traceStack"] が true の場合、
-
this.[[Stack]] を、現在のコールスタックの
DOMString表現または undefined のいずれかに設定する。
-
getArg(exceptionTag, index)
メソッドの手順は次のとおり:
-
store を 周囲の agent の 関連付けられた store とする。
-
this.[[Type]] が exceptionTag.[[Address]] と等しくない場合、
-
TypeErrorを throw する。
-
-
tagaddr を exn_tag(store, this.[[Address]]) とする。
-
payload を exn_read(store, this.[[Address]]) とする。
-
Assert: tagaddr は this.[[Type]] と等しい。
-
index ≥ payload の size の場合、
-
RangeErrorを throw する。
-
-
[types] → [] を tag_type(store, tagaddr) とする。
-
types[index] が matches v128 または exnref の場合、
-
TypeErrorを throw する。
-
is(exceptionTag) メソッドの手順は次のとおり:
-
this.[[Type]] が exceptionTag.[[Address]] と等しくない場合、
-
false を返す。
-
-
true を返す。
stack getter の手順は次のとおり:
-
this.[[Stack]] を返す。
5.9.1. JavaScript 例外
JavaScript 例外タグ は、 タグアドレス であり、 周囲の agent に関連付けられている。これは agent の 関連付けられた store において 初回使用時に割り当てられ、キャッシュされる。常に tag type « externref » → « » を持つ。
JavaScript 例外タグを取得する には、次の手順を実行する:
-
周囲の agent に関連付けられた JavaScript exception tag が初期化済みである場合、
-
周囲の agent に関連付けられた JavaScript exception tag を返す
-
-
store を 周囲の agent の 関連付けられた store とする。
-
(store, tagAddress) を tag_alloc(store, « externref » → « ») とする。
-
周囲の agent の 関連付けられた store を store に設定する。
-
周囲の agent に関連付けられた JavaScript exception tag を 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) とする。
-
各 (name, funcType, steps) について builtins の、
-
funcaddr を ビルトイン関数を作成する funcType と steps を用いた結果とする。
-
func を、funcaddr から 新しい Exported Function を作成する結果とする。
-
value を func とする。
-
status を ! CreateDataProperty(exportsObject, name, value) とする。
-
Assert: status は true である。
-
-
exportsObject を返す。
ビルトインに対するインポートを検証する ために、import、 有効化されたビルトイン builtinSetNames を用いて、次の手順を実行する:
-
Assert: ビルトイン集合名を検証する 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) 抽象操作は、呼び出されると、 次の手順を実行する:
-
Assert: v は i32 型である。
-
! Call(String.fromCharCode, undefined, « ToJSValue(v) ») を返す。
CharCodeAt(string, index) 抽象 操作は、呼び出されると、次の手順を実行する:
-
Assert: 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例外を、あたかも trap が実行されたかのように throw する。
-
-
second が null ではなく、かつ second が String ではない 場合、
-
RuntimeError例外を、あたかも trap が実行されたかのように throw する。
-
-
! 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 以来、複数の拡張提案が統合されてきた。 以下の節では、何が変更されたかの概要を示す。