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