packages feed

SSTG 0.1.0.8 → 0.1.0.9

raw patch · 9 files changed

+89/−91 lines, 9 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- SSTG.Core.Execution.Support: emptyGlobals :: Globals
- SSTG.Core.Execution.Support: emptyHeap :: Heap
- SSTG.Core.Execution.Support: emptyLocals :: Locals
- SSTG.Core.Execution.Support: emptyPathCons :: PathCons
- SSTG.Core.Execution.Support: emptyStack :: Stack
- SSTG.Core.Execution.Support: emptySymLinks :: SymLinks
- SSTG.Core.Execution.Support: nullAddr :: MemAddr
- SSTG.Core.Syntax.Language: TcTyCon :: bnd -> GenTyCon bnd
+ SSTG.Core.Execution.Support: empty_globals :: Globals
+ SSTG.Core.Execution.Support: empty_heap :: Heap
+ SSTG.Core.Execution.Support: empty_locals :: Locals
+ SSTG.Core.Execution.Support: empty_pathcons :: PathCons
+ SSTG.Core.Execution.Support: empty_stack :: Stack
+ SSTG.Core.Execution.Support: empty_symlinks :: SymLinks
+ SSTG.Core.Execution.Support: null_addr :: MemAddr
- SSTG.Core.Syntax.Language: AlgTyCon :: bnd -> (GenAlgTyRhs bnd) -> GenTyCon bnd
+ SSTG.Core.Syntax.Language: AlgTyCon :: bnd -> [bnd] -> (GenAlgTyRhs bnd) -> GenTyCon bnd
- SSTG.Core.Syntax.Language: AnonTyBndr :: (GenType bnd) -> GenTyBinder bnd
+ SSTG.Core.Syntax.Language: AnonTyBndr :: GenTyBinder bnd
- SSTG.Core.Syntax.Language: FamilyTyCon :: bnd -> GenTyCon bnd
+ SSTG.Core.Syntax.Language: FamilyTyCon :: bnd -> [bnd] -> GenTyCon bnd
- SSTG.Core.Syntax.Language: FunTyCon :: bnd -> GenTyCon bnd
+ SSTG.Core.Syntax.Language: FunTyCon :: bnd -> [GenTyBinder bnd] -> GenTyCon bnd
- SSTG.Core.Syntax.Language: NamedTyBndr :: bnd -> (GenType bnd) -> GenTyBinder bnd
+ SSTG.Core.Syntax.Language: NamedTyBndr :: bnd -> GenTyBinder bnd
- SSTG.Core.Syntax.Language: PrimTyCon :: bnd -> GenTyCon bnd
+ SSTG.Core.Syntax.Language: PrimTyCon :: bnd -> [GenTyBinder bnd] -> GenTyCon bnd
- SSTG.Core.Syntax.Language: Promoted :: bnd -> (GenDataCon bnd) -> GenTyCon bnd
+ SSTG.Core.Syntax.Language: Promoted :: bnd -> [GenTyBinder bnd] -> (GenDataCon bnd) -> GenTyCon bnd
- SSTG.Core.Syntax.Language: SynonymTyCon :: bnd -> GenTyCon bnd
+ SSTG.Core.Syntax.Language: SynonymTyCon :: bnd -> [bnd] -> GenTyCon bnd

Files

