[pypy-svn] r17522 - in pypy/dist/pypy/translator: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Sep 13 12:19:58 CEST 2005
Author: arigo
Date: Tue Sep 13 12:19:57 2005
New Revision: 17522
Modified:
pypy/dist/pypy/translator/backendoptimization.py
pypy/dist/pypy/translator/test/test_backendoptimization.py
Log:
Fix for the crash. REVIEW: is the other call to
find_args_in_exceptional_case() also wrong in the same way?
Modified: pypy/dist/pypy/translator/backendoptimization.py
==============================================================================
--- pypy/dist/pypy/translator/backendoptimization.py (original)
+++ pypy/dist/pypy/translator/backendoptimization.py Tue Sep 13 12:19:57 2005
@@ -163,6 +163,7 @@
return funcs
def inline_function(translator, inline_func, graph):
+ count = 0
callsites = []
def find_callsites(block):
if isinstance(block, Block):
@@ -170,7 +171,10 @@
if not (op.opname == "direct_call" and
isinstance(op.args[0], Constant)):
continue
- if op.args[0].value._obj._callable is inline_func:
+ funcobj = op.args[0].value._obj
+ # accept a function or a graph as 'inline_func'
+ if (getattr(funcobj, 'graph', None) is inline_func or
+ getattr(funcobj, '_callable', None) is inline_func):
callsites.append((block, i))
traverse(find_callsites, graph)
while callsites != []:
@@ -179,6 +183,8 @@
callsites = []
traverse(find_callsites, graph)
checkgraph(graph)
+ count += 1
+ return count
def _find_exception_type(block):
#XXX slightly brittle: find the exception type for simple cases
@@ -197,13 +203,13 @@
def _inline_function(translator, graph, block, index_operation):
op = block.operations[index_operation]
- graph_to_inline = translator.flowgraphs[op.args[0].value._obj._callable]
+ graph_to_inline = op.args[0].value._obj.graph
exception_guarded = False
if (block.exitswitch == Constant(last_exception) and
index_operation == len(block.operations) - 1):
exception_guarded = True
- assert len(collect_called_functions(graph_to_inline)) == 0, (
- "can't handle exceptions yet")
+ if len(collect_called_functions(graph_to_inline)) != 0:
+ raise NotImplementedError("can't handle exceptions yet")
entrymap = mkentrymap(graph_to_inline)
beforeblock = block
afterblock = split_block(translator, graph, block, index_operation)
@@ -306,7 +312,7 @@
copiedblock = copied_blocks[link.prevblock]
copiedlink = copiedblock.exits[0]
eclass = _find_exception_type(copiedblock)
- print copiedblock.operations
+ #print copiedblock.operations
if eclass is None:
continue
etype = copiedlink.args[0]
@@ -315,7 +321,7 @@
if exc_match.value(eclass, exceptionlink.llexitcase):
copiedlink.target = exceptionlink.target
linkargs = find_args_in_exceptional_case(exceptionlink,
- copiedblock,
+ link.prevblock,
etype, evalue)
copiedlink.args = linkargs
break
Modified: pypy/dist/pypy/translator/test/test_backendoptimization.py
==============================================================================
--- pypy/dist/pypy/translator/test/test_backendoptimization.py (original)
+++ pypy/dist/pypy/translator/test/test_backendoptimization.py Tue Sep 13 12:19:57 2005
@@ -213,7 +213,7 @@
result = interp.eval_function(g, [-100])
assert result == -1
-def FAILING_test_for_loop():
+def test_for_loop():
def f(x):
result = 0
for i in range(0, x):
@@ -226,10 +226,11 @@
for graph in t.flowgraphs.values():
if graph.name.startswith('ll_rangenext'):
break
+ else:
+ assert 0, "cannot find ll_rangenext_*() function"
inline_function(t, graph, t.flowgraphs[f])
- t.view()
interp = LLInterpreter(t.flowgraphs, t.rtyper)
- result = interp.eval_function(g, [10])
+ result = interp.eval_function(f, [10])
assert result == 45
More information about the Pypy-commit
mailing list