[Python-checkins] r60624 - in python/branches/release25-maint: Lib/ctypes/test/test_win32.py Misc/NEWS Modules/_ctypes/_ctypes.c

thomas.heller python-checkins at python.org
Wed Feb 6 20:58:46 CET 2008


Author: thomas.heller
Date: Wed Feb  6 20:58:46 2008
New Revision: 60624

Modified:
   python/branches/release25-maint/Lib/ctypes/test/test_win32.py
   python/branches/release25-maint/Misc/NEWS
   python/branches/release25-maint/Modules/_ctypes/_ctypes.c
Log:
Fix the way methods are created for the _ctypes.COMError exception
type; this fix is already in the trunk.


Modified: python/branches/release25-maint/Lib/ctypes/test/test_win32.py
==============================================================================
--- python/branches/release25-maint/Lib/ctypes/test/test_win32.py	(original)
+++ python/branches/release25-maint/Lib/ctypes/test/test_win32.py	Wed Feb  6 20:58:46 2008
@@ -37,6 +37,19 @@
                 # are trapped and raise an exception.
                 self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32)
 
+    class TestWintypes(unittest.TestCase):
+
+        def test_COMError(self):
+            from _ctypes import COMError
+            self.assertEqual(COMError.__doc__, "Raised when a COM method call failed.")
+
+            ex = COMError(-1, "text", ("details",))
+            self.assertEqual(ex.hresult, -1)
+            self.assertEqual(ex.text, "text")
+            self.assertEqual(ex.details, ("details",))
+            self.assertEqual((ex.hresult, ex.text, ex.details),
+                             ex[:])
+
 class Structures(unittest.TestCase):
 
     def test_struct_by_value(self):

Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Wed Feb  6 20:58:46 2008
@@ -80,6 +80,10 @@
 Library
 -------
 
+- Fixed _ctypes.COMError so that it must be called with exactly three
+  arguments, instances now have the hresult, text, and details
+  instance variables.
+
 - #1507247, #2004: tarfile.py: Use mode 0700 for temporary directories and
   default permissions for missing directories.
 

Modified: python/branches/release25-maint/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/branches/release25-maint/Modules/_ctypes/_ctypes.c	(original)
+++ python/branches/release25-maint/Modules/_ctypes/_ctypes.c	Wed Feb  6 20:58:46 2008
@@ -4520,32 +4520,42 @@
 	PyObject *s;
 	int status;
 
-	ComError = PyErr_NewException("_ctypes.COMError",
-				      NULL,
-				      dict);
-	if (ComError == NULL)
+	if (dict == NULL)
 		return -1;
+
 	while (methods->ml_name) {
 		/* get a wrapper for the built-in function */
 		PyObject *func = PyCFunction_New(methods, NULL);
 		PyObject *meth;
 		if (func == NULL)
-			return -1;
+			goto error;
 		meth = PyMethod_New(func, NULL, ComError);
 		Py_DECREF(func);
 		if (meth == NULL)
-			return -1;
+			goto error;
 		PyDict_SetItemString(dict, methods->ml_name, meth);
 		Py_DECREF(meth);
 		++methods;
 	}
-	Py_INCREF(ComError);
+
 	s = PyString_FromString(comerror_doc);
 	if (s == NULL)
-		return -1;
+		goto error;
 	status = PyDict_SetItemString(dict, "__doc__", s);
 	Py_DECREF(s);
-	return status;
+	if (status == -1)
+		goto error;
+
+	ComError = PyErr_NewException("_ctypes.COMError",
+				      NULL,
+				      dict);
+	if (ComError == NULL)
+		goto error;
+
+	return 0;
+  error:
+	Py_DECREF(dict);
+	return -1;
 }
 
 #endif


More information about the Python-checkins mailing list