Skip to content

Commit 70fa9c5

Browse files
authored
Slightly rewrite internal C API to reflect the modern dict API (#1187)
1. `md_get_one()`, `md_get_all()`, `md_pop_one()`, `md_pop_all()` now return `1` if key exists in multidict, `0` otherwise. 2. `md_set_default()` now also returns `1` if key exists in multidict, `0` if key doesn't exist and the default was iserted into the object. 3. All functions return `-1` in case of error. The PR doesn't affect any public API; it is a preparation step for introducing multidict's public C API.
1 parent 184dc41 commit 70fa9c5

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

multidict/_multidict.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ multidict_setdefault(MultiDictObject *self, PyObject *const *args,
621621
PyObject *key = NULL;
622622
PyObject *_default = NULL;
623623
bool decref_default = false;
624+
PyObject *ret = NULL;
624625

625626
if (parse2("setdefault",
626627
args,
@@ -641,7 +642,9 @@ multidict_setdefault(MultiDictObject *self, PyObject *const *args,
641642
decref_default = true;
642643
}
643644
ASSERT_CONSISTENT(self, false);
644-
PyObject *ret = md_set_default(self, key, _default);
645+
if (md_set_default(self, key, _default, &ret) < 0) {
646+
return NULL;
647+
}
645648
if (decref_default) {
646649
Py_CLEAR(_default);
647650
}

multidict/_multilib/hashtable.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ md_get_one(MultiDictObject *md, PyObject *key, PyObject **ret)
814814
if (tmp > 0) {
815815
Py_DECREF(identity);
816816
*ret = Py_NewRef(entry->value);
817-
return 0;
817+
return 1;
818818
} else if (tmp < 0) {
819819
goto fail;
820820
}
@@ -868,7 +868,7 @@ md_get_all(MultiDictObject *md, PyObject *key, PyObject **ret)
868868

869869
md_finder_cleanup(&finder);
870870
Py_DECREF(identity);
871-
return 0;
871+
return ret != NULL;
872872
fail:
873873
md_finder_cleanup(&finder);
874874
Py_XDECREF(identity);
@@ -877,9 +877,11 @@ md_get_all(MultiDictObject *md, PyObject *key, PyObject **ret)
877877
return -1;
878878
}
879879

880-
static inline PyObject *
881-
md_set_default(MultiDictObject *md, PyObject *key, PyObject *value)
880+
static inline int
881+
md_set_default(MultiDictObject *md, PyObject *key, PyObject *value,
882+
PyObject **result)
882883
{
884+
*result = NULL;
883885
PyObject *identity = md_calc_identity(md, key);
884886
if (identity == NULL) {
885887
goto fail;
@@ -907,7 +909,8 @@ md_set_default(MultiDictObject *md, PyObject *key, PyObject *value)
907909
if (tmp > 0) {
908910
Py_DECREF(identity);
909911
ASSERT_CONSISTENT(md, false);
910-
return Py_NewRef(entry->value);
912+
*result = Py_NewRef(entry->value);
913+
return 1;
911914
} else if (tmp < 0) {
912915
goto fail;
913916
}
@@ -919,10 +922,11 @@ md_set_default(MultiDictObject *md, PyObject *key, PyObject *value)
919922

920923
Py_DECREF(identity);
921924
ASSERT_CONSISTENT(md, false);
922-
return Py_NewRef(value);
925+
*result = Py_NewRef(value);
926+
return 0;
923927
fail:
924928
Py_XDECREF(identity);
925-
return NULL;
929+
return -1;
926930
}
927931

928932
static inline int
@@ -963,7 +967,7 @@ md_pop_one(MultiDictObject *md, PyObject *key, PyObject **ret)
963967
*ret = value;
964968
md->version = NEXT_VERSION(md->state);
965969
ASSERT_CONSISTENT(md, false);
966-
return 0;
970+
return 1;
967971
} else if (tmp < 0) {
968972
goto fail;
969973
}
@@ -1035,7 +1039,7 @@ md_pop_all(MultiDictObject *md, PyObject *key, PyObject **ret)
10351039
*ret = lst;
10361040
Py_DECREF(identity);
10371041
ASSERT_CONSISTENT(md, false);
1038-
return 0;
1042+
return lst != NULL;
10391043
fail:
10401044
Py_XDECREF(identity);
10411045
Py_XDECREF(lst);

0 commit comments

Comments
 (0)