зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1668330 - Part 2: Modify the ScriptLoader to work with the API changes for import-assertions. r=yulia
Differential Revision: https://phabricator.services.mozilla.com/D109495
This commit is contained in:
Родитель
a74b4f724b
Коммит
c845650f07
|
@ -1016,12 +1016,12 @@ static LoadedScript* GetLoadedScriptOrNull(
|
|||
return script;
|
||||
}
|
||||
|
||||
// 8.1.3.8.1 HostResolveImportedModule(referencingModule, specifier)
|
||||
// 8.1.3.8.1 HostResolveImportedModule(referencingModule, moduleRequest)
|
||||
JSObject* HostResolveImportedModule(JSContext* aCx,
|
||||
JS::Handle<JS::Value> aReferencingPrivate,
|
||||
JS::Handle<JSString*> aSpecifier) {
|
||||
JS::Handle<JSObject*> aModuleRequest) {
|
||||
JS::Rooted<JSObject*> module(aCx);
|
||||
ScriptLoader::ResolveImportedModule(aCx, aReferencingPrivate, aSpecifier,
|
||||
ScriptLoader::ResolveImportedModule(aCx, aReferencingPrivate, aModuleRequest,
|
||||
&module);
|
||||
return module;
|
||||
}
|
||||
|
@ -1029,15 +1029,22 @@ JSObject* HostResolveImportedModule(JSContext* aCx,
|
|||
/* static */
|
||||
void ScriptLoader::ResolveImportedModule(
|
||||
JSContext* aCx, JS::Handle<JS::Value> aReferencingPrivate,
|
||||
JS::Handle<JSString*> aSpecifier, JS::MutableHandle<JSObject*> aModuleOut) {
|
||||
JS::Handle<JSObject*> aModuleRequest,
|
||||
JS::MutableHandle<JSObject*> aModuleOut) {
|
||||
MOZ_ASSERT(!aModuleOut);
|
||||
|
||||
RefPtr<LoadedScript> script(GetLoadedScriptOrNull(aCx, aReferencingPrivate));
|
||||
|
||||
JS::Rooted<JSString*> specifierString(
|
||||
aCx, JS::GetModuleRequestSpecifier(aCx, aModuleRequest));
|
||||
if (!specifierString) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Let url be the result of resolving a module specifier given referencing
|
||||
// module script and specifier.
|
||||
nsAutoJSString string;
|
||||
if (!string.init(aCx, aSpecifier)) {
|
||||
if (!string.init(aCx, specifierString)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1097,13 +1104,19 @@ bool HostPopulateImportMeta(JSContext* aCx,
|
|||
|
||||
bool HostImportModuleDynamically(JSContext* aCx,
|
||||
JS::Handle<JS::Value> aReferencingPrivate,
|
||||
JS::Handle<JSString*> aSpecifier,
|
||||
JS::Handle<JSObject*> aModuleRequest,
|
||||
JS::Handle<JSObject*> aPromise) {
|
||||
RefPtr<LoadedScript> script(GetLoadedScriptOrNull(aCx, aReferencingPrivate));
|
||||
|
||||
JS::Rooted<JSString*> specifierString(
|
||||
aCx, JS::GetModuleRequestSpecifier(aCx, aModuleRequest));
|
||||
if (!specifierString) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Attempt to resolve the module specifier.
|
||||
nsAutoJSString specifier;
|
||||
if (!specifier.init(aCx, aSpecifier)) {
|
||||
if (!specifier.init(aCx, specifierString)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1159,7 +1172,8 @@ bool HostImportModuleDynamically(JSContext* aCx,
|
|||
}
|
||||
|
||||
RefPtr<ModuleLoadRequest> request = ModuleLoadRequest::CreateDynamicImport(
|
||||
uri, options, baseURL, loader, aReferencingPrivate, aSpecifier, aPromise);
|
||||
uri, options, baseURL, loader, aReferencingPrivate, specifierString,
|
||||
aPromise);
|
||||
|
||||
loader->StartDynamicImport(request);
|
||||
return true;
|
||||
|
@ -1220,8 +1234,14 @@ void ScriptLoader::FinishDynamicImport_NoTLA(JSContext* aCx,
|
|||
JS::Rooted<JSString*> specifier(aCx, aRequest->mDynamicSpecifier);
|
||||
JS::Rooted<JSObject*> promise(aCx, aRequest->mDynamicPromise);
|
||||
|
||||
JS::FinishDynamicModuleImport_NoTLA(aCx, status, referencingScript, specifier,
|
||||
promise);
|
||||
JS::Rooted<JSObject*> moduleRequest(aCx,
|
||||
JS::CreateModuleRequest(aCx, specifier));
|
||||
if (!moduleRequest) {
|
||||
JS_ReportOutOfMemory(aCx);
|
||||
}
|
||||
|
||||
JS::FinishDynamicModuleImport_NoTLA(aCx, status, referencingScript,
|
||||
moduleRequest, promise);
|
||||
|
||||
// FinishDynamicModuleImport clears any pending exception.
|
||||
MOZ_ASSERT(!JS_IsExceptionPending(aCx));
|
||||
|
@ -1254,8 +1274,14 @@ void ScriptLoader::FinishDynamicImport(
|
|||
JS::Rooted<JSString*> specifier(aCx, aRequest->mDynamicSpecifier);
|
||||
JS::Rooted<JSObject*> promise(aCx, aRequest->mDynamicPromise);
|
||||
|
||||
JS::Rooted<JSObject*> moduleRequest(aCx,
|
||||
JS::CreateModuleRequest(aCx, specifier));
|
||||
if (!moduleRequest) {
|
||||
JS_ReportOutOfMemory(aCx);
|
||||
}
|
||||
|
||||
JS::FinishDynamicModuleImport(aCx, aEvaluationPromise, referencingScript,
|
||||
specifier, promise);
|
||||
moduleRequest, promise);
|
||||
|
||||
// FinishDynamicModuleImport clears any pending exception.
|
||||
MOZ_ASSERT(!JS_IsExceptionPending(aCx));
|
||||
|
|
|
@ -403,12 +403,12 @@ class ScriptLoader final : public nsISupports {
|
|||
*
|
||||
* @param aReferencingPrivate A JS::Value which is either undefined
|
||||
* or contains a LoadedScript private pointer.
|
||||
* @param aSpecifier The module specifier.
|
||||
* @param aModuleRequest A module request object.
|
||||
* @param aModuleOut This is set to the module found.
|
||||
*/
|
||||
static void ResolveImportedModule(JSContext* aCx,
|
||||
JS::Handle<JS::Value> aReferencingPrivate,
|
||||
JS::Handle<JSString*> aSpecifier,
|
||||
JS::Handle<JSObject*> aModuleRequest,
|
||||
JS::MutableHandle<JSObject*> aModuleOut);
|
||||
|
||||
void StartDynamicImport(ModuleLoadRequest* aRequest);
|
||||
|
|
|
@ -211,6 +211,11 @@ extern JS_PUBLIC_API void GetRequestedModuleSourcePos(
|
|||
*/
|
||||
extern JS_PUBLIC_API JSScript* GetModuleScript(Handle<JSObject*> moduleRecord);
|
||||
|
||||
extern JS_PUBLIC_API JSObject* CreateModuleRequest(
|
||||
JSContext* cx, Handle<JSString*> specifierArg);
|
||||
extern JS_PUBLIC_API JSString* GetModuleRequestSpecifier(
|
||||
JSContext* cx, Handle<JSObject*> moduleRequestArg);
|
||||
|
||||
} // namespace JS
|
||||
|
||||
#endif // js_Modules_h
|
||||
|
|
|
@ -195,3 +195,25 @@ JS_PUBLIC_API JSScript* JS::GetModuleScript(JS::HandleObject moduleRecord) {
|
|||
|
||||
return moduleRecord->as<ModuleObject>().script();
|
||||
}
|
||||
|
||||
JS_PUBLIC_API JSObject* JS::CreateModuleRequest(
|
||||
JSContext* cx, Handle<JSString*> specifierArg) {
|
||||
AssertHeapIsIdle();
|
||||
CHECK_THREAD(cx);
|
||||
|
||||
js::RootedAtom specifierAtom(cx, AtomizeString(cx, specifierArg));
|
||||
if (!specifierAtom) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return js::ModuleRequestObject::create(cx, specifierAtom);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API JSString* JS::GetModuleRequestSpecifier(
|
||||
JSContext* cx, Handle<JSObject*> moduleRequestArg) {
|
||||
AssertHeapIsIdle();
|
||||
CHECK_THREAD(cx);
|
||||
cx->check(moduleRequestArg);
|
||||
|
||||
return moduleRequestArg->as<js::ModuleRequestObject>().specifier();
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче