aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/lua
diff options
context:
space:
mode:
authorMarcus Tillmanns <marcus.tillmanns@qt.io>2024-05-02 14:33:21 +0200
committerMarcus Tillmanns <marcus.tillmanns@qt.io>2024-05-03 12:43:55 +0000
commit218f07bdef721a23cc90e75d49df4c9ed3ac20a5 (patch)
treed38271e995154b852c679c93d63300e3288d8502 /src/plugins/lua
parenta13aa8d3deed4c4dc97758e8371a5edcd6f2ddb0 (diff)
Lua: Bind lifetime of LuaEngine
We want to make sure that the LuaEngine is deleted when the plugin is removed. We also derive LuaEngine from QObject so we can use it as a guard in QObject::connect calls. Change-Id: I6b0568f11bee283f880ede9432b2a9fe83014758 Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/lua')
-rw-r--r--src/plugins/lua/CMakeLists.txt6
-rw-r--r--src/plugins/lua/luaengine.cpp15
-rw-r--r--src/plugins/lua/luaengine.h10
-rw-r--r--src/plugins/lua/luaplugin.cpp8
4 files changed, 29 insertions, 10 deletions
diff --git a/src/plugins/lua/CMakeLists.txt b/src/plugins/lua/CMakeLists.txt
index 7f0d440319a..5d83f9d92ee 100644
--- a/src/plugins/lua/CMakeLists.txt
+++ b/src/plugins/lua/CMakeLists.txt
@@ -4,12 +4,12 @@ add_qtc_plugin(Lua
PUBLIC_DEPENDS lua546 sol2
PUBLIC_DEFINES LUA_AVAILABLE
SOURCES
- bindings/inheritance.h
- bindings/async.cpp
bindings/action.cpp
- bindings/hook.cpp
+ bindings/async.cpp
bindings/core.cpp
bindings/fetch.cpp
+ bindings/hook.cpp
+ bindings/inheritance.h
bindings/layout.cpp
bindings/messagemanager.cpp
bindings/qtcprocess.cpp
diff --git a/src/plugins/lua/luaengine.cpp b/src/plugins/lua/luaengine.cpp
index d75d47ac7df..67dea9be53f 100644
--- a/src/plugins/lua/luaengine.cpp
+++ b/src/plugins/lua/luaengine.cpp
@@ -25,17 +25,24 @@ public:
QMap<QString, std::function<void(sol::function)>> m_hooks;
};
+static LuaEngine *s_instance = nullptr;
+
LuaEngine &LuaEngine::instance()
{
- static LuaEngine luaEngine;
- return luaEngine;
+ Q_ASSERT(s_instance);
+ return *s_instance;
}
LuaEngine::LuaEngine()
: d(new LuaEnginePrivate())
-{}
+{
+ s_instance = this;
+}
-LuaEngine::~LuaEngine() = default;
+LuaEngine::~LuaEngine()
+{
+ s_instance = nullptr;
+}
void LuaEngine::registerProvider(const QString &packageName, const PackageProvider &provider)
{
diff --git a/src/plugins/lua/luaengine.h b/src/plugins/lua/luaengine.h
index 43a4387bef6..a683f43f2da 100644
--- a/src/plugins/lua/luaengine.h
+++ b/src/plugins/lua/luaengine.h
@@ -24,14 +24,20 @@ namespace Lua {
class LuaEnginePrivate;
class LuaPluginSpec;
+namespace Internal {
+class LuaPlugin;
+}
+
struct CoroutineState
{
bool isMainThread;
};
-class LUA_EXPORT LuaEngine
+class LUA_EXPORT LuaEngine final : public QObject
{
-private:
+ friend class Internal::LuaPlugin;
+
+protected:
LuaEngine();
public:
diff --git a/src/plugins/lua/luaplugin.cpp b/src/plugins/lua/luaplugin.cpp
index e2c2db68d5b..cca0f6dd340 100644
--- a/src/plugins/lua/luaplugin.cpp
+++ b/src/plugins/lua/luaplugin.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+#include "luaengine.h"
#include "luapluginloader.h"
#include <coreplugin/coreconstants.h>
@@ -34,8 +35,13 @@ class LuaPlugin : public ExtensionSystem::IPlugin
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Lua.json")
+private:
+ std::unique_ptr<LuaEngine> m_luaEngine;
+
public:
- LuaPlugin() = default;
+ LuaPlugin()
+ : m_luaEngine(new LuaEngine())
+ {}
~LuaPlugin() override = default;
void initialize() final