uhc-light-1.1.9.3: src/UHC/Light/Compiler/Foreign/Boxing.hs
module UHC.Light.Compiler.Foreign.Boxing
( UnboxedTy (..)
, Boxing (..)
, tyNmIsFFIOpaque, tyNmIsFFIEnumable
, tyNm2Boxing )
where
import Control.Applicative
import qualified Data.Map as Map
import Data.Maybe
import UHC.Util.Pretty
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Base.HsName.Builtin
import UHC.Light.Compiler.CodeGen.BuiltinSizeInfo
import UHC.Light.Compiler.Opts
import UHC.Light.Compiler.Ty
import UHC.Light.Compiler.Gam.DataGam
import Control.Monad
import UHC.Util.Binary
import UHC.Util.Serialize
{-# LINE 40 "src/ehc/Foreign/Boxing.chs" #-}
data UnboxedTy =
-- bitsize implicit variants
UnboxedTy_Int
| UnboxedTy_Node -- the default uniform boxed representation
| UnboxedTy_Word
| UnboxedTy_Ptr
-- Word variants, bitsize explicit
| UnboxedTy_Word8
| UnboxedTy_Word16
| UnboxedTy_Word32
| UnboxedTy_Word64
-- Int variants, bitsize explicit
| UnboxedTy_Int8
| UnboxedTy_Int16
| UnboxedTy_Int32
| UnboxedTy_Int64
-- Char variants, bitsize explicit
| UnboxedTy_Char8 -- non unicode char
-- String variants, bitsize explicit
| UnboxedTy_String8 -- non unicode char
-- Float variants
| UnboxedTy_Float
| UnboxedTy_Double
deriving (Eq,Ord,Enum)
{-# LINE 67 "src/ehc/Foreign/Boxing.chs" #-}
instance Show UnboxedTy where
show UnboxedTy_Int = "i"
show UnboxedTy_Node = "n"
show UnboxedTy_Word = "w"
show UnboxedTy_Ptr = "p"
show UnboxedTy_Word8 = "w08"
show UnboxedTy_Word16 = "w16"
show UnboxedTy_Word32 = "w32"
show UnboxedTy_Word64 = "w64"
show UnboxedTy_Int8 = "i08"
show UnboxedTy_Int16 = "i16"
show UnboxedTy_Int32 = "i32"
show UnboxedTy_Int64 = "i64"
show UnboxedTy_Char8 = "c08"
show UnboxedTy_String8 = "s08"
show UnboxedTy_Float = "f32"
show UnboxedTy_Double = "d64"
{-# LINE 87 "src/ehc/Foreign/Boxing.chs" #-}
instance PP UnboxedTy where
pp = pp . show
{-# LINE 96 "src/ehc/Foreign/Boxing.chs" #-}
-- | How to (un)box
data Boxing
= Boxing_UnboxedTy -- explicit unboxed ty
{ bxUnboxedTy :: UnboxedTy
}
| Boxing_Enum -- encoding for Enum -- ?? necessary
| Boxing_Opaque -- don't know anything, leave as is
deriving (Eq, Generic)
{-# LINE 107 "src/ehc/Foreign/Boxing.chs" #-}
instance Show Boxing where
show (Boxing_UnboxedTy t) = "#B" ++ show t
show Boxing_Enum = "#Be"
show Boxing_Opaque = "#Bo"
instance PP Boxing where
pp = pp . show
{-# LINE 121 "src/ehc/Foreign/Boxing.chs" #-}
-- | is type (name) living opaque w.r.t. ffi?
tyNmIsFFIOpaque :: DataGam -> HsName -> Bool
tyNmIsFFIOpaque dataGam t = maybe True null (dataGamTagsOfTyNm t dataGam)
-- | is type (name) Enumable, that is, representable by an Int?
tyNmIsFFIEnumable :: DataGam -> HsName -> Bool
tyNmIsFFIEnumable dataGam tn = maybe False dgiIsEnumable (dataGamLookup tn dataGam)
{-# LINE 131 "src/ehc/Foreign/Boxing.chs" #-}
-- | Get the boxing representation of a type
tyNm2Boxing :: EHCOpts -> DataGam -> HsName -> Boxing
tyNm2Boxing opts dataGam tyNm
| tyNmIsFFIEnumable dataGam tyNm = Boxing_Enum
| isJust mbUnbTy = Boxing_UnboxedTy unbTy
| tyNmIsFFIOpaque dataGam tyNm = Boxing_Opaque
| otherwise = Boxing_UnboxedTy UnboxedTy_Node
where mbUnbTy@(~(Just unbTy)) = Map.lookup tyNm unboxedTyMp1 <|> Map.lookup tyNm (unboxedTyMp2 opts)
{-# LINE 142 "src/ehc/Foreign/Boxing.chs" #-}
unboxedTyMp1 :: Map.Map HsName UnboxedTy
unboxedTyMp1
= Map.fromList
[ ( hsnInt
, UnboxedTy_Int
)
, ( hsnChar
, UnboxedTy_Char8
)
]
unboxedTyMp2 :: EHCOpts -> Map.Map HsName UnboxedTy
unboxedTyMp2 opts
= Map.fromList
[ ( ehcOptBuiltin opts ehbnPackedString
, UnboxedTy_String8
)
, ( ehcOptBuiltin opts ehbnWord
, UnboxedTy_Word
)
, ( ehcOptBuiltin opts ehbnInt8
, UnboxedTy_Int8
)
, ( ehcOptBuiltin opts ehbnInt16
, UnboxedTy_Int16
)
, ( ehcOptBuiltin opts ehbnInt32
, UnboxedTy_Int32
)
, ( ehcOptBuiltin opts ehbnInt64
, UnboxedTy_Int64
)
, ( ehcOptBuiltin opts ehbnWord8
, UnboxedTy_Word8
)
, ( ehcOptBuiltin opts ehbnWord16
, UnboxedTy_Word16
)
, ( ehcOptBuiltin opts ehbnWord32
, UnboxedTy_Word32
)
, ( ehcOptBuiltin opts ehbnWord64
, UnboxedTy_Word64
)
, ( ehcOptBuiltin opts ehbnDouble
, UnboxedTy_Double
)
, ( ehcOptBuiltin opts ehbnAddr
, UnboxedTy_Ptr
)
]
{-# LINE 204 "src/ehc/Foreign/Boxing.chs" #-}
deriving instance Typeable UnboxedTy
deriving instance Typeable Boxing
instance Serialize Boxing
{-# LINE 225 "src/ehc/Foreign/Boxing.chs" #-}
instance Serialize UnboxedTy where
sput = sputEnum8
sget = sgetEnum8