/*
* Flatten non-empty QDict and QList recursively into @target,
- * copy other objects to @target
+ * copy other objects to @target.
+ * On the root level (if @qdict == @target), remove flattened
+ * nested QDicts and QLists from @qdict.
+ *
+ * (Note that we do not need to remove entries from nested
+ * dicts or lists. Their reference count is decremented on
+ * the root level, so there are no leaks. In fact, if they
+ * have a reference count greater than one, we are probably
+ * well advised not to modify them altogether.)
*/
if (dict_val && qdict_size(dict_val)) {
qdict_flatten_qdict(dict_val, target,
new_key ? new_key : entry->key);
- qdict_del(qdict, entry->key);
+ if (target == qdict) {
+ qdict_del(qdict, entry->key);
+ }
} else if (list_val && !qlist_empty(list_val)) {
qdict_flatten_qlist(list_val, target,
new_key ? new_key : entry->key);
- qdict_del(qdict, entry->key);
+ if (target == qdict) {
+ qdict_del(qdict, entry->key);
+ }
} else if (target != qdict) {
qdict_put_obj(target, new_key, qobject_ref(value));
- qdict_del(qdict, entry->key);
}
g_free(new_key);