[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