ForeignObj and ForeignPtr
Simon Marlow
simonmar at microsoft.com
Tue May 1 11:28:16 EDT 2001
> In the course of trying to find out GHC's status quo of typing foreign
> declarations and scribbling together the forthcoming typing rules, I
> stumbled over ForeignObj/ForeignPtr. There was a lively
> discussion about
> this some time ago IIRC, but I'm unsure about a few things:
>
> * ForeignObj has been deprecated for a long time, but we
> should still
> keep it in the FFI for a transition time and pass the associated
> Addr when calling out, correct?
Yes, at least another major release or two.
> * Does it make sense to allow ForeignObj/ForeignPtr as a
> prim_result?
> I think it doesn't, because the non-Haskell side can't
> know if and
> when the finaliser has been run.
That's right, ForeignPtrs exist inside the Haskell world only. When a
ForeignPtr is passed outside, it is passed as a plain address, and an
address cannot be converted back to a ForeignPtr for returning to
Haskell.
> * What did we conclude about the lifetime rules? Should
> ForeignObj/ForeignPtr
> arguments be handled specially by the FFI or is
> {touch,with}Foreign{Obj,Ptr}
> required? I'd opt for the latter, but the current FFI
> docs seem to imply
> a special handling. :-P
I'd prefer to keep the "special" handling. Otherwise, we might as well
disallow ForeignPtrs as arguments to foreign import, because you'd end
up writing
withForeignObj f $ \ p -> c_fun p
all the time. Much simpler to make this automatic, and in some sense
the "special" behaviour is really the expected behaviour (or rather, the
alternative behaviour is simply not useful).
> On the other hand, I can't see anything
> special in the code generated by GHC. Hmmm...
That's because it got lost after some changes to the pre-code-generation
passes in GHC 5.00. It's on my list of things to fix.
Cheers,
Simon
More information about the FFI
mailing list