[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;
  }