@@ -18,7 +18,6 @@
1818module Language.PureScript.CodeGen.Cpp.Optimizer.Inliner
1919 ( inlineVariables
2020 , inlineCommonValues
21− , inlineOperator
2221 , inlineCommonOperators
2322 , inlineFnComposition
2423 , inlineUnsafePartial
@@ -29,7 +28,7 @@ module Language.PureScript.CodeGen.Cpp.Optimizer.Inliner
2928 ) where
3029
3130import Prelude.Compat
32−import Data.Text (Text)
31+import Data.Text (Text, cons)
3332
3433import Control.Monad.Supply.Class (MonadSupply, freshName)
3534
@@ -137,14 +136,15 @@ inlineCommonValues = everywhereOnCpp convert
137136 fnSubtract = (C.dataRing, C.sub)
138137 fnNegate = (C.dataRing, C.negate)
139138
140−inlineOperator :: (Text, Text) -> (Cpp -> Cpp -> Cpp) -> Cpp -> Cpp
141−inlineOperator (m, op) f = everywhereOnCpp convert
139+inlineNonClassFunction :: (Text, Text) -> (Cpp -> Cpp -> Cpp) -> Cpp -> Cpp
140+inlineNonClassFunction (m, op) f = everywhereOnCpp convert
142141 where
143142 convert :: Cpp -> Cpp
144143 convert (CppApp op' [x, y]) | isOp op' = f x y
145144 convert (CppApp (CppApp op' [x]) [y]) | isOp op' = f x y
146145 convert other = other
147− isOp (CppAccessor (CppVar longForm) (CppVar m')) = m == m' && longForm == safeName op
146+ isOp (CppAccessor (CppVar longForm) (CppVar m')) =
147+ m == m' && (longForm == safeName op || longForm == ('*' `cons` safeName op))
148148 isOp _ = False
149149
150150inlineCommonOperators :: Cpp -> Cpp
@@ -203,6 +203,10 @@ inlineCommonOperators = applyAll $
203203 , binary' C.dataIntBits C.shr ShiftRight
204204 -- , binary' C.dataIntBits C.zshr ZeroFillShiftRight
205205 , unary' C.dataIntBits C.complement BitwiseNot
206+
207+ , inlineNonClassFunction (C.dataFunction, C.apply) $ \f x -> CppApp f [x]
208+ , inlineNonClassFunction (C.dataFunction, C.applyFlipped) $ \x f -> CppApp f [x]
209+ , inlineNonClassFunction (C.dataArray, C.unsafeIndex) $ flip CppIndexer
206210 ] ++
207211 []
208212 -- [ fn | i <- [0..10], fn <- [ mkFn i, runFn i ] ]
@@ -443,4 +447,4 @@ opDisj :: (Text, Text)
443447opDisj = (C.dataHeytingAlgebra, C.disj)
444448
445449opNot :: (Text, Text)
446−opNot = (C.dataHeytingAlgebra, C.not)
450+opNot = (C.dataHeytingAlgebra, safeName C.not)