Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 03ed4cd

Browse files
committed
Analyze with names in User.
1 parent 122b631 commit 03ed4cd

4 files changed

Lines changed: 36 additions & 48 deletions

File tree

semantic-core/src/Analysis/Concrete.hs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import Control.Effect.State
2222
import Control.Monad ((<=<), guard)
2323
import qualified Data.Core as Core
2424
import Data.File
25-
import Data.Foldable (foldl')
2625
import Data.Function (fix)
2726
import qualified Data.IntMap as IntMap
2827
import qualified Data.IntSet as IntSet
@@ -35,13 +34,13 @@ import Data.Text (Text, pack)
3534
import Prelude hiding (fail)
3635

3736
type Precise = Int
38-
type Env = Map.Map Name Precise
37+
type Env = Map.Map User Precise
3938

4039
newtype FrameId = FrameId { unFrameId :: Precise }
4140
deriving (Eq, Ord, Show)
4241

4342
data 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)])
6968
concrete
7069
= run
7170
. runFresh
72-
. runNaming
7371
. runHeap
7472
. traverse runFile
7573

7674
runFile :: ( 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))
8582
runFile 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
147144
lookupConcrete 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
175172
heapGraph 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 . (,)
192189
addressStyle :: Heap -> G.Style (EdgeType, Precise) Text
193190
addressStyle 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

209204
data EdgeType
210205
= Edge Core.Edge
211-
| Slot Name
206+
| Slot User
212207
| Value Concrete
213208
deriving (Eq, Ord, Show)
214209

semantic-core/src/Analysis/Eval.hs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,19 @@ import Data.Functor
2020
import Data.Loc
2121
import Data.Maybe (fromJust)
2222
import Data.Name
23+
import Data.Scope
2324
import Data.Term
2425
import Data.Text (Text)
2526
import GHC.Stack
2627
import Prelude hiding (fail)
2728

28-
eval :: (Carrier sig m, Member Naming sig, Member (Reader Loc) sig, MonadFail m) => Analysis address value m -> (Term Core Name -> m value) -> Term Core Name -> m value
29+
eval :: (Carrier sig m, Member (Reader Loc) sig, MonadFail m) => Analysis address value m -> (Term Core User -> m value) -> Term Core User -> m value
2930
eval Analysis{..} eval = \case
3031
Var n -> lookupEnv' n >>= deref' n
3132
Term c -> case c of
32-
Let n -> alloc (User n) >>= bind (User n) >> unit
33+
Let n -> alloc n >>= bind n >> unit
3334
a :>> b -> eval a >> eval b
34-
Lam _ b -> do
35-
n <- Gen <$> fresh
36-
abstract eval n (instantiate (const (pure n)) b)
35+
Lam (Ignored n) b -> abstract eval n (incr (const n) id <$> fromScope b)
3736
f :$ a -> do
3837
f' <- eval f
3938
a' <- eval a
@@ -66,8 +65,8 @@ eval Analysis{..} eval = \case
6665
Var n -> lookupEnv' n
6766
Term c -> case c of
6867
Let n -> do
69-
addr <- alloc (User n)
70-
addr <$ bind (User n) addr
68+
addr <- alloc n
69+
addr <$ bind n addr
7170
If c t e -> do
7271
c' <- eval c >>= asBool
7372
if c' then ref t else ref e
@@ -203,13 +202,13 @@ ruby = fromBody . ann . block $
203202

204203

