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.
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 0797e4b..69fe67e 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -251,8 +251,8 @@
 	register unsigned int mask = mp->ma_size-1;
 	dictentry *ep0 = mp->ma_table;
 	register dictentry *ep;
-	register int restore_error = 0;
-	register int checked_error = 0;
+	register int restore_error;
+	register int checked_error;
 	register int cmp;
 	PyObject *err_type, *err_value, *err_tb;
 
@@ -260,6 +260,8 @@
 	ep = &ep0[i];
 	if (ep->me_key == NULL || ep->me_key == key)
 		return ep;
+
+	restore_error = checked_error = 0;
 	if (ep->me_key == dummy)
 		freeslot = ep;
 	else {
@@ -271,13 +273,9 @@
 				PyErr_Fetch(&err_type, &err_value, &err_tb);
 			}
 			cmp = PyObject_RichCompareBool(ep->me_key, key, Py_EQ);
-			if (cmp > 0) {
-				if (restore_error)
-					PyErr_Restore(err_type, err_value,
-						      err_tb);
-				return ep;
-			}
-			else if (cmp < 0)
+			if (cmp > 0)
+				goto Done;
+			if (cmp < 0)
 				PyErr_Clear();
 		}
 		freeslot = NULL;
@@ -289,16 +287,13 @@
 		i = (i << 2) + i + perturb + 1;
 		ep = &ep0[i & mask];
 		if (ep->me_key == NULL) {
-			if (restore_error)
-				PyErr_Restore(err_type, err_value, err_tb);
-			return freeslot == NULL ? ep : freeslot;
+			if (freeslot != NULL)
+				ep = freeslot;
+			break;
 		}
-		if (ep->me_key == key) {
-			if (restore_error)
-				PyErr_Restore(err_type, err_value, err_tb);
-			return ep;
-		}
-		else if (ep->me_hash == hash && ep->me_key != dummy) {
+		if (ep->me_key == key)
+			break;
+		if (ep->me_hash == hash && ep->me_key != dummy) {
 			if (!checked_error) {
 				checked_error = 1;
 				if (PyErr_Occurred()) {
@@ -308,18 +303,19 @@
 				}
 			}
 			cmp = PyObject_RichCompareBool(ep->me_key, key, Py_EQ);
-			if (cmp > 0) {
-				if (restore_error)
-					PyErr_Restore(err_type, err_value,
-						      err_tb);
-				return ep;
-			}
-			else if (cmp < 0)
+			if (cmp > 0)
+				break;
+			if (cmp < 0)
 				PyErr_Clear();
 		}
 		else if (ep->me_key == dummy && freeslot == NULL)
 			freeslot = ep;
 	}
+
+Done:
+	if (restore_error)
+		PyErr_Restore(err_type, err_value, err_tb);
+	return ep;
 }
 
 /*