summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Schubert <ben.c.schubert@gmail.com>2019-06-12 18:33:36 +0100
committerBenjamin Schubert <contact@benschubert.me>2019-06-12 17:57:50 +0000
commita26de50940f702eec13663c862e50d9eb73703c4 (patch)
tree0317b637e9a40da73e53ad67443281e061b70ec3
parent147190b6dc5094cdc550e1250c5bda027796b0d9 (diff)
downloadbuildstream-bschubert/create-node-on-set-for-mapping.tar.gz
_yaml: Create Node when setting a dictionarybschubert/create-node-on-set-for-mapping
This ensures a better consistency when we are working with Nodes, by ensuring we always have nodes for both lists and dicts.
-rw-r--r--src/buildstream/_yaml.pyx11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/buildstream/_yaml.pyx b/src/buildstream/_yaml.pyx
index 678374272..68724a54b 100644
--- a/src/buildstream/_yaml.pyx
+++ b/src/buildstream/_yaml.pyx
@@ -623,18 +623,21 @@ cdef list __trim_list_provenance(list value):
#
cpdef void node_set(Node node, object key, object value, list indices=None) except *:
cdef int idx
-
- if type(value) is list:
- value = __new_node_from_list(value)
+ cdef value_type = type(value)
if indices:
node = <Node> (<dict> node.value)[key]
key = indices.pop()
for idx in indices:
node = <Node> (<list> node.value)[idx]
- if type(value) is Node:
+ if value_type is Node:
node.value[key] = value
else:
+ if value_type is list:
+ value = __new_node_from_list(value).value
+ elif value_type is dict:
+ value = new_node_from_dict(value).value
+
try:
# Need to do this just in case we're modifying a list
old_value = <Node> node.value[key]