git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Optimise __unused and fn(undefined)
commitc927374afe8111282a7fbce28d02d203fc557ac5 authorGary Burgess <gary.burgess@gmail.com> dateTue 12 Aug 2014, 20:48 (12 years ago) parent1b46a84
5 files changed+26−17
src/Language/PureScript/CodeGen/JS/AST.hs−8 src/Language/PureScript/Optimizer.hs+2 src/Language/PureScript/Optimizer/Inliner.hs+2−3 src/Language/PureScript/Optimizer/MagicDo.hs+3−3 src/Language/PureScript/Optimizer/Unused.hs+19−3
src/Language/PureScript/CodeGen/JS/AST.hs−8
@@ -19,8 +19,6 @@ module Language.PureScript.CodeGen.JS.AST where
1919
2020import Data.Data
2121
22−import qualified Language.PureScript.Constants as C
23−
2422-- |
2523-- Built-in unary operators
2624--
@@ -244,12 +242,6 @@ data JS
244242 --
245243 | JSRaw String deriving (Show, Eq, Data, Typeable)
246244
247−-- |
248−-- Javascript representation of the unit value.
249−--
250−jsUndefined :: JS
251−jsUndefined = JSVar C.undefined
252−
253245--
254246-- Traversals
255247--
src/Language/PureScript/Optimizer.hs+2
@@ -57,6 +57,8 @@ optimize opts | optionsNoOptimizations opts = id
5757 , tco opts
5858 , magicDo opts
5959 , removeCodeAfterReturnStatements
60+ , removeUnusedArg
61+ , removeUndefinedApp
6062 , unThunk
6163 , etaConvert
6264 , evaluateIifes
src/Language/PureScript/Optimizer/Inliner.hs+2−3
@@ -49,8 +49,7 @@ etaConvert = everywhereOnJS convert
4949 not (any (`isRebound` block) (map JSVar idents)) &&
5050 not (any (`isRebound` block) args)
5151 = JSBlock (map (replaceIdents (zip idents args)) body)
52− convert (JSFunction Nothing [arg] (JSBlock [JSReturn (JSApp fn@JSVar{} [val])]))
53− | arg == C.__unused && val == jsUndefined = fn
52+ convert (JSFunction Nothing [] (JSBlock [JSReturn (JSApp fn [])])) = fn
5453 convert js = js
5554
5655unThunk :: JS -> JS
@@ -154,7 +153,7 @@ inlineCommonOperators = applyAll $
154153 convert other = other
155154 isOp (JSAccessor fnName' (JSVar prelude)) = prelude == C.prelude && fnName' == fnName
156155 isOp _ = False
157− isOpDict dictName (JSApp (JSAccessor prop (JSVar prelude)) [val]) = prelude == C.prelude && prop == dictName && val == jsUndefined
156+ isOpDict dictName (JSApp (JSAccessor prop (JSVar prelude)) []) = prelude == C.prelude && prop == dictName
158157 isOpDict _ _ = False
159158 mkFn :: Int -> JS -> JS
160159 mkFn 0 = everywhereOnJS convert
src/Language/PureScript/Optimizer/MagicDo.hs+3−3
@@ -60,7 +60,7 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
6060 -- Desugar pure
6161 convert (JSApp (JSApp pure' [val]) []) | isPure pure' = val
6262 -- Desugar >>
63− convert (JSApp (JSApp bind [m]) [JSFunction Nothing [arg] (JSBlock js)]) | isBind bind && isJSReturn (last js) && arg == C.__unused =
63+ convert (JSApp (JSApp bind [m]) [JSFunction Nothing [] (JSBlock js)]) | isBind bind && isJSReturn (last js) =
6464 let JSReturn ret = last js in
6565 JSFunction (Just fnName) [] $ JSBlock (JSApp m [] : init js ++ [JSReturn (JSApp ret [])] )
6666 -- Desugar >>=
@@ -99,8 +99,8 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
9999 isEffFunc name (JSAccessor name' (JSVar eff)) = eff == C.eff && name == name'
100100 isEffFunc _ _ = False
101101 -- Check if an expression represents the Monad Eff dictionary
102− isEffDict name (JSApp (JSVar ident) [val]) | ident == name && val == jsUndefined = True
103− isEffDict name (JSApp (JSAccessor prop (JSVar eff)) [val]) = eff == C.eff && prop == name && val == jsUndefined
102+ isEffDict name (JSApp (JSVar ident) []) | ident == name = True
103+ isEffDict name (JSApp (JSAccessor prop (JSVar eff)) []) = eff == C.eff && prop == name
104104 isEffDict _ _ = False
105105 -- Remove __do function applications which remain after desugaring
106106 undo :: JS -> JS
src/Language/PureScript/Optimizer/Unused.hs+19−3
@@ -13,13 +13,17 @@
1313--
1414-----------------------------------------------------------------------------
1515
16−module Language.PureScript.Optimizer.Unused (
17− removeCodeAfterReturnStatements
18−) where
16+module Language.PureScript.Optimizer.Unused
17+ ( removeCodeAfterReturnStatements
18+ , removeUnusedArg
19+ , removeUndefinedApp
20+ ) where
1921
2022import Language.PureScript.CodeGen.JS.AST
2123import Language.PureScript.Optimizer.Common
2224
25+import qualified Language.PureScript.Constants as C
26+
2327removeCodeAfterReturnStatements :: JS -> JS
2428removeCodeAfterReturnStatements = everywhereOnJS (removeFromBlock go)
2529 where
@@ -28,3 +32,15 @@ removeCodeAfterReturnStatements = everywhereOnJS (removeFromBlock go)
2832 | otherwise = let (body, ret : _) = span (not . isJSReturn) jss in body ++ [ret]
2933 isJSReturn (JSReturn _) = True
3034 isJSReturn _ = False
35+
36+removeUnusedArg :: JS -> JS
37+removeUnusedArg = everywhereOnJS convert
38+ where
39+ convert (JSFunction name [arg] body) | arg == C.__unused = JSFunction name [] body
40+ convert js = js
41+
42+removeUndefinedApp :: JS -> JS
43+removeUndefinedApp = everywhereOnJS convert
44+ where
45+ convert (JSApp fn [JSVar arg]) | arg == C.undefined = JSApp fn []
46+ convert js = js