[Haskell-cafe] FFI ccall struct return by value on the stack?

David Kraeutmann kane at kane.cx
Tue Jun 16 15:24:04 UTC 2020


I've done this for some code, in both directions. 
(https://github.com/SimulaVR/godot-haskell/blob/simula/src/Godot/Gdnative/Internal/Gdnative.chs#L378 
<https://github.com/SimulaVR/godot-haskell/blob/simula/src/Godot/Gdnative/Internal/Gdnative.chs#L378>)

`Foo makeFoo(size_t x)` is internally equivalent (ABI-dependent, but at 
least on x64 Linux and WIndows) to `Foo* makeFoo(Foo* result, size_t 
x)`. Alloc the data in Haskell and use that definition.

On 2020-06-16 16:44, ☂Josh Chia (謝任中) wrote:
> Suppose I have the following C code:
>
> typedef struct Foo {
>     char* p1;  /* Some data on the heap. */
>     size_t s1; /* Size of data. */
>     char* p2;  /* More data on the heap. */
>     size_t s2;
> } Foo;
>
> /* Allocates and writes two pieces of data on the heap and returns 
> them in a Foo. */
> Foo makeFoo(size_t x);
>
> Based on my limited understanding of Haskell FFI according to the 
> Haskell 2010 Language Report 
> (https://www.haskell.org/onlinereport/haskell2010/haskellch8.html 
> <https://www.haskell.org/onlinereport/haskell2010/haskellch8.html>), 
> it is not possible to have a ccall for makeFoo() because Foo is not a 
> marshallable foreign result type. Is my understanding correct?
>
> However, I believe I can have a ccall if I change makeFoo() to either 
> of the following:
> Foo* makeFoo(size_t x);
> void makeFoo(Foo* out, size_t x);
>
> The first involves the C code allocating a Foo and returning a pointer 
> to it (so now there's one more pointer for the C code to deallocate 
> later in another function). The second involves the C code writing a 
> Foo value to a piece of memory allocated in Haskell (possibly using 
> Foreign.Marshall.Alloc.alloca). Both signatures work because Foo* is 
> marshallable but are clumsier to use than the original signature. Is 
> there just no way to return a struct by value on the stack? Is there a 
> cleaner way than the above two?
>
> Josh
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20200616/4b2a51d6/attachment.html>


More information about the Haskell-Cafe mailing list