Store the ScriptInterface& in ModuleLoader::Result

During hotloading the `ScriptRequest` was constructed from a
`JSContext*`. That requires that already an other `ScriptRequest` is
active. Which isn't always the case.
Now The `ScriptRequest` is constructed from a `ScriptInterface&`.

Storing a `ScriptInterface&` in the `ModuleLoader::Result` allows to
remove the `m_Result` as it is retrieved from the `ScriptInterface`.
This commit is contained in:
phosit
2025-06-11 14:51:52 +02:00
committed by phosit
parent 25c53cb0ac
commit b8348bec55
3 changed files with 18 additions and 10 deletions
+6 -6
View File
@@ -421,17 +421,17 @@ ModuleLoader::Result::iterator& ModuleLoader::Result::iterator::operator++(int)
}
ModuleLoader::Result::Result(const ScriptRequest& rq, const VfsPath& modulePath):
m_Cx{rq.cx},
m_Loader{rq.GetScriptInterface().GetModuleLoader()},
m_Script{rq.GetScriptInterface()},
m_ModulePath{modulePath},
m_Storage{rq, m_Loader, *this, m_ModulePath}
m_Storage{rq, m_Script.GetModuleLoader(), *this, m_ModulePath}
{
}
ModuleLoader::Result::~Result()
{
const auto modIter = m_Loader.m_Registry.find(m_ModulePath);
if (modIter == m_Loader.m_Registry.end())
ModuleLoader::RegistryType& registry{m_Script.GetModuleLoader().m_Registry};
const auto modIter = registry.find(m_ModulePath);
if (modIter == registry.end())
return;
std::get<1>(*modIter).RemoveRequester(this);
@@ -450,7 +450,7 @@ ModuleLoader::Result::~Result()
void ModuleLoader::Result::Resume()
{
if (m_Storage.IsWaiting())
m_Storage = ModuleLoader::Future{m_Cx, m_Loader, *this, m_ModulePath};
m_Storage = ModuleLoader::Future{m_Script, m_Script.GetModuleLoader(), *this, m_ModulePath};
}
ModuleLoader::ModuleLoader(ModuleLoader::AllowModuleFunc allowModule):
+2 -2
View File
@@ -29,6 +29,7 @@
#include <vector>
class ScriptContext;
class ScriptInterface;
class ScriptRequest;
namespace Script
@@ -166,8 +167,7 @@ public:
void Resume();
private:
JSContext* m_Cx;
ModuleLoader& m_Loader;
const ScriptInterface& m_Script;
VfsPath m_ModulePath;
Future m_Storage;
};
+10 -2
View File
@@ -686,10 +686,18 @@ public:
TS_ASSERT_STR_NOT_CONTAINS(logger.GetOutput(), "blah blah blah");
}
void test_ResultDestructionAfterScriptRequestDestruction()
void test_HotloadAfterScriptRequestDestruction()
{
ScriptInterface script{"Test", "Test", g_ScriptContext, AllowAllPredicate};
auto _ = script.GetModuleLoader().LoadModule(ScriptRequest{script}, "empty.js");
auto result = script.GetModuleLoader().LoadModule(ScriptRequest{script}, "empty.js");
g_ScriptContext->RunJobs();
auto iter = result.begin();
TS_ASSERT(iter->IsDone());
++iter;
ClearFromCache("empty.js");
g_ScriptContext->RunJobs();
TS_ASSERT(iter->IsDone());
}
void test_RestrictionNoPredicate()