aboutsummaryrefslogtreecommitdiff
path: root/qobject/block-qdict.c
diff options
context:
space:
mode:
Diffstat (limited to 'qobject/block-qdict.c')
-rw-r--r--qobject/block-qdict.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/qobject/block-qdict.c b/qobject/block-qdict.c
index df833083a7..36129e7379 100644
--- a/qobject/block-qdict.c
+++ b/qobject/block-qdict.c
@@ -114,19 +114,30 @@ static void qdict_flatten_qdict(QDict *qdict, QDict *target, const char *prefix)
/*
* 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);