Search code examples
lualuac

Is there a lua-c api function which doesn't remove the complete stack?


My problem is that lua_pcall clears the stack, because i want to reuse the stack before the call again with just one change again.
Is there a way to either copy the complete stack and paste it in again or even a way to call a lua function without clearing the stack?

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;
}

Solution

  •     //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);
    

    I solved the problem by using a table in the registry and put the complete stack in the table with numeric keys. After calling the second part i can go back to the stack when the first part was called, but multiple times.