1
0
Fork 0

Remove double delete of PrepareChunk lua callback (#3844)

This commit is contained in:
peterbell10 2017-07-12 10:56:01 +01:00 committed by Lukas Pioch
parent e38a2a1e8c
commit d6ee1caf4c
1 changed files with 17 additions and 30 deletions

View File

@ -413,11 +413,26 @@ static int tolua_cWorld_PrepareChunk(lua_State * tolua_S)
return 0;
}
// Wrap the Lua callback inside a C++ callback class:
class cCallback:
public cChunkCoordCallback
{
public:
// cChunkCoordCallback override:
virtual void Call(int a_CBChunkX, int a_CBChunkZ, bool a_IsSuccess) override
{
m_LuaCallback.Call(a_CBChunkX, a_CBChunkZ, a_IsSuccess);
}
cLuaState::cOptionalCallback m_LuaCallback;
};
// Read the params:
cWorld * world = nullptr;
int chunkX = 0;
int chunkZ = 0;
L.GetStackValues(1, world, chunkX, chunkZ);
auto Callback = cpp14::make_unique<cCallback>();
L.GetStackValues(1, world, chunkX, chunkZ, Callback->m_LuaCallback);
if (world == nullptr)
{
LOGWARNING("World:PrepareChunk(): invalid world parameter");
@ -425,36 +440,8 @@ static int tolua_cWorld_PrepareChunk(lua_State * tolua_S)
return 0;
}
// Wrap the Lua callback inside a C++ callback class:
class cCallback:
public cChunkCoordCallback
{
public:
cCallback(lua_State * a_LuaState):
m_LuaState(a_LuaState),
m_Callback(m_LuaState, 4)
{
}
// cChunkCoordCallback override:
virtual void Call(int a_CBChunkX, int a_CBChunkZ, bool a_IsSuccess) override
{
if (m_Callback.IsValid())
{
m_LuaState.Call(m_Callback, a_CBChunkX, a_CBChunkZ, a_IsSuccess);
}
// This is the last reference of this object, we must delete it so that it doesn't leak:
delete this;
}
protected:
cLuaState m_LuaState;
cLuaState::cRef m_Callback;
};
// Call the chunk preparation:
world->PrepareChunk(chunkX, chunkZ, cpp14::make_unique<cCallback>(tolua_S));
world->PrepareChunk(chunkX, chunkZ, std::move(Callback));
return 0;
}