diff options
author | Marcus Tillmanns <marcus.tillmanns@qt.io> | 2024-05-02 14:33:21 +0200 |
---|---|---|
committer | Marcus Tillmanns <marcus.tillmanns@qt.io> | 2024-05-03 12:43:55 +0000 |
commit | 218f07bdef721a23cc90e75d49df4c9ed3ac20a5 (patch) | |
tree | d38271e995154b852c679c93d63300e3288d8502 /src/plugins/lua | |
parent | a13aa8d3deed4c4dc97758e8371a5edcd6f2ddb0 (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.txt | 6 | ||||
-rw-r--r-- | src/plugins/lua/luaengine.cpp | 15 | ||||
-rw-r--r-- | src/plugins/lua/luaengine.h | 10 | ||||
-rw-r--r-- | src/plugins/lua/luaplugin.cpp | 8 |
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 |