diff --git a/include/Nazara/Lua/LuaInstance.hpp b/include/Nazara/Lua/LuaInstance.hpp index a5d631645..93374958b 100644 --- a/include/Nazara/Lua/LuaInstance.hpp +++ b/include/Nazara/Lua/LuaInstance.hpp @@ -25,10 +25,19 @@ namespace Nz LuaInstance(LuaInstance&& instance) = default; ~LuaInstance(); + inline std::size_t GetMemoryLimit() const; + inline std::size_t GetMemoryUsage() const; + inline UInt32 GetTimeLimit() const; + + inline void SetMemoryLimit(std::size_t memoryLimit); + inline void SetTimeLimit(UInt32 limit); + LuaInstance& operator=(const LuaInstance&) = delete; LuaInstance& operator=(LuaInstance&& instance) = default; private: + inline void SetMemoryUsage(std::size_t memoryUsage); + static void* MemoryAllocator(void *ud, void *ptr, std::size_t osize, std::size_t nsize); static void TimeLimiter(lua_State* internalState, lua_Debug* debug); diff --git a/include/Nazara/Lua/LuaInstance.inl b/include/Nazara/Lua/LuaInstance.inl index f4394eb6b..6752eb0e0 100644 --- a/include/Nazara/Lua/LuaInstance.inl +++ b/include/Nazara/Lua/LuaInstance.inl @@ -3,16 +3,34 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include namespace Nz { + inline std::size_t LuaInstance::GetMemoryLimit() const + { + return m_memoryLimit; + } + + inline std::size_t LuaInstance::GetMemoryUsage() const + { + return m_memoryUsage; + } + + inline UInt32 LuaInstance::GetTimeLimit() const + { + return m_timeLimit; + } + + inline void LuaInstance::SetMemoryLimit(std::size_t memoryLimit) + { + m_memoryLimit = m_memoryLimit; + } + + inline void LuaInstance::SetTimeLimit(UInt32 limit) + { + m_timeLimit = limit; + } } + +#include diff --git a/src/Nazara/Lua/LuaInstance.cpp b/src/Nazara/Lua/LuaInstance.cpp index a0d5d3ff7..cd47ac5c7 100644 --- a/src/Nazara/Lua/LuaInstance.cpp +++ b/src/Nazara/Lua/LuaInstance.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -48,15 +49,22 @@ namespace Nz lua_close(m_state); } + inline void LuaInstance::SetMemoryUsage(std::size_t memoryUsage) + { + m_memoryUsage = memoryUsage; + } + void* LuaInstance::MemoryAllocator(void* ud, void* ptr, std::size_t osize, std::size_t nsize) { LuaInstance* instance = static_cast(ud); - std::size_t& memoryLimit = instance->m_memoryLimit; - std::size_t& memoryUsage = instance->m_memoryUsage; + std::size_t memoryLimit = instance->GetMemoryLimit(); + std::size_t memoryUsage = instance->GetMemoryUsage(); if (nsize == 0) { - memoryUsage -= osize; + assert(memoryUsage >= osize); + + instance->SetMemoryUsage(memoryUsage - osize); std::free(ptr); return nullptr; @@ -73,7 +81,7 @@ namespace Nz return nullptr; } - memoryUsage = usage; + instance->SetMemoryUsage(usage); return std::realloc(ptr, nsize); } @@ -86,7 +94,7 @@ namespace Nz LuaInstance* instance; lua_getallocf(internalState, reinterpret_cast(&instance)); - if (instance->m_clock.GetMilliseconds() > instance->m_timeLimit) + if (instance->m_clock.GetMilliseconds() > instance->GetTimeLimit()) luaL_error(internalState, "maximum execution time exceeded"); } }