所以功能如下:
send_success(lua_State *L){
MailService *mls = static_cast<MailService *>(lua_touserdata(L, lua_upvalueindex(1)));
Device *dev = static_cast<Device *>(lua_touserdata(L, lua_upvalueindex(2)));
int numArgs = lua_gettop(L);
TRACE << "Number of arguments passed is = " << numArgs;
/* here I do some operation to get the arguments.
I am expecting total of 5 arguments on the stack.
3 arguments are passed from function call in lua
and 2 arguments are pushed as closure
*/
string one_param = lua_tostring(L, 3, NULL)
string two_param = lua_tostring(L, 4, NULL)
string other_param = lua_tostring(L, 5, NULL)
}
现在在lua堆栈上推送此函数,我已经完成了以下
lua_pushstring(theLua, "sendSuccess");
lua_pushlightuserdata(theLua, (void*) mls);
lua_pushlightuserdata(theLua, (void*) this);
lua_pushcclosure(theLua, lua_send_success,2);
lua_rawset(theLua, lua_device); // this gets me device obj in lua
从lua调用它,我会做
obj:sendSuccess("one param","second param","third param")
但是当我检查参数的数量时。它应该给出5个参数。相反,只传递4个参数。 我做了一些测试,我传递一个光使用数据的两个对象是否正确传递。它们正确传递。
这里唯一缺少的是,缺少一个从lua端传递的参数。
此外,我尝试只推动一个对象,它正常工作。所以我不确定我是否搞砸了某个地方的参数编号
请说出你的意见
答案 0 :(得分:0)
您作为闭包的一部分创建的用户数据对象不作为参数传递给函数,它们放置在该状态的另一个位置。
这意味着用于获取lua_tostring
参数的偏移量是错误的。
答案 1 :(得分:0)
行。事情是这样的
lua_pushclosure
将用户数据保存在lua_stack
的单独空格中。在该堆栈内,偏移量1和2表示第一个和第二个对象
lua_pushlightuserdata(theLua, (void*) mls);
lua_pushlightuserdata(theLua, (void*) this);
lua_pushcclosure(theLua, lua_send_success,2);
但在那之后,我将进入第三个第三,假设我已经访问过第二个位置。但这是错误的。正确的做法是考虑pushclousure
只占用堆栈上的一个空格而不管lightuserdata
被推动多少次,并且可以通过从第二个偏移开始访问剩余的参数...所以下面代码适合我:
string one_param = lua_tostring(L, 2, NULL)
string two_param = lua_tostring(L, 3, NULL)
string other_param = lua_tostring(L, 4, NULL)