git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Remove (<<<)/(>>>) inlining. Move `pure` inlining to `magicDo`.
commit681dd8b0fb0b8cc70757d78af5bd1d99f958a09c authorjoneshf <jones3.hardy@gmail.com> dateSun 3 Aug 2014, 11:53 (12 years ago) parentf259d87
4 files changed+9−37
src/Language/PureScript/Constants.hs−6 src/Language/PureScript/Optimizer.hs−2 src/Language/PureScript/Optimizer/Inliner.hs−29 src/Language/PureScript/Optimizer/MagicDo.hs+9
src/Language/PureScript/Constants.hs−6
@@ -23,12 +23,6 @@ module Language.PureScript.Constants where
2323(#) :: String
2424(#) = "#"
2525
26−(<<<) :: String
27−(<<<) = "<<<"
28−
29−(>>>) :: String
30−(>>>) = ">>>"
31−
3226(<>) :: String
3327(<>) = "<>"
3428
src/Language/PureScript/Optimizer.hs−2
@@ -61,8 +61,6 @@ optimize opts | optionsNoOptimizations opts = id
6161 , etaConvert
6262 , evaluateIifes
6363 , inlineVariables
64− , inlinePure
65− , inlineCompose
6664 , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
6765 , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
6866 , inlineOperator (C.preludeUnsafe, C.unsafeIndex) $ flip JSIndexer
src/Language/PureScript/Optimizer/Inliner.hs−29
@@ -15,8 +15,6 @@
1515
1616module Language.PureScript.Optimizer.Inliner (
1717 inlineVariables,
18− inlinePure,
19− inlineCompose,
2018 inlineOperator,
2119 inlineCommonOperators,
2220 etaConvert,
@@ -30,7 +28,6 @@ import Language.PureScript.CodeGen.JS.AST
3028import Language.PureScript.CodeGen.Common (identToJs)
3129import Language.PureScript.Optimizer.Common
3230import Language.PureScript.Names
33−import Language.PureScript.Supply (freshName, evalSupply)
3431
3532import qualified Language.PureScript.Constants as C
3633
@@ -74,32 +71,6 @@ evaluateIifes = everywhereOnJS convert
7471 convert (JSApp (JSFunction Nothing [] (JSBlock [JSReturn ret])) []) = ret
7572 convert js = js
7673
77−inlinePure :: JS -> JS
78−inlinePure = everywhereOnJS convert
79− where
80− convert :: JS -> JS
81− convert (JSApp (JSApp p eff) [js]) | isPure p && isEff eff = JSFunction Nothing [] (JSBlock [JSReturn js])
82− convert other = other
83− isPure (JSAccessor f (JSVar prelude)) = (f == C.pure' || f == C.return) && prelude == C.prelude
84− isPure _ = False
85− isEff [JSApp (JSAccessor app (JSVar eff)) _] = app == C.applicativeEffDictionary && eff == C.eff
86− isEff _ = False
87−
88−inlineCompose :: JS -> JS
89−inlineCompose = everywhereOnJS convert
90− where
91− convert :: JS -> JS
92− convert (JSApp (JSApp comp [f]) [g]) | isBackwardComp comp = JSFunction Nothing [var] (JSBlock [JSReturn (JSApp f [JSApp g [JSVar var]])])
93− convert (JSApp (JSApp comp [f]) [g]) | isForwardComp comp = JSFunction Nothing [var] (JSBlock [JSReturn (JSApp g [JSApp f [JSVar var]])])
94− convert other = other
95− var = evalSupply 1 freshName
96− isBackwardComp (JSApp (JSIndexer (JSStringLiteral comp) (JSVar prelude)) semi) = comp == (C.<<<) && prelude == C.prelude && isSemi semi
97− isBackwardComp _ = False
98− isForwardComp (JSApp (JSIndexer (JSStringLiteral comp) (JSVar prelude)) semi) = comp == (C.>>>) && prelude == C.prelude && isSemi semi
99− isForwardComp _ = False
100− isSemi [JSApp (JSAccessor semi (JSVar prelude)) _] = semi == C.semigroupoidArr && prelude == C.prelude
101− isSemi _ = False
102−
10374inlineVariables :: JS -> JS
10475inlineVariables = everywhereOnJS $ removeFromBlock go
10576 where
src/Language/PureScript/Optimizer/MagicDo.hs+9
@@ -57,6 +57,8 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
5757 convert :: JS -> JS
5858 -- Desugar return
5959 convert (JSApp (JSApp ret [val]) []) | isReturn ret = val
60+ -- Desugar pure
61+ convert (JSApp (JSApp pure' [val]) []) | isPure pure' = val
6062 -- Desugar >>
6163 convert (JSApp (JSApp bind [m]) [JSFunction Nothing ["_"] (JSBlock js)]) | isBind bind && isJSReturn (last js) =
6264 let JSReturn ret = last js in
@@ -78,6 +80,9 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
7880 -- Check if an expression represents a monomorphic call to return for the Eff monad
7981 isReturn (JSApp retPoly [effDict]) | isRetPoly retPoly && isEffDict C.monadEffDictionary effDict = True
8082 isReturn _ = False
83+ -- Check if an expression represents a monomorphic call to pure for the Eff applicative
84+ isPure (JSApp purePoly [effDict]) | isPurePoly purePoly && isEffDict C.applicativeEffDictionary effDict = True
85+ isPure _ = False
8186 -- Check if an expression represents the polymorphic >>= function
8287 isBindPoly (JSAccessor prop (JSVar prelude)) = prelude == C.prelude && prop == identToJs (Op (C.>>=))
8388 isBindPoly (JSIndexer (JSStringLiteral bind) (JSVar prelude)) = prelude == C.prelude && bind == (C.>>=)
@@ -86,6 +91,10 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
8691 isRetPoly (JSAccessor returnEscaped (JSVar prelude)) = prelude == C.prelude && returnEscaped == C.returnEscaped
8792 isRetPoly (JSIndexer (JSStringLiteral return') (JSVar prelude)) = prelude == C.prelude && return' == C.return
8893 isRetPoly _ = False
94+ -- Check if an expression represents the polymorphic pure function
95+ isPurePoly (JSAccessor pure' (JSVar prelude)) = prelude == C.prelude && pure' == C.pure'
96+ isPurePoly (JSIndexer (JSStringLiteral pure') (JSVar prelude)) = prelude == C.prelude && pure' == C.pure'
97+ isPurePoly _ = False
8998 -- Check if an expression represents a function in the Ef module
9099 isEffFunc name (JSAccessor name' (JSVar eff)) = eff == C.eff && name == name'
91100 isEffFunc _ _ = False