[Python-checkins] CVS: python/dist/src/Objects dictobject.c,2.100,2.101

Tim Peters tim_one@users.sourceforge.net
2001年6月02日 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;
 }
 

AltStyle によって変換されたページ (->オリジナル) /