@@ -6,6 +6,7 @@ module Language.PureScript.CodeGen.JS.Optimizer.Inliner
6 , inlineCommonValues
6 , inlineCommonValues
7 , inlineCommonOperators
7 , inlineCommonOperators
8 , inlineFnComposition
8 , inlineFnComposition
9 , etaConvert
10 , etaConvert
11 , evaluateIifes
12 , evaluateIifes
@@ -66,6 +67,8 @@ evaluateIifes = everywhereOnJS convert
67 convert :: JS -> JS
68 convert :: JS -> JS
68 convert (JSApp _ (JSFunction _ Nothing [] (JSBlock _ [JSReturn _ ret])) []) = ret
69 convert (JSApp _ (JSFunction _ Nothing [] (JSBlock _ [JSReturn _ ret])) []) = ret
70+ convert (JSApp _ (JSFunction _ Nothing idents (JSBlock _ [JSReturn ss ret])) [])
71+ | not (any (`isReassigned` ret) idents) = replaceIdents (map (, JSVar ss C.undefined) idents) ret
69 convert js = js
72 convert js = js
71inlineVariables :: JS -> JS
74inlineVariables :: JS -> JS
@@ -249,10 +252,9 @@ inlineCommonOperators = applyAll $
250-- (f <<< g $ x) = f (g x)
253-- (f <<< g $ x) = f (g x)
251-- (f <<< g) = \x -> f (g x)
254-- (f <<< g) = \x -> f (g x)
252−inlineFnComposition :: (MonadSupply m) => JS -> m JS
255+inlineFnComposition :: forall m. MonadSupply m => JS -> m JS
253−inlineFnComposition = everywhereOnJSTopDownM convert
256+inlineFnComposition = everywhereOnJSTopDownM convert where
255− convert :: (MonadSupply m) => JS -> m JS
257+ convert :: JS -> m JS
256 convert (JSApp s1 (JSApp s2 (JSApp _ (JSApp _ fn [dict']) [x]) [y]) [z])
258 convert (JSApp s1 (JSApp s2 (JSApp _ (JSApp _ fn [dict']) [x]) [y]) [z])
257 | isFnCompose dict' fn = return $ JSApp s1 x [JSApp s2 y [z]]
259 | isFnCompose dict' fn = return $ JSApp s1 x [JSApp s2 y [z]]
258 | isFnComposeFlipped dict' fn = return $ JSApp s2 y [JSApp s1 x [z]]
260 | isFnComposeFlipped dict' fn = return $ JSApp s2 y [JSApp s1 x [z]]
@@ -273,6 +275,15 @@ inlineFnComposition = everywhereOnJSTopDownM convert
273 fnComposeFlipped :: forall a b. (IsString a, IsString b) => (a, b)
275 fnComposeFlipped :: forall a b. (IsString a, IsString b) => (a, b)
274 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
276 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
278+inlineUnsafePartial :: JS -> JS
279+inlineUnsafePartial = everywhereOnJSTopDown convert where
280+ convert (JSApp ss (JSIndexer _ (JSStringLiteral _ unsafePartial) (JSVar _ partialUnsafe)) [ comp ])
281+ | unsafePartial == C.unsafePartial && partialUnsafe == C.partialUnsafe
282+ -- Apply to undefined here, the application should be optimized away
283+ -- if it is safe to do so
284+ = JSApp ss comp [ JSVar ss C.undefined ]
285+ convert other = other
276semiringNumber :: forall a b. (IsString a, IsString b) => (a, b)
287semiringNumber :: forall a b. (IsString a, IsString b) => (a, b)
277semiringNumber = (C.dataSemiring, C.semiringNumber)
288semiringNumber = (C.dataSemiring, C.semiringNumber)