[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