commit
7e3b26e7ba
1
src/Bindings/.gitignore
vendored
1
src/Bindings/.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
lua51.dll
|
lua51.dll
|
||||||
|
LuaState_Call.inc
|
||||||
|
@ -9,10 +9,11 @@ Owned lua_State is created by calling Create() and the cLuaState automatically c
|
|||||||
Or, lua_State can be attached by calling Attach(), the cLuaState doesn't close such a state
|
Or, lua_State can be attached by calling Attach(), the cLuaState doesn't close such a state
|
||||||
Attaching a state will automatically close an owned state.
|
Attaching a state will automatically close an owned state.
|
||||||
|
|
||||||
Calling a Lua function is done by pushing the function, either by PushFunction() or PushFunctionFromRegistry(),
|
Calling a Lua function is done internally by pushing the function using PushFunction(), then pushing the
|
||||||
then pushing the arguments (PushString(), PushNumber(), PushUserData() etc.) and finally
|
arguments and finally executing CallFunction(). cLuaState automatically keeps track of the number of
|
||||||
executing CallFunction(). cLuaState automatically keeps track of the number of arguments and the name of the
|
arguments and the name of the function (for logging purposes). After the call the return values are read from
|
||||||
function (for logging purposes), which makes the call less error-prone.
|
the stack using GetStackValue(). All of this is wrapped in a templated function overloads cLuaState::Call(),
|
||||||
|
which is generated automatically by gen_LuaState_Call.lua script file into the LuaState_Call.inc file.
|
||||||
|
|
||||||
Reference management is provided by the cLuaState::cRef class. This is used when you need to hold a reference to
|
Reference management is provided by the cLuaState::cRef class. This is used when you need to hold a reference to
|
||||||
any Lua object across several function calls; usually this is used for callbacks. The class is RAII-like, with
|
any Lua object across several function calls; usually this is used for callbacks. The class is RAII-like, with
|
||||||
@ -228,624 +229,8 @@ public:
|
|||||||
void GetStackValue(int a_StackPos, eWeather & a_Value);
|
void GetStackValue(int a_StackPos, eWeather & a_Value);
|
||||||
|
|
||||||
|
|
||||||
/** Call any 0-param 0-return Lua function in a single line: */
|
// Include the cLuaState::Call() overload implementation that is generated by the gen_LuaState_Call.lua script:
|
||||||
template <typename FnT>
|
#include "LuaState_Call.inc"
|
||||||
bool Call(FnT a_FnName)
|
|
||||||
{
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return CallFunction(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 1-param 0-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT,
|
|
||||||
typename ArgT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1)
|
|
||||||
{
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
return CallFunction(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 2-param 0-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2)
|
|
||||||
{
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
return CallFunction(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 3-param 0-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3)
|
|
||||||
{
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
return CallFunction(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 0-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 1-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
int InitialTop = lua_gettop(m_LuaState);
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
ASSERT(InitialTop == lua_gettop(m_LuaState));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 2-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 3-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 4-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 5-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 6-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5, typename ArgT6,
|
|
||||||
typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 7-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5, typename ArgT6,
|
|
||||||
typename ArgT7, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 8-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5, typename ArgT6,
|
|
||||||
typename ArgT7, typename ArgT8, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, ArgT8 a_Arg8, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
Push(a_Arg8);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 9-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5, typename ArgT6,
|
|
||||||
typename ArgT7, typename ArgT8, typename ArgT9, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, ArgT8 a_Arg8, ArgT9 a_Arg9, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
Push(a_Arg8);
|
|
||||||
Push(a_Arg9);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 10-param 1-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5, typename ArgT6,
|
|
||||||
typename ArgT7, typename ArgT8, typename ArgT9, typename ArgT10, typename RetT1
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, ArgT8 a_Arg8, ArgT9 a_Arg9, ArgT10 a_Arg10, const cRet & a_Mark, RetT1 & a_Ret1)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
Push(a_Arg8);
|
|
||||||
Push(a_Arg9);
|
|
||||||
Push(a_Arg10);
|
|
||||||
if (!CallFunction(1))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-1, a_Ret1);
|
|
||||||
lua_pop(m_LuaState, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 1-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 2-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 3-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3,
|
|
||||||
typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 4-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4,
|
|
||||||
typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 5-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5,
|
|
||||||
typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 6-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5,
|
|
||||||
typename ArgT6,
|
|
||||||
typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 7-param 2-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5,
|
|
||||||
typename ArgT6, typename ArgT7,
|
|
||||||
typename RetT1, typename RetT2
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
if (!CallFunction(2))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-2, a_Ret1);
|
|
||||||
GetStackValue(-1, a_Ret2);
|
|
||||||
lua_pop(m_LuaState, 2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 7-param 3-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5,
|
|
||||||
typename ArgT6, typename ArgT7,
|
|
||||||
typename RetT1, typename RetT2, typename RetT3
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2, RetT3 & a_Ret3)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
if (!CallFunction(3))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-3, a_Ret1);
|
|
||||||
GetStackValue(-2, a_Ret2);
|
|
||||||
GetStackValue(-1, a_Ret3);
|
|
||||||
lua_pop(m_LuaState, 3);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 8-param 3-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5,
|
|
||||||
typename ArgT6, typename ArgT7, typename ArgT8,
|
|
||||||
typename RetT1, typename RetT2, typename RetT3
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, ArgT8 a_Arg8, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2, RetT3 & a_Ret3)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
Push(a_Arg8);
|
|
||||||
if (!CallFunction(3))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-3, a_Ret1);
|
|
||||||
GetStackValue(-2, a_Ret2);
|
|
||||||
GetStackValue(-1, a_Ret3);
|
|
||||||
lua_pop(m_LuaState, 3);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call any 9-param 5-return Lua function in a single line: */
|
|
||||||
template<
|
|
||||||
typename FnT, typename ArgT1, typename ArgT2, typename ArgT3, typename ArgT4, typename ArgT5,
|
|
||||||
typename ArgT6, typename ArgT7, typename ArgT8, typename ArgT9,
|
|
||||||
typename RetT1, typename RetT2, typename RetT3, typename RetT4, typename RetT5
|
|
||||||
>
|
|
||||||
bool Call(FnT a_FnName, ArgT1 a_Arg1, ArgT2 a_Arg2, ArgT3 a_Arg3, ArgT4 a_Arg4, ArgT5 a_Arg5, ArgT6 a_Arg6, ArgT7 a_Arg7, ArgT8 a_Arg8, ArgT9 a_Arg9, const cRet & a_Mark, RetT1 & a_Ret1, RetT2 & a_Ret2, RetT3 & a_Ret3, RetT4 & a_Ret4, RetT5 & a_Ret5)
|
|
||||||
{
|
|
||||||
UNUSED(a_Mark);
|
|
||||||
if (!PushFunction(a_FnName))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Push(a_Arg1);
|
|
||||||
Push(a_Arg2);
|
|
||||||
Push(a_Arg3);
|
|
||||||
Push(a_Arg4);
|
|
||||||
Push(a_Arg5);
|
|
||||||
Push(a_Arg6);
|
|
||||||
Push(a_Arg7);
|
|
||||||
Push(a_Arg8);
|
|
||||||
Push(a_Arg9);
|
|
||||||
if (!CallFunction(5))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetStackValue(-5, a_Ret1);
|
|
||||||
GetStackValue(-4, a_Ret2);
|
|
||||||
GetStackValue(-3, a_Ret3);
|
|
||||||
GetStackValue(-2, a_Ret4);
|
|
||||||
GetStackValue(-1, a_Ret5);
|
|
||||||
lua_pop(m_LuaState, 5);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Returns true if the specified parameters on the stack are of the specified usertable type; also logs warning if not. Used for static functions */
|
/** Returns true if the specified parameters on the stack are of the specified usertable type; also logs warning if not. Used for static functions */
|
||||||
|
196
src/Bindings/gen_LuaState_Call.lua
Normal file
196
src/Bindings/gen_LuaState_Call.lua
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
|
||||||
|
-- gen_LuaState_Call.lua
|
||||||
|
|
||||||
|
-- Generates the cLuaState::Call() function templates that are included from LuaState.h
|
||||||
|
|
||||||
|
--[[
|
||||||
|
The cLuaState::Call() family of functions provides a template-based system for calling any Lua function
|
||||||
|
either by name or by reference with almost any number of parameters and return values. This is done by
|
||||||
|
providing a number of overloads of the same name with variable number of template-type parameters. To
|
||||||
|
separate the arguments from the return values, a special type of cLuaState::cRet is used.
|
||||||
|
--]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("Generating LuaState_Call.inc...")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- List of combinations (# params, # returns) to generate:
|
||||||
|
local Combinations =
|
||||||
|
{
|
||||||
|
-- no return values:
|
||||||
|
{0, 0},
|
||||||
|
{1, 0},
|
||||||
|
{2, 0},
|
||||||
|
{3, 0},
|
||||||
|
{4, 0},
|
||||||
|
|
||||||
|
-- 1 return value:
|
||||||
|
{0, 1},
|
||||||
|
{1, 1},
|
||||||
|
{2, 1},
|
||||||
|
{3, 1},
|
||||||
|
{4, 1},
|
||||||
|
{5, 1},
|
||||||
|
{6, 1},
|
||||||
|
{7, 1},
|
||||||
|
{8, 1},
|
||||||
|
{9, 1},
|
||||||
|
{10, 1},
|
||||||
|
|
||||||
|
-- 2 return values:
|
||||||
|
{0, 2},
|
||||||
|
{1, 2},
|
||||||
|
{2, 2},
|
||||||
|
{3, 2},
|
||||||
|
{4, 2},
|
||||||
|
{5, 2},
|
||||||
|
{6, 2},
|
||||||
|
{7, 2},
|
||||||
|
{8, 2},
|
||||||
|
{9, 2},
|
||||||
|
|
||||||
|
-- Special combinations:
|
||||||
|
{7, 3},
|
||||||
|
{8, 3},
|
||||||
|
{9, 5},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--- Writes a single overloaded function definition for the specified number of params and returns into f
|
||||||
|
--[[
|
||||||
|
The format for the generated function is this:
|
||||||
|
/** Call the specified 3-param 2-return Lua function:
|
||||||
|
Returns true if call succeeded, false if there was an error. */
|
||||||
|
template <typename FnT, typename ParamT1, typename ParamT2, typename ParamT3, typename RetT1, typename RetT2>
|
||||||
|
bool Call(FnT a_Function, ParamT1 a_Param1, ParamT2 a_Param2, ParamT3 a_Param3, const cLuaState::cRet & a_RetMark, RetT1 & a_Ret1, RetT2 & a_Ret2)
|
||||||
|
{
|
||||||
|
UNUSED(a_RetMark);
|
||||||
|
if (!PushFunction(a_Function))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Push(a_Param1);
|
||||||
|
Push(a_Param2);
|
||||||
|
Push(a_Param3);
|
||||||
|
if (!CallFunction(2))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
GetStackValue(-2, a_Ret1);
|
||||||
|
GetStackValue(-1, a_Ret2);
|
||||||
|
lua_pop(m_LuaState, 2);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Note especially the negative numbers in GetStackValue() calls.
|
||||||
|
--]]
|
||||||
|
local function WriteOverload(f, a_NumParams, a_NumReturns)
|
||||||
|
-- Write the function doxy-comments:
|
||||||
|
f:write("/** Call the specified ", a_NumParams, "-param ", a_NumReturns, "-return Lua function:\n")
|
||||||
|
f:write("Returns true if call succeeded, false if there was an error. */\n")
|
||||||
|
|
||||||
|
-- Write the template <...> line:
|
||||||
|
f:write("template <typename FnT")
|
||||||
|
for i = 1, a_NumParams do
|
||||||
|
f:write(", typename ParamT", i)
|
||||||
|
end
|
||||||
|
if (a_NumReturns > 0) then
|
||||||
|
for i = 1, a_NumReturns do
|
||||||
|
f:write(", typename RetT", i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
f:write(">\n")
|
||||||
|
|
||||||
|
-- Write the function signature:
|
||||||
|
f:write("bool Call(")
|
||||||
|
f:write("FnT a_Function")
|
||||||
|
for i = 1, a_NumParams do
|
||||||
|
f:write(", ParamT", i, " a_Param", i)
|
||||||
|
end
|
||||||
|
if (a_NumReturns > 0) then
|
||||||
|
f:write(", const cLuaState::cRet & a_RetMark")
|
||||||
|
for i = 1, a_NumReturns do
|
||||||
|
f:write(", RetT", i, " & a_Ret", i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
f:write(")\n")
|
||||||
|
|
||||||
|
-- Common code:
|
||||||
|
f:write("{\n")
|
||||||
|
if (a_NumReturns > 0) then
|
||||||
|
f:write("\tUNUSED(a_RetMark);\n")
|
||||||
|
end
|
||||||
|
f:write("\tif (!PushFunction(a_Function))\n")
|
||||||
|
f:write("\t{\n")
|
||||||
|
f:write("\t\treturn false;\n")
|
||||||
|
f:write("\t}\n")
|
||||||
|
|
||||||
|
-- Push the params:
|
||||||
|
for i = 1, a_NumParams do
|
||||||
|
f:write("\tPush(a_Param", i, ");\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Call the function:
|
||||||
|
f:write("\tif (!CallFunction(", a_NumReturns, "))\n")
|
||||||
|
f:write("\t{\n")
|
||||||
|
f:write("\t\treturn false;\n")
|
||||||
|
f:write("\t}\n")
|
||||||
|
|
||||||
|
-- Get the return values:
|
||||||
|
for i = 1, a_NumReturns do
|
||||||
|
f:write("\tGetStackValue(", -1 - a_NumReturns + i, ", a_Ret", i, ");\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pop the returns off the stack, if needed:
|
||||||
|
if (a_NumReturns > 0) then
|
||||||
|
f:write("\tlua_pop(m_LuaState, ", a_NumReturns, ");\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Everything ok:
|
||||||
|
f:write("\treturn true;\n")
|
||||||
|
f:write("}\n")
|
||||||
|
|
||||||
|
-- Separate from the next function:
|
||||||
|
f:write("\n\n\n\n\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
local f = assert(io.open("LuaState_Call.inc", "w"))
|
||||||
|
|
||||||
|
-- Write file header:
|
||||||
|
f:write([[
|
||||||
|
// LuaState_Call.inc
|
||||||
|
|
||||||
|
// This file is auto-generated by gen_LuaState_Call.lua
|
||||||
|
// Make changes to the generator instead of to this file!
|
||||||
|
|
||||||
|
// This file contains the various overloads for the cLuaState::Call() function
|
||||||
|
// Each overload handles a different number of parameters / return values
|
||||||
|
]])
|
||||||
|
f:write("\n\n\n\n\n")
|
||||||
|
|
||||||
|
-- Write out a template function for each overload:
|
||||||
|
for _, combination in ipairs(Combinations) do
|
||||||
|
WriteOverload(f, combination[1], combination[2])
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Close the generated file
|
||||||
|
f:close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("LuaState_Call.inc generated")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3,6 +3,20 @@ local disable_virtual_hooks = true
|
|||||||
local enable_pure_virtual = true
|
local enable_pure_virtual = true
|
||||||
local default_private_access = false
|
local default_private_access = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Code generators used by the build
|
||||||
|
-- Note that these are not exactly needed for the bindings, but rather we
|
||||||
|
-- misuse tolua's Lua engine to process files for us
|
||||||
|
dofile("gen_LuaState_Call.lua")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local access = {public = 0, protected = 1, private = 2}
|
local access = {public = 0, protected = 1, private = 2}
|
||||||
|
|
||||||
function preparse_hook(p)
|
function preparse_hook(p)
|
||||||
|
@ -12,6 +12,7 @@ set(BINDING_DEPENDECIES
|
|||||||
tolua
|
tolua
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/virtual_method_hooks.lua
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/virtual_method_hooks.lua
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/AllToLua.pkg
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/AllToLua.pkg
|
||||||
|
Bindings/gen_LuaState_Call.lua
|
||||||
Bindings/LuaFunctions.h
|
Bindings/LuaFunctions.h
|
||||||
Bindings/LuaWindow.h
|
Bindings/LuaWindow.h
|
||||||
Bindings/Plugin.h
|
Bindings/Plugin.h
|
||||||
@ -79,13 +80,19 @@ set(BINDING_DEPENDECIES
|
|||||||
World.h
|
World.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# List all the files that are generated as part of the Bindings build process
|
||||||
|
set (BINDING_OUTPUTS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Bindings/LuaState_Call.inc
|
||||||
|
)
|
||||||
|
|
||||||
include_directories(Bindings)
|
include_directories(Bindings)
|
||||||
include_directories(.)
|
include_directories(.)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
# add any new generated bindings here
|
OUTPUT ${BINDING_OUTPUTS}
|
||||||
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Bindings/Bindings.h
|
|
||||||
|
|
||||||
# Copy the Lua DLL into the Bindings folder, so that tolua can run from there:
|
# Copy the Lua DLL into the Bindings folder, so that tolua can run from there:
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ../../MCServer/lua51.dll ./lua51.dll
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ../../MCServer/lua51.dll ./lua51.dll
|
||||||
|
Loading…
Reference in New Issue
Block a user