[project @ 2002-10-14 15:50:14 by sof]
[ghc-hetmet.git] / ghc / compiler / prelude / ForeignCall.lhs
index bceb024..81d5705 100644 (file)
@@ -1,3 +1,5 @@
+{-% DrIFT (Automatic class derivations for Haskell) v1.1 %-}
+{-% DrIFT (Automatic class derivations for Haskell) v1.1 %-}
 %
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
@@ -6,7 +8,7 @@
 \begin{code}
 module ForeignCall (
        ForeignCall(..),
-       Safety(..), playSafe,
+       Safety(..), playSafe, playThreadSafe,
 
        CExportSpec(..),
        CCallSpec(..), 
@@ -22,6 +24,7 @@ module ForeignCall (
 
 import CStrings                ( CLabelString, pprCLabelString )
 import FastString      ( FastString )
+import Binary
 import Outputable
 \end{code}
 
@@ -38,11 +41,12 @@ data ForeignCall
   | DNCall     DNCallSpec
   deriving( Eq )               -- We compare them when seeing if an interface
                                -- has changed (for versioning purposes)
+  {-! derive: Binary !-}
 
 -- We may need more clues to distinguish foreign calls
 -- but this simple printer will do for now
 instance Outputable ForeignCall where
-  ppr (CCall cc)      = ppr cc         
+  ppr (CCall cc)  = ppr cc             
   ppr (DNCall dn) = ppr dn
 \end{code}
 
@@ -52,18 +56,29 @@ data Safety
   = PlaySafe           -- Might invoke Haskell GC, or do a call back, or
                        -- switch threads, etc.  So make sure things are
                        -- tidy before the call
+       Bool            -- => True, external function is also re-entrant.
+                       --    [if supported, RTS arranges for the external call
+                       --    to be executed by a separate OS thread, i.e.,
+                       --    _concurrently_ to the execution of other Haskell threads.]
 
   | PlayRisky          -- None of the above can happen; the call will return
                        -- without interacting with the runtime system at all
   deriving( Eq, Show )
        -- Show used just for Show Lex.Token, I think
+  {-! derive: Binary !-}
 
 instance Outputable Safety where
-  ppr PlaySafe  = empty
+  ppr (PlaySafe False) = ptext SLIT("safe")
+  ppr (PlaySafe True)  = ptext SLIT("threadsafe")
   ppr PlayRisky = ptext SLIT("unsafe")
 
-playSafe PlaySafe  = True
-playSafe PlayRisky = False
+playSafe :: Safety -> Bool
+playSafe PlaySafe{} = True
+playSafe PlayRisky  = False
+
+playThreadSafe :: Safety -> Bool
+playThreadSafe (PlaySafe x) = x
+playThreadSafe _ = False
 \end{code}
 
 
@@ -78,12 +93,14 @@ data CExportSpec
   = CExportStatic              -- foreign export ccall foo :: ty
        CLabelString            -- C Name of exported function
        CCallConv
+  {-! derive: Binary !-}
 
 data CCallSpec
   =  CCallSpec CCallTarget     -- What to call
                CCallConv       -- Calling convention to use.
                Safety
   deriving( Eq )
+  {-! derive: Binary !-}
 \end{code}
 
 The call target:
@@ -94,6 +111,7 @@ data CCallTarget
   | DynamicTarget              -- First argument (an Addr#) is the function pointer
   | CasmTarget    CLabelString -- Inline C code (now seriously deprecated)
   deriving( Eq )
+  {-! derive: Binary !-}
 
 isDynamicTarget, isCasmTarget :: CCallTarget -> Bool
 isDynamicTarget DynamicTarget = True
@@ -118,11 +136,12 @@ platforms.
 
 \begin{code}
 data CCallConv = CCallConv | StdCallConv
-              deriving( Eq )
+  deriving (Eq)
+  {-! derive: Binary !-}
 
 instance Outputable CCallConv where
-  ppr StdCallConv = ptext SLIT("__stdcall")
-  ppr CCallConv   = ptext SLIT("_ccall")
+  ppr StdCallConv = ptext SLIT("stdcall")
+  ppr CCallConv   = ptext SLIT("ccall")
 
 defaultCCallConv :: CCallConv
 defaultCCallConv = CCallConv
@@ -170,10 +189,11 @@ instance Outputable CCallSpec where
 
 \begin{code}
 data DNCallSpec = DNCallSpec FastString
-                   deriving( Eq )
+  deriving (Eq)
+  {-! derive: Binary !-}
 
 instance Outputable DNCallSpec where
-  ppr (DNCallSpec s) = text "DotNet" <+> ptext s
+  ppr (DNCallSpec s) = char '"' <> ftext s <> char '"'
 \end{code}
 
 
@@ -191,3 +211,92 @@ okToExposeFCall :: ForeignCall -> Bool
 okToExposeFCall (CCall (CCallSpec target _ _)) = not (isCasmTarget target)
 okToExposeFCall other                                 = True
 \end{code}
+\begin{code}
+{-* Generated by DrIFT-v1.0 : Look, but Don't Touch. *-}
+instance Binary ForeignCall where
+    put_ bh (CCall aa) = do
+           putByte bh 0
+           put_ bh aa
+    put_ bh (DNCall ab) = do
+           putByte bh 1
+           put_ bh ab
+    get bh = do
+           h <- getByte bh
+           case h of
+             0 -> do aa <- get bh
+                     return (CCall aa)
+             _ -> do ab <- get bh
+                     return (DNCall ab)
+
+instance Binary Safety where
+    put_ bh (PlaySafe aa) = do
+           putByte bh 0
+           put_ bh aa
+    put_ bh PlayRisky = do
+           putByte bh 1
+    get bh = do
+           h <- getByte bh
+           case h of
+             0 -> do aa <- get bh
+                     return (PlaySafe aa)
+             _ -> do return PlayRisky
+
+instance Binary CExportSpec where
+    put_ bh (CExportStatic aa ab) = do
+           put_ bh aa
+           put_ bh ab
+    get bh = do
+         aa <- get bh
+         ab <- get bh
+         return (CExportStatic aa ab)
+
+instance Binary CCallSpec where
+    put_ bh (CCallSpec aa ab ac) = do
+           put_ bh aa
+           put_ bh ab
+           put_ bh ac
+    get bh = do
+         aa <- get bh
+         ab <- get bh
+         ac <- get bh
+         return (CCallSpec aa ab ac)
+
+instance Binary CCallTarget where
+    put_ bh (StaticTarget aa) = do
+           putByte bh 0
+           put_ bh aa
+    put_ bh DynamicTarget = do
+           putByte bh 1
+    put_ bh (CasmTarget ab) = do
+           putByte bh 2
+           put_ bh ab
+    get bh = do
+           h <- getByte bh
+           case h of
+             0 -> do aa <- get bh
+                     return (StaticTarget aa)
+             1 -> do return DynamicTarget
+             _ -> do ab <- get bh
+                     return (CasmTarget ab)
+
+instance Binary CCallConv where
+    put_ bh CCallConv = do
+           putByte bh 0
+    put_ bh StdCallConv = do
+           putByte bh 1
+    get bh = do
+           h <- getByte bh
+           case h of
+             0 -> do return CCallConv
+             _ -> do return StdCallConv
+
+instance Binary DNCallSpec where
+    put_ bh (DNCallSpec aa) = do
+           put_ bh aa
+    get bh = do
+         aa <- get bh
+         return (DNCallSpec aa)
+
+--  Imported from other files :-
+
+\end{code}