From 527bf3a826cc19a6ff99e8104c1f4e20bdabb1cd Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Wed, 6 Feb 2008 19:58:46 +0000 Subject: [PATCH] Fix the way methods are created for the _ctypes.COMError exception type; this fix is already in the trunk. --- Lib/ctypes/test/test_win32.py | 13 +++++++++++++ Misc/NEWS | 4 ++++ Modules/_ctypes/_ctypes.c | 28 +++++++++++++++++++--------- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index db530d3af4..fd4e039ab8 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -37,6 +37,19 @@ if sys.platform == "win32": # 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): diff --git a/Misc/NEWS b/Misc/NEWS index e7d3370f86..e3a4aceece 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -80,6 +80,10 @@ Core and builtins 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. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 814b85496b..aa283e3a50 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4520,32 +4520,42 @@ create_comerror(void) 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 -- 2.40.0