From e6f297680bf3c8164aad2ff662dd76b4d10d44d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Mon, 5 May 2025 10:28:10 +0200 Subject: [PATCH] Formalize event handlers as stackable It seems event handlers may be invoked from event handlers, which 87b81ceb45fe did not anticipate, oops. --- src/lua/LuaScriptInterface.cpp | 13 ++++++++----- src/lua/LuaScriptInterface.h | 3 ++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index 2b77e3ed9..d3cb07b7b 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -405,12 +405,11 @@ bool CommandInterface::HandleEvent(const GameControllerEvent &event) { auto *lsi = static_cast(this); auto *L = lsi->L; - assert(!lsi->currentEventHandlerIt); auto eventType = int(event.index()); auto &list = lsi->gameControllerEventHandlers[eventType]; auto it = list.begin(); auto end = list.end(); - lsi->currentEventHandlerIt = ⁢ + lsi->currentEventHandlerIts.push_back(&it); bool cont = true; while (it != end) { @@ -441,7 +440,8 @@ bool CommandInterface::HandleEvent(const GameControllerEvent &event) } lua_pop(L, 1); } - lsi->currentEventHandlerIt = nullptr; + assert(lsi->currentEventHandlerIts.back() == &it); + lsi->currentEventHandlerIts.pop_back(); return cont; } @@ -463,9 +463,12 @@ void LuaScriptInterface::RemoveEventHandler(int eventType, int stackIndex) lua_pop(L, 1); if (equal) { - if (currentEventHandlerIt && *currentEventHandlerIt == it) + for (auto currentEventHandlerIt : currentEventHandlerIts) { - ++*currentEventHandlerIt; + if (*currentEventHandlerIt == it) + { + ++*currentEventHandlerIt; + } } list.erase(it); break; diff --git a/src/lua/LuaScriptInterface.h b/src/lua/LuaScriptInterface.h index 5d78522b7..33bc5c36b 100644 --- a/src/lua/LuaScriptInterface.h +++ b/src/lua/LuaScriptInterface.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace http { @@ -108,7 +109,7 @@ public: private: std::vector> gameControllerEventHandlers; // must come after luaState - std::list::iterator *currentEventHandlerIt = nullptr; + std::deque::iterator *> currentEventHandlerIts; public: void AddEventHandler(int eventType, int stackIndex);