From aac40e9b497b9de95c61c058a87a219592c272ad Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 19 Dec 2011 19:25:00 +0100 Subject: [PATCH] lua: expose completely new lists in changes() as well Since the first delta of a new list is of type UCI_CMD_CHANGE and not UCI_CMD_LIST_ADD, the current code does not start a new table and subsequent items are silently disacarded. Expose all items of new list by coercing the existing string element into a table when encountering subsequent items. --- lua/uci.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lua/uci.c b/lua/uci.c index cc6f370..564948b 100644 --- a/lua/uci.c +++ b/lua/uci.c @@ -724,11 +724,22 @@ uci_lua_add_change(lua_State *L, struct uci_element *e) lua_setfield(L, -3, name); } - /* a table is on the top of the stack so this is a subsequent, - * list_add, append this value to table */ - } else if (lua_istable(L, -1)) { - lua_pushstring(L, value); - lua_rawseti(L, -2, lua_objlen(L, -2) + 1); + /* there is a value already, append */ + } else { + /* a string is on top of the stack, coerce into table */ + if (lua_isstring(L, -1)) { + lua_newtable(L); + lua_pushvalue(L, -2); + lua_rawseti(L, -2, 1); + lua_setfield(L, -3, name); + } + + /* a table is on the top of the stack so this is a subsequent, + * list_add, append this value to table */ + if (lua_istable(L, -1)) { + lua_pushstring(L, value); + lua_rawseti(L, -2, lua_objlen(L, -2) + 1); + } } lua_pop(L, 1); -- 2.11.0