[pypy-svn] r17619 - in pypy/dist/pypy: annotation translator/test
pedronis at codespeak.net
pedronis at codespeak.net
Sat Sep 17 18:21:36 CEST 2005
Author: pedronis
Date: Sat Sep 17 18:21:33 2005
New Revision: 17619
Modified:
pypy/dist/pypy/annotation/builtin.py
pypy/dist/pypy/translator/test/test_annrpython.py
Log:
fix isinstance constant propagation
Modified: pypy/dist/pypy/annotation/builtin.py
==============================================================================
--- pypy/dist/pypy/annotation/builtin.py (original)
+++ pypy/dist/pypy/annotation/builtin.py Sat Sep 17 18:21:33 2005
@@ -128,8 +128,9 @@
"for integers only isinstance(.,int|r_uint) are supported")
if s_obj.is_constant():
r.const = isinstance(s_obj.const, typ)
- elif our_issubclass(s_obj.knowntype, typ) and not s_obj.can_be_none():
- r.const = True
+ elif our_issubclass(s_obj.knowntype, typ):
+ if not s_obj.can_be_none():
+ r.const = True
elif not our_issubclass(typ, s_obj.knowntype):
r.const = False
elif s_obj.knowntype == int and typ == bool: # xxx this will explode in case of generalisation
Modified: pypy/dist/pypy/translator/test/test_annrpython.py
==============================================================================
--- pypy/dist/pypy/translator/test/test_annrpython.py (original)
+++ pypy/dist/pypy/translator/test/test_annrpython.py Sat Sep 17 18:21:33 2005
@@ -1715,7 +1715,22 @@
assert isinstance(s, annmodel.SomeIterator)
assert s.variant == ('items',)
-
+ def test_non_none_and_none_with_isinstance(self):
+ class A(object):
+ pass
+ class B(A):
+ pass
+ def g(x):
+ if isinstance(x, A):
+ return x
+ return None
+ def f():
+ g(B())
+ return g(None)
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [])
+ assert s.knowntype == B
+
def g(n):
return [0,1,2,n]
More information about the Pypy-commit
mailing list