summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2008-02-06 19:58:46 +0000
committerThomas Heller <theller@ctypes.org>2008-02-06 19:58:46 +0000
commit527bf3a826cc19a6ff99e8104c1f4e20bdabb1cd (patch)
treef4d10068819d1bb3c102155664d6d8f5aa488316
parente69f2bdbe67c69ec595baadd193d52970cf0cbd8 (diff)
downloadcpython-git-527bf3a826cc19a6ff99e8104c1f4e20bdabb1cd.tar.gz
Fix the way methods are created for the _ctypes.COMError exception
type; this fix is already in the trunk.
-rw-r--r--Lib/ctypes/test/test_win32.py13
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_ctypes/_ctypes.c28
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