[pypy-svn] r14746 - in pypy/dist/pypy/rpython: . test

pedronis at codespeak.net pedronis at codespeak.net
Mon Jul 18 20:45:17 CEST 2005


Author: pedronis
Date: Mon Jul 18 20:45:14 2005
New Revision: 14746

Modified:
   pypy/dist/pypy/rpython/rbuiltin.py
   pypy/dist/pypy/rpython/rclass.py
   pypy/dist/pypy/rpython/test/test_rclass.py
Log:
fix isinstance(None, cls) behavior.



Modified: pypy/dist/pypy/rpython/rbuiltin.py
==============================================================================
--- pypy/dist/pypy/rpython/rbuiltin.py	(original)
+++ pypy/dist/pypy/rpython/rbuiltin.py	Mon Jul 18 20:45:14 2005
@@ -124,9 +124,7 @@
     
     v_obj, v_cls = hop.inputargs(instance_repr, class_repr)
 
-    v_objcls = hop.gendirectcall(rclass.ll_type, v_obj)
-    return hop.gendirectcall(rclass.ll_issubclass, v_objcls, v_cls)
-    
+    return hop.gendirectcall(rclass.ll_isinstance, v_obj, v_cls)
 
 #def rtype_builtin_range(hop): see rrange.py
 

Modified: pypy/dist/pypy/rpython/rclass.py
==============================================================================
--- pypy/dist/pypy/rpython/rclass.py	(original)
+++ pypy/dist/pypy/rpython/rclass.py	Mon Jul 18 20:45:14 2005
@@ -637,5 +637,11 @@
         subcls = subcls.parenttypeptr
     return True
 
+def ll_isinstance(obj, cls):
+    if not obj:
+        return False
+    obj_cls = ll_type(obj)
+    return ll_issubclass(obj_cls, cls)
+
 def ll_runtime_type_info(obj):
     return obj.typeptr.rtti

Modified: pypy/dist/pypy/rpython/test/test_rclass.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rclass.py	(original)
+++ pypy/dist/pypy/rpython/test/test_rclass.py	Mon Jul 18 20:45:14 2005
@@ -101,24 +101,26 @@
     assert res == 1
 
 def test_isinstance():
-    def a():
-        b = B()
-        return isinstance(b, A)
-    def b():
-        b = B()
-        return isinstance(b, B)
-    def c():
-        b = B()
-        return isinstance(b, C)
-
-    res = interpret(a, [])
-    assert res is True
+    def f(i):
+        if i == 0:
+            o = None
+        elif i == 1:
+            o = A()
+        elif i == 2:
+            o = B()
+        else:
+            o = C()
+        return 100*isinstance(o, A)+10*isinstance(o, B)+1*isinstance(o ,C)
 
-    res = interpret(b, [])
-    assert res is True
+    res = interpret(f, [1])
+    assert res == 100
+    res = interpret(f, [2])
+    assert res == 110
+    res = interpret(f, [3])
+    assert res == 111
 
-    res = interpret(c, [])
-    assert res is False
+    res = interpret(f, [0])
+    assert res == 0
 
 def test_method_used_in_subclasses_only():
     class A:



More information about the Pypy-commit mailing list