diff options
-rw-r--r-- | Lib/ctypes/test/test_win32.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | 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): @@ -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 |