[pypy-svn] r54816 - in pypy/branch/oo-jit/pypy: annotation rpython/test

antocuni at codespeak.net antocuni at codespeak.net
Sat May 17 12:34:32 CEST 2008


Author: antocuni
Date: Sat May 17 12:34:31 2008
New Revision: 54816

Modified:
   pypy/branch/oo-jit/pypy/annotation/binaryop.py
   pypy/branch/oo-jit/pypy/annotation/builtin.py
   pypy/branch/oo-jit/pypy/rpython/test/test_rclass.py
Log:
teach the annotator how to do union(SomeOOObject, SomeOOObject)



Modified: pypy/branch/oo-jit/pypy/annotation/binaryop.py
==============================================================================
--- pypy/branch/oo-jit/pypy/annotation/binaryop.py	(original)
+++ pypy/branch/oo-jit/pypy/annotation/binaryop.py	Sat May 17 12:34:31 2008
@@ -894,6 +894,7 @@
 # ____________________________________________________________
 # annotation of low-level types
 from pypy.annotation.model import SomePtr, SomeOOInstance, SomeOOClass
+from pypy.annotation.model import SomeOOObject
 from pypy.annotation.model import ll_to_annotation, annotation_to_lltype
 from pypy.rpython.ootypesystem import ootype
 
@@ -964,6 +965,10 @@
     def union((obj, r2)):
         return pair(r2, obj).union()
 
+class __extend__(pairtype(SomeOOObject, SomeOOObject)):
+    def union((r1, r2)):
+        assert r1.ootype is ootype.Object and r2.ootype is ootype.Object
+        return SomeOOObject()
 
 #_________________________________________
 # weakrefs

Modified: pypy/branch/oo-jit/pypy/annotation/builtin.py
==============================================================================
--- pypy/branch/oo-jit/pypy/annotation/builtin.py	(original)
+++ pypy/branch/oo-jit/pypy/annotation/builtin.py	Sat May 17 12:34:31 2008
@@ -574,7 +574,9 @@
 
 def cast_from_object(T, obj):
     TYPE = T.const
-    if isinstance(TYPE, ootype.Instance):
+    if TYPE is ootype.Object:
+        return T
+    elif isinstance(TYPE, ootype.Instance):
         return SomeOOInstance(TYPE)
     elif isinstance(TYPE, ootype.Record):
         return SomeOOInstance(TYPE) # XXX: SomeOORecord?

Modified: pypy/branch/oo-jit/pypy/rpython/test/test_rclass.py
==============================================================================
--- pypy/branch/oo-jit/pypy/rpython/test/test_rclass.py	(original)
+++ pypy/branch/oo-jit/pypy/rpython/test/test_rclass.py	Sat May 17 12:34:31 2008
@@ -811,9 +811,8 @@
         assert destrb is not None
         assert destra is not None
 
-    def test_cast_object(self):
+    def test_cast_object_instance(self):
         A = ootype.Instance("Foo", ootype.ROOT)
-        B = ootype.Record({'x': ootype.Signed}) 
 
         def fn_instance():
             a = ootype.new(A)
@@ -824,6 +823,9 @@
             assert a is a3
         self.interpret(fn_instance, [])
 
+    def test_cast_object_record(self):
+        B = ootype.Record({'x': ootype.Signed}) 
+
         def fn_record():
             b = ootype.new(B)
             b.x = 42
@@ -832,7 +834,11 @@
             assert b2.x == 42
             assert b is b2
         self.interpret(fn_record, [])
-       
+
+    def test_cast_object_null(self):
+        A = ootype.Instance("Foo", ootype.ROOT)
+        B = ootype.Record({'x': ootype.Signed}) 
+
         def fn_null():
             a = ootype.null(A)
             b = ootype.null(B)
@@ -843,6 +849,8 @@
             assert ootype.cast_from_object(B, obj2) == b
         self.interpret(fn_null, [])
 
+    def test_cast_object_is_true(self):
+        A = ootype.Instance("Foo", ootype.ROOT)
         def fn_is_true(flag):
             if flag:
                 a = ootype.new(A)
@@ -852,3 +860,15 @@
             return bool(obj)
         assert self.interpret(fn_is_true, [True]) is True
         assert self.interpret(fn_is_true, [False]) is False
+
+    def test_cast_object_mix_null(self):
+        A = ootype.Instance("Foo", ootype.ROOT)
+        def fn_mix_null(flag):
+            a = ootype.new(A)
+            obj = ootype.cast_to_object(a)
+            if flag:
+                return obj
+            else:
+                return ootype.NULL
+        res = self.interpret(fn_mix_null, [False])
+        assert res is ootype.NULL



More information about the Pypy-commit mailing list