packages feed

SSTG 0.1.1.6 → 0.1.1.7

raw patch · 7 files changed

+180/−161 lines, 7 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- SSTG.Core.Language.Typing: altType :: Alt -> Type
- SSTG.Core.Language.Typing: atomType :: Atom -> Type
- SSTG.Core.Language.Typing: dataConType :: DataCon -> Type
- SSTG.Core.Language.Typing: exprType :: Expr -> Type
- SSTG.Core.Language.Typing: litType :: Lit -> Type
- SSTG.Core.Language.Typing: primFunType :: PrimFun -> Type
- SSTG.Core.Language.Typing: varType :: Var -> Type
+ SSTG.Core.Execution.Support: HeapObj :: HeapObj -> HeapRhs
+ SSTG.Core.Execution.Support: HeapRedir :: MemAddr -> HeapRhs
+ SSTG.Core.Execution.Support: data HeapRhs
+ SSTG.Core.Execution.Support: instance GHC.Classes.Eq SSTG.Core.Execution.Support.HeapRhs
+ SSTG.Core.Execution.Support: instance GHC.Read.Read SSTG.Core.Execution.Support.HeapRhs
+ SSTG.Core.Execution.Support: instance GHC.Show.Show SSTG.Core.Execution.Support.HeapRhs
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.AlgTyRhs
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Alt
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.AltCon
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Atom
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.BindRhs
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Binds
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Coercion
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.DataCon
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Expr
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.PrimFun
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Program
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.TyBinder
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.TyCon
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Type
+ SSTG.Core.Language.Naming: instance SSTG.Core.Language.Naming.Nameable SSTG.Core.Language.Syntax.Var
+ SSTG.Core.Language.Typing: class Typeable a
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.Alt
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.Atom
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.DataCon
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.Expr
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.Lit
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.PrimFun
+ SSTG.Core.Language.Typing: instance SSTG.Core.Language.Typing.Typeable SSTG.Core.Language.Syntax.Var
+ SSTG.Core.Language.Typing: typeOf :: Typeable a => a -> Type
- SSTG.Core.Execution.Support: heapToList :: Heap -> [(MemAddr, Either MemAddr HeapObj)]
+ SSTG.Core.Execution.Support: heapToList :: Heap -> [(MemAddr, HeapRhs)]
- SSTG.Core.Execution.Support: insertGlobalsVal :: (Var, Val) -> Globals -> Globals
+ SSTG.Core.Execution.Support: insertGlobalsVal :: Var -> Val -> Globals -> Globals
- SSTG.Core.Execution.Support: insertHeapObj :: (MemAddr, HeapObj) -> Heap -> Heap
+ SSTG.Core.Execution.Support: insertHeapObj :: MemAddr -> HeapObj -> Heap -> Heap
- SSTG.Core.Execution.Support: insertHeapRedir :: (MemAddr, MemAddr) -> Heap -> Heap
+ SSTG.Core.Execution.Support: insertHeapRedir :: MemAddr -> MemAddr -> Heap -> Heap
- SSTG.Core.Execution.Support: insertLocalsVal :: (Var, Val) -> Locals -> Locals
+ SSTG.Core.Execution.Support: insertLocalsVal :: Var -> Val -> Locals -> Locals
- SSTG.Core.Language.Naming: allNames :: Program -> [Name]
+ SSTG.Core.Language.Naming: allNames :: Nameable a => a -> [Name]

Files

