git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
TCO updates
2f68d4eAndy Arvanitis
src/CodeGen/IL/Optimizer/TCO.hs+4−4
@@ -89,14 +89,14 @@ tco mn = everywhere convert where
89 toLoop :: Text -> [Text] -> [Text] -> AST -> AST
89 toLoop :: Text -> [Text] -> [Text] -> AST -> AST
90 toLoop ident outerArgs innerArgs js =
90 toLoop ident outerArgs innerArgs js =
91 Block rootSS $
91 Block rootSS $
92− concatMap (\arg -> [ VariableIntroduction rootSS (tcoVar arg) Nothing
92+ concatMap (\arg -> [ VariableIntroduction rootSS (tcoVar arg) . Just $
93− , Assignment rootSS (Var rootSS (tcoVar arg)) (Var rootSS (copyVar arg)) ]) (outerArgs ++ innerArgs) ++
93+ Var rootSS (copyVar arg) ]) (outerArgs ++ innerArgs) ++
94 [ Var rootSS (tcoDone <> " := false")
94 [ Var rootSS (tcoDone <> " := false")
95 , VariableIntroduction rootSS tcoResult Nothing
95 , VariableIntroduction rootSS tcoResult Nothing
96 , Assignment rootSS (Var rootSS ("var " <> tcoLoop)) (Function rootSS (Just tcoLoop) (outerArgs ++ innerArgs) (Block rootSS [loopify js]))
96 , Assignment rootSS (Var rootSS ("var " <> tcoLoop)) (Function rootSS (Just tcoLoop) (outerArgs ++ innerArgs) (Block rootSS [loopify js]))
97 , While rootSS (Unary Nothing Not (Var rootSS tcoDone))
97 , While rootSS (Unary Nothing Not (Var rootSS tcoDone))
98 (Block rootSS
98 (Block rootSS
99− [(Assignment rootSS (Var rootSS tcoResult) (App rootSS (Var rootSS tcoLoop) ((map (Var rootSS . tcoVar) outerArgs) ++ (map (Var rootSS . tcoVar) innerArgs))))])
99+ [(Assignment rootSS (Var rootSS tcoResult) (App rootSS (Var rootSS tcoLoop) ((map (Var rootSS . tcoVar) outerArgs) ++ (map (Var rootSS . copyVar) innerArgs))))])
100 , Return rootSS (Var rootSS tcoResult)
100 , Return rootSS (Var rootSS tcoResult)
101 ]
101 ]
102 where
102 where
@@ -112,7 +112,7 @@ tco mn = everywhere convert where
112 zipWith (\val arg ->
112 zipWith (\val arg ->
113 Assignment ss (Var ss (tcoVar arg)) val) allArgumentValues outerArgs
113 Assignment ss (Var ss (tcoVar arg)) val) allArgumentValues outerArgs
114 ++ zipWith (\val arg ->
114 ++ zipWith (\val arg ->
115− Assignment ss (Var ss (tcoVar arg)) val) (drop (length outerArgs) allArgumentValues) innerArgs
115+ Assignment ss (Var ss (copyVar arg)) val) (drop (length outerArgs) allArgumentValues) innerArgs
116 ++ [ ReturnNoResult ss ]
116 ++ [ ReturnNoResult ss ]
117 | otherwise = Block ss [ markDone ss, Return ss ret ]
117 | otherwise = Block ss [ markDone ss, Return ss ret ]
118 loopify (ReturnNoResult ss) = Block ss [ markDone ss, ReturnNoResult ss ]
118 loopify (ReturnNoResult ss) = Block ss [ markDone ss, ReturnNoResult ss ]