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

Guido van Rossum gvanrossum@users.sourceforge.net
2001年8月10日 13:28:30 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv27392/Objects
Modified Files:
	dictobject.c 
Log Message:
Add PyDict_Merge(a, b, override):
PyDict_Merge(a, b, 1) is the same as PyDict_Update(a, b).
PyDict_Merge(a, b, 0) does something similar but leaves existing items
unchanged.
Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.107
retrieving revision 2.108
diff -C2 -d -r2.107 -r2.108
*** dictobject.c	2001年08月02日 04:15:00	2.107
--- dictobject.c	2001年08月10日 20:28:28	2.108
***************
*** 1000,1006 ****
--- 1000,1016 ----
 }
 
+ /* Update unconditionally replaces existing items.
+ Merge has a 3rd argument 'override'; if set, it acts like Update,
+ otherwise it leaves existing items unchanged. */
+ 
 int
 PyDict_Update(PyObject *a, PyObject *b)
 {
+ 	return PyDict_Merge(a, b, 1);
+ }
+ 
+ int
+ PyDict_Merge(PyObject *a, PyObject *b, int override)
+ {
 	register PyDictObject *mp, *other;
 	register int i;
***************
*** 1032,1036 ****
 		for (i = 0; i <= other->ma_mask; i++) {
 			entry = &other->ma_table[i];
! 			if (entry->me_value != NULL) {
 				Py_INCREF(entry->me_key);
 				Py_INCREF(entry->me_value);
--- 1042,1048 ----
 		for (i = 0; i <= other->ma_mask; i++) {
 			entry = &other->ma_table[i];
! 			if (entry->me_value != NULL &&
! 			 (override ||
! 			 PyDict_GetItem(a, entry->me_key) == NULL)) {
 				Py_INCREF(entry->me_key);
 				Py_INCREF(entry->me_value);
***************
*** 1061,1064 ****
--- 1073,1080 ----
 
 		for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
+ 			if (!override && PyDict_GetItem(a, key) != NULL) {
+ 				Py_DECREF(key);
+ 				continue;
+ 			}
 			value = PyObject_GetItem(b, key);
 			if (value == NULL) {
***************
*** 1067,1071 ****
 				return -1;
 			}
! 			status = PyDict_SetItem((PyObject*)mp, key, value);
 			Py_DECREF(key);
 			Py_DECREF(value);
--- 1083,1087 ----
 				return -1;
 			}
! 			status = PyDict_SetItem(a, key, value);
 			Py_DECREF(key);
 			Py_DECREF(value);

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