Browse Source

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.

Jo-Philipp Wich 12 years ago
parent
commit
aac40e9b49
1 changed files with 16 additions and 5 deletions
  1. 16 5
      lua/uci.c

+ 16 - 5
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);