mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-09-21 20:06:40 +00:00
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:
@@ -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):
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user