[pypy-svn] r26927 - in pypy/dist/pypy/rpython: lltypesystem lltypesystem/test test

arigo at codespeak.net arigo at codespeak.net
Sun May 7 12:40:33 CEST 2006


Author: arigo
Date: Sun May  7 12:40:32 2006
New Revision: 26927

Modified:
   pypy/dist/pypy/rpython/lltypesystem/lltype.py
   pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py
   pypy/dist/pypy/rpython/test/test_rptr.py
Log:
(arigo, pedronis) support for casts from opaque to opaque, likely needed
for the stackless transform.



Modified: pypy/dist/pypy/rpython/lltypesystem/lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lltype.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/lltype.py	Sun May  7 12:40:32 2006
@@ -646,9 +646,18 @@
           and isinstance(PTRTYPE.TO, OpaqueType)):
         return opaqueptr(PTRTYPE.TO, 'hidden', container = ptr._obj,
                                                solid     = ptr._solid)
+    elif (isinstance(CURTYPE.TO, OpaqueType)
+          and isinstance(PTRTYPE.TO, OpaqueType)):
+        try:
+            container = ptr._obj.container
+        except AttributeError:
+            raise RuntimeError("%r does not come from a container" % (ptr,))
+        return opaqueptr(PTRTYPE.TO, 'hidden',
+                         container = container,
+                         solid     = ptr._obj.solid)
     else:
-        raise TypeError("cast_opaque_ptr(): only between Opaque and "
-                        "non-Opaque")
+        raise TypeError("invalid cast_opaque_ptr(): %r -> %r" %
+                        (CURTYPE, PTRTYPE))
 
 def direct_fieldptr(structptr, fieldname):
     """Get a pointer to a field in the struct.  The resulting

Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_lltype.py	Sun May  7 12:40:32 2006
@@ -432,11 +432,14 @@
 
 def test_cast_opaque_ptr():
     O = GcOpaqueType('O')
+    Q = GcOpaqueType('Q')
     S = GcStruct('S', ('x', Signed))
     s = malloc(S)
     o = cast_opaque_ptr(Ptr(O), s)
     assert typeOf(o).TO == O
-    p = cast_opaque_ptr(Ptr(S), o)
+    q = cast_opaque_ptr(Ptr(Q), o)
+    assert typeOf(q).TO == Q
+    p = cast_opaque_ptr(Ptr(S), q)
     assert typeOf(p).TO == S
     assert p == s
     O1 = OpaqueType('O')

Modified: pypy/dist/pypy/rpython/test/test_rptr.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rptr.py	(original)
+++ pypy/dist/pypy/rpython/test/test_rptr.py	Sun May  7 12:40:32 2006
@@ -121,11 +121,13 @@
 
 def test_cast_opaque_ptr():
     O = GcOpaqueType('O')
+    Q = GcOpaqueType('Q')
     S = GcStruct('S', ('x', Signed))
     def fn():
         s = malloc(S)
         o = cast_opaque_ptr(Ptr(O), s)
-        p = cast_opaque_ptr(Ptr(S), o)
+        q = cast_opaque_ptr(Ptr(Q), o)
+        p = cast_opaque_ptr(Ptr(S), q)
         return p == s
     res = interpret(fn, [])
     assert res is True



More information about the Pypy-commit mailing list