int LuaEngine::executeGlobalFunction(const char* functionName, int numArgs)
{
lua_State *luaState = LuaEngine::getInstance()->getLuaStack()->getLuaState();
lua_getglobal(luaState, functionName); /* query function by name, stack: function */
if (lua_isfunction(luaState, -1))
{
if (numArgs > 0)
{
lua_insert(luaState, -(numArgs + 1)); /* stack: ... func arg1 arg2 ... */
}
int traceback = 0;
lua_getglobal(luaState, "__G__TRACKBACK__"); /* stack: ... func arg1 arg2 ... G */
if (!lua_isfunction(luaState, -1))
{
lua_pop(luaState, 1); /* stack: ... func arg1 arg2 ... */
}
else
{
traceback = -(numArgs + 2);
lua_insert(luaState, traceback); /* stack: ... G func arg1 arg2 ... */
}
int error = 0;
error = lua_pcall(luaState, numArgs, 1, traceback); /* stack: ... ret */
if (error)
{
if (traceback == 0)
{
CCLOG("[LUA ERROR] %s", lua_tostring(luaState, - 1)); /* stack: ... error */
lua_pop(luaState, 1); // remove error message from stack
}
return 0;
}
// get return value
int ret = 0;
if (lua_isnumber(luaState, -1))
{
ret = lua_tointeger(luaState, -1);
}
else if (lua_isboolean(luaState, -1))
{
ret = lua_toboolean(luaState, -1);
}
lua_pop(luaState, 1); // remove return value from stack
return ret;
}
else
{
CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", functionName);
lua_pop(luaState, 1);
lua_pop(luaState, numArgs); // remove args from stack
return 0;
}
}
{
lua_State *luaState = LuaEngine::getInstance()->getLuaStack()->getLuaState();
lua_getglobal(luaState, functionName); /* query function by name, stack: function */
if (lua_isfunction(luaState, -1))
{
if (numArgs > 0)
{
lua_insert(luaState, -(numArgs + 1)); /* stack: ... func arg1 arg2 ... */
}
int traceback = 0;
lua_getglobal(luaState, "__G__TRACKBACK__"); /* stack: ... func arg1 arg2 ... G */
if (!lua_isfunction(luaState, -1))
{
lua_pop(luaState, 1); /* stack: ... func arg1 arg2 ... */
}
else
{
traceback = -(numArgs + 2);
lua_insert(luaState, traceback); /* stack: ... G func arg1 arg2 ... */
}
int error = 0;
error = lua_pcall(luaState, numArgs, 1, traceback); /* stack: ... ret */
if (error)
{
if (traceback == 0)
{
CCLOG("[LUA ERROR] %s", lua_tostring(luaState, - 1)); /* stack: ... error */
lua_pop(luaState, 1); // remove error message from stack
}
return 0;
}
// get return value
int ret = 0;
if (lua_isnumber(luaState, -1))
{
ret = lua_tointeger(luaState, -1);
}
else if (lua_isboolean(luaState, -1))
{
ret = lua_toboolean(luaState, -1);
}
lua_pop(luaState, 1); // remove return value from stack
return ret;
}
else
{
CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", functionName);
lua_pop(luaState, 1);
lua_pop(luaState, numArgs); // remove args from stack
return 0;
}
}