@@ -21,6 +21,7 @@ module Language.PureScript.CodeGen.Cpp.Optimizer.Inliner
21 , inlineOperator
21 , inlineOperator
22 , inlineCommonOperators
22 , inlineCommonOperators
23 , inlineFnComposition
23 , inlineFnComposition
24+ , inlineUnsafePartial
24 , etaConvert
25 , etaConvert
26 , evaluateIifes
27 , evaluateIifes
@@ -269,10 +270,9 @@ inlineCommonOperators = applyAll $
270-- (f <<< g $ x) = f (g x)
271-- (f <<< g $ x) = f (g x)
271-- (f <<< g) = \x -> f (g x)
272-- (f <<< g) = \x -> f (g x)
272−inlineFnComposition :: (MonadSupply m) => Cpp -> m Cpp
273+inlineFnComposition :: forall m. MonadSupply m => Cpp -> m Cpp
273−inlineFnComposition = everywhereOnCppTopDownM convert
274+inlineFnComposition = everywhereOnCppTopDownM convert where
275− convert :: (MonadSupply m) => Cpp -> m Cpp
275+ convert :: Cpp -> m Cpp
276 convert (CppApp fn [dict', x, y, z])
276 convert (CppApp fn [dict', x, y, z])
277 | isFnCompose dict' fn = return $ CppApp x [CppApp y [z]]
277 | isFnCompose dict' fn = return $ CppApp x [CppApp y [z]]
278 | isFnComposeFlipped dict' fn = return $ CppApp y [CppApp x [z]]
278 | isFnComposeFlipped dict' fn = return $ CppApp y [CppApp x [z]]
@@ -303,6 +303,15 @@ inlineFnComposition = everywhereOnCppTopDownM convert
303 fnComposeFlipped :: (Text, Text)
303 fnComposeFlipped :: (Text, Text)
304 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
304 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
306+inlineUnsafePartial :: Cpp -> Cpp
307+inlineUnsafePartial = everywhereOnCppTopDown convert where
308+ convert (CppApp (CppAccessor (CppVar unsafePartial) (CppVar partialUnsafe)) [ comp ])
309+ | unsafePartial == C.unsafePartial && partialUnsafe == C.partialUnsafe
310+ -- Apply to undefined here, the application should be optimized away
311+ -- if it is safe to do so
312+ = CppApp comp [ CppVar C.undefined ]
313+ convert other = other
306toAutoVars :: Cpp -> Cpp
315toAutoVars :: Cpp -> Cpp
307toAutoVars = everywhereOnCpp convert
316toAutoVars = everywhereOnCpp convert