inline-c 0.5.4.3 → 0.5.5.0
raw patch · 5 files changed
+79/−21 lines, 5 filesdep ~ChartPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: Chart
API changes (from Hackage documentation)
+ Language.C.Inline.Interruptible: block :: QuasiQuoter
+ Language.C.Inline.Interruptible: exp :: QuasiQuoter
+ Language.C.Inline.Interruptible: pure :: QuasiQuoter
Files
- README.md +1/−1
- inline-c.cabal +3/−2
- src/Language/C/Inline/Interruptible.hs +46/−0
- test/tests.c +23/−18
- test/tests.hs +6/−0
README.md view
@@ -323,7 +323,7 @@ -- These flags will be passed to the C compiler cc-options: -Wall -O2 -- Libraries to link the code with.- extra-libraries: -lm+ extra-libraries: m ... ```
inline-c.cabal view
@@ -1,5 +1,5 @@ name: inline-c-version: 0.5.4.3+version: 0.5.5.0 synopsis: Write Haskell source files including C code inline. No FFI required. description: See <https://github.com/fpco/inline-c/blob/master/README.md>. license: MIT@@ -27,6 +27,7 @@ , Language.C.Inline.HaskellIdentifier , Language.C.Inline.Internal , Language.C.Inline.Unsafe+ , Language.C.Inline.Interruptible , Language.C.Types , Language.C.Types.Parse other-modules: Language.C.Inline.FunPtr@@ -90,7 +91,7 @@ build-depends: base >=4 && <5 , inline-c , vector- , Chart+ , Chart >= 1.3 , Chart-cairo else buildable: False
+ src/Language/C/Inline/Interruptible.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE CPP #-}++-- | @interruptible@ variants of the "Language.C.Inline" quasi-quoters, to call+-- interruptible C code. See <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ffi.html#ffi-interruptible>+-- for more information.+--+-- This module is intended to be imported qualified:+--+-- @+-- import qualified "Language.C.Inline.Interruptible" as CI+-- @++module Language.C.Inline.Interruptible+ ( exp+ , pure+ , block+ ) where++#if __GLASGOW_HASKELL__ < 710+import Prelude hiding (exp)+#else+import Prelude hiding (exp, pure)+#endif++import qualified Language.Haskell.TH.Quote as TH+import qualified Language.Haskell.TH.Syntax as TH++import Language.C.Inline.Context+import Language.C.Inline.Internal++-- | C expressions.+exp :: TH.QuasiQuoter+exp = genericQuote IO $ inlineExp TH.Interruptible++-- | Variant of 'exp', for use with expressions known to have no side effects.+--+-- BEWARE: use this function with caution, only when you know what you are+-- doing. If an expression does in fact have side-effects, then indiscriminate+-- use of 'pure' may endanger referential transparency, and in principle even+-- type safety.+pure :: TH.QuasiQuoter+pure = genericQuote Pure $ inlineExp TH.Interruptible++-- | C code blocks (i.e. statements).+block :: TH.QuasiQuoter+block = genericQuote IO $ inlineItems TH.Interruptible
test/tests.c view
@@ -40,67 +40,72 @@ } -void inline_c_Main_5_bbad659b194c6226bc20ec8262bc1c599dddeb28() {+int inline_c_Main_5_f58397f6204cd35d25406cea930cdd76127e7a8d(int x_inline_c_0, int y_inline_c_1) {+return ( 7 + x_inline_c_0 + y_inline_c_1 );+}+++void inline_c_Main_6_bbad659b194c6226bc20ec8262bc1c599dddeb28() { printf("Hello\n") ; } -ptrdiff_t inline_c_Main_6_4475cd73db749194709e394483ff3e5205688ff8(ptrdiff_t x_inline_c_0) {+ptrdiff_t inline_c_Main_7_4475cd73db749194709e394483ff3e5205688ff8(ptrdiff_t x_inline_c_0) { char a[2]; return &a[1] - &a[0] + x_inline_c_0; } -size_t inline_c_Main_7_9782c357435fb488c3166bf10e839da13328001e() {+size_t inline_c_Main_8_9782c357435fb488c3166bf10e839da13328001e() { return ( sizeof (char) ); } -uintmax_t inline_c_Main_8_c0df91f70bbf1f85671339d1bdc524414e112cc2() {+uintmax_t inline_c_Main_9_c0df91f70bbf1f85671339d1bdc524414e112cc2() { return ( UINTMAX_MAX ); } -int16_t inline_c_Main_9_9e29ba00e56a81c765067e09a3136fa5232d49a0(int16_t x_inline_c_0) {+int16_t inline_c_Main_10_9e29ba00e56a81c765067e09a3136fa5232d49a0(int16_t x_inline_c_0) { return ( 1 + x_inline_c_0 ); } -uint32_t inline_c_Main_10_08a42fa8f755a36db897898b73bb7aab5b1b58e1(uint32_t y_inline_c_0) {+uint32_t inline_c_Main_11_08a42fa8f755a36db897898b73bb7aab5b1b58e1(uint32_t y_inline_c_0) { return ( y_inline_c_0 * 7 ); } -int inline_c_Main_11_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {+int inline_c_Main_12_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) { return ( ackermannPtr_inline_c_0(x_inline_c_1, y_inline_c_2) ); } -int (* inline_c_Main_12_7e6957a671db751a0a5b5e9721b3c45002fab68f())(int , int ) {+int (* inline_c_Main_13_7e6957a671db751a0a5b5e9721b3c45002fab68f())(int , int ) { return ( &francescos_add ); } -int inline_c_Main_13_55555bbb777d25d03fef0a6d6ce9193474a74a35(int (* ackermann__inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {+int inline_c_Main_14_55555bbb777d25d03fef0a6d6ce9193474a74a35(int (* ackermann__inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) { return ( ackermann__inline_c_0(x_inline_c_1, y_inline_c_2) ); } -int inline_c_Main_14_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {+int inline_c_Main_15_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) { return ( ackermannPtr_inline_c_0(x_inline_c_1, y_inline_c_2) ); } -int inline_c_Main_15_b7d965842e65c49fcc08b03f70454988290e61e4(int (* ackermann_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {+int inline_c_Main_16_b7d965842e65c49fcc08b03f70454988290e61e4(int (* ackermann_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) { return ( ackermann_inline_c_0(x_inline_c_1, y_inline_c_2) ); } -double inline_c_Main_16_5dce1654ef6186acdb189a6ce36f0a66660eb346(double (* fun_inline_c_0)(double )) {+double inline_c_Main_17_5dce1654ef6186acdb189a6ce36f0a66660eb346(double (* fun_inline_c_0)(double )) { return ( fun_inline_c_0(3.0) ); } -int inline_c_Main_17_8d0f093895f51773152915c33b75c7aafd8f4f45(int n_inline_c_0, int * ptr_inline_c_1) {+int inline_c_Main_18_8d0f093895f51773152915c33b75c7aafd8f4f45(int n_inline_c_0, int * ptr_inline_c_1) { int i; int x = 0;@@ -112,7 +117,7 @@ } -int inline_c_Main_18_62ce8aade5e693f134c6a5c9add3523edab1a63e(long vec_inline_c_0, int * vec_inline_c_1) {+int inline_c_Main_19_62ce8aade5e693f134c6a5c9add3523edab1a63e(long vec_inline_c_0, int * vec_inline_c_1) { int i; int x = 0;@@ -124,7 +129,7 @@ } -int inline_c_Main_19_75f1401fb8545756b6d329a5352a252bf52db946(long bs_inline_c_0, char * bs_inline_c_1) {+int inline_c_Main_20_75f1401fb8545756b6d329a5352a252bf52db946(long bs_inline_c_0, char * bs_inline_c_1) { int i, bits = 0; for (i = 0; i < bs_inline_c_0; i++) {@@ -136,17 +141,17 @@ } -int inline_c_Main_20_6fa3d382d3ab7f6d57eec7fbfe64e87fbc2a0ca9(int x_27_inline_c_0) {+int inline_c_Main_21_6fa3d382d3ab7f6d57eec7fbfe64e87fbc2a0ca9(int x_27_inline_c_0) { return ( x_27_inline_c_0 ); } -int inline_c_Main_21_dbf060cb8fa2b86c6c6838ef9b645ac20f38ba79(int _e4_inline_c_0) {+int inline_c_Main_22_dbf060cb8fa2b86c6c6838ef9b645ac20f38ba79(int _e4_inline_c_0) { return ( _e4_inline_c_0 ); } -int inline_c_Main_22_2421969c444755bea2c6f2060e0921ce7f3d16d7(int PreludemaxBound_2e_inline_c_0) {+int inline_c_Main_23_2421969c444755bea2c6f2060e0921ce7f3d16d7(int PreludemaxBound_2e_inline_c_0) { return ( PreludemaxBound_2e_inline_c_0 ); }
test/tests.hs view
@@ -13,6 +13,7 @@ import qualified Language.C.Inline as C import qualified Language.C.Inline.Unsafe as CU+import qualified Language.C.Inline.Interruptible as CI import qualified Language.C.Inline.Internal as C import qualified Language.C.Inline.ContextSpec import qualified Language.C.Inline.ParseSpec@@ -82,6 +83,11 @@ let x = 2 let y = 10 z <- [CU.exp| int{ 7 + $(int x) + $(int y) } |]+ z `Hspec.shouldBe` x + y + 7+ Hspec.it "interruptible exp" $ do+ let x = 2+ let y = 10+ z <- [CI.exp| int{ 7 + $(int x) + $(int y) } |] z `Hspec.shouldBe` x + y + 7 Hspec.it "void exp" $ do [C.exp| void { printf("Hello\n") } |]