From eb0d992520c99a1756be36199e976af8d66fb491 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 13 Apr 2001 17:08:15 +0000 Subject: 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. --- Modules/_testcapimodule.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 0ffdc17..24cf2b3 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -95,9 +95,71 @@ test_list_api(PyObject *self, PyObject *args) return Py_None; } +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 */ }; -- cgit v0.12