[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