clualua-api

Cloning a Lua table in Lua C API


There are heaps of examples of how to clone a Lua table in Lua, however I wasn't able to find any example of how to do it with the native Lua C API. I tried to do it by hand twice, but ended up with a real (although working) mess.

Does anyone have any tips or links on how to elegantly do a shallow copy of a Lua table in the C API?


Solution

  • What you need to do is define the Lua function, and then break it down into the associated API calls.

    shallow_copy = function(tab)
        local retval = {}
        for k, v in pairs(tab) do
            retval[k] = v
        end
        return retval
    end
    

    So we're going to need to take the index of a table on the stack and the lua_State.

    void shallow_copy(lua_State* L, int index) {
    
    /*Create a new table on the stack.*/
    
            lua_newtable(L);
    
    /*Now we need to iterate through the table. 
    Going to steal the Lua API's example of this.*/
    
            lua_pushnil(L);
            while(lua_next(L, index) != 0) {
    /*Need to duplicate the key, as we need to set it
    (one pop) and keep it for lua_next (the next pop). Stack looks like table, k, v.*/
    
    
                lua_pushvalue(L, -2);
    /*Now the stack looks like table, k, v, k. 
    But now the key is on top. Settable expects the value to be on top. So we 
    need to do a swaparooney.*/
    
                lua_insert(L, -2);
    
        /*Now we just set them. Stack looks like table,k,k,v, so the table is at -4*/
    
    
    
        lua_settable(L, -4);
    
    /*Now the key and value were set in the table, and we popped off, so we have
    table, k on the stack- which is just what lua_next wants, as it wants to find
    the next key on top. So we're good.*/
    
            }
        }
    

    Now our copied table sits on the top of the stack.

    Christ, the Lua API sucks.