From 4d486ffa70086a2909eeb558c6912159fb8b9437 Mon Sep 17 00:00:00 2001 From: Francesco Mazzoli Date: Sat, 8 Oct 2016 10:47:41 +0100 Subject: Remove unsafe `Internal.Foreign`. See #199 for details. The API exported by `Internal.Foreign` was inherently unsafe. --- packages/base/src/Internal/Foreign.hs | 102 ----------------------- packages/base/src/Numeric/LinearAlgebra/Devel.hs | 8 -- 2 files changed, 110 deletions(-) delete mode 100644 packages/base/src/Internal/Foreign.hs (limited to 'packages/base/src') diff --git a/packages/base/src/Internal/Foreign.hs b/packages/base/src/Internal/Foreign.hs deleted file mode 100644 index ea071a4..0000000 --- a/packages/base/src/Internal/Foreign.hs +++ /dev/null @@ -1,102 +0,0 @@ -{-# LANGUAGE MagicHash, UnboxedTuples #-} --- | FFI and hmatrix helpers. --- --- Sample usage, to upload a perspective matrix to a shader. --- --- @ glUniformMatrix4fv 0 1 (fromIntegral gl_TRUE) \`appMatrix\` perspective 0.01 100 (pi\/2) (4\/3) --- @ --- - -module Internal.Foreign - ( app - , appVector, appVectorLen - , appMatrix, appMatrixLen, appMatrixRaw, appMatrixRawLen - , unsafeMatrixToVector, unsafeMatrixToForeignPtr - ) where - -import Foreign.C.Types(CInt) -import Internal.Vector -import Internal.Matrix -import qualified Data.Vector.Storable as S -import Foreign (Ptr, ForeignPtr, Storable) -import GHC.Base (IO(..), realWorld#) - -{-# INLINE unsafeInlinePerformIO #-} --- | If we use unsafePerformIO, it may not get inlined, so in a function that returns IO (which are all safe uses of app* in this module), there would be --- unecessary calls to unsafePerformIO or its internals. -unsafeInlinePerformIO :: IO a -> a -unsafeInlinePerformIO (IO f) = case f realWorld# of - (# _, x #) -> x - -{-# INLINE app #-} --- | Only useful since it is left associated with a precedence of 1, unlike 'Prelude.$', which is right associative. --- e.g. --- --- @ --- someFunction --- \`appMatrixLen\` m --- \`appVectorLen\` v --- \`app\` other --- \`app\` arguments --- \`app\` go here --- @ --- --- One could also write: --- --- @ --- (someFunction --- \`appMatrixLen\` m --- \`appVectorLen\` v) --- other --- arguments --- (go here) --- @ --- -app :: (a -> b) -> a -> b -app f = f - -{-# INLINE appVector #-} -appVector :: Storable a => (Ptr a -> b) -> Vector a -> b -appVector f x = unsafeInlinePerformIO (S.unsafeWith x (return . f)) - -{-# INLINE appVectorLen #-} -appVectorLen :: Storable a => (CInt -> Ptr a -> b) -> Vector a -> b -appVectorLen f x = unsafeInlinePerformIO (S.unsafeWith x (return . f (fromIntegral (S.length x)))) - -{-# INLINE appMatrix #-} -appMatrix :: Element a => (Ptr a -> b) -> Matrix a -> b -appMatrix f x = unsafeInlinePerformIO (S.unsafeWith (flatten x) (return . f)) - -{-# INLINE appMatrixLen #-} -appMatrixLen :: Element a => (CInt -> CInt -> Ptr a -> b) -> Matrix a -> b -appMatrixLen f x = unsafeInlinePerformIO (S.unsafeWith (flatten x) (return . f r c)) - where - r = fromIntegral (rows x) - c = fromIntegral (cols x) - -{-# INLINE appMatrixRaw #-} -appMatrixRaw :: Storable a => (Ptr a -> b) -> Matrix a -> b -appMatrixRaw f x = unsafeInlinePerformIO (S.unsafeWith (xdat x) (return . f)) - -{-# INLINE appMatrixRawLen #-} -appMatrixRawLen :: Element a => (CInt -> CInt -> Ptr a -> b) -> Matrix a -> b -appMatrixRawLen f x = unsafeInlinePerformIO (S.unsafeWith (xdat x) (return . f r c)) - where - r = fromIntegral (rows x) - c = fromIntegral (cols x) - -infixl 1 `app` -infixl 1 `appVector` -infixl 1 `appMatrix` -infixl 1 `appMatrixRaw` - -{-# INLINE unsafeMatrixToVector #-} --- | This will disregard the order of the matrix, and simply return it as-is. --- If the order of the matrix is RowMajor, this function is identical to 'flatten'. -unsafeMatrixToVector :: Matrix a -> Vector a -unsafeMatrixToVector = xdat - -{-# INLINE unsafeMatrixToForeignPtr #-} -unsafeMatrixToForeignPtr :: Storable a => Matrix a -> (ForeignPtr a, Int) -unsafeMatrixToForeignPtr m = S.unsafeToForeignPtr0 (xdat m) - diff --git a/packages/base/src/Numeric/LinearAlgebra/Devel.hs b/packages/base/src/Numeric/LinearAlgebra/Devel.hs index 57a68e7..941b597 100644 --- a/packages/base/src/Numeric/LinearAlgebra/Devel.hs +++ b/packages/base/src/Numeric/LinearAlgebra/Devel.hs @@ -12,13 +12,6 @@ The library can be easily extended using the tools in this module. -------------------------------------------------------------------------------- module Numeric.LinearAlgebra.Devel( - -- * FFI helpers - -- | Sample usage, to upload a perspective matrix to a shader. - -- - -- @ glUniformMatrix4fv 0 1 (fromIntegral gl_TRUE) \`appMatrix\` perspective 0.01 100 (pi\/2) (4\/3) - -- @ - module Internal.Foreign, - -- * FFI tools -- | See @examples/devel@ in the repository. @@ -66,7 +59,6 @@ module Numeric.LinearAlgebra.Devel( ) where -import Internal.Foreign import Internal.Devel import Internal.ST import Internal.Vector -- cgit v1.2.3