mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-26 23:18:26 +00:00
Issue #618 - Simplify module resolve hook to be a function pointer
This is an ahead-of time port to try and address #1624. This is based on BZ 1461751 and Jon Coppeard's work in it.
This commit is contained in:
+16
-29
@@ -787,24 +787,20 @@ ScriptLoader::StartFetchingModuleAndDependencies(ModuleLoadRequest* aParent,
|
||||
}
|
||||
|
||||
// 8.1.3.8.1 HostResolveImportedModule(referencingModule, specifier)
|
||||
bool
|
||||
HostResolveImportedModule(JSContext* aCx, unsigned argc, JS::Value* vp)
|
||||
JSObject*
|
||||
HostResolveImportedModule(JSContext* aCx, JS::Handle<JSObject*> aModule,
|
||||
JS::Handle<JSString*> aSpecifier)
|
||||
{
|
||||
MOZ_ASSERT(argc == 2);
|
||||
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
||||
JS::Rooted<JSObject*> module(aCx, &args[0].toObject());
|
||||
JS::Rooted<JSString*> specifier(aCx, args[1].toString());
|
||||
|
||||
// Let referencing module script be referencingModule.[[HostDefined]].
|
||||
JS::Value value = JS::GetModuleHostDefinedField(module);
|
||||
JS::Value value = JS::GetModuleHostDefinedField(aModule);
|
||||
auto script = static_cast<ModuleScript*>(value.toPrivate());
|
||||
MOZ_ASSERT(script->ModuleRecord() == module);
|
||||
MOZ_ASSERT(script->ModuleRecord() == aModule);
|
||||
|
||||
// Let url be the result of resolving a module specifier given referencing
|
||||
// module script and specifier.
|
||||
nsAutoJSString string;
|
||||
if (!string.init(aCx, specifier)) {
|
||||
return false;
|
||||
if (!string.init(aCx, aSpecifier)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIURI> uri = ResolveModuleSpecifier(script, string);
|
||||
@@ -820,27 +816,20 @@ HostResolveImportedModule(JSContext* aCx, unsigned argc, JS::Value* vp)
|
||||
MOZ_ASSERT(ms, "Resolved module not found in module map");
|
||||
|
||||
MOZ_ASSERT(!ms->HasParseError());
|
||||
MOZ_ASSERT(ms->ModuleRecord());
|
||||
|
||||
*vp = JS::ObjectValue(*ms->ModuleRecord());
|
||||
return true;
|
||||
return ms->ModuleRecord();
|
||||
}
|
||||
|
||||
static nsresult
|
||||
static void
|
||||
EnsureModuleResolveHook(JSContext* aCx)
|
||||
{
|
||||
if (JS::GetModuleResolveHook(aCx)) {
|
||||
return NS_OK;
|
||||
JSRuntime* rt = JS_GetRuntime(aCx);
|
||||
if (JS::GetModuleResolveHook(rt)) {
|
||||
return;
|
||||
}
|
||||
|
||||
JS::Rooted<JSFunction*> func(aCx);
|
||||
func = JS_NewFunction(aCx, HostResolveImportedModule, 2, 0,
|
||||
"HostResolveImportedModule");
|
||||
if (!func) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
JS::SetModuleResolveHook(aCx, func);
|
||||
return NS_OK;
|
||||
JS::SetModuleResolveHook(rt, HostResolveImportedModule);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -928,8 +917,7 @@ ScriptLoader::InstantiateModuleTree(ModuleLoadRequest* aRequest)
|
||||
return false;
|
||||
}
|
||||
|
||||
nsresult rv = EnsureModuleResolveHook(jsapi.cx());
|
||||
NS_ENSURE_SUCCESS(rv, false);
|
||||
EnsureModuleResolveHook(jsapi.cx());
|
||||
|
||||
JS::Rooted<JSObject*> module(jsapi.cx(), moduleScript->ModuleRecord());
|
||||
bool ok = NS_SUCCEEDED(nsJSUtils::ModuleInstantiate(jsapi.cx(), module));
|
||||
@@ -1963,8 +1951,7 @@ ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest)
|
||||
}
|
||||
|
||||
if (aRequest->IsModuleRequest()) {
|
||||
rv = EnsureModuleResolveHook(cx);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
EnsureModuleResolveHook(cx);
|
||||
|
||||
ModuleLoadRequest* request = aRequest->AsModuleRequest();
|
||||
MOZ_ASSERT(request->mModuleScript);
|
||||
|
||||
Reference in New Issue
Block a user