@@ -22,26 +22,25 @@ import Control.Effect.State
2222import Control.Monad ((<=<) , guard )
2323import qualified Data.Core as Core
2424import Data.File
25- import Data.Foldable (foldl' )
2625import Data.Function (fix )
2726import qualified Data.IntMap as IntMap
2827import qualified Data.IntSet as IntSet
2928import Data.Loc
3029import qualified Data.Map as Map
3130import Data.Monoid (Alt (.. ))
32- import Data.Name hiding ( fresh )
31+ import Data.Name
3332import Data.Term
3433import Data.Text (Text , pack )
3534import Prelude hiding (fail )
3635
3736type Precise = Int
38- type Env = Map. Map Name Precise
37+ type Env = Map. Map User Precise
3938
4039newtype FrameId = FrameId { unFrameId :: Precise }
4140 deriving (Eq , Ord , Show )
4241
4342data Concrete
44- = Closure Loc Name (Term Core. Core Name ) Precise
43+ = Closure Loc User (Term Core. Core User ) Precise
4544 | Unit
4645 | Bool Bool
4746 | String Text
@@ -65,22 +64,20 @@ type Heap = IntMap.IntMap Concrete
6564--
6665-- >>> map fileBody (snd (concrete [File (Loc "bool" emptySpan) (Core.bool True)]))
6766-- [Right (Bool True)]
68- concrete :: [File (Term Core. Core Name )] -> (Heap , [File (Either (Loc , String ) Concrete )])
67+ concrete :: [File (Term Core. Core User )] -> (Heap , [File (Either (Loc , String ) Concrete )])
6968concrete
7069 = run
7170 . runFresh
72- . runNaming
7371 . runHeap
7472 . traverse runFile
7573
7674runFile :: ( Carrier sig m
7775 , Effect sig
7876 , Member Fresh sig
79- , Member Naming sig
8077 , Member (Reader FrameId ) sig
8178 , Member (State Heap ) sig
8279 )
83- => File (Term Core. Core Name )
80+ => File (Term Core. Core User )
8481 -> m (File (Either (Loc , String ) Concrete ))
8582runFile file = traverse run file
8683 where run = runReader (fileLoc file)
@@ -143,7 +140,7 @@ concreteAnalysis = Analysis{..}
143140 assign addr (Obj (f frame))
144141
145142
146- lookupConcrete :: Heap -> Name -> Concrete -> Maybe Precise
143+ lookupConcrete :: Heap -> User -> Concrete -> Maybe Precise
147144lookupConcrete heap name = run . evalState IntSet. empty . runNonDet . inConcrete
148145 where -- look up the name in a concrete value
149146 inConcrete = inFrame <=< maybeA . objectFrame
@@ -171,7 +168,7 @@ runHeap m = do
171168-- > λ let (heap, res) = concrete [ruby]
172169-- > λ writeFile "/Users/rob/Desktop/heap.dot" (export (addressStyle heap) (heapAddressGraph heap))
173170-- > λ :!dot -Tsvg < ~/Desktop/heap.dot > ~/Desktop/heap.svg
174- heapGraph :: (Precise -> Concrete -> a ) -> (Either Core. Edge Name -> Precise -> G. Graph a ) -> Heap -> G. Graph a
171+ heapGraph :: (Precise -> Concrete -> a ) -> (Either Core. Edge User -> Precise -> G. Graph a ) -> Heap -> G. Graph a
175172heapGraph vertex edge h = foldr (uncurry graph) G. empty (IntMap. toList h)
176173 where graph k v rest = (G. vertex (vertex k v) `G.connect` outgoing v) `G.overlay` rest
177174 outgoing = \ case
@@ -192,23 +189,21 @@ heapAddressGraph = heapGraph (\ addr v -> (Value v, addr)) (fmap G.vertex . (,)
192189addressStyle :: Heap -> G. Style (EdgeType , Precise ) Text
193190addressStyle heap = (G. defaultStyle vertex) { G. edgeAttributes }
194191 where vertex (_, addr) = pack (show addr) <> " = " <> maybe " ?" fromConcrete (IntMap. lookup addr heap)
195- edgeAttributes _ (Slot name, _) = [" label" G. := fromName name]
192+ edgeAttributes _ (Slot name, _) = [" label" G. := name]
196193 edgeAttributes _ (Edge Core. Import , _) = [" color" G. := " blue" ]
197194 edgeAttributes _ (Edge Core. Lexical , _) = [" color" G. := " green" ]
198195 edgeAttributes _ _ = []
199196 fromConcrete = \ case
200197 Unit -> " ()"
201198 Bool b -> pack $ show b
202199 String s -> pack $ show s
203- Closure (Loc p (Span s e)) n _ _ -> " \\\\ " <> fromName n <> " [" <> p <> " :" <> showPos s <> " -" <> showPos e <> " ]"
200+ Closure (Loc p (Span s e)) n _ _ -> " \\\\ " <> n <> " [" <> p <> " :" <> showPos s <> " -" <> showPos e <> " ]"
204201 Obj _ -> " {}"
205202 showPos (Pos l c) = pack (show l) <> " :" <> pack (show c)
206- fromName (User s) = s
207- fromName (Gen (Gensym ss i)) = foldl' (\ ss s -> ss <> " ." <> s) (pack (show i)) ss
208203
209204data EdgeType
210205 = Edge Core. Edge
211- | Slot Name
206+ | Slot User
212207 | Value Concrete
213208 deriving (Eq , Ord , Show )
214209
0 commit comments