diff --git a/document/js-api/index.bs b/document/js-api/index.bs index 19d19808..ead90362 100644 --- a/document/js-api/index.bs +++ b/document/js-api/index.bs @@ -100,6 +100,9 @@ urlPrefix: https://webassembly.github.io/spec/core/; spec: WebAssembly; type: df text: ππ₯π€.πΌππππ text: πΏπ₯π€.πΌππππ text: πΏπ¨π¦.πΌππππ + text: ref.null + text: ref.func + text: ref.host text: function index; url: syntax/modules.html#syntax-funcidx text: function instance; url: exec/runtime.html#function-instances text: init_store; url: appendix/embedding.html#embed-init-store @@ -132,11 +135,16 @@ urlPrefix: https://webassembly.github.io/spec/core/; spec: WebAssembly; type: df text: table address; url: exec/runtime.html#syntax-tableaddr text: function address; url: exec/runtime.html#syntax-funcaddr text: memory address; url: exec/runtime.html#syntax-memaddr - url: syntax/types.html#syntax-valtype + text: host address; url: exec/runtime.html#syntax-hostaddr + url: syntax/types.html#syntax-numtype text: ππ₯π€ text: ππ¨π¦ text: πΏπ₯π€ text: πΏπ¨π¦ + url: syntax/types.html#syntax-reftype + text: anyref + text: anyeqref + text: anyfunc text: function element; url: exec/runtime.html#syntax-funcelem text: import component; url: syntax/modules.html#imports text: external value; url: exec/runtime.html#syntax-externval @@ -223,6 +231,7 @@ Each [=agent=] is associated with the following [=ordered map=]s: * The Memory object cache, mapping [=memory address=]es to {{Memory}} objects. * The Table object cache, mapping [=table address=]es to {{Table}} objects. * The Exported Function cache, mapping [=function address=]es to [=Exported Function=] objects. + * The Host value cache, mapping [=host address=]es to values.
enum TableKind {
+ "anyref",
+ "anyeqref",
"anyfunc",
// Note: More values may be added in future iterations,
// e.g., typed function references, typed GC references
@@ -742,7 +753,7 @@ This slot holds a [=function address=] relative to the [=surrounding agent=]'s [
1. For each type |t| of |parameters|,
1. If the length of |argValues| > |i|, let |arg| be |argValues|[i].
1. Otherwise, let |arg| be undefined.
- 1. [=Append=] [=ToWebAssemblyValue=](|arg|, |t|) to |args|.
+ 1. [=Append=] [=ToWebAssemblyValue=](|arg|, |t|, {{TypeError}}) to |args|.
1. Set |i| to |i| + 1.
1. Let (|store|, |ret|) be the result of [=invoke_func=](|store|, |funcaddr|, |args|).
1. Set the [=surrounding agent=]'s [=associated store=] to |store|.
@@ -767,7 +778,7 @@ Note: Exported Functions do not have a \[[Construct]] method and thus it is not
1. Let |ret| be ? [=Call=](|func|, undefined, |jsArguments|). If an exception is thrown, trigger a WebAssembly trap, and propagate the exception to the enclosing JavaScript.
1. Let [|parameters|] β [|results|] be |functype|.
1. If |results| is empty, return undefined.
- 1. Otherwise, return [=ToWebAssemblyValue=](|ret|, |results|[0]).
+ 1. Otherwise, return [=ToWebAssemblyValue=](|ret|, |results|[0], {{TypeError}}).
1. Let |store| be the [=surrounding agent=]'s [=associated store=].
1. Let (|store|, |funcaddr|) be [=alloc_func=](|store|, |functype|, |hostfunc|).
1. Set the [=surrounding agent=]'s [=associated store=] to |store|.
@@ -781,6 +792,9 @@ Assert: |w| is not of the form [=ππ¨π¦.πΌππππ=] |i64|.
1. If |w| is of the form [=ππ₯π€.πΌππππ=] |i32|, return [=the Number value=] for [=signed_32=](|i32|).
1. If |w| is of the form [=πΏπ₯π€.πΌππππ=] |f32|, return [=the Number value=] for |f32|.
1. If |w| is of the form [=πΏπ¨π¦.πΌππππ=] |f64|, return [=the Number value=] for |f64|.
+1. If |w| is of the form [=ref.null=], return null.
+1. If |w| is of the form [=ref.func=] |funcaddr|, return the result of creating [=a new Exported Function=] from |funcaddr|.
+1. If |w| is of the form [=ref.host=] |hostaddr|, return the result of [=retrieving a host value=] from |hostaddr|.
@@ -788,7 +802,14 @@ Note: Implementations may optionally replace the NaN payload with any other NaN
-The algorithm ToWebAssemblyValue(|v|, |type|) coerce a JavaScript value to a [=WebAssembly value=] performs the following steps:
+ For retrieving a host value from a [=host address=] |hostaddr|, perform the following steps:
+ 1. Let |map| be the [=surrounding agent=]'s associated [=host value cache=].
+ 1. Assert: |map|[|hostaddr|] [=map/exists=].
+ 1. Return |map|[|hostaddr|].
+
+
+
+The algorithm ToWebAssemblyValue(|v|, |type|, |error|) coerces a JavaScript value to a [=WebAssembly value=] performs the following steps:
Assert: |type| is not [=ππ¨π¦=].
@@ -801,9 +822,34 @@ Assert: |type| is not [=ππ¨π¦=].
1. If |type| is [=πΏπ¨π¦=],
1. Let |f64| be ? [=ToNumber=](|v|).
1. Return [=πΏπ¨π¦.πΌππππ=] |f64|.
+1. If |type| is [=anyref=],
+ 1. If |v| is a primitive value but not a string, symbol, or null, throw |error|.
+ 1. Return the result of [=allocating a host address=] for |v|.
+1. If |type| is [=anyeqref=],
+ 1. If |v| is a primitive value but not a symbol or null, throw |error|.
+ 1. Return the result of [=allocating a host address=] for |v|.
+1. If |type| is [=anyfunc=],
+ 1. If |v| is not an [=Exported function=] or null, throw |error|.
+ 1. Return the result of [=allocating a host address=] for |v|.
+
+ For allocating a host address for a value |v|, perform the following steps:
+ 1. If |v| is null,
+ 1. Return [=ref.null=].
+ 1. If |v| is an [=Exported Function=],
+ 1. Let |funcaddr| be the value of |v|'s \[[FunctionAddress]] internal slot.
+ 1. Return [=ref.func=] |funcaddr|.
+ 1. Let |map| be the [=surrounding agent=]'s associated [=host value cache=].
+ 1. If a [=host address=] |hostaddr| exists such that |map|[|hostaddr|] is the same as |v|,
+ 1. Return [=ref.host=] |hostaddr|.
+ 1. Let [=host address=] |hostaddr| be the smallest address such that |map|[|hostaddr|] [=map/exists=] is false.
+ 1. [=map/Set=] |map|[|hostaddr|] to |v|.
+ 1. Return [=ref.host=] |hostaddr|.
+
+
+
Error Objects
WebAssembly defines the following Error classes: {{CompileError}}, {{LinkError}}, and {{RuntimeError}}. WebAssembly errors have the following custom bindings:
diff --git a/proposals/reference-types/Overview.md b/proposals/reference-types/Overview.md
index 1182e5b6..3675bd7b 100644
--- a/proposals/reference-types/Overview.md
+++ b/proposals/reference-types/Overview.md
@@ -100,7 +100,7 @@ API extensions:
* Any JS object (non-primitive value) or string or symbol or `null` can be passed as `anyref` to a Wasm function, stored in a global, or in a table.
- It may be possible to allow all other non-primitive values as well, depending on details of existing engines.
-* Any JS function object or `null` can be passed as `anyfunc` to a Wasm function, stored in a global, or in a table.
+* Any Wasm exported function object or `null` can be passed as `anyfunc` to a Wasm function, stored in a global, or in a table.
## Possible Future Extensions