git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix some recursion issues
ea5cddaAndy Arvanitis
src/Language/PureScript/CodeGen/Cpp/Recursion.hs+15−5
@@ -18,7 +18,7 @@ module Language.PureScript.CodeGen.Cpp.Recursion
18
18
19import Prelude.Compat
19import Prelude.Compat
20import Data.List
20import Data.List
21−import Data.Maybe (fromJust)
21+import Data.Maybe (catMaybes, fromJust)
22import Data.Monoid ((<>))
22import Data.Monoid ((<>))
23import Data.Text (Text)
23import Data.Text (Text)
24
24
@@ -68,7 +68,10 @@ convertRecursiveLets = everywhereOnCpp go
68convertRecursive :: [Text] -> [Cpp] -> [Cpp]
68convertRecursive :: [Text] -> [Cpp] -> [Cpp]
69-------------------------------------------------------------------------------------------------
69-------------------------------------------------------------------------------------------------
70convertRecursive names cpps
70convertRecursive names cpps
71+ | (_:_) <- lets
71− | (_:_) <- lets = (everywhereOnCppTopDown remRecLet <$> cpps) ++ undefines
72+ = let recLets = everywhereOnCppTopDown convRecLet <$> cpps
73+ letDeps = catMaybes (letDep <$> cpps)
74+ in nub (letDeps ++ recLets) ++ undefines
72 where
75 where
73 tableName :: Text
76 tableName :: Text
74 tableName = "let"
77 tableName = "let"
@@ -88,12 +91,19 @@ convertRecursive names cpps
88 | name `elem` names = [cpp]
91 | name `elem` names = [cpp]
89 recLet _ = []
92 recLet _ = []
90 --
93 --
91− remRecLet :: Cpp -> Cpp
94+ convRecLet :: Cpp -> Cpp
92− remRecLet cpp@(CppVariableIntroduction (name, _) _ (Just _))
95+ convRecLet cpp@(CppVariableIntroduction (name, _) _ (Just _))
93 | name == head names = CppNamespace "" $ defines ++ [letTable]
96 | name == head names = CppNamespace "" $ defines ++ [letTable]
94 | name `elem` names = CppNoOp
97 | name `elem` names = CppNoOp
95 | otherwise = cpp
98 | otherwise = cpp
96− remRecLet cpp = cpp
99+ convRecLet cpp = cpp
100+ --
101+ letDep :: Cpp -> Maybe Cpp
102+ letDep cpp@(CppVariableIntroduction (name, _) _ (Just _))
103+ | name `elem` names = Nothing
104+ | everythingOnCpp (||) (\v -> v == CppVar name) letTable = Just cpp
105+ | otherwise = Nothing
106+ letDep _ = Nothing
97 --
107 --
98 tableItem :: Cpp -> (Text, Cpp)
108 tableItem :: Cpp -> (Text, Cpp)
99 tableItem (CppVariableIntroduction (name, _) _ (Just body)) =
109 tableItem (CppVariableIntroduction (name, _) _ (Just body)) =