lua: expose completely new lists in changes() as well
authorJo-Philipp Wich <jow@openwrt.org>
Mon, 19 Dec 2011 18:25:00 +0000 (19:25 +0100)
committerJo-Philipp Wich <jow@openwrt.org>
Mon, 19 Dec 2011 18:25:00 +0000 (19:25 +0100)
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

index cc6f3704d47b2e9b3dcae196a0b117f5be2bd06e..564948bc67ebd443cb7ad3fd6900af2307f200e2 100644 (file)
--- 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);