Branch data Line data Source code
1 : : /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- 2 : : * GObject introspection: Helper functions for ffi integration 3 : : * 4 : : * Copyright (C) 2008 Red Hat, Inc 5 : : * 6 : : * SPDX-License-Identifier: LGPL-2.1-or-later 7 : : * 8 : : * This library is free software; you can redistribute it and/or 9 : : * modify it under the terms of the GNU Lesser General Public 10 : : * License as published by the Free Software Foundation; either 11 : : * version 2 of the License, or (at your option) any later version. 12 : : * 13 : : * This library is distributed in the hope that it will be useful, 14 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 : : * Lesser General Public License for more details. 17 : : * 18 : : * You should have received a copy of the GNU Lesser General Public 19 : : * License along with this library; if not, write to the 20 : : * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 21 : : * Boston, MA 02111-1307, USA. 22 : : */ 23 : : 24 : : #pragma once 25 : : 26 : : #if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) 27 : : #error "Only <girepository.h> can be included directly." 28 : : #endif 29 : : 30 : : #include <ffi.h> 31 : : #include "girepository.h" 32 : : 33 : : G_BEGIN_DECLS 34 : : 35 : : /** 36 : : * GIFFIClosureCallback: 37 : : * @cif: the `ffi_cif` passed to 38 : : * [method@GIRepository.CallableInfo.create_closure] 39 : : * @ret: (out caller-allocates): a pointer to the memory used for the function’s 40 : : * return value 41 : : * @args: a vector of pointers to memory holding the arguments to the function 42 : : * @user_data: the user data passed to 43 : : * [method@GIRepository.CallableInfo.create_closure] 44 : : * 45 : : * The function which will be called when a closure created with 46 : : * [method@GIRepository.CallableInfo.create_closure] is invoked. 47 : : * 48 : : * The value of @ret is undefined if the function returns `void`. 49 : : * 50 : : * Since: 2.80 51 : : */ 52 : : typedef void (*GIFFIClosureCallback) (ffi_cif *cif, 53 : : void *ret, 54 : : void **args, 55 : : void *user_data); 56 : : 57 : : /** 58 : : * GIFunctionInvoker: 59 : : * @cif: the cif 60 : : * @native_address: the native address 61 : : * 62 : : * Structure containing the data necessary to invoke a callable function. 63 : : * 64 : : * Since: 2.80 65 : : */ 66 : : typedef struct { 67 : : ffi_cif cif; 68 : : void *native_address; 69 : : /*< private >*/ 70 : : void *padding[3]; 71 : : } GIFunctionInvoker; 72 : : 73 : : /** 74 : : * GIFFIReturnValue: 75 : : * 76 : : * The type of a return value from a callable invocation closure. 77 : : * 78 : : * Since: 2.80 79 : : */ 80 : : typedef GIArgument GIFFIReturnValue; 81 : : 82 : : GI_AVAILABLE_IN_ALL 83 : : ffi_type * gi_type_tag_get_ffi_type (GITypeTag type_tag, gboolean is_pointer); 84 : : 85 : : GI_AVAILABLE_IN_ALL 86 : : ffi_type * gi_type_info_get_ffi_type (GITypeInfo *info); 87 : : 88 : : GI_AVAILABLE_IN_ALL 89 : : void gi_type_info_extract_ffi_return_value (GITypeInfo *return_info, 90 : : GIFFIReturnValue *ffi_value, 91 : : GIArgument *arg); 92 : : 93 : : GI_AVAILABLE_IN_ALL 94 : : void gi_type_tag_extract_ffi_return_value (GITypeTag return_tag, 95 : : GType interface_type, 96 : : GIFFIReturnValue *ffi_value, 97 : : GIArgument *arg); 98 : : 99 : : GI_AVAILABLE_IN_ALL 100 : : gboolean gi_function_info_prep_invoker (GIFunctionInfo *info, 101 : : GIFunctionInvoker *invoker, 102 : : GError **error); 103 : : 104 : : GI_AVAILABLE_IN_ALL 105 : : gboolean gi_function_invoker_new_for_address (void *addr, 106 : : GICallableInfo *info, 107 : : GIFunctionInvoker *invoker, 108 : : GError **error); 109 : : 110 : : GI_AVAILABLE_IN_ALL 111 : : void gi_function_invoker_clear (GIFunctionInvoker *invoker); 112 : : 113 : 1 : G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (GIFunctionInvoker, gi_function_invoker_clear) 114 : : 115 : : GI_AVAILABLE_IN_ALL 116 : : ffi_closure * gi_callable_info_create_closure (GICallableInfo *callable_info, 117 : : ffi_cif *cif, 118 : : GIFFIClosureCallback callback, 119 : : void *user_data); 120 : : 121 : : GI_AVAILABLE_IN_ALL 122 : : void ** gi_callable_info_get_closure_native_address (GICallableInfo *callable_info, 123 : : ffi_closure *closure); 124 : : 125 : : GI_AVAILABLE_IN_ALL 126 : : void gi_callable_info_destroy_closure (GICallableInfo *callable_info, 127 : : ffi_closure *closure); 128 : : 129 : : G_END_DECLS