[Python-checkins] CVS: python/dist/src/Objects dictobject.c,2.100,2.101
Tim Peters
tim_one@users.sourceforge.net
Sat, 02 Jun 2001 21:14:45 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv3399/python/dist/src/Objects
Modified Files:
dictobject.c
Log Message:
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.
Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.100
retrieving revision 2.101
diff -C2 -r2.100 -r2.101
*** dictobject.c 2001/06/02 08:27:39 2.100
--- dictobject.c 2001/06/03 04:14:43 2.101
***************
*** 252,257 ****
dictentry *ep0 = mp->ma_table;
register dictentry *ep;
! register int restore_error = 0;
! register int checked_error = 0;
register int cmp;
PyObject *err_type, *err_value, *err_tb;
--- 252,257 ----
dictentry *ep0 = mp->ma_table;
register dictentry *ep;
! register int restore_error;
! register int checked_error;
register int cmp;
PyObject *err_type, *err_value, *err_tb;
***************
*** 261,264 ****
--- 261,266 ----
if (ep->me_key == NULL || ep->me_key == key)
return ep;
+
+ restore_error = checked_error = 0;
if (ep->me_key == dummy)
freeslot = ep;
***************
*** 272,282 ****
}
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)
PyErr_Clear();
}
--- 274,280 ----
}
cmp = PyObject_RichCompareBool(ep->me_key, key, Py_EQ);
! if (cmp > 0)
! goto Done;
! if (cmp < 0)
PyErr_Clear();
}
***************
*** 290,303 ****
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 (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 (!checked_error) {
checked_error = 1;
--- 288,298 ----
ep = &ep0[i & mask];
if (ep->me_key == NULL) {
! if (freeslot != NULL)
! ep = freeslot;
! break;
}
! if (ep->me_key == key)
! break;
! if (ep->me_hash == hash && ep->me_key != dummy) {
if (!checked_error) {
checked_error = 1;
***************
*** 309,319 ****
}
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)
PyErr_Clear();
}
--- 304,310 ----
}
cmp = PyObject_RichCompareBool(ep->me_key, key, Py_EQ);
! if (cmp > 0)
! break;
! if (cmp < 0)
PyErr_Clear();
}
***************
*** 321,324 ****
--- 312,320 ----
freeslot = ep;
}
+
+ Done:
+ if (restore_error)
+ PyErr_Restore(err_type, err_value, err_tb);
+ return ep;
}