@@ -7,21 +7,24 @@ module AST.Optimized
7 , Destructor(..)
7 , Destructor(..)
8 , Decider(..)
8 , Decider(..)
9 , Choice(..)
9 , Choice(..)
10− , Graph(..)
10+ , GlobalGraph(..)
11 , Main(..)
12 , Main(..)
12 , Node(..)
13 , Node(..)
13 , EffectsType(..)
14 , EffectsType(..)
15− , union
16+ , addGlobalGraph
16− , unions
17+ , addLocalGraph
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
@@ -121,11 +125,18 @@ data Choice
121-- OBJECT GRAPH
125-- OBJECT GRAPH
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
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
@@ -159,27 +170,55 @@ data EffectsType = Cmd | Sub | Fx
161{-# NOINLINE empty #-}
172{-# NOINLINE empty #-}
162−empty :: Graph
173+empty :: GlobalGraph
164− Graph Map.empty Map.empty Map.empty
175+ GlobalGraph Map.empty Map.empty
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
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
181− g:gs ->
194+addKernel :: Name.Name -> [K.Chunk] -> GlobalGraph -> GlobalGraph
182− List.foldl' union g gs
195+addKernel shortName chunks (GlobalGraph nodes fields) =
197+ global = toKernelGlobal shortName
198+ node = Kernel chunks (foldr addKernelDep Set.empty chunks)
201+ { _g_nodes = Map.insert global node nodes
202+ , _g_fields = Map.union (K.countFields chunks) fields
206+addKernelDep :: K.Chunk -> Set.Set Global -> Set.Set Global
207+addKernelDep chunk 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
219+toKernelGlobal :: Name.Name -> Global
220+toKernelGlobal shortName =
221+ Global (ModuleName.Canonical Pkg.kernel shortName) Name.dollar
@@ -323,9 +362,14 @@ instance Binary Choice where
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
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
331instance Binary Main where
375instance Binary Main where