From: Thomas Heller Date: Fri, 18 Sep 2009 20:09:57 +0000 (+0000) Subject: Merged revisions 74922 via svnmerge from X-Git-Tag: v3.1.2rc1~514 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=49ac2ac740d4bc4a3b31986535638cd8f86ecec1;p=python Merged revisions 74922 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r74922 | thomas.heller | 2009-09-18 22:08:39 +0200 (Fr, 18 Sep 2009) | 10 lines Merged revisions 74921 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r74921 | thomas.heller | 2009-09-18 22:05:44 +0200 (Fr, 18 Sep 2009) | 3 lines Issue #4606: Passing 'None' if ctypes argtype is set to POINTER(...) does now always result in NULL. ........ ................ --- diff --git a/Lib/ctypes/test/test_parameters.py b/Lib/ctypes/test/test_parameters.py index 10eddd4cb4..6a3f33d19c 100644 --- a/Lib/ctypes/test/test_parameters.py +++ b/Lib/ctypes/test/test_parameters.py @@ -97,7 +97,7 @@ class SimpleTypesTestCase(unittest.TestCase): self.assertEqual(x.contents.value, 42) self.assertEqual(LPINT(c_int(42)).contents.value, 42) - self.assertEqual(LPINT.from_param(None), 0) + self.assertEqual(LPINT.from_param(None), None) if c_int != c_long: self.assertRaises(TypeError, LPINT.from_param, pointer(c_long(42))) diff --git a/Misc/NEWS b/Misc/NEWS index 7296042f59..5236a9e599 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,6 +21,9 @@ Core and Builtins Library ------- +- Issue #4606: Passing 'None' if ctypes argtype is set to POINTER(...) + does now always result in NULL. + - Issue #5042: Structure sub-subclass does now initialize correctly with base class positional arguments. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 41264d33ad..40cf480f7e 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -936,8 +936,11 @@ PyCPointerType_from_param(PyObject *type, PyObject *value) { StgDictObject *typedict; - if (value == Py_None) - return PyLong_FromLong(0); /* NULL pointer */ + if (value == Py_None) { + /* ConvParam will convert to a NULL pointer later */ + Py_INCREF(value); + return value; + } typedict = PyType_stgdict(type); assert(typedict); /* Cannot be NULL for pointer types */ diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index cbc5cf86fe..f5eaa0d0ba 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -547,6 +547,7 @@ PyTypeObject PyCArg_Type = { * C function call. * * 1. Python integers are converted to C int and passed by value. + * Py_None is converted to a C NULL pointer. * * 2. 3-tuples are expected to have a format character in the first * item, which must be 'i', 'f', 'd', 'q', or 'P'.