Author: Armin Rigo <ar...@tunes.org>
Branch: errno-again
Changeset: r75405:6582a6559821
Date: 2015-01-16 21:33 +0100
http://bitbucket.org/pypy/pypy/changeset/6582a6559821/

Log:    Fix on Windows. Improve tests.

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,17 +2930,21 @@
         eci = ExternalCompilationInfo(
             separate_module_sources=['''
                 #include <errno.h>
-                RPY_EXPORTED long test_call_release_gil_save_errno(
-                       long a, long b, long c, long d, long e, long f, long g) 
{
+                static long f1(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);
                 }
+                RPY_EXPORTED
+                long test_call_release_gil_save_errno(void) {
+                    return (long)&f1;
+                }
             '''])
         fn_name = 'test_call_release_gil_save_errno'
-        func1_ptr = rffi.llexternal(fn_name, [lltype.Signed]*7, lltype.Signed,
-                                    compilation_info=eci, _nowrapper=True)
-        func1_adr = rffi.cast(lltype.Signed, func1_ptr)
+        getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
+                                     compilation_info=eci, _nowrapper=True)
+        func1_adr = getter_ptr()
         calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
                                                           types.slong)
         #
@@ -2983,19 +2987,23 @@
             separate_module_sources=[r'''
                 #include <stdio.h>
                 #include <errno.h>
-                RPY_EXPORTED long test_call_release_gil_readsaved_errno(
-                       long a, long b, long c, long d, long e, long f, long g) 
{
+                static long f1(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;
                 }
+                RPY_EXPORTED
+                long test_call_release_gil_readsaved_errno(void) {
+                    return (long)&f1;
+                }
             '''])
         fn_name = 'test_call_release_gil_readsaved_errno'
-        func1_ptr = rffi.llexternal(fn_name, [lltype.Signed]*7, lltype.Signed,
-                                    compilation_info=eci, _nowrapper=True)
-        func1_adr = rffi.cast(lltype.Signed, func1_ptr)
+        getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
+                                     compilation_info=eci, _nowrapper=True)
+        func1_adr = getter_ptr()
         calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
                                                           types.slong)
         #
@@ -3037,17 +3045,21 @@
         eci = ExternalCompilationInfo(
             separate_module_sources=['''
                 #include <windows.h>
-                RPY_EXPORTED long test_call_release_gil_save_lasterror(
-                       long a, long b, long c, long d, long e, long f, long g) 
{
+                static long f1(long a, long b, long c, long d,
+                               long e, long f, long g) {
                     SetLastError(42);
                     return (a + 10*b + 100*c + 1000*d +
                             10000*e + 100000*f + 1000000*g);
                 }
+                RPY_EXPORTED
+                long test_call_release_gil_save_lasterror(void) {
+                    return (long)&f1;
+                }
             '''])
         fn_name = 'test_call_release_gil_save_lasterror'
-        func1_ptr = rffi.llexternal(fn_name, [lltype.Signed]*7, lltype.Signed,
-                                    compilation_info=eci, _nowrapper=True)
-        func1_adr = rffi.cast(lltype.Signed, func1_ptr)
+        getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
+                                     compilation_info=eci, _nowrapper=True)
+        func1_adr = getter_ptr()
         calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
                                                           types.slong)
         #
@@ -3092,19 +3104,24 @@
         eci = ExternalCompilationInfo(
             separate_module_sources=[r'''
                 #include <windows.h>
-                RPY_EXPORTED long test_call_release_gil_readsaved_lasterror(
-                       long a, long b, long c, long d, long e, long f, long g) 
{
+                static long f1(long a, long b, long c, long d,
+                               long e, long f, long g) {
                     long r = GetLastError();
-                    //printf("GetLastError() result: %ld\n", r);
+                    printf("GetLastError() result: %ld\n", r);
+                    printf("%ld %ld %ld %ld %ld %ld %ld\n", a,b,c,d,e,f,g);
                     r += 100 * (a + 10*b + 100*c + 1000*d +
                                 10000*e + 100000*f + 1000000*g);
                     return r;
                 }
+                RPY_EXPORTED
+                long test_call_release_gil_readsaved_lasterror(void) {
+                    return (long)&f1;
+                }
             '''])
         fn_name = 'test_call_release_gil_readsaved_lasterror'
