Author: Antonio Cuni <[email protected]>
Branch: ffistruct
Changeset: r47110:b8cb7ac0d45a
Date: 2011-09-06 16:33 +0200
http://bitbucket.org/pypy/pypy/changeset/b8cb7ac0d45a/

Log:    introduce the concept of _StructDescr, which describes the layout
        and ffitype of a structure

diff --git a/pypy/module/_ffi/__init__.py b/pypy/module/_ffi/__init__.py
--- a/pypy/module/_ffi/__init__.py
+++ b/pypy/module/_ffi/__init__.py
@@ -7,6 +7,7 @@
         'CDLL':    'interp_funcptr.W_CDLL',
         'FuncPtr': 'interp_funcptr.W_FuncPtr',
         'get_libc':'interp_funcptr.get_libc',
+        '_StructDescr': 'interp_struct.W__StructDescr',
     }
 
     appleveldefs = {
diff --git a/pypy/module/_ffi/app_struct.py b/pypy/module/_ffi/app_struct.py
--- a/pypy/module/_ffi/app_struct.py
+++ b/pypy/module/_ffi/app_struct.py
@@ -1,3 +1,5 @@
+import _ffi
+
 class Field(object):
 
     def __init__(self, name, ffitype):
@@ -13,7 +15,6 @@
     ## def __set__(self, obj, value):
     ##     setfield(obj._buffer, self.ffitype, self.offset, value)
 
-
 class MetaStructure(type):
 
     def __new__(cls, name, bases, dic):
@@ -26,13 +27,16 @@
         if fields is None:
             return
         size = 0
+        ffitypes = []
         for field in fields:
             field.offset = size # XXX: alignment!
             size += field.ffitype.sizeof()
+            ffitypes.append(field.ffitype)
             dic[field.name] = field
-        dic['_size_'] = size
+        alignment = 0 # XXX
+        struct_descr = _ffi._StructDescr(size, alignment, ffitypes)
+        dic['_struct_'] = struct_descr
 
 
 class Structure(object):
-
     __metaclass__ = MetaStructure
diff --git a/pypy/module/_ffi/test/test_struct.py 
b/pypy/module/_ffi/test/test_struct.py
--- a/pypy/module/_ffi/test/test_struct.py
+++ b/pypy/module/_ffi/test/test_struct.py
@@ -2,6 +2,13 @@
 
 class AppTestStruct(BaseAppTestFFI):
 
+    def test__StructDescr(self):
+        from _ffi import _StructDescr, types
+        longsize = types.slong.sizeof()
+        descr = _StructDescr(longsize*2, 0, [types.slong, types.slong])
+        assert descr.ffitype.sizeof() == longsize*2
+        assert repr(descr.ffitype) == '<ffi type <unknown struct>>'
+
     def test_compute_shape(self):
         from _ffi import Structure, Field, types
         class Point(Structure):
@@ -15,5 +22,4 @@
         assert isinstance(Point.y, Field)
         assert Point.x.offset == 0
         assert Point.y.offset == longsize
-        assert Point._size_ == longsize*2
-        
+        assert Point._struct_.ffitype.sizeof() == longsize*2
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to