
I have been doing some work where i want `StablePtr`, but also to not be confined to `IO`. I saw the following comment in "compiler/prelude/PrimOp.hs": Question: Why @RealWorld@ - won't any instance of @_ST@ do the job? [ADR] It has been there for 20 years. What is the answer? If it is safe i'll send the patch generalizing these operations.

So something like
newtype StablePtr a = StablePtr (StablePtrST RealWorld a)?
I suppose that could work with some discipline. You have to assume that
foreign code doesn't pick its address out of a hat and so something silly,
but I guess you pretty much have to assume that anyway.
On Wed, Aug 21, 2019, 5:00 AM Matthew Farkas-Dyck
I have been doing some work where i want `StablePtr`, but also to not be confined to `IO`. I saw the following comment in "compiler/prelude/PrimOp.hs":
Question: Why @RealWorld@ - won't any instance of @_ST@ do the job? [ADR]
It has been there for 20 years. What is the answer? If it is safe i'll send the patch generalizing these operations. _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users

You also need to avoid inspecting the StablePtr itself, which is just a
number, to maintain purity. The whole thing is a bit weird. Why do you want
this anyway?
On Wed, Aug 21, 2019, 7:39 AM David Feuer
So something like
newtype StablePtr a = StablePtr (StablePtrST RealWorld a)?
I suppose that could work with some discipline. You have to assume that foreign code doesn't pick its address out of a hat and so something silly, but I guess you pretty much have to assume that anyway.
On Wed, Aug 21, 2019, 5:00 AM Matthew Farkas-Dyck
wrote: I have been doing some work where i want `StablePtr`, but also to not be confined to `IO`. I saw the following comment in "compiler/prelude/PrimOp.hs":
Question: Why @RealWorld@ - won't any instance of @_ST@ do the job? [ADR]
It has been there for 20 years. What is the answer? If it is safe i'll send the patch generalizing these operations. _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users

Our use case is unsafeCoercing a mutable reference to use as a key in an
IntMap. Our reasoning is that coercing an IORef/STRef is unsuitable because
the underlying MutVar# may move, invalidating the key (i.e., you cannot
safely coerce back if a GC has happened between insertion and reading). (If
that’s incorrect, do enlighten us!) This is a “very nice to have” for our
purposes—with the understanding that it’s wicked unsafe. ;)
On Tue, Aug 20, 2019, 18:09 David Feuer
You also need to avoid inspecting the StablePtr itself, which is just a number, to maintain purity. The whole thing is a bit weird. Why do you want this anyway?
On Wed, Aug 21, 2019, 7:39 AM David Feuer
wrote: So something like
newtype StablePtr a = StablePtr (StablePtrST RealWorld a)?
I suppose that could work with some discipline. You have to assume that foreign code doesn't pick its address out of a hat and so something silly, but I guess you pretty much have to assume that anyway.
On Wed, Aug 21, 2019, 5:00 AM Matthew Farkas-Dyck
wrote: I have been doing some work where i want `StablePtr`, but also to not be confined to `IO`. I saw the following comment in "compiler/prelude/PrimOp.hs":
Question: Why @RealWorld@ - won't any instance of @_ST@ do the job? [ADR]
It has been there for 20 years. What is the answer? If it is safe i'll send the patch generalizing these operations. _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users
participants (3)
-
David Feuer
-
Jon Purdy
-
Matthew Farkas-Dyck