on master help sign in
Split Opt.Graph into GlobalGraph and LocalGraph
7c1f925Evan Czaplicki
compiler/src/AST/Optimized.hs+71−27
@@ -7,21 +7,24 @@ module AST.Optimized
7 , Destructor(..)
7 , Destructor(..)
8 , Decider(..)
8 , Decider(..)
9 , Choice(..)
9 , Choice(..)
10− , Graph(..)
10+ , GlobalGraph(..)
11+ , LocalGraph(..)
11 , Main(..)
12 , Main(..)
12 , Node(..)
13 , Node(..)
13 , EffectsType(..)
14 , EffectsType(..)
14 , empty
15 , empty
15− , union
16+ , addGlobalGraph
16− , unions
17+ , addLocalGraph
18+ , addKernel
19+ , toKernelGlobal
17 )
20 )
18 where
21 where
19
22
20
23
21import Control.Monad (liftM, liftM2, liftM3, liftM4)
24import Control.Monad (liftM, liftM2, liftM3, liftM4)
22import Data.Binary (Binary, get, put, getWord8, putWord8)
25import Data.Binary (Binary, get, put, getWord8, putWord8)
23−import qualified Data.List as List
24import qualified Data.Map as Map
26import qualified Data.Map as Map
27+import qualified Data.Name as Name
25import Data.Name (Name)
28import Data.Name (Name)
26import qualified Data.Set as Set
29import qualified Data.Set as Set
27import qualified Data.Utf8 as Utf8
30import qualified Data.Utf8 as Utf8
@@ -31,6 +34,7 @@ import qualified AST.Utils.Shader as Shader
31import qualified Data.Index as Index
34import qualified Data.Index as Index
32import qualified Elm.Kernel as K
35import qualified Elm.Kernel as K
33import qualified Elm.ModuleName as ModuleName
36import qualified Elm.ModuleName as ModuleName
37+import qualified Elm.Package as Pkg
34import qualified Optimize.DecisionTree as DT
38import qualified Optimize.DecisionTree as DT
35import qualified Reporting.Annotation as A
39import qualified Reporting.Annotation as A
36
40
@@ -121,11 +125,18 @@ data Choice
121-- OBJECT GRAPH
125-- OBJECT GRAPH
122
126
123
127
124−data Graph =
128+data GlobalGraph =
125− Graph
129+ GlobalGraph
126− { _mains :: Map.Map ModuleName.Canonical Main
130+ { _g_nodes :: Map.Map Global Node
131+ , _g_fields :: Map.Map Name Int
132+ }
133+
134+
135+data LocalGraph =
136+ LocalGraph
137+ { _l_main :: Maybe Main
127− , _nodes :: Map.Map Global Node
138+ , _l_nodes :: Map.Map Global Node -- TODO profile switching Global to Name
128− , _fields :: Map.Map Name Int
139+ , _l_fields :: Map.Map Name Int
129 }
140 }
130
141
131
142
@@ -159,27 +170,55 @@ data EffectsType = Cmd | Sub | Fx
159
170
160
171
161{-# NOINLINE empty #-}
172{-# NOINLINE empty #-}
162−empty :: Graph
173+empty :: GlobalGraph
163empty =
174empty =
164− Graph Map.empty Map.empty Map.empty
175+ GlobalGraph Map.empty Map.empty
165
176
166
177
167−union :: Graph -> Graph -> Graph
178+addGlobalGraph :: GlobalGraph -> GlobalGraph -> GlobalGraph
168−union (Graph mains1 graph1 fields1) (Graph mains2 graph2 fields2) =
179+addGlobalGraph (GlobalGraph nodes1 fields1) (GlobalGraph nodes2 fields2) =
169− Graph
180+ GlobalGraph
170− (Map.union mains1 mains2)
181+ { _g_nodes = Map.union nodes1 nodes2
171− (Map.union graph1 graph2)
172− (Map.union fields1 fields2)
182+ , _g_fields = Map.union fields1 fields2
183+ }
173
184
174
185
175−unions :: [Graph] -> Graph
186+addLocalGraph :: LocalGraph -> GlobalGraph -> GlobalGraph
176−unions graphs =
187+addLocalGraph (LocalGraph _ nodes1 fields1) (GlobalGraph nodes2 fields2) =
177− case graphs of
188+ GlobalGraph
178− [] ->
189+ { _g_nodes = Map.union nodes1 nodes2
179− empty
190+ , _g_fields = Map.union fields1 fields2
191+ }
192+
180
193
181− g:gs ->
194+addKernel :: Name.Name -> [K.Chunk] -> GlobalGraph -> GlobalGraph
182− List.foldl' union g gs
195+addKernel shortName chunks (GlobalGraph nodes fields) =
196+ let
197+ global = toKernelGlobal shortName
198+ node = Kernel chunks (foldr addKernelDep Set.empty chunks)
199+ in
200+ GlobalGraph
201+ { _g_nodes = Map.insert global node nodes
202+ , _g_fields = Map.union (K.countFields chunks) fields
203+ }
204+
205+
206+addKernelDep :: K.Chunk -> Set.Set Global -> Set.Set Global
207+addKernelDep chunk deps =
208+ case chunk of
209+ K.JS _ -> deps
210+ K.ElmVar home name -> Set.insert (Global home name) deps
211+ K.JsVar shortName _ -> Set.insert (toKernelGlobal shortName) deps
212+ K.ElmField _ -> deps
213+ K.JsField _ -> deps
214+ K.JsEnum _ -> deps
215+ K.Debug -> deps
216+ K.Prod -> deps
217+
218+
219+toKernelGlobal :: Name.Name -> Global
220+toKernelGlobal shortName =
221+ Global (ModuleName.Canonical Pkg.kernel shortName) Name.dollar
183
222
184
223
185
224
@@ -323,9 +362,14 @@ instance Binary Choice where
323
362
324
363
325
364
326−instance Binary Graph where
365+instance Binary GlobalGraph where
366+ get = liftM2 GlobalGraph get get
367+ put (GlobalGraph a b) = put a >> put b
368+
369+
370+instance Binary LocalGraph where
327− get = liftM3 Graph get get get
371+ get = liftM3 LocalGraph get get get
328− put (Graph a b c) = put a >> put b >> put c
372+ put (LocalGraph a b c) = put a >> put b >> put c
329
373
330
374
331instance Binary Main where
375instance Binary Main where