ANN: H98 FFI Addendum 1.0, Release Candidate 9

Ross Paterson ross at soi.city.ac.uk
Mon Jun 9 19:00:20 EDT 2003


On Sun, Jun 08, 2003 at 09:06:07PM +1000, Manuel M T Chakravarty wrote:
> Ross Paterson <ross at soi.city.ac.uk> wrote,
> > On Wed, Jun 04, 2003 at 11:09:43PM +1000, Manuel M T Chakravarty wrote:
> > > StablePtr are used to export references to Haskell values to
> > > C, where they are treated as abstract data.  In C one
> > > traditionally uses (void *) for that purpose (see "man
> > > qsort(3)").  We want to make sure HsStablePtr is not to wide
> > > to be passed as an argument to C functions expecting such
> > > abstract types (such as qsort(3)).
> > 
> > How does HsStablePtr differ from HsDouble in this respect?
> > (except that the C side can do even less with
> > HsStablePtr.)
> 
> HsDouble is guaranteed to be one of C's floating types;
> hence, all operations on floating types can be applied on
> values of type HsDouble.

I meant to say that you can't pass an HsDouble to a "polymorphic" C
function expecting (void *), so why should you be able to pass an
HsStablePtr?  Maybe you're arguing that otherwise it couldn't be
passed to any legacy C function, whereas doubles can, though to
different ones.

> > You know it somehow corresponds to a pointer on the Haskell side,
> > but that doesn't seem relevant.
> 
> There is no guarantee whatsoever that HsStablePtr is a
> pointer on the Haskell side.  In GHC, stable pointers are
> integral indexes into a table of stable values.

Same in Hugs (though that's not a coincidence), which makes it all the
stranger that they're treated as pointers.



More information about the FFI mailing list