[pypy-commit] pypy default: fix segfault on windows by SetErrorMode in rtyper tests

mattip noreply at buildbot.pypy.org
Fri Apr 12 10:02:23 CEST 2013


Author: mattip <matti.picus at gmail.com>
Branch: 
Changeset: r63270:18e164c14177
Date: 2013-04-12 10:45 +0300
http://bitbucket.org/pypy/pypy/changeset/18e164c14177/

Log:	fix segfault on windows by SetErrorMode in rtyper tests

diff --git a/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py b/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py
--- a/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py
+++ b/rpython/rtyper/lltypesystem/test/test_ll2ctypes.py
@@ -745,14 +745,16 @@
         eci = ExternalCompilationInfo(includes=['string.h'])
         if sys.platform.startswith('win'):
             underscore_on_windows = '_'
-            # the default when writing to a invalid fd on windows is to call
-            # an _invalid_parameter_handler, which by default crashes the
-            # process. To fix this test, call _set_invalid_parameter_handler
-            # in the setup_method, and remove it in the teardown. 
-            # Note that cpython before 2.7 did install an _invalid_parameter_handler,
+            # Note that cpython before 2.7 installs an _invalid_parameter_handler,
             # which is why the test passes there, but this is no longer
             # accepted practice.
-            py.test.skip('need to set an _invalid_parameter_handler')
+            import ctypes
+            SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN
+            old_err_mode = ctypes.windll.kernel32.GetErrorMode()
+            new_err_mode = old_err_mode | SEM_NOGPFAULTERRORBOX
+            ctypes.windll.kernel32.SetErrorMode(new_err_mode)
+            assert f(1) == 1
+            ctypes.windll.kernel32.SetErrorMode(old_err_mode)
         else:
             underscore_on_windows = ''
         strlen = rffi.llexternal('strlen', [rffi.CCHARP], rffi.SIZE_T,
@@ -762,6 +764,8 @@
                                    rffi.SIZE_T)
         buffer = lltype.malloc(rffi.CCHARP.TO, 5, flavor='raw')
         written = os_write(12312312, buffer, 5)
+        if sys.platform.startswith('win'):
+            ctypes.windll.kernel32.SetErrorMode(old_err_mode)
         lltype.free(buffer, flavor='raw')
         assert rffi.cast(rffi.LONG, written) < 0
         # the next line is a random external function call,
diff --git a/rpython/rtyper/lltypesystem/test/test_llarena.py b/rpython/rtyper/lltypesystem/test/test_llarena.py
--- a/rpython/rtyper/lltypesystem/test/test_llarena.py
+++ b/rpython/rtyper/lltypesystem/test/test_llarena.py
@@ -302,6 +302,7 @@
 
 class TestStandalone(test_standalone.StandaloneTests):
     def test_compiled_arena_protect(self):
+        import sys
         S = lltype.Struct('S', ('x', lltype.Signed))
         #
         def fn(argv):
@@ -325,6 +326,15 @@
         t, cbuilder = self.compile(fn)
         data = cbuilder.cmdexec('0')
         assert data == '133\n'
+        if sys.platform.startswith('win'):
+            # Do not open error dialog box
+            import ctypes
+            SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN
+            old_err_mode = ctypes.windll.kernel32.GetErrorMode()
+            new_err_mode = old_err_mode | SEM_NOGPFAULTERRORBOX
+            ctypes.windll.kernel32.SetErrorMode(new_err_mode)
         if has_protect:
             cbuilder.cmdexec('1', expect_crash=True)
             cbuilder.cmdexec('2', expect_crash=True)
+        if sys.platform.startswith('win'):
+            ctypes.windll.kernel32.SetErrorMode(old_err_mode)
diff --git a/rpython/rtyper/module/test/test_ll_os_environ.py b/rpython/rtyper/module/test/test_ll_os_environ.py
--- a/rpython/rtyper/module/test/test_ll_os_environ.py
+++ b/rpython/rtyper/module/test/test_ll_os_environ.py
@@ -12,6 +12,7 @@
     assert f(1) > 0
 
 def test_unset_error():
+    import sys
     def foo(x):
         if x:
             os.environ['TEST'] = 'STRING'
@@ -26,4 +27,14 @@
             return 0
 
     f = compile(foo, [int], backendopt=False)
-    assert f(1) == 1
+    if sys.platform.startswith('win'):
+        # Do not open error dialog box
+        import ctypes
+        SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN
+        old_err_mode = ctypes.windll.kernel32.GetErrorMode()
+        new_err_mode = old_err_mode | SEM_NOGPFAULTERRORBOX
+        ctypes.windll.kernel32.SetErrorMode(new_err_mode)
+        assert f(1) == 1
+        ctypes.windll.kernel32.SetErrorMode(old_err_mode)
+    else:
+        assert f(1) == 1


More information about the pypy-commit mailing list