static void prepare_invocation_info (GPerlI11nInvocationInfo *iinfo, GICallableInfo *info) { gint orig_n_args; guint i; dwarn ("invoke: %s\n" " n_args: %d\n", g_base_info_get_name (info), g_callable_info_get_n_args (info)); iinfo->interface = info; iinfo->is_function = GI_IS_FUNCTION_INFO (info); iinfo->is_vfunc = GI_IS_VFUNC_INFO (info); iinfo->is_callback = (g_base_info_get_type (info) == GI_INFO_TYPE_CALLBACK); iinfo->is_signal = GI_IS_SIGNAL_INFO (info); dwarn (" is_function = %d, is_vfunc = %d, is_callback = %d\n", iinfo->is_function, iinfo->is_vfunc, iinfo->is_callback); orig_n_args = g_callable_info_get_n_args (info); g_assert (orig_n_args >= 0); iinfo->n_args = (guint) orig_n_args; if (iinfo->n_args) { iinfo->arg_infos = gperl_alloc_temp (sizeof (GITypeInfo*) * iinfo->n_args); iinfo->arg_types = gperl_alloc_temp (sizeof (GITypeInfo*) * iinfo->n_args); iinfo->aux_args = gperl_alloc_temp (sizeof (GIArgument) * iinfo->n_args); } else { iinfo->arg_infos = NULL; iinfo->arg_types = NULL; iinfo->aux_args = NULL; } for (i = 0 ; i < iinfo->n_args ; i++) { iinfo->arg_infos[i] = g_callable_info_get_arg (info, (gint) i); iinfo->arg_types[i] = g_arg_info_get_type (iinfo->arg_infos[i]); } iinfo->return_type_info = g_callable_info_get_return_type (info); iinfo->has_return_value = GI_TYPE_TAG_VOID != g_type_info_get_tag (iinfo->return_type_info); iinfo->return_type_ffi = g_type_info_get_ffi_type (iinfo->return_type_info); iinfo->return_type_transfer = g_callable_info_get_caller_owns (info); iinfo->callback_infos = NULL; iinfo->array_infos = NULL; iinfo->free_after_call = NULL; }
/** * g_function_info_get_symbol: * @info: a #GIFunctionInfo * * Obtain the symbol of the function. The symbol is the name of the * exported function, suitable to be used as an argument to * g_module_symbol(). * * Returns: the symbol */ const gchar * g_function_info_get_symbol (GIFunctionInfo *info) { GIRealInfo *rinfo; FunctionBlob *blob; g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), NULL); rinfo = (GIRealInfo *)info; blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; return g_typelib_get_string (rinfo->typelib, blob->symbol); }
/** * g_function_info_get_vfunc: * @info: a #GIFunctionInfo * * Obtain the virtual function associated with this #GIFunctionInfo. * Only #GIFunctionInfo with the flag %GI_FUNCTION_WRAPS_VFUNC has * a virtual function set. For other cases, %NULL will be returned. * * Returns: (transfer full): the virtual function or %NULL if not set. * Free it by calling g_base_info_unref() when done. */ GIVFuncInfo * g_function_info_get_vfunc (GIFunctionInfo *info) { GIRealInfo *rinfo; FunctionBlob *blob; GIInterfaceInfo *container; g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), NULL); rinfo = (GIRealInfo *)info; blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; container = (GIInterfaceInfo *)rinfo->container; return g_interface_info_get_vfunc (container, blob->index); }
/** * g_function_info_get_flags: * @info: a #GIFunctionInfo * * Obtain the #GIFunctionInfoFlags for the @info. * * Returns: the flags */ GIFunctionInfoFlags g_function_info_get_flags (GIFunctionInfo *info) { GIFunctionInfoFlags flags; GIRealInfo *rinfo; FunctionBlob *blob; g_return_val_if_fail (info != NULL, -1); g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), -1); rinfo = (GIRealInfo *)info; blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; flags = 0; /* Make sure we don't flag Constructors as methods */ if (!blob->constructor && !blob->is_static) flags = flags | GI_FUNCTION_IS_METHOD; if (blob->constructor) flags = flags | GI_FUNCTION_IS_CONSTRUCTOR; if (blob->getter) flags = flags | GI_FUNCTION_IS_GETTER; if (blob->setter) flags = flags | GI_FUNCTION_IS_SETTER; if (blob->wraps_vfunc) flags = flags | GI_FUNCTION_WRAPS_VFUNC; if (blob->throws) flags = flags | GI_FUNCTION_THROWS; return flags; }