diff options
author | Thomas Heller <theller@ctypes.org> | 2006-09-07 19:09:54 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2006-09-07 19:09:54 (GMT) |
commit | 2244af596a56baaab3b85028189434f0c8a1d1e8 (patch) | |
tree | 7c0f04d85b4c6b14589d1decc8eb9be7d9ddb8b3 | |
parent | fdb62f0e5f0b7d1a70a9d8948768ff09ea420c41 (diff) | |
download | cpython-2244af596a56baaab3b85028189434f0c8a1d1e8.zip cpython-2244af596a56baaab3b85028189434f0c8a1d1e8.tar.gz cpython-2244af596a56baaab3b85028189434f0c8a1d1e8.tar.bz2 |
The cast function did not accept c_char_p or c_wchar_p instances
as first argument, and failed with a 'bad argument to internal function'
error message.
-rw-r--r-- | Lib/ctypes/test/test_cast.py | 16 | ||||
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 4 |
2 files changed, 18 insertions, 2 deletions
diff --git a/Lib/ctypes/test/test_cast.py b/Lib/ctypes/test/test_cast.py index 09e928f..7371b0f 100644 --- a/Lib/ctypes/test/test_cast.py +++ b/Lib/ctypes/test/test_cast.py @@ -57,5 +57,21 @@ class Test(unittest.TestCase): c_int() self.failUnlessEqual(p[:4], [1, 2, 96, 4]) + def test_char_p(self): + # This didn't work: bad argument to internal function + s = c_char_p("hiho") + self.failUnlessEqual(cast(cast(s, c_void_p), c_char_p).value, + "hiho") + + try: + c_wchar_p + except NameError: + pass + else: + def test_wchar_p(self): + s = c_wchar_p("hiho") + self.failUnlessEqual(cast(cast(s, c_void_p), c_wchar_p).value, + "hiho") + if __name__ == "__main__": unittest.main() diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 6234c2b..8889038 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4597,11 +4597,11 @@ cast(void *ptr, PyObject *src, PyObject *ctype) if (obj->b_objects == NULL) goto failed; } + Py_XINCREF(obj->b_objects); result->b_objects = obj->b_objects; - if (result->b_objects) { + if (result->b_objects && PyDict_Check(result->b_objects)) { PyObject *index; int rc; - Py_INCREF(obj->b_objects); index = PyLong_FromVoidPtr((void *)src); if (index == NULL) goto failed; |