[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