
#11526: unsafeLookupStaticPtr should not live in IO -------------------------------------+------------------------------------- Reporter: edsko | Owner: Type: bug | Status: new Priority: normal | Milestone: 8.0.1 Component: Core Libraries | Version: 8.0.1-rc1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by ekmett): Replying to [comment:8 mboes]:
I think a reasonable compromise here is simply to have:
{{{ -- | Lookup in a static table constructed at compile time. unsafeLookupStaticPtr :: StaticKey -> Maybe (StaticPtr a)
-- | Lookup in the static table + an aux table that's initially empty but may grow if objects are dynamically loaded. unsafeLookupStaticPtrDL :: StaticKey -> IO (Maybe (StaticPtr a)) }}}
This is the approach we take in the `OpenGLRaw` package for detecting extensions. Yes, technically you ''might'' switch OpenGL contexts and change which ones are available over the life of a program, it isn't the common case, while branching on them is very common and is made nigh unusable, and needlessly slow, since they can't memoize this information if they are stuck in IO. One of hundreds of such examples: http://hackage.haskell.org/package/OpenGLRaw-3.1.0.0/docs/Graphics-GL-ARB- CullDistance.html -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11526#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler