girffi

## girffi girffi — TODO |

## Synopsis

    void                (*GIFFIClosureCallback)             (ffi_cif *Param1,
                                                             void *Param2,
                                                             void **Param3,
                                                             void *Param4);
    struct              GIFunctionInvoker;
    typedef             GIFFIReturnValue;
    ffi_type *          gi_type_tag_get_ffi_type            (GITypeTag type_tag,
                                                             gboolean is_pointer);
    ffi_type *          g_type_info_get_ffi_type            (GITypeInfo *info);
    void                gi_type_info_extract_ffi_return_value
                                                            (GITypeInfo *return_info,
                                                             GIFFIReturnValue *ffi_value,
                                                             GIArgument *arg);
    gboolean            g_function_info_prep_invoker        (GIFunctionInfo *info,
                                                             GIFunctionInvoker *invoker,
                                                             GError **error);
    gboolean            g_function_invoker_new_for_address  (gpointer addr,
                                                             GICallableInfo *info,
                                                             GIFunctionInvoker *invoker,
                                                             GError **error);
    void                g_function_invoker_destroy          (GIFunctionInvoker *invoker);
    ffi_closure *       g_callable_info_prepare_closure     (GICallableInfo *callable_info,
                                                             ffi_cif *cif,
                                                             GIFFIClosureCallback callback,
                                                             gpointer user_data);
    void                g_callable_info_free_closure        (GICallableInfo *callable_info,
                                                             ffi_closure *closure);

## Description

TODO

## Details

### GIFFIClosureCallback ()

    void                (*GIFFIClosureCallback)             (ffi_cif *Param1,
                                                             void *Param2,
                                                             void **Param3,
                                                             void *Param4);

TODO

`Param1` : | TODO
`Param2` : | TODO
`Param3` : | TODO
`Param4` : | TODO

### struct GIFunctionInvoker

    struct GIFunctionInvoker {
      ffi_cif cif;
      gpointer native_address;
    };

TODO

ffi_cif `cif`; | the cif
gpointer `native_address`; | the native address

### GIFFIReturnValue

    typedef GIArgument GIFFIReturnValue;

TODO

### gi_type_tag_get_ffi_type ()

    ffi_type *          gi_type_tag_get_ffi_type            (GITypeTag type_tag,
                                                             gboolean is_pointer);

TODO

`type_tag` : | A GITypeTag
`is_pointer` : | Whether or not this is a pointer type
Returns : | A ffi_type corresponding to the platform default C ABI for `tag` and `is_pointer`.

### g_type_info_get_ffi_type ()

    ffi_type *          g_type_info_get_ffi_type            (GITypeInfo *info);

TODO

`info` : | A GITypeInfo
Returns : | A ffi_type corresponding to the platform default C ABI for `info`.

### gi_type_info_extract_ffi_return_value ()

    void                gi_type_info_extract_ffi_return_value
                                                            (GITypeInfo *return_info,
                                                             GIFFIReturnValue *ffi_value,
                                                             GIArgument *arg);

Extract the correct bits from an ffi_arg return value into GIArgument: https://bugzilla.gnome.org/show_bug.cgi?id=665152

Also see ffi_call(3) - the storage requirements for return values are "special".

`return_info` : | TODO
`ffi_value` : | TODO
`arg` : | TODO. [out caller-allocates]

### g_function_info_prep_invoker ()

    gboolean            g_function_info_prep_invoker        (GIFunctionInfo *info,
                                                             GIFunctionInvoker *invoker,
                                                             GError **error);

Initialize the caller-allocated `invoker` structure with a cache of information needed to invoke the C function corresponding to `info` with the platform's default ABI.

A primary intent of this function is that a dynamic structure allocated by a language binding could contain a GIFunctionInvoker structure inside the binding's function mapping.

`info` : | A GIFunctionInfo
`invoker` : | Output invoker structure
`error` : | A GError
Returns : | `TRUE` on success, `FALSE` otherwise with `error` set.

### g_function_invoker_new_for_address ()

    gboolean            g_function_invoker_new_for_address  (gpointer addr,
                                                             GICallableInfo *info,
                                                             GIFunctionInvoker *invoker,
                                                             GError **error);

Initialize the caller-allocated `invoker` structure with a cache of information needed to invoke the C function corresponding to `info` with the platform's default ABI.

A primary intent of this function is that a dynamic structure allocated by a language binding could contain a GIFunctionInvoker structure inside the binding's function mapping.

`addr` : | The address
`info` : | A GICallableInfo
`invoker` : | Output invoker structure
`error` : | A GError
Returns : | `TRUE` on success, `FALSE` otherwise with `error` set.

### g_function_invoker_destroy ()

    void                g_function_invoker_destroy          (GIFunctionInvoker *invoker);

Release all resources allocated for the internals of `invoker`; callers are responsible for freeing any resources allocated for the structure itself however.

`invoker` : | A GIFunctionInvoker

### g_callable_info_prepare_closure ()

    ffi_closure *       g_callable_info_prepare_closure     (GICallableInfo *callable_info,
                                                             ffi_cif *cif,
                                                             GIFFIClosureCallback callback,
                                                             gpointer user_data);

Prepares a callback for ffi invocation.

`callable_info` : | a callable info from a typelib
`cif` : | a ffi_cif structure
`callback` : | the ffi callback
`user_data` : | data to be passed into the callback
Returns : | the ffi_closure or NULL on error. The return value should be freed by calling `g_callable_info_free_closure()`.

### g_callable_info_free_closure ()

    void                g_callable_info_free_closure        (GICallableInfo *callable_info,
                                                             ffi_closure *closure);

Frees a ffi_closure returned from `g_callable_info_prepare_closure()`

`callable_info` : | a callable info from a typelib
`closure` : | ffi closure