[pypy-svn] r17552 - in pypy/dist/pypy: rpython translator/backendopt translator/backendopt/test

arigo at codespeak.net arigo at codespeak.net
Wed Sep 14 10:16:30 CEST 2005


Author: arigo
Date: Wed Sep 14 10:16:29 2005
New Revision: 17552

Modified:
   pypy/dist/pypy/rpython/llinterp.py
   pypy/dist/pypy/translator/backendopt/inline.py
   pypy/dist/pypy/translator/backendopt/test/test_inline.py
Log:
* support inlining functions that always raise and never return

* fix in llinterp's print_traceback()



Modified: pypy/dist/pypy/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py	(original)
+++ pypy/dist/pypy/rpython/llinterp.py	Wed Sep 14 10:16:29 2005
@@ -58,6 +58,9 @@
         frames.reverse()
         for frame in frames:
             print frame.graph.name,
+            if frame.curr_block is None:
+                print "<not running yet>"
+                continue
             try:
                 print self.typer.annotator.annotated[frame.curr_block].__module__
             except KeyError:

Modified: pypy/dist/pypy/translator/backendopt/inline.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/inline.py	(original)
+++ pypy/dist/pypy/translator/backendopt/inline.py	Wed Sep 14 10:16:29 2005
@@ -131,7 +131,6 @@
     assert linktoinlined.target is afterblock
     copiedstartblock = copy_block(graph_to_inline.startblock)
     copiedstartblock.isstartblock = False
-    copiedreturnblock = copied_blocks[graph_to_inline.returnblock]
     #find args passed to startblock of inlined function
     passon_args = []
     for arg in op.args[1:]:
@@ -146,11 +145,13 @@
     linktoinlined.args = passon_args
     afterblock.inputargs = [op.result] + afterblock.inputargs
     afterblock.operations = afterblock.operations[1:]
-    linkfrominlined = Link([copiedreturnblock.inputargs[0]] + passon_vars[graph_to_inline.returnblock], afterblock)
-    linkfrominlined.prevblock = copiedreturnblock
-    copiedreturnblock.exitswitch = None
-    copiedreturnblock.exits = [linkfrominlined]
-    assert copiedreturnblock.exits[0].target == afterblock
+    if graph_to_inline.returnblock in entrymap:
+        copiedreturnblock = copied_blocks[graph_to_inline.returnblock]
+        linkfrominlined = Link([copiedreturnblock.inputargs[0]] + passon_vars[graph_to_inline.returnblock], afterblock)
+        linkfrominlined.prevblock = copiedreturnblock
+        copiedreturnblock.exitswitch = None
+        copiedreturnblock.exits = [linkfrominlined]
+        assert copiedreturnblock.exits[0].target == afterblock
     if graph_to_inline.exceptblock in entrymap:
         #let links to exceptblock of the graph to inline go to graphs exceptblock
         copiedexceptblock = copied_blocks[graph_to_inline.exceptblock]

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	Wed Sep 14 10:16:29 2005
@@ -292,3 +292,20 @@
     interp = LLInterpreter(t.flowgraphs, t.rtyper)
     result = interp.eval_function(f, [])
     assert result is True
+
+def test_inline_raiseonly():
+    def f2(x):
+        raise KeyError
+    def f(x):
+        try:
+            return f2(x)
+        except KeyError:
+            return 42
+    t = Translator(f)
+    a = t.annotate([int])
+    a.simplify()
+    t.specialize()
+    inline_function(t, f2, t.flowgraphs[f])
+    interp = LLInterpreter(t.flowgraphs, t.rtyper)
+    result = interp.eval_function(f, [98371])
+    assert result == 42



More information about the Pypy-commit mailing list