Kaydet (Commit) f780be42 authored tarafından Thomas Heller's avatar Thomas Heller

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.
üst 638f7add
...@@ -30,15 +30,11 @@ if sys.platform == "win32": ...@@ -30,15 +30,11 @@ if sys.platform == "win32":
# or wrong calling convention # or wrong calling convention
self.assertRaises(ValueError, IsWindow, None) self.assertRaises(ValueError, IsWindow, None)
def test_SEH(self): import _ctypes
# Call functions with invalid arguments, and make sure that access violations if _ctypes.uses_seh():
# are trapped and raise an exception. def test_SEH(self):
# # Call functions with invalid arguments, and make sure that access violations
# Normally, in a debug build of the _ctypes extension # are trapped and raise an exception.
# module, exceptions are not trapped, so we can only run
# this test in a release build.
import sys
if not hasattr(sys, "getobjects"):
self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32) self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32)
class Structures(unittest.TestCase): class Structures(unittest.TestCase):
......
...@@ -1526,7 +1526,21 @@ resize(PyObject *self, PyObject *args) ...@@ -1526,7 +1526,21 @@ resize(PyObject *self, PyObject *args)
return Py_None; 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[] = { 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"}, {"resize", resize, METH_VARARGS, "Resize the memory buffer of a ctypes instance"},
#ifdef CTYPES_UNICODE #ifdef CTYPES_UNICODE
{"set_conversion_mode", set_conversion_mode, METH_VARARGS, set_conversion_mode_doc}, {"set_conversion_mode", set_conversion_mode, METH_VARARGS, set_conversion_mode_doc},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment