Bug 1761938 - Part 1: Call into the module loader via the module load request object r=yulia
The script loader will need to deal with requests from more than one module loader so this adds methods to the request which dispatch to the correct loader. Differential Revision: https://phabricator.services.mozilla.com/D142828
This commit is contained in:
@@ -462,8 +462,7 @@ class ScriptRequestProcessor : public Runnable {
|
|||||||
NS_IMETHOD Run() override {
|
NS_IMETHOD Run() override {
|
||||||
if (mRequest->IsModuleRequest() &&
|
if (mRequest->IsModuleRequest() &&
|
||||||
mRequest->AsModuleRequest()->IsDynamicImport()) {
|
mRequest->AsModuleRequest()->IsDynamicImport()) {
|
||||||
mLoader->GetModuleLoader()->ProcessDynamicImport(
|
mRequest->AsModuleRequest()->ProcessDynamicImport();
|
||||||
mRequest->AsModuleRequest());
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,7 +489,7 @@ nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) {
|
|||||||
aRequest->mFetchSourceOnly = true;
|
aRequest->mFetchSourceOnly = true;
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
if (aRequest->IsModuleRequest()) {
|
if (aRequest->IsModuleRequest()) {
|
||||||
rv = mModuleLoader->RestartModuleLoad(aRequest->AsModuleRequest());
|
rv = aRequest->AsModuleRequest()->RestartModuleLoad();
|
||||||
} else {
|
} else {
|
||||||
rv = StartLoad(aRequest);
|
rv = StartLoad(aRequest);
|
||||||
}
|
}
|
||||||
@@ -505,7 +504,7 @@ nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) {
|
|||||||
|
|
||||||
nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) {
|
nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) {
|
||||||
if (aRequest->IsModuleRequest()) {
|
if (aRequest->IsModuleRequest()) {
|
||||||
return mModuleLoader->StartModuleLoad(aRequest->AsModuleRequest());
|
return aRequest->AsModuleRequest()->StartModuleLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
return StartClassicLoad(aRequest);
|
return StartClassicLoad(aRequest);
|
||||||
@@ -1117,7 +1116,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
|
|||||||
mozilla::nsAutoMicroTask mt;
|
mozilla::nsAutoMicroTask mt;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv = mModuleLoader->ProcessFetchedModuleSource(modReq);
|
nsresult rv = modReq->ProcessFetchedModuleSource();
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
ReportErrorToConsole(modReq, rv);
|
ReportErrorToConsole(modReq, rv);
|
||||||
HandleLoadError(modReq, rv);
|
HandleLoadError(modReq, rv);
|
||||||
@@ -1352,7 +1351,7 @@ nsresult ScriptLoader::ProcessOffThreadRequest(ScriptLoadRequest* aRequest) {
|
|||||||
if (aRequest->IsModuleRequest()) {
|
if (aRequest->IsModuleRequest()) {
|
||||||
MOZ_ASSERT(aRequest->GetLoadContext()->mOffThreadToken);
|
MOZ_ASSERT(aRequest->GetLoadContext()->mOffThreadToken);
|
||||||
ModuleLoadRequest* request = aRequest->AsModuleRequest();
|
ModuleLoadRequest* request = aRequest->AsModuleRequest();
|
||||||
return mModuleLoader->ProcessFetchedModuleSource(request);
|
return request->ProcessFetchedModuleSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Element may not be ready yet if speculatively compiling, so process the
|
// Element may not be ready yet if speculatively compiling, so process the
|
||||||
@@ -1674,7 +1673,7 @@ nsresult ScriptLoader::ProcessRequest(ScriptLoadRequest* aRequest) {
|
|||||||
if (aRequest->IsModuleRequest()) {
|
if (aRequest->IsModuleRequest()) {
|
||||||
ModuleLoadRequest* request = aRequest->AsModuleRequest();
|
ModuleLoadRequest* request = aRequest->AsModuleRequest();
|
||||||
if (request->mModuleScript) {
|
if (request->mModuleScript) {
|
||||||
if (!mModuleLoader->InstantiateModuleTree(request)) {
|
if (!request->InstantiateModuleTree()) {
|
||||||
request->mModuleScript = nullptr;
|
request->mModuleScript = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2076,7 +2075,7 @@ nsresult ScriptLoader::EvaluateScriptElement(ScriptLoadRequest* aRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (aRequest->IsModuleRequest()) {
|
if (aRequest->IsModuleRequest()) {
|
||||||
return mModuleLoader->EvaluateModule(globalObject, aRequest);
|
return aRequest->AsModuleRequest()->EvaluateModule(globalObject);
|
||||||
}
|
}
|
||||||
return EvaluateScript(globalObject, aRequest);
|
return EvaluateScript(globalObject, aRequest);
|
||||||
}
|
}
|
||||||
@@ -2963,8 +2962,7 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
|
|||||||
|
|
||||||
if (aRequest->IsModuleRequest() && !aRequest->GetLoadContext()->mIsInline) {
|
if (aRequest->IsModuleRequest() && !aRequest->GetLoadContext()->mIsInline) {
|
||||||
auto* request = aRequest->AsModuleRequest();
|
auto* request = aRequest->AsModuleRequest();
|
||||||
mModuleLoader->SetModuleFetchFinishedAndResumeWaitingRequests(request,
|
request->SetModuleFetchFinishedAndResumeWaitingRequests(aResult);
|
||||||
aResult);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aRequest->GetLoadContext()->mInDeferList) {
|
if (aRequest->GetLoadContext()->mInDeferList) {
|
||||||
@@ -3007,7 +3005,7 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
|
|||||||
if (modReq->IsDynamicImport()) {
|
if (modReq->IsDynamicImport()) {
|
||||||
MOZ_ASSERT(modReq->IsTopLevel());
|
MOZ_ASSERT(modReq->IsTopLevel());
|
||||||
if (aRequest->isInList()) {
|
if (aRequest->isInList()) {
|
||||||
mModuleLoader->CancelDynamicImport(modReq, aResult);
|
modReq->CancelDynamicImport(aResult);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
MOZ_ASSERT(!modReq->IsTopLevel());
|
MOZ_ASSERT(!modReq->IsTopLevel());
|
||||||
@@ -3242,13 +3240,12 @@ nsresult ScriptLoader::PrepareLoadedRequest(ScriptLoadRequest* aRequest,
|
|||||||
// inserting the request in the array. However it's an unlikely case
|
// inserting the request in the array. However it's an unlikely case
|
||||||
// so if you see this assertion it is likely something else that is
|
// so if you see this assertion it is likely something else that is
|
||||||
// wrong, especially if you see it more than once.
|
// wrong, especially if you see it more than once.
|
||||||
NS_ASSERTION(
|
NS_ASSERTION(mDeferRequests.Contains(aRequest) ||
|
||||||
mDeferRequests.Contains(aRequest) ||
|
|
||||||
mLoadingAsyncRequests.Contains(aRequest) ||
|
mLoadingAsyncRequests.Contains(aRequest) ||
|
||||||
mNonAsyncExternalScriptInsertedRequests.Contains(aRequest) ||
|
mNonAsyncExternalScriptInsertedRequests.Contains(aRequest) ||
|
||||||
mXSLTRequests.Contains(aRequest) ||
|
mXSLTRequests.Contains(aRequest) ||
|
||||||
(aRequest->IsModuleRequest() &&
|
(aRequest->IsModuleRequest() &&
|
||||||
(mModuleLoader->HasDynamicImport(aRequest->AsModuleRequest()) ||
|
(aRequest->AsModuleRequest()->IsRegisteredDynamicImport() ||
|
||||||
!aRequest->AsModuleRequest()->IsTopLevel())) ||
|
!aRequest->AsModuleRequest()->IsTopLevel())) ||
|
||||||
mPreloads.Contains(aRequest, PreloadRequestComparator()) ||
|
mPreloads.Contains(aRequest, PreloadRequestComparator()) ||
|
||||||
mParserBlockingRequest == aRequest,
|
mParserBlockingRequest == aRequest,
|
||||||
@@ -3287,7 +3284,7 @@ nsresult ScriptLoader::PrepareLoadedRequest(ScriptLoadRequest* aRequest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise compile it right away and start fetching descendents.
|
// Otherwise compile it right away and start fetching descendents.
|
||||||
return mModuleLoader->ProcessFetchedModuleSource(request);
|
return request->ProcessFetchedModuleSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
// The script is now loaded and ready to run.
|
// The script is now loaded and ready to run.
|
||||||
|
|||||||
@@ -64,7 +64,9 @@ ModuleLoadRequest::ModuleLoadRequest(
|
|||||||
mIsDynamicImport(aIsDynamicImport),
|
mIsDynamicImport(aIsDynamicImport),
|
||||||
mLoader(aLoader),
|
mLoader(aLoader),
|
||||||
mRootModule(aRootModule),
|
mRootModule(aRootModule),
|
||||||
mVisitedSet(aVisitedSet) {}
|
mVisitedSet(aVisitedSet) {
|
||||||
|
MOZ_ASSERT(mLoader);
|
||||||
|
}
|
||||||
|
|
||||||
void ModuleLoadRequest::Cancel() {
|
void ModuleLoadRequest::Cancel() {
|
||||||
ScriptLoadRequest::Cancel();
|
ScriptLoadRequest::Cancel();
|
||||||
@@ -185,8 +187,6 @@ void ModuleLoadRequest::LoadFinished() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mLoader->ProcessLoadedModuleTree(request);
|
mLoader->ProcessLoadedModuleTree(request);
|
||||||
|
|
||||||
mLoader = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModuleLoadRequest::ClearDynamicImport() {
|
void ModuleLoadRequest::ClearDynamicImport() {
|
||||||
|
|||||||
@@ -86,6 +86,32 @@ class ModuleLoadRequest final : public ScriptLoadRequest {
|
|||||||
mIsMarkedForBytecodeEncoding = true;
|
mIsMarkedForBytecodeEncoding = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convenience methods to call into the module loader for this request.
|
||||||
|
|
||||||
|
void CancelDynamicImport(nsresult aResult) {
|
||||||
|
MOZ_ASSERT(IsDynamicImport());
|
||||||
|
mLoader->CancelDynamicImport(this, aResult);
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
bool IsRegisteredDynamicImport() const {
|
||||||
|
return IsDynamicImport() && mLoader->HasDynamicImport(this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
nsresult StartModuleLoad() { return mLoader->StartModuleLoad(this); }
|
||||||
|
nsresult RestartModuleLoad() { return mLoader->RestartModuleLoad(this); }
|
||||||
|
void SetModuleFetchFinishedAndResumeWaitingRequests(nsresult aResult) {
|
||||||
|
mLoader->SetModuleFetchFinishedAndResumeWaitingRequests(this, aResult);
|
||||||
|
}
|
||||||
|
nsresult ProcessFetchedModuleSource() {
|
||||||
|
return mLoader->ProcessFetchedModuleSource(this);
|
||||||
|
}
|
||||||
|
bool InstantiateModuleTree() { return mLoader->InstantiateModuleTree(this); }
|
||||||
|
nsresult EvaluateModule(nsIGlobalObject* aGlobalObject) {
|
||||||
|
return mLoader->EvaluateModule(aGlobalObject, this);
|
||||||
|
}
|
||||||
|
void StartDynamicImport() { mLoader->StartDynamicImport(this); }
|
||||||
|
void ProcessDynamicImport() { mLoader->ProcessDynamicImport(this); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LoadFinished();
|
void LoadFinished();
|
||||||
void CancelImports();
|
void CancelImports();
|
||||||
|
|||||||
@@ -353,7 +353,9 @@ nsresult ModuleLoaderBase::RestartModuleLoad(ModuleLoadRequest* aRequest) {
|
|||||||
|
|
||||||
nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest,
|
nsresult ModuleLoaderBase::StartOrRestartModuleLoad(ModuleLoadRequest* aRequest,
|
||||||
RestartRequest aRestart) {
|
RestartRequest aRestart) {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
MOZ_ASSERT(aRequest->IsFetching());
|
MOZ_ASSERT(aRequest->IsFetching());
|
||||||
|
|
||||||
aRequest->SetUnknownDataType();
|
aRequest->SetUnknownDataType();
|
||||||
|
|
||||||
// If we're restarting the request, the module should already be in the
|
// If we're restarting the request, the module should already be in the
|
||||||
@@ -430,6 +432,8 @@ void ModuleLoaderBase::SetModuleFetchFinishedAndResumeWaitingRequests(
|
|||||||
// will have ModuleLoaded or LoadFailed on them when the promise is
|
// will have ModuleLoaded or LoadFailed on them when the promise is
|
||||||
// resolved/rejected. This is set up in StartLoad.
|
// resolved/rejected. This is set up in StartLoad.
|
||||||
|
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
|
|
||||||
LOG(
|
LOG(
|
||||||
("ScriptLoadRequest (%p): Module fetch finished (script == %p, result == "
|
("ScriptLoadRequest (%p): Module fetch finished (script == %p, result == "
|
||||||
"%u)",
|
"%u)",
|
||||||
@@ -500,6 +504,7 @@ ModuleScript* ModuleLoaderBase::GetFetchedModule(
|
|||||||
|
|
||||||
nsresult ModuleLoaderBase::ProcessFetchedModuleSource(
|
nsresult ModuleLoaderBase::ProcessFetchedModuleSource(
|
||||||
ModuleLoadRequest* aRequest) {
|
ModuleLoadRequest* aRequest) {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
MOZ_ASSERT(!aRequest->mModuleScript);
|
MOZ_ASSERT(!aRequest->mModuleScript);
|
||||||
|
|
||||||
nsresult rv = CreateModuleScript(aRequest);
|
nsresult rv = CreateModuleScript(aRequest);
|
||||||
@@ -846,6 +851,8 @@ ModuleLoaderBase::StartFetchingModuleAndDependencies(ModuleLoadRequest* aParent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModuleLoaderBase::StartDynamicImport(ModuleLoadRequest* aRequest) {
|
void ModuleLoaderBase::StartDynamicImport(ModuleLoadRequest* aRequest) {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
|
|
||||||
LOG(("ScriptLoadRequest (%p): Start dynamic import", aRequest));
|
LOG(("ScriptLoadRequest (%p): Start dynamic import", aRequest));
|
||||||
|
|
||||||
mDynamicImportRequests.AppendElement(aRequest);
|
mDynamicImportRequests.AppendElement(aRequest);
|
||||||
@@ -919,6 +926,8 @@ bool ModuleLoaderBase::HasPendingDynamicImports() const {
|
|||||||
|
|
||||||
void ModuleLoaderBase::CancelDynamicImport(ModuleLoadRequest* aRequest,
|
void ModuleLoaderBase::CancelDynamicImport(ModuleLoadRequest* aRequest,
|
||||||
nsresult aResult) {
|
nsresult aResult) {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
|
|
||||||
RefPtr<ScriptLoadRequest> req = mDynamicImportRequests.Steal(aRequest);
|
RefPtr<ScriptLoadRequest> req = mDynamicImportRequests.Steal(aRequest);
|
||||||
aRequest->Cancel();
|
aRequest->Cancel();
|
||||||
// FinishDynamicImport must happen exactly once for each dynamic import
|
// FinishDynamicImport must happen exactly once for each dynamic import
|
||||||
@@ -933,8 +942,11 @@ void ModuleLoaderBase::RemoveDynamicImport(ModuleLoadRequest* aRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
bool ModuleLoaderBase::HasDynamicImport(ModuleLoadRequest* aRequest) const {
|
bool ModuleLoaderBase::HasDynamicImport(
|
||||||
return mDynamicImportRequests.Contains(aRequest);
|
const ModuleLoadRequest* aRequest) const {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
|
return mDynamicImportRequests.Contains(
|
||||||
|
const_cast<ModuleLoadRequest*>(aRequest));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -962,6 +974,7 @@ bool ModuleLoaderBase::InstantiateModuleTree(ModuleLoadRequest* aRequest) {
|
|||||||
// Instantiate a top-level module and record any error.
|
// Instantiate a top-level module and record any error.
|
||||||
|
|
||||||
MOZ_ASSERT(aRequest);
|
MOZ_ASSERT(aRequest);
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
MOZ_ASSERT(aRequest->IsTopLevel());
|
MOZ_ASSERT(aRequest->IsTopLevel());
|
||||||
|
|
||||||
LOG(("ScriptLoadRequest (%p): Instantiate module tree", aRequest));
|
LOG(("ScriptLoadRequest (%p): Instantiate module tree", aRequest));
|
||||||
@@ -1035,6 +1048,8 @@ nsresult ModuleLoaderBase::InitDebuggerDataForModuleTree(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModuleLoaderBase::ProcessDynamicImport(ModuleLoadRequest* aRequest) {
|
void ModuleLoaderBase::ProcessDynamicImport(ModuleLoadRequest* aRequest) {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
|
|
||||||
if (aRequest->mModuleScript) {
|
if (aRequest->mModuleScript) {
|
||||||
if (!InstantiateModuleTree(aRequest)) {
|
if (!InstantiateModuleTree(aRequest)) {
|
||||||
aRequest->mModuleScript = nullptr;
|
aRequest->mModuleScript = nullptr;
|
||||||
@@ -1052,7 +1067,9 @@ void ModuleLoaderBase::ProcessDynamicImport(ModuleLoadRequest* aRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nsresult ModuleLoaderBase::EvaluateModule(nsIGlobalObject* aGlobalObject,
|
nsresult ModuleLoaderBase::EvaluateModule(nsIGlobalObject* aGlobalObject,
|
||||||
ScriptLoadRequest* aRequest) {
|
ModuleLoadRequest* aRequest) {
|
||||||
|
MOZ_ASSERT(aRequest->mLoader == this);
|
||||||
|
|
||||||
AUTO_PROFILER_LABEL("ModuleLoaderBase::EvaluateModule", JS);
|
AUTO_PROFILER_LABEL("ModuleLoaderBase::EvaluateModule", JS);
|
||||||
|
|
||||||
mozilla::nsAutoMicroTask mt;
|
mozilla::nsAutoMicroTask mt;
|
||||||
@@ -1145,7 +1162,7 @@ nsresult ModuleLoaderBase::EvaluateModule(nsIGlobalObject* aGlobalObject,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult ModuleLoaderBase::EvaluateModule(ScriptLoadRequest* aRequest) {
|
nsresult ModuleLoaderBase::EvaluateModule(ModuleLoadRequest* aRequest) {
|
||||||
nsCOMPtr<nsIGlobalObject> globalObject =
|
nsCOMPtr<nsIGlobalObject> globalObject =
|
||||||
mLoader->GetGlobalForRequest(aRequest);
|
mLoader->GetGlobalForRequest(aRequest);
|
||||||
if (!globalObject) {
|
if (!globalObject) {
|
||||||
|
|||||||
@@ -142,10 +142,12 @@ class ModuleLoaderBase : public nsISupports {
|
|||||||
// Public API methods.
|
// Public API methods.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
ScriptLoaderInterface* GetScriptLoaderInterface() const { return mLoader; }
|
||||||
|
|
||||||
bool HasPendingDynamicImports() const;
|
bool HasPendingDynamicImports() const;
|
||||||
void CancelDynamicImport(ModuleLoadRequest* aRequest, nsresult aResult);
|
void CancelDynamicImport(ModuleLoadRequest* aRequest, nsresult aResult);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
bool HasDynamicImport(ModuleLoadRequest* aRequest) const;
|
bool HasDynamicImport(const ModuleLoadRequest* aRequest) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Start a load for a module script URI. Returns immediately if the module is
|
// Start a load for a module script URI. Returns immediately if the module is
|
||||||
@@ -161,7 +163,7 @@ class ModuleLoaderBase : public nsISupports {
|
|||||||
|
|
||||||
// Implements https://html.spec.whatwg.org/#run-a-module-script
|
// Implements https://html.spec.whatwg.org/#run-a-module-script
|
||||||
nsresult EvaluateModule(nsIGlobalObject* aGlobalObject,
|
nsresult EvaluateModule(nsIGlobalObject* aGlobalObject,
|
||||||
ScriptLoadRequest* aRequest);
|
ModuleLoadRequest* aRequest);
|
||||||
|
|
||||||
void StartDynamicImport(ModuleLoadRequest* aRequest);
|
void StartDynamicImport(ModuleLoadRequest* aRequest);
|
||||||
void ProcessDynamicImport(ModuleLoadRequest* aRequest);
|
void ProcessDynamicImport(ModuleLoadRequest* aRequest);
|
||||||
@@ -215,7 +217,7 @@ class ModuleLoaderBase : public nsISupports {
|
|||||||
ModuleScript* GetFetchedModule(nsIURI* aURL, nsIGlobalObject* aGlobal) const;
|
ModuleScript* GetFetchedModule(nsIURI* aURL, nsIGlobalObject* aGlobal) const;
|
||||||
|
|
||||||
// Helper function to set up the global correctly for dynamic imports.
|
// Helper function to set up the global correctly for dynamic imports.
|
||||||
nsresult EvaluateModule(ScriptLoadRequest* aRequest);
|
nsresult EvaluateModule(ModuleLoadRequest* aRequest);
|
||||||
|
|
||||||
JS::Value FindFirstParseError(ModuleLoadRequest* aRequest);
|
JS::Value FindFirstParseError(ModuleLoadRequest* aRequest);
|
||||||
static nsresult InitDebuggerDataForModuleTree(JSContext* aCx,
|
static nsresult InitDebuggerDataForModuleTree(JSContext* aCx,
|
||||||
|
|||||||
Reference in New Issue
Block a user