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