[cffi-devel] First stab at reviewing cffi-fsbv

Liam Healy lhealy at common-lisp.net
Mon Dec 12 05:26:12 UTC 2011


Hi Luis,

On Sun, Dec 11, 2011 at 8:36 PM, Luís Oliveira <luismbo at gmail.com> wrote:

> Hello,
>
> I went through all the code and here are my review notes. (In org-mode
> format.) I suggest we tackle them incrementally, not necessarily in
> this order. Meanwhile, I'll be tackling the missing bits in the new
> convert-into-foreign-memory. Should we be having this discussion in
> cffi-devel btw?
>

Sure.  I've copied the list for anyone who's interested.


> * cffi-fsbv.asd
>  What happens on #-unix?
>  (:cffi-grovel-file "libffi" :pathname #+unix "libffi-unix")
>

Absolutely nothing.  Someone named "CRLF0710" sent me an email claiming to
have a libffi-win32 for the old standalone version of FSBV, and I wrote
back saying I was interested but I've heard nothing.


> * fsbv/package.lisp
>  1. Regarding SIZET, I'd say we can define this type using a
>     keyword :SIZET.
>

Yes, if you think that's OK.  That was me totally sneaking something in
that GSLL needed that was awkward to generate there but that CFFI could
generate easily.


>  2. cffi-fsbv calls and hooks into so many of CFFI internals. Should
>     we just use the CFFI package? I mean, the code is full of ::s.
>

I'm fine with that.  I don't think there'll be any symbol conflicts.


>
> * fsbv/libffi-unix.lisp
>  1. OSX ships with libffi. Is (cc-flags "-I/opt/local/include/")
>     necessary? (I guess it doesn't hurt. Just curious. Perhaps it
>     didn't ship with libffi in the past?)
>

Ugh, OSX.  It apparently does ship with libffi, except when it doesn't.
There are so many ways to install system software, I just gave up.  I'm all
for your approach because it does simplify the code and make it match the
other OSes; when the complaints come in to cffi-devel, you can answer them
:-)


>
>  2. Aren't :uint and :ushort equivalent to:
>       (ctype ushort "unsigned short")
>       (ctype unsigned "unsigned")?
>

Um, I don't know?  What are you advocating here?  Removing something that I
put in?  :uint and :ushort don't ring a bell for me.


>
>  3. Do we really need to grovel this stuff? Grovelling requires a C
>     compiler which is particularly tricky on Windows. It'd be nice to
>     avoid that requirement if possible. Didn't see anything in here
>     that seemed to *require* grovelling. Did I miss something?
>

"Here" means libffi-unix?  The constants at the end aren't necessary, but I
think the rest is.  In particular, FFI_DEFAULT_ABI (abi) and FFI_OK
(status) are pretty critical, as is the struct ffi-type.  I'm a little
confused; I thought the point of cffi-grovel was to provide access to
definitions in .h files, and that's what we need for ffi.h and
ffi-target.h.  How do you propose defining these without groveling?  Just
hardwiring into lisp and hoping no one ever changes those values?

By the way I have FFI_STDCALL commented out and didn't try to mate it with
CFFI's definition on Windows, perhaps CRLF0710 or another Windows user can
figure that out.


> * fsbv/build-in-type.lisp
>  1. Could we use DEFCVAR here to declare the various ffi_type_*
>     globals? (I think it'd be slightly clearer.)
>

I kind of like the automatic way of doing it; manually means that every
time something changes (new type added or old one removed) you have to
remember to do it in two places.  That's a recipe for breakage.


>  2. Why do we have to cache pointers for FOREIGN-TYPE-ALIAS and
>     FOREIGN-ENUM? (But see my comments on fsbv/cstruct.lisp)
>

We probably don't.


>  3. Why different LIBFFI-TYPE-POINTER for those two types?
>     FOREIGN-ENUM inherits from FOREIGN-TYPE-ALIAS.
>

Is it really different, or is it just getting the pointer from the
underlying type?


> * fsbv/cstruct.lisp
>  1. slots-in-order should be moved near FOREIGN-STRUCT-TYPE.
>  2. I think we should move libffi-type-pointer out of FOREIGN-TYPE
>     and centralize storage in an hash-table.
>     a) this simplifies implementation a little bit: it's weird that
>        pretty much all libffi-type-pointer methods have :AROUND
>        qualifiers.
>     b) makes it easy to avoid memory leaks when redefining/reloading
>        structure types. (Although this sort of leak is probably not a
>        huge issue, it's certainly inelegant.)
>  3. The code that creates ffi_types for structs could use some
>     refactoring. :-) I'll give it a go.
>

Sure.


>
> * fsbv/functions.lisp
>  1. I think this file can benefit from a little bit of refactoring.
>  2. I *think* we can move the indirection logic from the translation
>     methods onto FFCALL-BODY-LIBFFI, but it's not yet clear how that
>     can happen.
>

Interesting thought, I'd like to hear your ideas.


>
> * fsbv/example.lisp
>  1. Need to clear the dead code and move it to examples/.
>

examples.lisp?  It's probably all dead code now, just get rid of the whole
thing.


>
> * src/functions.lisp
>  1. We can add a neat restart to *foreign-structures-by-value*.
>

Yes I think you mentioned this idea on the todo list.  I expect the restart
is "load cffi-libffi"?


>
> * src/structures.lisp
>  1. As I've mentioned before, we should discuss how we can implement
>     this sort of functionality in a backwards-compatible way.
>

I'd prefer not defaulting to previous assumptions (that is, no translation
of structures), if that's what backwards-compatible means.  But I'm
interested in how you'd approach this.

* src/early-types.lisp
>  1. missing expand-into-foreign-memory, and all the hooking up that
>     implies. Started working on that.
>  2. I think the :indirect keyword is delegating the responsibility to
>     the wrong place. All the type translations (in CFFI or in other
>     libraries) would have to be updated accordingly! As mentioned in
>     the fsbv/functions.lisp notes, I think we can handle the
>     indirection there. (It might require a slightly different way of
>     hooking up ffcall-body-libffi with foreign-funcall.)
>

No doubt.  I would like to avoid special-casing though, e.g. "here's an
enum, got to indirect it".  I think that kind of thing belongs in a method
associated with the type.


> * Nomenclature
>  I can forsee using libffi to deal with stuff like callbacks, long
>  long, varargs, etc. Should we rename cffi-fsbv to cffi-libffi?
>

Sure.  Also, you mentioned that some implementations have their own
call-by-value mechanism, so it makes more sense to rename it, since they
would have "fsbv" but no libffi.


>
> * Wishlist
> *** foreign-funcall-varargs and friends could use libffi
>    ... to do proper varargs.
> *** defcallbacks with structures...
>

Yup.

Liam

>
> --
> Luís Oliveira
> http://r42.eu/~luis/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20111212/cc3fa8d9/attachment.html>


More information about the cffi-devel mailing list