chiark / gitweb /
key.c: Complain about duplicate subkeys passed to `KeyDataStructured'.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 25 Nov 2019 11:54:12 +0000 (11:54 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 11 Apr 2020 11:49:31 +0000 (12:49 +0100)
This wasn't previously possible (without complicated subterfuge), but
now a keyword argument can duplicate a mapping set in the positional
argument.

key.c
t/t-key.py

diff --git a/key.c b/key.c
index d97d63291ca3da3bd9fd9e2dd18f09a8581baaa5..017c973e03a98a5146b8109dc3e5f2e03992c202 100644 (file)
--- a/key.c
+++ b/key.c
@@ -1029,6 +1029,7 @@ static int populate_struct(key_data *kd, PyObject *map)
       goto end;
     if (!KEYDATA_PYCHECK(val))
       TYERR("subkey objects must be instances of KeyData");
+    if (key_structfind(kd, p)) VALERR("duplicate tag");
     key_structset(kd, p, KEYDATA_KD(val));
     Py_DECREF(name); name = 0;
     Py_DECREF(val); val = 0;
index 9e3646f58a6cdb77effe703ba99b273070534e13..000dc11f08281893dbe5117188ab7c25205cf488 100644 (file)
@@ -295,6 +295,9 @@ class TestKeyData (U.TestCase):
     me.assertEqual(len(kd), 4)
     me.check_encode(kd)
     me.assertRaises(TypeError, C.KeyDataStructured, { "a": "a" })
+    me.assertRaises(ValueError, C.KeyDataStructured,
+                    { "a": C.KeyDataString("a") },
+                    a = C.KeyDataString("b"))
 
 ###--------------------------------------------------------------------------
 ### Mappings.