1. 소개
설계상, WebAssembly 코어 명세 범위 [WEBASSEMBLY]는 WebAssembly 프로그램이 주변 실행 환경과 어떻게 상호작용하는지에 대한 설명을 포함하지 않습니다. 대신 WebAssembly와 그 환경(임베더라 부름) 사이의 추상적인 임베딩 인터페이스를 정의합니다. 임베더는 이 인터페이스를 통해서만 WebAssembly의 의미론과 상호작용하며, 임베더는 자신의 호스트 환경과 임베딩 API 간의 연결을 구현합니다. 이 문서는 WebAssembly를 JavaScript [ECMASCRIPT] 환경에 임베딩하는 방법을 설명하며, WebAssembly 모듈을 생성하고 인스턴스화하는 방법, import 및 export 함수 호출, 데이터 교환 방법, 오류 처리 방법 등을 포함합니다. JavaScript 환경이 웹 브라우저에 임베드된 경우, Web API 명세 [WASMWEB]가 웹 환경과 관련한 추가 동작을 설명합니다.
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 )) )
그리고 다음 자바스크립트가 브라우저에서 실행될 때:
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 저장소와 자바스크립트의 상호작용
참고: WebAssembly 의미론은 WebAssembly 추상 기계의 상태를 나타내는 추상적인 store를 기반으로 정의됩니다. WebAssembly 연산은 store를 받아서 갱신된 store를 반환합니다.
각 에이전트(agent)는 연결된 저장소(associated store)를 가집니다. 새로운 에이전트가 생성될 때, 해당 에이전트의 연결된 저장소는 store_init() 호출 결과로 설정됩니다.
참고: 이 명세에서, 어떤 WebAssembly 관련 객체, 메모리, 주소도 에이전트 클러스터(agent cluster) 내의 에이전트들 간에 공유될 수 없습니다. 향후 WebAssembly 버전에서는 이 내용이 바뀔 수 있습니다.
WebAssembly 저장소의 요소들은 JavaScript 값과 식별될 수 있습니다. 특히, 해당 Memory 객체가 있는
WebAssembly 메모리 인스턴스마다 자바스크립트 Data Block이 식별자로 대응됩니다. 이 Data Block을 수정하면 에이전트의 저장소가 그 값을 반영하도록 갱신된
store로 바뀌며, 반대도 마찬가지입니다.
4.2. WebAssembly JS 객체 캐시
참고: 자바스크립트 객체에 대응되는 여러 WebAssembly 객체가 있습니다. 이 대응 정보는 각 에이전트에 대해 WebAssembly 주소(address)에서 자바스크립트 객체로의 매핑으로 저장됩니다. 이 매핑은 어떤 에이전트에 대해서 특정 WebAssembly 주소에 대해 하나의 자바스크립트 객체만 존재함을 보장합니다. 단, 공유 객체의 경우에는 이 특성이 보장되지 않습니다.
각 에이전트는 다음과 같은 순서 있는 맵(ordered map)을 가집니다:
-
내보낸 함수 캐시(Exported Function cache) : 함수 주소를 Exported Function 객체로 매핑합니다.
-
내보낸 GC 객체 캐시 : struct 주소 또는 array 주소를 Exported GC Object 객체로 매핑합니다.
-
호스트 값 캐시 : 호스트 주소를 값으로 매핑합니다.
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이 오류(error)라면, 오류(error)를 반환한다.
-
module_validate(module)가 오류(error)라면, 오류(error)를 반환한다.
-
module을 반환한다.
WebAssembly 모듈에 대해 builtins 및 import된 문자열을 검증을 module module, 활성화된 builtins builtinSetNames, importedStringModule로부터 수행하려면 다음 단계를 따른다:
-
builtin set 이름 검증이 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를 버퍼가 보유한 바이트의 복사본 bytes로 둔다.
-
컴파일을 통해 stableBytes를 WebAssembly 모듈로 만들고 결과를 module로 저장한다.
-
module이 error라면, false를 반환한다.
-
builtinSetNames를 options["builtins"]로 둔다.
-
importedStringModule를 options["importedStringConstants"]로 둔다.
-
builtins 및 import된 문자열 검증이 module, builtinSetNames, importedStringModule에 대해 false를 반환하면, false를 반환한다.
-
true를 반환한다.
Module 객체는 단일
WebAssembly 모듈을 나타낸다.
각 Module 객체는 다음 내부
슬롯을 가진다:
-
[[Module]] : WebAssembly module
-
[[Bytes]] : [[Module]]의 소스 바이트.
-
[[BuiltinSets]] : builtin sets의 이름으로 이루어진 순서 있는 집합
-
[[ImportedStringModule]] : 임의의 문자열 상수를 import할 수 있는 선택적 모듈 지정자 문자열.
-
moduleObject를 새로운
Module객체로 둔다. -
moduleObject.[[Module]]를 module로 설정한다.
-
moduleObject.[[Bytes]]를 bytes로 설정한다.
-
moduleObject.[[BuiltinSets]]를 builtinSetNames로 설정한다.
-
moduleObject.[[ImportedStringModule]]를 importedStringModule로 설정한다.
-
moduleObject를 반환한다.
WebAssemblyCompileOptions
options을 사용하고, 선택적 작업
소스 taskSource로 다음 단계를 수행한다:
-
promise를 새로운 프로미스로 둔다.
-
다음 단계를 병렬로 수행한다:
-
WebAssembly 모듈을 컴파일하여 bytes의 결과를 module로 저장한다.
-
태스크를 큐에 넣어 다음 단계를 수행한다. taskSource가 제공되었다면, 그 작업 소스에 태스크를 큐에 넣는다.
-
module이 error이면, promise를
CompileError예외로 거부한다. -
builtinSetNames를 options["builtins"]로 둔다.
-
importedStringModule를 options["importedStringConstants"]로 둔다.
-
builtins 및 import된 문자열 검증이 module, builtinSetNames, importedStringModule에 대해 false이면, promise를
CompileError예외로 거부한다. -
그렇지 않다면,
-
WebAssembly 모듈 객체를 구성하여 module, bytes, builtinSetNames, importedStringModule로부터 결과를 moduleObject로 둔다.
-
Resolve promise with moduleObject.
-
-
-
-
promise를 반환한다.
compile(bytes, options) 메서드는,
호출되면 다음 단계를 수행한다:
-
stableBytes를 버퍼가 보유한 바이트의 복사본 bytes로 둔다.
-
WebAssembly 모듈을 비동기적으로 컴파일하여 stableBytes와 options를 사용하고 그 결과를 반환한다.
import된 문자열을 인스턴스화하려면 모듈 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예외를 던진다. -
builtinOrStringImports를 순서 있는 맵 « »로 둔다.
-
각 builtinSetName ∈ builtinSetNames에 대해,
-
Assert: builtinOrStringImports는 builtinSetName을 포함하지 않는다.
-
builtinSetName이 builtin set을 가리키지 않으면, continue.
-
exportsObject를 builtin set 인스턴스화의 결과로, builtinSetName을 사용하여 둔다.
-
builtinSetQualifiedName을 "wasm:" 접두어를 붙인 builtinSetName으로 둔다>
-
Set builtinOrStringImports[builtinSetQualifiedName] = exportsObject
-
-
importedStringModule이 null이 아니라면,
-
exportsObject를 import된 문자열 인스턴스화 결과로, module과 importedStringModule을 사용하여 둔다.
-
Set builtinOrStringImports[importedStringModule] = exportsObject
-
-
imports를 « »로 둔다.
-
각 (moduleName, componentName, externtype) ∈ module_imports(module)에 대해,
-
builtinOrStringImports가 moduleName를 포함한다면,
-
o를 builtinOrStringImports[moduleName]로 둔다.
-
o가 객체가 아니거나 또는 o가 componentName을 포함하지 않으면,
-
-
그 외의 경우,
-
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, globaladdr)를 global_alloc(store, const valtype, value)로 둔다.
-
-
externglobal을 global globaladdr로 둔다.
-
Append externglobal → imports.
-
-
externtype이 mem memtype 형태라면,
-
externtype이 table tabletype 형태라면,
-
externtype이 tag attribute functype 형태라면,
-
-
imports를 반환한다.
Note: 이 알고리즘은 올바른 종류의 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를 새로운 Exported Function을 funcaddr로부터 생성한 결과로 둔다.
-
value를 func로 둔다.
-
-
externtype이 global mut globaltype 형태라면,
-
Assert: externval은 global globaladdr 형태이다.
-
global globaladdr를 externval로 둔다.
-
global을 새로운 Global 객체로, globaladdr로부터 생성한다.
-
value를 global로 둔다.
-
-
externtype이 mem memtype 형태라면,
-
Assert: externval은 mem memaddr 형태이다.
-
mem memaddr를 externval로 둔다.
-
memory를 새로운 Memory 객체로, memaddr로부터 생성한다.
-
value를 memory로 둔다.
-
-
externtype이 table tabletype 형태라면,
-
Assert: externval은 table tableaddr 형태이다.
-
table tableaddr를 externval로 둔다.
-
table을 새로운 Table 객체로, tableaddr로부터 생성한다.
-
value를 table로 둔다.
-
-
externtype이 tag attribute functype 형태라면,
-
Assert: attribute는 exception이다.
-
Assert: externval은 tag tagaddr 형태이다.
-
tag tagaddr를 externval로 둔다.
-
tag를 새로운 Tag 객체로, tagaddr로부터 생성한다.
-
value를 tag로 둔다.
-
-
status를 ! CreateDataProperty(exportsObject, name, value)로 둔다.
-
Assert: status는 true이다.
Note: WebAssembly 모듈 검증 중 수행되는 유효성 및 고유성 검사는 각 프로퍼티 이름이 유효하며 중복 정의되지 않음을 보장한다.
-
-
! SetIntegrityLevel(exportsObject,
"frozen")을 수행한다. -
exportsObject를 반환한다.
-
exports 객체 생성을 module과 instance로 수행하고, 결과를 exportsObject로 둔다.
-
instanceObject.[[Instance]]를 instance로 설정한다.
-
instanceObject.[[Exports]]를 exportsObject로 설정한다.
-
result를 module_instantiate(store, module, imports)로 둔다.
-
result가 error이면, 적절한 예외 유형을 던진다:
-
링킹 중 대부분의 경우에 대해
LinkError예외. -
start 함수 실행 중 발생한 오류라면, WebAssembly로부터 발생하는 대부분의 오류에 대해
RuntimeError를, 또는 내부 ECMAScript 코드에서 전파된 오류 객체를 던진다. -
그 외 적절하다면 다른 오류 타입(예: out-of-memory 예외). 자세한 내용은 WebAssembly 오류 매핑에 문서화되어 있다.
-
-
(store, instance)를 result로부터 둔다.
-
instance를 반환한다.
Module
moduleObject와 imports importObject로부터 WebAssembly 모듈을 비동기적으로
인스턴스화하려면,
다음 단계를 수행한다:
-
promise를 새로운 프로미스로 둔다.
-
module를 moduleObject.[[Module]]로 둔다.
-
builtinSetNames를 moduleObject.[[BuiltinSets]]로 둔다.
-
importedStringModule를 moduleObject.[[ImportedStringModule]]로 둔다.
-
import 읽기를 module에 대해, importObject, builtinSetNames, importedStringModule와 함께 수행하고, 결과를 imports로 둔다. 이 연산이 예외를 던지면 이를 잡아, reject promise with 그 예외, 그리고 promise를 반환한다.
-
다음 단계를 병렬로 수행한다:
-
태스크를 큐에 넣어 다음 단계를 수행한다: Note: 구현별 작업이 여기서 수행될 수 있다.
-
WebAssembly 모듈의 코어 인스턴스화를 module과 imports로 수행하고, 결과를 instance로 둔다. 예외가 던져지면 이를 잡아, reject promise with 그 예외, 그리고 이 하위단계를 종료한다.
-
초기화를 instanceObject에 대해 module과 instance로 수행한다. 이 연산이 예외를 던지면 이를 잡아, reject promise with 그 예외, 그리고 이 하위단계를 종료한다.
-
Resolve promise with instanceObject.
-
-
-
promise를 반환한다.
-
promise를 새로운 프로미스로 둔다.
-
React to promiseOfModule:
-
promiseOfModule이 값 module로 이행되었다면:
-
WebAssembly 모듈 인스턴스화를 module에 대해, importObject를 import하여 수행하고, 결과를 innerPromise로 둔다.
-
React to innerPromise:
-
innerPromise가 값 instance로 이행되었다면.
-
result를
WebAssemblyInstantiatedSource값 «[ "module" → module, "instance" → instance ]»로 둔다. -
Resolve promise with result.
-
-
innerPromise가 이유 reason으로 거부되었다면:
-
Reject promise with reason.
-
-
-
-
promiseOfModule가 이유 reason으로 거부되었다면:
-
Reject promise with reason.
-
-
-
promise를 반환한다.
instantiate(bytes, importObject, options)
메서드는, 호출되면 다음 단계를 수행한다:
-
stableBytes를 버퍼가 보유한 바이트의 복사본 bytes로 둔다.
-
WebAssembly 모듈을 비동기적으로 컴파일하여 stableBytes와 options를 사용하고, 결과를 promiseOfModule로 둔다.
-
Instantiate promiseOfModule를 imports importObject와 함께 수행하고 그 결과를 반환한다.
instantiate(moduleObject, importObject)
메서드는, 호출되면 다음 단계를 수행한다:
-
WebAssembly 모듈을 비동기적으로 인스턴스화 moduleObject를 importObject를 import하여 수행하고, 그 결과를 반환한다.
Note: 후속 스트리밍 API는 WebAssembly Web API에 문서화되어 있다.
WebAssembly
네임스페이스의 JSTag 속성 getter는, 호출되면 다음 단계를 수행한다:
-
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) 메서드는, 호출되면 다음 단계를 수행한다:
-
module를 moduleObject.[[Module]]로 둔다.
-
exports를 « »로 둔다.
-
For each (name, type) ∈ module_exports(module)에 대해,
-
kind를 extern 타입의 문자열 값 type으로 둔다.
-
Append obj → exports.
-
-
exports를 반환한다.
imports(moduleObject) 메서드는, 호출되면 다음 단계를 수행한다:
-
module를 moduleObject.[[Module]]로 둔다.
-
builtinSetNames를 moduleObject.[[BuiltinSets]]로 둔다.
-
importedStringModule를 moduleObject.[[ImportedStringModule]]로 둔다.
-
imports를 « »로 둔다.
-
For each (moduleName, name, type) ∈ module_imports(module)에 대해,
-
(moduleName, name, type) 및 builtinSetNames에 대해 find a builtin 결과가 null이 아니면, continue.
-
importedStringModule이 null이 아니고 moduleName이 importedStringModule과 같으면, continue.
-
kind를 extern 타입의 문자열 값 type으로 둔다.
-
obj를 «[ "
module" → moduleName, "name" → name, "kind" → kind ]»로 둔다. -
Append obj → imports.
-
-
imports를 반환한다.
customSections(moduleObject, sectionName)
메서드는, 호출되면 다음 단계를 수행한다:
-
bytes를 moduleObject.[[Bytes]]로 둔다.
-
customSections를 « »로 둔다.
-
For each custom section customSection ∈ bytes에 대해, module grammar에 따라 해석한다,
-
name를 customSection의
name을 UTF-8로 디코딩한 값으로 둔다. -
Assert: name은 failure가 아니다 (moduleObject.[[Module]]은 valid이다).
-
name이 문자열 값으로 sectionName과 같다면,
-
Append — 이 customsec production이 매치한 범위의 bytes 바이트를 복사해 담은 새로운
ArrayBuffer를 customSections에 추가한다.
-
-
-
customSections를 반환한다.
Module(bytes, options) 생성자는, 호출되면 다음 단계를
수행한다:
-
stableBytes를 버퍼가 보유한 바이트의 복사본 bytes로 둔다.
-
WebAssembly 모듈을 컴파일하여 stableBytes의 결과를 module로 저장한다.
-
module이 error라면,
CompileError예외를 던진다. -
builtinSetNames를 options["builtins"]로 둔다.
-
importedStringModule를 options["importedStringConstants"]로 둔다.
-
builtins 및 import된 문자열 검증이 module, builtinSetNames, importedStringModule에 대해 false를 반환하면,
CompileError예외를 던진다. -
this.[[Module]]를 module로 설정한다.
-
this.[[Bytes]]를 stableBytes로 설정한다.
-
this.[[BuiltinSets]]를 builtinSetNames로 설정한다.
-
this.[[ImportedStringModule]]를 importedStringModule로 설정한다.
Note: 일부 구현은 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]]로 둔다.
-
Read the imports를 module에 대해, imports importObject, builtinSetNames, importedStringModule로 수행하고, 결과를 imports로 둔다.
-
WebAssembly 모듈의 코어 인스턴스화를 module과 imports로 수행하고, 결과를 instance로 둔다.
-
Initialize를 통해 this를 module과 instance로부터 초기화한다.
Note: 일부 구현은 인스턴스화 시 장시간 컴파일 작업을 수행할 수 있으므로, 이 동기 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 ; };
Memory 객체는
여러 Instance
객체에서 동시에 참조될 수 있는 단일 memory instance를 나타낸다.
각
Memory 객체는 다음의 내부
슬롯을 가진다:
-
[[Memory]] : memory address
-
[[BufferObject]] : 그 Data Block이 위 메모리 주소에 identified with로 연결된
ArrayBuffer
-
block를 Data Block으로 두되, 이는 identified with를 통해 memaddr의 기반 메모리와 연결된다.
-
buffer를 새로운
ArrayBuffer로 두고, 내부 슬롯 [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]]를 갖도록 한다. -
buffer.[[ArrayBufferData]]를 block으로 설정한다.
-
buffer.[[ArrayBufferByteLength]]를 block의 길이로 설정한다.
-
buffer.[[ArrayBufferDetachKey]]를 "WebAssembly.Memory"로 설정한다.
-
buffer를 반환한다.
-
block를 Data Block으로 두되, 이는 identified with를 통해 memaddr의 기반 메모리와 연결된다.
-
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로 둔다.
-
Assert: map[memaddr]는 exist하지 않는다.
-
buffer를 고정 길이 메모리 버퍼 생성을 memaddr로 수행한 결과로 둔다.
-
memory.[[Memory]]를 memaddr로 설정한다.
-
memory.[[BufferObject]]를 buffer로 설정한다.
-
Set map[memaddr] = memory.
-
map을 surrounding agent에 연계된 Memory object cache로 둔다.
-
map[memaddr]가 exists이면,
-
map[memaddr]를 반환한다.
-
-
Initialize memory from memaddr.
-
memory를 반환한다.
Memory(descriptor) 생성자는, 호출되면 다음 단계를 수행한다:
-
descriptor["address"]가 exists이면 addrtype을 descriptor["address"]로, 그렇지 않으면 addrtype을 "i32"로 둔다.
-
initial을 ? AddressValueToU64(descriptor["initial"], addrtype)로 둔다.
-
descriptor["maximum"]이 exists이면 maximum을 ? AddressValueToU64(descriptor["maximum"], addrtype)로, 그렇지 않으면 maximum을 empty로 둔다.
-
memtype을 memory type 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로 설정한다.
-
Initialize this from memaddr.
-
map을 surrounding agent에 연계된 Memory object cache로 둔다.
-
Assert: map[memaddr]가 exists이다.
-
memory를 map[memaddr]로 둔다.
-
buffer를 memory.[[BufferObject]]로 둔다.
-
IsFixedLengthArrayBuffer(buffer)가 true이면,
-
! DetachArrayBuffer(buffer, "WebAssembly.Memory")를 수행한다.
-
buffer를 고정 길이 메모리 버퍼 생성을 memaddr로 수행한 결과로 둔다.
-
memory.[[BufferObject]]를 buffer로 설정한다.
-
-
그 외의 경우,
-
block을 Data Block으로 두되, 이는 identified with를 통해 memaddr의 기반 메모리와 연결된다.
-
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예외를 던진다. -
surrounding agent의 associated store를 store로 설정한다.
-
Refresh the memory buffer를 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 명령이 실행된 직후, 다음 단계를 수행한다:
-
스택의 최상단이 i32.const (−1)이 아니라면,
-
frame을 current frame으로 둔다.
-
Refresh the memory buffer를 memaddr에 대해 수행한다.
-
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
가 Memory 객체에 의해 반환될
때, 그 크기는 WebAssembly page
size(상수 65536)의 배수여야 한다. 이 이유로 HostResizeArrayBuffer는 다음과 같이 재정의된다.
추상 연산 HostResizeArrayBuffer는 인수
buffer ( ArrayBuffer)
와 newLength를 받고, 호출 시 다음 단계를 수행한다.
-
buffer.[[ArrayBufferDetachKey]]가 "WebAssembly.Memory"라면,
-
map을 surrounding agent에 연계된 Memory object cache로 둔다.
-
Assert: buffer는 map 내 정확히 하나의 값의 [[BufferObject]]이다.
-
For each memaddr → mem ∈ map,
-
SameValue(mem.[[BufferObject]], buffer)가 true이면,
-
Assert: buffer.[[ArrayBufferByteLength]] mod 65536 == 0.
-
lengthDelta를 newLength - buffer.[[ArrayBufferByteLength]]로 둔다.
-
lengthDelta < 0 이거나 lengthDelta mod 65536 != 0 이면,
-
RangeError예외를 던진다.
-
-
delta를 lengthDelta ÷ 65536으로 둔다.
-
Grow the memory buffer — memaddr에 연결된 버퍼를 delta만큼 확장한다.
-
-
-
handled 를 반환한다.
-
-
그 외의 경우,
unhandled 를 반환한다.
Memory의
buffer 속성 getter는
this.[[BufferObject]]를 반환한다.
5.4. 테이블
enum {TableKind ,"externref" , // Note: More values may be added in future iterations, // e.g., typed function references, typed GC references };"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 address인 [[Table]] 내부 슬롯을 하나 가진다.
-
map을 주변 에이전트에 연계된 Table object cache로 둔다.
-
Assert: map[tableaddr]는 존재하지 않는다.
-
table.[[Table]]를 tableaddr로 설정한다.
-
Set map[tableaddr] = table.
-
map을 주변 에이전트에 연계된 Table object cache로 둔다.
-
map[tableaddr]가 exists이면,
-
map[tableaddr]를 반환한다.
-
-
Initialize를 실행하여 tableaddr로부터 table을 초기화한다.
-
table를 반환한다.
Table(descriptor, value) 생성자는, 호출되면 다음 단계를
수행한다:
-
elementtype를 ToValueType(descriptor["element"])로 둔다.
-
elementtype이 reftype이 아니면,
-
descriptor["address"]가 exists이면 addrtype을 그 값으로, 그렇지 않으면 addrtype을 "i32"로 둔다.
-
initial을 ? AddressValueToU64(descriptor["initial"], addrtype)로 둔다.
-
descriptor["maximum"]이 exists이면 maximum을 ? AddressValueToU64(descriptor["maximum"], addrtype)로, 그렇지 않으면 maximum을 empty로 둔다.
-
type을 table type addrtype { min initial, max maximum } elementType로 둔다.
-
type이 valid가 아니면,
RangeError예외를 던진다. -
value가 제공되지 않았다면,
-
ref를 DefaultValue(elementtype)로 둔다.
-
Assert: ref는 error가 아니다.
-
-
그 외의 경우,
-
ref를 ? ToWebAssemblyValue(value, elementType)로 둔다.
-
-
store를 주변 에이전트의 associated store로 둔다.
-
(store, tableaddr)를 table_alloc(store, type, ref)으로 둔다. 할당이 실패하면
RangeError예외를 던진다. -
주변 에이전트의 associated store를 store로 설정한다.
-
Initialize를 통해 tableaddr로부터 this를 초기화한다.
grow(delta, value) 메서드는, 호출되면 다음 단계를 수행한다:
-
tableaddr를 this.[[Table]]로 둔다.
-
store를 주변 에이전트의 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예외를 던진다.참고: 위 예외는 메모리 부족 또는 잘못된 크기 매개변수로 인해 발생할 수 있다.
-
주변 에이전트의 associated store를 result로 설정한다.
-
initialSize를 반환한다.
Table의
length 속성 getter는, 호출되면 다음 단계를 수행한다:
-
tableaddr를 this.[[Table]]로 둔다.
-
store를 주변 에이전트의 associated store로 둔다.
-
addrtype을 address type in table_type(store, tableaddr)로 둔다.
-
length64를 table_size(store, tableaddr)로 둔다.
-
U64ToAddressValue(length64, addrtype)를 반환한다.
get(index) 메서드는, 호출되면 다음 단계를 수행한다:
-
tableaddr를 this.[[Table]]로 둔다.
-
store를 주변 에이전트의 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를 주변 에이전트의 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예외를 던진다. -
주변 에이전트의 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 객체는
하나의 내부 슬롯을 가진다:
-
[[Global]] : global address
-
map을 주변 에이전트에 연계된 Global object cache로 둔다.
-
Assert: map[globaladdr]는 존재하지 않는다.
-
global.[[Global]]을 globaladdr로 설정한다.
-
Set map[globaladdr] = global.
-
map을 주변 에이전트에 연계된 Global object cache로 둔다.
-
map[globaladdr]가 exists이면,
-
map[globaladdr]를 반환한다.
-
-
Initialize를 실행하여 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예외를 던진다.
-
-
v가 제공되지 않았다면,
-
value를 DefaultValue(valuetype)로 둔다.
-
Assert: 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로 설정한다.
-
Initialize를 통해 globaladdr로부터 this를 초기화한다.
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)를 반환한다.
Global의
value 속성 getter는, 호출되면 다음 단계를 수행한다:
-
GetGlobalValue(this)를 반환한다.
Global의 value 속성
setter는, 호출되면 다음 단계를 수행한다:
-
store를 현재 에이전트의 연결된 저장소로 둔다.
-
globaladdr를 this.[[Global]]로 둔다.
-
mut valuetype를 global_type(store, globaladdr)로 둔다.
-
value를 ToWebAssemblyValue(주어진 값, valuetype)으로 둔다.
-
store를 global_write(store, globaladdr, value)로 둔다.
-
store가 error이면,
RangeError예외를 던진다. -
현재 에이전트의 연결된 저장소를 store로 설정한다.
valueOf() 메서드는, 호출되면 다음 단계를 수행한다:
-
GetGlobalValue(this)를 반환한다.
5.6. 내보낸 함수(Exported Functions)
WebAssembly 함수는 JavaScript에서 Exported Function으로 제공된다. Exported Function은 생성자가 아닌 내장 함수 객체이며, [[FunctionAddress]] 내부 슬롯을 가진다. 이 슬롯에는 function address가 저장되며, 이는 주변 에이전트의 연결된 저장소를 기준으로 한다.
-
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를 moduleinst.funcaddrs에서 funcaddr가 발견되는 인덱스로 둔다.
-
-
map을 주변 에이전트에 연계된 Exported Function 캐시로 둔다.
-
map[funcaddr]가 exists이면,
-
map[funcaddr]를 반환한다.
-
-
steps를 "Exported Function 호출 funcaddr (인수와 함께)"로 둔다.
-
realm을 현재 Realm으로 둔다.
-
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을 반환한다.
-
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)의 결과로 둔다.
-
ret이 error이면, 예외를 던진다. 이 예외는 WebAssembly 오류 매핑에 달리 명시되지 않는 한 WebAssembly
RuntimeError예외여야 한다. -
-
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를 반환한다.
-
-
Assert: IsCallable(func).
-
stored settings를 incumbent settings object로 둔다.
-
다음 단계를 인수 arguments와 함께 호출될 때 수행하는 호스트 함수 hostfunc를 둔다:
-
realm을 func의 associated Realm으로 둔다.
-
relevant settings를 realm의 settings object로 둔다.
-
스크립트 실행 준비를 relevant settings로 수행한다.
-
콜백 실행 준비를 stored settings로 수행한다.
-
result를 호스트 함수 실행을 func, functype, arguments로 수행한 결과로 둔다.
-
콜백 실행 후 정리를 stored settings로 수행한다.
-
스크립트 실행 후 정리를 relevant settings로 수행한다.
-
Assert: result.[[Type]]은
throw 또는normal 이다. -
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 »)으로 둔다.
-
-
-
그렇지 않으면, result.[[Value]]를 반환한다.
-
-
(store, funcaddr)를 func_alloc(store, functype, hostfunc)으로 둔다.
-
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 형태이면, a new Exported GC Object를 structaddr와 "struct"로부터 생성한 결과를 반환한다.
-
w가 ref.array arrayaddr 형태이면, a new Exported GC Object를 arrayaddr와 "array"로부터 생성한 결과를 반환한다.
-
w가 ref.func funcaddr 형태이면, a new Exported Function을 funcaddr로부터 생성한 결과를 반환한다.
-
w가 ref.host hostaddr 형태이면, 호스트 값 조회를 hostaddr에 대해 수행한 결과를 반환한다.
-
w가 ref.extern ref 형태이면, ToJSValue(ref)를 반환한다.
참고: NaN과 같은 숫자 값은 관찰 가능한 다양한 NaN 페이로드를 가질 수 있다. 자세한 내용은 NumericToRawBytes를 참조하라.
host address hostaddr로부터 호스트 값 조회를 수행하려면, 다음 단계를 따른다:
-
map을 주변 에이전트에 연계된 host value cache로 둔다.
-
Assert: map[hostaddr]가 exists이다.
-
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으로 둔다.
-
-
그렇지 않고 match_valtype(type, ref null extern)이면,
-
ref를 ToWebAssemblyValue(v, ref any)로 둔다.
-
r를 ref.extern ref로 둔다.
-
-
그렇지 않고 v가 Exported Function이며 match_valtype(type, ref null func)이면,
-
funcaddr를 v의 [[FunctionAddress]] 내부 슬롯의 값으로 둔다.
-
r를 ref.func funcaddr로 둔다.
-
-
그렇지 않고 v가 Number이고 v가 ? ToInt32(v)와 같고, ℝ(v) < 230이며 ℝ(v) ⩾ -230이면,
-
그렇지 않고 v가 Exported GC Object이면,
-
objectaddr를 v의 [[ObjectAddress]] 내부 슬롯의 값으로 둔다.
-
objectkind를 v의 [[ObjectKind]] 내부 슬롯의 값으로 둔다.
-
objectkind가 "array"이면,
-
r를 ref.array objectaddr로 둔다.
-
-
objectkind가 "struct"이면,
-
r를 ref.struct objectaddr로 둔다.
-
-
-
그 밖의 경우,
-
map을 주변 에이전트에 연계된 host value cache로 둔다.
-
어떤 host address hostaddr가 존재하여 map[hostaddr]가 v와 동일하다면,
-
ref.host hostaddr를 반환한다.
-
-
host address hostaddr를 map[hostaddr] exists가 false인 가장 작은 주소로 둔다.
-
Set map[hostaddr] = v.
-
r를 ref.host hostaddr로 둔다.
-
-
store를 현재 에이전트의 연결된 저장소로 둔다.
-
actualtype을 ref_type(store, r)로 둔다.
-
match_valtype(actualtype, type)이 false이면,
-
TypeError를 던진다.
-
-
r를 반환한다.
-
-
Assert: 이 단계에는 도달하지 않는다.
AddressType
"i32"에 대해 모사하고, 이를 AddressType
"i64"로 확장한다. 다음 단계를 수행한다:
-
addrtype이 "i32"이면,
-
n을 ? ConvertToInt(v, 32, "unsigned")로 두되, 대상 타입은 [EnforceRange]에 연계된다.
참고: 이는 JS 변환 규칙 중 [EnforceRange] unsigned long과 동일하다.
-
-
addrtype이 "i64"이면,
-
Assert: 이 단계에는 도달하지 않는다.
AddressValue
(해당 AddressType)로
변환한다. 다음 단계를 수행한다:
5.7. 태그
tag_alloc(store, parameters) 알고리즘은 store 내 parameters에 대한 새로운 tag address를 생성하고, 갱신된 저장소와 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을 주변 에이전트에 연계된 Tag object cache로 둔다.
-
Assert: map[tagAddress]는 exist하지 않는다.
-
tag.[[Address]]를 tagAddress로 설정한다.
-
Set map[tagAddress] = tag.
-
map을 주변 에이전트에 연계된 Tag object cache로 둔다.
-
map[tagAddress]가 exists이면,
-
map[tagAddress]를 반환한다.
-
-
Initialize tag from tagAddress.
-
tag를 반환한다.
new Tag(type)
생성자 단계는 다음과 같다:
-
parameters를 type["parameters"]로 둔다.
-
wasmParameters를 «»로 둔다.
-
각 type ∈ parameters에 대해,
-
Append ToValueType(type) → wasmParameters.
-
-
store를 현재 에이전트의 연결된 저장소로 둔다.
-
(store, tagAddress)를 tag_alloc(store, wasmParameters)로 둔다.
-
현재 에이전트의 연결된 저장소를 store로 설정한다.
-
Initialize this from tagAddress.
5.8. 가비지 컬렉션 객체
WebAssembly struct 또는 array는 JavaScript에서 Exported GC Object로 제공된다. Exported GC Object는 가비지 컬렉션되는 WebAssembly 참조 값을 감싸는 특수 객체이다. 대부분의 JavaScript 연산은 Exported GC Object에 대해 예외를 던지거나 undefined를 반환한다.
참고: 이러한 연산은 향후 JavaScript에서 WebAssembly struct와 array와의 더 풍부한 상호작용을 허용하도록 개선될 수 있다.
Exported GC Object는 [[ObjectAddress]] 내부 슬롯을 포함하며, 이 슬롯에는 object address가 저장되며, 이는 주변 에이전트의 연결된 저장소를 기준으로 한다. 또한 문자열 값 "struct" 또는 "array"를 저장하는 [[ObjectKind]] 내부 슬롯을 가진다.
Exported GC Object의 내부 메서드는 다음 구현을 사용한다.
-
null을 반환한다.
-
false를 반환한다.
-
false를 반환한다.
-
false를 반환한다.
-
undefined를 반환한다.
-
false를 반환한다.
-
false를 반환한다.
-
undefined를 반환한다.
-
TypeError를 던진다.
-
TypeError를 던진다.
-
keys를 새로운 빈 리스트로 둔다.
-
keys를 반환한다.
-
Assert: objectkind는 "array" 또는 "struct"이다.
-
map을 주변 에이전트에 연계된 exported GC object cache로 둔다.
-
map[objectaddr]가 exists이면,
-
map[objectaddr]를 반환한다.
-
-
object를 MakeBasicObject(« [[ObjectAddress]] »)로 둔다.
-
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 ([EnforceRange ]unsigned long );index boolean is (Tag );exceptionTag readonly attribute (DOMString or undefined )stack ; };
Exception
값은 예외를 나타낸다.
Exception 객체를 초기화하여 exn을 Exception address exnAddress로부터 생성하려면, 다음 단계를 수행한다:
-
map을 주변 에이전트에 연계된 Exception object cache로 둔다.
-
Assert: map[exnAddress]는 exist하지 않는다.
-
exn.[[Address]]를 exnAddress로 설정한다.
-
Set map[exnAddress] = exn.
-
tagaddr를 exn_tag(store, exnAddress)로 둔다.
-
payload를 exn_read(store, exnAddress)로 둔다.
-
exn.[[Type]]을 tagaddr로 설정한다.
-
exn.[[Payload]]를 payload로 설정한다.
-
exn.[[Stack]]을 undefined로 설정한다.
Exception 객체를 생성하기 위해 exception address exnAddress로부터 다음 단계를 수행한다:
-
map을 주변 에이전트에 연계된 Exception object cache로 둔다.
-
map[exnAddress]가 exists이면,
-
map[exnAddress]를 반환한다.
-
-
Initialize exn from exnAddress.
-
exn을 반환한다.
new Exception(exceptionTag, payload, options)
생성자 단계는 다음과 같다:
-
JSTagAddr를 JavaScript 예외 태그를 가져오기의 결과로 둔다.
-
exceptionTag.[[Address]]가 JSTagAddr와 같다면,
-
TypeError를 던진다.
-
-
[types] → []를 tag_type(store, exceptionTag.[[Address]])로 둔다.
-
-
TypeError를 던진다.
-
-
wasmPayload를 « »로 둔다.
-
각 value 및 resultType을 payload와 types에서 선형으로 짝지어,
-
(store, exceptionAddr)를 exn_alloc(store, exceptionTag.[[Address]], wasmPayload)로 둔다.
-
Initialize this from exceptionAddr.
-
options["traceStack"]이 true이면,
-
this.[[Stack]]을 현재 호출 스택의
DOMString표현 또는 undefined로 설정한다.
-
getArg(index) 메서드 단계는 다음과 같다:
-
tagaddr를 exn_tag(store, this.[[Address]])로 둔다.
-
payload를 exn_read(store, this.[[Address]])로 둔다.
-
Assert: 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 exception tag는 주변 에이전트에 연계된 tag address이다. 처음 사용 시 에이전트의 연결된 저장소에 할당되고 캐시된다. 항상 tag type « externref » → « »를 가진다.
JavaScript 예외 태그를 가져오기 위해 다음 단계를 수행한다:
-
주변 에이전트에 연계된 JavaScript exception tag가 초기화되어 있다면,
-
return the surrounding agent’s associated JavaScript exception tag
-
-
(store, tagAddress)를 tag_alloc(store, « externref » → « »)로 둔다.
-
현재 에이전트의 연결된 저장소를 store로 설정한다.
-
현재 에이전트에 연계된 JavaScript exception tag를 tagAddress로 설정한다.
-
return tagAddress.
5.10. 오류 객체
WebAssembly는 다음 오류 클래스를 정의한다: CompileError, LinkError, 그리고 RuntimeError.
WebAssembly
네임스페이스에 대한 네임스페이스 객체가 생성될 때, 다음 단계를 수행해야 한다:
-
namespaceObject를 네임스페이스 객체로 둔다.
-
각 error ∈ « "CompileError", "LinkError", "RuntimeError" »에 대해,
-
constructor를 새로운 객체로 두되, 이는 NativeError 객체 구조를 구현하고, NativeError를 error로 설정한다.
-
! DefineMethodProperty(namespaceObject, error, constructor, false).
-
참고: 이는 CompileError,
LinkError,
그리고 RuntimeError
클래스를 WebAssembly
네임스페이스에 정의하며, 이는 이 명세의 API에서 생성된다.
이들은 TypeError
및 RangeError
같은 네이티브 JavaScript 오류와 동일한 인터페이스를 노출한다.
참고: 현재 Web IDL만으로는 이 동작을 정의할 수 없다.
6. 내장 함수(Builtins)
JS-API는 모듈을 컴파일할 때 options
를 통해 import할 수 있는 내장 함수 집합을 정의한다. WebAssembly 내장 함수는 기존 JavaScript 내장 함수에 대응하며, 최소한의 오버헤드로 WebAssembly 함수로
직접 사용할 수 있도록 조정된다.
모든 내장 함수들은 집합으로 묶인다. 각 내장 함수 집합은 WebAssemblyCompileOptions에서
사용되는 name과,
import 조회 시 사용되는
wasm: 접두사가 붙은 qualified name을 가진다.
builtinSetName에 대한 내장 함수 집합의 함수들을 가져오려면, 다음 단계를 수행한다:
-
이 절에서 정의된 이름이 builtinSetName인 집합에 대해 (name, funcType, steps)의 리스트를 반환한다.
import와 활성화된 내장 집합 builtinSetNames에 대해 내장 함수를 찾으려면, 다음 단계를 수행한다:
-
Assert: validate builtin set names builtinSetNames는 true이다.
-
importModuleName을 import[0]으로 둔다.
-
importName을 import[1]로 둔다.
-
각 builtinSetName ∈ builtinSetNames에 대해,
-
builtinSetName이 내장 함수 집합을 가리키지 않으면, continue.
-
builtinSetQualifiedName을 "wasm:"이 접두사로 붙은 builtinSetName으로 둔다.
-
importModuleName이 builtinSetQualifiedName과 같다면,
-
builtins를 get the builtins for a builtin set builtinSetName의 결과로 둔다.
-
각 builtin ∈ builtins에 대해,
-
builtinName을 builtin[0]으로 둔다.
-
importName이 builtinName과 같다면, (builtinSetName, builtin)을 반환한다.
-
-
-
-
null을 반환한다.
builtinSetNames에 대해 내장 집합 이름을 검증하려면, 다음 단계를 수행한다:
-
builtinSetNames에 중복이 하나라도 있으면, false를 반환한다.
-
true를 반환한다.
타입 funcType과 실행 단계 steps로부터 내장 함수를 생성하려면, 다음 단계를 수행한다:
-
hostfunc를 호출 시 steps를 실행하는 호스트 함수로 둔다.
-
(store, funcaddr)를 func_alloc(store, functype, hostfunc)로 둔다.
-
funcaddr를 반환한다.
이름이 builtinSetName인 내장 집합을 인스턴스화하려면, 다음 단계를 수행한다:
-
builtins를 get the builtins for a builtin set builtinSetName의 결과로 둔다.
-
exportsObject를 ! OrdinaryObjectCreate(null)로 둔다.
-
각 (name, funcType, steps) ∈ builtins에 대해,
-
funcaddr를 create a builtin function (funcType, steps)의 결과로 둔다.
-
func를 a new Exported Function을 funcaddr로부터 생성한 결과로 둔다.
-
value를 func로 둔다.
-
status를 ! CreateDataProperty(exportsObject, name, value)로 둔다.
-
Assert: status는 true이다.
-
-
exportsObject를 반환한다.
import와 활성화된 내장 집합 builtinSetNames에 대해 내장 함수용 import를 검증하려면, 다음 단계를 수행한다:
-
Assert: validate builtin set names builtinSetNames는 true이다.
-
maybeBuiltin을 find a builtin(import, builtinSetNames)의 결과로 둔다.
-
maybeBuiltin이 null이면, true를 반환한다.
-
importExternType을 import[2]로 둔다.
-
builtinFuncType을 maybeBuiltin[0][1]로 둔다.
-
builtinExternType을
func |builtinFuncType|로 둔다. -
match_externtype(builtinExternType, importExternType)의 결과를 반환한다.
6.1. String Builtins
문자열 빌트인은 String
내장 객체의 인터페이스를 조정한다. 이 집합의 name은 js-string이고,
qualified
name은 wasm:js-string이다.
참고: 본 절의 알고리즘은 String에 정의된 JS 빌트인을 참조한다. 이는 실제 빌트인을 가리키며 String 객체에 대한 동적 조회를 수행하지 않는다.
6.1.1. 추상 연산
UnwrapString(v) 추상 연산은 호출 시 다음 단계를 수행한다:
-
v가 String이 아니면,
-
trap이 실행된 것처럼
RuntimeError예외를 던진다.
-
-
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 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를 length(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)으로 둔다.
-
string의 length를 반환한다.
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 export를 계속 호출할 수 있으므로, 일반적으로 trap은 향후 실행을 방해하지 않는다.
7.1. 스택 오버플로
WebAssembly 코드에서 스택 오버플로가 발생할 때마다, JavaScript에서의 스택 오버플로와 동일한 종류의 예외가 던져진다. 구체적인 예외 종류는 두 경우 모두 구현 정의이다.
참고: ECMAScript는 스택 오버플로 시의 동작을 명시하지 않는다.
구현에서는 RangeError,
InternalError 또는 Error를 던지는 것이 관찰되었다. 여기서는 어떤 것이라도 유효하다.
7.2. 메모리 부족
검증, 컴파일 또는 인스턴스화 중에 메모리가 부족해지는 경우마다, JavaScript에서의 메모리 부족 상황과 동일한 종류의 예외가 던져진다. 구체적인 예외 종류는 두 경우 모두 구현 정의이다.
참고: ECMAScript는 메모리 부족 상황에 대한 동작을 명시하지 않는다. 구현에서는 OOMError를 던지거나 크래시하는 것이 관찰되었다. 둘 다 여기서는 유효하다.
-
RangeError, 이는Memorygrow()및Tablegrow()연산에서 지정된 바와 같다. -
memory.grow 명령이 -1을 반환하는 경우
-
이 절에 설명된 UA별 메모리 부족 동작
자세한 논의는 Issue 879를 참고하라.
8. 구현 정의 한계
WebAssembly 코어 명세는 구현이 모듈의 문법 구조에 대한 한계를 정의하도록 허용한다.
각 WebAssembly 임베딩은 자체 한계를 정의할 수 있지만, 예측 가능성을 위해
본 문서에서 설명하는 표준 WebAssembly JavaScript 인터페이스는 다음의 정확한 한계를 정의한다.
구현은 아래 한계 중 하나를 초과하는 모듈을 CompileError로
거부해야 한다.
실제로는, 구현이 아래 한계 미만의 유효한 모듈에 대해서도 자원이 부족할 수 있다.
- 모듈의 최대 크기는 1,073,741,824 바이트(1 GiB)이다.
- type 섹션에 정의 가능한 타입의 최대 개수는 1,000,000이다.
- type 섹션에 정의 가능한 재귀 그룹의 최대 개수는 1,000,000이다.
- 하나의 재귀 그룹에 정의 가능한 타입의 최대 개수는 1,000,000이다.
- 정의된 서브타입 계층의 최대 깊이는 63이다(슈퍼타입 없이 정의된 타입의 깊이는 0).
- 모듈에 정의 가능한 함수의 최대 개수는 1,000,000이다.
- 모듈에 선언 가능한 import의 최대 개수는 1,000,000이다.
- 모듈에 선언 가능한 export의 최대 개수는 1,000,000이다.
- 모듈에 정의 가능한 글로벌의 최대 개수는 1,000,000이다.
- 모듈에 정의 가능한 태그의 최대 개수는 1,000,000이다.
- 모듈에 정의 가능한 데이터 세그먼트의 최대 개수는 100,000이다.
- 선언 또는 import된 테이블을 포함한 테이블의 최대 개수는 100,000이다.
- 테이블의 최대 크기는 10,000,000이다.
- 어떤 테이블 초기화에서도 테이블 엔트리의 최대 개수는 10,000,000이다.
- 정의 및 import된 메모리를 포함한 메모리의 최대 개수는 100이다.
- 32비트 메모리의
min또는max필드의 최대값은 65,536 페이지(4 GiB)이다. - 64비트 메모리의
min또는max필드의 최대값은 2^37-1 페이지(2^53 - 2^16 바이트)이다. - 어떤 함수 또는 블록에도 최대 매개변수 개수는 1,000이다.
- 어떤 함수 또는 블록에도 최대 반환값 개수는 1,000이다.
- 로컬 선언을 포함한 함수 본문의 최대 크기는 7,654,321 바이트이다.
- 매개변수로서 암묵적으로 선언된 것을 포함해, 함수에서 선언 가능한 로컬의 최대 개수는 50,000이다.
- struct의 최대 필드 개수는 10,000이다.
array.new_fixed의 최대 피연산자 개수는 10,000이다.
다음 한계 중 하나가 런타임 중에 초과되면, 구현은 RuntimeError를
던져야 한다:
실제로는, 구현이 아래 한계 미만의 유효한 모듈에 대해서도 자원이 부족할 수 있다.
- 테이블의 최대 크기는 10,000,000이다.
- 32비트 메모리의 최대 크기는 65,536 페이지(4 GiB)이다.
- 64비트 메모리의 최대 크기는 262,144 페이지(16 GiB)이다.
9. 보안 및 프라이버시 고려사항
이 절은 비규범적이다.
이 문서는 WebAssembly를 위한 호스트 환경을 정의한다. 이는 WebAssembly 인스턴스가 import 객체에서 JavaScript 객체와 함수를 가져오도록 허용하지만, 그 외에는 임베딩 환경에 대한 접근을 제공하지 않는다. 따라서 WebAssembly 인스턴스는 JavaScript와 동일한 제약에 묶인다.
10. 변경 이력
이 절은 비규범적이다.
WebAssembly 명세 원본 1.0 릴리스 이후, 여러 확장 제안이 통합되었다. 다음 절들은 어떤 변화가 있었는지 개요를 제공한다.