summaryrefslogtreecommitdiffstats
path: root/Python/sysmodule.c
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-03-04 21:12:27 (GMT)
committerGitHub <noreply@github.com>2024-03-04 21:12:27 (GMT)
commit8ee7e91c387ada1bd899306fa7d93b2c26871fe1 (patch)
tree7ff9b4777dfaee843824c9a0b64881468d2ff6ad /Python/sysmodule.c
parente5595288c9e0261b459d1cb0a1085c2c99e1115c (diff)
downloadcpython-8ee7e91c387ada1bd899306fa7d93b2c26871fe1.zip
cpython-8ee7e91c387ada1bd899306fa7d93b2c26871fe1.tar.gz
cpython-8ee7e91c387ada1bd899306fa7d93b2c26871fe1.tar.bz2
[3.11] gh-115320: Refactor `get_hash_info` in `sysmodule.c` not to swallow errors (GH-115321) (#116324)
gh-115320: Refactor `get_hash_info` in `sysmodule.c` not to swallow errors (GH-115321) (cherry picked from commit 207030f5527d405940b79c10c1413c1e8ff696c1) Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r--Python/sysmodule.c48
1 files changed, 25 insertions, 23 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 89f454c..08d8d5e 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1363,31 +1363,33 @@ get_hash_info(PyThreadState *tstate)
int field = 0;
PyHash_FuncDef *hashfunc;
hash_info = PyStructSequence_New(&Hash_InfoType);
- if (hash_info == NULL)
- return NULL;
- hashfunc = PyHash_GetFuncDef();
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(8*sizeof(Py_hash_t)));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromSsize_t(_PyHASH_MODULUS));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(_PyHASH_INF));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(0)); // This is no longer used
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(_PyHASH_IMAG));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyUnicode_FromString(hashfunc->name));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(hashfunc->hash_bits));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(hashfunc->seed_bits));
- PyStructSequence_SET_ITEM(hash_info, field++,
- PyLong_FromLong(Py_HASH_CUTOFF));
- if (_PyErr_Occurred(tstate)) {
- Py_CLEAR(hash_info);
+ if (hash_info == NULL) {
return NULL;
}
+ hashfunc = PyHash_GetFuncDef();
+
+#define SET_HASH_INFO_ITEM(CALL) \
+ do { \
+ PyObject *item = (CALL); \
+ if (item == NULL) { \
+ Py_CLEAR(hash_info); \
+ return NULL; \
+ } \
+ PyStructSequence_SET_ITEM(hash_info, field++, item); \
+ } while(0)
+
+ SET_HASH_INFO_ITEM(PyLong_FromLong(8 * sizeof(Py_hash_t)));
+ SET_HASH_INFO_ITEM(PyLong_FromSsize_t(_PyHASH_MODULUS));
+ SET_HASH_INFO_ITEM(PyLong_FromLong(_PyHASH_INF));
+ SET_HASH_INFO_ITEM(PyLong_FromLong(0)); // This is no longer used
+ SET_HASH_INFO_ITEM(PyLong_FromLong(_PyHASH_IMAG));
+ SET_HASH_INFO_ITEM(PyUnicode_FromString(hashfunc->name));
+ SET_HASH_INFO_ITEM(PyLong_FromLong(hashfunc->hash_bits));
+ SET_HASH_INFO_ITEM(PyLong_FromLong(hashfunc->seed_bits));
+ SET_HASH_INFO_ITEM(PyLong_FromLong(Py_HASH_CUTOFF));
+
+#undef SET_HASH_INFO_ITEM
+
return hash_info;
}
/*[clinic input]