]> granicus.if.org Git - python/commitdiff
lookdict: Reduce obfuscating code duplication with a judicious goto.
authorTim Peters <tim.peters@gmail.com>
Sun, 3 Jun 2001 04:14:43 +0000 (04:14 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 3 Jun 2001 04:14:43 +0000 (04:14 +0000)
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.

Objects/dictobject.c

index 0797e4b4c44626eaf1314876fe09ec0e6a722a21..69fe67e867813cf6cc12acb00596e20ece496182 100644 (file)
@@ -251,8 +251,8 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
        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 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
        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 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
                                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 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
                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 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
                                }
                        }
                        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;
 }
 
 /*