[pypy-commit] pypy errno-again: rffi.RFFI_ZERO_ERRNO_BEFORE

arigo noreply at buildbot.pypy.org
Thu Jan 15 11:36:02 CET 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: errno-again
Changeset: r75339:05b2fc705f1a
Date: 2015-01-15 11:35 +0100
http://bitbucket.org/pypy/pypy/changeset/05b2fc705f1a/

Log:	rffi.RFFI_ZERO_ERRNO_BEFORE

diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -2981,7 +2981,7 @@
         func1_adr = rffi.cast(lltype.Signed, func1_ptr)
         calldescr = self.cpu._calldescr_dynamic_for_tests([], types.sint32)
         #
-        for saveerr in [rffi.RFFI_READSAVED_ERRNO]:
+        for saveerr in [rffi.RFFI_READSAVED_ERRNO, rffi.RFFI_ZERO_ERRNO_BEFORE]:
             faildescr = BasicFailDescr(1)
             i1 = BoxInt()
             ops = [
@@ -2999,10 +2999,11 @@
             deadframe = self.cpu.execute_token(looptoken)
             result = self.cpu.get_int_value(deadframe, 0)
             assert llerrno.get_debug_saved_errno(self.cpu) == 24
-            assert result == 24
-
-    def test_call_release_gil_zero_errno_before(self):
-        XXX
+            #
+            if saveerr == rffi.RFFI_READSAVED_ERRNO:
+                assert result == 24
+            else:
+                assert result == 0
 
     def test_call_release_gil_save_lasterror(self):
         XXX
diff --git a/rpython/jit/backend/x86/callbuilder.py b/rpython/jit/backend/x86/callbuilder.py
--- a/rpython/jit/backend/x86/callbuilder.py
+++ b/rpython/jit/backend/x86/callbuilder.py
@@ -162,6 +162,13 @@
             mc.MOV_rm(edx.value, (eax.value, p_errno))
             mc.MOV32_rm(eax.value, (eax.value, rpy_errno))
             mc.MOV32_mr((edx.value, 0), eax.value)
+        elif save_err & rffi.RFFI_ZERO_ERRNO_BEFORE:
+            # Same, but write zero.
+            p_errno = llerrno.get_p_errno_offset(self.asm.cpu)
+            mc = self.mc
+            mc.MOV_rs(eax.value, THREADLOCAL_OFS - self.current_esp)
+            mc.MOV_rm(eax.value, (eax.value, p_errno))
+            mc.MOV32_mi((eax.value, 0), 0)
 
     def read_real_errno(self, save_err):
         if save_err & rffi.RFFI_SAVE_ERRNO:


More information about the pypy-commit mailing list