有没有一个不清空整个栈的lua-c api函数?

我的问题是 lua_pcall 会清空栈,因为我想在下一次调用前重用栈并且只改变一个。

是否有一种方法可以复制整个栈并将其再次粘贴,或者甚至可以在不清空栈的情况下调用lua函数?

Lua:

function test(a)
    print(a)
end

event.add("test", test)
event.add("test", test)

event.call("test", 42)

C++:

int Func_Event_call(Lua_State* L){

    //Stack: String:Eventname, Arguments...

    std::string name = luaL_checkstring(L, 1);

    ... Get array functions from name

    for(...){

        //load function into stack
        lua_rawgeti(L, LUA_REGISTRYINDEX, functions[c]);
        lua_replace(L, 1);

        //Wanted Stack: Lua_Function, Arguments... <- works for the first function

        //call function
        lua_pcall(L, nummberArgs, 0, 0);

        //stack is now empty because of lua_pcall <- problem
    }

    return 0;
}
点赞
用户11400562
用户11400562

代码说明:

该代码使用一个表格以数字键的形式存储完整堆栈信息,并将该表格存储在注册表中。在需要时,可以从存储在注册表中的表格中恢复堆栈信息。

//store stack in Registry
lua_createtable(L, nummberArgs, nummberArgs);
lua_insert(L, 1);

//fill table
for (int c = 0; c < nummberArgs; c++) {

    lua_pushinteger(L, c);
    lua_insert(L, -2);
    lua_settable(L, 1);

}

//store it in Registry and clean up
int reg_key = luaL_ref(L, LUA_REGISTRYINDEX);
lua_remove(L, 1);

...

//restore stack from above
lua_rawgeti(L, LUA_REGISTRYINDEX, reg_key);

//iterate over the table to get all elements, the key is getting removed by lua_next
lua_pushnil(L);
while (lua_next(L, 1) != 0) {
    /* uses 'key' (at index -2) and 'value' (at index -1) */
    /* move 'value'; keeps 'key' for next iteration */
    lua_insert(L, -2);
}

//remove table from stack
lua_remove(L, 1);

我通过使用注册表中的表格,并使用数字键将完整的堆栈信息存储在其中来解决问题。在调用第二部分之后,我可以多次回到堆栈,即使之前已经调用了第一部分。

2019-04-26 08:33:19