1. 導入
設計上、WebAssemblyコア仕様scope [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 ストアと JavaScript の相互作用
注:WebAssemblyのセマンティクスはWebAssembly抽象マシンの状態を表す抽象的なストアで定義されています。 WebAssemblyの操作はストアを受け取り、更新されたストアを返します。
各エージェントには関連付けられたストアが存在します。新しいエージェントが作成されると、その関連ストアはstore_init()の結果に設定されます。
注:本仕様では、WebAssembly関連のオブジェクト・メモリ・アドレスはエージェントクラスタagent cluster間で共有されません。将来のWebAssemblyバージョンではこの点が変わる可能性があります。
WebAssemblyストアの要素はJavaScript値と紐付けられる場合があります。特に、対応するMemoryオブジェクトを持つ各WebAssemblyのmemory instanceは、JavaScriptのData Blockと対応します;このデータブロックの修正はエージェントのストアもそれに応じて更新されたものとみなされ、その逆も同様です。
4.2. WebAssembly JSオブジェクトキャッシュ
注:いくつかのWebAssemblyオブジェクトには対応するJavaScriptオブジェクトが存在する可能性があります。この対応関係は、各エージェントごとにWebAssemblyアドレスからJavaScriptオブジェクトへのマッピングとして保持されます。 このマッピングは、あるエージェントについて、特定のWebAssemblyアドレスにつき最大1つのJavaScriptオブジェクトしか対応しないことを保証するためのものです。ただし、共有オブジェクトにはこの性質は適用されません。
各エージェントには以下の順序付きマップが関連付けられています:
-
エクスポートGCオブジェクトキャッシュ:structアドレスやarrayアドレスからエクスポートGCオブジェクトへのマッピング。
-
ホスト値キャッシュ:ホストアドレスから値へのマッピング。
5. WebAssembly名前空間
dictionary {WebAssemblyInstantiatedSource required Module ;module required Instance ; };instance dictionary {WebAssemblyCompileOptions USVString ?;importedStringConstants sequence <USVString >; }; [Exposed=*]builtins namespace {WebAssembly boolean validate (BufferSource ,bytes optional WebAssemblyCompileOptions = {});options Promise <Module >compile (BufferSource ,bytes optional WebAssemblyCompileOptions = {});options Promise <WebAssemblyInstantiatedSource >instantiate (BufferSource ,bytes optional object ,importObject optional WebAssemblyCompileOptions = {});options Promise <Instance >instantiate (Module ,moduleObject optional object );importObject readonly attribute Tag JSTag ; };
-
moduleをmodule_decode(bytes)とする。module がエラーなら、エラーを返す。
-
module_validate(module) がエラーであればエラーを返す。
-
moduleを返す。
WebAssemblyモジュールのビルトイン・インポート文字列を検証する ために、module module、有効なビルトインbuiltinSetNames、importedStringModuleを用いて次の手順を実行する:
-
ビルトインセット名の検証に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の検証をimportとbuiltinSetNamesで試み、falseならfalseを返す。
-
-
-
trueを返す。
validate(bytes, options) メソッドは、
呼び出されると次の手順を実行する:
-
stableBytes を、buffer が保持するバイト列のコピー 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]] : 任意の文字列定数をインポートできる、オプションのモジュール指定子文字列。
-
moduleObject を新しい
Moduleオブジェクトとする。 -
moduleObject.[[Module]] に module を設定する。
-
moduleObject.[[Bytes]] に bytes を設定する。
-
moduleObject.[[BuiltinSets]] に builtinSetNames を設定する。
-
moduleObject.[[ImportedStringModule]] に importedStringModule を設定する。
-
moduleObject を返す。
WebAssemblyCompileOptions
options を用い、オプションの task
source taskSource を使って、次の手順を実行する:
-
promise を 新しい promise とする。
-
次の手順を並行して実行する:
-
WebAssembly モジュールをコンパイルして bytes から結果を得て、module とする。
-
タスクをキューに入れる。taskSource が与えられている場合は、 そのタスクソース上にキューする。
-
module が error なら、promise を
CompileError例外で reject する。 -
builtinSetNames を options["builtins"] とする。
-
importedStringModule を options["importedStringConstants"] とする。
-
ビルトインおよびインポート文字列の検証を module、builtinSetNames、importedStringModule で行い、 結果が false なら promise を
CompileError例外で reject する。 -
それ以外の場合、
-
WebAssembly モジュールオブジェクトを構築し、 module、bytes、builtinSetNames、 importedStringModule から結果を moduleObject とする。
-
Resolve により promise を moduleObject で解決する。
-
-
-
-
promise を返す。
compile(bytes, options) メソッドは、
呼び出されると次の手順を実行する:
-
stableBytes を、buffer が保持するバイト列のコピー bytes とする。
-
WebAssembly モジュールを非同期にコンパイルし、 stableBytes と options を用いてその結果を返す。
インポートされた文字列をインスタンス化するために、モジュール module と importedStringModule を用いて次の手順を実行する:
-
表明:importedStringModule は null ではない。
-
exportsObject を ! OrdinaryObjectCreate(null) とする。
-
各 (moduleName, componentName, externtype) について、module_imports(module) を繰り返す。
-
moduleName が importedStringModule と等しくなければ、continue する。
-
stringConstant を componentName とする。
-
status を ! CreateDataProperty(exportsObject, stringConstant, stringConstant) とする。
-
表明:status は true である。
-
-
exportsObject を返す。
-
module.imports が 空でない かつ importObject が undefined なら、
TypeError例外を投げる。 -
builtinOrStringImports を順序付きマップ « » とする。
-
各 builtinSetName について、 builtinSetNames を繰り返す。
-
表明:builtinOrStringImports は builtinSetName を含まない。
-
builtinSetName がビルトインセットを指さない場合、continue する。
-
exportsObject を、ビルトインセットをインスタンス化する ことで得られた結果とする(引数は builtinSetName)。
-
builtinSetQualifiedName を "wasm:" で前置した builtinSetName とする。
-
Set により builtinOrStringImports[builtinSetQualifiedName] に exportsObject を設定する。
-
-
importedStringModule が null でないなら、
-
exportsObject を、インポートされた文字列をインスタンス化することで module と importedStringModule から得られた結果とする。
-
Set により builtinOrStringImports[importedStringModule] に exportsObject を設定する。
-
-
imports を « » とする。
-
各 (moduleName, componentName, externtype) について、module_imports(module) を繰り返す。
-
builtinOrStringImports が contains moduleName である場合、
-
o を builtinOrStringImports[moduleName] とする。
-
o が Object でない、または o が componentName を含まない 場合、
-
-
それ以外の場合、
-
o が Object でないなら、
TypeError例外を投げる。 -
externtype が func functype の形式なら、
-
IsCallable(v) が false なら、
LinkError例外を投げる。 -
v が [[FunctionAddress]] 内部スロットを持ち、したがって Exported Function である場合、
-
funcaddr を v の [[FunctionAddress]] 内部スロットの値とする。
-
-
それ以外の場合、
-
ホスト関数を作成し、 v と functype から結果を funcaddr とする。
-
index を imports 内の外部関数の個数とする。 この値 index は funcaddr の ホスト関数のインデックス として知られる。
-
-
externfunc を external value の func funcaddr とする。
-
Append により externfunc を imports に追加する。
-
-
externtype が global mut valtype の形式なら、
-
v が implements
Globalである場合、-
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 を surrounding agent の associated store とする。
-
(store, globaladdr) を global_alloc(store、 const valtype、 value) とする。
-
surrounding agent の associated store を store に設定する。
-
-
externglobal を global globaladdr とする。
-
Append により externglobal を imports に追加する。
-
-
externtype が mem memtype の形式なら、
-
externtype が table tabletype の形式なら、
-
externtype が tag attribute functype の形式なら、
-
-
imports を返す。
注: このアルゴリズムは、正しい種類の JavaScript 値が渡されているかのみを検証する。 WebAssembly の型要件の検証は 「instantiate the core of a WebAssembly module」アルゴリズムに委ねられる。
-
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 を、新しい Exported Function を funcaddr から作成した結果とする。
-
value を func とする。
-
-
externtype が global mut globaltype の形式なら、
-
表明:externval は global globaladdr の形式である。
-
global globaladdr を externval とする。
-
global を 新しい Global オブジェクト(globaladdr から作成)とする。
-
value を global とする。
-
-
externtype が mem memtype の形式なら、
-
表明:externval は mem memaddr の形式である。
-
mem memaddr を externval とする。
-
memory を 新しい Memory オブジェクト(memaddr から作成)とする。
-
value を memory とする。
-
-
externtype が table tabletype の形式なら、
-
表明:externval は table tableaddr の形式である。
-
table tableaddr を externval とする。
-
table を 新しい Table オブジェクト(tableaddr から作成)とする。
-
value を table とする。
-
-
externtype が tag attribute functype の形式なら、
-
表明:attribute は exception である。
-
表明:externval は tag tagaddr の形式である。
-
tag tagaddr を externval とする。
-
tag を 新しい Tag オブジェクト(tagaddr から作成)とする。
-
value を tag とする。
-
-
status を ! CreateDataProperty(exportsObject, name, value) とする。
-
表明:status は true である。
注: WebAssembly モジュールの検証で行われる妥当性と一意性の検査により、 各プロパティ名は妥当であり、同じプロパティが二重に定義されないことが保証される。
-
-
! SetIntegrityLevel(exportsObject,
"frozen") を実行する。 -
exportsObject を返す。
-
エクスポートオブジェクトを作成し、 module と instance から結果を exportsObject とする。
-
instanceObject.[[Instance]] に instance を設定する。
-
instanceObject.[[Exports]] に exportsObject を設定する。
-
store を surrounding agent の associated store とする。
-
result を module_instantiate(store、 module、imports) とする。
-
result が error なら、適切な例外型を投げる:
-
リンク時に発生するほとんどの場合には、
LinkError例外。 -
start 関数の実行中に発生したエラーであれば、WebAssembly からの多くのエラーには
RuntimeError、 もしくは内側の ECMAScript コードから伝播したエラーオブジェクト。 -
必要に応じて別のエラー型(例:メモリ不足例外)。詳細は WebAssembly のエラー対応表を参照。
-
-
(store, instance) を result とする。
-
surrounding agent の associated store を store に設定する。
-
instance を返す。
Module
moduleObject とインポート importObject から、次の手順を実行する:
-
promise を 新しい promise とする。
-
module を moduleObject.[[Module]] とする。
-
builtinSetNames を moduleObject.[[BuiltinSets]] とする。
-
importedStringModule を moduleObject.[[ImportedStringModule]] とする。
-
インポートを読み取る を実行し、 module、importObject、builtinSetNames、importedStringModule を用いて 結果を imports とする。 この操作が例外を投げた場合は、捕捉して reject により promise をその例外で拒否し、promise を返す。
-
次の手順を並行して実行する:
-
タスクをキューに入れる: 注:ここで実装依存の処理が行われることがある。
-
WebAssembly モジュールのコアをインスタンス化し、 module と imports を用いて結果を instance とする。 これが例外を投げた場合は捕捉し、reject により promise をその例外で拒否し、 これ以降のサブステップを終了する。
-
初期化により instanceObject を module と instance から初期化する。 これが例外を投げた場合は捕捉し、reject により promise をその例外で拒否し、 これ以降のサブステップを終了する。
-
Resolve により promise を instanceObject で解決する。
-
-
-
promise を返す。
-
promise を 新しい promise とする。
-
React により promiseOfModule に反応する:
-
promiseOfModule が値 module で fulfilled された場合:
-
WebAssembly モジュールをインスタンス化し、 module に importObject をインポートして結果を innerPromise とする。
-
React により innerPromise に反応する:
-
innerPromise が値 instance で fulfilled された場合、
-
result を
WebAssemblyInstantiatedSource値 «[ "module" → module、"instance" → instance ]» とする。 -
Resolve により promise を result で解決する。
-
-
innerPromise が理由 reason で rejected された場合:
-
Reject により promise を reason で拒否する。
-
-
-
-
promiseOfModule が理由 reason で rejected された場合:
-
Reject により promise を reason で拒否する。
-
-
-
promise を返す。
instantiate(bytes, importObject, options)
メソッドは、呼び出されると次の手順を実行する:
-
stableBytes を、buffer が保持するバイト列のコピー bytes とする。
-
WebAssembly モジュールを非同期にコンパイルし、 stableBytes と options を用いて結果を promiseOfModule とする。
-
インスタンス化により promiseOfModule を importObject をインポートして実行し、その結果を返す。
instantiate(moduleObject, importObject)
メソッドは、呼び出されると次の手順を実行する:
-
WebAssembly モジュールを非同期にインスタンス化し、 moduleObject に importObject をインポートして結果を返す。
注: 追補のストリーミング API は WebAssembly Web API に記載されている。
JSTag 属性の getter(WebAssembly
名前空間のもの)は、呼び出されると次の手順を実行する:
-
JSTagAddr を、JavaScript 例外タグを取得した結果とする。
-
JSTagObject を、Tag オブジェクトを作成し JSTagAddr から得た結果とする。
-
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 (BufferSource ,bytes optional WebAssemblyCompileOptions = {});options static sequence <ModuleExportDescriptor >exports (Module );moduleObject static sequence <ModuleImportDescriptor >imports (Module );moduleObject static sequence <ArrayBuffer >customSections (Module ,moduleObject DOMString ); };sectionName
exports(moduleObject) メソッドは、呼び出されると次の手順を実行する。
imports(moduleObject) メソッドは、呼び出されると次の手順を実行する。
-
module を moduleObject.[[Module]] とする。
-
builtinSetNames を moduleObject.[[BuiltinSets]] とする。
-
importedStringModule を moduleObject.[[ImportedStringModule]] とする。
-
imports を « » とする。
-
各 (moduleName, name, type) について、module_imports(module) を繰り返す。
-
imports を返す。
customSections(moduleObject, sectionName)
メソッドは、呼び出されると次の手順を実行する。
-
bytes を moduleObject.[[Bytes]] とする。
-
customSections を « » とする。
-
各 カスタムセクション customSection を、 モジュール文法に従って解釈した bytes から取り出して処理する。
-
name を customSection の
nameを UTF-8 デコードした値とする。 -
表明:name は失敗ではない (moduleObject.[[Module]] は valid である)。
-
name が文字列値として sectionName に等しい場合、
-
この customsec 生成規則に一致する範囲の bytes のコピーを格納した 新しい
ArrayBufferを Append により customSections に追加する。
-
-
-
customSections を返す。
Module(bytes, options)
コンストラクターは、呼び出されると次の手順を実行する。
-
stableBytes を、buffer が保持するバイト列のコピー bytes とする。
-
WebAssembly モジュールをコンパイルして stableBytes から結果を得て、module とする。
-
module が error なら、
CompileError例外を投げる。 -
builtinSetNames を options["builtins"] とする。
-
importedStringModule を options["importedStringConstants"] とする。
-
ビルトインおよびインポート文字列の検証を module、builtinSetNames、importedStringModule で行い、false を返す場合は
CompileError例外を投げる。 -
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(module, importObject)
コンストラクターは、呼び出されると次の手順を実行する。
-
module を module.[[Module]] とする。
-
builtinSetNames を module.[[BuiltinSets]] とする。
-
importedStringModule を module.[[ImportedStringModule]] とする。
-
インポートを読み取る を実行し、 module に対し importObject、builtinSetNames、importedStringModule を用いて 結果を imports とする。
-
WebAssembly モジュールのコアをインスタンス化する を実行し、 module と imports から結果を instance とする。
-
初期化 により、this を module と instance から初期化する。
注: 一部の実装ではインスタンス化時に長時間のコンパイル処理を行うことがあるため、 この同期 API の使用は推奨されない。
exports 属性の getter は、
Instance の
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 ; };
Memory オブジェクトは、複数の
Instance
オブジェクトから同時に参照可能な
単一の メモリインスタンス を表す。
各 Memory
オブジェクトは次の内部スロットを持つ。
-
[[Memory]] : メモリアドレス
-
[[BufferObject]] : データブロックが上記のメモリアドレスと同定されている
ArrayBuffer
-
buffer を、新しい
ArrayBufferとし、 内部スロット [[ArrayBufferData]]、[[ArrayBufferByteLength]]、[[ArrayBufferDetachKey]] を持つものとする。 -
buffer.[[ArrayBufferData]] に block を設定する。
-
buffer.[[ArrayBufferByteLength]] に block の長さを設定する。
-
buffer.[[ArrayBufferDetachKey]] に "WebAssembly.Memory" を設定する。
-
buffer を返す。
-
length を block の長さとする。
-
buffer を、新しい
ArrayBufferとし、 内部スロット [[ArrayBufferData]]、[[ArrayBufferByteLength]]、[[ArrayBufferMaxByteLength]]、[[ArrayBufferDetachKey]] を持つものとする。 -
buffer.[[ArrayBufferData]] に block を設定する。
-
buffer.[[ArrayBufferByteLength]] に length を設定する。
-
buffer.[[ArrayBufferMaxByteLength]] は maxsize とする。
-
buffer.[[ArrayBufferDetachKey]] に "WebAssembly.Memory" を設定する。
-
buffer を返す。
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
表明:map[memaddr] は 存在しない。
-
buffer を、固定長メモリバッファの作成 を memaddr に対して実行した結果とする。
-
memory.[[Memory]] に memaddr を設定する。
-
memory.[[BufferObject]] に buffer を設定する。
-
Set により map[memaddr] に memory を設定する。
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
もし map[memaddr] が 存在する ならば、
-
map[memaddr] を返す。
-
-
初期化 により memory を memaddr から初期化する。
-
memory を返す。
Memory(descriptor) コンストラクターは、呼び出されると次の手順を実行する。
-
もし descriptor["address"] が 存在する なら addrtype を descriptor["address"] とし、そうでなければ addrtype を "i32" とする。
-
initial を、? AddressValueToU64(descriptor["initial"], addrtype) の結果とする。
-
もし descriptor["maximum"] が 存在する なら maximum を ? AddressValueToU64(descriptor["maximum"], addrtype) の結果とし、そうでなければ maximum を空とする。
-
memtype を メモリ型 addrtype { min initial, max maximum } とする。
-
memtype が valid でなければ、
RangeError例外を投げる。 -
store を、surrounding agent の associated store とする。
-
(store, memaddr) を mem_alloc(store, memtype) とする。 もし割り当てに失敗したら、
RangeError例外を投げる。 -
surrounding agent の associated store を store に設定する。
-
初期化 により this を memaddr から初期化する。
-
map を、surrounding agent に関連付けられた Memory object cache とする。
-
表明:map[memaddr] は 存在する。
-
memory を map[memaddr] とする。
-
buffer を memory.[[BufferObject]] とする。
-
もし IsFixedLengthArrayBuffer(buffer) が true なら、
-
! DetachArrayBuffer(buffer,"WebAssembly.Memory") を実行する。
-
buffer を、固定長メモリバッファの作成 を memaddr に対して実行した結果とする。
-
memory.[[BufferObject]] に buffer を設定する。
-
-
それ以外の場合、
-
store を、surrounding agent の associated store とする。
-
ret を、mem_size(store, memaddr) とする。
-
store を、mem_grow(store, memaddr, delta) とする。
-
store が error なら、
RangeError例外を投げる。 -
surrounding agent の associated store を store に設定する。
-
Memory バッファを更新する を memaddr に対して実行する。
-
ret を返す。
grow(delta) メソッドは、呼び出されると次の手順を実行する。
-
memaddr を this.[[Memory]] とする。
-
store を、surrounding agent の associated store とする。
-
delta64 を、? AddressValueToU64(delta, addrtype) の結果とする。
-
ret を、メモリバッファの拡張 を memaddr に対して delta64 分行った結果とする。
-
U64ToAddressValue(ret, addrtype) を返す。
WebAssembly の memory.grow 命令の実行直後に、次の手順を実行する。
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 を返す。
-
表明: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 を、surrounding agent に関連付けられた Memory object cache とする。
-
表明:buffer は map 内のちょうど 1 つの値の [[BufferObject]] である。
-
各 memaddr → mem について map を反復する。
-
もし SameValue(mem.[[BufferObject]], buffer) が true なら、
-
表明:buffer.[[ArrayBufferByteLength]] の 65536 による剰余は 0 である。
-
lengthDelta を newLength − buffer.[[ArrayBufferByteLength]] とする。
-
もし lengthDelta < 0 または lengthDelta の 65536 による剰余が 0 でないなら、
-
RangeError例外を投げる。
-
-
delta を lengthDelta ÷ 65536 とする。
-
メモリバッファの拡張 を memaddr に対して delta 分行う。
-
-
-
handled を返す。
-
-
それ以外の場合、
unhandled を返す。
buffer 属性の getter は、
Memory の
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 ; };
Table オブジェクトは、
複数の Instance
オブジェクトから同時に参照可能な
単一の table instance を表す。
各 Table オブジェクトは
[[Table]] という内部スロットを持ち、これは table address である。
-
map を、surrounding agent に関連付けられた Table object cache とする。
-
表明:map[tableaddr] は 存在しない。
-
table.[[Table]] に tableaddr を設定する。
-
Set により map[tableaddr] を table に設定する。
-
map を、surrounding agent に関連付けられた Table object cache とする。
-
もし map[tableaddr] が 存在する なら、
-
map[tableaddr] を返す。
-
-
初期化 により table を tableaddr から初期化する。
-
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 を空とする。
-
type を、table type addrtype { min initial, max maximum } elementType とする。
-
もし type が valid でなければ、
RangeError例外を投げる。 -
もし value が与えられていなければ、
-
ref を DefaultValue(elementtype) とする。
-
表明:ref は error ではない。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementType) とする。
-
-
store を、surrounding agent の associated store とする。
-
(store, tableaddr) を table_alloc(store, type, ref) とする。割り当てに失敗した場合は、
RangeError例外を投げる。 -
surrounding agent の associated store を store に設定する。
-
初期化 により this を tableaddr から初期化する。
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例外を投げる。注: 上記の例外は、メモリ不足または不正なサイズ引数により発生することがある。
-
surrounding agent の associated store を result に設定する。
-
initialSize を返す。
length 属性の getter は、呼び出されると次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を、surrounding agent の associated store とする。
-
addrtype を、address type における 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例外を投げる。
-
-
index64 を、? AddressValueToU64(index, addrtype) の結果とする。
-
result を table_read(store, tableaddr, index64) とする。
-
もし result が error なら、
RangeError例外を投げる。 -
ToJSValue(result) を返す。
set(index, value) メソッドは、呼び出されると次の手順を実行する:
-
tableaddr を this.[[Table]] とする。
-
store を、surrounding agent の associated store とする。
-
(addrtype, limits, elementtype) を table_type(store, tableaddr) とする。
-
もし elementtype が matches exnref なら、
-
TypeError例外を投げる。
-
-
index64 を、? AddressValueToU64(index, addrtype) の結果とする。
-
もし value が与えられていなければ、
-
ref を DefaultValue(elementtype) とする。
-
-
それ以外の場合、
-
ref を ? ToWebAssemblyValue(value, elementtype) とする。
-
-
store を table_write(store, tableaddr, index64, ref) とする。
-
もし store が error なら、
RangeError例外を投げる。 -
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 ; };
Global オブジェクトは、
複数の Instance
オブジェクトから同時に参照可能な
単一の global instance を表す。
各 Global オブジェクトは
1 つの内部スロットを持つ:
-
[[Global]] : global address
-
map を、surrounding agent に関連付けられた Global object cache とする。
-
表明:map[globaladdr] は 存在しない。
-
global.[[Global]] に globaladdr を設定する。
-
Set により map[globaladdr] を global に設定する。
-
map を、surrounding agent に関連付けられた Global object cache とする。
-
もし map[globaladdr] が 存在する なら、
-
map[globaladdr] を返す。
-
-
初期化 により global を globaladdr から初期化する。
-
global を返す。
-
もし valuetype が externref に等しければ、ToWebAssemblyValue(undefined, valuetype) を返す。
-
val_default(valuetype) を返す。
Global(descriptor, v)
コンストラクターは、呼び出されると次の手順を実行する:
-
mutable を descriptor["mutable"] とする。
-
valuetype を ToValueType(descriptor["value"]) とする。
-
もし valuetype が matches v128 または exnref なら、
-
TypeError例外を投げる。
-
-
もし v が与えられていなければ、
-
value を DefaultValue(valuetype) とする。
-
表明:value は error ではない。
-
-
それ以外の場合、
-
value を ToWebAssemblyValue(v, valuetype) とする。
-
-
もし mutable が true なら globaltype を var valuetype とし、そうでなければ globaltype を const valuetype とする。
-
store を現在のエージェントの associated store とする。
-
(store, globaladdr) を global_alloc(store, globaltype, value) とする。
-
現在のエージェントの associated store を store に設定する。
-
初期化 により this を globaladdr から初期化する。
Global
global) は次の手順を実行する:
-
store を現在のエージェントの associated store とする。
-
globaladdr を global.[[Global]] とする。
-
globaltype を global_type(store, globaladdr) とする。
-
もし globaltype が mut valuetype の形式で、 その valuetype が matches v128 または exnref なら、
TypeErrorを投げる。 -
value を global_read(store, globaladdr) とする。
-
ToJSValue(value) を返す。
value 属性の getter は、呼び出されると次の手順を実行する:
-
GetGlobalValue(this) を返す。
Global の value
属性の setter は、
呼び出されると次の手順を実行する:
-
store を現在のエージェントの associated store とする。
-
globaladdr を this.[[Global]] とする。
-
mut valuetype を global_type(store, globaladdr) とする。
-
value を ToWebAssemblyValue(与えられた値, valuetype) とする。
-
store を global_write(store, globaladdr, value) とする。
-
もし store が error なら、
RangeError例外を投げる。 -
現在のエージェントの associated store を store に設定する。
valueOf() メソッドは、呼び出されると次の手順を実行する:
-
GetGlobalValue(this) を返す。
5.6. エクスポートされた関数
WebAssembly の関数は、JavaScript では Exported Function として利用可能になる。 Exported Function は、組み込み関数オブジェクトでありコンストラクターではなく、[[FunctionAddress]] 内部スロットを持つ。 このスロットは、function address を、surrounding agent の associated store に対して相対的に保持する。
-
store を、surrounding agent の associated store とする。
-
funcinst を store.funcs[funcaddr] とする。
-
funcinst が {type functype, hostcode hostfunc} の形式であるなら、
-
表明:hostfunc は JavaScript オブジェクトであり、IsCallable(hostfunc) は true である。
-
index を、ホスト関数のインデックス funcaddr とする。
-
-
それ以外の場合、
-
moduleinst を funcinst.module とする。
-
表明:funcaddr は moduleinst.funcaddrs に含まれている。
-
index を、moduleinst.funcaddrs 内で funcaddr が見つかる位置のインデックスとする。
-
-
map を、surrounding agent に関連付けられた Exported Function cache とする。
-
もし map[funcaddr] が 存在するなら、
-
map[funcaddr] を返す。
-
-
steps を「引数付きで Exported Function を呼び出す funcaddr」とする。
-
realm を 現在の Realm とする。
-
store を、surrounding agent の associated store とする。
-
functype を func_type(store, funcaddr) とする。
-
[paramTypes] → [resultTypes] を functype とする。
-
arity を paramTypes の大きさとする。
-
name を、WebAssembly 関数の名前 funcaddr とする。
-
function を、! CreateBuiltinFunction(steps, arity, name, « [[FunctionAddress]] », realm) とする。
-
function.[[FunctionAddress]] に funcaddr を設定する。
-
Set により map[funcaddr] に function を設定する。
-
function を返す。
-
store を、surrounding agent の associated store とする。
-
functype を func_type(store, funcaddr) とする。
-
[parameters] → [results] を functype とする。
-
もし parameters または results 内のいずれかの型が matches v128 または exnref なら、
TypeErrorを投げる。注: 上記のエラーは [[Call]] メソッドが呼び出されるたびに投げられる。
-
args を « » とする。
-
i を 0 とする。
-
各 t について、parameters を繰り返す。
-
もし argValues の大きさ > i なら、arg を argValues[i] とする。
-
それ以外なら、arg を undefined とする。
-
Append により ToWebAssemblyValue(arg, t) を args に追加する。
-
i を i + 1 に設定する。
-
-
(store, ret) を、func_invoke(store, funcaddr, args) の結果とする。
-
surrounding agent の associated store を store に設定する。
-
もし ret が error なら、例外を投げる。この例外は、特に指定がない限り WebAssembly のエラー対応表に従って、WebAssembly の
RuntimeErrorであるべきである。 -
もし ret が THROW ref.exn exnaddr なら、
-
tagaddr を exn_tag(store, exnaddr) とする。
-
payload を exn_read(store, exnaddr) とする。
-
jsTagAddr を、JavaScript 例外タグを取得した結果とする。
-
もし tagaddr が jsTagAddr に等しいなら、
-
ホスト値の取得 の結果 payload[0] を投げる。
-
-
それ以外の場合、
-
exception を、新しい Exception(exnaddr から作成)とする。
-
exception を投げる。
-
-
-
outArity を ret の大きさとする。
-
もし outArity が 0 なら、undefined を返す。
-
それ以外で outArity が 1 なら、ToJSValue(ret[0]) を返す。
-
それ以外の場合、
-
values を « » とする。
-
各 r について、ret を繰り返す。
-
CreateArrayFromList(values) を返す。
-
注: Exported Function の呼び出しは、組み込み関数オブジェクトの定義に従い、呼び出し先 Exported Function の [[Realm]] で実行される。
注: Exported Function は [[Construct]]
メソッドを持たないため、new 演算子で呼び出すことはできない。
-
[parameters] → [results] を functype とする。
-
もし parameters または results 内のいずれかの型が matches v128 または exnref なら、
TypeErrorを投げる。 -
jsArguments を « » とする。
-
各 arg について、arguments を繰り返す。
-
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 を同順で対応付けて反復し、
-
Append により 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 を、surrounding agent の associated 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 ») とする。
-
surrounding agent の associated store を store に設定する。
-
-
-
それ以外の場合、result.[[Value]] を返す。
-
-
(store, funcaddr) を func_alloc(store, functype, hostfunc) とする。
-
surrounding agent の associated store を 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 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 と等しい数値は、観測可能な NaN ペイロードがさまざまであり得る。詳細は NumericToRawBytes を参照。
host address hostaddr から ホスト値を取得するには、次の手順を実行する:
-
map を、surrounding agent に関連付けられた host value cache とする。
-
表明:map[hostaddr] は 存在する。
-
map[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 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 とする。
-
-
もし objectkind が "struct" なら、
-
r を ref.struct objectaddr とする。
-
-
-
Else、
-
map を、surrounding agent に関連付けられた host value cache とする。
-
もし host address hostaddr が存在し、 map[hostaddr] が v と同一であるなら、
-
ref.host hostaddr を返す。
-
-
host address hostaddr を、 map[hostaddr] が 存在しない となる最小のアドレスとする。
-
Set により map[hostaddr] に v を設定する。
-
r を ref.host hostaddr とする。
-
-
store を、現在のエージェントの associated store とする。
-
actualtype を、ref_type(store, r) とする。
-
もし match_valtype(actualtype, type) が false なら、
-
TypeErrorを投げる。
-
-
r を返す。
-
-
表明:このステップには到達しない。
AddressType
"i32" に対して模倣し、さらに AddressType
"i64" に対してそのセマンティクスを拡張することを意図しており、次の手順を実行する:
-
もし addrtype が "i32" なら、
-
n を、? ConvertToInt(v, 32, "unsigned") とし、変換先型は [EnforceRange] に従うものとする。
注: これは JS 変換規則における [EnforceRange] unsigned long と同等である。
-
-
もし addrtype が "i64" なら、
-
表明:このステップには到達しない。
AddressValue
の
適切なバリアント(AddressType
に対応)に変換し、次の手順を実行する:
5.7. タグ
tag_alloc(store, parameters) アルゴリズムは、store 内の parameters に対する新しい tag address を作成し、更新された store と tag address を返す。
5.7.1. タグの型
dictionary {TagType required sequence <ValueType >; }; [parameters LegacyNamespace =WebAssembly ,Exposed =(Window ,Worker ,Worklet )]interface {Tag constructor (TagType ); };type
Tag 値は例外タグを表す。
tag address tagAddress から Tag オブジェクトを初期化する tag には、次の手順を実行する:
-
map を、surrounding agent に関連付けられた Tag object cache とする。
-
表明:map[tagAddress] は 存在しない。
-
tag.[[Address]] に tagAddress を設定する。
-
Set により map[tagAddress] に tag を設定する。
-
map を、surrounding agent に関連付けられた Tag object cache とする。
-
もし map[tagAddress] が 存在するなら、
-
map[tagAddress] を返す。
-
-
初期化 により tag を tagAddress から初期化する。
-
tag を返す。
new Tag(type)
コンストラクターの手順は次のとおり:
-
parameters を type["parameters"] とする。
-
wasmParameters を «» とする。
-
各 type について、parameters を繰り返す。
-
Append により ToValueType(type) を wasmParameters に追加する。
-
-
store を、現在のエージェントの associated store とする。
-
(store, tagAddress) を tag_alloc(store, wasmParameters) とする。
-
現在のエージェントの associated store を 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 を surrounding agent の associated store に相対的に保持する。 また [[ObjectKind]] 内部スロットを含み、これは "struct" または "array" の文字列値を保持する。
Exported GC Object の内部メソッドは次の実装を用いる。
-
null を返す。
-
false を返す。
-
false を返す。
-
false を返す。
-
undefined を返す。
-
false を返す。
-
false を返す。
-
undefined を返す。
-
TypeErrorを投げる。
-
TypeErrorを投げる。
-
keys を新しい空のリストとする。
-
keys を返す。
-
表明:objectkind は "array" または "struct" のいずれかである。
-
map を、surrounding agent に関連付けられた exported GC object cache とする。
-
もし map[objectaddr] が 存在するなら、
-
map[objectaddr] を返す。
-
-
object を、MakeBasicObject(« [[ObjectAddress]] ») とする。
-
object.[[ObjectAddress]] に objectaddr を設定する。
-
object.[[ObjectKind]] に objectkind を設定する。
-
object.[[GetPrototypeOf]] を、[[GetPrototypeOf]] 内部メソッドに規定されたとおりに設定する。
-
object.[[SetPrototypeOf]] を、[[SetPrototypeOf]] 内部メソッドに規定されたとおりに設定する。
-
object.[[IsExtensible]] を、[[IsExtensible]] 内部メソッドに規定されたとおりに設定する。
-
object.[[PreventExtensions]] を、[[PreventExtensions]] 内部メソッドに規定されたとおりに設定する。
-
object.[[GetOwnProperty]] を、[[GetOwnProperty]] 内部メソッドに規定されたとおりに設定する。
-
object.[[DefineOwnProperty]] を、[[DefineOwnProperty]] 内部メソッドに規定されたとおりに設定する。
-
object.[[HasProperty]] を、[[HasProperty]] 内部メソッドに規定されたとおりに設定する。
-
object.[[Get]] を、[[Get]] 内部メソッドに規定されたとおりに設定する。
-
object.[[Set]] を、[[Set]] 内部メソッドに規定されたとおりに設定する。
-
object.[[Delete]] を、[[Delete]] 内部メソッドに規定されたとおりに設定する。
-
object.[[OwnPropertyKeys]] を、[[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 ([EnforceRange ]unsigned long );index boolean is (Tag );exceptionTag readonly attribute (DOMString or undefined )stack ; };
Exception
値は例外を表す。
Exception オブジェクトを初期化するために、Exception address exnAddress から exn を初期化するには、次の手順を実行する。
-
map を、surrounding agent に関連付けられた Exception object cache とする。
-
表明:map[exnAddress] は 存在しない。
-
exn.[[Address]] に exnAddress を設定する。
-
Set により map[exnAddress] に exn を設定する。
-
store を、surrounding agent の associated 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 を、surrounding agent に関連付けられた Exception object cache とする。
-
もし map[exnAddress] が 存在するなら、
-
map[exnAddress] を返す。
-
-
初期化 により exn を exnAddress から初期化する。
-
exn を返す。
new Exception(exceptionTag, payload, options)
コンストラクターの手順は次のとおり:
-
JSTagAddr を、JavaScript 例外タグを取得した結果とする。
-
もし exceptionTag.[[Address]] が JSTagAddr に等しければ、
-
TypeErrorを投げる。
-
-
store を、surrounding agent の associated store とする。
-
[types] → [] を、tag_type(store, exceptionTag.[[Address]]) とする。
-
もし types の大きさが payload の大きさと等しくなければ、
-
TypeErrorを投げる。
-
-
wasmPayload を « » とする。
-
各 value および resultType について、payload と types を同順で対応付けて反復する。
-
(store, exceptionAddr) を exn_alloc(store, exceptionTag.[[Address]], wasmPayload) とする。
-
surrounding agent の associated store を store に設定する。
-
初期化 により this を exceptionAddr から初期化する。
-
もし options["traceStack"] が true なら、
-
this.[[Stack]] に、現在のコールスタックの
DOMString表現または undefined のいずれかを設定する。
-
getArg(index) メソッドの手順は次のとおり:
-
store を、surrounding agent の associated store とする。
-
tagaddr を exn_tag(store, this.[[Address]]) とする。
-
payload を exn_read(store, this.[[Address]]) とする。
-
表明:tagaddr は this.[[Type]] に等しい。
-
もし index ≥ payload の大きさなら、
-
RangeErrorを投げる。
-
-
[types] → [] を tag_type(store, tagaddr) とする。
-
もし types[index] が matches v128 または exnref なら、
-
TypeErrorを投げる。
-
-
ToJSValue(payload[index]) を返す。
is(exceptionTag) メソッドの手順は次のとおり:
-
もし this.[[Type]] が exceptionTag.[[Address]] に等しくなければ、
-
false を返す。
-
-
true を返す。
stack 属性の getter の手順は次のとおり:
-
this.[[Stack]] を返す。
5.9.1. JavaScript 例外
JavaScript 例外タグは、surrounding agent に関連付けられた tag address である。初回使用時にエージェントの associated store に割り当てられ、キャッシュされる。常に tag type « externref » → « » を持つ。
JavaScript 例外タグを取得するには、次の手順を実行する。
-
もし surrounding agent に関連付けられた JavaScript 例外タグが初期化済みなら、
-
surrounding agent に関連付けられた JavaScript 例外タグを返す。
-
-
store を、surrounding agent の associated store とする。
-
(store, tagAddress) を tag_alloc(store, « externref » → « ») とする。
-
現在のエージェントの associated store を 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) を実行する。
-
注: これは、当仕様で定義される API によって生成される、CompileError、
LinkError、
および RuntimeError
クラスを WebAssembly
名前空間上に定義する。これらは、TypeError
や RangeError
のようなネイティブの JavaScript エラーと同じインターフェイスを公開する。
注: 現時点では、この挙動を Web IDL を用いて定義することはできない。
6. ビルトイン
JS-API は、モジュールのコンパイル時に options
を通じてインポートできるビルトイン関数の集合を定義する。WebAssembly のビルトイン関数は既存の JavaScript のビルトインを反映しつつ、オーバーヘッドを最小化して WebAssembly
関数として直接利用できるよう適合させる。
すべてのビルトイン関数はセットにグループ化される。各ビルトインセットは、WebAssemblyCompileOptions
で使用される
name と、
インポート検索で使用される
wasm: 接頭辞付きの qualified name を持つ。
ビルトインセットのビルトインを取得するために builtinSetName を与えたとき、次の手順を実行する。
-
この節で定義された、名前が builtinSetName であるセットに対する (name, funcType, steps) のリストを返す。
ビルトインを検索するために、 import と有効なビルトイン builtinSetNames を与えて次の手順を実行する:
-
表明:validate builtin set names(builtinSetNames) は true である。
-
importModuleName を import[0] とする。
-
importName を import[1] とする。
-
各 builtinSetName について、builtinSetNames を反復する。
-
もし builtinSetName がビルトインセットを指していなければ、continue。
-
builtinSetQualifiedName を "wasm:" を前置した builtinSetName とする。
-
もし 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, funcaddr) を func_alloc(store, functype, hostfunc) とする。
-
surrounding agent の associated store を store に設定する。
-
funcaddr を返す。
名前 builtinSetName の ビルトインセットをインスタンス化するには、次の手順を実行する:
-
builtins を、ビルトインセットのビルトインを取得する(builtinSetName) の結果とする。
-
exportsObject を、! OrdinaryObjectCreate(null) とする。
-
各 (name, funcType, steps) について、builtins を反復する。
-
funcaddr を、ビルトイン関数を作成する(funcType, steps) の結果とする。
-
func を、新しい Exported Function を funcaddr から作成した結果とする。
-
value を func とする。
-
status を、! CreateDataProperty(exportsObject, name, value) とする。
-
表明:status は true である。
-
-
exportsObject を返す。
ビルトイン用のインポートを検証するために、import と有効なビルトイン builtinSetNames を与えて次の手順を実行する:
-
表明:validate builtin set names(builtinSetNames) は true である。
-
maybeBuiltin を、ビルトインを検索する(import, builtinSetNames) の結果とする。
-
もし maybeBuiltin が null なら、true を返す。
-
importExternType を import[2] とする。
-
builtinFuncType を maybeBuiltin[0][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 でないなら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
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 externref)))).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 externref)))).0 である。
このビルトインが引数 array, start, end で呼び出されたとき、次の手順を実行する:
-
もし array が null なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
length を array の要素数とする。
-
もし start > end または end > length なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
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 なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
string を、? UnwrapString(string) とする。
-
stringLength を、string の長さとする。
-
arrayLength を array の要素数とする。
-
もし start + stringLength > arrayLength なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
i を 0 とする。
-
i < stringLength の間、次を行う:
-
charCode を、CharCodeAt(string, i) とする。
-
array のインデックス start + i にある要素を、ToWebAssemblyValue(charCode) に設定する。
-
i を i + 1 に設定する。
-
-
stringLength を返す。
6.1.6. fromCharCode
このビルトインの funcType は (rec (type (func (param i32) (result externref)))).0 である。
このビルトインが引数 v で呼び出されたとき、次の手順を実行する:
-
FromCharCode(v) を返す。
6.1.7. fromCodePoint
このビルトインの funcType は (rec (type (func (param i32) (result externref)))).0 である。
このビルトインが引数 v で呼び出されたとき、次の手順を実行する:
-
もし v > 0x10ffff なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
! 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 を、length(長さ) を用いて string の長さとする。
-
もし index >= length なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
CharCodeAt(string, index) を返す。
6.1.9. codePointAt
この関数の型は (rec (type (func (param externref i32) (result i32)))).0である。
このビルトインが引数 string と index で呼び出されたとき、次の手順を実行する:
-
string を、? UnwrapString(string) とする。
-
length を、length(長さ) を用いて string の長さとする。
-
もし index >= length なら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
! Call(String.prototype.codePointAt, string, « ToJSValue(index) ») を返す。
6.1.10. length
このビルトインの funcType は (rec (type (func (param externref) (result i32)))).0 である。
このビルトインが引数 v で呼び出されたとき、次の手順を実行する:
-
string を、? UnwrapString(v) とする。
-
length(長さ)を用いた string の長さを返す。
6.1.11. concat
このビルトインの funcType は
(rec (type (func (param externref externref) (result externref)))).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 externref)))).0 である。
このビルトインが引数 string、start、end で呼び出されたとき、次の手順を実行する:
-
string を、? UnwrapString(string) とする。
-
length を、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 でないなら、
-
trap が実行されたかのように、
RuntimeError例外を投げる。
-
-
もし second が null ではなく、かつ second がString でないなら、
-
trap が実行されたかのように、
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 の例外は処理でき、かつ trap が処理された後に JavaScript から WebAssembly のエクスポートを引き続き呼び出すことができるため、trap は一般に 将来の実行を妨げるものではない。
7.1. スタックオーバーフロー
WebAssembly コードでスタックオーバーフローが発生した場合は常に、 JavaScript におけるスタックオーバーフローと同じ種類の例外が投げられる。どの例外になるかは、いずれの場合も実装定義である。
注: ECMAScript はスタックオーバーフロー時の挙動を規定していない。
実装では RangeError、
InternalError、あるいは Error を投げることが観測されている。いずれもここでは妥当である。
7.2. メモリ不足(Out of Memory)
検証、コンパイル、またはインスタンス化の過程でメモリ不足になった場合は常に、 JavaScript のメモリ不足時と同じ種類の例外が投げられる。 どの例外になるかは、いずれの場合も実装定義である。
注: ECMAScript は OOM(メモリ不足)時の挙動を規定していない。 実装では OOMError を投げたりクラッシュすることが観測されている。どちらもここでは妥当である。
-
RangeError(Memoryのgrow()およびTableのgrow()操作で規定されているとおり) -
memory.grow 命令として -1 を返すこと
-
この節で述べる UA 固有の OOM の挙動
詳細は Issue 879 を参照。
8. 実装定義の制限
WebAssembly コア仕様は、実装がモジュールの構文構造に制限を設けることを許容している。
各埋め込みは独自の制限を定義してもよいが、予測可能性のために、本書で記述する標準的な
WebAssembly JavaScript インターフェイスは以下の正確な制限を定義する。
実装は、以下のいずれかの制限を超えるモジュールを CompileError
で拒否しなければならない。
実際には、これらの制限未満の妥当なモジュールであっても、実装のリソースが不足する場合がある。
- モジュールの最大サイズは 1,073,741,824 バイト(1 GiB)。
- types セクションで定義される型の最大数は 1,000,000。
- types セクションで定義される再帰グループの最大数は 1,000,000。
- 1 つの再帰グループ内で定義される型の最大数は 1,000,000。
- 定義されたサブタイプ階層の最大深さは 63(上位型なしで定義された型の深さは 0)。
- モジュールで定義される関数の最大数は 1,000,000。
- モジュールで宣言される import の最大数は 1,000,000。
- モジュールで宣言される export の最大数は 1,000,000。
- モジュールで定義される global の最大数は 1,000,000。
- モジュールで定義される tag の最大数は 1,000,000。
- モジュールで定義されるデータセグメントの最大数は 100,000。
- 宣言または import された table を含む table の最大数は 100,000。
- table の最大サイズは 10,000,000。
- 任意の table 初期化における table エントリの最大数は 10,000,000。
- 定義および import を含む memory の最大数は 100。
- 32 ビット memory の
minまたはmaxフィールドの最大値は 65,536 ページ(4 GiB)。 - 64 ビット memory の
minまたはmaxフィールドの最大値は 2^37-1 ページ(2^53 - 2^16 バイト)。 - 任意の関数またはブロックに対する引数(parameters)の最大数は 1,000。
- 任意の関数またはブロックに対する戻り値の最大数は 1,000。
- ローカル宣言を含む関数本体の最大サイズは 7,654,321 バイト。
- パラメータとして暗黙に宣言されたものを含む、関数で宣言されるローカルの最大数は 50,000。
- struct のフィールドの最大数は 10,000。
array.new_fixedのオペランドの最大数は 10,000。
実行時に以下のいずれかの制限を超えた場合、実装は RuntimeError
を投げなければならない。
実際には、これらの制限未満の妥当なモジュールであっても、実装のリソースが不足する場合がある。
- table の最大サイズは 10,000,000。
- 32 ビット memory の最大サイズは 65,536 ページ(4 GiB)。
- 64 ビット memory の最大サイズは 262,144 ページ(16 GiB)。
9. セキュリティおよびプライバシーに関する考慮事項
この節は規範的ではない(非規範的)。
本書は WebAssembly のホスト環境を定義する。これにより WebAssembly のインスタンスは、import を用いて import object から JavaScript のオブジェクトや関数を 取り込むことができるが、それ以外に埋め込み環境へのアクセスは提供されない。したがって WebAssembly インスタンスは JavaScript と同じ制約に拘束される。
10. 変更履歴
この節は規範的ではない(非規範的)。
WebAssembly 仕様の初版 1.0 以降、多数の拡張提案が統合されている。 以下の節では、何が変更されたかの概要を示す。