WebAssembly 자바스크립트 인터페이스

W3C 후보 권고안 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/CRD-wasm-js-api-2-20251102/
최신 공개 버전:
https://www.w3.org/TR/wasm-js-api-2/
편집자 초안:
https://webassembly.github.io/spec/js-api/
역사:
https://www.w3.org/standards/history/wasm-js-api-2/
구현 보고서:
https://webassembly.org/features/
피드백:
GitHub
명세 내 인라인
편집자:
Ms2ger (Igalia)
이슈 추적:
GitHub Issues

요약

이 문서는 WebAssembly와 상호작용하기 위한 명시적인 자바스크립트 API를 제공합니다.

이는 관련 문서 모음의 일부입니다: WebAssembly 코어 명세, WebAssembly JS 인터페이스, 그리고 WebAssembly 웹 API입니다.

이 문서의 상태

이 섹션은 문서가 출판될 당시의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 버전은 W3C 기술 보고서 색인에서 확인할 수 있습니다.

이 문서는 WebAssembly 워킹 그룹에 의해 권고안 트랙을 따라 후보 권고안 초안으로 출판되었습니다.

후보 권고안으로 출판된다고 해서 W3C 및 그 회원의 승인을 의미하는 것은 아닙니다. 후보 권고안 초안은 워킹 그룹이 후속 후보 권고안 스냅샷에 포함하고자 하는 이전 후보 권고안의 변경 사항을 통합한 것입니다.

WebAssembly 워킹 그룹은 이 문서를 후보 권고안 상태로 계속 유지하면서 "살아있는 표준(living standard)"으로 지속적으로 업데이트할 계획입니다. 어떤 경우에도 권고(REC) 전환은 2025년 12월 2일 이전에는 요청되지 않습니다.

이 문서는 언제든지 유지 및 업데이트될 수 있습니다. 일부 내용은 작성 중일 수 있습니다.

이 명세에 대한 논의는 GitHub Issues에서 하는 것이 좋으며, 모든 이슈 및 의견은 아카이브됩니다.

이 문서는 WebAssembly 워킹 그룹에서 작성하였습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성된 것입니다. W3C는 해당 그룹 결과물과 관련한 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개에 관한 안내도 포함되어 있습니다. 특정 특허에 필수 청구항(Essential Claim(s))이 포함되었다고 실제로 아는 경우, 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

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)을 가집니다:

5. WebAssembly 네임스페이스

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

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

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

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

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

    readonly attribute Tag JSTag;
};
WebAssembly 모듈 컴파일을 source 바이트 bytes로부터 수행하려면, 다음 단계를 따른다:
  1. modulemodule_decode(bytes) 결과로 둔다. module오류(error)라면, 오류(error)를 반환한다.

  2. module_validate(module)가 오류(error)라면, 오류(error)를 반환한다.

  3. module을 반환한다.

WebAssembly 모듈에 대해 builtins 및 import된 문자열을 검증을 module module, 활성화된 builtins builtinSetNames, importedStringModule로부터 수행하려면 다음 단계를 따른다:

  1. builtin set 이름 검증builtinSetNames에 대해 false면, false를 반환한다.

  2. import에 대해 module_imports(module)를 순회한다,

    1. importedStringModule이 null이 아니고 import[0]이 importedStringModule과 같으면,

      1. importExternTypeimport[2]로 둔다.

      2. stringExternTypeglobal const (ref extern)으로 둔다.

      3. match_externtype(stringExternType, importExternType)이 false라면, false를 반환한다.

    2. 그 외의 경우,

      1. 내장용 import 검증importbuiltinSetNames로 false라면, false를 반환한다.

  3. true를 반환한다.

validate(bytes, options) 메서드는, 호출되면 다음 단계를 수행한다:
  1. stableBytes버퍼가 보유한 바이트의 복사본 bytes로 둔다.

  2. 컴파일을 통해 stableBytes를 WebAssembly 모듈로 만들고 결과를 module로 저장한다.

  3. moduleerror라면, false를 반환한다.

  4. builtinSetNamesoptions["builtins"]로 둔다.

  5. importedStringModuleoptions["importedStringConstants"]로 둔다.

  6. builtins 및 import된 문자열 검증module, builtinSetNames, importedStringModule에 대해 false를 반환하면, false를 반환한다.

  7. true를 반환한다.

Module 객체는 단일 WebAssembly 모듈을 나타낸다. 각 Module 객체는 다음 내부 슬롯을 가진다:

WebAssembly 모듈 객체를 구성하려면 모듈 module, 소스 바이트 bytes, 활성화된 builtins builtinSetNames, 그리고 importedStringModule로부터 다음 단계를 수행한다:
  1. moduleObject를 새로운 Module 객체로 둔다.

  2. moduleObject.[[Module]]를 module로 설정한다.

  3. moduleObject.[[Bytes]]를 bytes로 설정한다.

  4. moduleObject.[[BuiltinSets]]를 builtinSetNames로 설정한다.

  5. moduleObject.[[ImportedStringModule]]를 importedStringModule로 설정한다.

  6. moduleObject를 반환한다.

WebAssembly 모듈을 비동기적으로 컴파일하려면 소스 바이트 bytesWebAssemblyCompileOptions options을 사용하고, 선택적 작업 소스 taskSource로 다음 단계를 수행한다:
  1. promise새로운 프로미스로 둔다.

  2. 다음 단계를 병렬로 수행한다:

    1. WebAssembly 모듈을 컴파일하여 bytes의 결과를 module로 저장한다.

    2. 태스크를 큐에 넣어 다음 단계를 수행한다. taskSource가 제공되었다면, 그 작업 소스에 태스크를 큐에 넣는다.

      1. moduleerror이면, promiseCompileError 예외로 거부한다.

      2. builtinSetNamesoptions["builtins"]로 둔다.

      3. importedStringModuleoptions["importedStringConstants"]로 둔다.

      4. builtins 및 import된 문자열 검증module, builtinSetNames, importedStringModule에 대해 false이면, promiseCompileError 예외로 거부한다.

      5. 그렇지 않다면,

        1. WebAssembly 모듈 객체를 구성하여 module, bytes, builtinSetNames, importedStringModule로부터 결과를 moduleObject로 둔다.

        2. Resolve promise with moduleObject.

  3. promise를 반환한다.

compile(bytes, options) 메서드는, 호출되면 다음 단계를 수행한다:
  1. stableBytes버퍼가 보유한 바이트의 복사본 bytes로 둔다.

  2. WebAssembly 모듈을 비동기적으로 컴파일하여 stableBytesoptions를 사용하고 그 결과를 반환한다.

import된 문자열을 인스턴스화하려면 모듈 moduleimportedStringModule로 다음 단계를 수행한다:

  1. Assert: importedStringModule은 null이 아니다.

  2. exportsObject! OrdinaryObjectCreate(null)로 둔다.

  3. (moduleName, componentName, externtype) ∈ module_imports(module)에 대해,

    1. moduleNameimportedStringModule과 같지 않다면, continue.

    2. stringConstantcomponentName으로 둔다.

    3. status! CreateDataProperty(exportsObject, stringConstant, stringConstant)로 둔다.

    4. Assert: status는 true이다.

  4. exportsObject를 반환한다.

WebAssembly 모듈 module의 import들을, imports 객체 importObject, 활성화된 builtins builtinSetNames, importedStringModule로부터 읽어들인다: 다음 단계를 수행한다:
  1. module.imports비어 있지 않고, importObject가 undefined라면, TypeError 예외를 던진다.

  2. builtinOrStringImports를 순서 있는 맵 « »로 둔다.

  3. builtinSetNamebuiltinSetNames에 대해,

    1. Assert: builtinOrStringImportsbuiltinSetName을 포함하지 않는다.

    2. builtinSetName이 builtin set을 가리키지 않으면, continue.

    3. exportsObjectbuiltin set 인스턴스화의 결과로, builtinSetName을 사용하여 둔다.

    4. builtinSetQualifiedName을 "wasm:" 접두어를 붙인 builtinSetName으로 둔다>

    5. Set builtinOrStringImports[builtinSetQualifiedName] = exportsObject

  4. importedStringModule이 null이 아니라면,

    1. exportsObjectimport된 문자열 인스턴스화 결과로, moduleimportedStringModule을 사용하여 둔다.

    2. Set builtinOrStringImports[importedStringModule] = exportsObject

  5. imports를 « »로 둔다.

  6. (moduleName, componentName, externtype) ∈ module_imports(module)에 대해,

    1. builtinOrStringImportsmoduleName를 포함한다면,

      1. obuiltinOrStringImports[moduleName]로 둔다.

      2. o객체가 아니거나 또는 ocomponentName을 포함하지 않으면,

        1. o? Get(importObject, moduleName)으로 설정한다.

    2. 그 외의 경우,

      1. o? Get(importObject, moduleName)으로 둔다.

    3. o객체가 아니면, TypeError 예외를 던진다.

    4. v? Get(o, componentName)로 둔다.

    5. externtypefunc functype 형태라면,

      1. IsCallable(v)가 false면, LinkError 예외를 던진다.

      2. v가 [[FunctionAddress]] 내부 슬롯을 가지므로 Exported Function이라면,

        1. funcaddrv의 [[FunctionAddress]] 내부 슬롯의 값으로 둔다.

      3. 그 외의 경우,

        1. 호스트 함수 생성vfunctype으로 수행하고, 결과를 funcaddr로 둔다.

        2. indeximports 내 외부 함수의 개수로 둔다. 이 값 index호스트 함수의 인덱스 funcaddr로 알려진다.

      4. externfuncexternal value func funcaddr로 둔다.

      5. Append externfuncimports.

    6. externtypeglobal mut valtype 형태라면,

      1. vimplements Global이면,

        1. globaladdrv.[[Global]]로 둔다.

      2. 그렇지 않다면,

        1. valtypei64이고 vBigInt가 아니면,

          1. LinkError 예외를 던진다.

        2. valtypei32, f32, f64 중 하나이고 vNumber가 아니면,

          1. LinkError 예외를 던진다.

        3. valtypev128이면,

          1. LinkError 예외를 던진다.

        4. valueToWebAssemblyValue(v, valtype)로 둔다. 이 연산이 TypeError를 던지면, 이를 잡아 LinkError 예외를 던진다.

        5. store주변 에이전트연결된 저장소로 둔다.

        6. (store, globaladdr)를 global_alloc(store, const valtype, value)로 둔다.

        7. 주변 에이전트연결된 저장소store로 설정한다.

      3. externglobalglobal globaladdr로 둔다.

      4. Append externglobalimports.

    7. externtypemem memtype 형태라면,

      1. vimplement Memory를 하지 않으면, LinkError 예외를 던진다.

      2. externmemexternal value mem v.[[Memory]]로 둔다.

      3. Append externmemimports.

    8. externtypetable tabletype 형태라면,

      1. vimplement Table을 하지 않으면, LinkError 예외를 던진다.

      2. tableaddrv.[[Table]]로 둔다.

      3. externtableexternal value table tableaddr로 둔다.

      4. Append externtableimports.

    9. externtypetag attribute functype 형태라면,

      1. Assert: attributeexception이다.

      2. vimplement Tag를 하지 않으면, LinkError 예외를 던진다.

      3. tagaddrv.[[Address]]로 둔다.

      4. externtagexternal value tag tagaddr로 둔다.

      5. Append externtagimports.

  7. imports를 반환한다.