-        func1_ptr = rffi.llexternal(fn_name, [lltype.Signed]*7, lltype.Signed,
-                                    compilation_info=eci, _nowrapper=True)
-        func1_adr = rffi.cast(lltype.Signed, func1_ptr)
+        getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
+                                     compilation_info=eci, _nowrapper=True)
+        func1_adr = getter_ptr()
         calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
                                                           types.slong)
         #
@@ -3132,8 +3149,82 @@
             assert result == 24 + 345678900
 
     def test_call_release_gil_err_all(self):
-        xxx
-            
+        from rpython.translator.tool.cbuild import ExternalCompilationInfo
+        from rpython.rlib.libffi import types
+        from rpython.jit.backend.llsupport import llerrno
+        #
+        if not isinstance(self.cpu, AbstractLLCPU):
+            py.test.skip("not on LLGraph")
+        if sys.platform != 'win32':
+            eci = ExternalCompilationInfo(
+                separate_module_sources=[r'''
+                    #include <errno.h>
+                    static long f1(long a, long b, long c, long d,
+                                   long e, long f, long g) {
+                        long r = errno;
+                        errno = 42;
+                        r += 100 * (a + 10*b + 100*c + 1000*d +
+                                    10000*e + 100000*f + 1000000*g);
+                        return r;
+                    }
+                    RPY_EXPORTED
+                    long test_call_release_gil_err_all(void) {
+                        return (long)&f1;
+                    }
+                '''])
+        else:
+            eci = ExternalCompilationInfo(
+                separate_module_sources=[r'''
+                    #include <windows.h>
+                    #include <errno.h>
+                    static long f1(long a, long b, long c, long d,
+                                   long e, long f, long g) {
+                        long r = errno + 10 * GetLastError();
+                        errno = 42;
+                        SetLastError(43);
+                        r += 100 * (a + 10*b + 100*c + 1000*d +
+                                    10000*e + 100000*f + 1000000*g);
+                        return r;
+                    }
+                    RPY_EXPORTED
+                    long test_call_release_gil_err_all(void) {
+                        return (long)&f1;
+                    }
+                '''])
+        fn_name = 'test_call_release_gil_err_all'
+        getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
+                                     compilation_info=eci, _nowrapper=True)
+        func1_adr = getter_ptr()
+        calldescr = self.cpu._calldescr_dynamic_for_tests([types.slong]*7,
+                                                          types.slong)
+        #
+        for saveerr in [rffi.RFFI_ERR_ALL]:
+            faildescr = BasicFailDescr(1)
+            inputargs = [BoxInt() for i in range(7)]
+            i1 = BoxInt()
+            ops = [
+                ResOperation(rop.CALL_RELEASE_GIL,
+                             [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(inputargs, ops, looptoken)
+            #
+            llerrno.set_debug_saved_errno(self.cpu, 8)
+            llerrno.set_debug_saved_lasterror(self.cpu, 9)
+            deadframe = self.cpu.execute_token(looptoken, 1, 2, 3, 4, 5, 6, 7)
+            result = self.cpu.get_int_value(deadframe, 0)
+            assert llerrno.get_debug_saved_errno(self.cpu) == 42
+            if sys.platform != 'win32':
+                assert result == 765432108
+            else:
+                assert llerrno.get_debug_saved_lasterror(self.cpu) == 43
+                assert result == 765432198
+
     def test_guard_not_invalidated(self):
         cpu = self.cpu
         i0 = BoxInt()
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
@@ -169,6 +169,7 @@
             mc.MOV_rs(edi.value, THREADLOCAL_OFS - self.current_esp)
             mc.PUSH_m((edi.value, rpy_lasterror))
             mc.CALL(imm(SetLastError_addr))
+            mc.ADD_ri(esp.value, WORD)
 
         if save_err & rffi.RFFI_READSAVED_ERRNO:
             # Just before a call, read 'rpy_errno' and write it into the
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to