FFI Bug - Finalizer always called with NULL pointer?
brianh at metamilk.com
Sat Apr 8 04:13:15 EDT 2006
When I use -O2 to compile, gcc gives a compilation error: too few arguments
to function "duma_releaseFont"
When I look at the ghc output with -ddump-cmm, this seems to be where the
// SNIP - all kinds of stuff here
call "ccall" suspendThread((BaseReg, NoHint))[(_c36U, NoHint)];
call "ccall" duma_releaseFont()[(_c36V, PtrHint)]; -- @@@@ MISSING ARG
call "ccall" resumeThread((_c36U, NoHint));
// SNIP more stuff
So ghc is not using supplying an argument when it should be supplying
duma_releaseFont with the raw pointer contained inside the ForeignPtr being
This also explains why the program crashes even with native compilation
So the bug is not that it is supplying a NULL arg but that it is not
supplying any arg in the first place.
I've also tried using addForeignPtrFinalizer instead but this doesn't help:
GHC is determined to not give the finalizer any argument.
createFont name pointSize bold italic underline = block $ do
fRaw <- (withCString name $ \cname ->
duma_createFont cname pointSize
bold italic underline)
f <- newForeignPtr_ fRaw
addForeignPtrFinalizer duma_releaseFont f -- no luck either
return $ Font f
More information about the Glasgow-haskell-users