[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