[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