Hello lispers!
I know that CFFI doesn't support passing structs by value. What I'm wondering is, is it possible to squeeze in a small struct by instead passing it as an int (or something) of the same size as the struct?
Example:
struct MyStruct { int32 x, y; };
int myFunction(struct MyStruct s);
Could I force/lie to CFFI and declare 's' to be of type int64 and pass it that way?
I tried something similar, but then CFFI (well, ClozureCL) just couldn't resolve the function symbol..
With some test I found that it is indeed possible. The unresolved symbol problem was unrelated.
Thanks for listening! :-)
On Sun, Jul 27, 2008 at 12:20 PM, Markus Flambard markus@flambard.se wrote:
I know that CFFI doesn't support passing structs by value. What I'm wondering is, is it possible to squeeze in a small struct by instead passing it as an int (or something) of the same size as the struct?
On linux/x86, for instance, it's fairly straightforward to pass structs by value since all arguments are passed on the stack, word-aligned. For instance, given the following C code:
/* sizeof(s) => 12 */ struct s { char c; short s; int i; }; void f(char x, struct s y, short z);
f can be declared as:
(defcfun f :void (x :char) (y0 :int) (y1 :int) (z :short))
f(1, {2, 3, 4}, 5) is then equivalent to (f 1 #x00030002 4 5), or something like that. This works for any struct regardless of its size or its members' data types. Other architectures might have less straightforward calling conventions.