Bug 1481196 - Compile module scripts to a JSScript like we do for classic scripts r=jandem r=baku

This commit is contained in:
Jon Coppeard
2018-08-08 10:40:03 +01:00
parent ae54496f36
commit 2eb4bd067c
23 changed files with 191 additions and 149 deletions

View File

@@ -478,12 +478,12 @@ ScriptLoader::CreateModuleScript(ModuleLoadRequest* aRequest)
nsresult rv;
{
JSContext* cx = aes.cx();
JS::Rooted<JSObject*> module(cx);
JS::Rooted<JSScript*> script(cx);
if (aRequest->mWasCompiledOMT) {
module = JS::FinishOffThreadModule(cx, aRequest->mOffThreadToken);
script = JS::FinishOffThreadModule(cx, aRequest->mOffThreadToken);
aRequest->mOffThreadToken = nullptr;
rv = module ? NS_OK : NS_ERROR_FAILURE;
rv = script ? NS_OK : NS_ERROR_FAILURE;
} else {
JS::Rooted<JSObject*> global(cx, globalObject->GetGlobalJSObject());
@@ -493,19 +493,19 @@ ScriptLoader::CreateModuleScript(ModuleLoadRequest* aRequest)
if (NS_SUCCEEDED(rv)) {
auto srcBuf = GetScriptSource(cx, aRequest);
if (srcBuf) {
rv = nsJSUtils::CompileModule(cx, *srcBuf, global, options, &module);
rv = nsJSUtils::CompileModule(cx, *srcBuf, global, options, &script);
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
}
}
MOZ_ASSERT(NS_SUCCEEDED(rv) == (module != nullptr));
MOZ_ASSERT(NS_SUCCEEDED(rv) == (script != nullptr));
RefPtr<ModuleScript> moduleScript = new ModuleScript(this, aRequest->mBaseURL);
aRequest->mModuleScript = moduleScript;
if (!module) {
if (!script) {
LOG(("ScriptLoadRequest (%p): compilation failed (%d)",
aRequest, unsigned(rv)));
@@ -521,7 +521,7 @@ ScriptLoader::CreateModuleScript(ModuleLoadRequest* aRequest)
return NS_OK;
}
moduleScript->SetModuleRecord(module);
moduleScript->SetScript(script);
// Validate requested modules and treat failure to resolve module specifiers
// the same as a parse error.
@@ -614,14 +614,14 @@ ResolveRequestedModules(ModuleLoadRequest* aRequest, nsCOMArray<nsIURI>* aUrlsOu
ModuleScript* ms = aRequest->mModuleScript;
AutoJSAPI jsapi;
if (!jsapi.Init(ms->ModuleRecord())) {
if (!jsapi.Init(JS::GetScriptGlobal(ms->Script()))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JSObject*> moduleRecord(cx, ms->ModuleRecord());
JS::Rooted<JSScript*> script(cx, ms->Script());
JS::Rooted<JSObject*> requestedModules(cx);
requestedModules = JS::GetRequestedModules(cx, moduleRecord);
requestedModules = JS::GetRequestedModules(cx, script);
MOZ_ASSERT(requestedModules);
uint32_t length;
@@ -755,14 +755,14 @@ ScriptLoader::StartFetchingModuleAndDependencies(ModuleLoadRequest* aParent,
}
// 8.1.3.8.1 HostResolveImportedModule(referencingModule, specifier)
JSObject*
HostResolveImportedModule(JSContext* aCx, JS::Handle<JSObject*> aModule,
JSScript*
HostResolveImportedModule(JSContext* aCx, JS::Handle<JSScript*> aScript,
JS::Handle<JSString*> aSpecifier)
{
// Let referencing module script be referencingModule.[[HostDefined]].
JS::Value value = JS::GetModuleHostDefinedField(aModule);
JS::Value value = JS::GetModuleHostDefinedField(aScript);
auto script = static_cast<ModuleScript*>(value.toPrivate());
MOZ_ASSERT(script->ModuleRecord() == aModule);
MOZ_ASSERT(script->Script() == aScript);
// Let url be the result of resolving a module specifier given referencing
// module script and specifier.
@@ -783,25 +783,25 @@ HostResolveImportedModule(JSContext* aCx, JS::Handle<JSObject*> aModule,
MOZ_ASSERT(ms, "Resolved module not found in module map");
MOZ_ASSERT(!ms->HasParseError());
MOZ_ASSERT(ms->ModuleRecord());
MOZ_ASSERT(ms->Script());
return ms->ModuleRecord();
return ms->Script();
}
bool
HostPopulateImportMeta(JSContext* aCx, JS::Handle<JSObject*> aModule,
HostPopulateImportMeta(JSContext* aCx, JS::Handle<JSScript*> aScript,
JS::Handle<JSObject*> aMetaObject)
{
MOZ_DIAGNOSTIC_ASSERT(aModule);
MOZ_DIAGNOSTIC_ASSERT(aScript);
JS::Value value = JS::GetModuleHostDefinedField(aModule);
JS::Value value = JS::GetModuleHostDefinedField(aScript);
if (value.isUndefined()) {
JS_ReportErrorASCII(aCx, "Module script not found");
return false;
}
auto script = static_cast<ModuleScript*>(value.toPrivate());
MOZ_DIAGNOSTIC_ASSERT(script->ModuleRecord() == aModule);
MOZ_DIAGNOSTIC_ASSERT(script->Script() == aScript);
nsAutoCString url;
MOZ_DIAGNOSTIC_ASSERT(script->BaseURL());
@@ -932,18 +932,18 @@ ScriptLoader::InstantiateModuleTree(ModuleLoadRequest* aRequest)
return true;
}
MOZ_ASSERT(moduleScript->ModuleRecord());
MOZ_ASSERT(moduleScript->Script());
nsAutoMicroTask mt;
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(moduleScript->ModuleRecord()))) {
if (NS_WARN_IF(!jsapi.Init(JS::GetScriptGlobal(moduleScript->Script())))) {
return false;
}
EnsureModuleResolveHook(jsapi.cx());
JS::Rooted<JSObject*> module(jsapi.cx(), moduleScript->ModuleRecord());
bool ok = NS_SUCCEEDED(nsJSUtils::ModuleInstantiate(jsapi.cx(), module));
JS::Rooted<JSScript*> script(jsapi.cx(), moduleScript->Script());
bool ok = NS_SUCCEEDED(nsJSUtils::ModuleInstantiate(jsapi.cx(), script));
if (!ok) {
LOG(("ScriptLoadRequest (%p): Instantiate failed", aRequest));
@@ -2303,20 +2303,19 @@ ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest)
return NS_OK; // An error is reported by AutoEntryScript.
}
JS::Rooted<JSObject*> module(cx, moduleScript->ModuleRecord());
MOZ_ASSERT(module);
JS::Rooted<JSScript*> script(cx, moduleScript->Script());
MOZ_ASSERT(script);
if (!moduleScript->SourceElementAssociated()) {
rv = nsJSUtils::InitModuleSourceElement(cx, module, aRequest->Element());
rv = nsJSUtils::InitModuleSourceElement(cx, script, aRequest->Element());
NS_ENSURE_SUCCESS(rv, rv);
moduleScript->SetSourceElementAssociated();
// The script is now ready to be exposed to the debugger.
JS::Rooted<JSScript*> script(cx, JS::GetModuleScript(module));
JS::ExposeScriptToDebugger(cx, script);
}
rv = nsJSUtils::ModuleEvaluate(cx, module);
rv = nsJSUtils::ModuleEvaluate(cx, script);
MOZ_ASSERT(NS_FAILED(rv) == aes.HasException());
if (NS_FAILED(rv)) {
LOG(("ScriptLoadRequest (%p): evaluation failed", aRequest));