on master help sign in
Include freeVars in Opt.Facts
99ff520JoeyEremondi
src/AST/Expression/Optimized.hs+3−1
@@ -6,6 +6,7 @@ module AST.Expression.Optimized
6 ) where
6 ) where
7
7
8import qualified AST.Expression.General as General
8import qualified AST.Expression.General as General
9+import qualified AST.Expression.Canonical as Canonical
9import qualified AST.Pattern as Pattern
10import qualified AST.Pattern as Pattern
10import qualified AST.Type as Type
11import qualified AST.Type as Type
11import qualified AST.Variable as Var
12import qualified AST.Variable as Var
@@ -26,10 +27,11 @@ data Def
26
27
27data Facts = Facts
28data Facts = Facts
28 { tailRecursionDetails :: Maybe String
29 { tailRecursionDetails :: Maybe String
30+ , freeVariables :: [Var.Canonical]
29 }
31 }
30 deriving (Show)
32 deriving (Show)
31
33
32
34
33dummyFacts :: Facts
35dummyFacts :: Facts
34dummyFacts =
36dummyFacts =
35− Facts Nothing
37+ Facts Nothing []
src/Optimize/TailCalls.hs+7−2
@@ -51,7 +51,7 @@ mapSnd func (x, a) =
51-- CONVERT DEFINITIONS
51-- CONVERT DEFINITIONS
52
52
53detectTailRecursion :: Can.Def -> Opt.Def
53detectTailRecursion :: Can.Def -> Opt.Def
54−detectTailRecursion (Can.Definition _ pattern expression _) =
54+detectTailRecursion (Can.Definition canonFacts pattern expression _) =
55 let
55 let
56 (args, body) =
56 (args, body) =
57 Expr.collectLambdas expression
57 Expr.collectLambdas expression
@@ -71,9 +71,14 @@ detectTailRecursion (Can.Definition _ pattern expression _) =
71
71
72 lambda x e =
72 lambda x e =
73 A.A () (Lambda x e)
73 A.A () (Lambda x e)
74+
75+ facts =
76+ Opt.Facts
77+ (if isTailCall then fmap fst context else Nothing)
78+ (Can.freeVariables canonFacts)
74 in
79 in
75 Opt.Definition
80 Opt.Definition
76− (Opt.Facts (if isTailCall then fmap fst context else Nothing))
81+ facts
77 (removeAnnotations pattern)
82 (removeAnnotations pattern)
78 (foldr lambda optExpr (map removeAnnotations args))
83 (foldr lambda optExpr (map removeAnnotations args))
79
84