summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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},