Note: 이 알고리즘은 올바른 종류의 JavaScript 값이 전달되는지만 검증한다. WebAssembly 타입 요구사항의 검증은 "WebAssembly 모듈의 코어 인스턴스화" 알고리즘으로 연기된다.

WebAssembly 모듈 module과 인스턴스 instance로부터 exports 객체를 생성하려면, 다음 단계를 수행한다:
  1. exportsObject! OrdinaryObjectCreate(null)로 둔다.

  2. (name, externtype) ∈ module_exports(module)에 대해,

    1. externvalinstance_export(instance, name)로 둔다.

    2. Assert: externvalerror가 아니다.

    3. externtypefunc functype 형태라면,

      1. Assert: externvalfunc funcaddr 형태이다.

      2. func funcaddrexternval로 둔다.

      3. func새로운 Exported Functionfuncaddr로부터 생성한 결과로 둔다.

      4. valuefunc로 둔다.

    4. externtypeglobal mut globaltype 형태라면,

      1. Assert: externvalglobal globaladdr 형태이다.

      2. global globaladdrexternval로 둔다.

      3. global새로운 Global 객체로, globaladdr로부터 생성한다.

      4. valueglobal로 둔다.

    5. externtypemem memtype 형태라면,

      1. Assert: externvalmem memaddr 형태이다.

      2. mem memaddrexternval로 둔다.

      3. memory새로운 Memory 객체로, memaddr로부터 생성한다.

      4. valuememory로 둔다.

    6. externtypetable tabletype 형태라면,

      1. Assert: externvaltable tableaddr 형태이다.

      2. table tableaddrexternval로 둔다.

      3. table새로운 Table 객체로, tableaddr로부터 생성한다.

      4. valuetable로 둔다.

    7. externtypetag attribute functype 형태라면,

      1. Assert: attributeexception이다.

      2. Assert: externvaltag tagaddr 형태이다.

      3. tag tagaddrexternval로 둔다.

      4. tag새로운 Tag 객체로, tagaddr로부터 생성한다.

      5. valuetag로 둔다.

    8. status! CreateDataProperty(exportsObject, name, value)로 둔다.

    9. Assert: status는 true이다.

    Note: WebAssembly 모듈 검증 중 수행되는 유효성 및 고유성 검사는 각 프로퍼티 이름이 유효하며 중복 정의되지 않음을 보장한다.

  3. ! SetIntegrityLevel(exportsObject, "frozen")을 수행한다.

  4. exportsObject를 반환한다.

WebAssembly 모듈 module과 인스턴스 instance로부터 인스턴스 객체 초기화 instanceObject를 수행하려면 다음 단계를 따른다:
  1. exports 객체 생성moduleinstance로 수행하고, 결과를 exportsObject로 둔다.

  2. instanceObject.[[Instance]]를 instance로 설정한다.

  3. instanceObject.[[Exports]]를 exportsObject로 설정한다.

모듈 module과 import들 imports로부터 WebAssembly 모듈의 코어를 인스턴스화하려면, 다음 단계를 수행한다:
  1. store주변 에이전트연결된 저장소로 둔다.

  2. resultmodule_instantiate(store, module, imports)로 둔다.

  3. resulterror이면, 적절한 예외 유형을 던진다:

    • 링킹 중 대부분의 경우에 대해 LinkError 예외.

    • start 함수 실행 중 발생한 오류라면, WebAssembly로부터 발생하는 대부분의 오류에 대해 RuntimeError를, 또는 내부 ECMAScript 코드에서 전파된 오류 객체를 던진다.

    • 그 외 적절하다면 다른 오류 타입(예: out-of-memory 예외). 자세한 내용은 WebAssembly 오류 매핑에 문서화되어 있다.

  4. (store, instance)를 result로부터 둔다.

  5. 주변 에이전트연결된 저장소store로 설정한다.

  6. instance를 반환한다.

Module moduleObject와 imports importObject로부터 WebAssembly 모듈을 비동기적으로 인스턴스화하려면, 다음 단계를 수행한다:
  1. promise새로운 프로미스로 둔다.

  2. modulemoduleObject.[[Module]]로 둔다.

  3. builtinSetNamesmoduleObject.[[BuiltinSets]]로 둔다.

  4. importedStringModulemoduleObject.[[ImportedStringModule]]로 둔다.

  5. import 읽기module에 대해, importObject, builtinSetNames, importedStringModule와 함께 수행하고, 결과를 imports로 둔다. 이 연산이 예외를 던지면 이를 잡아, reject promise with 그 예외, 그리고 promise를 반환한다.

  6. 다음 단계를 병렬로 수행한다:

    1. 태스크를 큐에 넣어 다음 단계를 수행한다: Note: 구현별 작업이 여기서 수행될 수 있다.

      1. WebAssembly 모듈의 코어 인스턴스화moduleimports로 수행하고, 결과를 instance로 둔다. 예외가 던져지면 이를 잡아, reject promise with 그 예외, 그리고 이 하위단계를 종료한다.

      2. instanceObjectnew Instance로 둔다.

      3. 초기화instanceObject에 대해 moduleinstance로 수행한다. 이 연산이 예외를 던지면 이를 잡아, reject promise with 그 예외, 그리고 이 하위단계를 종료한다.

      4. Resolve promise with instanceObject.

  7. promise를 반환한다.

모듈의 프로미스를 인스턴스화 promiseOfModule를 imports importObject와 함께 수행하려면, 다음 단계를 따른다:
  1. promise새로운 프로미스로 둔다.

  2. React to promiseOfModule:

    • promiseOfModule이 값 module로 이행되었다면:

      1. WebAssembly 모듈 인스턴스화module에 대해, importObject를 import하여 수행하고, 결과를 innerPromise로 둔다.

      2. React to innerPromise:

    • promiseOfModule가 이유 reason으로 거부되었다면:

      1. Reject promise with reason.

  3. promise를 반환한다.

instantiate(bytes, importObject, options) 메서드는, 호출되면 다음 단계를 수행한다:
  1. stableBytes버퍼가 보유한 바이트의 복사본 bytes로 둔다.

  2. WebAssembly 모듈을 비동기적으로 컴파일하여 stableBytesoptions를 사용하고, 결과를 promiseOfModule로 둔다.

  3. Instantiate promiseOfModule를 imports importObject와 함께 수행하고 그 결과를 반환한다.

instantiate(moduleObject, importObject) 메서드는, 호출되면 다음 단계를 수행한다:
  1. WebAssembly 모듈을 비동기적으로 인스턴스화 moduleObjectimportObject를 import하여 수행하고, 그 결과를 반환한다.

Note: 후속 스트리밍 API는 WebAssembly Web API에 문서화되어 있다.

WebAssembly 네임스페이스의 JSTag 속성 getter는, 호출되면 다음 단계를 수행한다:

  1. JSTagAddrJavaScript 예외 태그 가져오기의 결과로 둔다.

  2. JSTagObjectTag 객체 생성으로, JSTagAddr로부터 생성한 결과로 둔다.

  3. JSTagObject를 반환한다.

5.1. 모듈

enum ImportExportKind {
  "function",
  "table",
  "memory",
  "global",
  "tag"
};

enum AddressType {
  "i32",
  "i64",
};

typedef any AddressValue;

dictionary ModuleExportDescriptor {
  required USVString name;
  required ImportExportKind kind;
  // Note: Other fields such as signature may be added in the future.
};

dictionary ModuleImportDescriptor {
  required USVString module;
  required USVString name;
  required ImportExportKind kind;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Module {
  constructor(BufferSource bytes, optional WebAssemblyCompileOptions options = {});
  static sequence<ModuleExportDescriptor> exports(Module moduleObject);
  static sequence<ModuleImportDescriptor> imports(Module moduleObject);
  static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
};
extern 타입의 문자열 값 type은 다음과 같다
exports(moduleObject) 메서드는, 호출되면 다음 단계를 수행한다:
  1. modulemoduleObject.[[Module]]로 둔다.

  2. exports를 « »로 둔다.

  3. For each (name, type) ∈ module_exports(module)에 대해,

    1. kindextern 타입의 문자열 값 type으로 둔다.

    2. obj를 «[ "name" → name, "kind" → kind ]»로 둔다.

    3. Append objexports.

  4. exports를 반환한다.

imports(moduleObject) 메서드는, 호출되면 다음 단계를 수행한다:
  1. modulemoduleObject.[[Module]]로 둔다.

  2. builtinSetNamesmoduleObject.[[BuiltinSets]]로 둔다.

  3. importedStringModulemoduleObject.[[ImportedStringModule]]로 둔다.

  4. imports를 « »로 둔다.

  5. For each (moduleName, name, type) ∈ module_imports(module)에 대해,

    1. (moduleName, name, type) 및 builtinSetNames에 대해 find a builtin 결과가 null이 아니면, continue.

    2. importedStringModule이 null이 아니고 moduleNameimportedStringModule과 같으면, continue.

    3. kindextern 타입의 문자열 값 type으로 둔다.

    4. obj를 «[ "module" → moduleName, "name" → name, "kind" → kind ]»로 둔다.

    5. Append objimports.

  6. imports를 반환한다.

customSections(moduleObject, sectionName) 메서드는, 호출되면 다음 단계를 수행한다:
  1. bytesmoduleObject.[[Bytes]]로 둔다.

  2. customSections를 « »로 둔다.

  3. For each custom section customSectionbytes에 대해, module grammar에 따라 해석한다,

    1. namecustomSectionnameUTF-8로 디코딩한 값으로 둔다.

    2. Assert: name은 failure가 아니다 (moduleObject.[[Module]]은 valid이다).

    3. name이 문자열 값으로 sectionName과 같다면,

      1. Append — 이 customsec production이 매치한 범위의 bytes 바이트를 복사해 담은 새로운 ArrayBuffercustomSections에 추가한다.

  4. customSections를 반환한다.

Module(bytes, options) 생성자는, 호출되면 다음 단계를 수행한다:
  1. stableBytes버퍼가 보유한 바이트의 복사본 bytes로 둔다.

  2. WebAssembly 모듈을 컴파일하여 stableBytes의 결과를 module로 저장한다.

  3. moduleerror라면, CompileError 예외를 던진다.

  4. builtinSetNamesoptions["builtins"]로 둔다.

  5. importedStringModuleoptions["importedStringConstants"]로 둔다.

  6. builtins 및 import된 문자열 검증module, builtinSetNames, importedStringModule에 대해 false를 반환하면, CompileError 예외를 던진다.

  7. this.[[Module]]를 module로 설정한다.

  8. this.[[Bytes]]를 stableBytes로 설정한다.

  9. this.[[BuiltinSets]]를 builtinSetNames로 설정한다.

  10. 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) 생성자는, 호출되면 다음 단계를 수행한다:
  1. modulemodule.[[Module]]로 둔다.

  2. builtinSetNamesmodule.[[BuiltinSets]]로 둔다.

  3. importedStringModulemodule.[[ImportedStringModule]]로 둔다.

  4. Read the importsmodule에 대해, imports importObject, builtinSetNames, importedStringModule로 수행하고, 결과를 imports로 둔다.

  5. WebAssembly 모듈의 코어 인스턴스화moduleimports로 수행하고, 결과를 instance로 둔다.

  6. Initialize를 통해 thismoduleinstance로부터 초기화한다.

