[pypy-svn] r61045 - pypy/branch/oo-jit/pypy/rpython/lltypesystem

fijal at codespeak.net fijal at codespeak.net
Fri Jan 16 18:07:44 CET 2009


Author: fijal
Date: Fri Jan 16 18:07:43 2009
New Revision: 61045

Modified:
   pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py
Log:
hack differently. Now we really cast underlaying object to C thingie, instead
of cheating. Saves us a segfault


Modified: pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py
==============================================================================
--- pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py	(original)
+++ pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py	Fri Jan 16 18:07:43 2009
@@ -49,6 +49,7 @@
         lltype.UniChar:  ctypes.c_uint,
         lltype.Bool:     ctypes.c_long, # XXX
         llmemory.Address:  ctypes.c_void_p,
+        llmemory.GCREF:    ctypes.c_void_p,
         })
 
 
@@ -193,8 +194,6 @@
     elif isinstance(T, lltype.OpaqueType):
         if T is lltype.RuntimeTypeInfo:
             return ctypes.c_char * 2
-        if T == llmemory.GCREF.TO:
-            return ctypes.c_void_p
         if T.hints.get('external', None) != 'C':
             raise TypeError("%s is not external" % T)
         return ctypes.c_char * T.hints['getsize']()
@@ -483,8 +482,10 @@
         if T is base_ptr_lltype():
             return new_opaque_object(llobj)
         if T == llmemory.GCREF:
-            return new_opaque_object(llobj._obj)
-        container = llobj._obj
+            container = llobj._obj.container
+            T = lltype.Ptr(lltype.typeOf(container))
+        else:
+            container = llobj._obj
         if isinstance(T.TO, lltype.FuncType):
             if llobj._obj in _all_callbacks:
                 return _all_callbacks[llobj._obj]
@@ -589,7 +590,7 @@
     if isinstance(T, lltype.Ptr):
         if not cobj:   # NULL pointer
             return lltype.nullptr(T.TO)
-        if T is base_ptr_lltype() or T == llmemory.GCREF:
+        if T is base_ptr_lltype():
             return _opaque_list[ctypes.cast(cobj, ctypes.c_void_p).value]
         if isinstance(T.TO, lltype.Struct):
             if T.TO._arrayfld is not None:



More information about the Pypy-commit mailing list