git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Optimise __unused and fn(undefined)
c927374Gary Burgess
src/Language/PureScript/CodeGen/JS/AST.hs−8
@@ -19,8 +19,6 @@ module Language.PureScript.CodeGen.JS.AST where
19
19
20import Data.Data
20import Data.Data
21
21
22−import qualified Language.PureScript.Constants as C
23−
24-- |
22-- |
25-- Built-in unary operators
23-- Built-in unary operators
26--
24--
@@ -244,12 +242,6 @@ data JS
244 --
242 --
245 | JSRaw String deriving (Show, Eq, Data, Typeable)
243 | JSRaw String deriving (Show, Eq, Data, Typeable)
246
244
247−-- |
248−-- Javascript representation of the unit value.
249−--
250−jsUndefined :: JS
251−jsUndefined = JSVar C.undefined
252−
253--
245--
254-- Traversals
246-- Traversals
255--
247--
src/Language/PureScript/Optimizer.hs+2
@@ -57,6 +57,8 @@ optimize opts | optionsNoOptimizations opts = id
57 , tco opts
57 , tco opts
58 , magicDo opts
58 , magicDo opts
59 , removeCodeAfterReturnStatements
59 , removeCodeAfterReturnStatements
60+ , removeUnusedArg
61+ , removeUndefinedApp
60 , unThunk
62 , unThunk
61 , etaConvert
63 , etaConvert
62 , evaluateIifes
64 , evaluateIifes
src/Language/PureScript/Optimizer/Inliner.hs+2−3
@@ -49,8 +49,7 @@ etaConvert = everywhereOnJS convert
49 not (any (`isRebound` block) (map JSVar idents)) &&
49 not (any (`isRebound` block) (map JSVar idents)) &&
50 not (any (`isRebound` block) args)
50 not (any (`isRebound` block) args)
51 = JSBlock (map (replaceIdents (zip idents args)) body)
51 = JSBlock (map (replaceIdents (zip idents args)) body)
52− convert (JSFunction Nothing [arg] (JSBlock [JSReturn (JSApp fn@JSVar{} [val])]))
52+ convert (JSFunction Nothing [] (JSBlock [JSReturn (JSApp fn [])])) = fn
53− | arg == C.__unused && val == jsUndefined = fn
54 convert js = js
53 convert js = js
55
54
56unThunk :: JS -> JS
55unThunk :: JS -> JS
@@ -154,7 +153,7 @@ inlineCommonOperators = applyAll $
154 convert other = other
153 convert other = other
155 isOp (JSAccessor fnName' (JSVar prelude)) = prelude == C.prelude && fnName' == fnName
154 isOp (JSAccessor fnName' (JSVar prelude)) = prelude == C.prelude && fnName' == fnName
156 isOp _ = False
155 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
158 isOpDict _ _ = False
157 isOpDict _ _ = False
159 mkFn :: Int -> JS -> JS
158 mkFn :: Int -> JS -> JS
160 mkFn 0 = everywhereOnJS convert
159 mkFn 0 = everywhereOnJS convert
src/Language/PureScript/Optimizer/MagicDo.hs+3−3
@@ -60,7 +60,7 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
60 -- Desugar pure
60 -- Desugar pure
61 convert (JSApp (JSApp pure' [val]) []) | isPure pure' = val
61 convert (JSApp (JSApp pure' [val]) []) | isPure pure' = val
62 -- Desugar >>
62 -- 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) =
64 let JSReturn ret = last js in
64 let JSReturn ret = last js in
65 JSFunction (Just fnName) [] $ JSBlock (JSApp m [] : init js ++ [JSReturn (JSApp ret [])] )
65 JSFunction (Just fnName) [] $ JSBlock (JSApp m [] : init js ++ [JSReturn (JSApp ret [])] )
66 -- Desugar >>=
66 -- Desugar >>=
@@ -99,8 +99,8 @@ magicDo' = everywhereOnJS undo . everywhereOnJSTopDown convert
99 isEffFunc name (JSAccessor name' (JSVar eff)) = eff == C.eff && name == name'
99 isEffFunc name (JSAccessor name' (JSVar eff)) = eff == C.eff && name == name'
100 isEffFunc _ _ = False
100 isEffFunc _ _ = False
101 -- Check if an expression represents the Monad Eff dictionary
101 -- Check if an expression represents the Monad Eff dictionary
102− isEffDict name (JSApp (JSVar ident) [val]) | ident == name && val == jsUndefined = True
102+ isEffDict name (JSApp (JSVar ident) []) | ident == name = True
103− isEffDict name (JSApp (JSAccessor prop (JSVar eff)) [val]) = eff == C.eff && prop == name && val == jsUndefined
103+ isEffDict name (JSApp (JSAccessor prop (JSVar eff)) []) = eff == C.eff && prop == name
104 isEffDict _ _ = False
104 isEffDict _ _ = False
105 -- Remove __do function applications which remain after desugaring
105 -- Remove __do function applications which remain after desugaring
106 undo :: JS -> JS
106 undo :: JS -> JS
src/Language/PureScript/Optimizer/Unused.hs+19−3
@@ -13,13 +13,17 @@
13--
13--
14-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
15
15
16−module Language.PureScript.Optimizer.Unused (
16+module Language.PureScript.Optimizer.Unused
17− removeCodeAfterReturnStatements
17+ ( removeCodeAfterReturnStatements
18+ , removeUnusedArg
19+ , removeUndefinedApp
18−) where
20+ ) where
19
21
20import Language.PureScript.CodeGen.JS.AST
22import Language.PureScript.CodeGen.JS.AST
21import Language.PureScript.Optimizer.Common
23import Language.PureScript.Optimizer.Common
22
24
25+import qualified Language.PureScript.Constants as C
26+
23removeCodeAfterReturnStatements :: JS -> JS
27removeCodeAfterReturnStatements :: JS -> JS
24removeCodeAfterReturnStatements = everywhereOnJS (removeFromBlock go)
28removeCodeAfterReturnStatements = everywhereOnJS (removeFromBlock go)
25 where
29 where
@@ -28,3 +32,15 @@ removeCodeAfterReturnStatements = everywhereOnJS (removeFromBlock go)
28 | otherwise = let (body, ret : _) = span (not . isJSReturn) jss in body ++ [ret]
32 | otherwise = let (body, ret : _) = span (not . isJSReturn) jss in body ++ [ret]
29 isJSReturn (JSReturn _) = True
33 isJSReturn (JSReturn _) = True
30 isJSReturn _ = False
34 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