[pypy-commit] pypy optresult: a bit blindly implement direct_call_release_gil
fijal
noreply at buildbot.pypy.org
Fri Jun 5 12:28:56 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77898:bbf72f83ccb5
Date: 2015-06-05 12:29 +0200
http://bitbucket.org/pypy/pypy/changeset/bbf72f83ccb5/
Log: a bit blindly implement direct_call_release_gil
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
@@ -1590,6 +1590,9 @@
if effectinfo.oopspecindex == effectinfo.OS_LIBFFI_CALL:
resbox = self.metainterp.direct_libffi_call(allboxes, descr,
tp)
+ elif effectinfo.is_call_release_gil():
+ resbox = self.metainterp.direct_call_release_gil(allboxes,
+ descr, tp)
elif tp == 'i':
resbox = self.metainterp.execute_and_record_varargs(
rop.CALL_MAY_FORCE_I, allboxes, descr=descr)
@@ -1604,8 +1607,6 @@
rop.CALL_MAY_FORCE_N, allboxes, descr=descr)
else:
assert False
- if effectinfo.is_call_release_gil():
- self.metainterp.direct_call_release_gil()
self.metainterp.vrefs_after_residual_call()
vablebox = None
if assembler_call:
@@ -3041,6 +3042,13 @@
box_result = self.history.record(
rop.CALL_RELEASE_GIL_F, [c_saveall, argboxes[2]] + arg_boxes,
value, descr=calldescr)
+ elif tp == 'v':
+ value = executor.execute_varargs(self.cpu, self,
+ rop.CALL_MAY_FORCE_N,
+ argboxes, orig_calldescr)
+ box_result = self.history.record(
+ rop.CALL_RELEASE_GIL_N, [c_saveall, argboxes[2]] + arg_boxes,
+ value, descr=calldescr)
else:
assert False
#
@@ -3048,20 +3056,38 @@
# special op libffi_save_result_{int,float}
return box_result
- def direct_call_release_gil(self):
- op = self.history.operations.pop()
- assert op.is_call_may_force()
- descr = op.getdescr()
- effectinfo = descr.get_extra_info()
+ def direct_call_release_gil(self, argboxes, calldescr, tp):
+ effectinfo = calldescr.get_extra_info()
realfuncaddr, saveerr = effectinfo.call_release_gil_target
funcbox = ConstInt(heaptracker.adr2int(realfuncaddr))
savebox = ConstInt(saveerr)
- assert False, "not yet"
- self.history.record(rop.CALL_RELEASE_GIL,
- [savebox, funcbox] + op.getarglist()[1:],
- op.result, descr)
+ if tp == 'i':
+ value = executor.execute_varargs(self.cpu, self,
+ rop.CALL_MAY_FORCE_I,
+ argboxes, calldescr)
+ resbox = self.history.record(rop.CALL_RELEASE_GIL_I,
+ [savebox, funcbox] + argboxes[1:],
+ value, calldescr)
+ elif tp == 'f':
+ value = executor.execute_varargs(self.cpu, self,
+ rop.CALL_MAY_FORCE_F,
+ argboxes, calldescr)
+ resbox = self.history.record(rop.CALL_RELEASE_GIL_F,
+ [savebox, funcbox] + argboxes[1:],
+ value, calldescr)
+ elif tp == 'v':
+ value = executor.execute_varargs(self.cpu, self,
+ rop.CALL_MAY_FORCE_N,
+ argboxes, calldescr)
+ resbox = self.history.record(rop.CALL_RELEASE_GIL_N,
+ [savebox, funcbox] + argboxes[1:],
+ value, calldescr)
+ else:
+ assert False, "no CALL_RELEASE_GIL_R"
+
if not we_are_translated(): # for llgraph
- descr._original_func_ = op.getarg(0).value
+ calldescr._original_func_ = argboxes[0].getint()
+ return resbox
def do_not_in_trace_call(self, allboxes, descr):
self.clear_exception()
More information about the pypy-commit
mailing list