summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2006-07-03 08:08:14 +0000
committerThomas Heller <theller@ctypes.org>2006-07-03 08:08:14 +0000
commitf780be4239817192a93c34b768f6565aee8c2130 (patch)
tree61c0d37eaa3af547d62e98126be3fbf5666f2f69
parent638f7addf39afe167aab84521202a54d1cd42587 (diff)
downloadcpython-git-f780be4239817192a93c34b768f6565aee8c2130.tar.gz
Add a new function uses_seh() to the _ctypes extension module. This
will return True if Windows Structured Exception handling (SEH) is used when calling functions, False otherwise. Currently, only MSVC supports SEH. Fix the test so that it doesn't crash when run with MingW compiled _ctypes. Note that two tests are still failing when mingw is used, I suspect structure layout differences and function calling conventions between MSVC and MingW.
-rw-r--r--Lib/ctypes/test/test_win32.py14
-rw-r--r--Modules/_ctypes/callproc.c14
2 files changed, 19 insertions, 9 deletions
diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py
index 8247d370d3..eb016ffbc7 100644
--- a/Lib/ctypes/test/test_win32.py
+++ b/Lib/ctypes/test/test_win32.py
@@ -30,15 +30,11 @@ if sys.platform == "win32":
# or wrong calling convention
self.assertRaises(ValueError, IsWindow, None)
- def test_SEH(self):
- # Call functions with invalid arguments, and make sure that access violations
- # are trapped and raise an exception.
- #
- # Normally, in a debug build of the _ctypes extension
- # module, exceptions are not trapped, so we can only run
- # this test in a release build.
- import sys
- if not hasattr(sys, "getobjects"):
+ import _ctypes
+ if _ctypes.uses_seh():
+ def test_SEH(self):
+ # Call functions with invalid arguments, and make sure that access violations
+ # are trapped and raise an exception.
self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32)
class Structures(unittest.TestCase):
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 16e10dedad..4ec1f13d80 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1526,7 +1526,21 @@ resize(PyObject *self, PyObject *args)
return Py_None;
}
+static PyObject *
+uses_seh(PyObject *self, PyObject *args)
+{
+#if defined(DONT_USE_SEH) || !defined(MS_WIN32)
+ Py_INCREF(Py_False);
+ return Py_False;
+#else
+ Py_INCREF(Py_True);
+ return Py_True;
+#endif
+}
+
PyMethodDef module_methods[] = {
+ {"uses_seh", uses_seh, METH_NOARGS,
+ "Return whether ctypes uses Windows structured exception handling"},
{"resize", resize, METH_VARARGS, "Resize the memory buffer of a ctypes instance"},
#ifdef CTYPES_UNICODE
{"set_conversion_mode", set_conversion_mode, METH_VARARGS, set_conversion_mode_doc},