From: Jules B. <ju...@je...> - 2008-03-14 10:39:55
|
Eric Y. Kow wrote: > Here's my implementation of it. Does it look sane to you? Any comments > from wxhaskell developers? > > withImageData :: Image a -> (Ptr () -> IO b) -> IO b > withImageData image f = do > pixels <- imageGetData image > x <- f pixels > x `seq` image `seq` return x > > The seqs are there out of pure superstition (i.e. Eric doesn't know how > Haskell works); basically, I want to make sure we're holding on to image > as long as we need to, so at least until we know what 'x' is. The x `seq` is likely pointless. "x" is a pure value and unless someone's cheating with unsafePerformIO, merely forcing a pure value can't cause any Ptr access to happen. the image `seq` looks like a reasonable hack to keep image alive. The canonical way would be "touchForeignPtr image" or to use "withForeignPtr image", except that image isn't a ForeignPtr exactly. I don't know if there is a good way to access the ForeignPtr inside image because I haven't grokked enough of wx yet. See http://www.haskell.org/ghc/docs/latest/html/libraries/base/Foreign-ForeignPtr.html for these and related issues. > > If this is indeed sane, we could stick it in wxcore and put a big > warning on the Haddocks for imageGetData (without removing it just > yet). And fix imageGetPixels to use the new safe withImageData. Which would have made my bug go away. Jules |