[Python-checkins] CVS: python/dist/src/Modules _testcapimodule.c,1.2,1.3

Guido van Rossum gvanrossum@users.sourceforge.net
Fri, 13 Apr 2001 10:08:17 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv10968

Modified Files:
	_testcapimodule.c 
Log Message:
Slight adaptation of Michael Hudson's patch to test PyDict_Next()
(with modification of existing dict elements!).

This is part of SF patch #409864: lazy fix for Pings bizarre scoping
crash.

The adaptation I made to Michael's patch was to change the error
handling to avoid masking other errors (moving the specific error
message to inside test_dict_inner()), and to insert a test for
dict==NULL at the start.


Index: _testcapimodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_testcapimodule.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** _testcapimodule.c	2001/02/12 22:13:26	1.2
--- _testcapimodule.c	2001/04/13 17:08:15	1.3
***************
*** 96,102 ****
--- 96,164 ----
  }
  
+ static int
+ test_dict_inner(int count)
+ {
+ 	int pos = 0, iterations = 0, i;
+ 	PyObject *dict = PyDict_New();
+ 	PyObject *v, *k;
+ 
+ 	if (dict == NULL)
+ 		return -1;
+ 
+ 	for (i = 0; i < count; i++) {
+ 		v = PyInt_FromLong(i);
+ 		PyDict_SetItem(dict, v, v);
+ 		Py_DECREF(v);
+ 	}
+ 
+ 	while (PyDict_Next(dict, &pos, &k, &v)) {
+ 		PyObject *o;
+ 		iterations++;
+ 
+ 		i = PyInt_AS_LONG(v) + 1;
+ 		o = PyInt_FromLong(i);
+ 		if (o == NULL)
+ 			return -1;
+ 		if (PyDict_SetItem(dict, k, o) < 0) {
+ 			Py_DECREF(o);
+ 			return -1;
+ 		}
+ 		Py_DECREF(o);
+ 	}
+ 
+ 	Py_DECREF(dict);
+ 
+ 	if (iterations != count) {
+ 		PyErr_SetString(
+ 			TestError,
+ 			"test_dict_iteration: dict iteration went wrong ");
+ 		return -1;
+ 	} else {
+ 		return 0;
+ 	}
+ }
+ 
+ static PyObject*
+ test_dict_iteration(PyObject* self, PyObject* args)
+ {
+ 	int i;
+ 
+         if (!PyArg_ParseTuple(args, ":test_dict_iteration"))
+                 return NULL;
+ 	
+ 	for (i = 0; i < 200; i++) {
+ 		if (test_dict_inner(i) < 0) {
+ 			return NULL;
+ 		}
+ 	}
+ 
+ 	Py_INCREF(Py_None);
+ 	return Py_None;
+ }
+ 
  static PyMethodDef TestMethods[] = {
  	{"test_config", test_config, METH_VARARGS},
  	{"test_list_api", test_list_api, METH_VARARGS},
+ 	{"test_dict_iteration", test_dict_iteration, METH_VARARGS},
  	{NULL, NULL} /* sentinel */
  };