README.md view
@@ -51,7 +51,7 @@ ```  #### Defunctionalization-HEY KIDS YA EVER WANNA REASON ABOUT HIGHER-ORDER FUNCTIONS BUT YOUR SMT SOLVER AIN'T SMAHT ENOUGH??? CHECK OUT THIS [COOL WIKIPEDIA ARTICLE RIGHT HERE!!!][defunctionalization]+[Defunctionalization Wikipedia article][defunctionalization]  [defunctionalization]: https://en.wikipedia.org/wiki/Defunctionalization 
SSTG.cabal view
@@ -1,5 +1,5 @@ name:                SSTG-version:             0.1.0.8+version:             0.1.0.9 synopsis:            STG Symbolic Execution description:         Prototype of STG-based Symbolic Execution for Haskell. homepage:            https://github.com/AntonXue/SSTG#readme
app/Main.hs view
@@ -39,9 +39,9 @@  parseDumpDir :: [String] -> Maybe FilePath parseDumpDir args = case matchArg "--dump" args (readMaybe . show) Nothing of-    Nothing  -> error "part1"+    Nothing  -> Nothing     Just raw -> case trimSlash raw of-                    "" -> error "part2"+                    "" -> error ("Invalid use of " ++ raw)                     ok -> Just ok  parseFlags :: [String] -> RunFlags
src/SSTG/Core/Execution/Engine.hs view
@@ -36,11 +36,11 @@   where -- Status or something.         status   = Status { steps = 0 }         -- Stack initialized to empty.-        stack    = emptyStack+        stack    = empty_stack         -- Globals and Heap are loaded together. They are still beta forms now.-        heap0    = emptyHeap+        heap0    = empty_heap         (glist, heap1, bnd_addrss) = initGlobals bnds heap0-        globals0 = insertGlobalsList glist emptyGlobals+        globals0 = insertGlobalsList glist empty_globals         (heap2, localss) = liftBindings bnd_addrss globals0 heap1         bnd_locs = zip bnds localss         -- Code loading. Completes heap and globals with symbolic injection.@@ -55,8 +55,8 @@                          , state_globals = globals                          , state_code    = code                          , state_names   = []-                         , state_paths   = emptyPathCons-                         , state_links   = emptySymLinks }+                         , state_paths   = empty_pathcons+                         , state_links   = empty_symlinks }          -- Gather information on all variables.         state    = state0 { state_names = allNames state0 }@@ -106,7 +106,7 @@ liftBinding (Binding rec pairs, addrs) globals heap = (heap', locals)   where (vars, rhss) = unzip pairs         mem_vals = map (\a -> MemVal a) addrs-        e_locs   = emptyLocals+        e_locs   = empty_locals         r_locs   = insertLocalsList (zip vars mem_vals) e_locs         locals   = case rec of { Rec -> r_locs; NonRec -> e_locs }         hobjs    = map (\r -> forceRhsObj r locals globals) rhss
src/SSTG/Core/Execution/Naming.hs view
@@ -61,10 +61,10 @@  -- | `Name`s in a `Symbol`. symbolNames :: Symbol -> [Name]-symbolNames (Symbol sym mb_scls) = varNames sym ++ scls_names-  where scls_names = case mb_scls of-                         Nothing     -> []-                         Just (e, l) -> exprNames e ++ localsNames l+symbolNames (Symbol sym mb_scls) = varNames sym ++ scls_ns+  where scls_ns = case mb_scls of+                      Nothing     -> []+                      Just (e, l) -> exprNames e ++ localsNames l  -- | `Name`s in a `BindRhs`. bindRhsNames :: BindRhs -> [Name]@@ -116,22 +116,21 @@  -- | `Name`s in a `DataCon`. dataNames :: DataCon -> [Name]-dataNames (DataCon name ty tys) = name : concatMap typeNames (ty : tys)+dataNames (DataCon n ty tys) = n : concatMap typeNames (ty : tys)  -- | `Name`s in a `TyBinder`. tyBinderNames :: TyBinder -> [Name]-tyBinderNames (NamedTyBndr n ty) = n : typeNames ty-tyBinderNames (AnonTyBndr ty)    = typeNames ty+tyBinderNames (AnonTyBndr)    = []+tyBinderNames (NamedTyBndr n) = [n]  -- | `Name`s in a `TyCon`. tyConNames :: TyCon -> [Name]-tyConNames (FunTyCon n)      = [n]-tyConNames (AlgTyCon n r)    = n : algTyRhsNames r-tyConNames (SynonymTyCon n)  = [n]-tyConNames (FamilyTyCon n)   = [n]-tyConNames (PrimTyCon n)     = [n]-tyConNames (TcTyCon n)       = [n]-tyConNames (Promoted n dcon) = n : dataNames dcon+tyConNames (FunTyCon n bs)     = n : concatMap tyBinderNames bs+tyConNames (AlgTyCon n ns r)   = n : ns ++ algTyRhsNames r+tyConNames (SynonymTyCon n ns) = n : ns+tyConNames (FamilyTyCon n ns)  = n : ns+tyConNames (PrimTyCon n bs)    = n : concatMap tyBinderNames bs+tyConNames (Promoted n bs dc)  = n : concatMap tyBinderNames bs ++ dataNames dc  -- | `Name`s in a `Coercion`. coercionNames :: Coercion -> [Name]@@ -140,9 +139,9 @@ -- | `Name`s in a `AlgTyRhs`. algTyRhsNames :: AlgTyRhs -> [Name] algTyRhsNames (AbstractTyCon _) = []-algTyRhsNames (DataTyCon names) = names-algTyRhsNames (TupleTyCon name) = [name]-algTyRhsNames (NewTyCon name)   = [name]+algTyRhsNames (DataTyCon ns)    = ns+algTyRhsNames (TupleTyCon n)    = [n]+algTyRhsNames (NewTyCon n)      = [n]  -- | `Name`s in a `Binding`. bindingNames :: Binding -> [Name]
src/SSTG/Core/Execution/Rules.hs view
@@ -196,12 +196,12 @@ liftedAltToState :: State -> LiftAct (Expr, [Constraint]) -> State liftedAltToState state (LiftAct args locals globals heap confs) = state'   where (expr, conss) = args-        pathcons      = state_paths state-        state' = state { state_heap    = heap-                       , state_globals = globals-                       , state_code    = Evaluate expr locals-                       , state_names   = confs-                       , state_paths   = insertPathConsList conss pathcons }+        pathcons = state_paths state+        state'   = state { state_heap    = heap+                         , state_globals = globals+                         , state_code    = Evaluate expr locals+                         , state_names   = confs+                         , state_paths   = insertPathConsList conss pathcons }  -- | Reduce the state if it matches some type of reduction `Rule`. Return -- `Nothing` to denote that rule application has completely failed.
src/SSTG/Core/Execution/Support.hs view
@@ -26,21 +26,21 @@     , nameOccStr     , nameUnique     , varName-    , nullAddr+    , null_addr     , addrInt -    , emptyStack+    , empty_stack     , popStack     , pushStack     , stackToList -    , emptyLocals+    , empty_locals     , lookupLocals     , insertLocals     , insertLocalsList     , localsToList -    , emptyHeap+    , empty_heap     , lookupHeap     , allocHeap     , allocHeapList@@ -48,18 +48,18 @@     , insertHeapList     , heapToList -    , emptyGlobals+    , empty_globals     , lookupGlobals     , insertGlobals     , insertGlobalsList     , globalsToList -    , emptyPathCons+    , empty_pathcons     , insertPathCons     , insertPathConsList     , pathconsToList -    , emptySymLinks+    , empty_symlinks     , insertSymLinks     , symlinksToList @@ -186,16 +186,16 @@ varName (Var name _) = name  -- | Null `MemAddr`.-nullAddr :: MemAddr-nullAddr = MemAddr 0+null_addr :: MemAddr+null_addr = MemAddr 0  -- | `MemAddr`'s `Int` value. addrInt :: MemAddr -> Int addrInt (MemAddr int) = int  -- | Empty `Stack.-emptyStack :: Stack-emptyStack = Stack []+empty_stack :: Stack+empty_stack = Stack []  -- | `Stack` pop. popStack :: Stack -> Maybe (Frame, Stack)@@ -211,8 +211,8 @@ stackToList (Stack frames) = frames  -- | Empty `Locals`.-emptyLocals :: Locals-emptyLocals = Locals M.empty+empty_locals :: Locals+empty_locals = Locals M.empty  -- | `Locals` lookup. lookupLocals :: Var -> Locals -> Maybe Value@@ -234,8 +234,8 @@ localsToList (Locals lmap) = M.toList lmap  -- | Empty `Heap`.-emptyHeap :: Heap-emptyHeap = Heap M.empty (MemAddr 0)+empty_heap :: Heap+empty_heap = Heap M.empty null_addr  -- | `Heap` lookup. lookupHeap :: MemAddr -> Heap -> Maybe HeapObj@@ -273,8 +273,8 @@ heapToList (Heap hmap _) = M.toList hmap  -- | Empty `Globals`.-emptyGlobals :: Globals-emptyGlobals = Globals M.empty+empty_globals :: Globals+empty_globals = Globals M.empty  -- | `Globals` lookup. lookupGlobals :: Var -> Globals -> Maybe Value@@ -298,8 +298,8 @@ globalsToList (Globals gmap) = M.toList gmap  -- | Empty `PathCons`.-emptyPathCons :: PathCons-emptyPathCons = PathCons []+empty_pathcons :: PathCons+empty_pathcons = PathCons []  -- | `PathCons` insertion. insertPathCons :: Constraint -> PathCons -> PathCons@@ -314,8 +314,8 @@ pathconsToList (PathCons conss) = conss  -- | Empty `SymLinks`.-emptySymLinks :: SymLinks-emptySymLinks = SymLinks M.empty+empty_symlinks :: SymLinks+empty_symlinks = SymLinks M.empty  -- | `SymLinks` insertion. insertSymLinks :: Name -> Name -> SymLinks -> SymLinks
src/SSTG/Core/Syntax/Language.hs view
@@ -122,8 +122,8 @@                  deriving (Show, Eq, Read)  -- | Type binder for `ForAllTy`.-data GenTyBinder bnd = NamedTyBndr bnd (GenType bnd)-                     | AnonTyBndr  (GenType bnd)+data GenTyBinder bnd = NamedTyBndr bnd+                     | AnonTyBndr                      deriving (Show, Eq, Read)  -- | `Type` literal.@@ -136,13 +136,12 @@                      deriving (Show, Eq, Read)  -- | Type constructor.-data GenTyCon bnd = FunTyCon     bnd-                  | AlgTyCon     bnd (GenAlgTyRhs bnd)-                  | SynonymTyCon bnd-                  | FamilyTyCon  bnd-                  | PrimTyCon    bnd-                  | Promoted     bnd (GenDataCon bnd)-                  | TcTyCon      bnd+data GenTyCon bnd = FunTyCon     bnd [GenTyBinder bnd]+                  | AlgTyCon     bnd [bnd] (GenAlgTyRhs bnd)+                  | SynonymTyCon bnd [bnd]+                  | FamilyTyCon  bnd [bnd]+                  | PrimTyCon    bnd [GenTyBinder bnd]+                  | Promoted     bnd [GenTyBinder bnd] (GenDataCon bnd)                   deriving (Show, Eq, Read)  -- | ADT RHS.
src/SSTG/Core/Translation/Haskell.hs view
@@ -27,7 +27,7 @@ import Unique import Var as V -import qualified Data.Maybe  as MB+import qualified Data.Maybe as MB  -- | Make IO String from Outputable. mkIOStr :: (Outputable a) => a -> IO String@@ -79,7 +79,7 @@  -- | Make SSTG `Expr`. mkExpr :: StgExpr -> SL.Expr-mkExpr (StgLit lit) = SL.Atom (SL.LitAtom (mkLit lit))+mkExpr (StgLit lit)         = SL.Atom (SL.LitAtom (mkLit lit)) mkExpr (StgApp occ args)    = SL.FunApp (mkVar occ) (map mkAtom args) mkExpr (StgConApp dc args)  = SL.ConApp (mkData dc) (map mkAtom args) mkExpr (StgOpApp op args _) = SL.PrimApp (mkPrimOp op) (map mkAtom args)@@ -87,8 +87,8 @@ mkExpr (StgLam _ _)         = error "mkExpr: StgLam detected" mkExpr (StgLet bnd expr)    = SL.Let (mkBinding bnd) (mkExpr expr) mkExpr (StgLetNoEscape _ _ bnd expr)     = mkExpr (StgLet bnd expr)-mkExpr (StgCase mexpr _ _ bndr _ _ alts) =-    SL.Case (mkExpr mexpr) (mkVar bndr) (map mkAlt alts)+mkExpr (StgCase mexpr _ _ bndr _ _ alts) = SL.Case (mkExpr mexpr) (mkVar bndr)+                                                   (map mkAlt alts)  -- | Make SSTG `Atom`. mkAtom :: StgArg -> SL.Atom@@ -102,8 +102,8 @@         ns  = (mkNameSpace . occNameSpace . nameOccName) name         unq = (getKey . nameUnique) name         mdl = case nameModule_maybe name of-            Nothing -> Nothing-            Just md -> Just ((moduleNameString . moduleName) md)+                  Nothing -> Nothing+                  Just md -> Just ((moduleNameString . moduleName) md)  -- | Make SSTG `NameSpace`. mkNameSpace :: NameSpace -> SL.NameSpace@@ -111,7 +111,7 @@                | isTvNameSpace  ns     = SL.TvNSpace                | isDataConNameSpace ns = SL.DataNSpace                | isTcClsNameSpace ns   = SL.TcClsNSpace-               | otherwise = error "mkNameSpace: unrecognized namespace"+               | otherwise             = error "mkNameSpace: unrecognized"  -- | Make SSTG Var mkVar :: Var -> SL.Var@@ -121,15 +121,14 @@  -- | Make SSTG Binding mkBinding :: StgBinding -> SL.Binding-mkBinding (StgNonRec bnd rhs) = SL.Binding SL.NonRec [(mkVar bnd, mkRhs rhs)]-mkBinding (StgRec bnd) = SL.Binding SL.Rec-                                    (map (\(b, r) -> (mkVar b, mkRhs r)) bnd)+mkBinding (StgNonRec bnd r) = SL.Binding SL.NonRec [(mkVar bnd, mkRhs r)]+mkBinding (StgRec bnd)      = SL.Binding SL.Rec (map (\(b, r) ->+                                                      (mkVar b, mkRhs r)) bnd)  -- | Make SSTG `BindRhs`. mkRhs :: StgRhs -> SL.BindRhs-mkRhs (StgRhsCon _ dc args) = SL.ConForm (mkData dc) (map mkAtom args)-mkRhs (StgRhsClosure _ _ _ _ _ params expr) =-    SL.FunForm (map mkVar params) (mkExpr expr)+mkRhs (StgRhsCon _ dc args)          = SL.ConForm (mkData dc) (map mkAtom args)+mkRhs (StgRhsClosure _ _ _ _ _ ps e) = SL.FunForm (map mkVar ps) (mkExpr e)  -- | Make SSTG `Lit`. mkLit :: Literal -> SL.Lit@@ -143,7 +142,7 @@   (MachFloat rat)   -> SL.MachFloat rat ((mkType . literalType) lit)   (MachDouble rat)  -> SL.MachDouble rat ((mkType . literalType) lit)   (LitInteger i _)  -> SL.MachInt (fromInteger i) ((mkType . literalType) lit)-  MachNullAddr      -> SL.MachNullAddr ((mkType . literalType) lit)+  (MachNullAddr)    -> SL.MachNullAddr ((mkType . literalType) lit)   (MachLabel f m _) -> SL.MachLabel (unpackFS f) m ((mkType . literalType) lit)  -- | `DataCon`'s `Name`.@@ -179,27 +178,29 @@  -- | Make SSTG `Type`. mkType :: Type -> SL.Type-mkType (TyVarTy v) = SL.TyVarTy (mkName (V.varName v)) (mkType (varType v)) mkType (AppTy t1 t2)    = SL.AppTy (mkType t1) (mkType t2) mkType (TyConApp tc ts) = SL.TyConApp (mkTyCon tc) (map mkType ts) mkType (ForAllTy b ty)  = SL.ForAllTy (mkTyBndr b) (mkType ty) mkType (LitTy tlit)     = SL.LitTy (mkTyLit tlit) mkType (CastTy ty cor)  = SL.CastTy (mkType ty) (mkCoercion cor) mkType (CoercionTy cor) = SL.CoercionTy (mkCoercion cor)+mkType (TyVarTy v)      = SL.TyVarTy (mkName (V.varName v))+                                     (mkType (varType v))  -- | Make SSTG `TyCon`. mkTyCon :: TyCon -> SL.TyCon-mkTyCon tc | isFunTyCon         tc = SL.FunTyCon     name-           | isAlgTyCon         tc = SL.AlgTyCon     name algrhs-           | isFamilyTyCon      tc = SL.FamilyTyCon  name-           | isPrimTyCon        tc = SL.PrimTyCon    name-           | isTcTyCon          tc = SL.TcTyCon      name-           | isTypeSynonymTyCon tc = SL.SynonymTyCon name-           | isPromotedDataCon  tc = SL.Promoted     name dcon-           | otherwise = error "mkTyCon: unrecognized TyCon"-  where name   = (mkName . tyConName) tc-        algrhs = (mkAlgTyConRhs . algTyConRhs) tc-        dcon   = (mkData . MB.fromJust . isPromotedDataCon_maybe) tc+mkTyCon tc | isFunTyCon         tc = SL.FunTyCon     name tcbndrs+           | isAlgTyCon         tc = SL.AlgTyCon     name tvnames algrhs+           | isFamilyTyCon      tc = SL.FamilyTyCon  name tvnames+           | isPrimTyCon        tc = SL.PrimTyCon    name tcbndrs+           | isTypeSynonymTyCon tc = SL.SynonymTyCon name tvnames+           | isPromotedDataCon  tc = SL.Promoted     name tcbndrs dcon+           | otherwise             = error "mkTyCon: unrecognized TyCon"+  where name    = (mkName . tyConName) tc+        algrhs  = (mkAlgTyConRhs . algTyConRhs) tc+        tcbndrs = map mkTyBndr (tyConBinders tc)+        tvnames = map (mkName. V.varName) (tyConTyVars tc)+        dcon    = (mkData . MB.fromJust . isPromotedDataCon_maybe) tc  -- | Make SSTG `AlgTyRhs`. mkAlgTyConRhs :: AlgTyConRhs -> SL.AlgTyRhs@@ -210,9 +211,8 @@  -- | make SSTG `TyBinder`. mkTyBndr :: TyBinder -> SL.TyBinder-mkTyBndr (Anon ty)   = SL.AnonTyBndr  (mkType ty)+mkTyBndr (Anon _)    = SL.AnonTyBndr mkTyBndr (Named v _) = SL.NamedTyBndr (mkName (V.varName v))-                                      (mkType (varType v))  -- | Make SSTG `Type` literals. mkTyLit :: TyLit -> SL.TyLit