[pypy-svn] r25461 - in pypy/dist/pypy/translator/backendopt: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Thu Apr 6 19:55:40 CEST 2006
Author: cfbolz
Date: Thu Apr 6 19:55:39 2006
New Revision: 25461
Modified:
pypy/dist/pypy/translator/backendopt/support.py
pypy/dist/pypy/translator/backendopt/test/test_inline.py
Log:
(pedronis, cfbolz):
fix placement of keepalives
Modified: pypy/dist/pypy/translator/backendopt/support.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/support.py (original)
+++ pypy/dist/pypy/translator/backendopt/support.py Thu Apr 6 19:55:39 2006
@@ -2,8 +2,8 @@
from pypy.rpython.lltypesystem import lltype
from pypy.rpython.rmodel import inputconst
from pypy.tool.ansi_print import ansi_log
-from pypy.translator.unsimplify import split_block, copyvar
-from pypy.objspace.flow.model import Constant, Variable, SpaceOperation
+from pypy.translator.unsimplify import split_block, copyvar, insert_empty_block
+from pypy.objspace.flow.model import Constant, Variable, SpaceOperation, c_last_exception
from pypy.rpython.lltypesystem import lltype
log = py.log.Producer("backendopt")
@@ -83,7 +83,15 @@
if var_needsgc(var)]
else:
keep_alive_vars = []
- afterblock.operations.extend(generate_keepalive(keep_alive_vars))
+ if afterblock.exitswitch == c_last_exception:
+ for link in afterblock.exits:
+ betweenblock = insert_empty_block(translator, link)
+ fresh_vars = [copyvar(translator, var) for var in keep_alive_vars]
+ betweenblock.inputargs.extend(fresh_vars)
+ link.args.extend(keep_alive_vars)
+ betweenblock.operations = generate_keepalive(fresh_vars)
+ else:
+ afterblock.operations.extend(generate_keepalive(keep_alive_vars))
return afterblock
def md5digest(translator):
Modified: pypy/dist/pypy/translator/backendopt/test/test_inline.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/test/test_inline.py (original)
+++ pypy/dist/pypy/translator/backendopt/test/test_inline.py Thu Apr 6 19:55:39 2006
@@ -453,3 +453,20 @@
eval_func = check_inline(g, f, [])
res = eval_func([])
assert res == 5
+
+def test_correct_keepalive_placement():
+ def h(x):
+ if not x:
+ raise ValueError
+ return 1
+ def f(x):
+ s = "a %s" % (x, )
+ try:
+ h(len(s))
+ except ValueError:
+ pass
+ return -42
+ eval_func, t = check_auto_inlining(f, [int])
+ res = eval_func([42])
+ assert res == -42
+
More information about the Pypy-commit
mailing list