cvs commit: hugs98/src HsFFI.h Makefile.in builtin.c connect.h ffi.c input.c iomonad.c machdep.c parser.y plugin.c prelude.h static.c storage.c storage.h type.c

reid 2002/06/14 07:41:15 PDT Modified files: src Makefile.in builtin.c connect.h ffi.c input.c iomonad.c machdep.c parser.y plugin.c prelude.h static.c storage.c storage.h type.c Added files: src HsFFI.h Log: Last of the ffi commits. Hopefully won't break anything... Here's how to test it on your machine: make && ./hugs -P../lib:../lib/exts: +G test.hs < /dev/null && cc -I. -shared ../lib/exts/MarshalAlloc.c -o ../lib/exts/MarshalAlloc.so && cc -I. -shared ../lib/exts/MarshalUtils.c -o ../lib/exts/MarshalUtils.so && cc -I. -shared ../lib/exts/Storable.c ../lib/exts/Storable_aux.c -o ../lib/exts/Storable.so && cc -I. -shared test.c -o test.so && ./hugs -P../lib:../lib/exts -H test.hs; stty sane after creating hugs98/src/test.hs containing: import Foreign import Exception import Prelude hiding (read) tests = do putStrLn "\nTesting sin==mysin (should return lots of Trues)" print testSin putStrLn "\nTesting errno" err <- peek errno putStrLn $ "errno == " ++ show err putStrLn "\nTesting puts (and withString)" withString0 "Test successful" puts putStrLn "\nTesting peekArray0" s <- withString0 "Test successful" (peekArray0 '\0') putStr s putStrLn "\nTesting open, read and close" s <- testRead "test.hs" 200 putStrLn s putStrLn "\nTesting open, write and close" testWrite "/tmp/test_write" "Test successful" putStrLn "\nTesting exit" exit 3 foreign import ccall "sin" mysin :: Double -> Double testSin = [ (sin x == mysin x) | x <- [0,0.01 .. 1] ] foreign import ccall safe "static stdlib.h &errno" errno :: Ptr Int withString s = bracket (newArray s) free withString0 s = bracket (newArray0 '\0' s) free withBuffer sz m = do b <- mallocArray sz sz' <- m b s <- peekArray sz' b free b return s foreign import ccall puts :: Ptr Char -> IO Int foreign import ccall "open" open' :: Ptr Char -> Int -> IO Int foreign import ccall "open" open2' :: Ptr Char -> Int -> Int -> IO Int foreign import ccall "creat" creat' :: Ptr Char -> Int -> IO Int foreign import ccall close :: Int -> IO Int foreign import ccall "read" read' :: Int -> Ptr Char -> Int -> IO Int foreign import ccall "write" write' :: Int -> Ptr Char -> Int -> IO Int creat s m = withString0 s $ \s' -> unix "creat" $ creat' s' m open s m = withString0 s $ \s' -> unix "open" $ open' s' m open2 s m n = withString0 s $ \s' -> unix "open2" $ open2' s' m n write fd s = withString0 s $ \s' -> unix "write" $ write' fd s' (length s) read fd sz = withBuffer sz $ \s' -> unix "read" $ read' fd s' sz unix s m = do x <- m if x < 0 then do err <- peek errno ioError $ userError $ s ++ ": " ++ show (x,err) else return x testRead fn sz = bracket (open fn 0) close (flip read sz) testWrite fn s = bracket (open2 fn (512+64+1) 511) close (flip write s) foreign import ccall exit :: Int -> IO () -- Various bits of rubbish. -- foreign import ccall "static stdlib.h exit" (***) :: Ptr Char -> Ptr Char -> IO Int -- -- foreign import ccall safe "static stdlib.h printf" (+++) :: Ptr Char -> Ptr Char -> IO Int -- foreign import ccall safe "static stdlib.h &errno" illegal_foo :: Ptr Int -- -- foreign import ccall safe "wrapper" illegal_bar :: Char -> IO (FunPtr Char) -- foreign import ccall safe "dynamic" illegal_baz :: FunPtr Char -> Char -- foreign export ccall "id_charstar" id :: Ptr Char -> Ptr Char Here's the changes: HsFFI.h Makefile.in HsFFI.h defines the ffi-mandated types. It really ought to be autoconfed (current settings suits an x86/gcc). Makefile updated to include HsFFI.h machdep.c prelude.h Int64 support static.c type.c parser.y input.c storage.c storage.h connect.h New syntax and related frontend changes. ffi.c Tweak code generator to match changes. Extend with many new ffi-supported types builtin.c iomonad.c plugin.c Runtime support. Big change is addition of HugsAPI4 and associated operations. This extends HugsAPI3 (greencard support) in the usual way. Note: I'd like to eliminate all direct greencard support and do a big cleanup ASAP. There's a lot of accumulated cruft in there. Revision Changes Path 1.13 +16 -16 hugs98/src/Makefile.in 1.24 +186 -37 hugs98/src/builtin.c 1.36 +17 -10 hugs98/src/connect.h 1.6 +281 -177 hugs98/src/ffi.c 1.43 +15 -39 hugs98/src/input.c 1.27 +15 -13 hugs98/src/iomonad.c 1.51 +47 -2 hugs98/src/machdep.c 1.33 +14 -44 hugs98/src/parser.y 1.5 +13 -36 hugs98/src/plugin.c 1.35 +4 -2 hugs98/src/prelude.h 1.70 +283 -225 hugs98/src/static.c 1.41 +16 -4 hugs98/src/storage.c 1.37 +26 -17 hugs98/src/storage.h 1.48 +33 -2 hugs98/src/type.c
participants (1)
-
Alastair Reid