Author: Armin Rigo <[email protected]>
Branch: cpy-extension
Changeset: r324:4bf2208474b2
Date: 2012-06-14 11:59 +0200
http://bitbucket.org/cffi/cffi/changeset/4bf2208474b2/
Log: Opaque structs.
diff --git a/cffi/model.py b/cffi/model.py
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -158,11 +158,15 @@
BType = self.get_btype(ffi)
ffi._cached_btypes[self] = BType
args = [BType]
- for tp in self.fldtypes:
- args.append(ffi._get_cached_btype(tp))
+ if self.fldtypes is not None:
+ for tp in self.fldtypes:
+ args.append(ffi._get_cached_btype(tp))
return args
def finish_backend_type(self, ffi, BType, *fldtypes):
+ if self.fldnames is None:
+ return BType # not completing it: it's an opaque struct
+ #
if self.fixedlayout is None:
lst = zip(self.fldnames, fldtypes, self.fldbitsize)
ffi._backend.complete_struct_or_union(BType, lst, self)
diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -224,6 +224,8 @@
# struct declarations
def generate_cpy_struct_decl(self, tp, name):
+ if tp.fldnames is None:
+ return # nothing to do with opaque structs
assert name == tp.name
prnt = self.prnt
prnt('static PyObject *')
@@ -286,10 +288,14 @@
prnt()
def generate_cpy_struct_method(self, tp, name):
+ if tp.fldnames is None:
+ return # nothing to do with opaque structs
self.prnt(' {"_cffi_struct_%s", _cffi_struct_%s, METH_NOARGS},' % (
name, name))
def loading_cpy_struct(self, tp, name, module):
+ if tp.fldnames is None:
+ return # nothing to do with opaque structs
assert name == tp.name
function = getattr(module, '_cffi_struct_%s' % name)
layout = function()
@@ -307,6 +313,8 @@
tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment
def loaded_cpy_struct(self, tp, name, module):
+ if tp.fldnames is None:
+ return # nothing to do with opaque structs
self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered
# ----------
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -138,6 +138,13 @@
py.test.raises(VerificationError, ffi.verify,
"typedef %s foo_t;" % real)
+def test_nondecl_struct():
+ ffi = FFI()
+ ffi.cdef("typedef struct foo_s foo_t; int bar(foo_t *);")
+ lib = ffi.verify("typedef struct foo_s foo_t;\n"
+ "int bar(foo_t *f) { return 42; }\n")
+ assert lib.bar(None) == 42
+
def test_missing_typedef():
py.test.skip("in-progress")
ffi = FFI()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit