diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2024-03-04 21:12:27 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-04 21:12:27 (GMT) |
| commit | 8ee7e91c387ada1bd899306fa7d93b2c26871fe1 (patch) | |
| tree | 7ff9b4777dfaee843824c9a0b64881468d2ff6ad /Python/sysmodule.c | |
| parent | e5595288c9e0261b459d1cb0a1085c2c99e1115c (diff) | |
| download | cpython-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.c | 48 |
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] |
