[cffi-devel] Converting foreign structures with CFFI generic functions

Martin Simmons martin at lispworks.com
Fri Sep 9 16:55:19 UTC 2011


>>>>> On Thu, 8 Sep 2011 17:48:57 +0100, LuÍs Oliveira said:
> 
> On Thu, Sep 8, 2011 at 5:30 PM, Liam Healy <lnp at healy.washington.dc.us> wrote:
> > Why not defcstruct (suitably enhanced, of course) for everything?  I
> > don't want to preclude calling by reference those foreign structures I
> > also need to call by value.  So something that's called exclusively by
> > reference should work too.  If an application which only calls by
> > reference doesn't want to use the translators, we can leave them
> > undefined.
> 
> Right now (defcfun foo :void (x some-struct-type)) is identical to
> (defcfun foo :void (x (:pointer some-struct-type))). If you want to
> change the former to be call-by-value we need a backwards-incompatible
> change to DEFCSTRUCT such that a bare SOME-STRUCT-TYPE means
> call-by-value.

C has a separate namespace for struct/union tags, so a more complete
alternative is to use (:struct some-struct-type) everywhere (the LispWorks FLI
does this).

Passing the structure by value would be

(defcfun foo :void (x (:struct some-struct-type)))

and passing it by reference would be

(defcfun foo :void (x (:pointer (:struct some-struct-type))))

CFFI could retain the semantics of plain some-struct-type to mean (:pointer
some-struct-type) at the top level of defcfun and (:struct some-struct-type)
everywhere else, though it would still be broken by cases like this:

typedef double foo;
struct foo { int x; };
void foofoo(foo x, struct foo y);

__Martin




More information about the cffi-devel mailing list