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

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Sep 14 13:32:23 CEST 2007


Author: cfbolz
Date: Fri Sep 14 13:32:22 2007
New Revision: 46575

Modified:
   pypy/dist/pypy/rpython/ootypesystem/rstr.py
   pypy/dist/pypy/translator/backendopt/inline.py
   pypy/dist/pypy/translator/backendopt/test/test_inline.py
Log:
issue313 resolved

Fix the inlining bug: the inliner only considered calls to be raising in one
place.


Modified: pypy/dist/pypy/rpython/ootypesystem/rstr.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rstr.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rstr.py	Fri Sep 14 13:32:22 2007
@@ -202,11 +202,7 @@
         return sign * val
 
     def ll_float(ll_str):
-        # XXX workaround for an inlining bug
-        try:
-            return ootype.ooparse_float(ll_str)
-        except ValueError:
-            raise
+        return ootype.ooparse_float(ll_str)
     
     # interface to build strings:
     #   x = ll_build_start(n)

Modified: pypy/dist/pypy/translator/backendopt/inline.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/inline.py	(original)
+++ pypy/dist/pypy/translator/backendopt/inline.py	Fri Sep 14 13:32:22 2007
@@ -162,6 +162,14 @@
                 return True
         else:
             return True # conservatively
+    for block in from_graph.iterblocks():
+        if block.exitswitch == c_last_exception:
+            consider_ops_to = -1
+        else:
+            consider_ops_to = len(block.operations)
+        for op in block.operations[:consider_ops_to]:
+            if raise_analyzer.can_raise(op):
+                return True
     return False
 
 class BaseInliner(object):

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	Fri Sep 14 13:32:22 2007
@@ -65,7 +65,9 @@
         t.buildrtyper(type_system=self.type_system).specialize()
         return t
 
-    def check_inline(self, func, in_func, sig, entry=None, inline_guarded_calls=False):
+    def check_inline(self, func, in_func, sig, entry=None,
+                     inline_guarded_calls=False,
+                     graph=False):
         if entry is None:
             entry = in_func
         t = self.translate(entry, sig)
@@ -85,6 +87,8 @@
         interp = LLInterpreter(t.rtyper)
         def eval_func(args):
             return interp.eval_graph(graphof(t, entry), args)
+        if graph:
+            return eval_func, graphof(t, func)
         return eval_func
 
     def check_auto_inlining(self, func, sig, multiplier=None, call_count_check=False,
@@ -280,6 +284,19 @@
         result = eval_func([2])
         assert result == 87
 
+    def test_inline_with_raising_non_call_op(self):
+        class A:
+            pass
+        def f():
+            return A()
+        def g():
+            try:
+                a = f()
+            except MemoryError:
+                return 1
+            return 2
+        py.test.raises(CannotInline, self.check_inline, f, g, [])
+
     def test_inline_var_exception(self):
         def f(x):
             e = None



More information about the Pypy-commit mailing list