git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Pass args by value in TCO loop fn
commitd06f225b8e8585440b8e390f291b794b0e8fb8fd authorAndy Arvanitis <andyarvanitis@gmail.com> dateWed 10 Oct 2018, 19:10 (8 years ago) parente34cc85
1 file changed+19−6
src/CodeGen/Cpp/Printer.hs+19−6
src/CodeGen/Cpp/Printer.hs+19−6
@@ -158,12 +158,16 @@ literals = mkPattern' match'
158158 , prettyPrintCpp' ret
159159 ]
160160 match (Function _ name args ret) = mconcat <$> sequence
161− [ return $ emit $ if name == (Just tcoLoop) then "[&]" else "[=]"
161+ [ return $ emit captures
162162 , return $ emit "("
163− , return $ emit $ intercalate ", " (renderArg <$> args)
163+ , return $ emit $ intercalate ", " (render <$> args)
164164 , return $ emit ") -> boxed "
165165 , prettyPrintCpp' ret
166166 ]
167+ where
168+ (captures, render)
169+ | name == Just tcoLoop = ("[&]", renderArgByVal)
170+ | otherwise = ("[=]", renderArg)
167171 match (Indexer _ prop@(Var _ name) val) = mconcat <$> sequence
168172 [ prettyPrintCpp' val
169173 , return $ emit "::"
@@ -482,12 +486,21 @@ implFooterSource mn foreigns =
482486 \"
483487
484488varDecl :: 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
486498
487499renderArg :: Text -> Text
488−renderArg arg
489− | arg == unusedName = varDecl
490− | otherwise = varDecl <> " " <> arg
500+renderArg = renderArg' varRefDecl
501+
502+renderArgByVal :: Text -> Text
503+renderArgByVal = renderArg' varDecl
491504
492505foreignDict :: Text
493506foreignDict = "foreign"