[pypy-commit] pypy default: Hackish fix for issue978, second attempt: insert an explicit
arigo
noreply at buildbot.pypy.org
Sat Feb 4 16:04:00 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r52092:458e381ff84d
Date: 2012-02-04 15:42 +0100
http://bitbucket.org/pypy/pypy/changeset/458e381ff84d/
Log: Hackish fix for issue978, second attempt: insert an explicit
KEEPALIVE operation.
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -780,6 +780,9 @@
self.overflow_flag = ovf
return z
+ def op_keepalive(self, _, x):
+ pass
+
# ----------
# delegating to the builtins do_xxx() (done automatically for simple cases)
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -1463,6 +1463,9 @@
if jump_op is not None and jump_op.getdescr() is descr:
self._compute_hint_frame_locations_from_descr(descr)
+ def consider_keepalive(self, op):
+ pass
+
def not_implemented_op(self, op):
not_implemented("not implemented operation: %s" % op.getopname())
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -254,6 +254,9 @@
assert isinstance(x, r_longlong) # 32-bit
return BoxFloat(x)
+def do_keepalive(cpu, x):
+ pass
+
# ____________________________________________________________
##def do_force_token(cpu):
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1346,12 +1346,16 @@
resbox = self.metainterp.execute_and_record_varargs(
rop.CALL_MAY_FORCE, allboxes, descr=descr)
self.metainterp.vrefs_after_residual_call()
+ vablebox = None
if assembler_call:
- self.metainterp.direct_assembler_call(assembler_call_jd)
+ vablebox = self.metainterp.direct_assembler_call(
+ assembler_call_jd)
if resbox is not None:
self.make_result_of_lastop(resbox)
self.metainterp.vable_after_residual_call()
self.generate_guard(rop.GUARD_NOT_FORCED, None)
+ if vablebox is not None:
+ self.metainterp.history.record(rop.KEEPALIVE, [vablebox], None)
self.metainterp.handle_possible_exception()
return resbox
else:
@@ -2478,6 +2482,15 @@
token = warmrunnerstate.get_assembler_token(greenargs)
op = op.copy_and_change(rop.CALL_ASSEMBLER, args=args, descr=token)
self.history.operations.append(op)
+ #
+ # To fix an obscure issue, make sure the vable stays alive
+ # longer than the CALL_ASSEMBLER operation. We do it by
+ # inserting explicitly an extra KEEPALIVE operation.
+ jd = token.outermost_jitdriver_sd
+ if jd.index_of_virtualizable >= 0:
+ return args[jd.index_of_virtualizable]
+ else:
+ return None
# ____________________________________________________________
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -503,6 +503,7 @@
'COPYUNICODECONTENT/5',
'QUASIIMMUT_FIELD/1d', # [objptr], descr=SlowMutateDescr
'RECORD_KNOWN_CLASS/2', # [objptr, clsptr]
+ 'KEEPALIVE/1',
'_CANRAISE_FIRST', # ----- start of can_raise operations -----
'_CALL_FIRST',
More information about the pypy-commit
mailing list