Lua/LuaInstance: Fix missing memory/time methods
This commit is contained in:
parent
35ba78510b
commit
78182502e3
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue