From b3030390cb9b65380f8a178b825e052861793888 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sun, 22 Jun 2025 16:29:05 +0200 Subject: [PATCH] Slightly rewrite internal C API to reflect the modern dict API --- multidict/_multidict.c | 5 ++++- multidict/_multilib/hashtable.h | 22 +++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/multidict/_multidict.c b/multidict/_multidict.c index 7171cccc4..cd9589311 100644 --- a/multidict/_multidict.c +++ b/multidict/_multidict.c @@ -621,6 +621,7 @@ multidict_setdefault(MultiDictObject *self, PyObject *const *args, PyObject *key = NULL; PyObject *_default = NULL; bool decref_default = false; + PyObject *ret = NULL; if (parse2("setdefault", args, @@ -641,7 +642,9 @@ multidict_setdefault(MultiDictObject *self, PyObject *const *args, decref_default = true; } ASSERT_CONSISTENT(self, false); - PyObject *ret = md_set_default(self, key, _default); + if (md_set_default(self, key, _default, &ret) < 0) { + return NULL; + } if (decref_default) { Py_CLEAR(_default); } diff --git a/multidict/_multilib/hashtable.h b/multidict/_multilib/hashtable.h index 40daf9142..c39985a4b 100644 --- a/multidict/_multilib/hashtable.h +++ b/multidict/_multilib/hashtable.h @@ -814,7 +814,7 @@ md_get_one(MultiDictObject *md, PyObject *key, PyObject **ret) if (tmp > 0) { Py_DECREF(identity); *ret = Py_NewRef(entry->value); - return 0; + return 1; } else if (tmp < 0) { goto fail; } @@ -868,7 +868,7 @@ md_get_all(MultiDictObject *md, PyObject *key, PyObject **ret) md_finder_cleanup(&finder); Py_DECREF(identity); - return 0; + return ret != NULL; fail: md_finder_cleanup(&finder); Py_XDECREF(identity); @@ -877,9 +877,11 @@ md_get_all(MultiDictObject *md, PyObject *key, PyObject **ret) return -1; } -static inline PyObject * -md_set_default(MultiDictObject *md, PyObject *key, PyObject *value) +static inline int +md_set_default(MultiDictObject *md, PyObject *key, PyObject *value, + PyObject **result) { + *result = NULL; PyObject *identity = md_calc_identity(md, key); if (identity == NULL) { goto fail; @@ -907,7 +909,8 @@ md_set_default(MultiDictObject *md, PyObject *key, PyObject *value) if (tmp > 0) { Py_DECREF(identity); ASSERT_CONSISTENT(md, false); - return Py_NewRef(entry->value); + *result = Py_NewRef(entry->value); + return 1; } else if (tmp < 0) { goto fail; } @@ -919,10 +922,11 @@ md_set_default(MultiDictObject *md, PyObject *key, PyObject *value) Py_DECREF(identity); ASSERT_CONSISTENT(md, false); - return Py_NewRef(value); + *result = Py_NewRef(value); + return 0; fail: Py_XDECREF(identity); - return NULL; + return -1; } static inline int @@ -963,7 +967,7 @@ md_pop_one(MultiDictObject *md, PyObject *key, PyObject **ret) *ret = value; md->version = NEXT_VERSION(md->state); ASSERT_CONSISTENT(md, false); - return 0; + return 1; } else if (tmp < 0) { goto fail; } @@ -1035,7 +1039,7 @@ md_pop_all(MultiDictObject *md, PyObject *key, PyObject **ret) *ret = lst; Py_DECREF(identity); ASSERT_CONSISTENT(md, false); - return 0; + return lst != NULL; fail: Py_XDECREF(identity); Py_XDECREF(lst);