git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Workaround for TCO/composition inlining interaction
5481c38Gary Burgess
examples/passing/TCO.pursnew file+20
@@ -0,0 +1,20 @@
1+module Main where
2+
3+import Prelude
4+import Control.Monad.Eff.Console (print)
5+
6+main = do
7+ let f x = x + 1
8+ let v = 0
9+ print (applyN 0 f v)
10+ print (applyN 1 f v)
11+ print (applyN 2 f v)
12+ print (applyN 3 f v)
13+ print (applyN 4 f v)
14+
15+applyN :: forall a. Int -> (a -> a) -> a -> a
16+applyN = go id
17+ where
18+ go f n _ | n <= 0 = f
19+ go f n g = go (f >>> g) (n - 1) g
20+
src/Language/PureScript/CodeGen/JS/Optimizer.hs+14−10
@@ -51,11 +51,21 @@ optimize js = do
51optimize' :: (Monad m, MonadReader Options m, Applicative m, MonadSupply m) => JS -> m JS
51optimize' :: (Monad m, MonadReader Options m, Applicative m, MonadSupply m) => JS -> m JS
52optimize' js = do
52optimize' js = do
53 opts <- ask
53 opts <- ask
54− untilFixedPoint (inlineFnComposition . applyAll
54+ js' <- untilFixedPoint (inlineFnComposition . tidyUp . applyAll
55+ [ inlineCommonValues
56+ , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
57+ , inlineOperator (C.dataFunction, C.apply) $ \f x -> JSApp f [x]
58+ , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
59+ , inlineOperator (C.dataFunction, C.applyFlipped) $ \x f -> JSApp f [x]
60+ , inlineOperator (C.dataArrayUnsafe, C.unsafeIndex) $ flip JSIndexer
61+ , inlineCommonOperators
62+ ]) js
63+ untilFixedPoint (return . tidyUp) . tco opts . magicDo opts $ js'
64+ where
65+ tidyUp :: JS -> JS
66+ tidyUp = applyAll
55 [ collapseNestedBlocks
67 [ collapseNestedBlocks
56 , collapseNestedIfs
68 , collapseNestedIfs
57− , tco opts
58− , magicDo opts
59 , removeCodeAfterReturnStatements
69 , removeCodeAfterReturnStatements
60 , removeUnusedArg
70 , removeUnusedArg
61 , removeUndefinedApp
71 , removeUndefinedApp
@@ -63,13 +73,7 @@ optimize' js = do
63 , etaConvert
73 , etaConvert
64 , evaluateIifes
74 , evaluateIifes
65 , inlineVariables
75 , inlineVariables
66− , inlineValues
76+ ]
67− , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
68− , inlineOperator (C.dataFunction, C.apply) $ \f x -> JSApp f [x]
69− , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
70− , inlineOperator (C.dataFunction, C.applyFlipped) $ \x f -> JSApp f [x]
71− , inlineOperator (C.dataArrayUnsafe, C.unsafeIndex) $ flip JSIndexer
72− , inlineCommonOperators ]) js
73
77
74untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
78untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
75untilFixedPoint f = go
79untilFixedPoint f = go
src/Language/PureScript/CodeGen/JS/Optimizer/Inliner.hs+3−3
@@ -3,7 +3,7 @@
3--
3--
4module Language.PureScript.CodeGen.JS.Optimizer.Inliner
4module Language.PureScript.CodeGen.JS.Optimizer.Inliner
5 ( inlineVariables
5 ( inlineVariables
6− , inlineValues
6+ , inlineCommonValues
7 , inlineOperator
7 , inlineOperator
8 , inlineCommonOperators
8 , inlineCommonOperators
9 , inlineFnComposition
9 , inlineFnComposition
@@ -77,8 +77,8 @@ inlineVariables = everywhereOnJS $ removeFromBlock go
77 go (map (replaceIdent var js) sts)
77 go (map (replaceIdent var js) sts)
78 go (s:sts) = s : go sts
78 go (s:sts) = s : go sts
79
79
80−inlineValues :: JS -> JS
80+inlineCommonValues :: JS -> JS
81−inlineValues = everywhereOnJS convert
81+inlineCommonValues = everywhereOnJS convert
82 where
82 where
83 convert :: JS -> JS
83 convert :: JS -> JS
84 convert (JSApp fn [dict])
84 convert (JSApp fn [dict])