Cloning a Lua table in the Lua C API

There are heaps of examples of cloning a Lua table in Lua, however I could not find any example of how to do this using the Lua C native API. I tried to do this manually, but ended up being a real (albeit working) mess.

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

+4
source share
1 answer

What you need to do is define a Lua function and then break it down into related API calls.

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

So, we will need to take the index of the table on the stack and 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 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 is at the top of the stack.

Christ, Lua API sucks.

+8
source

Source: https://habr.com/ru/post/1333412/


All Articles