c++ 调用lua 可传两个参数的 重载方法
2016-08-13 16:14
411 查看
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;
}
}
相关文章推荐
- Lua调用C++带参数的方法
- Lua调用C++带参数的方法
- ios如何用perform selector调用超过两个以上参数的方法
- C# 调用C++DLL传递指向指针的指针参数的方法
- C++中使用Lua脚本 和lua中调用c的方法
- lua脚本语言的学习-----------------如何实现c++无参数的函数在lua中调用
- c/c++/java,函数调用的参数的传递方法
- C++ operator new 重载(两个参数)
- 【C#基础】方法及其调用、构造方法、out与ref参数及其返回值、方法重载、静态方法等简单介绍
- iOS 消息(即方法调用)的两个隐藏参数 :self 和 _cmd
- java一个方法形参有两个,如何在调用的时候只传入一个参数
- C++中使用Lua脚本 和lua中调用c的方法
- 如何用perform selector调用超过两个以上参数的方法
- Lua使用C++中的类——调用类方法并访问类变量
- 找到多个与名为“HOME”的控制器匹配的类型。如果为此请求(“{CONTROLLER}/{ACTION}/{ID}”)提供服务的路由在搜索匹配此请求的控制器时没有指定命名空间,则会发生此情况。如果是这样,请通过调用含有“NAMESPACES”参数的“MAPROUTE”方法的重载来注册此路由。
- C++中使用Lua脚本 和lua中调用c的方法
- Code Fragmen-重载的方法,参数少的去调用参数多的。
- C++中使用Lua脚本 和lua中调用c的方法
- c++调用lua方法
- C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究