]> granicus.if.org Git - python/commitdiff
Backport rev 51820 from Thomas Heller
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 11 Sep 2006 04:02:43 +0000 (04:02 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 11 Sep 2006 04:02:43 +0000 (04:02 +0000)
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.

Lib/ctypes/test/test_cast.py
Modules/_ctypes/_ctypes.c

index 09e928fdb40dc276b8278e40954282f757b64ead..7371b0fe24b78a0837e418bbd52b057271812d62 100644 (file)
@@ -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()
index 5204a7fa3457ae210e51c06eaafa6ad1b1afa6c4..4d574169bb0adf7ceec539a17224c9696c34ed96 100644 (file)
@@ -4590,11 +4590,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;