diff --git a/source/scriptinterface/ScriptContext.cpp b/source/scriptinterface/ScriptContext.cpp index c0c814e03d..5f285781a4 100644 --- a/source/scriptinterface/ScriptContext.cpp +++ b/source/scriptinterface/ScriptContext.cpp @@ -27,6 +27,8 @@ #include "scriptinterface/ScriptEngine.h" #include "scriptinterface/ScriptInterface.h" +#include "js/friend/PerformanceHint.h" + void GCSliceCallbackHook(JSContext* UNUSED(cx), JS::GCProgress progress, const JS::GCDescription& UNUSED(desc)) { /** @@ -129,6 +131,10 @@ ScriptContext::ScriptContext(int contextSize, int heapGrowthBytesGCTrigger): JS::ContextOptionsRef(m_cx).setStrictMode(true); + // Workaround to turn off nursery size heuristic. + // See https://gitea.wildfiregames.com/0ad/0ad/issues/7714 for details. + js::gc::SetPerformanceHint(m_cx, js::gc::PerformanceHint::InPageLoad); + ScriptEngine::GetSingleton().RegisterContext(m_cx); JS::SetJobQueue(m_cx, m_JobQueue.get()); @@ -139,6 +145,9 @@ ScriptContext::~ScriptContext() { ENSURE(ScriptEngine::IsInitialised() && "The ScriptEngine must be active (initialized and not yet shut down) when destroying a ScriptContext!"); + // Switch back to normal performance mode to avoid assertion in debug mode. + js::gc::SetPerformanceHint(m_cx, js::gc::PerformanceHint::Normal); + JS_DestroyContext(m_cx); ScriptEngine::GetSingleton().UnRegisterContext(m_cx); }