Anonymous avatar Anonymous committed 0b060cf

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.

Comments (0)

Files changed (1)

Modules/_testcapimodule.c

 	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 */
 };
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.