[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