Add a cabal flag to use the standard binary package

The standard binary package has improved efficiency and error handling [1], so
in the long run we should consider switching to it. At the moment, using it is
possible but not recommended, since it results in incomatible PGF files.

The modified modules from the binary package have been moved from
src/runtime/haskell to src/binary.

[1] http://lennartkolmodin.blogspot.se/2013/03/binary-07.html
This commit is contained in:
hallgren
2013-10-31 15:43:12 +00:00
parent a7a1563b79
commit 83a10ce25a
7 changed files with 61 additions and 21 deletions

View File

@@ -10,7 +10,7 @@ synopsis: Grammatical Framework
description: GF, Grammatical Framework, is a programming language for multilingual grammar applications description: GF, Grammatical Framework, is a programming language for multilingual grammar applications
homepage: http://www.grammaticalframework.org/ homepage: http://www.grammaticalframework.org/
bug-reports: http://code.google.com/p/grammatical-framework/issues/list bug-reports: http://code.google.com/p/grammatical-framework/issues/list
tested-with: GHC==7.4.2, GHC==7.6.2 tested-with: GHC==7.4.2, GHC==7.6.3
data-dir: src data-dir: src
data-files: www/*.html data-files: www/*.html
@@ -53,6 +53,10 @@ flag new-comp
Description: Make -new-comp the default Description: Make -new-comp the default
Default: True Default: True
flag custom-binary
Description: Use a customised version of the binary package
Default: True
library library
build-depends: base >= 4.2 && <5, build-depends: base >= 4.2 && <5,
array, array,
@@ -63,6 +67,19 @@ library
pretty, pretty,
mtl mtl
hs-source-dirs: src/compiler src/runtime/haskell hs-source-dirs: src/compiler src/runtime/haskell
if flag(custom-binary)
hs-source-dirs: src/binary
other-modules:
-- not really part of GF but I have changed the original binary library
-- and we have to keep the copy for now.
Data.Binary
Data.Binary.Put
Data.Binary.Get
Data.Binary.Builder
else
build-depends: binary
extensions: extensions:
exposed-modules: exposed-modules:
PGF PGF
@@ -94,13 +111,6 @@ library
GF.Data.ErrM GF.Data.ErrM
GF.Data.Relation GF.Data.Relation
GF.Data.Operations GF.Data.Operations
-- not really part of GF but I have changed the original binary library
-- and we have to keep the copy for now.
Data.Binary
Data.Binary.Put
Data.Binary.Get
Data.Binary.Builder
Data.Binary.IEEE754
executable gf executable gf
build-depends: base >= 4.2 && <5, build-depends: base >= 4.2 && <5,
@@ -143,6 +153,13 @@ executable gf
if impl(ghc>=7.0) if impl(ghc>=7.0)
ghc-options: -rtsopts ghc-options: -rtsopts
hs-source-dirs: src/compiler src/runtime/haskell hs-source-dirs: src/compiler src/runtime/haskell
if flag(custom-binary)
hs-source-dirs: src/binary
other-modules: Data.Binary.IEEE754
else
build-depends: binary, data-binary-ieee754
extensions: extensions:
main-is: GF.hs main-is: GF.hs
other-modules: other-modules:
@@ -221,7 +238,6 @@ executable gf
PGF.Binary PGF.Binary
PGF.Paraphrase PGF.Paraphrase
PGF.TypeCheck PGF.TypeCheck
PGF.Binary
PGF.Printer PGF.Printer
PGF.Optimize PGF.Optimize
GFC GFC

View File

@@ -7,7 +7,7 @@
-- --
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
module GF.Grammar.Binary where module GF.Grammar.Binary(decodeModule,decodeModuleHeader,encodeModule) where
import Prelude hiding (catch) import Prelude hiding (catch)
import Control.Exception(catch,ErrorCall(..),throwIO) import Control.Exception(catch,ErrorCall(..),throwIO)
@@ -28,7 +28,6 @@ import PGF.Binary
-- Please change this every time when the GFO format is changed -- Please change this every time when the GFO format is changed
gfoVersion = "GF02" gfoVersion = "GF02"
instance Binary Ident where instance Binary Ident where
put id = put (ident2bs id) put id = put (ident2bs id)
get = do bs <- get get = do bs <- get
@@ -295,13 +294,32 @@ instance Binary RawIdent where
put = put . rawId2bs put = put . rawId2bs
get = fmap rawIdentC get get = fmap rawIdentC get
putGFOVersion = mapM_ (putWord8 . fromIntegral . ord) gfoVersion --putGFOVersion = mapM_ (putWord8 . fromIntegral . ord) gfoVersion
getGFOVersion = replicateM (length gfoVersion) (fmap (chr . fromIntegral) getWord8) --getGFOVersion = replicateM (length gfoVersion) (fmap (chr . fromIntegral) getWord8)
--putGFOVersion = put gfoVersion
--getGFOVersion = get :: Get VersionMagic
data VersionTagged a = Tagged {unV::a} | WrongVersion
instance Binary a => Binary (VersionTagged a) where
put (Tagged a) = put (gfoBinVersion,a)
get = do ver <- get
if ver==gfoBinVersion
then fmap Tagged get
else return WrongVersion
gfoBinVersion = (b1,b2,b3,b4)
where [b1,b2,b3,b4] = map (toEnum.fromEnum) gfoVersion :: [Word8]
decodeModule :: FilePath -> IO SourceModule decodeModule :: FilePath -> IO SourceModule
decodeModule fpath = decodeFile' fpath (getGFOVersion >> get) decodeModule fpath = check =<< decodeFile' fpath
where
decodeModuleHeader fpath = decodeFile' fpath getVersionedMod check (Tagged m) = return m
check _ = fail ".gfo file version mismatch"
{-
decodeModuleHeader fpath = decodeFile_ fpath getVersionedMod
where where
getVersionedMod = do getVersionedMod = do
ver <- getGFOVersion ver <- getGFOVersion
@@ -309,13 +327,19 @@ decodeModuleHeader fpath = decodeFile' fpath getVersionedMod
then do (m,mtype,mstatus,mflags,mextend,mwith,mopens,med,msrc) <- get then do (m,mtype,mstatus,mflags,mextend,mwith,mopens,med,msrc) <- get
return (Just (m,ModInfo mtype mstatus mflags mextend mwith mopens med msrc Nothing Map.empty)) return (Just (m,ModInfo mtype mstatus mflags mextend mwith mopens med msrc Nothing Map.empty))
else return Nothing else return Nothing
--}
--{-
decodeModuleHeader fpath = fmap check $ decodeFile' fpath
where
check (Tagged (m,mtype,mstatus,mflags,mextend,mwith,mopens,med,msrc)) =
(Just (m,ModInfo mtype mstatus mflags mextend mwith mopens med msrc Nothing Map.empty))
check _ = Nothing
--}
encodeModule :: FilePath -> SourceModule -> IO () encodeModule :: FilePath -> SourceModule -> IO ()
encodeModule fpath mo = encodeModule fpath mo = encodeFile fpath (Tagged mo)
encodeFile_ fpath (putGFOVersion >> put mo)
-- | like decodeFile_ but adds file name to error message if there was an error -- | like 'decodeFile' but adds file name to error message if there was an error
decodeFile' fpath get = addFPath fpath (decodeFile_ fpath get) decodeFile' fpath = addFPath fpath (decodeFile fpath)
-- | Adds file name to error message if there was an error, -- | Adds file name to error message if there was an error,
-- | but laziness can cause errors to slip through -- | but laziness can cause errors to slip through