Lua/LuaInstance: Fix missing memory/time methods

This commit is contained in:
Lynix 2017-06-10 22:29:17 +02:00
parent 35ba78510b
commit 78182502e3
3 changed files with 49 additions and 14 deletions

View File

@ -25,10 +25,19 @@ namespace Nz
LuaInstance(LuaInstance&& instance) = default; LuaInstance(LuaInstance&& instance) = default;
~LuaInstance(); ~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=(const LuaInstance&) = delete;
LuaInstance& operator=(LuaInstance&& instance) = default; LuaInstance& operator=(LuaInstance&& instance) = default;
private: 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* MemoryAllocator(void *ud, void *ptr, std::size_t osize, std::size_t nsize);
static void TimeLimiter(lua_State* internalState, lua_Debug* debug); static void TimeLimiter(lua_State* internalState, lua_Debug* debug);

View File

@ -3,16 +3,34 @@
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Lua/LuaInstance.hpp> #include <Nazara/Lua/LuaInstance.hpp>
#include <Nazara/Core/Algorithm.hpp> #include <Nazara/Lua/Debug.hpp>
#include <Nazara/Core/Flags.hpp>
#include <Nazara/Core/MemoryHelper.hpp>
#include <Nazara/Core/StringStream.hpp>
#include <Nazara/Math/Algorithm.hpp>
#include <limits>
#include <string>
#include <vector>
#include <type_traits>
namespace Nz 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 <Nazara/Lua/DebugOff.hpp>

View File

@ -12,6 +12,7 @@
#include <Nazara/Core/MemoryHelper.hpp> #include <Nazara/Core/MemoryHelper.hpp>
#include <Nazara/Core/MemoryView.hpp> #include <Nazara/Core/MemoryView.hpp>
#include <Nazara/Core/StringStream.hpp> #include <Nazara/Core/StringStream.hpp>
#include <cassert>
#include <cstdlib> #include <cstdlib>
#include <stdexcept> #include <stdexcept>
#include <unordered_map> #include <unordered_map>
@ -48,15 +49,22 @@ namespace Nz
lua_close(m_state); 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) void* LuaInstance::MemoryAllocator(void* ud, void* ptr, std::size_t osize, std::size_t nsize)
{ {
LuaInstance* instance = static_cast<LuaInstance*>(ud); LuaInstance* instance = static_cast<LuaInstance*>(ud);
std::size_t& memoryLimit = instance->m_memoryLimit; std::size_t memoryLimit = instance->GetMemoryLimit();
std::size_t& memoryUsage = instance->m_memoryUsage; std::size_t memoryUsage = instance->GetMemoryUsage();
if (nsize == 0) if (nsize == 0)
{ {
memoryUsage -= osize; assert(memoryUsage >= osize);
instance->SetMemoryUsage(memoryUsage - osize);
std::free(ptr); std::free(ptr);
return nullptr; return nullptr;
@ -73,7 +81,7 @@ namespace Nz
return nullptr; return nullptr;
} }
memoryUsage = usage; instance->SetMemoryUsage(usage);
return std::realloc(ptr, nsize); return std::realloc(ptr, nsize);
} }
@ -86,7 +94,7 @@ namespace Nz
LuaInstance* instance; LuaInstance* instance;
lua_getallocf(internalState, reinterpret_cast<void**>(&instance)); lua_getallocf(internalState, reinterpret_cast<void**>(&instance));
if (instance->m_clock.GetMilliseconds() > instance->m_timeLimit) if (instance->m_clock.GetMilliseconds() > instance->GetTimeLimit())
luaL_error(internalState, "maximum execution time exceeded"); luaL_error(internalState, "maximum execution time exceeded");
} }
} }