git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix broken unsafeIndexer inliner
commit75abe311f8ccee8a8e2355f27c278ecc25bb4ef5 authorAndy Arvanitis <andyarvanitis@gmail.com> dateMon 20 Feb 2017, 22:35 (10 years ago) parent90ed9e4
1 file changed+11−1
src/Language/PureScript/CodeGen/Cpp/Optimizer/Inliner.hs+11−1
src/Language/PureScript/CodeGen/Cpp/Optimizer/Inliner.hs+11−1
@@ -147,6 +147,16 @@ inlineNonClassFunction (m, op) f = everywhereOnCpp convert
147147 m == m' && (longForm == safeName op || longForm == (curriedName $ safeName op))
148148 isOp _ = False
149149
150+inlineFunctionWithDict :: (Text, Text) -> (Cpp -> Cpp -> Cpp) -> Cpp -> Cpp
151+inlineFunctionWithDict (m, op) f = everywhereOnCpp convert
152+ where
153+ convert :: Cpp -> Cpp
154+ convert (CppApp (CppApp (CppApp op' [_]) [x]) [y]) | isOp op' = f x y
155+ convert other = other
156+ isOp (CppAccessor (CppVar longForm) (CppVar m')) =
157+ m == m' && (longForm == safeName op || longForm == (curriedName $ safeName op))
158+ isOp _ = False
159+
150160inlineCommonOperators :: Cpp -> Cpp
151161inlineCommonOperators = applyAll $
152162 [ binary semiringNumber opAdd Add
@@ -206,7 +216,7 @@ inlineCommonOperators = applyAll $
206216
207217 , inlineNonClassFunction (C.dataFunction, C.apply) $ \f x -> CppApp f [x]
208218 , inlineNonClassFunction (C.dataFunction, C.applyFlipped) $ \x f -> CppApp f [x]
209− , inlineNonClassFunction (C.dataArray, C.unsafeIndex) $ flip CppIndexer
219+ , inlineFunctionWithDict (C.dataArray, C.unsafeIndex) $ flip CppIndexer
210220 ] ++
211221 []
212222 -- [ fn | i <- [0..10], fn <- [ mkFn i, runFn i ] ]