Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7b5d0af

Browse files
committed
lookdict: Reduce obfuscating code duplication with a judicious goto.
This code is likely to get even hairier to squash core dumps due to mutating comparisons, and it's hard enough to follow without that.
1 parent 00d0cb6 commit 7b5d0af

1 file changed

Lines changed: 21 additions & 25 deletions

File tree

Objects/dictobject.c

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)