git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Pass args by value in TCO loop fn
d06f225Andy Arvanitis
src/CodeGen/Cpp/Printer.hs+19−6
@@ -158,12 +158,16 @@ literals = mkPattern' match'
158 , prettyPrintCpp' ret
158 , prettyPrintCpp' ret
159 ]
159 ]
160 match (Function _ name args ret) = mconcat <$> sequence
160 match (Function _ name args ret) = mconcat <$> sequence
161− [ return $ emit $ if name == (Just tcoLoop) then "[&]" else "[=]"
161+ [ return $ emit captures
162 , return $ emit "("
162 , return $ emit "("
163− , return $ emit $ intercalate ", " (renderArg <$> args)
163+ , return $ emit $ intercalate ", " (render <$> args)
164 , return $ emit ") -> boxed "
164 , return $ emit ") -> boxed "
165 , prettyPrintCpp' ret
165 , prettyPrintCpp' ret
166 ]
166 ]
167+ where
168+ (captures, render)
169+ | name == Just tcoLoop = ("[&]", renderArgByVal)
170+ | otherwise = ("[=]", renderArg)
167 match (Indexer _ prop@(Var _ name) val) = mconcat <$> sequence
171 match (Indexer _ prop@(Var _ name) val) = mconcat <$> sequence
168 [ prettyPrintCpp' val
172 [ prettyPrintCpp' val
169 , return $ emit "::"
173 , return $ emit "::"
@@ -482,12 +486,21 @@ implFooterSource mn foreigns =
482 \"
486 \"
483
487
484varDecl :: Text
488varDecl :: Text
485−varDecl = "const boxed&"
489+varDecl = "const boxed"
490+
491+varRefDecl :: Text
492+varRefDecl = varDecl <> "&"
493+
494+renderArg' :: Text -> Text -> Text
495+renderArg' decl arg
496+ | arg == unusedName = decl
497+ | otherwise = decl <> " " <> arg
486
498
487renderArg :: Text -> Text
499renderArg :: Text -> Text
488−renderArg arg
500+renderArg = renderArg' varRefDecl
489− | arg == unusedName = varDecl
501+
490− | otherwise = varDecl <> " " <> arg
502+renderArgByVal :: Text -> Text
503+renderArgByVal = renderArg' varDecl
491
504
492foreignDict :: Text
505foreignDict :: Text
493foreignDict = "foreign"
506foreignDict = "foreign"