[pypy-svn] r25278 - pypy/dist/pypy/rpython/rctypes

goden at codespeak.net goden at codespeak.net
Tue Apr 4 04:29:17 CEST 2006


Author: goden
Date: Tue Apr  4 04:29:14 2006
New Revision: 25278

Modified:
   pypy/dist/pypy/rpython/rctypes/rarray.py
   pypy/dist/pypy/rpython/rctypes/rpointer.py
Log:
refactored the rctypes pointer and array representations to use the CTypesRepr base class from rmodel.py



Modified: pypy/dist/pypy/rpython/rctypes/rarray.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/rarray.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/rarray.py	Tue Apr  4 04:29:14 2006
@@ -5,50 +5,43 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.annotation.pairtype import pairtype
 from pypy.rpython.rmodel import IntegerRepr
+from pypy.rpython.rctypes.rmodel import CTypesRepr
 
 ArrayType = type(ARRAY(c_int, 10))
 
-class ArrayRepr(Repr):
-    def __init__(self, rtyper, type):
+class ArrayRepr(CTypesRepr):
+    def __init__(self, rtyper, s_array):
+        array_ctype = s_array.knowntype
         
-        item_ctype = type._type_
-        self.length = type._length_
+        item_ctype = array_ctype._type_
+        self.length = array_ctype._length_
         
-        entry = extregistry.lookup_type(item_ctype)
-        # XXX: goden: So at this point item_ctype is a ctypes object.
-        #             I *think* we need to send a "SomeCTypesObject" box
-        #             to get the PrimitiveRepr instead of the ctypes object
-        #             itself.
-        self.r_item = entry.get_repr(rtyper, SomeCTypesObject(item_ctype,
-            SomeCTypesObject.OWNSMEMORY))
+        # Find the low-level repr of items using the extregistry
+        item_entry = extregistry.lookup_type(item_ctype)
+        self.r_item = item_entry.get_repr(rtyper, SomeCTypesObject(item_ctype,
+                                            SomeCTypesObject.OWNSMEMORY))
+
+        c_data_type = lltype.Array(self.r_item.ll_type,
+                                    hints={"nolength": True})
         
         # Array elements are of the low-level type (Signed, etc) and not 
         # of the boxed low level type (Ptr(GcStruct(...)))
-        self.lowleveltype = lltype.Ptr(
-            lltype.GcStruct( "CtypesGcArray_%s" % type.__name__,
-                ( "c_data", lltype.Array(self.r_item.ll_type, 
-                    hints={"nolength": True})
-                )
-            )
-        )
+
+        super(ArrayRepr, self).__init__(rtyper, s_array, c_data_type)
 
 class __extend__(pairtype(ArrayRepr, IntegerRepr)):
     def rtype_setitem((r_array, r_int), hop):
         v_array, v_index, v_item = hop.inputargs(r_array, lltype.Signed,
                 r_array.r_item.ll_type)
         inputargs = [v_array, hop.inputconst(lltype.Void, "c_data")]
-        v_c_data = hop.genop('getsubstruct',
-                    inputargs,
-                    lltype.Ptr(r_array.lowleveltype.TO.c_data) )
+        v_c_data = r_array.get_c_data(hop.llops, v_array)
         hop.genop('setarrayitem', [v_c_data, v_index, v_item])
 
     def rtype_getitem((r_array, r_int), hop):
         v_array, v_index = hop.inputargs(r_array, lltype.Signed)
 
         inputargs = [v_array, hop.inputconst(lltype.Void, "c_data")]
-        v_c_data = hop.genop('getsubstruct',
-                    inputargs,
-                    lltype.Ptr(r_array.lowleveltype.TO.c_data) )
+        v_c_data = r_array.get_c_data(hop.llops, v_array)
         return hop.genop('getarrayitem', [v_c_data, v_index],
                 r_array.r_item.ll_type)
 
@@ -70,6 +63,6 @@
     specialize_call=arraytype_specialize_call)
 
 def arraytype_get_repr(rtyper, s_array):
-    return ArrayRepr(rtyper, s_array.knowntype)
+    return ArrayRepr(rtyper, s_array)
 
 extregistry.register_metatype(ArrayType, get_repr=arraytype_get_repr)

Modified: pypy/dist/pypy/rpython/rctypes/rpointer.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/rpointer.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/rpointer.py	Tue Apr  4 04:29:14 2006
@@ -2,16 +2,14 @@
 from pypy.rpython import extregistry
 from pypy.rpython.lltypesystem import lltype
 from pypy.annotation import model as annmodel
+from pypy.rpython.rctypes.rmodel import CTypesRepr
 
 from ctypes import POINTER, c_int
 
-class PointerRepr(Repr):
-    """XXX: todo
-    """
+class PointerRepr(CTypesRepr):
     def __init__(self, rtyper, s_pointer, s_contents):
         self.s_pointer = s_pointer
         self.s_contents = s_contents
-        self.ctype = s_pointer.knowntype
         self.ref_ctype = s_contents.knowntype
 
         if not extregistry.is_registered_type(self.ref_ctype):
@@ -23,16 +21,7 @@
 
         ll_contents = lltype.Ptr(contents_repr.c_data_type)
 
-        self.lowleveltype = lltype.Ptr(
-            lltype.GcStruct("CtypesBox_%s" % (self.ctype.__name__,),
-                ("c_data",
-                    lltype.Struct("C_Data_%s" % (self.ctype.__name__),
-                        ('value', ll_contents)
-                    )
-                ),
-                ("keepalive", contents_repr.lowleveltype)
-            )
-        )
+        super(PointerRepr, self).__init__(rtyper, s_pointer, ll_contents)
 
 #def registerPointerType(ptrtype):
 #    """Adds a new pointer type to the extregistry.



More information about the Pypy-commit mailing list