Note: 일부 구현은 인스턴스화 시 장시간 컴파일 작업을 수행할 수 있으므로, 이 동기 API 사용은 지양된다.

Instanceexports 속성 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 address memaddr로부터 고정 길이 메모리 버퍼를 생성하려면, 다음 단계를 수행한다:
  1. blockData Block으로 두되, 이는 identified with를 통해 memaddr의 기반 메모리와 연결된다.

  2. buffer를 새로운 ArrayBuffer로 두고, 내부 슬롯 [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]]를 갖도록 한다.

  3. buffer.[[ArrayBufferData]]를 block으로 설정한다.

  4. buffer.[[ArrayBufferByteLength]]를 block의 길이로 설정한다.

  5. buffer.[[ArrayBufferDetachKey]]를 "WebAssembly.Memory"로 설정한다.

  6. buffer를 반환한다.

memory address memaddrmaxsize로부터 리사이즈 가능한 메모리 버퍼를 생성하려면, 다음 단계를 수행한다:
  1. blockData Block으로 두되, 이는 identified with를 통해 memaddr의 기반 메모리와 연결된다.

  2. lengthblock의 길이로 둔다.

  3. buffer를 새로운 ArrayBuffer로 두고, 내부 슬롯 [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferMaxByteLength]], [[ArrayBufferDetachKey]]를 갖도록 한다.

  4. buffer.[[ArrayBufferData]]를 block으로 설정한다.

  5. buffer.[[ArrayBufferByteLength]]를 length로 설정한다.

  6. buffer.[[ArrayBufferMaxByteLength]]를 maxsize로 설정한다.

  7. buffer.[[ArrayBufferDetachKey]]를 "WebAssembly.Memory"로 설정한다.

  8. buffer를 반환한다.

memory address memaddr로부터 memory 메모리 객체를 초기화하려면, 다음 단계를 수행한다:
  1. mapsurrounding agent에 연계된 Memory object cache로 둔다.

  2. Assert: map[memaddr]는 exist하지 않는다.

  3. buffer고정 길이 메모리 버퍼 생성memaddr로 수행한 결과로 둔다.

  4. memory.[[Memory]]를 memaddr로 설정한다.

  5. memory.[[BufferObject]]를 buffer로 설정한다.

  6. Set map[memaddr] = memory.

memory address memaddr로부터 메모리 객체를 생성하려면, 다음 단계를 수행한다:
  1. mapsurrounding agent에 연계된 Memory object cache로 둔다.

  2. map[memaddr]가 exists이면,

    1. map[memaddr]를 반환한다.

  3. memorynew Memory로 둔다.

  4. Initialize memory from memaddr.

  5. memory를 반환한다.

Memory(descriptor) 생성자는, 호출되면 다음 단계를 수행한다:
  1. descriptor["address"]가 exists이면 addrtypedescriptor["address"]로, 그렇지 않으면 addrtype을 "i32"로 둔다.

  2. initial? AddressValueToU64(descriptor["initial"], addrtype)로 둔다.

  3. descriptor["maximum"]이 exists이면 maximum? AddressValueToU64(descriptor["maximum"], addrtype)로, 그렇지 않으면 maximum을 empty로 둔다.

  4. memtypememory type addrtype { min initial, max maximum }로 둔다.

  5. memtypevalid가 아니면, RangeError 예외를 던진다.

  6. storesurrounding agentassociated store로 둔다.

  7. (store, memaddr)를 mem_alloc(store, memtype)으로 둔다. 할당이 실패하면 RangeError 예외를 던진다.

  8. surrounding agentassociated storestore로 설정한다.

  9. Initialize this from memaddr.

memaddrMemory 버퍼를 새로고침하려면, 다음 단계를 수행한다:
  1. mapsurrounding agent에 연계된 Memory object cache로 둔다.

  2. Assert: map[memaddr]가 exists이다.

  3. memorymap[memaddr]로 둔다.

  4. buffermemory.[[BufferObject]]로 둔다.

  5. IsFixedLengthArrayBuffer(buffer)가 true이면,

    1. ! DetachArrayBuffer(buffer, "WebAssembly.Memory")를 수행한다.

    2. buffer고정 길이 메모리 버퍼 생성memaddr로 수행한 결과로 둔다.

    3. memory.[[BufferObject]]를 buffer로 설정한다.

  6. 그 외의 경우,

    1. blockData Block으로 두되, 이는 identified with를 통해 memaddr의 기반 메모리와 연결된다.

    2. buffer.[[ArrayBufferData]]를 block으로 설정한다.

    3. buffer.[[ArrayBufferByteLength]]를 block의 길이로 설정한다.

memory address memaddr에 연결된 메모리 버퍼를 delta만큼 확장하려면, 다음 단계를 수행한다:
  1. storesurrounding agentassociated store로 둔다.

  2. retmem_size(store, memaddr)로 둔다.

  3. storemem_grow(store, memaddr, delta)로 둔다.

  4. storeerror이면, RangeError 예외를 던진다.

  5. surrounding agentassociated storestore로 설정한다.

  6. Refresh the memory buffermemaddr에 대해 수행한다.

  7. ret를 반환한다.

grow(delta) 메서드는, 호출되면 다음 단계를 수행한다:
  1. memaddrthis.[[Memory]]로 둔다.

  2. storesurrounding agentassociated store로 둔다.

  3. addrtypeaddress type in mem_type(store, memaddr)로 둔다.

  4. delta64? AddressValueToU64(delta, addrtype)로 둔다.

  5. ret메모리 버퍼 확장memaddr에 대해 delta64만큼 수행한 결과로 둔다.

  6. U64ToAddressValue(ret, addrtype)를 반환한다.

WebAssembly memory.grow 명령이 실행된 직후, 다음 단계를 수행한다:

  1. 스택의 최상단이 i32.const (−1)이 아니라면,

    1. framecurrent frame으로 둔다.

    2. Assert: 검증에 의해, frame.module.memaddrs[0]가 존재한다.

    3. memaddr를 메모리 주소 frame.module.memaddrs[0]로 둔다.

    4. Refresh the memory buffermemaddr에 대해 수행한다.

toFixedLengthBuffer() 메서드는, 호출되면 다음 단계를 수행한다:
  1. bufferthis.[[BufferObject]]로 둔다.

  2. IsFixedLengthArrayBuffer(buffer)가 true이면, buffer를 반환한다.

  3. memaddrthis.[[Memory]]로 둔다.

  4. fixedBuffer고정 길이 메모리 버퍼 생성memaddr로 수행한 결과로 둔다.

  5. ! DetachArrayBuffer(buffer, "WebAssembly.Memory")를 수행한다.

  6. this.[[BufferObject]]를 fixedBuffer로 설정한다.

  7. fixedBuffer를 반환한다.

toResizableBuffer() 메서드는, 호출되면 다음 단계를 수행한다:
  1. memaddrthis.[[Memory]]로 둔다.

  2. storesurrounding agentassociated store로 둔다.

  3. memtypemem_type(store, memaddr)로 둔다.

  4. memtype에 max가 없으면,

    1. Throw TypeError 예외.

  5. bufferthis.[[BufferObject]]로 둔다.

  6. IsFixedLengthArrayBuffer(buffer)가 false이면, buffer를 반환한다.

  7. Assert: memtype은 max를 가진다.

  8. maxsizememtype의 max 값 * 65536으로 둔다.

  9. resizableBuffer리사이즈 가능한 메모리 버퍼 생성memaddrmaxsize로 수행한 결과로 둔다.

  10. ! DetachArrayBuffer(buffer, "WebAssembly.Memory")를 수행한다.

  11. this.[[BufferObject]]를 resizableBuffer로 설정한다.

  12. resizableBuffer를 반환한다.

ArrayBufferMemory 객체에 의해 반환될 때, 그 크기는 WebAssembly page size(상수 65536)의 배수여야 한다. 이 이유로 HostResizeArrayBuffer는 다음과 같이 재정의된다.

추상 연산 HostResizeArrayBuffer는 인수 buffer ( ArrayBuffer) 와 newLength를 받고, 호출 시 다음 단계를 수행한다.

  1. buffer.[[ArrayBufferDetachKey]]가 "WebAssembly.Memory"라면,

    1. mapsurrounding agent에 연계된 Memory object cache로 둔다.

    2. Assert: buffermap 내 정확히 하나의 값의 [[BufferObject]]이다.

    3. For each memaddrmemmap,

      1. SameValue(mem.[[BufferObject]], buffer)가 true이면,

        1. Assert: buffer.[[ArrayBufferByteLength]] mod 65536 == 0.

        2. lengthDeltanewLength - buffer.[[ArrayBufferByteLength]]로 둔다.

        3. lengthDelta < 0 이거나 lengthDelta mod 65536 != 0 이면,

          1. RangeError 예외를 던진다.

        4. deltalengthDelta ÷ 65536으로 둔다.

        5. Grow the memory buffermemaddr에 연결된 버퍼를 delta만큼 확장한다.

    4. handled를 반환한다.

  2. 그 외의 경우, unhandled를 반환한다.

Memorybuffer 속성 getter는 this.[[BufferObject]]를 반환한다.

5.4. 테이블

enum TableKind {
  "externref",
  "anyfunc",
  // Note: More values may be added in future iterations,
  // e.g., typed function references, typed GC references
};

