ddc-core-salt-0.4.3.1: DDC/Core/Salt/Name/PrimCall.hs
module DDC.Core.Salt.Name.PrimCall
( PrimCall (..)
, readPrimCall)
where
import DDC.Data.Pretty
import Control.DeepSeq
import Data.Char
import Data.List
-- | Primitive ways of invoking a function,
-- where control flow returns back to the caller.
data PrimCall
-- | Perform a standard function call where the address is not
-- statically known. All the arguments are boxed heap objects.
= PrimCallStd Int
-- | Tailcall a statically known functions,
-- where the arguments can be boxed or unboxed.
| PrimCallTail Int
deriving (Eq, Ord, Show)
instance NFData PrimCall where
rnf (PrimCallStd i) = rnf i
rnf (PrimCallTail i) = rnf i
instance Pretty PrimCall where
ppr pc
= case pc of
PrimCallStd arity
-> text "call" <> int arity <> text "#"
PrimCallTail arity
-> text "tailcall" <> int arity <> text "#"
readPrimCall :: String -> Maybe PrimCall
readPrimCall str
-- callN#
| Just rest <- stripPrefix "call" str
, (ds, "#") <- span isDigit rest
, not $ null ds
, n <- read ds
, n >= 0
= Just $ PrimCallStd n
-- tailcallN#
| Just rest <- stripPrefix "tailcall" str
, (ds, "#") <- span isDigit rest
, not $ null ds
, n <- read ds
, n > 0
= Just $ PrimCallTail n
| otherwise
= Nothing