git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
TCO loop fixes
0cd4f99Andy Arvanitis
src/CodeGen/IL/Optimizer/TCO.hs+2−2
@@ -91,9 +91,9 @@ tco mn = everywhere convert where
91 Block rootSS $
91 Block rootSS $
92 concatMap (\arg -> [ VariableIntroduction rootSS (tcoVar arg) . Just $
92 concatMap (\arg -> [ VariableIntroduction rootSS (tcoVar arg) . Just $
93 Var rootSS (copyVar arg) ]) (outerArgs ++ innerArgs) ++
93 Var rootSS (copyVar arg) ]) (outerArgs ++ innerArgs) ++
94− [ Var rootSS (tcoDone <> " := false")
94+ [ Assignment rootSS (Var rootSS $ "var " <> tcoDone) $ BooleanLiteral Nothing 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 . copyVar) innerArgs))))])
99 [(Assignment rootSS (Var rootSS tcoResult) (App rootSS (Var rootSS tcoLoop) ((map (Var rootSS . tcoVar) outerArgs) ++ (map (Var rootSS . copyVar) innerArgs))))])
src/CodeGen/IL/Printer.hs+7−1
@@ -95,11 +95,17 @@ literals = mkPattern' match'
95 , return $ emit ")"
95 , return $ emit ")"
96 ]
96 ]
97 match (App _ (Var _ fn) [arg]) | fn == arrayLengthFn = mconcat <$> sequence
97 match (App _ (Var _ fn) [arg]) | fn == arrayLengthFn = mconcat <$> sequence
98− [ return $ emit arrayLengthFn
98+ [ return $ emit fn
99 , return $ emit "("
99 , return $ emit "("
100 , prettyPrintIL' arg
100 , prettyPrintIL' arg
101 , return $ emit ")"
101 , return $ emit ")"
102 ]
102 ]
103+ match (App _ (Var _ fn) args) | fn == tcoLoop = mconcat <$> sequence
104+ [ return $ emit fn
105+ , return $ emit "("
106+ , intercalate (emit ", ") <$> forM args prettyPrintIL'
107+ , return $ emit ")"
108+ ]
103 match app@(App{})
109 match app@(App{})
104 | (val, args) <- unApp app []
110 | (val, args) <- unApp app []
105 , length args > 1
111 , length args > 1