From 13c892f9d3ab595518d2348d1772b942a2ec2f68 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 7 Jun 2024 10:34:55 +0200 Subject: [PATCH] LuaLSC: Fix crash on exit Since the client lives longer than the lua context, its destruction would also cleanup the custom handlers which had captured the lua function. Calling anything as well as the destructor of a sol object after the lua context is gone results in a crash, so make sure that we don't keep it around any longer. A better solution in the long term would be to allow custom handlers to be unregistered in the Language Client. Change-Id: I59ac39d9279dc5faf24d3fd3b29e8c7c00e2b48e Reviewed-by: David Schulz --- .../lualanguageclient/lualanguageclient.cpp | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp index 44fd187a729..67c0cf893a2 100644 --- a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp +++ b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp @@ -294,8 +294,13 @@ public: } } - // TODO: Unregister Client settings from LanguageClientManager - ~LuaClientWrapper() = default; + ~LuaClientWrapper() + { + for (auto client : m_clients) + LanguageClientManager::shutdownClient(client); + + // TODO: Unregister Client settings from LanguageClientManager + } TransportType transportType() { return m_transportType; } @@ -338,9 +343,15 @@ public: for (Client *c : m_clients) { for (const auto &[msg, func] : m_messageCallbacks.asKeyValueRange()) { c->registerCustomMethod( - msg, [name = msg, f = func](const LanguageServerProtocol::JsonRpcMessage &m) { - auto table = ::Lua::LuaEngine::toTable(f.lua_state(), m.toJsonObject()); - auto result = f.call(table); + msg, + [self = QPointer(this), + name = msg](const LanguageServerProtocol::JsonRpcMessage &m) { + if (!self) + return; + + auto func = self->m_messageCallbacks.value(name); + auto table = ::Lua::LuaEngine::toTable(func.lua_state(), m.toJsonObject()); + auto result = func.call(table); if (!result.valid()) { qWarning() << "Error calling message callback for:" << name << ":" << (result.get().what());