Merge remote-tracking branch 'refs/remotes/origin/master' into enet_wip_nothing_to_see_here

This commit is contained in:
Lynix 2017-06-10 22:29:31 +02:00
commit a82de92377
3 changed files with 49 additions and 14 deletions

View File

@ -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);

View File

@ -3,16 +3,34 @@
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Lua/LuaInstance.hpp>
#include <Nazara/Core/Algorithm.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>
#include <Nazara/Lua/Debug.hpp>
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/MemoryView.hpp>
#include <Nazara/Core/StringStream.hpp>
#include <cassert>
#include <cstdlib>
#include <stdexcept>
#include <unordered_map>
@ -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<LuaInstance*>(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<void**>(&instance));
if (instance->m_clock.GetMilliseconds() > instance->m_timeLimit)
if (instance->m_clock.GetMilliseconds() > instance->GetTimeLimit())
luaL_error(internalState, "maximum execution time exceeded");
}
}