diff --git a/document/js-api/index.bs b/document/js-api/index.bs
index 3fb066dd7..560be6024 100644
--- a/document/js-api/index.bs
+++ b/document/js-api/index.bs
@@ -110,6 +110,8 @@ urlPrefix: https://tc39.github.io/ecma262/; spec: ECMASCRIPT
text: ToBigInt64; url: sec-tobigint64
text: Module Namespace exotic object; url: sec-module-namespace-exotic-objects
text: ResolvedBinding Record; url: resolvedbinding-record
+ text: ModuleRequest Record; url: modulerequest-record
+ text: ImportAttribute Record; url: importattribute-record
type: abstract-op
text: CreateDataPropertyOrThrow; url: sec-createdatapropertyorthrow
text: CreateMethodProperty; url: sec-createmethodproperty
@@ -2316,11 +2318,12 @@ To parse a WebAssembly module given a byte sequence |by
1. For each (|moduleName|, |name|, |type|) in [=module_imports=](|module|.\[[Module]]),
1. If |moduleName| starts with the prefix "wasm-js:",
1. Throw a {{LinkError}} exception.
- 1. If |name| starts with the prefix "wasm:" or "wasm-js:",
+ 1. If |name| starts with the prefix "wasm:" or "wasm-js:", and |name| is not equal to "wasm-js:phase/source" or "wasm-js:phase/source",
1. Throw a {{LinkError}} exception.
1. Note: The following step only applies when integrating with the JS String Builtins proposal.
1. If [=Find a builtin=] with (|moduleName|, |name|, |type|) and builtins |module|.\[[BuiltinSets]] is not null, then [=iteration/continue=].
- 1. [=set/Append=] |moduleName| to |requestedModules|.
+ 1. Let (|moduleRequest|, importName) be the [=module request=] for |moduleName| and |name|.
+ 1. [=set/Append=] |moduleRequest| to |requestedModules|.
1. For each (|name|, type) in [=module_exports=](|module|.\[[Module]])
1. If |name| starts with the prefix "wasm:" or "wasm-js:",
1. Throw a {{LinkError}} exception.
@@ -2364,6 +2367,18 @@ The export name list of a WebAssembly Module Record |record| is defin
+
+The module request for a string |moduleName| and a string |name| is defined by the following algorithm:
+
+1. Let |attributes| be an empty [=set=].
+1. Let |phase| be ~evaluation~.
+1. If |name| is equal to "wasm-js:phase/source", set |phase| to ~source~.
+1. If |name| is equal to "wasm-js:phase/defer", set |phase| to ~defer~.
+1. Let |moduleRequest| be a new [=ModuleRequest Record=] { \[[Specifier]]: |name|, \[[Attributes]]: |attributes|, \[[Phase]]: _phase_ }.
+1. Return (|moduleRequest|, |name|).
+
+
+
WebAssembly Module Records have the following methods:
@@ -2411,57 +2426,69 @@ WebAssembly Module Records have the following methods:
1. [=list/iterate|For each=] (|importedModuleName|, |name|, |importtype|) in [=module_imports=](|module|),
1. Note: The following step only applies when integrating with the JS String Builtins proposal.
1. If [=Find a builtin=] with (|importedModuleName|, |name|) and builtins |module|.\[[BuiltinSets]] is not null, then [=iteration/continue=].
- 1. Let |importedModule| be [$GetImportedModule$](|record|, |importedModuleName|).
- 1. Let |resolution| be |importedModule|.ResolveExport(|name|).
- 1. Assert: |resolution| is a [=ResolvedBinding Record=], as validated during environment initialization.
- 1. Let |resolvedModule| be |resolution|.\\[[Module]].
- 1. Let |resolvedName| be |resolution|.\[[BindingName]].
- 1. If |resolvedModule| is a WebAssembly Module Record,
- 1. If |resolvedModule|.\[[Instance]] is ~empty~, throw a {LinkError} exception.
- 1. Assert: |resolvedModule|.\[[Instance]] is a WebAssembly {{Instance}} object.
- 1. Assert: |resolvedModule|.\[[ModuleSource]] is a WebAssembly {{Module}} object.
- 1. Let |module| be |resolvedModule|.\[[ModuleSource]].\[[Module]].
- 1. Let |externval| be [=instance_export=](|resolvedModule|.\[[Instance]], |resolvedName|).
- 1. Assert: |externval| is not [=error=].
- 1. Assert: [=module_exports=](|module|) contains an element (|resolvedName|, type).
- 1. Let |externtype| be the value of |type| for the element (|resolvedName|, |type|) in [=module_exports=](|module|).
- 1. If |importtype| is not an [=extern subtype=] of |externtype|, throw a {{LinkError}} exception.
- 1. [=list/Append=] |externval| to |imports|.
- 1. Otherwise,
- 1. Let |env| be |resolvedModule|.\[[Environment]].
- 1. Let |v| be [=?=] |env|.GetBindingValue(|resolvedName|, true).
- 1. If |importtype| is of the form [=func=] |functype|,
- 1. If [$IsCallable$](|v|) is false, throw a {{LinkError}} exception.
- 1. If |v| has a \[[FunctionAddress]] internal slot, and therefore is an [=Exported Function=],
- 1. Let |funcaddr| be the value of |v|'s \[[FunctionAddress]] internal slot.
- 1. Otherwise,
- 1. [=Create a host function=] from |v| and |functype|, and let |funcaddr| be the result.
- 1. Let index be the number of external functions in |imports|, defining the [=index of the host function=] |funcaddr|.
- 1. Let |externfunc| be the [=external value=] [=external value|func=] |funcaddr|.
- 1. [=list/Append=] |externfunc| to |imports|.
- 1. If |importtype| is of the form [=global=] |mut| |valtype|,
- 1. Let |store| be the [=surrounding agent=]'s [=associated store=].
- 1. If |v| [=implements=] {{Global}},
- 1. Let |globaladdr| be |v|.\[[Global]].
- 1. Let |targetmut| valuetype be [=global_type=](|store|, |globaladdr|).
- 1. If |mut| is [=const=] and |targetmut| is [=var=], throw a {{LinkError}} exception.
- 1. Otherwise,
- 1. If |valtype| is [=v128=], throw a {{LinkError}} exception.
- 1. If |mut| is [=var=], throw a {{LinkError}} exception.
- 1. Let |value| be [=?=] [=ToWebAssemblyValue=](|v|, |valtype|).
- 1. Let (|store|, |globaladdr|) be [=global_alloc=](|store|, |mut| |valtype|, |value|).
- 1. Set the [=surrounding agent=]'s [=associated store=] to |store|.
- 1. Let |externglobal| be [=external value|global=] |globaladdr|.
- 1. [=list/Append=] |externglobal| to |imports|.
- 1. If |importtype| is of the form [=mem=] memtype,
- 1. If |v| does not [=implement=] {{Memory}}, throw a {{LinkError}} exception.
- 1. Let |externmem| be the [=external value=] [=external value|mem=] |v|.\[[Memory]].
- 1. [=list/Append=] |externmem| to |imports|.
- 1. If |importtype| is of the form [=table=] tabletype,
- 1. If |v| does not [=implement=] {{Table}}, throw a {{LinkError}} exception.
- 1. Let |tableaddr| be |v|.\[[Table]].
- 1. Let |externtable| be the [=external value=] [=external value|table=] |tableaddr|.
- 1. [=list/Append=] |externtable| to |imports|.
+ 1. Let (|moduleRequest|, |importName|) be the [=module request=] for |moduleName| and |name|.
+ 1. Let |importedModule| be [$GetImportedModule$](|record|, |moduleRequest|).
+ 1. If |moduleRequest|.\[[Phase]] is ~defer~ or ~source~,
+ 1. If |moduleRequest|.\[[Phase]] is ~defer~, let |phase| be GetModuleNamespace(|importedModule|, ~defer~).
+ 1. Else, let |phase| be _importedModule_.[[ModuleSource]] throwing a *SyntextError* exception if ~empty~.
+ 1. If |importtype| is not of the form [=global=] [=const=] |valtype|, throw a {{LinkError}} exception.
+ 1. Let |store| be the [=surrounding agent=]'s [=associated store=].
+ 1. Let |value| be [=?=] [=ToWebAssemblyValue=](|v|, |valtype|).
+ 1. Let (|store|, |globaladdr|) be [=global_alloc=](|store|, |mut| |valtype|, |value|).
+ 1. Set the [=surrounding agent=]'s [=associated store=] to |store|.
+ 1. Let |externglobal| be [=external value|global=] |globaladdr|.
+ 1. [=list/Append=] |externglobal| to |imports|.
+ 1. Else,
+ 1. Let |resolution| be |importedModule|.ResolveExport(|importName|).
+ 1. Assert: |resolution| is a [=ResolvedBinding Record=], as validated during environment initialization.
+ 1. Let |resolvedModule| be |resolution|.\\[[Module]].
+ 1. Let |resolvedName| be |resolution|.\[[BindingName]].
+ 1. If |resolvedModule| is a WebAssembly Module Record,
+ 1. If |resolvedModule|.\[[Instance]] is ~empty~, throw a {LinkError} exception.
+ 1. Assert: |resolvedModule|.\[[Instance]] is a WebAssembly {{Instance}} object.
+ 1. Assert: |resolvedModule|.\[[ModuleSource]] is a WebAssembly {{Module}} object.
+ 1. Let |module| be |resolvedModule|.\[[ModuleSource]].\[[Module]].
+ 1. Let |externval| be [=instance_export=](|resolvedModule|.\[[Instance]], |resolvedName|).
+ 1. Assert: |externval| is not [=error=].
+ 1. Assert: [=module_exports=](|module|) contains an element (|resolvedName|, type).
+ 1. Let |externtype| be the value of |type| for the element (|resolvedName|, |type|) in [=module_exports=](|module|).
+ 1. If |importtype| is not an [=extern subtype=] of |externtype|, throw a {{LinkError}} exception.
+ 1. [=list/Append=] |externval| to |imports|.
+ 1. Otherwise,
+ 1. Let |env| be |resolvedModule|.\[[Environment]].
+ 1. Let |v| be [=?=] |env|.GetBindingValue(|resolvedName|, true).
+ 1. If |importtype| is of the form [=func=] |functype|,
+ 1. If [$IsCallable$](|v|) is false, throw a {{LinkError}} exception.
+ 1. If |v| has a \[[FunctionAddress]] internal slot, and therefore is an [=Exported Function=],
+ 1. Let |funcaddr| be the value of |v|'s \[[FunctionAddress]] internal slot.
+ 1. Otherwise,
+ 1. [=Create a host function=] from |v| and |functype|, and let |funcaddr| be the result.
+ 1. Let index be the number of external functions in |imports|, defining the [=index of the host function=] |funcaddr|.
+ 1. Let |externfunc| be the [=external value=] [=external value|func=] |funcaddr|.
+ 1. [=list/Append=] |externfunc| to |imports|.
+ 1. If |importtype| is of the form [=global=] |mut| |valtype|,
+ 1. Let |store| be the [=surrounding agent=]'s [=associated store=].
+ 1. If |v| [=implements=] {{Global}},
+ 1. Let |globaladdr| be |v|.\[[Global]].
+ 1. Let |targetmut| valuetype be [=global_type=](|store|, |globaladdr|).
+ 1. If |mut| is [=const=] and |targetmut| is [=var=], throw a {{LinkError}} exception.
+ 1. Otherwise,
+ 1. If |valtype| is [=v128=], throw a {{LinkError}} exception.
+ 1. If |mut| is [=var=], throw a {{LinkError}} exception.
+ 1. Let |value| be [=?=] [=ToWebAssemblyValue=](|v|, |valtype|).
+ 1. Let (|store|, |globaladdr|) be [=global_alloc=](|store|, |mut| |valtype|, |value|).
+ 1. Set the [=surrounding agent=]'s [=associated store=] to |store|.
+ 1. Let |externglobal| be [=external value|global=] |globaladdr|.
+ 1. [=list/Append=] |externglobal| to |imports|.
+ 1. If |importtype| is of the form [=mem=] memtype,
+ 1. If |v| does not [=implement=] {{Memory}}, throw a {{LinkError}} exception.
+ 1. Let |externmem| be the [=external value=] [=external value|mem=] |v|.\[[Memory]].
+ 1. [=list/Append=] |externmem| to |imports|.
+ 1. If |importtype| is of the form [=table=] tabletype,
+ 1. If |v| does not [=implement=] {{Table}}, throw a {{LinkError}} exception.
+ 1. Let |tableaddr| be |v|.\[[Table]].
+ 1. Let |externtable| be the [=external value=] [=external value|table=] |tableaddr|.
+ 1. [=list/Append=] |externtable| to |imports|.
1. [=Instantiate the core of a WebAssembly module=] |module| with |imports|, and let |instance| be the result.
1. Set |record|.\[[Instance]] to |instance|.
1. [=list/iterate|For each=] (|name|, |externtype|) of [=module_exports=](|module|),