mirror of https://github.com/python/cpython.git
gh-115320: Refactor `get_hash_info` in `sysmodule.c` not to swallow errors (#115321)
This commit is contained in:
parent
01440d3a39
commit
207030f552
|
@ -1498,31 +1498,33 @@ get_hash_info(PyThreadState *tstate)
|
||||||
int field = 0;
|
int field = 0;
|
||||||
PyHash_FuncDef *hashfunc;
|
PyHash_FuncDef *hashfunc;
|
||||||
hash_info = PyStructSequence_New(&Hash_InfoType);
|
hash_info = PyStructSequence_New(&Hash_InfoType);
|
||||||
if (hash_info == NULL)
|
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);
|
|
||||||
return 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;
|
return hash_info;
|
||||||
}
|
}
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
|
|
Loading…
Reference in New Issue