A mapping from TypeSpecifiers to Haskell types. Needed both to parse C types, and to convert them to Haskell types.
Moduleinline-c-0.9.1.10Haskell2010
Language.C.Inline.Context
A Context is used to define the capabilities of the Template Haskell code that handles the inline C code. See the documentation of the data type for more details.
In practice, a Context will have to be defined for each library that defines new C types, to allow the TemplateHaskell code to interpret said types correctly.
- 8 types
- 1 class
- 7 values
- Packageinline-c-0.9.1.10
- Exports16
- LanguageHaskell2010
- LicenceMIT
- SourceContext.hs
TypesTable
5 declarationsGiven a Context, it uses its ctxTypesTable to convert arbitrary C types.
An alias for Ptr.
AntiQuoter
4 declarationsConstructors
AntiQuoteraqParser :: forall (m :: Type -> Type). CParser HaskellIdentifier m => m (CIdentifier, Type CIdentifier, a)Parses the body of the antiquotation, returning a hint for the name to assign to the variable that will replace the anti-quotation, the type of said variable, and some arbitrary data which will then be fed to aqMarshaller.
The Type has
Voidas an identifier type to make sure that no names appear in it.aqMarshaller :: Purity -> TypesTable -> Type CIdentifier -> a -> Q (Type, Exp)Takes the requested purity, the current TypesTable, and the type and the body returned by aqParser.
Returns the Haskell type for the parameter, and the Haskell expression that will be passed in as the parameter.
If the the type returned is
ty, the Exp must have typeforall a. (ty -> IO a) -> IO a. This allows to do resource handling when preparing C values.Care must be taken regarding Purity. Specifically, the generated IO computation must be idempotent to guarantee its safety when used in pure code. We cannot prevent the IO computation from being inlined, hence potentially duplicated. If non-idempotent marshallers are required (e.g. if an update to some global state is needed), it is best to throw an error when Purity is Pure (for example "you cannot use context X with
pure"), which will show up at compile time.
An identifier for a AntiQuoter.
Existential wrapper around AntiQuoter.
Constructors
forall a. (Eq a, Typeable a) => SomeAntiQuoter (AntiQuoter a)
Context
7 declarationsA Context stores various information needed to produce the files with the C code derived from the inline C snippets.
Contexts can be composed with their Monoid instance, where mappend is
right-biased -- in mappend x y y will take precedence over x.
Constructors
ContextctxTypesTable :: TypesTableNeeded to convert C types to Haskell types.
ctxAntiQuoters :: AntiQuotersNeeded to parse and process antiquotations.
ctxOutput :: Maybe (String -> String)This function is used to post-process the functions generated from the C snippets. Currently just used to specify C linkage when generating C++ code.
ctxForeignSrcLang :: Maybe ForeignSrcLangTH.LangC by default
ctxEnableCpp :: BoolCompile source code to raw object.
ctxRawObjectCompile :: Maybe (String -> Q FilePath)
Context useful to work with vanilla C. Used by default.
ctxTypesTable: converts C basic types to their counterparts in Foreign.C.Types.
No ctxAntiQuoters.
This Context adds support for ForeignPtr arguments. It adds a unique
marshaller called fptr-ptr. For example, $fptr-ptr:(int *x) extracts the
bare C pointer out of foreign pointer x.
This Context includes a AntiQuoter that removes the need for
explicitely creating FunPtrs, named "fun" along with one which
allocates new memory which must be manually freed named "fun-alloc".
For example, we can capture function f of type CInt -> CInt -> IO
CInt in C code using $fun:(int (*f)(int, int)).
When used in a pure embedding, the Haskell function will have to be
pure too. Continuing the example above we'll have CInt -> CInt ->
IO CInt.
Does not include the baseCtx, since most of the time it's going to be included as part of larger contexts.
IMPORTANT: When using the fun anti quoter, one must be aware that
the function pointer which is automatically generated is freed when
the code contained in the block containing the anti quoter exits.
Thus, if you need the function pointer to be longer-lived, you must
allocate it and free it manually using freeHaskellFunPtr.
We provide utilities to easily
allocate them (see mkFunPtr).
IMPORTANT: When using the fun-alloc anti quoter, one must free the allocated
function pointer. The GHC runtime provides a function to do this,
hs_free_fun_ptr available in the HsFFI.h header.
This Context includes two AntiQuoters that allow to easily use Haskell vectors in C.
Specifically, the vec-len and vec-ptr will get the length and the
pointer underlying mutable (V.IOVector) and immutable (Vector)
storable vectors.
Note that if you use vecCtx to manipulate immutable vectors you must make sure that the vector is not modified in the C code.
To use vec-len, simply write $vec-len:x, where x is something
of type or V.IOVector aVector a, for some a. To use
vec-ptr you need to specify the type of the pointer,
e.g. $vec-len:(int *x) will work if x has type .V.IOVector
CInt
Type class used to implement the anti-quoters in vecCtx.
Associated types
type family VecCtxScalar a
Methods
vecCtxLength :: a -> IntvecCtxUnsafeWith :: a -> (Ptr (VecCtxScalar a) -> IO b) -> IO b
bsCtx serves exactly the same purpose as vecCtx, but only for
ByteString. vec-ptr becomes bs-ptr, and vec-len becomes
bs-len. You don't need to specify the type of the pointer in
bs-ptr, it will always be char*.
Moreover, bs-cstr works as bs-ptr but it provides a null-terminated
copy of the given ByteString.