summaryrefslogtreecommitdiff
path: root/cffi/model.py
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2012-06-12 11:01:30 +0200
committerArmin Rigo <arigo@tunes.org>2012-06-12 11:01:30 +0200
commit8109c74dce4e9a95d63b15960978fc7311090681 (patch)
tree5d5c01cfa7569cf1ba7d4a10bdcbc603378c5d7a /cffi/model.py
parent837dde02d3ca8bba8c31b7e76883be98fac9943e (diff)
downloadcffi-linux-only.tar.gz
Finish the (non-partial) struct verification. For now useslinux-only
'typeof()', which is a gcc extension.
Diffstat (limited to 'cffi/model.py')
-rw-r--r--cffi/model.py32
1 files changed, 25 insertions, 7 deletions
diff --git a/cffi/model.py b/cffi/model.py
index 6df380a..a87f3f0 100644
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -27,7 +27,7 @@ class BaseType(object):
return self.new_backend_type(ffi, *args)
def verifier_declare_typedef(self, verifier, name):
- verifier.write('{ %s = (%s**)0; }' % (
+ verifier.write('__sametype__(%s, %s)' % (
self.get_c_name('** result'), name))
@@ -170,19 +170,37 @@ class StructType(StructOrUnion):
return ffi._backend.new_struct_type(self.name)
def verifier_declare_struct(self, verifier, name):
+ assert name == self.name
if self.partial:
- self.verifier_decl_partial(verifier, name)
+ self.verifier_decl_partial(verifier)
else:
- self.verifier_decl_notpartial(verifier, name)
+ self.verifier_decl_notpartial(verifier)
- def verifier_decl_notpartial(self, verifier, name):
+ def verifier_decl_notpartial(self, verifier):
if self.fldnames is None: # not partial, but fully opaque:
return # cannot really test even for existence
struct = verifier.ffi._get_cached_btype(self)
- verifier.write('__sameconstant__(sizeof(struct %s), %d)' % (
- name, verifier.ffi.sizeof(struct)))
+ verifier.write('{')
+ verifier.write('struct __aligncheck__ { char x; struct %s y; };' %
+ self.name)
+ verifier.write(
+ '__sameconstant__(sizeof(struct %s), %d)' % (
+ self.name, verifier.ffi.sizeof(struct)))
+ verifier.write(
+ '__sameconstant__(offsetof(struct __aligncheck__, y), %d)' % (
+ verifier.ffi.alignof(struct),))
+ for fname, ftype, fbitsize in zip(self.fldnames, self.fldtypes,
+ self.fldbitsize):
+ if fbitsize >= 0:
+ assert 0, "XXX: bitfield"
+ verifier.write('__sameconstant__(offsetof(struct %s, %s), %d)' % (
+ self.name, fname, verifier.ffi.offsetof(struct, fname)))
+ # XXX gcc only!
+ verifier.write('__sametype__(%s, typeof(((struct %s *)0)->%s))' % (
+ ftype.get_c_name('** result'), self.name, fname))
+ verifier.write('}')
- def verifier_decl_partial(self, verifier, name):
+ def verifier_decl_partial(self, verifier):
assert self.fldnames is not None
verifier.write('{')
verifier.write('struct __aligncheck__ { char x; struct %s y; };' %