205204
data Analysis address value m = Analysis
206-
{ alloc :: Name -> m address
207-
, bind :: Name -> address -> m ()
208-
, lookupEnv :: Name -> m (Maybe address)
205+
{ alloc :: User -> m address
206+
, bind :: User -> address -> m ()
207+
, lookupEnv :: User -> m (Maybe address)
209208
, deref :: address -> m (Maybe value)
210209
, assign :: address -> value -> m ()
211-
, abstract :: (Term Core Name -> m value) -> Name -> Term Core Name -> m value
212-
, apply :: (Term Core Name -> m value) -> value -> value -> m value
210+
, abstract :: (Term Core User -> m value) -> User -> Term Core User -> m value
211+
, apply :: (Term Core User -> m value) -> value -> value -> m value
213212
, unit :: m value
214213
, bool :: Bool -> m value
215214
, asBool :: value -> m Bool

semantic-core/src/Analysis/ImportGraph.hs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import Data.Loc
2222
import qualified Data.Map as Map
2323
import Data.Name
2424
import qualified Data.Set as Set
25-
import Data.Stack
2625
import Data.Term
2726
import Data.Text (Text)
2827
import Prelude hiding (fail)
@@ -42,29 +41,27 @@ instance Monoid Value where
4241
mempty = Value Abstract mempty
4342

4443
data Semi
45-
= Closure Loc Name (Term Core.Core Name) Name
44+
= Closure Loc User (Term Core.Core User) User
4645
-- FIXME: Bound String values.
4746
| String Text
4847
| Abstract
4948
deriving (Eq, Ord, Show)
5049

5150

52-
importGraph :: [File (Term Core.Core Name)] -> (Heap Name Value, [File (Either (Loc, String) Value)])
51+
importGraph :: [File (Term Core.Core User)] -> (Heap User Value, [File (Either (Loc, String) Value)])
5352
importGraph
5453
= run
5554
. runFresh
56-
. runNaming
57-
. runHeap (Gen (Gensym (Nil :> "root") 0))
55+
. runHeap "__semantic_root"
5856
. traverse runFile
5957

6058
runFile :: ( Carrier sig m
6159
, Effect sig
6260
, Member Fresh sig
63-
, Member Naming sig
64-
, Member (Reader (FrameId Name)) sig
65-
, Member (State (Heap Name Value)) sig
61+
, Member (Reader (FrameId User)) sig
62+
, Member (State (Heap User Value)) sig
6663
)
67-
=> File (Term Core.Core Name)
64+
=> File (Term Core.Core User)
6865
-> m (File (Either (Loc, String) Value))
6966
runFile file = traverse run file
7067
where run = runReader (fileLoc file)
@@ -75,12 +72,12 @@ runFile file = traverse run file
7572
-- FIXME: decompose into a product domain and two atomic domains
7673
importGraphAnalysis :: ( Alternative m
7774
, Carrier sig m
78-
, Member (Reader (FrameId Name)) sig
75+
, Member (Reader (FrameId User)) sig
7976
, Member (Reader Loc) sig
80-
, Member (State (Heap Name Value)) sig
77+
, Member (State (Heap User Value)) sig
8178
, MonadFail m
8279
)
83-
=> Analysis Name Value m
80+
=> Analysis User Value m
8481
importGraphAnalysis = Analysis{..}
8582
where alloc = pure
8683
bind _ _ = pure ()
@@ -104,7 +101,7 @@ importGraphAnalysis = Analysis{..}
104101
asString (Value (String s) _) = pure s
105102
asString _ = pure mempty
106103
frame = pure mempty
107-
edge Core.Import (User to) = do -- FIXME: figure out some other way to do this
104+
edge Core.Import to = do -- FIXME: figure out some other way to do this
108105
Loc{locPath=from} <- ask
109106
() <$ pure (Value Abstract (Map.singleton from (Set.singleton to)))
110107
edge _ _ = pure ()

semantic-core/src/Analysis/Typecheck.hs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import Data.Maybe (fromJust)
3131
import Data.Name as Name
3232
import Data.Scope
3333
import qualified Data.Set as Set
34-
import Data.Stack
3534
import Data.Term
3635
import Data.Void
3736
import GHC.Generics (Generic1)
@@ -83,28 +82,26 @@ generalize :: Term Monotype Meta -> Term (Polytype :+: Monotype) Void
8382
generalize ty = fromJust (closed (forAlls (IntSet.toList (mvs ty)) (hoistTerm R ty)))
8483

8584

86-
typecheckingFlowInsensitive :: [File (Term Core.Core Name)] -> (Heap Name (Term Monotype Meta), [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))])
85+
typecheckingFlowInsensitive :: [File (Term Core.Core User)] -> (Heap User (Term Monotype Meta), [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))])
8786
typecheckingFlowInsensitive
8887
= run
8988
. runFresh
90-
. runNaming
91-
. runHeap (Gen (Gensym (Nil :> "root") 0))
89+
. runHeap "__semantic_root"
9290
. fmap (fmap (fmap (fmap generalize)))
9391
. traverse runFile
9492

9593
runFile :: ( Carrier sig m
9694
, Effect sig
9795
, Member Fresh sig
98-
, Member Naming sig
99-
, Member (State (Heap Name (Term Monotype Meta))) sig
96+
, Member (State (Heap User (Term Monotype Meta))) sig
10097
)
101-
=> File (Term Core.Core Name)
98+
=> File (Term Core.Core User)
10299
-> m (File (Either (Loc, String) (Term Monotype Meta)))
103100
runFile file = traverse run file
104101
where run
105102
= (\ m -> do
106103
(subst, t) <- m
107-
modify @(Heap Name (Term Monotype Meta)) (substAll subst)
104+
modify @(Heap User (Term Monotype Meta)) (substAll subst)
108105
pure (substAll subst <$> t))
109106
. runState (mempty :: Substitution)
110107
. runReader (fileLoc file)
@@ -119,7 +116,7 @@ runFile file = traverse run file
119116
v <$ for_ bs (unify v))
120117
. convergeTerm (fix (cacheTerm . eval typecheckingAnalysis))
121118

122-
typecheckingAnalysis :: (Alternative m, Carrier sig m, Member Fresh sig, Member (State (Set.Set Constraint)) sig, Member (State (Heap Name (Term Monotype Meta))) sig, MonadFail m) => Analysis Name (Term Monotype Meta) m
119+
typecheckingAnalysis :: (Alternative m, Carrier sig m, Member Fresh sig, Member (State (Set.Set Constraint)) sig, Member (State (Heap User (Term Monotype Meta))) sig, MonadFail m) => Analysis User (Term Monotype Meta) m
123120
typecheckingAnalysis = Analysis{..}
124121
where alloc = pure
125122
bind _ _ = pure ()

0 commit comments

Comments
 (0)