On Sun, Sep 22, 2002 at 02:54:44PM +1000, Manuel M T Chakravarty wrote:
> Ross Paterson <[EMAIL PROTECTED]> wrote,
> 
> > Alastair Reid <[EMAIL PROTECTED]> wrote:
> > > I guess the issue is that if someone wanted to use MarshalAlloc.free
> > > as a finalizer they would not be able to do so.  Since we don't
> > > guarantee that MarshalAlloc.malloc is "stdio.h malloc", they couldn't 
> > > portably cons up a compatible &free.
> > 
> > Yes, you're trying to recover something that was lost with the change
> > to newForeignPtr.  Formerly one could allocate something with malloc
> > or mallocArray and add a finalizer that called free.  Now you can't,
> > except in the canned special case of mallocForeignPtr.  But there's
> > nothing similar for arrays, as required e.g. in Data.Array.Storable.
> 
> I think SimonM and Ross have a point here.  There isn't
> really anything gained from linking `MarshalAlloc.malloc' up
> with a C version of `MarshalAlloc.free'.  So, I think we
> should leave it as it is.

That wasn't what I was arguing.  Consider the following code from
Data.Array.Storable:

    newArray_ (l,u) = do
        a  <- mallocArray (rangeSize (l,u))
        fp <- newForeignPtr a (free a)
        return (StorableArray l u fp)

That's using the old type of newForeignPtr.  How can that be rewritten
using the new type, without Alastair's ptr_free?  I guess one could use
mallocForeignPtrBytes and duplicate the MarshalArray stuff, but that
seems ugly.

So Alastair's proposal gets back some of what was lost in the change of
newForeignPtr, though it's only a partial solution.  (It doesn't cover
the use in Text.Regex.Posix, for example.)
_______________________________________________
FFI mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/ffi

Reply via email to