Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: kill-someobject
Changeset: r58013:99362c4bde4d
Date: 2012-10-11 20:12 +0200
http://bitbucket.org/pypy/pypy/changeset/99362c4bde4d/

Log:    (arigo, fijal) fix the annotation of isinstance

diff --git a/pypy/annotation/builtin.py b/pypy/annotation/builtin.py
--- a/pypy/annotation/builtin.py
+++ b/pypy/annotation/builtin.py
@@ -150,7 +150,7 @@
 
 
 def builtin_isinstance(s_obj, s_type, variables=None):
-    r = SomeBool() 
+    r = SomeBool()
     if s_type.is_constant():
         typ = s_type.const
         if issubclass(typ, pypy.rlib.rarithmetic.base_int):
@@ -189,7 +189,7 @@
         for variable in variables:
             assert bk.annotator.binding(variable) == s_obj
         r.knowntypedata = {}
-        if isinstance(s_type, SomePBC):
+        if isinstance(s_obj, SomeInstance) and isinstance(s_type, SomePBC):
             add_knowntypedata(r.knowntypedata, True, variables, 
bk.valueoftype(typ))
     return r
 
diff --git a/pypy/annotation/test/test_annrpython.py 
b/pypy/annotation/test/test_annrpython.py
--- a/pypy/annotation/test/test_annrpython.py
+++ b/pypy/annotation/test/test_annrpython.py
@@ -3790,6 +3790,24 @@
         s = a.build_types(fn, [annmodel.SomeChar()])
         assert s == annmodel.SomeChar()
 
+    def test_isinstance_double_const(self):
+        class X(object):
+            def _freeze_(self):
+                return True
+
+        x = X()
+        
+        def f(i):
+            if i:
+                x1 = x
+            else:
+                x1 = None
+            print "hello" # this is to force the merge of blocks
+            return isinstance(x1, X)
+
+        a = self.RPythonAnnotator()
+        s = a.build_types(f, [annmodel.SomeInteger()])
+        assert isinstance(s, annmodel.SomeBool)
 
 def g(n):
     return [0,1,2,n]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to