module BinIface ( writeBinIface, readBinIface, v_IgnoreHiWay ) where
#include "HsVersions.h"
-#include "MachDeps.h"
import HscTypes
import BasicTypes
import NewDemand
import IfaceSyn
import VarEnv
+import InstEnv ( OverlapFlag(..) )
import Packages ( PackageIdH(..) )
import Class ( DefMeth(..) )
import CostCentre
-import DriverState ( v_Build_tag )
-import CmdLineOpts ( opt_HiVersion )
+import StaticFlags ( opt_HiVersion, v_Build_tag )
import Kind ( Kind(..) )
import Panic
import Binary
import Util
import DATA_IOREF
-import DATA_WORD ( Word8 )
import EXCEPTION ( throwDyn )
import Monad ( when )
import Outputable
+#include "HsVersions.h"
+
-- ---------------------------------------------------------------------------
writeBinIface :: FilePath -> ModIface -> IO ()
writeBinIface hi_path mod_iface
put_ bh (show opt_HiVersion)
build_tag <- readIORef v_Build_tag
put bh build_tag
- put_ bh (WORD_SIZE_IN_BITS :: Word8)
put_ bh mod
put_ bh is_boot
put_ bh mod_vers
"mismatched interface file ways: expected "
++ build_tag ++ ", found " ++ check_way))
- check_ws <- get bh
- let our_ws = WORD_SIZE_IN_BITS :: Word8
- when (check_ws /= our_ws) $
- -- use userError because this will be caught by readIface
- -- which will emit an error msg containing the iface module name.
- throwDyn (ProgramError (
- "mismatched word size: expected "
- ++ show our_ws ++ ", found " ++ show check_ws))
-
mod_name <- get bh
is_boot <- get bh
mod_vers <- get bh
instance Binary IfaceTyCon where
-- Int,Char,Bool can't show up here because they can't not be saturated
- put_ bh IfaceListTc = putByte bh 1
- put_ bh IfacePArrTc = putByte bh 2
- put_ bh (IfaceTupTc bx ar) = do { putByte bh 3; put_ bh bx; put_ bh ar }
- put_ bh tc = pprPanic "BinIface.put:" (ppr tc) -- Dealt with by the IfaceType instance
+
+ put_ bh IfaceIntTc = putByte bh 1
+ put_ bh IfaceBoolTc = putByte bh 2
+ put_ bh IfaceCharTc = putByte bh 3
+ put_ bh IfaceListTc = putByte bh 4
+ put_ bh IfacePArrTc = putByte bh 5
+ put_ bh (IfaceTupTc bx ar) = do { putByte bh 6; put_ bh bx; put_ bh ar }
+ put_ bh (IfaceTc ext) = do { putByte bh 7; put_ bh ext }
get bh = do
h <- getByte bh
case h of
- 1 -> return IfaceListTc
- 2 -> return IfacePArrTc
- _ -> do { bx <- get bh; ar <- get bh; return (IfaceTupTc bx ar) }
+ 1 -> return IfaceIntTc
+ 2 -> return IfaceBoolTc
+ 3 -> return IfaceCharTc
+ 4 -> return IfaceListTc
+ 5 -> return IfacePArrTc
+ 6 -> do { bx <- get bh; ar <- get bh; return (IfaceTupTc bx ar) }
+ _ -> do { ext <- get bh; return (IfaceTc ext) }
instance Binary IfacePredType where
put_ bh (IfaceClassP aa ab) = do
put_ bh NoInfo = putByte bh 0
put_ bh (HasInfo i) = do
putByte bh 1
- lazyPut bh i
+ lazyPut bh i -- NB lazyPut
get bh = do
h <- getByte bh
case h of
0 -> return NoInfo
- _ -> do info <- lazyGet bh
+ _ -> do info <- lazyGet bh -- NB lazyGet
return (HasInfo info)
instance Binary IfaceInfoItem where
put_ bh idinfo
put_ bh (IfaceForeign ae af) =
error "Binary.put_(IfaceDecl): IfaceForeign"
- put_ bh (IfaceData a1 a2 a3 a4 a5 a6) = do
+ put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7) = do
putByte bh 2
put_ bh a1
put_ bh a2
put_ bh a4
put_ bh a5
put_ bh a6
+ put_ bh a7
put_ bh (IfaceSyn aq ar as at) = do
putByte bh 3
a4 <- get bh
a5 <- get bh
a6 <- get bh
- return (IfaceData a1 a2 a3 a4 a5 a6)
+ a7 <- get bh
+ return (IfaceData a1 a2 a3 a4 a5 a6 a7)
3 -> do
aq <- get bh
ar <- get bh
return (IfaceClass a1 a2 a3 a4 a5 a6 a7)
instance Binary IfaceInst where
- put_ bh (IfaceInst ty dfun) = do
- put_ bh ty
+ put_ bh (IfaceInst cls tys dfun flag orph) = do
+ put_ bh cls
+ put_ bh tys
put_ bh dfun
- get bh = do ty <- get bh
+ put_ bh flag
+ put_ bh orph
+ get bh = do cls <- get bh
+ tys <- get bh
dfun <- get bh
- return (IfaceInst ty dfun)
+ flag <- get bh
+ orph <- get bh
+ return (IfaceInst cls tys dfun flag orph)
+
+instance Binary OverlapFlag where
+ put_ bh NoOverlap = putByte bh 0
+ put_ bh OverlapOk = putByte bh 1
+ put_ bh Incoherent = putByte bh 2
+ get bh = do h <- getByte bh
+ case h of
+ 0 -> return NoOverlap
+ 1 -> return OverlapOk
+ 2 -> return Incoherent
instance Binary IfaceConDecls where
put_ bh IfAbstractTyCon = putByte bh 0
- put_ bh (IfDataTyCon st cs) = do { putByte bh 1
- ; put_ bh st
- ; put_ bh cs }
+ put_ bh (IfDataTyCon cs) = do { putByte bh 1
+ ; put_ bh cs }
put_ bh (IfNewTyCon c) = do { putByte bh 2
; put_ bh c }
get bh = do
h <- getByte bh
case h of
0 -> return IfAbstractTyCon
- 1 -> do st <- get bh
- cs <- get bh
- return (IfDataTyCon st cs)
+ 1 -> do cs <- get bh
+ return (IfDataTyCon cs)
_ -> do aa <- get bh
return (IfNewTyCon aa)
return (IfaceClassOp n def ty)
instance Binary IfaceRule where
- -- IfaceBuiltinRule should not happen here
- put_ bh (IfaceRule a1 a2 a3 a4 a5 a6) = do
+ put_ bh (IfaceRule a1 a2 a3 a4 a5 a6 a7) = do
put_ bh a1
put_ bh a2
put_ bh a3
put_ bh a4
put_ bh a5
put_ bh a6
+ put_ bh a7
get bh = do
a1 <- get bh
a2 <- get bh
a4 <- get bh
a5 <- get bh
a6 <- get bh
- return (IfaceRule a1 a2 a3 a4 a5 a6)
+ a7 <- get bh
+ return (IfaceRule a1 a2 a3 a4 a5 a6 a7)