[C2hs] Feature request: #pointer should add Storable instance
Björn Bringert
bringert at cs.chalmers.se
Mon Jun 4 09:59:28 EDT 2007
Björn Bringert wrote:
> Duncan Coutts wrote:
>> On Sat, 2007-06-02 at 18:31 +0200, Björn Bringert wrote:
>>> I'll just keep spamming this list with features I'm missing. I use
>>> #pointer to create newtypes, but I'm missing Storable instances for
>>> the produced newtypes. It's very nice to be able to use alloca, peek
>>> etc for passing pointers around.
>>>
>>> Even GHC can't derive Storable since the type is recursive, but it's
>>> easy to write the instance. Here's what I do now:
>>>
>>> {#pointer *SWIrecRecognizer as RecRecognizer newtype #}
>>>
>>> instance Storable RecRecognizer where
>>> sizeOf (RecRecognizer r) = sizeOf r
>>> alignment (RecRecognizer r) = alignment r
>>> peek p = fmap RecRecognizer (peek (castPtr p))
>>> poke p (RecRecognizer r) = poke (castPtr p) r
>>>
>>> c2hs could easily produce that Storable instance, and I can't see any
>>> reason not to.
>>
>> So this gives it a storable instance that interprets the newtype as a
>> pointer, but not as the thing pointed to? (which would be the usual
>> interpretation right?) I'm not sure I understand why you would want
>> this, and even if you did it'd prevent people doing the more normal
>> Storable instance for the thing pointed to. I'm clearly missing
>> something here.
>
> My main motivation for this is to be able to work with out-parameters
> which return these pointers. For example, I want to use a function like
> this one:
>
> int SWIrecRecognizerCreate (SWIrecRecognizer **rec);
>
> This function returns a pointer to the abstract type SWIrecRecognizer,
> by using an out-parameter. I want to be able to use this #fun
> declaration for it:
>
> {#fun recRecognizerCreate
> { alloca- `RecRecognizer' peek*} -> `Int' #}
>
> Without the Storable instance, I would have to do something like this
> (not tested):
>
> {#fun recRecognizerCreate
> { allocaRecRecognizer- `RecRecognizer' peekRecRecognizer*} -> `Int' #}
> where allocaRecRecognizer = allocaBytes {#sizeof RecRecognizer}
> peekRecRecognizer = liftM (RecRecognizer . castPtr) . peek
>
>
> My interpretation was that #pointer is used for abstract types whose
> internals you don't mess with from Haskell, but just pass around. Thus,
> the only thing you want to do with them is to store and retrieve the
> pointers, not the pointed-to objects. Maybe that's not always true, and
> in that case, producing a Storable instance like the above is wrong. It
> would be nice to have the option to do it though.
>
> /Björn
Hmm, I may be silly. Sometimes you want to allocate space for abstract
objects in Haskell code, and pass that to C code. Then you need a sizeOf
for the pointed-to object, not the pointer. I'll have to get back to you
on this.
/Björn
More information about the C2hs
mailing list