From 5380b6a41b6a8a54fb2f2d0e33281868ce7cc8a7 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 20 Jan 2018 14:20:46 +0100 Subject: [PATCH] Lua/LuaInstance: Move library initializations to LoadLibraries --- ChangeLog.md | 1 + SDK/src/NDK/Application.cpp | 1 + include/Nazara/Lua/Enums.hpp | 27 ++++++++++++++++++ include/Nazara/Lua/LuaInstance.hpp | 3 ++ src/Nazara/Lua/LuaInstance.cpp | 44 +++++++++++++++++++++++++++++- 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 18a8b61c2..da2a0c98e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -58,6 +58,7 @@ Nazara Engine: - Update Constraint2Ds classes (Add : Ref, Library, ConstRef, New function and Update : ctors) - Fix LuaClass not working correctly when Lua stack wasn't empty - Add RigidBody2D simulation control (via EnableSimulation and IsSimulationEnabled), which allows to disable physics and collisions at will. +- ⚠️ LuaInstance no longer load all lua libraries on construction, this is done in the new LoadLibraries method which allows you to excludes some libraries Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index efe80531c..5e0f07d00 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -165,6 +165,7 @@ namespace Ndk consoleRef.AddLine(str); }); + overlay->lua.LoadLibraries(); LuaAPI::RegisterClasses(overlay->lua); // Override "print" function to add a line in the console diff --git a/include/Nazara/Lua/Enums.hpp b/include/Nazara/Lua/Enums.hpp index f62357e6f..e92f058d5 100644 --- a/include/Nazara/Lua/Enums.hpp +++ b/include/Nazara/Lua/Enums.hpp @@ -7,6 +7,8 @@ #ifndef NAZARA_ENUMS_LUA_HPP #define NAZARA_ENUMS_LUA_HPP +#include + namespace Nz { enum LuaBindMode @@ -26,6 +28,21 @@ namespace Nz LuaComparison_Max = LuaComparison_LessOrEqual }; + enum LuaLib + { + LuaLib_Coroutine, + LuaLib_Debug, + LuaLib_Math, + LuaLib_Io, + LuaLib_Package, + LuaLib_Os, + LuaLib_String, + LuaLib_Table, + LuaLib_Utf8, + + LuaLib_Max = LuaLib_Utf8 + }; + enum LuaOperation { LuaOperation_Addition, @@ -61,6 +78,16 @@ namespace Nz LuaType_Max = LuaType_Userdata }; + + template<> + struct EnumAsFlags + { + static constexpr LuaLib max = LuaLib_Max; + }; + + using LuaLibFlags = Flags; + + constexpr LuaLibFlags LuaLib_All = LuaLibFlags(LuaLibFlags::ValueMask); } #endif // NAZARA_ENUMS_LUA_HPP diff --git a/include/Nazara/Lua/LuaInstance.hpp b/include/Nazara/Lua/LuaInstance.hpp index ac93a059a..c45a77a94 100644 --- a/include/Nazara/Lua/LuaInstance.hpp +++ b/include/Nazara/Lua/LuaInstance.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -29,6 +30,8 @@ namespace Nz inline std::size_t GetMemoryUsage() const; inline UInt32 GetTimeLimit() const; + void LoadLibraries(LuaLibFlags libFlags = LuaLib_All); + inline void SetMemoryLimit(std::size_t memoryLimit); inline void SetTimeLimit(UInt32 limit); diff --git a/src/Nazara/Lua/LuaInstance.cpp b/src/Nazara/Lua/LuaInstance.cpp index 64eedf502..85567df81 100644 --- a/src/Nazara/Lua/LuaInstance.cpp +++ b/src/Nazara/Lua/LuaInstance.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -35,7 +36,6 @@ namespace Nz m_state = lua_newstate(MemoryAllocator, this); lua_atpanic(m_state, AtPanic); lua_sethook(m_state, TimeLimiter, LUA_MASKCOUNT, 1000); - luaL_openlibs(m_state); } LuaInstance::LuaInstance(LuaInstance&& instance) : @@ -60,6 +60,48 @@ namespace Nz lua_close(m_state); } + void LuaInstance::LoadLibraries(LuaLibFlags libFlags) + { + // From luaL_openlibs + std::array libs; + std::size_t libCount = 0; + + libs[libCount++] = { "_G", luaopen_base }; + + if (libFlags & LuaLib_Coroutine) + libs[libCount++] = { LUA_COLIBNAME, luaopen_coroutine }; + + if (libFlags & LuaLib_Debug) + libs[libCount++] = { LUA_DBLIBNAME, luaopen_debug }; + + if (libFlags & LuaLib_Io) + libs[libCount++] = { LUA_IOLIBNAME, luaopen_io }; + + if (libFlags & LuaLib_Math) + libs[libCount++] = { LUA_MATHLIBNAME, luaopen_math }; + + if (libFlags & LuaLib_Os) + libs[libCount++] = { LUA_OSLIBNAME, luaopen_os }; + + if (libFlags & LuaLib_Package) + libs[libCount++] = { LUA_LOADLIBNAME, luaopen_package }; + + if (libFlags & LuaLib_String) + libs[libCount++] = { LUA_STRLIBNAME, luaopen_string }; + + if (libFlags & LuaLib_Table) + libs[libCount++] = { LUA_TABLIBNAME, luaopen_table }; + + if (libFlags & LuaLib_Utf8) + libs[libCount++] = { LUA_UTF8LIBNAME, luaopen_utf8 }; + + for (std::size_t i = 0; i < libCount; ++i) + { + luaL_requiref(m_state, libs[i].name, libs[i].func, 1); + lua_pop(m_state, 1); /* remove lib */ + } + } + LuaInstance& LuaInstance::operator=(LuaInstance&& instance) { LuaState::operator=(std::move(instance));