> SimonM: > > I can get it to fail another way too: > > > main = do > > p <- mallocBytes 64 > > newForeignPtr p (print x) > > print x > > where > > x = sum [1..10000]
Alastair: > The problem is probably this shared mutable variable used behind the > scenes in the implementation of the numeric show code > (hugs98/src/printer.c) > > static Cell out; /* GC'd var used by printer code */ > > [It's also used if you use the -u flag to use Hugs' builtin printer > instead of the Show function - but I don't think anyone does that > anymore and we could probably kill that code without anyone noticing > (???). (Unless, does Hood or some such use it?)] > > > I think all the functions affected return void so it'd be easy to > replace the global variable with a local which is threaded through > that set of functions. My impression is that the problem is more fundamental: the thunk for x is under evaluation when the finalizer begins to run, so it already has a bunch of stuff on the stack. The finalizer starts to run, and demands the value of x - probably we shouldn't get a crash, but a blackhole instead. Fixing it so that the evaluation of x is actually continued is what we want, but I can't see an easy way to do that. I suppose you could suspend either the finalizer or the main thread using the trick of saving its stack on the heap - is this implemented in Hugs? The only other solution I can think of is to delay finalizers until we get back up to the IO monad. Usual disclaimers apply: I have very little idea how the Hugs backend works, so there might be another way around this. Cheers, Simon _______________________________________________ FFI mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/ffi