on master help sign in
Track normal and kernel deps the same way

So the Name.Tracker type only needs to track one set, rather than two for each sort of dependency.

commit2799bc0bf345a4030b4b64547778dadff8208539 authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 6 Dec 2017, 17:01 (9 years ago) parent579464e
2 files changed+53−48
src/Optimize/Module.hs+14−14 src/Optimize/Names.hs+39−34
src/Optimize/Module.hs+14−14
@@ -90,7 +90,7 @@ addAlias home name (Can.Alias _ _ maybeFields) graph@(Graph fieldCounts nodes) =
9090 Map.fromList $ map toPair fields
9191
9292 node =
93− Opt.Define function Set.empty Set.empty
93+ Opt.Define function Set.empty
9494 in
9595 Graph
9696 (foldr addOne fieldCounts fields)
@@ -149,15 +149,15 @@ addPort home name port_ graph =
149149 case port_ of
150150 Can.Incoming _ tipe ->
151151 let
152− (kernels, globals, fields, decoder) = Names.run (Port.toDecoder tipe)
153− node = Opt.PortIncoming decoder kernels globals
152+ (deps, fields, decoder) = Names.run (Port.toDecoder tipe)
153+ node = Opt.PortIncoming decoder deps
154154 in
155155 addToGraph (Opt.Global home name) node fields graph
156156
157157 Can.Outgoing _ tipe ->
158158 let
159− (kernels, globals, fields, encoder) = Names.run (Port.toEncoder tipe)
160− node = Opt.PortOutgoing encoder kernels globals
159+ (deps, fields, encoder) = Names.run (Port.toEncoder tipe)
160+ node = Opt.PortOutgoing encoder deps
161161 in
162162 addToGraph (Opt.Global home name) node fields graph
163163
@@ -198,21 +198,21 @@ addDefHelp name args body graph =
198198 case args of
199199 [] ->
200200 let
201− (kernels, globals, fields, value) =
201+ (deps, fields, value) =
202202 Names.run (Expr.optimize Set.empty body)
203203 in
204− addToGraph name (Opt.Define value kernels globals) fields graph
204+ addToGraph name (Opt.Define value deps) fields graph
205205
206206 _ ->
207207 let
208− (kernels, globals, fields, function) =
208+ (deps, fields, function) =
209209 Names.run $
210210 do (argNames, defss) <- Expr.destructArgs args
211211 obody <- Expr.optimize Set.empty body
212212 pure $ Opt.Function argNames $
213213 foldr Opt.Let obody (concat defss)
214214 in
215− addToGraph name (Opt.Define function kernels globals) fields graph
215+ addToGraph name (Opt.Define function deps) fields graph
216216
217217
218218addToGraph :: Opt.Global -> Opt.Node -> Map.Map N.Name Int -> Graph -> Graph
@@ -235,12 +235,12 @@ addRecDefs home defs graph =
235235 dummyName =
236236 Opt.Global home (N.toCompositeName cycleValues)
237237
238− (kernels, globals, fields, State cyclicValuePairs newGraph) =
238+ (deps, fields, State cyclicValuePairs newGraph) =
239239 Names.run $
240240 foldM (addRecDef home dummyName cycleValues) (State [] graph) defs
241241
242242 node =
243− Opt.Cycle cyclicValuePairs kernels globals
243+ Opt.Cycle cyclicValuePairs deps
244244 in
245245 addToGraph dummyName node fields newGraph
246246
@@ -280,17 +280,17 @@ addRecDef home dummyName cycle state@(State values graph) def =
280280
281281 _ ->
282282 let
283− (kernels, globals, fields, odef) =
283+ (deps, fields, odef) =
284284 Names.run (Expr.optimizePotentialTailCall Set.empty def)
285285 in
286286 pure $ State values $
287287 case odef of
288288 Opt.Def name body ->
289− let node = Opt.Define body kernels globals in
289+ let node = Opt.Define body deps in
290290 addToGraph (Opt.Global home name) node fields graph
291291
292292 Opt.TailDef name args body ->
293− let node = Opt.DefineTailFunc args body kernels globals in
293+ let node = Opt.DefineTailFunc args body deps in
294294 addToGraph (Opt.Global home name) node fields graph
295295
296296
src/Optimize/Names.hs+39−34
@@ -22,6 +22,7 @@ import qualified Data.Text as Text
2222import qualified AST.Optimized as Opt
2323import qualified AST.Module.Name as ModuleName
2424import qualified Elm.Name as N
25+import qualified Elm.Package as Pkg
2526
2627
2728
@@ -32,49 +33,53 @@ newtype Tracker a =
3233 Tracker (
3334 forall r.
3435 Int
35− -> Set.Set N.Name
3636 -> Set.Set Opt.Global
3737 -> Map.Map N.Name Int
38− -> (Int -> Set.Set N.Name -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
38+ -> (Int -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
3939 -> r
4040 )
4141
4242
43−run :: Tracker a -> (Set.Set N.Name, Set.Set Opt.Global, Map.Map N.Name Int, a)
43+run :: Tracker a -> (Set.Set Opt.Global, Map.Map N.Name Int, a)
4444run (Tracker k) =
45− k 0 Set.empty Set.empty Map.empty
46− (\_uid kernels globals fields value -> (kernels, globals, fields, value))
45+ k 0 Set.empty Map.empty
46+ (\_uid deps fields value -> (deps, fields, value))
4747
4848
4949generate :: Tracker N.Name
5050generate =
51− Tracker $ \n k g f ok ->
52− ok (n + 1) k g f ("_n" <> Text.pack (show n))
51+ Tracker $ \uid deps fields ok ->
52+ ok (uid + 1) deps fields ("_n" <> Text.pack (show uid))
5353
5454
5555registerKernel :: N.Name -> a -> Tracker a
56−registerKernel name value =
57− Tracker $ \n k g f ok ->
58− ok n (Set.insert name k) g f value
56+registerKernel home value =
57+ Tracker $ \uid deps fields ok ->
58+ ok uid (Set.insert (toKernelGlobal home) deps) fields value
59+
60+
61+toKernelGlobal :: N.Name -> Opt.Global
62+toKernelGlobal home =
63+ Opt.Global (ModuleName.Canonical Pkg.kernel home) N.dollar
5964
6065
6166registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
6267registerGlobal home name =
63− Tracker $ \n k g f ok ->
68+ Tracker $ \uid deps fields ok ->
6469 let global = Opt.Global home name in
65− ok n k (Set.insert global g) f (Opt.VarGlobal global)
70+ ok uid (Set.insert global deps) fields (Opt.VarGlobal global)
6671
6772
6873registerField :: N.Name -> a -> Tracker a
6974registerField name value =
70− Tracker $ \n k g fields ok ->
71− ok n k g (Map.insertWith (+) name 1 fields) value
75+ Tracker $ \uid d fields ok ->
76+ ok uid d (Map.insertWith (+) name 1 fields) value
7277
7378
7479registerFieldDict :: Map.Map N.Name v -> a -> Tracker a
7580registerFieldDict newFields value =
76− Tracker $ \n k g fields ok ->
77− ok n k g (Map.unionWith (+) fields (Map.map toOne newFields)) value
81+ Tracker $ \uid d fields ok ->
82+ ok uid d (Map.unionWith (+) fields (Map.map toOne newFields)) value
7883
7984
8085toOne :: a -> Int
@@ -83,8 +88,8 @@ toOne _ = 1
8388
8489registerFieldList :: [N.Name] -> a -> Tracker a
8590registerFieldList names value =
86− Tracker $ \n k g fields ok ->
87− ok n k g (foldr addOne fields names) value
91+ Tracker $ \uid deps fields ok ->
92+ ok uid deps (foldr addOne fields names) value
8893
8994
9095addOne :: N.Name -> Map.Map N.Name Int -> Map.Map N.Name Int
@@ -98,40 +103,40 @@ addOne name fields =
98103
99104instance Functor Tracker where
100105 fmap func (Tracker kv) =
101− Tracker $ \n k g f ok ->
106+ Tracker $ \n d f ok ->
102107 let
103− ok1 n1 k1 g1 f1 value =
104− ok n1 k1 g1 f1 (func value)
108+ ok1 n1 d1 f1 value =
109+ ok n1 d1 f1 (func value)
105110 in
106− kv n k g f ok1
111+ kv n d f ok1
107112
108113
109114instance Applicative Tracker where
110115 {-# INLINE pure #-}
111116 pure value =
112− Tracker $ \n k g f ok -> ok n k g f value
117+ Tracker $ \n d f ok -> ok n d f value
113118
114119 (<*>) (Tracker kf) (Tracker kv) =
115− Tracker $ \n0 k0 g0 f0 ok ->
120+ Tracker $ \n d f ok ->
116121 let
117− ok1 n1 k1 g1 f1 func =
122+ ok1 n1 d1 f1 func =
118123 let
119− ok2 n2 k2 g2 f2 value =
120− ok n2 k2 g2 f2 (func value)
124+ ok2 n2 d2 f2 value =
125+ ok n2 d2 f2 (func value)
121126 in
122− kv n1 k1 g1 f1 ok2
127+ kv n1 d1 f1 ok2
123128 in
124− kf n0 k0 g0 f0 ok1
129+ kf n d f ok1
125130
126131
127132instance Monad Tracker where
128133 return = pure
129134
130− (>>=) (Tracker ka) callback =
131− Tracker $ \n k g f ok ->
135+ (>>=) (Tracker k) callback =
136+ Tracker $ \n d f ok ->
132137 let
133− ok1 n1 k1 g1 f1 a =
138+ ok1 n1 d1 f1 a =
134139 case callback a of
135− Tracker kb -> kb n1 k1 g1 f1 ok
140+ Tracker kb -> kb n1 d1 f1 ok
136141 in
137− ka n k g f ok1
142+ k n d f ok1