From caef42084dbb3196014d57a9ebdc3c08b98430f7 Mon Sep 17 00:00:00 2001 From: Itms Date: Sun, 18 Sep 2016 09:34:45 +0000 Subject: [PATCH] Add missing JSAutoRequest calls. (hopefully all of them have been spotted now) Patch by echotangoecho, refs #4053 This was SVN commit r18730. --- source/gui/GUIManager.cpp | 2 ++ source/network/NetTurnManager.cpp | 11 +++++++++-- source/ps/Game.cpp | 6 +++++- source/ps/scripting/JSInterface_VFS.cpp | 5 ++++- source/simulation2/components/CCmpAIManager.cpp | 11 +++++++++-- source/simulation2/components/CCmpCommandQueue.cpp | 2 ++ source/simulation2/serialization/BinarySerializer.cpp | 5 ++++- source/simulation2/serialization/StdDeserializer.cpp | 7 +++++-- 8 files changed, 40 insertions(+), 9 deletions(-) diff --git a/source/gui/GUIManager.cpp b/source/gui/GUIManager.cpp index 8199fdfce9..a8df9d234f 100644 --- a/source/gui/GUIManager.cpp +++ b/source/gui/GUIManager.cpp @@ -117,6 +117,8 @@ void CGUIManager::PopPageCB(shared_ptr args) shared_ptr scriptInterface = m_PageStack.back().gui->GetScriptInterface(); JSContext* cx = scriptInterface->GetContext(); + JSAutoRequest rq(cx); + JS::RootedValue initDataVal(cx); if (!initDataClone) { diff --git a/source/network/NetTurnManager.cpp b/source/network/NetTurnManager.cpp index d01bc6b917..19bfb98911 100644 --- a/source/network/NetTurnManager.cpp +++ b/source/network/NetTurnManager.cpp @@ -292,7 +292,11 @@ void CNetTurnManager::AddCommand(int client, int player, JS::HandleValue data, u } m_Simulation2.GetScriptInterface().FreezeObject(data, true); - m_QueuedCommands[turn - (m_CurrentTurn+1)][client].emplace_back(player, m_Simulation2.GetScriptInterface().GetContext(), data); + + JSContext* cx = m_Simulation2.GetScriptInterface().GetContext(); + JSAutoRequest rq(cx); + + m_QueuedCommands[turn - (m_CurrentTurn+1)][client].emplace_back(player, cx, data); } void CNetTurnManager::FinishedAllCommands(u32 turn, u32 turnLength) @@ -556,10 +560,13 @@ void CNetReplayTurnManager::DoTurn(u32 turn) m_TurnLength = m_ReplayTurnLengths[turn]; + JSContext* cx = m_Simulation2.GetScriptInterface().GetContext(); + JSAutoRequest rq(cx); + // Simulate commands for that turn for (const std::pair& p : m_ReplayCommands[turn]) { - JS::RootedValue command(m_Simulation2.GetScriptInterface().GetContext()); + JS::RootedValue command(cx); m_Simulation2.GetScriptInterface().ParseJSON(p.second, &command); AddCommand(m_ClientId, p.first, command, m_CurrentTurn + 1); } diff --git a/source/ps/Game.cpp b/source/ps/Game.cpp index 344cccf938..48e793044b 100644 --- a/source/ps/Game.cpp +++ b/source/ps/Game.cpp @@ -185,7 +185,11 @@ bool CGame::StartVisualReplay(const std::string& replayPath) std::string line; std::getline(*m_ReplayStream, line); - JS::RootedValue attribs(scriptInterface.GetContext()); + + JSContext* cx = scriptInterface.GetContext(); + JSAutoRequest rq(cx); + + JS::RootedValue attribs(cx); scriptInterface.ParseJSON(line, &attribs); StartGame(&attribs, ""); diff --git a/source/ps/scripting/JSInterface_VFS.cpp b/source/ps/scripting/JSInterface_VFS.cpp index 85ff920757..2daa18142a 100644 --- a/source/ps/scripting/JSInterface_VFS.cpp +++ b/source/ps/scripting/JSInterface_VFS.cpp @@ -91,8 +91,11 @@ JS::Value JSI_VFS::BuildDirEntList(ScriptInterface::CxPrivate* pCxPrivate, const int flags = recurse ? vfs::DIR_RECURSIVE : 0; + JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); + JSAutoRequest rq(cx); + // build array in the callback function - BuildDirEntListState state(pCxPrivate->pScriptInterface->GetContext()); + BuildDirEntListState state(cx); vfs::ForEachFile(g_VFS, path, BuildDirEntListCB, (uintptr_t)&state, filter, flags); return OBJECT_TO_JSVAL(state.filename_array); diff --git a/source/simulation2/components/CCmpAIManager.cpp b/source/simulation2/components/CCmpAIManager.cpp index eedc18b233..d7ee914f7f 100644 --- a/source/simulation2/components/CCmpAIManager.cpp +++ b/source/simulation2/components/CCmpAIManager.cpp @@ -298,6 +298,7 @@ public: ENSURE(pCxPrivate->pCBData); CAIWorker* self = static_cast (pCxPrivate->pCBData); JSContext* cx(self->m_ScriptInterface->GetContext()); + JSAutoRequest rq(cx); CFixedVector2D pos, goalPos; std::vector waypoints; @@ -327,6 +328,7 @@ public: ENSURE(pCxPrivate->pCBData); CAIWorker* self = static_cast (pCxPrivate->pCBData); JSContext* cx(self->m_ScriptInterface->GetContext()); + JSAutoRequest rq(cx); JS::RootedValue retVal(cx); self->m_ScriptInterface->ToJSVal >(cx, &retVal, self->m_LongPathfinder.GetConnectivityGrid(passClass)); @@ -521,6 +523,7 @@ public: m_GameState = gameState; JSContext* cx = m_ScriptInterface->GetContext(); + JSAutoRequest rq(cx); if (dirtinessInformations.dirty) { @@ -770,13 +773,17 @@ public: // Require unique prototype and name (for reverse lookup) // TODO: this is yucky - see comment in Deserialize() ENSURE(proto.isObject() && "A serializable prototype has to be an object!"); - JS::RootedObject obj(m_ScriptInterface->GetContext(), &proto.toObject()); + + JSContext* cx = m_ScriptInterface->GetContext(); + JSAutoRequest rq(cx); + + JS::RootedObject obj(cx, &proto.toObject()); if (m_SerializablePrototypes->has(obj) || m_DeserializablePrototypes.find(name) != m_DeserializablePrototypes.end()) { LOGERROR("RegisterSerializablePrototype called with same prototype multiple times: p=%p n='%s'", (void *)obj.get(), utf8_from_wstring(name)); return; } - m_SerializablePrototypes->add(m_ScriptInterface->GetContext(), obj, name); + m_SerializablePrototypes->add(cx, obj, name); m_DeserializablePrototypes[name] = JS::Heap(obj); } diff --git a/source/simulation2/components/CCmpCommandQueue.cpp b/source/simulation2/components/CCmpCommandQueue.cpp index 8ddc2162e6..18cd4b9a69 100644 --- a/source/simulation2/components/CCmpCommandQueue.cpp +++ b/source/simulation2/components/CCmpCommandQueue.cpp @@ -82,6 +82,8 @@ public: virtual void PushLocalCommand(player_id_t player, JS::HandleValue cmd) { JSContext* cx = GetSimContext().GetScriptInterface().GetContext(); + JSAutoRequest rq(cx); + m_LocalQueue.emplace_back(SimulationCommand(player, cx, cmd)); } diff --git a/source/simulation2/serialization/BinarySerializer.cpp b/source/simulation2/serialization/BinarySerializer.cpp index 7e88bf20e6..5c3c9ab1ac 100644 --- a/source/simulation2/serialization/BinarySerializer.cpp +++ b/source/simulation2/serialization/BinarySerializer.cpp @@ -465,7 +465,10 @@ u32 CBinarySerializerScriptImpl::GetScriptBackrefTag(JS::HandleObject obj) if (m_ScriptBackrefs.find(obj, tag)) return tag; - m_ScriptBackrefs.add(m_ScriptInterface.GetContext(), obj, m_ScriptBackrefsNext); + JSContext* cx = m_ScriptInterface.GetContext(); + JSAutoRequest rq(cx); + + m_ScriptBackrefs.add(cx, obj, m_ScriptBackrefsNext); m_ScriptBackrefsNext++; // Return a non-tag number so callers know they need to serialize the object diff --git a/source/simulation2/serialization/StdDeserializer.cpp b/source/simulation2/serialization/StdDeserializer.cpp index 6a0c9258ff..e37aebfdcd 100644 --- a/source/simulation2/serialization/StdDeserializer.cpp +++ b/source/simulation2/serialization/StdDeserializer.cpp @@ -486,6 +486,9 @@ void CStdDeserializer::ScriptString(const char* name, JS::MutableHandleString ou #error TODO: probably need to convert JS strings from little-endian #endif + JSContext* cx = m_ScriptInterface.GetContext(); + JSAutoRequest rq(cx); + bool isLatin1; Bool("isLatin1", isLatin1); if (isLatin1) @@ -493,7 +496,7 @@ void CStdDeserializer::ScriptString(const char* name, JS::MutableHandleString ou std::vector str; ReadStringLatin1(name, str); - out.set(JS_NewStringCopyN(m_ScriptInterface.GetContext(), (const char*)str.data(), str.size())); + out.set(JS_NewStringCopyN(cx, (const char*)str.data(), str.size())); if (!out) throw PSERROR_Deserialize_ScriptError("JS_NewStringCopyN failed"); } @@ -502,7 +505,7 @@ void CStdDeserializer::ScriptString(const char* name, JS::MutableHandleString ou utf16string str; ReadStringUTF16(name, str); - out.set(JS_NewUCStringCopyN(m_ScriptInterface.GetContext(), (const char16_t*)str.data(), str.length())); + out.set(JS_NewUCStringCopyN(cx, (const char16_t*)str.data(), str.length())); if (!out) throw PSERROR_Deserialize_ScriptError("JS_NewUCStringCopyN failed"); }