Author: Armin Rigo <ar...@tunes.org>
Branch: errno-again
Changeset: r75379:753a87cdaa56
Date: 2015-01-16 12:31 +0100
http://bitbucket.org/pypy/pypy/changeset/753a87cdaa56/

Log:    Better tests, and fix

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
@@ -2930,31 +2930,39 @@
         eci = ExternalCompilationInfo(
             separate_module_sources=['''
                 #include <errno.h>
-                RPY_EXPORTED void test_call_release_gil_save_errno(void) {
+                RPY_EXPORTED long test_call_release_gil_save_errno(
+                       long a, long b, long c, long d, long e, long f, long g) 
{
                     errno = 42;
+                    return (a + 10*b + 100*c + 1000*d +
+                            10000*e + 100000*f + 1000000*g);
                 }
             '''])
         fn_name = 'test_call_release_gil_save_errno'
-        func1_ptr = rffi.llexternal(fn_name, [], lltype.Void,
+        func1_ptr = rffi.llexternal(fn_name, [lltype.Signed]*7, lltype.Signed,
                                     compilation_info=eci, _nowrapper=True)
         func1_adr = rffi.cast(lltype.Signed, func1_ptr)
-        calldescr = self.cpu._calldescr_dynamic_for_tests([], types.void)
+        calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
+                                                          types.slong)
         #
         for saveerr in [rffi.RFFI_ERR_NONE, rffi.RFFI_SAVE_ERRNO]:
             faildescr = BasicFailDescr(1)
+            inputargs = [BoxInt() for i in range(7)]
+            i1 = BoxInt()
             ops = [
                 ResOperation(rop.CALL_RELEASE_GIL,
-                             [ConstInt(saveerr), ConstInt(func1_adr)], None,
+                             [ConstInt(saveerr), ConstInt(func1_adr)]
+                                 + inputargs, i1,
                              descr=calldescr),
                 ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
-                ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(0))
+                ResOperation(rop.FINISH, [i1], None, descr=BasicFinalDescr(0))
             ]
             ops[-2].setfailargs([])
             looptoken = JitCellToken()
-            self.cpu.compile_loop([], ops, looptoken)
+            self.cpu.compile_loop(inputargs, ops, looptoken)
             #
             llerrno.set_debug_saved_errno(self.cpu, 24)
-            self.cpu.execute_token(looptoken)
+            deadframe = self.cpu.execute_token(looptoken, 9, 8, 7, 6, 5, 4, 3)
+            original_result = self.cpu.get_int_value(deadframe, 0)
             result = llerrno.get_debug_saved_errno(self.cpu)
             print 'saveerr =', saveerr, ': got result =', result
             #
@@ -2962,6 +2970,7 @@
                 assert result == 42      # from the C code
             else:
                 assert result == 24      # not touched
+            assert original_result == 3456789
 
     def test_call_release_gil_readsaved_errno(self):
         from rpython.translator.tool.cbuild import ExternalCompilationInfo
@@ -2974,41 +2983,47 @@
             separate_module_sources=[r'''
                 #include <stdio.h>
                 #include <errno.h>
-                RPY_EXPORTED int test_call_release_gil_readsaved_errno(void) {
-                    int r = errno;
-                    printf("read saved errno: %d\n", r);
+                RPY_EXPORTED long test_call_release_gil_readsaved_errno(
+                       long a, long b, long c, long d, long e, long f, long g) 
{
+                    long r = errno;
+                    printf("read saved errno: %ld\n", r);
+                    r += 100 * (a + 10*b + 100*c + 1000*d +
+                                10000*e + 100000*f + 1000000*g);
                     return r;
                 }
             '''])
         fn_name = 'test_call_release_gil_readsaved_errno'
-        func1_ptr = rffi.llexternal(fn_name, [], rffi.INT,
+        func1_ptr = rffi.llexternal(fn_name, [lltype.Signed]*7, lltype.Signed,
                                     compilation_info=eci, _nowrapper=True)
         func1_adr = rffi.cast(lltype.Signed, func1_ptr)
-        calldescr = self.cpu._calldescr_dynamic_for_tests([], types.sint32)
+        calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
+                                                          types.slong)
         #
         for saveerr in [rffi.RFFI_READSAVED_ERRNO, 
rffi.RFFI_ZERO_ERRNO_BEFORE]:
             faildescr = BasicFailDescr(1)
+            inputargs = [BoxInt() for i in range(7)]
             i1 = BoxInt()
             ops = [
                 ResOperation(rop.CALL_RELEASE_GIL,
-                             [ConstInt(saveerr), ConstInt(func1_adr)], i1,
+                             [ConstInt(saveerr), ConstInt(func1_adr)]
+                                 + inputargs, i1,
                              descr=calldescr),
                 ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
                 ResOperation(rop.FINISH, [i1], None, descr=BasicFinalDescr(0))
             ]
             ops[-2].setfailargs([])
             looptoken = JitCellToken()
-            self.cpu.compile_loop([], ops, looptoken)
+            self.cpu.compile_loop(inputargs, ops, looptoken)
             #
             llerrno.set_debug_saved_errno(self.cpu, 24)
-            deadframe = self.cpu.execute_token(looptoken)
+            deadframe = self.cpu.execute_token(looptoken, 9, 8, 7, 6, 5, 4, 3)
             result = self.cpu.get_int_value(deadframe, 0)
             assert llerrno.get_debug_saved_errno(self.cpu) == 24
             #
             if saveerr == rffi.RFFI_READSAVED_ERRNO:
-                assert result == 24
+                assert result == 24 + 345678900
             else:
-                assert result == 0
+                assert result == 0  + 345678900
 
     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
@@ -159,9 +159,13 @@
             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(edx.value, (eax.value, p_errno))
+            if IS_X86_32:
+                tmpreg = edx
+            else:
+                tmpreg = r11     # edx is used for 3rd argument
+            mc.MOV_rm(tmpreg.value, (eax.value, p_errno))
             mc.MOV32_rm(eax.value, (eax.value, rpy_errno))
-            mc.MOV32_mr((edx.value, 0), eax.value)
+            mc.MOV32_mr((tmpreg.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)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to