Don't crash on compile error of hotloads

Hotload functions aren't expected to throw an error. Instead return the
error to the function who is waiting for the module.
This commit is contained in:
phosit
2026-06-13 16:30:08 +02:00
parent db9f60b540
commit b0af0971e3
2 changed files with 38 additions and 24 deletions
+16 -8
View File
@@ -339,16 +339,24 @@ ModuleLoader::Future::Future(const Script::Request& rq, ModuleLoader& loader, Re
// - Accessing values which are not yet exported results in an error. These errors might implicitly be
// dropped.
JS::RootedObject mod{rq.cx, CompileModule(rq, loader.m_AllowModule, loader.m_Registry, modulePath,
result)};
JS::RootedObject promise{rq.cx, Evaluate(rq, mod)};
Evaluating& evaluatingStatus{std::get<Evaluating>(m_Status)};
evaluatingStatus.moduleNamespace = JS::GetModuleNamespace(rq.cx, mod);
try
{
JS::RootedObject mod{rq.cx, CompileModule(rq, loader.m_AllowModule, loader.m_Registry, modulePath,
result)};
JS::RootedObject promise{rq.cx, Evaluate(rq, mod)};
Evaluating& evaluatingStatus{std::get<Evaluating>(m_Status)};
evaluatingStatus.moduleNamespace = JS::GetModuleNamespace(rq.cx, mod);
SetReservedSlot(JS::PrivateValue(static_cast<void*>(&m_Status)));
SetReservedSlot(JS::PrivateValue(static_cast<void*>(&m_Status)));
if (!JS::AddPromiseReactions(rq.cx, promise, evaluatingStatus.fulfill, evaluatingStatus.reject))
throw std::runtime_error{"Failed adding promise reaction."};
if (!JS::AddPromiseReactions(rq.cx, promise, evaluatingStatus.fulfill, evaluatingStatus.reject))
throw std::runtime_error{"Failed adding promise reaction."};
}
catch(...)
{
if (std::holds_alternative<Evaluating>(m_Status))
m_Status = Rejected{std::current_exception()};
}
}
ModuleLoader::Future::Future(Future&& other) noexcept: