mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-115320: Refactor get_hash_info in sysmodule.c not to swallow errors (#115321)
				
					
				
			This commit is contained in:
		
							parent
							
								
									01440d3a39
								
							
						
					
					
						commit
						207030f552
					
				
					 1 changed files with 25 additions and 23 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nikita Sobolev
						Nikita Sobolev