dictionary TableDescriptor {
  required TableKind element;
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Table {
  constructor(TableDescriptor descriptor, optional any value);
  AddressValue grow(AddressValue delta, optional any value);
  any get(AddressValue index);
  undefined set(AddressValue index, optional any value);
  readonly attribute AddressValue length;
};

Table 객체는 여러 Instance 객체에서 동시에 참조될 수 있는 단일 table instance를 나타낸다. 각 Table 객체는 table address인 [[Table]] 내부 슬롯을 하나 가진다.

테이블 객체 초기화table address tableaddr로부터 table에 대해 수행하려면, 다음 단계를 따른다:
  1. map주변 에이전트에 연계된 Table object cache로 둔다.

  2. Assert: map[tableaddr]는 존재하지 않는다.

  3. table.[[Table]]를 tableaddr로 설정한다.

  4. Set map[tableaddr] = table.

table address tableaddr로부터 테이블 객체 생성을 수행하려면, 다음 단계를 따른다:
  1. map주변 에이전트에 연계된 Table object cache로 둔다.

  2. map[tableaddr]가 exists이면,

    1. map[tableaddr]를 반환한다.

  3. tablenew Table로 둔다.

  4. Initialize를 실행하여 tableaddr로부터 table을 초기화한다.

  5. table를 반환한다.

Table(descriptor, value) 생성자는, 호출되면 다음 단계를 수행한다:
  1. elementtypeToValueType(descriptor["element"])로 둔다.

  2. elementtypereftype이 아니면,

    1. Throw TypeError 예외.

  3. descriptor["address"]가 exists이면 addrtype을 그 값으로, 그렇지 않으면 addrtype을 "i32"로 둔다.

  4. initial? AddressValueToU64(descriptor["initial"], addrtype)로 둔다.

  5. descriptor["maximum"]이 exists이면 maximum? AddressValueToU64(descriptor["maximum"], addrtype)로, 그렇지 않으면 maximum을 empty로 둔다.

  6. typetable type addrtype { min initial, max maximum } elementType로 둔다.

  7. typevalid가 아니면, RangeError 예외를 던진다.

  8. value가 제공되지 않았다면,

    1. refDefaultValue(elementtype)로 둔다.

    2. Assert: referror가 아니다.

  9. 그 외의 경우,

    1. ref? ToWebAssemblyValue(value, elementType)로 둔다.

  10. store주변 에이전트associated store로 둔다.

  11. (store, tableaddr)를 table_alloc(store, type, ref)으로 둔다. 할당이 실패하면 RangeError 예외를 던진다.

  12. 주변 에이전트associated storestore로 설정한다.

  13. Initialize를 통해 tableaddr로부터 this를 초기화한다.

grow(delta, value) 메서드는, 호출되면 다음 단계를 수행한다:
  1. tableaddrthis.[[Table]]로 둔다.

  2. store주변 에이전트associated store로 둔다.

  3. initialSizetable_size(store, tableaddr)로 둔다.

  4. (addrtype, limits, elementtype)을 table_type(store, tableaddr)로 둔다.

  5. delta64? AddressValueToU64(delta, addrtype)로 둔다.

  6. value가 제공되지 않았다면,

    1. refDefaultValue(elementtype)로 둔다.

    2. referror이면, TypeError 예외를 던진다.

  7. 그 외의 경우,

    1. ref? ToWebAssemblyValue(value, elementtype)로 둔다.

  8. resulttable_grow(store, tableaddr, delta64, ref)로 둔다.

  9. resulterror이면, RangeError 예외를 던진다.

    참고: 위 예외는 메모리 부족 또는 잘못된 크기 매개변수로 인해 발생할 수 있다.

  10. 주변 에이전트associated storeresult로 설정한다.

  11. initialSize를 반환한다.

Tablelength 속성 getter는, 호출되면 다음 단계를 수행한다:
  1. tableaddrthis.[[Table]]로 둔다.

  2. store주변 에이전트associated store로 둔다.

  3. addrtypeaddress type in table_type(store, tableaddr)로 둔다.

  4. length64table_size(store, tableaddr)로 둔다.

  5. U64ToAddressValue(length64, addrtype)를 반환한다.

get(index) 메서드는, 호출되면 다음 단계를 수행한다:
  1. tableaddrthis.[[Table]]로 둔다.

  2. store주변 에이전트associated store로 둔다.

  3. (addrtype, limits, elementtype)을 table_type(store, tableaddr)로 둔다.

  4. elementtypematches exnref이면,

    1. TypeError 예외를 던진다.

  5. index64? AddressValueToU64(index, addrtype)로 둔다.

  6. resulttable_read(store, tableaddr, index64)로 둔다.

  7. resulterror이면, RangeError 예외를 던진다.

  8. ToJSValue(result)를 반환한다.

set(index, value) 메서드는, 호출되면 다음 단계를 수행한다:
  1. tableaddrthis.[[Table]]로 둔다.

  2. store주변 에이전트associated store로 둔다.

  3. (addrtype, limits, elementtype)을 table_type(store, tableaddr)로 둔다.

  4. elementtypematches exnref이면,

    1. TypeError 예외를 던진다.

  5. index64? AddressValueToU64(index, addrtype)로 둔다.

  6. value가 제공되지 않았다면,

    1. refDefaultValue(elementtype)로 둔다.

    2. referror이면, TypeError 예외를 던진다.

  7. 그 외의 경우,

    1. ref? ToWebAssemblyValue(value, elementtype)로 둔다.

  8. storetable_write(store, tableaddr, index64, ref)로 둔다.

  9. storeerror이면, RangeError 예외를 던진다.

  10. 주변 에이전트associated storestore로 설정한다.

5.5. 글로벌

enum ValueType {
  "i32",
  "i64",
  "f32",
  "f64",
  "v128",
  "externref",
  "anyfunc",
};

참고: 이 타입은 향후 WebAssembly 버전에서 추가 케이스로 확장될 수 있다.

dictionary GlobalDescriptor {
  required ValueType value;
  boolean mutable = false;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Global {
  constructor(GlobalDescriptor descriptor, optional any v);
  any valueOf();
  attribute any value;
};

Global 객체는 여러 Instance 객체에서 동시에 참조될 수 있는 단일 global instance를 나타낸다. 각 Global 객체는 하나의 내부 슬롯을 가진다:

global address globaladdr로부터 global 글로벌 객체를 초기화하려면, 다음 단계를 따른다:
  1. map주변 에이전트에 연계된 Global object cache로 둔다.

  2. Assert: map[globaladdr]는 존재하지 않는다.

  3. global.[[Global]]을 globaladdr로 설정한다.

  4. Set map[globaladdr] = global.

global address globaladdr로부터 글로벌 객체 생성을 수행하려면, 다음 단계를 따른다:
  1. map주변 에이전트에 연계된 Global object cache로 둔다.

  2. map[globaladdr]가 exists이면,

    1. map[globaladdr]를 반환한다.

  3. globalnew Global로 둔다.

  4. Initialize를 실행하여 globaladdr로부터 global을 초기화한다.

  5. global을 반환한다.

알고리즘 ToValueType(s)은 다음 단계를 수행한다:
  1. s가 "i32"와 같으면, i32를 반환한다.

  2. s가 "i64"와 같으면, i64를 반환한다.

  3. s가 "f32"와 같으면, f32를 반환한다.

  4. s가 "f64"와 같으면, f64를 반환한다.

  5. s가 "v128"과 같으면, v128을 반환한다.

  6. s가 "anyfunc"과 같으면, funcref를 반환한다.

  7. s가 "externref"와 같으면, externref를 반환한다.

  8. Assert: 이 단계에는 도달하지 않는다.

알고리즘 DefaultValue(valuetype)는 다음 단계를 수행한다:
  1. valuetypeexternref와 같으면, ToWebAssemblyValue(undefined, valuetype)를 반환한다.

  2. val_default(valuetype)를 반환한다.

Global(descriptor, v) 생성자는, 호출되면 다음 단계를 수행한다:
  1. mutabledescriptor["mutable"]로 둔다.

  2. valuetypeToValueType(descriptor["value"])로 둔다.

  3. valuetypematches v128 또는 exnref이면,

    1. TypeError 예외를 던진다.

  4. v가 제공되지 않았다면,

    1. valueDefaultValue(valuetype)로 둔다.

    2. Assert: valueerror가 아니다.

  5. 그 외의 경우,

    1. valueToWebAssemblyValue(v, valuetype)로 둔다.

  6. mutable이 true이면 globaltypevar valuetype으로, 그렇지 않으면 globaltypeconst valuetype으로 둔다.

  7. store를 현재 에이전트의 associated store로 둔다.

  8. (store, globaladdr)를 global_alloc(store, globaltype, value)로 둔다.

  9. 현재 에이전트의 associated storestore로 설정한다.

  10. Initialize를 통해 globaladdr로부터 this를 초기화한다.

알고리즘 GetGlobalValue(Global global)는 다음 단계를 수행한다:
  1. store를 현재 에이전트의 associated store로 둔다.

  2. globaladdrglobal.[[Global]]로 둔다.

  3. globaltypeglobal_type(store, globaladdr)로 둔다.

  4. globaltypemut valuetype 형태이고 valuetypematches v128 또는 exnref이면, TypeError를 던진다.

  5. valueglobal_read(store, globaladdr)로 둔다.

  6. ToJSValue(value)를 반환한다.

Globalvalue 속성 getter는, 호출되면 다음 단계를 수행한다:
  1. GetGlobalValue(this)를 반환한다.

Global의 value 속성 setter는, 호출되면 다음 단계를 수행한다:

  1. store를 현재 에이전트의 연결된 저장소로 둔다.

  2. globaladdrthis.[[Global]]로 둔다.

  3. mut valuetypeglobal_type(store, globaladdr)로 둔다.

  4. valuetypematches v128 또는 exnref이면, TypeError를 던진다.

  5. mutconst이면, TypeError를 던진다.

  6. valueToWebAssemblyValue(주어진 값, valuetype)으로 둔다.

  7. storeglobal_write(store, globaladdr, value)로 둔다.

  8. storeerror이면, RangeError 예외를 던진다.

  9. 현재 에이전트의 연결된 저장소store로 설정한다.

valueOf() 메서드는, 호출되면 다음 단계를 수행한다:
  1. GetGlobalValue(this)를 반환한다.

5.6. 내보낸 함수(Exported Functions)

WebAssembly 함수는 JavaScript에서 Exported Function으로 제공된다. Exported Function은 생성자가 아닌 내장 함수 객체이며, [[FunctionAddress]] 내부 슬롯을 가진다. 이 슬롯에는 function address가 저장되며, 이는 주변 에이전트연결된 저장소를 기준으로 한다.

WebAssembly 함수의 이름 funcaddr은 다음 단계를 수행하여 찾는다:
  1. store주변 에이전트연결된 저장소로 둔다.

  2. funcinststore.funcs[funcaddr]로 둔다.

  3. funcinst가 {type functype, hostcode hostfunc} 형태라면,

    1. Assert: hostfunc는 JavaScript 객체이며 IsCallable(hostfunc)는 true이다.

    2. index호스트 함수의 인덱스 funcaddr로 둔다.

  4. 그 밖의 경우,

    1. moduleinstfuncinst.module로 둔다.

    2. Assert: funcaddrmoduleinst.funcaddrs에 포함되어 있다.

    3. indexmoduleinst.funcaddrs에서 funcaddr가 발견되는 인덱스로 둔다.

  5. ! ToString(index)을 반환한다.

WebAssembly function address funcaddr로부터 새로운 Exported Function을 생성하려면, 다음 단계를 수행한다:
  1. map주변 에이전트에 연계된 Exported Function 캐시로 둔다.

  2. map[funcaddr]가 exists이면,

    1. map[funcaddr]를 반환한다.

  3. steps를 "Exported Function 호출 funcaddr (인수와 함께)"로 둔다.

  4. realm현재 Realm으로 둔다.

  5. store주변 에이전트연결된 저장소로 둔다.

  6. functypefunc_type(store, funcaddr)로 둔다.

  7. [paramTypes] → [resultTypes]를 functype으로 둔다.

  8. arityparamTypes크기로 둔다.

  9. nameWebAssembly 함수의 이름 funcaddr로 둔다.

  10. function! CreateBuiltinFunction(steps, arity, name, « [[FunctionAddress]] », realm)으로 둔다.

  11. function.[[FunctionAddress]]를 funcaddr로 설정한다.

  12. Set map[funcaddr] = function.

  13. function을 반환한다.

function address funcaddr와 JavaScript 인수의 리스트 argValuesExported Function을 호출하려면, 다음 단계를 수행한다:
  1. store주변 에이전트연결된 저장소로 둔다.

  2. functypefunc_type(store, funcaddr)로 둔다.

  3. [parameters] → [results]를 functype으로 둔다.

  4. parameters 또는 results의 어떤 타입이라도 matches v128 또는 exnref이면, TypeError를 던진다.

    참고: 위 오류는 [[Call]] 메서드가 호출될 때마다 던져진다.

  5. args를 « »로 둔다.

  6. i를 0으로 둔다.

  7. tparameters에 대해,

    1. argValues크기 > i이면, argargValues[i]로 둔다.

    2. 그렇지 않으면, arg를 undefined로 둔다.

    3. Append ToWebAssemblyValue(arg, t) → args.

    4. ii + 1로 설정한다.

  8. (store, ret)를 func_invoke(store, funcaddr, args)의 결과로 둔다.

  9. 주변 에이전트연결된 저장소store로 설정한다.

  10. reterror이면, 예외를 던진다. 이 예외는 WebAssembly 오류 매핑에 달리 명시되지 않는 한 WebAssembly RuntimeError 예외여야 한다.

  11. retTHROW ref.exn exnaddr라면,

    1. tagaddrexn_tag(store, exnaddr)로 둔다.

    2. payloadexn_read(store, exnaddr)로 둔다.

    3. jsTagAddrJavaScript 예외 태그 가져오기의 결과로 둔다.

    4. tagaddrjsTagAddr와 같다면,

      1. 호스트 값 조회payload[0]에 대해 수행한 결과를 던진다.

    5. 그 외의 경우,

      1. exception새로운 Exception으로, exnaddr로부터 생성한다.

      2. exception을 던진다.

  12. outArity크기 ret로 둔다.

  13. outArity가 0이면, undefined를 반환한다.

  14. 그렇지 않고 outArity가 1이면, ToJSValue(ret[0])를 반환한다.

  15. 그 외의 경우,

    1. values를 « »로 둔다.

    2. rret에 대해,

      1. Append ToJSValue(r) → values.

    3. CreateArrayFromList(values)를 반환한다.

참고: Exported Function 호출내장 함수 객체의 정의에 따라 피호출 Exported Function의 [[Realm]]에서 실행된다.

참고: Exported Function에는 [[Construct]] 메서드가 없으므로 new 연산자로 호출할 수 없다.

JavaScript 객체 func, 타입 functype, 그리고 리스트 형태의 WebAssembly 값 arguments로부터 호스트 함수를 실행하려면, 다음 단계를 수행한다:
  1. [parameters] → [results]를 functype으로 둔다.

  2. parameters 또는 results의 어떤 타입이라도 matches v128 또는 exnref이면, TypeError를 던진다.

  3. jsArguments를 « »로 둔다.

  4. argarguments에 대해,

    1. Append ! ToJSValue(arg) → jsArguments.

  5. ret? Call(func, undefined, jsArguments)로 둔다.

  6. resultsSizeresults크기로 둔다.

  7. resultsSize가 0이면, « »를 반환한다.

  8. 그렇지 않고 resultsSize가 1이면, « ? ToWebAssemblyValue(ret, results[0]) »를 반환한다.

  9. 그 외의 경우,

    1. method? GetMethod(ret, %Symbol.iterator%)로 둔다.

    2. method가 undefined이면, throw TypeError.

    3. values? IteratorToList(? GetIteratorFromMethod(ret, method))로 둔다.

    4. wasmValues를 새로운 빈 리스트로 둔다.

    5. values크기resultsSize와 다르면, TypeError 예외를 던진다.

    6. valuesresults의 각 value, resultType을 선형으로 짝지어,

      1. Append ToWebAssemblyValue(value, resultType) → wasmValues.

    7. wasmValues를 반환한다.

JavaScript 객체 func, 타입 functype으로부터 호스트 함수 생성을 수행하려면, 다음 단계를 따른다:
  1. Assert: IsCallable(func).

  2. stored settingsincumbent settings object로 둔다.

  3. 다음 단계를 인수 arguments와 함께 호출될 때 수행하는 호스트 함수 hostfunc를 둔다:

    1. realmfuncassociated Realm으로 둔다.

    2. relevant settingsrealmsettings object로 둔다.

    3. 스크립트 실행 준비relevant settings로 수행한다.

    4. 콜백 실행 준비stored settings로 수행한다.

    5. result호스트 함수 실행func, functype, arguments로 수행한 결과로 둔다.

    6. 콜백 실행 후 정리stored settings로 수행한다.

    7. 스크립트 실행 후 정리relevant settings로 수행한다.

    8. Assert: result.[[Type]]은 throw 또는 normal이다.

    9. store주변 에이전트연결된 저장소로 둔다.

    10. result.[[Type]]이 throw라면:

      1. vresult.[[Value]]로 둔다.

      2. vimplements Exception이면,

        1. addressv.[[Address]]로 둔다.

      3. 그 외의 경우,

        1. typeJavaScript 예외 태그 가져오기의 결과로 둔다.

        2. payload! ToWebAssemblyValue(v, externref)로 둔다.

        3. (store, address)를 exn_alloc(store, type, « payload »)으로 둔다.

        4. 주변 에이전트연결된 저장소store로 설정한다.

      4. WebAssembly 명령 (ref.exn address) (throw_ref)를 실행한다.

    11. 그렇지 않으면, result.[[Value]]를 반환한다.

  4. (store, funcaddr)를 func_alloc(store, functype, hostfunc)으로 둔다.

  5. 주변 에이전트연결된 저장소store로 설정한다.

  6. funcaddr를 반환한다.

알고리즘 ToJSValue(w)는 다음 단계를 수행하여 WebAssembly 값을 JavaScript 값으로 변환한다:
  1. Assert: wv128.const v128 형태가 아니다.

  2. Assert: wref.exn exnaddr 형태가 아니다.

  3. wi64.const u64 형태이면,

    1. i64signed_64(u64)로 둔다.

    2. (i64수학적 값으로 해석한 값)을 반환한다.

  4. wi32.const u32 형태이면,

    1. i32signed_32(u32)로 둔다.

    2. 𝔽(i32수학적 값으로 해석한 값)을 반환한다.

  5. wf32.const f32 형태이면,

    1. f32+∞ 또는 −∞이면, 각각 +∞𝔽 또는 -∞𝔽를 반환한다.

    2. f32nan이면, NaN을 반환한다.

    3. 𝔽(f32수학적 값으로 해석한 값)을 반환한다.

  6. wf64.const f64 형태이면,

    1. f64+∞ 또는 −∞이면, 각각 +∞𝔽 또는 -∞𝔽를 반환한다.

    2. f64nan이면, NaN을 반환한다.

    3. 𝔽(f64수학적 값으로 해석한 값)을 반환한다.

  7. wref.null t 형태이면, null을 반환한다.

  8. wref.i31 u31 형태이면,

    1. i31signed_31(u31)로 둔다.

    2. 반환값을 𝔽(i31)로 둔다.

  9. wref.struct structaddr 형태이면, a new Exported GC Objectstructaddr와 "struct"로부터 생성한 결과를 반환한다.

  10. wref.array arrayaddr 형태이면, a new Exported GC Objectarrayaddr와 "array"로부터 생성한 결과를 반환한다.

  11. wref.func funcaddr 형태이면, a new Exported Functionfuncaddr로부터 생성한 결과를 반환한다.

  12. wref.host hostaddr 형태이면, 호스트 값 조회hostaddr에 대해 수행한 결과를 반환한다.

  13. wref.extern ref 형태이면, ToJSValue(ref)를 반환한다.

참고: NaN과 같은 숫자 값은 관찰 가능한 다양한 NaN 페이로드를 가질 수 있다. 자세한 내용은 NumericToRawBytes를 참조하라.

host address hostaddr로부터 호스트 값 조회를 수행하려면, 다음 단계를 따른다:

  1. map주변 에이전트에 연계된 host value cache로 둔다.

  2. Assert: map[hostaddr]가 exists이다.

  3. map[hostaddr]를 반환한다.

알고리즘 ToWebAssemblyValue(v, type)는 다음 단계를 수행하여 JavaScript 값을 WebAssembly 값으로 변환한다:
  1. Assert: typev128이 아니다.

  2. Assert: typematch exnref가 아니다.

  3. typei64이면,

    1. i64? ToBigInt64(v)로 둔다.

    2. u64를 부호 없는 정수로 두되, i64signed_64(u64)인 것과 같도록 한다.

    3. i64.const u64를 반환한다.

  4. typei32이면,

    1. i32? ToInt32(v)로 둔다.

    2. u32를 부호 없는 정수로 두되, i32signed_32(u32)인 것과 같도록 한다.

    3. i32.const u32를 반환한다.

  5. typef32이면,

    1. number? ToNumber(v)로 둔다.

    2. numberNaN이면,

      1. n을 구현 정의된 정수로 두되, canon32n < 2signif(32)를 만족하도록 한다.

      2. f32nan(n)으로 둔다.

    3. 그 밖의 경우,

      1. f32를 IEEE 754-2019 반올림 규칙(최근접, 동가일 경우 짝수)으로 표현 가능한 가장 가까운 값으로 반올림한 number로 둔다. [IEEE-754]

    4. f32.const f32를 반환한다.

  6. typef64이면,

    1. number? ToNumber(v)로 둔다.

    2. numberNaN이면,

      1. n을 구현 정의된 정수로 두되, canon64n < 2signif(64)를 만족하도록 한다.

      2. f64nan(n)으로 둔다.

    3. 그 밖의 경우,

      1. f64number로 둔다.

    4. f64.const f64를 반환한다.

  7. typeref null heaptype 형태이면,

    1. v가 null이면,

      1. rref.null heaptype으로 둔다.

    2. 그렇지 않고 match_valtype(type, ref null extern)이면,

      1. refToWebAssemblyValue(v, ref any)로 둔다.

      2. rref.extern ref로 둔다.

    3. 그렇지 않고 vExported Function이며 match_valtype(type, ref null func)이면,

      1. funcaddrv의 [[FunctionAddress]] 내부 슬롯의 값으로 둔다.

      2. rref.func funcaddr로 둔다.

    4. 그렇지 않고 vNumber이고 v? ToInt32(v)와 같고, (v) < 230이며 (v) ⩾ -230이면,

      1. i31? ToInt32(v)로 둔다.

      2. u31를 부호 없는 정수로 두되, i31signed_31(i31)인 것과 같도록 한다.

      3. rref.i31 u31로 둔다.

    5. 그렇지 않고 vExported GC Object이면,

      1. objectaddrv의 [[ObjectAddress]] 내부 슬롯의 값으로 둔다.

      2. objectkindv의 [[ObjectKind]] 내부 슬롯의 값으로 둔다.

      3. objectkind가 "array"이면,

        1. rref.array objectaddr로 둔다.

      4. objectkind가 "struct"이면,

        1. rref.struct objectaddr로 둔다.

    6. 그 밖의 경우,

      1. map주변 에이전트에 연계된 host value cache로 둔다.

      2. 어떤 host address hostaddr가 존재하여 map[hostaddr]가 v와 동일하다면,

        1. ref.host hostaddr를 반환한다.

      3. host address hostaddrmap[hostaddr] exists가 false인 가장 작은 주소로 둔다.

      4. Set map[hostaddr] = v.

      5. rref.host hostaddr로 둔다.

    7. store를 현재 에이전트의 연결된 저장소로 둔다.

    8. actualtyperef_type(store, r)로 둔다.

    9. match_valtype(actualtype, type)이 false이면,

      1. TypeError를 던진다.

    10. r를 반환한다.

  8. Assert: 이 단계에는 도달하지 않는다.

알고리즘 AddressValueToU64(v, addrtype)는 JavaScript 값을 임베딩 연산에서 사용할 WebAssembly u64로 변환한다. 이는 [EnforceRange] unsigned long의 동작을 AddressType "i32"에 대해 모사하고, 이를 AddressType "i64"로 확장한다. 다음 단계를 수행한다:
  1. addrtype이 "i32"이면,

    1. n? ConvertToInt(v, 32, "unsigned")로 두되, 대상 타입은 [EnforceRange]에 연계된다.

      참고: 이는 JS 변환 규칙[EnforceRange] unsigned long과 동일하다.

    2. (n)을 WebAssembly u64로 반환한다.

  2. addrtype이 "i64"이면,

    1. n? ToBigInt(v)로 둔다.

    2. n < 0 또는 n > 264 − 1 이면, throw TypeError.

      참고: 이 연산은 [EnforceRange]를 모사하도록 설계되었다.

    3. (n)을 WebAssembly u64로 반환한다.

  3. Assert: 이 단계에는 도달하지 않는다.

알고리즘 U64ToAddressValue(v, addrtype)는 WebAssembly 임베딩 연산으로부터의 u64 값을 올바른 변형의 AddressValue (해당 AddressType)로 변환한다. 다음 단계를 수행한다:
  1. addrtype이 "i32"이면, 𝔽(v수학적 값으로 해석한 값)를 반환한다.

  2. 그렇지 않고 addrtype이 "i64"이면, (v수학적 값으로 해석한 값)를 반환한다.

  3. Assert: 이 단계에는 도달하지 않는다.

5.7. 태그

tag_alloc(store, parameters) 알고리즘은 storeparameters에 대한 새로운 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 객체 초기화를 수행하려면, 다음 단계를 따른다:

  1. map주변 에이전트에 연계된 Tag object cache로 둔다.

  2. Assert: map[tagAddress]는 exist하지 않는다.

  3. tag.[[Address]]를 tagAddress로 설정한다.

  4. Set map[tagAddress] = tag.

tag address tagAddress로부터 Tag 객체 생성을 수행하려면, 다음 단계를 따른다:
  1. map주변 에이전트에 연계된 Tag object cache로 둔다.

  2. map[tagAddress]가 exists이면,

    1. map[tagAddress]를 반환한다.

  3. tagnew Tag로 둔다.

  4. Initialize tag from tagAddress.

  5. tag를 반환한다.

new Tag(type) 생성자 단계는 다음과 같다:

  1. parameterstype["parameters"]로 둔다.

  2. wasmParameters를 «»로 둔다.

  3. typeparameters에 대해,

    1. Append ToValueType(type) → wasmParameters.

  4. store를 현재 에이전트의 연결된 저장소로 둔다.

  5. (store, tagAddress)를 tag_alloc(store, wasmParameters)로 둔다.

  6. 현재 에이전트의 연결된 저장소store로 설정한다.

  7. 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의 내부 메서드는 다음 구현을 사용한다.

Exported GC Object의 [[GetPrototypeOf]] 내부 메서드 O는 인수를 받지 않으며 null을 반환한다. 호출 시 다음 단계를 수행한다:
  1. null을 반환한다.

Exported GC Object의 [[SetPrototypeOf]] 내부 메서드 O는 인수 V(객체 또는 null)를 받아 불리언을 반환한다. 호출 시 다음 단계를 수행한다:
  1. false를 반환한다.

Exported GC Object의 [[IsExtensible]] 내부 메서드 O는 인수를 받지 않으며 불리언을 반환한다. 호출 시 다음 단계를 수행한다:
  1. false를 반환한다.

Exported GC Object의 [[PreventExtensions]] 내부 메서드 O는 인수를 받지 않으며 불리언을 반환한다. 호출 시 다음 단계를 수행한다:
  1. false를 반환한다.

Exported GC Object의 [[GetOwnProperty]] 내부 메서드 O는 인수 P(프로퍼티 키)를 받아 undefined를 반환한다. 호출 시 다음 단계를 수행한다:
  1. undefined를 반환한다.

Exported GC Object의 [[DefineOwnProperty]] 내부 메서드 O는 인수 P(프로퍼티 키)와 Desc(프로퍼티 서술자)를 받아 불리언을 반환한다. 호출 시 다음 단계를 수행한다:
  1. false를 반환한다.

Exported GC Object의 [[HasProperty]] 내부 메서드 O는 인수 P(프로퍼티 키)를 받아 불리언을 반환한다. 호출 시 다음 단계를 수행한다:
  1. false를 반환한다.

Exported GC Object의 [[Get]] 내부 메서드 O는 인수 P(프로퍼티 키), Receiver(ECMAScript 언어 값)를 받아 undefined를 반환한다. 호출 시 다음 단계를 수행한다:
  1. undefined를 반환한다.

Exported GC Object의 [[Set]] 내부 메서드 O는 인수 P(프로퍼티 키), V(ECMAScript 언어 값), Receiver(ECMAScript 언어 값)를 받아 예외를 던진다. 호출 시 다음 단계를 수행한다:
  1. TypeError를 던진다.

Exported GC Object의 [[Delete]] 내부 메서드 O는 인수 P(프로퍼티 키)를 받아 예외를 던진다. 호출 시 다음 단계를 수행한다:
  1. TypeError를 던진다.

Exported GC Object의 [[OwnPropertyKeys]] 내부 메서드 O는 인수를 받지 않으며 리스트를 반환한다. 호출 시 다음 단계를 수행한다:
  1. keys를 새로운 빈 리스트로 둔다.

  2. keys를 반환한다.

WebAssembly object address objectaddr와 문자열 objectkind로부터 a new Exported GC Object를 생성하려면, 다음 단계를 수행한다:
  1. Assert: objectkind는 "array" 또는 "struct"이다.

  2. map주변 에이전트에 연계된 exported GC object cache로 둔다.

  3. map[objectaddr]가 exists이면,

    1. map[objectaddr]를 반환한다.

  4. objectMakeBasicObject(« [[ObjectAddress]] »)로 둔다.

  5. object.[[ObjectAddress]]를 objectaddr로 설정한다.

  6. object.[[ObjectKind]]를 objectkind로 설정한다.

  7. object.[[GetPrototypeOf]]를 Exported GC Object의 [[GetPrototypeOf]] 내부 메서드에 명시된 대로 설정한다.

  8. object.[[SetPrototypeOf]]를 Exported GC Object의 [[SetPrototypeOf]] 내부 메서드에 명시된 대로 설정한다.

  9. object.[[IsExtensible]]를 Exported GC Object의 [[IsExtensible]] 내부 메서드에 명시된 대로 설정한다.

  10. object.[[PreventExtensions]]를 Exported GC Object의 [[PreventExtensions]] 내부 메서드에 명시된 대로 설정한다.

  11. object.[[GetOwnProperty]]를 Exported GC Object의 [[GetOwnProperty]] 내부 메서드에 명시된 대로 설정한다.

  12. object.[[DefineOwnProperty]]를 Exported GC Object의 [[DefineOwnProperty]] 내부 메서드에 명시된 대로 설정한다.

  13. object.[[HasProperty]]를 Exported GC Object의 [[HasProperty]] 내부 메서드에 명시된 대로 설정한다.

  14. object.[[Get]]을 Exported GC Object의 [[Get]] 내부 메서드에 명시된 대로 설정한다.

  15. object.[[Set]]을 Exported GC Object의 [[Set]] 내부 메서드에 명시된 대로 설정한다.

  16. object.[[Delete]]를 Exported GC Object의 [[Delete]] 내부 메서드에 명시된 대로 설정한다.

  17. object.[[OwnPropertyKeys]]를 Exported GC Object의 [[OwnPropertyKeys]] 내부 메서드에 명시된 대로 설정한다.

  18. Set map[objectaddr] = object.

  19. object를 반환한다.

5.9. 예외

dictionary ExceptionOptions {
  boolean traceStack = false;
};

[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
interface Exception {
  constructor(Tag exceptionTag, sequence<any> payload, optional ExceptionOptions options = {});
  any getArg([EnforceRange] unsigned long index);
  boolean is(Tag exceptionTag);
  readonly attribute (DOMString or undefined) stack;
};

Exception 값은 예외를 나타낸다.

Exception 객체를 초기화하여 exnException address exnAddress로부터 생성하려면, 다음 단계를 수행한다:

  1. map주변 에이전트에 연계된 Exception object cache로 둔다.

  2. Assert: map[exnAddress]는 exist하지 않는다.

  3. exn.[[Address]]를 exnAddress로 설정한다.

  4. Set map[exnAddress] = exn.

  5. store주변 에이전트연결된 저장소로 둔다.

  6. tagaddrexn_tag(store, exnAddress)로 둔다.

  7. payloadexn_read(store, exnAddress)로 둔다.

  8. exn.[[Type]]을 tagaddr로 설정한다.

  9. exn.[[Payload]]를 payload로 설정한다.

  10. exn.[[Stack]]을 undefined로 설정한다.

Exception 객체를 생성하기 위해 exception address exnAddress로부터 다음 단계를 수행한다:

  1. map주변 에이전트에 연계된 Exception object cache로 둔다.

  2. map[exnAddress]가 exists이면,

    1. map[exnAddress]를 반환한다.

  3. exnnew Exception으로 둔다.

  4. Initialize exn from exnAddress.

  5. exn을 반환한다.

new Exception(exceptionTag, payload, options) 생성자 단계는 다음과 같다:

  1. JSTagAddrJavaScript 예외 태그를 가져오기의 결과로 둔다.

  2. exceptionTag.[[Address]]가 JSTagAddr와 같다면,

    1. TypeError를 던진다.

  3. store주변 에이전트연결된 저장소로 둔다.

  4. [types] → []를 tag_type(store, exceptionTag.[[Address]])로 둔다.

  5. types크기payload크기와 다르면,

    1. TypeError를 던진다.

  6. wasmPayload를 « »로 둔다.

  7. valueresultTypepayloadtypes에서 선형으로 짝지어,

    1. resultTypematches v128 또는 exnref이면,

      1. TypeError를 던진다.

    2. Append ? ToWebAssemblyValue(value, resultType) → wasmPayload.

  8. (store, exceptionAddr)를 exn_alloc(store, exceptionTag.[[Address]], wasmPayload)로 둔다.

  9. 주변 에이전트연결된 저장소store로 설정한다.

  10. Initialize this from exceptionAddr.

  11. options["traceStack"]이 true이면,

    1. this.[[Stack]]을 현재 호출 스택의 DOMString 표현 또는 undefined로 설정한다.

getArg(index) 메서드 단계는 다음과 같다:

  1. store주변 에이전트연결된 저장소로 둔다.

  2. tagaddrexn_tag(store, this.[[Address]])로 둔다.

  3. payloadexn_read(store, this.[[Address]])로 둔다.

  4. Assert: tagaddrthis.[[Type]]과 같다.

  5. indexpayload크기이면,

    1. RangeError를 던진다.

  6. [types] → []를 tag_type(store, tagaddr)로 둔다.

  7. types[index]이 matches v128 또는 exnref이면,

    1. TypeError를 던진다.

  8. ToJSValue(payload[index])를 반환한다.

is(exceptionTag) 메서드 단계는 다음과 같다:

  1. this.[[Type]]이 exceptionTag.[[Address]]와 같지 않으면,

    1. false를 반환한다.

  2. true를 반환한다.

stack getter 단계는 다음과 같다:

  1. this.[[Stack]]을 반환한다.

5.9.1. JavaScript 예외

JavaScript exception tag는 주변 에이전트에 연계된 tag address이다. 처음 사용 시 에이전트의 연결된 저장소에 할당되고 캐시된다. 항상 tag type « externref » → « »를 가진다.

JavaScript 예외 태그를 가져오기 위해 다음 단계를 수행한다:

  1. 주변 에이전트에 연계된 JavaScript exception tag가 초기화되어 있다면,

    1. return the surrounding agent’s associated JavaScript exception tag

  2. store주변 에이전트연결된 저장소로 둔다.

  3. (store, tagAddress)를 tag_alloc(store, « externref » → « »)로 둔다.

  4. 현재 에이전트의 연결된 저장소store로 설정한다.

  5. 현재 에이전트에 연계된 JavaScript exception tagtagAddress로 설정한다.

  6. return tagAddress.

5.10. 오류 객체

WebAssembly는 다음 오류 클래스를 정의한다: CompileError, LinkError, 그리고 RuntimeError.

WebAssembly 네임스페이스에 대한 네임스페이스 객체생성될 때, 다음 단계를 수행해야 한다:
  1. namespaceObject네임스페이스 객체로 둔다.

  2. error ∈ « "CompileError", "LinkError", "RuntimeError" »에 대해,

    1. constructor를 새로운 객체로 두되, 이는 NativeError 객체 구조를 구현하고, NativeErrorerror로 설정한다.

    2. ! DefineMethodProperty(namespaceObject, error, constructor, false).

참고: 이는 CompileError, LinkError, 그리고 RuntimeError 클래스를 WebAssembly 네임스페이스에 정의하며, 이는 이 명세의 API에서 생성된다. 이들은 TypeErrorRangeError 같은 네이티브 JavaScript 오류와 동일한 인터페이스를 노출한다.

참고: 현재 Web IDL만으로는 이 동작을 정의할 수 없다.

6. 내장 함수(Builtins)

JS-API는 모듈을 컴파일할 때 options 를 통해 import할 수 있는 내장 함수 집합을 정의한다. WebAssembly 내장 함수는 기존 JavaScript 내장 함수에 대응하며, 최소한의 오버헤드로 WebAssembly 함수로 직접 사용할 수 있도록 조정된다.

모든 내장 함수들은 집합으로 묶인다. 각 내장 함수 집합은 WebAssemblyCompileOptions에서 사용되는 name과, import 조회 시 사용되는 wasm: 접두사가 붙은 qualified name을 가진다.

builtinSetName에 대한 내장 함수 집합의 함수들을 가져오려면, 다음 단계를 수행한다:

  1. 이 절에서 정의된 이름이 builtinSetName인 집합에 대해 (name, funcType, steps)의 리스트를 반환한다.

import와 활성화된 내장 집합 builtinSetNames에 대해 내장 함수를 찾으려면, 다음 단계를 수행한다:

  1. Assert: validate builtin set names builtinSetNames는 true이다.

  2. importModuleNameimport[0]으로 둔다.

  3. importNameimport[1]로 둔다.

  4. builtinSetNamebuiltinSetNames에 대해,

    1. builtinSetName이 내장 함수 집합을 가리키지 않으면, continue.

    2. builtinSetQualifiedName을 "wasm:"이 접두사로 붙은 builtinSetName으로 둔다.

    3. importModuleNamebuiltinSetQualifiedName과 같다면,

      1. builtinsget the builtins for a builtin set builtinSetName의 결과로 둔다.

      2. builtinbuiltins에 대해,

        1. builtinNamebuiltin[0]으로 둔다.

        2. importNamebuiltinName과 같다면, (builtinSetName, builtin)을 반환한다.

  5. null을 반환한다.

builtinSetNames에 대해 내장 집합 이름을 검증하려면, 다음 단계를 수행한다:

  1. builtinSetNames에 중복이 하나라도 있으면, false를 반환한다.

  2. true를 반환한다.

타입 funcType과 실행 단계 steps로부터 내장 함수를 생성하려면, 다음 단계를 수행한다:

  1. hostfunc를 호출 시 steps를 실행하는 호스트 함수로 둔다.

  2. (store, funcaddr)를 func_alloc(store, functype, hostfunc)로 둔다.

  3. 주변 에이전트연결된 저장소store로 설정한다.

  4. funcaddr를 반환한다.

이름이 builtinSetName내장 집합을 인스턴스화하려면, 다음 단계를 수행한다:

  1. builtinsget the builtins for a builtin set builtinSetName의 결과로 둔다.

  2. exportsObject! OrdinaryObjectCreate(null)로 둔다.

  3. (name, funcType, steps) ∈ builtins에 대해,

    1. funcaddrcreate a builtin function (funcType, steps)의 결과로 둔다.

    2. funca new Exported Functionfuncaddr로부터 생성한 결과로 둔다.

    3. valuefunc로 둔다.

    4. status! CreateDataProperty(exportsObject, name, value)로 둔다.

    5. Assert: status는 true이다.

  4. exportsObject를 반환한다.

import와 활성화된 내장 집합 builtinSetNames에 대해 내장 함수용 import를 검증하려면, 다음 단계를 수행한다:

  1. Assert: validate builtin set names builtinSetNames는 true이다.

  2. maybeBuiltinfind a builtin(import, builtinSetNames)의 결과로 둔다.

  3. maybeBuiltin이 null이면, true를 반환한다.

  4. importExternTypeimport[2]로 둔다.

  5. builtinFuncTypemaybeBuiltin[0][1]로 둔다.

  6. builtinExternTypefunc |builtinFuncType|로 둔다.

  7. match_externtype(builtinExternType, importExternType)의 결과를 반환한다.

6.1. String Builtins

문자열 빌트인은 String 내장 객체의 인터페이스를 조정한다. 이 집합의 namejs-string이고, qualified namewasm:js-string이다.

참고: 본 절의 알고리즘은 String에 정의된 JS 빌트인을 참조한다. 이는 실제 빌트인을 가리키며 String 객체에 대한 동적 조회를 수행하지 않는다.

6.1.1. 추상 연산

UnwrapString(v) 추상 연산은 호출 시 다음 단계를 수행한다:

  1. vString이 아니면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  2. v를 반환한다

FromCharCode(v) 추상 연산은 호출 시 다음 단계를 수행한다:

  1. Assert: vi32 타입이다.

  2. ! Call(String.fromCharCode, undefined, « ToJSValue(v) »)를 반환한다.

CharCodeAt(string, index) 추상 연산은 호출 시 다음 단계를 수행한다:

  1. Assert: indexi32 타입이다.

  2. ! Call(String.prototype.charCodeAt, string, « ToJSValue(index) »)를 반환한다.

6.1.2. cast

이 빌트인의 funcType(rec (type (func (param externref) (result externref)))).0이다.

이 빌트인이 매개변수 v로 호출되면, 다음 단계를 수행해야 한다:

  1. ? UnwrapString(v)을 반환한다

6.1.3. test

이 빌트인의 funcType(rec (type (func (param externref) (result i32)))).0이다.

이 빌트인이 매개변수 v로 호출되면, 다음 단계를 수행해야 한다:

  1. vString이 아니면,

    1. 0을 반환한다.

  2. 1을 반환한다.

6.1.4. fromCharCodeArray

arrayType(rec (type (array (mut i16)))).0으로 둔다.

이 빌트인의 funcType(rec (type (func (param (ref null arrayType) i32 i32) (result externref)))).0이다.

이 빌트인이 매개변수 array, start, end로 호출되면, 다음 단계를 수행해야 한다:

  1. array가 null이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  2. lengtharray의 요소 개수로 둔다.

  3. start > end 또는 end > length이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  4. result를 빈 문자열로 둔다.

  5. istart로 둔다.

  6. i < end인 동안:

    1. charCodearray에서 인덱스 i에 저장된 값으로 둔다.

    2. charCodeStringFromCharCode(charCode)로 둔다.

    3. resultresultcharCodeString의 연결로 둔다.

    4. ii + 1로 설정한다.

  7. result를 반환한다.

6.1.5. intoCharCodeArray

arrayType(rec (type (array (mut i16)))).0으로 둔다.

이 빌트인의 funcType(rec (type (func (param externref (ref null arrayType) i32) (result i32)))).0이다.

이 빌트인이 매개변수 string, array, start로 호출되면, 다음 단계를 수행해야 한다:

  1. array가 null이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  2. string? UnwrapString(string)으로 둔다.

  3. stringLengthlength(string)로 둔다.

  4. arrayLengtharray의 요소 개수로 둔다.

  5. start + stringLength > arrayLength이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  6. i를 0으로 둔다.

  7. i < stringLength인 동안:

    1. charCodeCharCodeAt(string, i)로 둔다.

    2. array의 인덱스 start + i에 저장된 요소를 ToWebAssemblyValue(charCode)로 설정한다.

    3. ii + 1로 설정한다.

  8. stringLength를 반환한다.

6.1.6. fromCharCode

이 빌트인의 funcType(rec (type (func (param i32) (result externref)))).0이다.

이 빌트인이 매개변수 v로 호출되면, 다음 단계를 수행해야 한다:

  1. FromCharCode(v)를 반환한다.

6.1.7. fromCodePoint

이 빌트인의 funcType(rec (type (func (param i32) (result externref)))).0이다.

이 빌트인이 매개변수 v로 호출되면, 다음 단계를 수행해야 한다:

  1. v > 0x10ffff이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  2. ! Call(String.fromCodePoint, undefined, « ToJSValue(v) »)를 반환한다.

6.1.8. charCodeAt

이 함수의 타입은 (rec (type (func (param externref i32) (result i32)))).0이다.

이 빌트인이 매개변수 stringindex로 호출되면, 다음 단계를 수행해야 한다:

  1. string? UnwrapString(string)으로 둔다.

  2. lengthlength(string)로 둔다.

  3. indexlength이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  4. CharCodeAt(string, index)를 반환한다.

6.1.9. codePointAt

이 함수의 타입은 (rec (type (func (param externref i32) (result i32)))).0이다.

이 빌트인이 매개변수 stringindex로 호출되면, 다음 단계를 수행해야 한다:

  1. string? UnwrapString(string)으로 둔다.

  2. lengthlength(string)로 둔다.

  3. indexlength이면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  4. ! Call(String.prototype.codePointAt, string, « ToJSValue(index) »)를 반환한다.

6.1.10. length

이 빌트인의 funcType(rec (type (func (param externref) (result i32)))).0이다.

이 빌트인이 매개변수 v로 호출되면, 다음 단계를 수행해야 한다:

  1. string? UnwrapString(v)으로 둔다.

  2. stringlength를 반환한다.

6.1.11. concat

이 빌트인의 funcType(rec (type (func (param externref externref) (result externref)))).0이다.

이 빌트인이 매개변수 firstsecond로 호출되면, 다음 단계를 수행해야 한다:

  1. first? UnwrapString(first)으로 둔다.

  2. second? UnwrapString(second)으로 둔다.

  3. ! Call(String.prototype.concat, first, « second »)를 반환한다.

6.1.12. substring

이 빌트인의 funcType(rec (type (func (param externref i32 i32) (result externref)))).0이다.

이 빌트인이 매개변수 string, start, end로 호출되면, 다음 단계를 수행해야 한다:

  1. string? UnwrapString(string)으로 둔다.

  2. lengthlength(string)로 둔다.

  3. start > end 또는 start > length이면,

    1. 빈 문자열을 반환한다.

  4. ! Call(String.prototype.substring, string, « ToJSValue(start), ToJSValue(end) »)를 반환한다.

6.1.13. equals

이 빌트인의 funcType(rec (type (func (param externref externref) (result i32)))).0이다.

참고: 의미가 있으므로 null 문자열 간의 동등 비교를 명시적으로 허용한다.

이 빌트인이 매개변수 firstsecond로 호출되면, 다음 단계를 수행해야 한다:

  1. first가 null이 아니고 firstString이 아니면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  2. second가 null이 아니고 secondString이 아니면,

    1. trap이 실행된 것처럼 RuntimeError 예외를 던진다.

  3. ! IsStrictlyEqual(first, second)이 true이면,

    1. 1을 반환한다.

  4. 0을 반환한다.

6.1.14. compare

이 빌트인의 funcType(rec (type (func (param externref externref) (result i32)))).0이다.

이 빌트인이 매개변수 firstsecond로 호출되면, 다음 단계를 수행해야 한다:

  1. first? UnwrapString(first)으로 둔다.

  2. second? UnwrapString(second)으로 둔다.

  3. ! IsStrictlyEqual(first, second)이 true이면,

    1. 0을 반환한다.

  4. ! IsLessThan(first, second, true)가 true이면,

    1. -1을 반환한다.

  5. 1을 반환한다.

7. JavaScript로의 오류 상태 매핑

WebAssembly 프로그램을 실행할 때, WebAssembly 코드를 중단시키는 특정 이벤트가 발생할 수 있다. 현재 WebAssembly 코드는 이러한 조건을 포착할 방법이 없으므로, 예외는 반드시 둘러싼 비-WebAssembly 호출자(브라우저, JavaScript 또는 다른 런타임 시스템)에 전파되며, 그곳에서 일반적인 JavaScript 예외처럼 처리된다.

WebAssembly가 import를 통해 JavaScript를 호출하고 JavaScript가 예외를 던지면, 그 예외는 WebAssembly 활성화를 관통하여 둘러싼 호출자에게 전파된다.

JavaScript 예외는 처리될 수 있고, trap이 처리된 이후에도 JavaScript는 WebAssembly export를 계속 호출할 수 있으므로, 일반적으로 trap은 향후 실행을 방해하지 않는다.

7.1. 스택 오버플로

WebAssembly 코드에서 스택 오버플로가 발생할 때마다, JavaScript에서의 스택 오버플로와 동일한 종류의 예외가 던져진다. 구체적인 예외 종류는 두 경우 모두 구현 정의이다.

참고: ECMAScript는 스택 오버플로 시의 동작을 명시하지 않는다. 구현에서는 RangeError, InternalError 또는 Error를 던지는 것이 관찰되었다. 여기서는 어떤 것이라도 유효하다.

7.2. 메모리 부족

검증, 컴파일 또는 인스턴스화 중에 메모리가 부족해지는 경우마다, JavaScript에서의 메모리 부족 상황과 동일한 종류의 예외가 던져진다. 구체적인 예외 종류는 두 경우 모두 구현 정의이다.

참고: ECMAScript는 메모리 부족 상황에 대한 동작을 명시하지 않는다. 구현에서는 OOMError를 던지거나 크래시하는 것이 관찰되었다. 둘 다 여기서는 유효하다.

큰 테이블 또는 메모리의 할당 실패는 다음 중 하나로 이어질 수 있다: 향후 개정에서는 많은 양의 메모리 할당에 대해 보다 신뢰 가능하고 복구 가능한 오류를 재고할 수 있다.

자세한 논의는 Issue 879를 참고하라.

8. 구현 정의 한계

WebAssembly 코어 명세는 구현이 모듈의 문법 구조에 대한 한계를 정의하도록 허용한다. 각 WebAssembly 임베딩은 자체 한계를 정의할 수 있지만, 예측 가능성을 위해 본 문서에서 설명하는 표준 WebAssembly JavaScript 인터페이스는 다음의 정확한 한계를 정의한다. 구현은 아래 한계 중 하나를 초과하는 모듈을 CompileError로 거부해야 한다. 실제로는, 구현이 아래 한계 미만의 유효한 모듈에 대해서도 자원이 부족할 수 있다.

다음 한계 중 하나가 런타임 중에 초과되면, 구현은 RuntimeError를 던져야 한다: 실제로는, 구현이 아래 한계 미만의 유효한 모듈에 대해서도 자원이 부족할 수 있다.

9. 보안 및 프라이버시 고려사항

이 절은 비규범적이다.

이 문서는 WebAssembly를 위한 호스트 환경을 정의한다. 이는 WebAssembly 인스턴스가 import 객체에서 JavaScript 객체와 함수를 가져오도록 허용하지만, 그 외에는 임베딩 환경에 대한 접근을 제공하지 않는다. 따라서 WebAssembly 인스턴스는 JavaScript와 동일한 제약에 묶인다.

10. 변경 이력

이 절은 비규범적이다.

WebAssembly 명세 원본 1.0 릴리스 이후, 여러 확장 제안이 통합되었다. 다음 절들은 어떤 변화가 있었는지 개요를 제공한다.

10.1. 릴리스 2.0

다중 값

여러 값을 JavaScript 함수로부터 또는 함수로 Array 객체로 반환할 수 있다.

BigInt 통합

WebAssembly i64 값은(가져오거나 내보낸 글로벌, 테이블 get/set, 함수 반환값 또는 인자를 통해) JavaScript와 서로 전달될 수 있으며, 이는 BigInt 객체로 표현된다.

참조 타입

JavaScript 값은(가져오거나 내보낸 글로벌, 테이블 set/get, 함수 인자 또는 반환값을 통해) externref 값으로 WebAssembly와 상호 전달될 수 있다.

다중 테이블

여러 테이블을 JavaScript로 내보내거나 JavaScript에서 가져올 수 있다.

10.2. 릴리스 3.0

다중 메모리

여러 메모리를 JavaScript로 내보내거나 JavaScript에서 가져올 수 있다.

JS 문자열 빌트인

모듈을 컴파일할 때 사용할 수 있는 builtins 옵션과, JS 문자열을 조작하기 위한 내장 함수 모음을 추가했다.

적합성

문서 관례

적합성 요구사항은 서술적 단언과 RFC 2119 용어의 조합으로 표현된다. 이 문서의 규범적 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”이라는 키워드는 RFC 2119에 설명된 대로 해석되어야 한다. 다만 가독성을 위해, 본 명세에서는 이러한 단어들이 모두 대문자로 나타나지 않는다.

명시적으로 비규범으로 표시된 절, 예제 및 주석을 제외한 본 명세의 모든 텍스트는 규범적이다. [RFC2119]

본 명세의 예제는 “for example”이라는 말로 도입되거나, 규범 텍스트와 구분하기 위해 class="example"로 표시되며, 다음과 같다:

이는 정보 제공용 예시의 한 예이다.

정보 제공용 노트는 “Note”라는 단어로 시작하며, 규범 텍스트와 구분하기 위해 class="note"로 표시되며, 다음과 같다:

Note, 이는 정보 제공용 노트이다.

적합 알고리즘

알고리즘의 일부로서 명령형으로 서술된 요구사항(예: "선행 공백 문자를 모두 제거하라" 또는 "false를 반환하고 이 단계를 중단하라")은 알고리즘을 도입할 때 사용된 키워드("must", "should", "may" 등)의 의미로 해석되어야 한다.

알고리즘 또는 구체적 단계로 표현된 적합성 요구사항은 최종 결과가 동등한 한 어떤 방식으로든 구현할 수 있다. 특히, 본 명세에 정의된 알고리즘은 이해하기 쉽도록 의도되었으며 성능을 위한 것이 아니다. 구현자에게는 최적화를 권장한다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBASSEMBLY]
WebAssembly Core Specification. Draft. URL: https://webassembly.github.io/spec/core/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보 제공 참고 문헌

[IEEE-754]
IEEE Standard for Floating-Point Arithmetic. 22 July 2019. URL: https://ieeexplore.ieee.org/document/8766229
[WASMWEB]
WebAssembly Web API Specification. Draft. URL: https://webassembly.github.io/spec/web-api/

IDL 색인

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

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

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

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

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

    readonly attribute Tag JSTag;
};

enum ImportExportKind {
  "function",
  "table",
  "memory",
  "global",
  "tag"
};

enum AddressType {
  "i32",
  "i64",
};

typedef any AddressValue;

dictionary ModuleExportDescriptor {
  required USVString name;
  required ImportExportKind kind;
  // Note: Other fields such as signature may be added in the future.
};

dictionary ModuleImportDescriptor {
  required USVString module;
  required USVString name;
  required ImportExportKind kind;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Module {
  constructor(BufferSource bytes, optional WebAssemblyCompileOptions options = {});
  static sequence<ModuleExportDescriptor> exports(Module moduleObject);
  static sequence<ModuleImportDescriptor> imports(Module moduleObject);
  static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Instance {
  constructor(Module module, optional object importObject);
  readonly attribute object exports;
};

dictionary MemoryDescriptor {
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Memory {
  constructor(MemoryDescriptor descriptor);
  AddressValue grow(AddressValue delta);
  ArrayBuffer toFixedLengthBuffer();
  ArrayBuffer toResizableBuffer();
  readonly attribute ArrayBuffer buffer;
};

enum TableKind {
  "externref",
  "anyfunc",
  // Note: More values may be added in future iterations,
  // e.g., typed function references, typed GC references
};

dictionary TableDescriptor {
  required TableKind element;
  required AddressValue initial;
  AddressValue maximum;
  AddressType address;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Table {
  constructor(TableDescriptor descriptor, optional any value);
  AddressValue grow(AddressValue delta, optional any value);
  any get(AddressValue index);
  undefined set(AddressValue index, optional any value);
  readonly attribute AddressValue length;
};

enum ValueType {
  "i32",
  "i64",
  "f32",
  "f64",
  "v128",
  "externref",
  "anyfunc",
};

dictionary GlobalDescriptor {
  required ValueType value;
  boolean mutable = false;
};

[LegacyNamespace=WebAssembly, Exposed=*]
interface Global {
  constructor(GlobalDescriptor descriptor, optional any v);
  any valueOf();
  attribute any value;
};

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

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

dictionary ExceptionOptions {
  boolean traceStack = false;
};

[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
interface Exception {
  constructor(Tag exceptionTag, sequence<any> payload, optional ExceptionOptions options = {});
  any getArg([EnforceRange] unsigned long index);
  boolean is(Tag exceptionTag);
  readonly attribute (DOMString or undefined) stack;
};

이슈 색인

큰 테이블 또는 메모리의 할당 실패는 다음과 같은 결과를 초래할 수 있다 향후 개정에서는 많은 양의 메모리 할당에 대해 보다 신뢰 가능하고 복구 가능한 오류를 재고할 수 있다.

Issue 879를 참고하라.