@@ -251,15 +251,17 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
251251 register unsigned int mask = mp -> ma_size - 1 ;
252252 dictentry * ep0 = mp -> ma_table ;
253253 register dictentry * ep ;
254- register int restore_error = 0 ;
255- register int checked_error = 0 ;
254+ register int restore_error ;
255+ register int checked_error ;
256256 register int cmp ;
257257 PyObject * err_type , * err_value , * err_tb ;
258258
259259 i = hash & mask ;
260260 ep = & ep0 [i ];
261261 if (ep -> me_key == NULL || ep -> me_key == key )
262262 return ep ;
263+
264+ restore_error = checked_error = 0 ;
263265 if (ep -> me_key == dummy )
264266 freeslot = ep ;
265267 else {
@@ -271,13 +273,9 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
271273 PyErr_Fetch (& err_type , & err_value , & err_tb );
272274 }
273275 cmp = PyObject_RichCompareBool (ep -> me_key , key , Py_EQ );
274- if (cmp > 0 ) {
275- if (restore_error )
276- PyErr_Restore (err_type , err_value ,
277- err_tb );
278- return ep ;
279- }
280- else if (cmp < 0 )
276+ if (cmp > 0 )
277+ goto Done ;
278+ if (cmp < 0 )
281279 PyErr_Clear ();
282280 }
283281 freeslot = NULL ;
@@ -289,16 +287,13 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
289287 i = (i << 2 ) + i + perturb + 1 ;
290288 ep = & ep0 [i & mask ];
291289 if (ep -> me_key == NULL ) {
292- if (restore_error )
293- PyErr_Restore ( err_type , err_value , err_tb ) ;
294- return freeslot == NULL ? ep : freeslot ;
290+ if (freeslot != NULL )
291+ ep = freeslot ;
292+ break ;
295293 }
296- if (ep -> me_key == key ) {
297- if (restore_error )
298- PyErr_Restore (err_type , err_value , err_tb );
299- return ep ;
300- }
301- else if (ep -> me_hash == hash && ep -> me_key != dummy ) {
294+ if (ep -> me_key == key )
295+ break ;
296+ if (ep -> me_hash == hash && ep -> me_key != dummy ) {
302297 if (!checked_error ) {
303298 checked_error = 1 ;
304299 if (PyErr_Occurred ()) {
@@ -308,18 +303,19 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
308303 }
309304 }
310305 cmp = PyObject_RichCompareBool (ep -> me_key , key , Py_EQ );
311- if (cmp > 0 ) {
312- if (restore_error )
313- PyErr_Restore (err_type , err_value ,
314- err_tb );
315- return ep ;
316- }
317- else if (cmp < 0 )
306+ if (cmp > 0 )
307+ break ;
308+ if (cmp < 0 )
318309 PyErr_Clear ();
319310 }
320311 else if (ep -> me_key == dummy && freeslot == NULL )
321312 freeslot = ep ;
322313 }
314+
315+ Done :
316+ if (restore_error )
317+ PyErr_Restore (err_type , err_value , err_tb );
318+ return ep ;
323319}
324320
325321/*
0 commit comments