
On Mon, Nov 28, 2022 at 05:04:32PM +0100, Hécate wrote:
In a fit of madness I have found myself writing Haskell code where I need to implement a Storable instance. However, by virtue of not being a C programmer, I'm fairly lost on some of the details, especially the value of the sizeOf and alignment methods.
My Haskell-level record is the following:
data SignedMessage = SignedMessage { messageLength :: CSize , messageForeignPtr :: ForeignPtr CUChar , signatureForeignPtr :: ForeignPtr CUChar }
This is not the sort of object for which `Storable` makes sense. It holds ephemeral pointers to variable sized external data, and so cannot be serialised in a modest fixed-size memory block. The `Storable` class is for primitive data (Ints, Words, ...) and simple fixed layout structures consisting of same (e.g. various structures passed to, or returned by C system calls). When structures contain pointers to data, nested `peek` or `poke` calls (with associated memory allocations) may be needed to read or write the structure. To serialise your "SignedMessage" object you may need a higher-level serialisation format. ASN.1, protobufs, ... or (for a Haskell-only format) an instance of `Data.Binary.Binary` (rather than Storable). https://hackage.haskell.org/package/binary-0.10.0.0/docs/Data-Binary.html What's the use case here? -- Viktor.