[pypy-commit] pypy errno-again: in-progress

arigo noreply at buildbot.pypy.org
Wed Jan 14 19:52:07 CET 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: errno-again
Changeset: r75334:6337a26add9b
Date: 2015-01-14 19:51 +0100
http://bitbucket.org/pypy/pypy/changeset/6337a26add9b/

Log:	in-progress

diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -935,7 +935,7 @@
         del self.force_guard_op
         return res
 
-    def execute_call_release_gil(self, descr, func, *args):
+    def execute_call_release_gil(self, descr, saveerr, func, *args):
         if hasattr(descr, '_original_func_'):
             func = descr._original_func_     # see pyjitpl.py
             # we want to call the function that does the aroundstate
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
@@ -2512,7 +2512,7 @@
         tok = BoxInt()
         faildescr = BasicFailDescr(1)
         ops = [
-        ResOperation(rop.CALL_RELEASE_GIL, [funcbox, i1], i2,
+        ResOperation(rop.CALL_RELEASE_GIL, [ConstInt(0), funcbox, i1], i2,
                      descr=calldescr),
         ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
         ResOperation(rop.FINISH, [i2], None, descr=BasicFinalDescr(0))
@@ -2570,7 +2570,8 @@
         tok = BoxInt()
         faildescr = BasicFailDescr(1)
         ops = [
-        ResOperation(rop.CALL_RELEASE_GIL, [funcbox, i0, i1, i2, i3], None,
+        ResOperation(rop.CALL_RELEASE_GIL,
+                     [ConstInt(0), funcbox, i0, i1, i2, i3], None,
                      descr=calldescr),
         ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
         ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(0))
@@ -2625,7 +2626,8 @@
         for i in range(50):
             i3 = BoxInt()
             ops += [
-                ResOperation(rop.CALL_RELEASE_GIL, [funcbox, i1, i2], i3,
+                ResOperation(rop.CALL_RELEASE_GIL,
+                             [ConstInt(0), funcbox, i1, i2], i3,
                              descr=calldescr),
                 ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
                 ]
@@ -2697,7 +2699,7 @@
                 assert 0, kind
             #
             ops = [
-                ResOperation(rop.CALL_RELEASE_GIL, [funcbox], b3,
+                ResOperation(rop.CALL_RELEASE_GIL, [ConstInt(0), funcbox], b3,
                              descr=calldescr),
                 ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
                 ResOperation(rop.FINISH, [b3], None, descr=BasicFinalDescr(0))
@@ -2881,7 +2883,8 @@
             loadcodes = ''.join(loadcodes)
             print loadcodes
             ops += [
-                ResOperation(rop.CALL_RELEASE_GIL, insideboxes, None,
+                ResOperation(rop.CALL_RELEASE_GIL,
+                             [ConstInt(0)] + insideboxes, None,
                              descr=calldescr),
                 ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
                 ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(0))
@@ -2916,6 +2919,20 @@
             assert got == expected, '\n'.join(
                 ['bad args, signature %r' % codes[1:]] + different_values)
 
+    def test_call_release_gil_save_errno(self):
+        XXX
+
+    def test_call_release_gil_readsaved_errno(self):
+        XXX
+
+    def test_call_release_gil_zero_errno_before(self):
+        XXX
+
+    def test_call_release_gil_save_lasterror(self):
+        XXX
+
+    def test_call_release_gil_readsaved_lasterror(self):
+        XXX
 
     def test_guard_not_invalidated(self):
         cpu = self.cpu
diff --git a/rpython/jit/codewriter/test/test_call.py b/rpython/jit/codewriter/test/test_call.py
--- a/rpython/jit/codewriter/test/test_call.py
+++ b/rpython/jit/codewriter/test/test_call.py
@@ -206,7 +206,8 @@
     from rpython.jit.backend.llgraph.runner import LLGraphCPU
 
     T = rffi.CArrayPtr(rffi.TIME_T)
-    external = rffi.llexternal("time", [T], rffi.TIME_T, releasegil=True)
+    external = rffi.llexternal("time", [T], rffi.TIME_T, releasegil=True,
+                               save_err=rffi.RFFI_SAVE_ERRNO)
 
     # no jit.dont_look_inside in this test
     def f():
@@ -220,12 +221,16 @@
     [llext_graph] = [x for x in res if x.func is external]
     [block, _] = list(llext_graph.iterblocks())
     [op] = block.operations
-    call_target = op.args[0].value._obj.graph.func._call_aroundstate_target_
+    tgt_tuple = op.args[0].value._obj.graph.func._call_aroundstate_target_
+    assert type(tgt_tuple) is tuple and len(tgt_tuple) == 2
+    call_target, saveerr = tgt_tuple
+    assert saveerr == rffi.RFFI_SAVE_ERRNO
     call_target = llmemory.cast_ptr_to_adr(call_target)
     call_descr = cc.getcalldescr(op)
     assert call_descr.extrainfo.has_random_effects()
     assert call_descr.extrainfo.is_call_release_gil() is True
-    assert call_descr.extrainfo.call_release_gil_target == call_target
+    assert call_descr.extrainfo.call_release_gil_target == (
+        call_target, rffi.RFFI_SAVE_ERRNO)
 
 def test_random_effects_on_stacklet_switch():
     from rpython.jit.backend.llgraph.runner import LLGraphCPU
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2875,8 +2875,11 @@
             arg_boxes.append(box_arg)
         #
         box_result = op.result
+        # for now, any call via libffi saves and restores everything
+        # (that is, errno and SetLastError/GetLastError on Windows)
+        c_saveall = ConstInt(rffi.RFFI_ERR_ALL)
         self.history.record(rop.CALL_RELEASE_GIL,
-                            [op.getarg(2)] + arg_boxes,
+                            [c_saveall, op.getarg(2)] + arg_boxes,
                             box_result, calldescr)
         #
         self.history.operations.extend(extra_guards)
@@ -2889,10 +2892,11 @@
         assert op.opnum == rop.CALL_MAY_FORCE
         descr = op.getdescr()
         effectinfo = descr.get_extra_info()
-        realfuncaddr = effectinfo.call_release_gil_target
+        realfuncaddr, saveerr = effectinfo.call_release_gil_target
         funcbox = ConstInt(heaptracker.adr2int(realfuncaddr))
+        savebox = ConstInt(saveerr)
         self.history.record(rop.CALL_RELEASE_GIL,
-                            [funcbox] + op.getarglist()[1:],
+                            [savebox, funcbox] + op.getarglist()[1:],
                             op.result, descr)
         if not we_are_translated():       # for llgraph
             descr._original_func_ = op.getarg(0).value


More information about the pypy-commit mailing list