From: Axel S. <A....@ke...> - 2005-03-26 09:29:05
|
On Fri, 2005-03-25 at 16:30 +0000, Duncan Coutts wrote: > All, > > Attached are a bunch of patches to use a GClosure-style framework for > signals. Nice. I guess this old stuff: > objectRef obj1 > obj1' <- liftM (fromGObject.mkGObject) $ > newForeignPtr obj1 (objectUnref obj1) could have been replaced with this: > makeNewGObject mkGObject (return obj1) >>= \obj1' -> before. I think that was before I had mkGObject. > I'm not sure what to do with U(CHAR) types. At the moment there are no > signals that use them so it's not an immediate problem. Aren't these Haskell Char? They must be unicode, otherwise they would have used INT8 or the like. > Here's mapping the implementation uses currently (hopefully > consistently!): > > C Type <-> Raw Haskell type <-> Haskell type > CHAR Char > UCHAR Int8 Word8?! It's unsigned. > ENUM Int Enum a => a -- this can't be right I think it is. The actual signal on... will instantiate the 'a' with a proper Enum type. > FLAGS Int Enum a => a -- this can't be right Flags a even. > STRING CString String I looked at your C code (and the comment). There must be something wrong with the memory management unless GHC copies the string. The pointer given by Gtk is alive (and may not be freed) until the signal handler exits. Hence, somebody must create a copy. > BOXED Ptr () (per type marhaling) > PTR Ptr () forall a. Ptr a > OBJECT Ptr () GObject > 64bit issues: > In C on a 64bit machine most systems leave Int as 32bit and make long be > 64bit. In Haskell (GHC at least) Int & Word becomes 64bit. So I guess > the code that converts Haskell Int to C Int needs to convert. Should it > give an error if the Haskell Int is too large? Normally the C 'int' is the native register size, i.e. 64 bits. It is on Solaris, perhaps not on amd64. I assume that it is the safest to make Int the same as int. > The rules for memory management for boxed types are also not clear to me > at the moment. Eg for Event structures. Boxed structures are not GObjects but are allocated on the heap. Since they are not GObjects, they are not reference-counted. Hence they need to be either copied or marshalled to Haskell before the function exits. Nice work, Axel. |