SSTG.cabal view
@@ -1,5 +1,5 @@ name:                SSTG-version:             0.1.1.6+version:             0.1.1.7 synopsis:            STG Symbolic Execution description:         Prototype of STG-based Symbolic Execution for Haskell. homepage:            https://github.com/AntonXue/SSTG#readme
src/SSTG/Core/Execution/Engine.hs view
@@ -149,7 +149,7 @@     actuals = traceArgs params expr locals globals heap     confs = map varName actuals     names' = freshSeededNames confs confs-    adjusted = map (\(n, t) -> Var n t) (zip names' (map varType actuals))+    adjusted = map (\(n, t) -> Var n t) (zip names' (map typeOf actuals))     -- Throw the parameters on heap as symbolic objects     sym_objs = map (\p -> SymObj (Symbol p Nothing)) adjusted     (heap', addrs) = allocHeapObjs sym_objs heap
src/SSTG/Core/Execution/Rules.hs view
@@ -86,9 +86,9 @@ liftUnInt (LiftAct var locals globals heap confs) = pass_out   where     sname = freshSeededName (varName var) confs-    svar = Var sname (varType var)+    svar = Var sname (typeOf var)     (heap', addr) = allocHeapObj (SymObj (Symbol svar Nothing)) heap-    globals' = insertGlobalsVal (var, MemVal addr) globals+    globals' = insertGlobalsVal var (MemVal addr) globals     confs' = sname : confs     pass_out = LiftAct addr locals globals' heap' confs' @@ -192,7 +192,7 @@     (mvar, addr, cvar, Alt acon expr) = args     params = case acon of { DataAlt _ ps -> ps ; _ -> [] }     snames = freshSeededNames (map varName params) confs-    svars = map (\(p, n) -> Var n (varType p)) (zip params snames)+    svars = map (\(p, n) -> Var n (typeOf p)) (zip params snames)     hobjs = map (\s -> SymObj (Symbol s Nothing)) svars     (heap', addrs) = allocHeapObjs hobjs heap     mem_vals = map MemVal addrs@@ -314,9 +314,9 @@   , Just (_, hobj) <- vlookupHeap sfun locals globals heap   , SymObj (Symbol svar _) <- hobj =     let sname = freshSeededName (varName svar) confs-        svar' = Var sname (foldl AppTy (varType svar) (map atomType args))-        sym = Symbol svar' (Just (FunApp sfun args, locals))-        (heap', addr) = allocHeapObj (SymObj sym) heap+        sres = Var sname (foldl AppTy (typeOf svar) (map typeOf args))+        sym_app = Symbol sres (Just (FunApp sfun args, locals))+        (heap', addr) = allocHeapObj (SymObj sym_app) heap     in Just (RuleFunAppSym             ,[state { state_heap = heap'                     , state_code = Return (MemVal addr)@@ -353,7 +353,7 @@   -- Rule Case Lit   | Evaluate (Case (Atom (LitAtom lit)) cvar alts) locals <- code   , (Alt _ expr):_ <- matchLitAlts lit alts =-    let locals' = insertLocalsVal (cvar, LitVal lit) locals+    let locals' = insertLocalsVal cvar (LitVal lit) locals     in Just (RuleCaseLit             ,[state { state_code = Evaluate expr locals' }]) @@ -372,7 +372,7 @@   | Evaluate (Case (Atom (LitAtom lit)) cvar alts) locals <- code   , [] <- matchLitAlts lit alts   , (Alt _ expr):_ <- defaultAlts alts =-    let locals' = insertLocalsVal (cvar, LitVal lit) locals+    let locals' = insertLocalsVal cvar (LitVal lit) locals     in Just (RuleCaseAnyLit             ,[state { state_code = Evaluate expr locals' }]) @@ -382,7 +382,7 @@   , ConObj dcon _ <- hobj   , [] <- matchDataAlts dcon alts   , (Alt _ expr):_ <- defaultAlts alts =-    let locals' = insertLocalsVal (cvar, MemVal addr) locals+    let locals' = insertLocalsVal cvar (MemVal addr) locals     in Just (RuleCaseAnyConPtr             ,[state { state_code = Evaluate expr locals' }]) @@ -417,7 +417,7 @@     let frame = UpdateFrame addr     in Just (RuleUpdateCThunk             ,[state { state_stack = pushStack frame stack-                    , state_heap = insertHeapObj (addr, Blackhole) heap+                    , state_heap = insertHeapObj addr Blackhole heap                     , state_code = Evaluate expr fun_locs }])    -- Rule Update Frame Delete Lit@@ -425,7 +425,7 @@   , Return (LitVal lit) <- code =     Just (RuleUpdateDLit          ,[state { state_stack = stack'-                 , state_heap = insertHeapObj (frm_addr, LitObj lit) heap+                 , state_heap = insertHeapObj frm_addr (LitObj lit) heap                  , state_code = Return (LitVal lit) }])    -- Rule Update Frame Delete Val Pointer@@ -435,7 +435,7 @@   , isHeapValForm hobj =     Just (RuleUpdateDValPtr          ,[state { state_stack = stack'-                 , state_heap = insertHeapRedir (frm_addr, addr) heap+                 , state_heap = insertHeapRedir frm_addr addr heap                  , state_code = Return (MemVal addr) }])    -- Rule Case Frame Create Case Non LitVal or MemVal@@ -460,9 +460,9 @@   , Just hobj <- lookupHeap addr heap   , isHeapValForm hobj =     let vname = freshSeededName (varName cvar) confs-        vvar = Var vname (varType cvar)+        vvar = Var vname (typeOf cvar)         cexpr = Case (Atom (VarAtom vvar)) cvar alts-        frm_locs' = insertLocalsVal (vvar, MemVal addr) frm_locs+        frm_locs' = insertLocalsVal vvar (MemVal addr) frm_locs     in Just (RuleCaseDValPtr             ,[state { state_stack = stack'                     , state_code = Evaluate cexpr frm_locs'@@ -501,7 +501,7 @@   , Just ftype <- memAddrType addr heap =     let fname = freshName VarNSpace confs         fvar = Var fname ftype-        frm_locs' = insertLocalsVal (fvar, MemVal addr) frm_locs+        frm_locs' = insertLocalsVal fvar (MemVal addr) frm_locs     in Just (RuleApplyDReturnFun             ,[state { state_stack = stack'                     , state_code = Evaluate (FunApp fvar args) frm_locs'@@ -513,11 +513,11 @@   , Just hobj <- lookupHeap addr heap   , SymObj (Symbol svar _) <- hobj =     let sname = freshSeededName (varName svar) confs-        svar' = Var sname (varType svar)-        frm_locs' = insertLocalsVal (svar', MemVal addr) frm_locs+        sfun = Var sname (typeOf svar)+        frm_locs' = insertLocalsVal sfun (MemVal addr) frm_locs     in Just (RuleApplyDReturnSym             ,[state { state_stack = stack'-                    , state_code = Evaluate (FunApp svar' args) frm_locs'+                    , state_code = Evaluate (FunApp sfun args) frm_locs'                     , state_names = sname : confs }])    -- State is Val Form
src/SSTG/Core/Execution/Support.hs view
@@ -16,6 +16,7 @@     , Val(..)     , Locals     , Heap+    , HeapRhs(..)     , HeapObj(..)     , Globals     , Code(..)@@ -139,9 +140,15 @@ -- | Heaps map `MemAddr` to `HeapObj`, while keeping track of the last address -- that was allocated. This allows us to consistently allocate fresh addresses -- on the `Heap`.-data Heap = Heap (M.Map MemAddr (Either MemAddr HeapObj)) MemAddr+data Heap = Heap (M.Map MemAddr HeapRhs) MemAddr           deriving (Show, Eq, Read) +-- | When we look up a `Heap`, we get an intermediary `MemAddr` for lookup+-- redirection, or just the `HeapObj` itself.+data HeapRhs = HeapRedir MemAddr+             | HeapObj HeapObj+             deriving (Show, Eq, Read)+ -- | Heap objects. data HeapObj = LitObj Lit              | SymObj Symbol@@ -209,6 +216,10 @@ stackToList :: Stack -> [Frame] stackToList (Stack frames) = frames +-- | `foldr` helper function that takes (A, B) into A -> B type inputs.+foldrPair :: (a -> b -> c -> c) -> (a, b) -> c -> c+foldrPair f (a, b) c = f a b c+ -- | Empty `Locals`. empty_locals :: Locals empty_locals = Locals M.empty@@ -218,12 +229,12 @@ lookupLocals var (Locals lmap) = M.lookup (varName var) lmap  -- | `Locals` insertion.-insertLocalsVal :: (Var, Val) -> Locals -> Locals-insertLocalsVal (k, v) (Locals lmap) = Locals (M.insert (varName k) v lmap)+insertLocalsVal :: Var -> Val -> Locals -> Locals+insertLocalsVal k v (Locals lmap) = Locals (M.insert (varName k) v lmap)  -- | List insertion into `Locals`. insertLocalsVals :: [(Var, Val)] -> Locals -> Locals-insertLocalsVals kvs locals = foldr insertLocalsVal locals kvs+insertLocalsVals kvs locals = foldr (foldrPair insertLocalsVal) locals kvs  -- | `Locals` to key value pairs. localsToList :: Locals -> [(Name, Val)]@@ -235,29 +246,29 @@  -- | `Heap` lookup. lookupHeap :: MemAddr -> Heap -> Maybe HeapObj-lookupHeap addr (Heap hmap prev) = case M.lookup addr hmap of-    Just (Left redir) -> lookupHeap redir (Heap hmap prev)-    Just (Right hobj) -> Just hobj+lookupHeap addr (Heap hmap p) = case M.lookup addr hmap of+    Just (HeapRedir redir) -> lookupHeap redir (Heap hmap p)+    Just (HeapObj hobj) -> Just hobj     Nothing -> Nothing  -- | `Heap` direct insertion at a specific `MemAddr`.-insertHeapObj :: (MemAddr, HeapObj) -> Heap -> Heap-insertHeapObj (k, v) (Heap hmap prev) = Heap (M.insert k (Right v) hmap) prev+insertHeapObj :: MemAddr -> HeapObj -> Heap -> Heap+insertHeapObj k v (Heap hmap p) = Heap (M.insert k (HeapObj v) hmap) p  -- | Insert a list of `HeapObj` at specified `MemAddr` locations. insertHeapObjs :: [(MemAddr, HeapObj)] -> Heap -> Heap-insertHeapObjs kvs heap = foldr insertHeapObj heap kvs+insertHeapObjs kvs heap = foldr (foldrPair insertHeapObj) heap kvs  -- | Insert a redirection `MemAddr` into the `Heap`.-insertHeapRedir :: (MemAddr, MemAddr) -> Heap -> Heap-insertHeapRedir (a, r) (Heap hmap prev) = Heap (M.insert a (Left r) hmap) prev+insertHeapRedir :: MemAddr -> MemAddr -> Heap -> Heap+insertHeapRedir a r (Heap hmap p) = Heap (M.insert a (HeapRedir r) hmap) p  -- | `Heap` allocation. Updates the last `MemAddr` kept in the `Heap`. allocHeapObj :: HeapObj -> Heap -> (Heap, MemAddr)-allocHeapObj hobj (Heap hmap prev) = (heap', addr)+allocHeapObj hobj (Heap hmap p) = (heap', addr)   where-    addr = MemAddr ((memAddrInt prev) + 1)-    heap' = insertHeapObj (addr, hobj) (Heap hmap addr)+    addr = MemAddr ((memAddrInt p) + 1)+    heap' = insertHeapObj addr hobj (Heap hmap addr)  -- | Allocate a list of `HeapObj` in a `Heap`, returning in the same order the -- `MemAddr` at which they have been allocated at.@@ -269,7 +280,7 @@     (heapf, as) = allocHeapObjs hs heap'  -- | `Heap` to key value pairs.-heapToList :: Heap -> [(MemAddr, Either MemAddr HeapObj)]+heapToList :: Heap -> [(MemAddr, HeapRhs)] heapToList (Heap hmap _) = M.toList hmap  -- | Empty `Globals`.@@ -281,14 +292,14 @@ lookupGlobals var (Globals gmap) = M.lookup (varName var) gmap  -- | `Globals` insertion.-insertGlobalsVal :: (Var, Val) -> Globals -> Globals-insertGlobalsVal (k, v) (Globals gmap) = Globals (M.insert (varName k) v gmap)+insertGlobalsVal :: Var -> Val -> Globals -> Globals+insertGlobalsVal k v (Globals gmap) = Globals (M.insert (varName k) v gmap)  -- | Insert a list of `Var` and `Val` pairs into `Globals`. This would -- typically occur for new symbolic variables created from uninterpreted / -- out-of-scope variables during runtime. insertGlobalsVals :: [(Var, Val)] -> Globals -> Globals-insertGlobalsVals kvs globals = foldr insertGlobalsVal globals kvs+insertGlobalsVals kvs globals = foldr (foldrPair insertGlobalsVal) globals kvs  -- | `Globals` to key value pairs. globalsToList :: Globals -> [(Name, Val)]@@ -331,9 +342,9 @@ memAddrType addr heap = do     hobj <- lookupHeap addr heap     case hobj of-        LitObj lit -> Just (litType lit)-        SymObj (Symbol svar _) -> Just (varType svar)-        ConObj dcon _ -> Just (dataConType dcon)-        FunObj ps ex _ -> Just (foldr FunTy (exprType ex) (map varType ps))+        LitObj lit -> Just (typeOf lit)+        SymObj (Symbol svar _) -> Just (typeOf svar)+        ConObj dcon _ -> Just (typeOf dcon)+        FunObj ps expr _ -> Just (foldr FunTy (typeOf expr) (map typeOf ps))         Blackhole -> Just Bottom 
src/SSTG/Core/Language/Naming.hs view
@@ -16,99 +16,103 @@ import qualified Data.List as L import qualified Data.Set as S --- | All `Name`s in a `State`.-allNames :: Program -> [Name]-allNames (Program bindss) = concatMap bindsNames bindss+-- | Nameable typeclass.+class Nameable a where+    allNames :: a -> [Name] --- | `Name`s in a `Binds`.-bindsNames :: Binds -> [Name]-bindsNames (Binds _ kvs) = lhs ++ rhs-  where-    lhs = concatMap (varNames . fst) kvs-    rhs = concatMap (bindRhsNames . snd) kvs+-- | `Program` instance of `Nameable`.+instance Nameable Program where+    allNames (Program bindss) = concatMap allNames bindss --- | A `Var`'s `Name`. Not to be confused with the other function.-varName :: Var -> Name-varName (Var name _) = name+-- | `Binds` instance of `Nameable`+instance Nameable Binds where+    allNames (Binds _ kvs) = lhs ++ rhs+      where+        lhs = concatMap (allNames . fst) kvs+        rhs = concatMap (allNames . snd) kvs --- | `Name`s in a `Var`.-varNames :: Var -> [Name]-varNames (Var name ty) = name : typeNames ty+-- | `Var` instance of `Nameable`+instance Nameable Var where+    allNames (Var name ty) = name : allNames ty --- | `Name`s in a `BindRhs`.-bindRhsNames :: BindRhs -> [Name]-bindRhsNames (FunForm prms expr) = concatMap varNames prms ++ exprNames expr-bindRhsNames (ConForm dcon as) = dataConNames dcon ++ concatMap atomNames as+-- | `BindRhs` instance of `Nameable`+instance Nameable BindRhs where+    allNames (FunForm prms expr) = concatMap allNames prms ++ allNames expr+    allNames (ConForm dcon as) = allNames dcon ++ concatMap allNames as --- | `Name`s in an `Expr`.-exprNames :: Expr -> [Name]-exprNames (Atom atom) = atomNames atom-exprNames (Let binds expr) = exprNames expr ++ bindsNames binds-exprNames (FunApp fun args) = varNames fun ++ concatMap atomNames args-exprNames (PrimApp pfun args) = primFunNames pfun ++ concatMap atomNames args-exprNames (ConApp dcon args) = dataConNames dcon ++ concatMap atomNames args-exprNames (Case expr var alts) = exprNames expr ++ concatMap altNames alts-                                                ++ varNames var+-- | `Expr` instance of `Nameable`+instance Nameable Expr where+    allNames (Atom atom) = allNames atom+    allNames (Let binds expr) = allNames expr ++ allNames binds+    allNames (FunApp fun args) = allNames fun ++ concatMap allNames args+    allNames (PrimApp pfun args) = allNames pfun ++ concatMap allNames args+    allNames (ConApp dcon args) = allNames dcon ++ concatMap allNames args+    allNames (Case expr var alts) = allNames expr ++ concatMap allNames alts+                                                  ++ allNames var --- | `Name`s in an `Atom`.-atomNames :: Atom -> [Name]-atomNames (LitAtom _) = []-atomNames (VarAtom var) = varNames var+-- | `Atom` instance of `Nameable`+instance Nameable Atom where+    allNames (LitAtom _) = []+    allNames (VarAtom var) = allNames var --- | `Name`s in a `PrimFun`.-primFunNames :: PrimFun -> [Name]-primFunNames (PrimFun name ty) = name : typeNames ty+-- | `PrimFun` instance of `Nameable`+instance Nameable PrimFun where+    allNames (PrimFun name ty) = name : allNames ty --- | `Name`s in a `DataCon`.-dataConNames :: DataCon -> [Name]-dataConNames (DataCon name ty tys) = name : concatMap typeNames (ty : tys)+-- | `DataCon` instance of `Nameable`+instance Nameable DataCon where+    allNames (DataCon name ty tys) = name : concatMap allNames (ty : tys) --- | `Name`s in an `Alt`.-altNames :: Alt -> [Name]-altNames (Alt acon expr) = altConNames acon ++ exprNames expr+-- | `Alt` instance of `Nameable`+instance Nameable Alt where+    allNames (Alt acon expr) = allNames acon ++ allNames expr --- | `Name`s in an `AltCon`.-altConNames :: AltCon -> [Name]-altConNames (DataAlt dcon ps) = dataConNames dcon ++ concatMap varNames ps-altConNames _ = []+-- | `AltCon` instance of `Nameable`+instance Nameable AltCon where+    allNames (DataAlt dcon ps) = allNames dcon ++ concatMap allNames ps+    allNames _ = [] --- | `Name`s in a `Type`.-typeNames :: Type -> [Name]-typeNames (TyVarTy var) = varNames var-typeNames (AppTy ty1 ty2) = typeNames ty1 ++ typeNames ty2-typeNames (ForAllTy bndr ty) = typeNames ty ++ tyBinderNames bndr-typeNames (FunTy ty1 ty2) = typeNames ty1 ++ typeNames ty2-typeNames (TyConApp tycon ty) = tyConNames tycon ++ concatMap typeNames ty-typeNames (CoercionTy coer) = coercionNames coer-typeNames (CastTy ty coer) = typeNames ty ++ coercionNames coer-typeNames (LitTy _) = []-typeNames (Bottom) = []+-- | `Type` instance of `Nameable`+instance Nameable Type where+    allNames (TyVarTy var) = allNames var+    allNames (AppTy ty1 ty2) = allNames ty1 ++ allNames ty2+    allNames (ForAllTy bndr ty) = allNames ty ++ allNames bndr+    allNames (FunTy ty1 ty2) = allNames ty1 ++ allNames ty2+    allNames (TyConApp tycon ty) = allNames tycon ++ concatMap allNames ty+    allNames (CoercionTy coer) = allNames coer+    allNames (CastTy ty coer) = allNames ty ++ allNames coer+    allNames (LitTy _) = []+    allNames (Bottom) = [] --- | `Name`s in a `TyBinder`.-tyBinderNames :: TyBinder -> [Name]-tyBinderNames (AnonTyBndr) = []-tyBinderNames (NamedTyBndr name) = [name]+-- | `TyBinder` instance of `Nameable`+instance Nameable TyBinder where+    allNames (AnonTyBndr) = []+    allNames (NamedTyBndr name) = [name] --- | `Name`s in a `TyCon`.-tyConNames :: TyCon -> [Name]-tyConNames (FamilyTyCon name params) = name : params-tyConNames (SynonymTyCon name params) = name : params-tyConNames (AlgTyCon name params rhs) = name : params ++ algTyRhsNames rhs-tyConNames (FunTyCon name bndrs) = name : concatMap tyBinderNames bndrs-tyConNames (PrimTyCon name bndrs) = name : concatMap tyBinderNames bndrs-tyConNames (Promoted name bndrs dcon) = name : concatMap tyBinderNames bndrs-                                            ++ dataConNames dcon+-- | `TyCon` instance of `Nameable`+instance Nameable TyCon where+    allNames (FamilyTyCon name params) = name : params+    allNames (SynonymTyCon name params) = name : params+    allNames (AlgTyCon name params rhs) = name : params ++ allNames rhs+    allNames (FunTyCon name bndrs) = name : concatMap allNames bndrs+    allNames (PrimTyCon name bndrs) = name : concatMap allNames bndrs+    allNames (Promoted name bndrs dcon) = name : concatMap allNames bndrs+                                              ++ allNames dcon --- | `Name`s in a `Coercion`.-coercionNames :: Coercion -> [Name]-coercionNames (Coercion ty1 ty2) = typeNames ty1 ++ typeNames ty2+-- | `Coercion` instance of `Nameable`+instance Nameable Coercion where+    allNames (Coercion ty1 ty2) = allNames ty1 ++ allNames ty2 --- | `Name`s in a `AlgTyRhs`.-algTyRhsNames :: AlgTyRhs -> [Name]-algTyRhsNames (AbstractTyCon _) = []-algTyRhsNames (DataTyCon names) = names-algTyRhsNames (TupleTyCon name) = [name]-algTyRhsNames (NewTyCon name) = [name]+-- | `AlgTyRhs` instance of `Nameable`+instance Nameable AlgTyRhs where+    allNames (AbstractTyCon _) = []+    allNames (DataTyCon names) = names+    allNames (TupleTyCon name) = [name]+    allNames (NewTyCon name) = [name]++-- | A `Var`'s `Name`. Not to be confused with the other function.+varName :: Var -> Name+varName (Var name _) = name  -- | A `Name`'s occurrence string. nameOccStr :: Name -> String
src/SSTG/Core/Language/Typing.hs view
@@ -5,48 +5,52 @@  import SSTG.Core.Language.Syntax --- | Variable type.-varType :: Var -> Type-varType (Var _ ty) = ty+-- | Typeable typeclass.+class Typeable a where+    typeOf :: a -> Type --- | Literal type.-litType :: Lit -> Type-litType (MachChar _ ty) = ty-litType (MachStr _ ty) = ty-litType (MachInt _ ty) = ty-litType (MachWord _ ty) = ty-litType (MachFloat _ ty) = ty-litType (MachDouble _ ty) = ty-litType (MachLabel _ _ ty) = ty-litType (MachNullAddr ty) = ty-litType (BlankAddr) = Bottom-litType (AddrLit _) = Bottom-litType (LitEval pf args) = foldl AppTy (primFunType pf) (map litType args)+-- | `Var` instance of `Typeable`.+instance Typeable Var where+    typeOf (Var _ ty) = ty --- | Atom type.-atomType :: Atom -> Type-atomType (LitAtom lit) = litType lit-atomType (VarAtom var) = varType var+-- | `Lit` instance of `Typeable`.+instance Typeable Lit where+    typeOf (MachChar _ ty) = ty+    typeOf (MachStr _ ty) = ty+    typeOf (MachInt _ ty) = ty+    typeOf (MachWord _ ty) = ty+    typeOf (MachFloat _ ty) = ty+    typeOf (MachDouble _ ty) = ty+    typeOf (MachLabel _ _ ty) = ty+    typeOf (MachNullAddr ty) = ty+    typeOf (BlankAddr) = Bottom+    typeOf (AddrLit _) = Bottom+    typeOf (LitEval pfun args) = foldl AppTy (typeOf pfun) (map typeOf args) --- | Primitive function type.-primFunType :: PrimFun -> Type-primFunType (PrimFun _ ty) = ty+-- | `Atom` instance of `Typeable`.+instance Typeable Atom where+    typeOf (LitAtom lit) = typeOf lit+    typeOf (VarAtom var) = typeOf var --- | Data constructor type denoted as a function.-dataConType :: DataCon -> Type-dataConType (DataCon _ ty tys) = foldr FunTy ty tys+-- | `PrimFun` instance of `Typeable`.+instance Typeable PrimFun where+    typeOf (PrimFun _ ty) = ty --- | Alt type-altType :: Alt -> Type-altType (Alt _ expr) = exprType expr+-- | `DataCon` instance of `Typeable`.+instance Typeable DataCon where+    typeOf (DataCon _ ty tys) = foldr FunTy ty tys --- | I wonder what this could possibly be?-exprType :: Expr -> Type-exprType (Atom atom) = atomType atom-exprType (PrimApp pf args) = foldl AppTy (primFunType pf) (map atomType args)-exprType (ConApp dc args) = foldl AppTy (dataConType dc) (map atomType args)-exprType (FunApp fun args) = foldl AppTy (varType fun) (map atomType args)-exprType (Let _ expr) = exprType expr-exprType (Case _ _ (alt:_)) = altType alt-exprType _ = Bottom+-- | `Alt` instance of `Typeable`.+instance Typeable Alt where+    typeOf (Alt _ expr) = typeOf expr++-- | `Expr` instance of `Typeable`.+instance Typeable Expr where+    typeOf (Atom atom) = typeOf atom+    typeOf (PrimApp pfun args) = foldl AppTy (typeOf pfun) (map typeOf args)+    typeOf (ConApp dcon args) = foldl AppTy (typeOf dcon) (map typeOf args)+    typeOf (FunApp fun args) = foldl AppTy (typeOf fun) (map typeOf args)+    typeOf (Let _ expr) = typeOf expr+    typeOf (Case _ _ (alt:_)) = typeOf alt+    typeOf _ = Bottom 
src/SSTG/Utils/Printing.hs view
@@ -201,8 +201,8 @@ pprHeapStr heap = injNewLine acc_strs   where     hlist = heapToList heap-    addr_redirs = [(addr, r) | (addr, Left r) <- hlist]-    addr_hobjs = [(addr, o) | (addr, Right o) <- hlist]+    addr_redirs = [(addr, r) | (addr, HeapRedir r) <- hlist]+    addr_hobjs = [(addr, o) | (addr, HeapObj o) <- hlist]     addr_redir_strs = map pprMemRedirStr addr_redirs     addr_hobj_strs = map pprMemHeapObjStr addr_hobjs     acc_strs = addr_redir_strs ++ addr_hobj_strs