From 419fe6cf42196d7490dff211faeeeceeb649d633 Mon Sep 17 00:00:00 2001 From: Jens Jorgensen Date: Mon, 12 May 2025 11:28:18 -0500 Subject: [PATCH] add logic to convert dict list key to tuple --- msgpack/unpack.h | 19 +++++++++++++++++++ test/test_case.py | 3 +++ 2 files changed, 22 insertions(+) diff --git a/msgpack/unpack.h b/msgpack/unpack.h index 58a2f4f..4bd5fc4 100644 --- a/msgpack/unpack.h +++ b/msgpack/unpack.h @@ -199,6 +199,25 @@ static inline int unpack_callback_map_item(unpack_user* u, unsigned int current, if (PyUnicode_CheckExact(k)) { PyUnicode_InternInPlace(&k); } + if (PyList_CheckExact(k)) { + Py_ssize_t list_size = PyList_Size(k); + PyObject* tuple = PyTuple_New(list_size); + + if (tuple == NULL) { + return -1; + } + + for (Py_ssize_t i = 0; i < list_size; i++) { + PyObject* item = PyList_GetItem(k, i); + Py_INCREF(item); + if (PyTuple_SetItem(tuple, i, item) != 0) { + Py_DECREF(tuple); + return -1; + } + } + Py_DECREF(k); + k = tuple; + } if (u->has_pairs_hook) { msgpack_unpack_object item = PyTuple_Pack(2, k, v); if (!item) diff --git a/test/test_case.py b/test/test_case.py index c4c615e..39028d7 100644 --- a/test/test_case.py +++ b/test/test_case.py @@ -134,3 +134,6 @@ def test_match(): def test_unicode(): assert unpackb(packb("foobar"), use_list=1) == "foobar" + +def test_dict_tuple_key(): + unpackb(packb({(1, 2): 3}), strict_map_key=False)