/* valaccodedelegatemodule.c generated by valac, the Vala compiler
 * generated from valaccodedelegatemodule.vala, do not modify */

/* valaccodedelegatemodule.vala
 *
 * Copyright (C) 2006-2010  Jürg Billeter
 * Copyright (C) 2006-2008  Raffaele Sandrini
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 *
 * Author:
 * 	Jürg Billeter <j@bitron.ch>
 *	Raffaele Sandrini <raffaele@sandrini.ch>
 */

#include <glib.h>
#include <glib-object.h>
#include "valacodegen.h"
#include <vala.h>
#include <valaccode.h>
#include <stdlib.h>
#include <string.h>
#include <valagee.h>
#include <float.h>
#include <math.h>

#define _g_free0(var) (var = (g_free (var), NULL))
#define _vala_map_unref0(var) ((var == NULL) ? NULL : (var = (vala_map_unref (var), NULL)))
#define _vala_ccode_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_ccode_node_unref (var), NULL)))
#define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
#define _vala_iterable_unref0(var) ((var == NULL) ? NULL : (var = (vala_iterable_unref (var), NULL)))

#define VALA_TYPE_GLIB_VALUE (vala_glib_value_get_type ())
#define VALA_GLIB_VALUE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VALA_TYPE_GLIB_VALUE, ValaGLibValue))
#define VALA_GLIB_VALUE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VALA_TYPE_GLIB_VALUE, ValaGLibValueClass))
#define VALA_IS_GLIB_VALUE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VALA_TYPE_GLIB_VALUE))
#define VALA_IS_GLIB_VALUE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VALA_TYPE_GLIB_VALUE))
#define VALA_GLIB_VALUE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VALA_TYPE_GLIB_VALUE, ValaGLibValueClass))

typedef struct _ValaGLibValue ValaGLibValue;
typedef struct _ValaGLibValueClass ValaGLibValueClass;
typedef struct _ValaGLibValuePrivate ValaGLibValuePrivate;
#define _vala_iterator_unref0(var) ((var == NULL) ? NULL : (var = (vala_iterator_unref (var), NULL)))

struct _ValaGLibValue {
	ValaTargetValue parent_instance;
	ValaGLibValuePrivate * priv;
	ValaCCodeExpression* cvalue;
	gboolean lvalue;
	gboolean non_null;
	gchar* ctype;
	ValaList* array_length_cvalues;
	ValaCCodeExpression* array_size_cvalue;
	gboolean array_null_terminated;
	ValaCCodeExpression* array_length_cexpr;
	ValaCCodeExpression* delegate_target_cvalue;
	ValaCCodeExpression* delegate_target_destroy_notify_cvalue;
};

struct _ValaGLibValueClass {
	ValaTargetValueClass parent_class;
};


static gpointer vala_ccode_delegate_module_parent_class = NULL;

static void vala_ccode_delegate_module_real_generate_delegate_declaration (ValaCCodeBaseModule* base, ValaDelegate* d, ValaCCodeFile* decl_space);
static void vala_ccode_delegate_module_real_visit_delegate (ValaCodeVisitor* base, ValaDelegate* d);
static gchar* vala_ccode_delegate_module_real_get_delegate_target_cname (ValaCCodeBaseModule* base, const gchar* delegate_cname);
static ValaCCodeExpression* vala_ccode_delegate_module_real_get_delegate_target_cexpression (ValaCCodeBaseModule* base, ValaExpression* delegate_expr, ValaCCodeExpression* * delegate_target_destroy_notify);
static ValaCCodeExpression* vala_ccode_delegate_module_real_get_delegate_target_cvalue (ValaCCodeBaseModule* base, ValaTargetValue* value);
G_GNUC_INTERNAL GType vala_glib_value_get_type (void) G_GNUC_CONST G_GNUC_UNUSED;
static ValaCCodeExpression* vala_ccode_delegate_module_real_get_delegate_target_destroy_notify_cvalue (ValaCCodeBaseModule* base, ValaTargetValue* value);
static gchar* vala_ccode_delegate_module_real_get_delegate_target_destroy_notify_cname (ValaCCodeBaseModule* base, const gchar* delegate_cname);
static ValaCCodeExpression* vala_ccode_delegate_module_real_get_implicit_cast_expression (ValaCCodeBaseModule* base, ValaCCodeExpression* source_cexpr, ValaDataType* expression_type, ValaDataType* target_type, ValaCodeNode* node);
static ValaCCodeParameter* vala_ccode_delegate_module_real_generate_parameter (ValaCCodeMethodModule* base, ValaParameter* param, ValaCCodeFile* decl_space, ValaMap* cparam_map, ValaMap* carg_map);


static gpointer _vala_code_node_ref0 (gpointer self) {
	return self ? vala_code_node_ref (self) : NULL;
}


static void vala_ccode_delegate_module_real_generate_delegate_declaration (ValaCCodeBaseModule* base, ValaDelegate* d, ValaCCodeFile* decl_space) {
	ValaCCodeDelegateModule * self;
	ValaCCodeFile* _tmp0_;
	ValaDelegate* _tmp1_;
	ValaDelegate* _tmp2_;
	gchar* _tmp3_;
	gchar* _tmp4_;
	gboolean _tmp5_;
	gboolean _tmp6_;
	gchar* return_type_cname = NULL;
	ValaDelegate* _tmp7_;
	ValaDataType* _tmp8_;
	ValaDataType* _tmp9_;
	gchar* _tmp10_;
	ValaDelegate* _tmp11_;
	ValaDataType* _tmp12_;
	ValaDataType* _tmp13_;
	gboolean _tmp14_;
	const gchar* _tmp16_;
	ValaDelegate* _tmp17_;
	gchar* _tmp18_;
	gchar* _tmp19_;
	gboolean _tmp20_;
	ValaCCodeFunctionDeclarator* cfundecl = NULL;
	ValaDelegate* _tmp26_;
	gchar* _tmp27_;
	gchar* _tmp28_;
	ValaCCodeFunctionDeclarator* _tmp29_;
	ValaCCodeFunctionDeclarator* _tmp30_;
	gboolean _tmp118_ = FALSE;
	ValaDelegate* _tmp119_;
	gboolean _tmp120_;
	ValaDelegate* _tmp195_;
	gboolean _tmp196_;
	gboolean _tmp197_;
	ValaDelegate* _tmp201_;
	ValaList* _tmp202_;
	ValaList* _tmp203_;
	gint _tmp204_;
	gint _tmp205_;
	gboolean _tmp206_;
	ValaCCodeTypeDefinition* ctypedef = NULL;
	const gchar* _tmp210_;
	ValaCCodeFunctionDeclarator* _tmp211_;
	ValaCCodeTypeDefinition* _tmp212_;
	ValaCCodeModifiers _tmp213_ = 0;
	ValaDelegate* _tmp214_;
	ValaVersionAttribute* _tmp215_;
	ValaVersionAttribute* _tmp216_;
	gboolean _tmp217_;
	gboolean _tmp218_;
	ValaCCodeTypeDefinition* _tmp219_;
	ValaCCodeTypeDefinition* _tmp220_;
	ValaCCodeModifiers _tmp221_;
	ValaCCodeModifiers _tmp222_;
	ValaCCodeFile* _tmp223_;
	ValaCCodeTypeDefinition* _tmp224_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_if_fail (d != NULL);
	g_return_if_fail (decl_space != NULL);
	_tmp0_ = decl_space;
	_tmp1_ = d;
	_tmp2_ = d;
	_tmp3_ = vala_get_ccode_name ((ValaCodeNode*) _tmp2_);
	_tmp4_ = _tmp3_;
	_tmp5_ = vala_ccode_base_module_add_symbol_declaration ((ValaCCodeBaseModule*) self, _tmp0_, (ValaSymbol*) _tmp1_, _tmp4_);
	_tmp6_ = _tmp5_;
	_g_free0 (_tmp4_);
	if (_tmp6_) {
		return;
	}
	_tmp7_ = d;
	_tmp8_ = vala_callable_get_return_type ((ValaCallable*) _tmp7_);
	_tmp9_ = _tmp8_;
	_tmp10_ = vala_get_ccode_name ((ValaCodeNode*) _tmp9_);
	return_type_cname = _tmp10_;
	_tmp11_ = d;
	_tmp12_ = vala_callable_get_return_type ((ValaCallable*) _tmp11_);
	_tmp13_ = _tmp12_;
	_tmp14_ = vala_data_type_is_real_non_null_struct_type (_tmp13_);
	if (_tmp14_) {
		gchar* _tmp15_;
		_tmp15_ = g_strdup ("void");
		_g_free0 (return_type_cname);
		return_type_cname = _tmp15_;
	}
	_tmp16_ = return_type_cname;
	_tmp17_ = d;
	_tmp18_ = vala_get_ccode_name ((ValaCodeNode*) _tmp17_);
	_tmp19_ = _tmp18_;
	_tmp20_ = g_strcmp0 (_tmp16_, _tmp19_) == 0;
	_g_free0 (_tmp19_);
	if (_tmp20_) {
		gchar* _tmp21_;
		_tmp21_ = g_strdup ("GCallback");
		_g_free0 (return_type_cname);
		return_type_cname = _tmp21_;
	} else {
		ValaDelegate* _tmp22_;
		ValaDataType* _tmp23_;
		ValaDataType* _tmp24_;
		ValaCCodeFile* _tmp25_;
		_tmp22_ = d;
		_tmp23_ = vala_callable_get_return_type ((ValaCallable*) _tmp22_);
		_tmp24_ = _tmp23_;
		_tmp25_ = decl_space;
		vala_ccode_base_module_generate_type_declaration ((ValaCCodeBaseModule*) self, _tmp24_, _tmp25_);
	}
	_tmp26_ = d;
	_tmp27_ = vala_get_ccode_name ((ValaCodeNode*) _tmp26_);
	_tmp28_ = _tmp27_;
	_tmp29_ = vala_ccode_function_declarator_new (_tmp28_);
	_tmp30_ = _tmp29_;
	_g_free0 (_tmp28_);
	cfundecl = _tmp30_;
	{
		ValaList* _param_list = NULL;
		ValaDelegate* _tmp31_;
		ValaList* _tmp32_;
		gint _param_size = 0;
		ValaList* _tmp33_;
		gint _tmp34_;
		gint _tmp35_;
		gint _param_index = 0;
		_tmp31_ = d;
		_tmp32_ = vala_callable_get_parameters ((ValaCallable*) _tmp31_);
		_param_list = _tmp32_;
		_tmp33_ = _param_list;
		_tmp34_ = vala_collection_get_size ((ValaCollection*) _tmp33_);
		_tmp35_ = _tmp34_;
		_param_size = _tmp35_;
		_param_index = -1;
		while (TRUE) {
			gint _tmp36_;
			gint _tmp37_;
			gint _tmp38_;
			ValaParameter* param = NULL;
			ValaList* _tmp39_;
			gint _tmp40_;
			gpointer _tmp41_;
			ValaCCodeParameter* cparam = NULL;
			ValaParameter* _tmp42_;
			ValaCCodeFile* _tmp43_;
			GHashFunc _tmp44_;
			GEqualFunc _tmp45_;
			GEqualFunc _tmp46_;
			ValaHashMap* _tmp47_;
			ValaHashMap* _tmp48_;
			ValaCCodeParameter* _tmp49_;
			ValaCCodeParameter* _tmp50_;
			ValaCCodeFunctionDeclarator* _tmp51_;
			ValaCCodeParameter* _tmp52_;
			gboolean _tmp53_ = FALSE;
			ValaParameter* _tmp54_;
			gboolean _tmp55_;
			ValaParameter* _tmp82_;
			ValaDataType* _tmp83_;
			ValaDataType* _tmp84_;
			_tmp36_ = _param_index;
			_param_index = _tmp36_ + 1;
			_tmp37_ = _param_index;
			_tmp38_ = _param_size;
			if (!(_tmp37_ < _tmp38_)) {
				break;
			}
			_tmp39_ = _param_list;
			_tmp40_ = _param_index;
			_tmp41_ = vala_list_get (_tmp39_, _tmp40_);
			param = (ValaParameter*) _tmp41_;
			_tmp42_ = param;
			_tmp43_ = decl_space;
			_tmp44_ = g_direct_hash;
			_tmp45_ = g_direct_equal;
			_tmp46_ = g_direct_equal;
			_tmp47_ = vala_hash_map_new (G_TYPE_INT, NULL, NULL, VALA_TYPE_CCODE_PARAMETER, (GBoxedCopyFunc) vala_ccode_node_ref, (GDestroyNotify) vala_ccode_node_unref, _tmp44_, _tmp45_, _tmp46_);
			_tmp48_ = _tmp47_;
			_tmp49_ = vala_ccode_method_module_generate_parameter ((ValaCCodeMethodModule*) self, _tmp42_, _tmp43_, (ValaMap*) _tmp48_, NULL);
			_tmp50_ = _tmp49_;
			_vala_map_unref0 (_tmp48_);
			cparam = _tmp50_;
			_tmp51_ = cfundecl;
			_tmp52_ = cparam;
			vala_ccode_function_declarator_add_parameter (_tmp51_, _tmp52_);
			_tmp54_ = param;
			_tmp55_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp54_);
			if (_tmp55_) {
				ValaParameter* _tmp56_;
				ValaDataType* _tmp57_;
				ValaDataType* _tmp58_;
				_tmp56_ = param;
				_tmp57_ = vala_variable_get_variable_type ((ValaVariable*) _tmp56_);
				_tmp58_ = _tmp57_;
				_tmp53_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp58_, VALA_TYPE_ARRAY_TYPE);
			} else {
				_tmp53_ = FALSE;
			}
			if (_tmp53_) {
				ValaArrayType* array_type = NULL;
				ValaParameter* _tmp59_;
				ValaDataType* _tmp60_;
				ValaDataType* _tmp61_;
				ValaArrayType* _tmp62_;
				gchar* length_ctype = NULL;
				gchar* _tmp63_;
				ValaParameter* _tmp64_;
				ValaParameterDirection _tmp65_;
				ValaParameterDirection _tmp66_;
				_tmp59_ = param;
				_tmp60_ = vala_variable_get_variable_type ((ValaVariable*) _tmp59_);
				_tmp61_ = _tmp60_;
				_tmp62_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp61_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
				array_type = _tmp62_;
				_tmp63_ = g_strdup ("int");
				length_ctype = _tmp63_;
				_tmp64_ = param;
				_tmp65_ = vala_parameter_get_direction (_tmp64_);
				_tmp66_ = _tmp65_;
				if (_tmp66_ != VALA_PARAMETER_DIRECTION_IN) {
					gchar* _tmp67_;
					_tmp67_ = g_strdup ("int*");
					_g_free0 (length_ctype);
					length_ctype = _tmp67_;
				}
				{
					gint dim = 0;
					dim = 1;
					{
						gboolean _tmp68_ = FALSE;
						_tmp68_ = TRUE;
						while (TRUE) {
							gint _tmp70_;
							ValaArrayType* _tmp71_;
							gint _tmp72_;
							gint _tmp73_;
							ValaParameter* _tmp74_;
							gint _tmp75_;
							gchar* _tmp76_;
							gchar* _tmp77_;
							const gchar* _tmp78_;
							ValaCCodeParameter* _tmp79_;
							ValaCCodeFunctionDeclarator* _tmp80_;
							ValaCCodeParameter* _tmp81_;
							if (!_tmp68_) {
								gint _tmp69_;
								_tmp69_ = dim;
								dim = _tmp69_ + 1;
							}
							_tmp68_ = FALSE;
							_tmp70_ = dim;
							_tmp71_ = array_type;
							_tmp72_ = vala_array_type_get_rank (_tmp71_);
							_tmp73_ = _tmp72_;
							if (!(_tmp70_ <= _tmp73_)) {
								break;
							}
							_tmp74_ = param;
							_tmp75_ = dim;
							_tmp76_ = vala_ccode_base_module_get_parameter_array_length_cname ((ValaCCodeBaseModule*) self, _tmp74_, _tmp75_);
							_tmp77_ = _tmp76_;
							_tmp78_ = length_ctype;
							_tmp79_ = vala_ccode_parameter_new (_tmp77_, _tmp78_);
							_vala_ccode_node_unref0 (cparam);
							cparam = _tmp79_;
							_g_free0 (_tmp77_);
							_tmp80_ = cfundecl;
							_tmp81_ = cparam;
							vala_ccode_function_declarator_add_parameter (_tmp80_, _tmp81_);
						}
					}
				}
				_g_free0 (length_ctype);
				_vala_code_node_unref0 (array_type);
			}
			_tmp82_ = param;
			_tmp83_ = vala_variable_get_variable_type ((ValaVariable*) _tmp82_);
			_tmp84_ = _tmp83_;
			if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp84_, VALA_TYPE_DELEGATE_TYPE)) {
				ValaDelegateType* deleg_type = NULL;
				ValaParameter* _tmp85_;
				ValaDataType* _tmp86_;
				ValaDataType* _tmp87_;
				ValaDelegateType* _tmp88_;
				ValaDelegate* param_d = NULL;
				ValaDelegateType* _tmp89_;
				ValaDelegate* _tmp90_;
				ValaDelegate* _tmp91_;
				ValaDelegate* _tmp92_;
				ValaDelegate* _tmp93_;
				gboolean _tmp94_;
				gboolean _tmp95_;
				_tmp85_ = param;
				_tmp86_ = vala_variable_get_variable_type ((ValaVariable*) _tmp85_);
				_tmp87_ = _tmp86_;
				_tmp88_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp87_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
				deleg_type = _tmp88_;
				_tmp89_ = deleg_type;
				_tmp90_ = vala_delegate_type_get_delegate_symbol (_tmp89_);
				_tmp91_ = _tmp90_;
				_tmp92_ = _vala_code_node_ref0 (_tmp91_);
				param_d = _tmp92_;
				_tmp93_ = param_d;
				_tmp94_ = vala_delegate_get_has_target (_tmp93_);
				_tmp95_ = _tmp94_;
				if (_tmp95_) {
					ValaParameter* _tmp96_;
					const gchar* _tmp97_;
					const gchar* _tmp98_;
					gchar* _tmp99_;
					gchar* _tmp100_;
					gchar* _tmp101_;
					gchar* _tmp102_;
					ValaCCodeParameter* _tmp103_;
					ValaCCodeFunctionDeclarator* _tmp104_;
					ValaCCodeParameter* _tmp105_;
					ValaDelegateType* _tmp106_;
					gboolean _tmp107_;
					_tmp96_ = param;
					_tmp97_ = vala_symbol_get_name ((ValaSymbol*) _tmp96_);
					_tmp98_ = _tmp97_;
					_tmp99_ = vala_ccode_base_module_get_variable_cname ((ValaCCodeBaseModule*) self, _tmp98_);
					_tmp100_ = _tmp99_;
					_tmp101_ = vala_ccode_base_module_get_delegate_target_cname ((ValaCCodeBaseModule*) self, _tmp100_);
					_tmp102_ = _tmp101_;
					_tmp103_ = vala_ccode_parameter_new (_tmp102_, "void*");
					_vala_ccode_node_unref0 (cparam);
					cparam = _tmp103_;
					_g_free0 (_tmp102_);
					_g_free0 (_tmp100_);
					_tmp104_ = cfundecl;
					_tmp105_ = cparam;
					vala_ccode_function_declarator_add_parameter (_tmp104_, _tmp105_);
					_tmp106_ = deleg_type;
					_tmp107_ = vala_data_type_is_disposable ((ValaDataType*) _tmp106_);
					if (_tmp107_) {
						ValaParameter* _tmp108_;
						const gchar* _tmp109_;
						const gchar* _tmp110_;
						gchar* _tmp111_;
						gchar* _tmp112_;
						gchar* _tmp113_;
						gchar* _tmp114_;
						ValaCCodeParameter* _tmp115_;
						ValaCCodeFunctionDeclarator* _tmp116_;
						ValaCCodeParameter* _tmp117_;
						_tmp108_ = param;
						_tmp109_ = vala_symbol_get_name ((ValaSymbol*) _tmp108_);
						_tmp110_ = _tmp109_;
						_tmp111_ = vala_ccode_base_module_get_variable_cname ((ValaCCodeBaseModule*) self, _tmp110_);
						_tmp112_ = _tmp111_;
						_tmp113_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cname ((ValaCCodeBaseModule*) self, _tmp112_);
						_tmp114_ = _tmp113_;
						_tmp115_ = vala_ccode_parameter_new (_tmp114_, "GDestroyNotify");
						_vala_ccode_node_unref0 (cparam);
						cparam = _tmp115_;
						_g_free0 (_tmp114_);
						_g_free0 (_tmp112_);
						_tmp116_ = cfundecl;
						_tmp117_ = cparam;
						vala_ccode_function_declarator_add_parameter (_tmp116_, _tmp117_);
					}
				}
				_vala_code_node_unref0 (param_d);
				_vala_code_node_unref0 (deleg_type);
			}
			_vala_ccode_node_unref0 (cparam);
			_vala_code_node_unref0 (param);
		}
		_vala_iterable_unref0 (_param_list);
	}
	_tmp119_ = d;
	_tmp120_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp119_);
	if (_tmp120_) {
		ValaDelegate* _tmp121_;
		ValaDataType* _tmp122_;
		ValaDataType* _tmp123_;
		_tmp121_ = d;
		_tmp122_ = vala_callable_get_return_type ((ValaCallable*) _tmp121_);
		_tmp123_ = _tmp122_;
		_tmp118_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp123_, VALA_TYPE_ARRAY_TYPE);
	} else {
		_tmp118_ = FALSE;
	}
	if (_tmp118_) {
		ValaArrayType* array_type = NULL;
		ValaDelegate* _tmp124_;
		ValaDataType* _tmp125_;
		ValaDataType* _tmp126_;
		ValaArrayType* _tmp127_;
		gchar* _tmp128_ = NULL;
		ValaDelegate* _tmp129_;
		gchar* _tmp130_;
		gchar* _tmp131_;
		gboolean _tmp132_;
		gchar* array_length_type = NULL;
		gchar* _tmp136_;
		const gchar* _tmp137_;
		gchar* _tmp138_;
		_tmp124_ = d;
		_tmp125_ = vala_callable_get_return_type ((ValaCallable*) _tmp124_);
		_tmp126_ = _tmp125_;
		_tmp127_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp126_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
		array_type = _tmp127_;
		_tmp129_ = d;
		_tmp130_ = vala_get_ccode_array_length_type ((ValaCodeNode*) _tmp129_);
		_tmp131_ = _tmp130_;
		_tmp132_ = _tmp131_ != NULL;
		_g_free0 (_tmp131_);
		if (_tmp132_) {
			ValaDelegate* _tmp133_;
			gchar* _tmp134_;
			_tmp133_ = d;
			_tmp134_ = vala_get_ccode_array_length_type ((ValaCodeNode*) _tmp133_);
			_g_free0 (_tmp128_);
			_tmp128_ = _tmp134_;
		} else {
			gchar* _tmp135_;
			_tmp135_ = g_strdup ("int");
			_g_free0 (_tmp128_);
			_tmp128_ = _tmp135_;
		}
		_tmp136_ = g_strdup (_tmp128_);
		array_length_type = _tmp136_;
		_tmp137_ = array_length_type;
		_tmp138_ = g_strconcat (_tmp137_, "*", NULL);
		_g_free0 (array_length_type);
		array_length_type = _tmp138_;
		{
			gint dim = 0;
			dim = 1;
			{
				gboolean _tmp139_ = FALSE;
				_tmp139_ = TRUE;
				while (TRUE) {
					gint _tmp141_;
					ValaArrayType* _tmp142_;
					gint _tmp143_;
					gint _tmp144_;
					ValaCCodeParameter* cparam = NULL;
					gint _tmp145_;
					gchar* _tmp146_;
					gchar* _tmp147_;
					const gchar* _tmp148_;
					ValaCCodeParameter* _tmp149_;
					ValaCCodeParameter* _tmp150_;
					ValaCCodeFunctionDeclarator* _tmp151_;
					ValaCCodeParameter* _tmp152_;
					if (!_tmp139_) {
						gint _tmp140_;
						_tmp140_ = dim;
						dim = _tmp140_ + 1;
					}
					_tmp139_ = FALSE;
					_tmp141_ = dim;
					_tmp142_ = array_type;
					_tmp143_ = vala_array_type_get_rank (_tmp142_);
					_tmp144_ = _tmp143_;
					if (!(_tmp141_ <= _tmp144_)) {
						break;
					}
					_tmp145_ = dim;
					_tmp146_ = vala_ccode_base_module_get_array_length_cname ((ValaCCodeBaseModule*) self, "result", _tmp145_);
					_tmp147_ = _tmp146_;
					_tmp148_ = array_length_type;
					_tmp149_ = vala_ccode_parameter_new (_tmp147_, _tmp148_);
					_tmp150_ = _tmp149_;
					_g_free0 (_tmp147_);
					cparam = _tmp150_;
					_tmp151_ = cfundecl;
					_tmp152_ = cparam;
					vala_ccode_function_declarator_add_parameter (_tmp151_, _tmp152_);
					_vala_ccode_node_unref0 (cparam);
				}
			}
		}
		_g_free0 (array_length_type);
		_g_free0 (_tmp128_);
		_vala_code_node_unref0 (array_type);
	} else {
		ValaDelegate* _tmp153_;
		ValaDataType* _tmp154_;
		ValaDataType* _tmp155_;
		_tmp153_ = d;
		_tmp154_ = vala_callable_get_return_type ((ValaCallable*) _tmp153_);
		_tmp155_ = _tmp154_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp155_, VALA_TYPE_DELEGATE_TYPE)) {
			ValaDelegateType* deleg_type = NULL;
			ValaDelegate* _tmp156_;
			ValaDataType* _tmp157_;
			ValaDataType* _tmp158_;
			ValaDelegateType* _tmp159_;
			ValaDelegate* result_d = NULL;
			ValaDelegateType* _tmp160_;
			ValaDelegate* _tmp161_;
			ValaDelegate* _tmp162_;
			ValaDelegate* _tmp163_;
			ValaDelegate* _tmp164_;
			gboolean _tmp165_;
			gboolean _tmp166_;
			_tmp156_ = d;
			_tmp157_ = vala_callable_get_return_type ((ValaCallable*) _tmp156_);
			_tmp158_ = _tmp157_;
			_tmp159_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp158_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
			deleg_type = _tmp159_;
			_tmp160_ = deleg_type;
			_tmp161_ = vala_delegate_type_get_delegate_symbol (_tmp160_);
			_tmp162_ = _tmp161_;
			_tmp163_ = _vala_code_node_ref0 (_tmp162_);
			result_d = _tmp163_;
			_tmp164_ = result_d;
			_tmp165_ = vala_delegate_get_has_target (_tmp164_);
			_tmp166_ = _tmp165_;
			if (_tmp166_) {
				ValaCCodeParameter* cparam = NULL;
				gchar* _tmp167_;
				gchar* _tmp168_;
				ValaCCodeParameter* _tmp169_;
				ValaCCodeParameter* _tmp170_;
				ValaCCodeFunctionDeclarator* _tmp171_;
				ValaCCodeParameter* _tmp172_;
				ValaDelegateType* _tmp173_;
				gboolean _tmp174_;
				_tmp167_ = vala_ccode_base_module_get_delegate_target_cname ((ValaCCodeBaseModule*) self, "result");
				_tmp168_ = _tmp167_;
				_tmp169_ = vala_ccode_parameter_new (_tmp168_, "void**");
				_tmp170_ = _tmp169_;
				_g_free0 (_tmp168_);
				cparam = _tmp170_;
				_tmp171_ = cfundecl;
				_tmp172_ = cparam;
				vala_ccode_function_declarator_add_parameter (_tmp171_, _tmp172_);
				_tmp173_ = deleg_type;
				_tmp174_ = vala_data_type_is_disposable ((ValaDataType*) _tmp173_);
				if (_tmp174_) {
					gchar* _tmp175_;
					gchar* _tmp176_;
					ValaCCodeParameter* _tmp177_;
					ValaCCodeFunctionDeclarator* _tmp178_;
					ValaCCodeParameter* _tmp179_;
					_tmp175_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cname ((ValaCCodeBaseModule*) self, "result");
					_tmp176_ = _tmp175_;
					_tmp177_ = vala_ccode_parameter_new (_tmp176_, "GDestroyNotify*");
					_vala_ccode_node_unref0 (cparam);
					cparam = _tmp177_;
					_g_free0 (_tmp176_);
					_tmp178_ = cfundecl;
					_tmp179_ = cparam;
					vala_ccode_function_declarator_add_parameter (_tmp178_, _tmp179_);
				}
				_vala_ccode_node_unref0 (cparam);
			}
			_vala_code_node_unref0 (result_d);
			_vala_code_node_unref0 (deleg_type);
		} else {
			ValaDelegate* _tmp180_;
			ValaDataType* _tmp181_;
			ValaDataType* _tmp182_;
			gboolean _tmp183_;
			_tmp180_ = d;
			_tmp181_ = vala_callable_get_return_type ((ValaCallable*) _tmp180_);
			_tmp182_ = _tmp181_;
			_tmp183_ = vala_data_type_is_real_non_null_struct_type (_tmp182_);
			if (_tmp183_) {
				ValaCCodeParameter* cparam = NULL;
				ValaDelegate* _tmp184_;
				ValaDataType* _tmp185_;
				ValaDataType* _tmp186_;
				gchar* _tmp187_;
				gchar* _tmp188_;
				gchar* _tmp189_;
				gchar* _tmp190_;
				ValaCCodeParameter* _tmp191_;
				ValaCCodeParameter* _tmp192_;
				ValaCCodeFunctionDeclarator* _tmp193_;
				ValaCCodeParameter* _tmp194_;
				_tmp184_ = d;
				_tmp185_ = vala_callable_get_return_type ((ValaCallable*) _tmp184_);
				_tmp186_ = _tmp185_;
				_tmp187_ = vala_get_ccode_name ((ValaCodeNode*) _tmp186_);
				_tmp188_ = _tmp187_;
				_tmp189_ = g_strdup_printf ("%s*", _tmp188_);
				_tmp190_ = _tmp189_;
				_tmp191_ = vala_ccode_parameter_new ("result", _tmp190_);
				_tmp192_ = _tmp191_;
				_g_free0 (_tmp190_);
				_g_free0 (_tmp188_);
				cparam = _tmp192_;
				_tmp193_ = cfundecl;
				_tmp194_ = cparam;
				vala_ccode_function_declarator_add_parameter (_tmp193_, _tmp194_);
				_vala_ccode_node_unref0 (cparam);
			}
		}
	}
	_tmp195_ = d;
	_tmp196_ = vala_delegate_get_has_target (_tmp195_);
	_tmp197_ = _tmp196_;
	if (_tmp197_) {
		ValaCCodeParameter* cparam = NULL;
		ValaCCodeParameter* _tmp198_;
		ValaCCodeFunctionDeclarator* _tmp199_;
		ValaCCodeParameter* _tmp200_;
		_tmp198_ = vala_ccode_parameter_new ("user_data", "void*");
		cparam = _tmp198_;
		_tmp199_ = cfundecl;
		_tmp200_ = cparam;
		vala_ccode_function_declarator_add_parameter (_tmp199_, _tmp200_);
		_vala_ccode_node_unref0 (cparam);
	}
	_tmp201_ = d;
	_tmp202_ = vala_code_node_get_error_types ((ValaCodeNode*) _tmp201_);
	_tmp203_ = _tmp202_;
	_tmp204_ = vala_collection_get_size ((ValaCollection*) _tmp203_);
	_tmp205_ = _tmp204_;
	_tmp206_ = _tmp205_ > 0;
	_vala_iterable_unref0 (_tmp203_);
	if (_tmp206_) {
		ValaCCodeParameter* cparam = NULL;
		ValaCCodeParameter* _tmp207_;
		ValaCCodeFunctionDeclarator* _tmp208_;
		ValaCCodeParameter* _tmp209_;
		_tmp207_ = vala_ccode_parameter_new ("error", "GError**");
		cparam = _tmp207_;
		_tmp208_ = cfundecl;
		_tmp209_ = cparam;
		vala_ccode_function_declarator_add_parameter (_tmp208_, _tmp209_);
		_vala_ccode_node_unref0 (cparam);
	}
	_tmp210_ = return_type_cname;
	_tmp211_ = cfundecl;
	_tmp212_ = vala_ccode_type_definition_new (_tmp210_, (ValaCCodeDeclarator*) _tmp211_);
	ctypedef = _tmp212_;
	_tmp214_ = d;
	_tmp215_ = vala_symbol_get_version ((ValaSymbol*) _tmp214_);
	_tmp216_ = _tmp215_;
	_tmp217_ = vala_version_attribute_get_deprecated (_tmp216_);
	_tmp218_ = _tmp217_;
	if (_tmp218_) {
		_tmp213_ = VALA_CCODE_MODIFIERS_DEPRECATED;
	} else {
		_tmp213_ = 0;
	}
	_tmp219_ = ctypedef;
	_tmp220_ = ctypedef;
	_tmp221_ = vala_ccode_node_get_modifiers ((ValaCCodeNode*) _tmp220_);
	_tmp222_ = _tmp221_;
	vala_ccode_node_set_modifiers ((ValaCCodeNode*) _tmp220_, _tmp222_ | _tmp213_);
	_tmp223_ = decl_space;
	_tmp224_ = ctypedef;
	vala_ccode_file_add_type_definition (_tmp223_, (ValaCCodeNode*) _tmp224_);
	_vala_ccode_node_unref0 (ctypedef);
	_vala_ccode_node_unref0 (cfundecl);
	_g_free0 (return_type_cname);
}


static void vala_ccode_delegate_module_real_visit_delegate (ValaCodeVisitor* base, ValaDelegate* d) {
	ValaCCodeDelegateModule * self;
	ValaDelegate* _tmp0_;
	ValaDelegate* _tmp1_;
	ValaCCodeFile* _tmp2_;
	ValaDelegate* _tmp3_;
	gboolean _tmp4_;
	ValaDelegate* _tmp7_;
	gboolean _tmp8_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_if_fail (d != NULL);
	_tmp0_ = d;
	vala_code_node_accept_children ((ValaCodeNode*) _tmp0_, (ValaCodeVisitor*) self);
	_tmp1_ = d;
	_tmp2_ = ((ValaCCodeBaseModule*) self)->cfile;
	vala_ccode_base_module_generate_delegate_declaration ((ValaCCodeBaseModule*) self, _tmp1_, _tmp2_);
	_tmp3_ = d;
	_tmp4_ = vala_symbol_is_internal_symbol ((ValaSymbol*) _tmp3_);
	if (!_tmp4_) {
		ValaDelegate* _tmp5_;
		ValaCCodeFile* _tmp6_;
		_tmp5_ = d;
		_tmp6_ = ((ValaCCodeBaseModule*) self)->header_file;
		vala_ccode_base_module_generate_delegate_declaration ((ValaCCodeBaseModule*) self, _tmp5_, _tmp6_);
	}
	_tmp7_ = d;
	_tmp8_ = vala_symbol_is_private_symbol ((ValaSymbol*) _tmp7_);
	if (!_tmp8_) {
		ValaDelegate* _tmp9_;
		ValaCCodeFile* _tmp10_;
		_tmp9_ = d;
		_tmp10_ = ((ValaCCodeBaseModule*) self)->internal_header_file;
		vala_ccode_base_module_generate_delegate_declaration ((ValaCCodeBaseModule*) self, _tmp9_, _tmp10_);
	}
}


static gchar* vala_ccode_delegate_module_real_get_delegate_target_cname (ValaCCodeBaseModule* base, const gchar* delegate_cname) {
	ValaCCodeDelegateModule * self;
	gchar* result = NULL;
	const gchar* _tmp0_;
	gchar* _tmp1_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (delegate_cname != NULL, NULL);
	_tmp0_ = delegate_cname;
	_tmp1_ = g_strdup_printf ("%s_target", _tmp0_);
	result = _tmp1_;
	return result;
}


static ValaCCodeExpression* vala_ccode_delegate_module_real_get_delegate_target_cexpression (ValaCCodeBaseModule* base, ValaExpression* delegate_expr, ValaCCodeExpression* * delegate_target_destroy_notify) {
	ValaCCodeDelegateModule * self;
	ValaCCodeExpression* _vala_delegate_target_destroy_notify = NULL;
	ValaCCodeExpression* result = NULL;
	ValaExpression* _tmp0_;
	ValaTargetValue* _tmp1_;
	ValaTargetValue* _tmp2_;
	ValaCCodeExpression* _tmp3_;
	ValaExpression* _tmp4_;
	ValaTargetValue* _tmp5_;
	ValaTargetValue* _tmp6_;
	ValaCCodeExpression* _tmp7_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (delegate_expr != NULL, NULL);
	_tmp0_ = delegate_expr;
	_tmp1_ = vala_expression_get_target_value (_tmp0_);
	_tmp2_ = _tmp1_;
	_tmp3_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cvalue ((ValaCCodeBaseModule*) self, _tmp2_);
	_vala_ccode_node_unref0 (_vala_delegate_target_destroy_notify);
	_vala_delegate_target_destroy_notify = _tmp3_;
	_tmp4_ = delegate_expr;
	_tmp5_ = vala_expression_get_target_value (_tmp4_);
	_tmp6_ = _tmp5_;
	_tmp7_ = vala_ccode_base_module_get_delegate_target_cvalue ((ValaCCodeBaseModule*) self, _tmp6_);
	result = _tmp7_;
	if (delegate_target_destroy_notify) {
		*delegate_target_destroy_notify = _vala_delegate_target_destroy_notify;
	} else {
		_vala_ccode_node_unref0 (_vala_delegate_target_destroy_notify);
	}
	return result;
}


static gpointer _vala_ccode_node_ref0 (gpointer self) {
	return self ? vala_ccode_node_ref (self) : NULL;
}


static ValaCCodeExpression* vala_ccode_delegate_module_real_get_delegate_target_cvalue (ValaCCodeBaseModule* base, ValaTargetValue* value) {
	ValaCCodeDelegateModule * self;
	ValaCCodeExpression* result = NULL;
	ValaTargetValue* _tmp0_;
	ValaCCodeExpression* _tmp1_;
	ValaCCodeExpression* _tmp2_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (value != NULL, NULL);
	_tmp0_ = value;
	_tmp1_ = G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, VALA_TYPE_GLIB_VALUE, ValaGLibValue)->delegate_target_cvalue;
	_tmp2_ = _vala_ccode_node_ref0 (_tmp1_);
	result = _tmp2_;
	return result;
}


static ValaCCodeExpression* vala_ccode_delegate_module_real_get_delegate_target_destroy_notify_cvalue (ValaCCodeBaseModule* base, ValaTargetValue* value) {
	ValaCCodeDelegateModule * self;
	ValaCCodeExpression* result = NULL;
	ValaTargetValue* _tmp0_;
	ValaCCodeExpression* _tmp1_;
	ValaCCodeExpression* _tmp2_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (value != NULL, NULL);
	_tmp0_ = value;
	_tmp1_ = G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, VALA_TYPE_GLIB_VALUE, ValaGLibValue)->delegate_target_destroy_notify_cvalue;
	_tmp2_ = _vala_ccode_node_ref0 (_tmp1_);
	result = _tmp2_;
	return result;
}


static gchar* vala_ccode_delegate_module_real_get_delegate_target_destroy_notify_cname (ValaCCodeBaseModule* base, const gchar* delegate_cname) {
	ValaCCodeDelegateModule * self;
	gchar* result = NULL;
	const gchar* _tmp0_;
	gchar* _tmp1_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (delegate_cname != NULL, NULL);
	_tmp0_ = delegate_cname;
	_tmp1_ = g_strdup_printf ("%s_target_destroy_notify", _tmp0_);
	result = _tmp1_;
	return result;
}


static ValaCCodeExpression* vala_ccode_delegate_module_real_get_implicit_cast_expression (ValaCCodeBaseModule* base, ValaCCodeExpression* source_cexpr, ValaDataType* expression_type, ValaDataType* target_type, ValaCodeNode* node) {
	ValaCCodeDelegateModule * self;
	ValaCCodeExpression* result = NULL;
	gboolean _tmp0_ = FALSE;
	ValaDataType* _tmp1_;
	ValaCCodeExpression* _tmp32_;
	ValaDataType* _tmp33_;
	ValaDataType* _tmp34_;
	ValaCodeNode* _tmp35_;
	ValaCCodeExpression* _tmp36_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (source_cexpr != NULL, NULL);
	_tmp1_ = target_type;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, VALA_TYPE_DELEGATE_TYPE)) {
		ValaDataType* _tmp2_;
		_tmp2_ = expression_type;
		_tmp0_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, VALA_TYPE_METHOD_TYPE);
	} else {
		_tmp0_ = FALSE;
	}
	if (_tmp0_) {
		ValaDelegateType* dt = NULL;
		ValaDataType* _tmp3_;
		ValaDelegateType* _tmp4_;
		ValaMethodType* mt = NULL;
		ValaDataType* _tmp5_;
		ValaMethodType* _tmp6_;
		ValaMethod* method = NULL;
		ValaMethodType* _tmp7_;
		ValaMethod* _tmp8_;
		ValaMethod* _tmp9_;
		ValaMethod* _tmp10_;
		ValaMethod* _tmp11_;
		ValaMethod* _tmp12_;
		ValaMethod* _tmp13_;
		ValaMethod* _tmp25_;
		ValaDelegateType* _tmp26_;
		ValaCodeNode* _tmp27_;
		gchar* _tmp28_;
		gchar* _tmp29_;
		ValaCCodeIdentifier* _tmp30_;
		ValaCCodeExpression* _tmp31_;
		_tmp3_ = target_type;
		_tmp4_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp3_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
		dt = _tmp4_;
		_tmp5_ = expression_type;
		_tmp6_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp5_, VALA_TYPE_METHOD_TYPE, ValaMethodType));
		mt = _tmp6_;
		_tmp7_ = mt;
		_tmp8_ = vala_method_type_get_method_symbol (_tmp7_);
		_tmp9_ = _tmp8_;
		_tmp10_ = _vala_code_node_ref0 (_tmp9_);
		method = _tmp10_;
		_tmp11_ = method;
		_tmp12_ = vala_method_get_base_method (_tmp11_);
		_tmp13_ = _tmp12_;
		if (_tmp13_ != NULL) {
			ValaMethod* _tmp14_;
			ValaMethod* _tmp15_;
			ValaMethod* _tmp16_;
			ValaMethod* _tmp17_;
			_tmp14_ = method;
			_tmp15_ = vala_method_get_base_method (_tmp14_);
			_tmp16_ = _tmp15_;
			_tmp17_ = _vala_code_node_ref0 (_tmp16_);
			_vala_code_node_unref0 (method);
			method = _tmp17_;
		} else {
			ValaMethod* _tmp18_;
			ValaMethod* _tmp19_;
			ValaMethod* _tmp20_;
			_tmp18_ = method;
			_tmp19_ = vala_method_get_base_interface_method (_tmp18_);
			_tmp20_ = _tmp19_;
			if (_tmp20_ != NULL) {
				ValaMethod* _tmp21_;
				ValaMethod* _tmp22_;
				ValaMethod* _tmp23_;
				ValaMethod* _tmp24_;
				_tmp21_ = method;
				_tmp22_ = vala_method_get_base_interface_method (_tmp21_);
				_tmp23_ = _tmp22_;
				_tmp24_ = _vala_code_node_ref0 (_tmp23_);
				_vala_code_node_unref0 (method);
				method = _tmp24_;
			}
		}
		_tmp25_ = method;
		_tmp26_ = dt;
		_tmp27_ = node;
		_tmp28_ = vala_ccode_delegate_module_generate_delegate_wrapper (self, _tmp25_, _tmp26_, _tmp27_);
		_tmp29_ = _tmp28_;
		_tmp30_ = vala_ccode_identifier_new (_tmp29_);
		_tmp31_ = (ValaCCodeExpression*) _tmp30_;
		_g_free0 (_tmp29_);
		result = _tmp31_;
		_vala_code_node_unref0 (method);
		_vala_code_node_unref0 (mt);
		_vala_code_node_unref0 (dt);
		return result;
	}
	_tmp32_ = source_cexpr;
	_tmp33_ = expression_type;
	_tmp34_ = target_type;
	_tmp35_ = node;
	_tmp36_ = VALA_CCODE_BASE_MODULE_CLASS (vala_ccode_delegate_module_parent_class)->get_implicit_cast_expression ((ValaCCodeBaseModule*) G_TYPE_CHECK_INSTANCE_CAST (self, VALA_TYPE_CCODE_ARRAY_MODULE, ValaCCodeArrayModule), _tmp32_, _tmp33_, _tmp34_, _tmp35_);
	result = _tmp36_;
	return result;
}


static gpointer _vala_iterable_ref0 (gpointer self) {
	return self ? vala_iterable_ref (self) : NULL;
}


gchar* vala_ccode_delegate_module_generate_delegate_wrapper (ValaCCodeDelegateModule* self, ValaMethod* m, ValaDelegateType* dt, ValaCodeNode* node) {
	gchar* result = NULL;
	ValaDelegate* d = NULL;
	ValaDelegateType* _tmp0_;
	ValaDelegate* _tmp1_;
	ValaDelegate* _tmp2_;
	ValaDelegate* _tmp3_;
	gchar* delegate_name = NULL;
	ValaSignal* sig = NULL;
	ValaDelegate* _tmp4_;
	ValaSymbol* _tmp5_;
	ValaSymbol* _tmp6_;
	ValaSignal* _tmp7_;
	ValaDynamicSignal* dynamic_sig = NULL;
	ValaSignal* _tmp8_;
	ValaDynamicSignal* _tmp9_;
	ValaDynamicSignal* _tmp10_;
	gchar* wrapper_name = NULL;
	ValaMethod* _tmp27_;
	gchar* _tmp28_;
	gchar* _tmp29_;
	const gchar* _tmp30_;
	gchar* _tmp31_;
	gchar* _tmp32_;
	const gchar* _tmp33_;
	gboolean _tmp34_;
	gchar* return_type_cname = NULL;
	ValaDelegate* _tmp35_;
	ValaDataType* _tmp36_;
	ValaDataType* _tmp37_;
	gchar* _tmp38_;
	ValaDelegate* _tmp39_;
	ValaDataType* _tmp40_;
	ValaDataType* _tmp41_;
	gboolean _tmp42_;
	ValaCCodeFunction* function = NULL;
	const gchar* _tmp44_;
	const gchar* _tmp45_;
	ValaCCodeFunction* _tmp46_;
	ValaCCodeFunction* _tmp47_;
	ValaCCodeFunction* _tmp48_;
	ValaHashMap* cparam_map = NULL;
	GHashFunc _tmp49_;
	GEqualFunc _tmp50_;
	GEqualFunc _tmp51_;
	ValaHashMap* _tmp52_;
	ValaDelegate* _tmp53_;
	gboolean _tmp54_;
	gboolean _tmp55_;
	ValaDelegate* _tmp62_;
	ValaDataType* _tmp63_;
	ValaDataType* _tmp64_;
	ValaList* d_params = NULL;
	ValaDelegate* _tmp74_;
	ValaList* _tmp75_;
	gboolean _tmp110_ = FALSE;
	ValaDelegate* _tmp111_;
	gboolean _tmp112_;
	ValaMethod* _tmp196_;
	ValaList* _tmp197_;
	ValaList* _tmp198_;
	gint _tmp199_;
	gint _tmp200_;
	gboolean _tmp201_;
	gint last_pos = 0;
	gint min_pos = 0;
	ValaHashMap* carg_map = NULL;
	GHashFunc _tmp230_;
	GEqualFunc _tmp231_;
	GEqualFunc _tmp232_;
	ValaHashMap* _tmp233_;
	gint i = 0;
	gboolean _tmp234_ = FALSE;
	ValaMethod* _tmp235_;
	ValaMemberBinding _tmp236_;
	ValaMemberBinding _tmp237_;
	gboolean first = FALSE;
	gboolean _tmp445_ = FALSE;
	ValaMethod* _tmp446_;
	gboolean _tmp447_;
	ValaMethod* _tmp514_;
	ValaList* _tmp515_;
	ValaList* _tmp516_;
	gint _tmp517_;
	gint _tmp518_;
	gboolean _tmp519_;
	ValaCCodeFunctionCall* ccall = NULL;
	ValaMethod* _tmp524_;
	gchar* _tmp525_;
	gchar* _tmp526_;
	ValaCCodeIdentifier* _tmp527_;
	ValaCCodeIdentifier* _tmp528_;
	ValaCCodeFunctionCall* _tmp529_;
	ValaCCodeFunctionCall* _tmp530_;
	ValaMethod* _tmp555_;
	gboolean _tmp556_;
	gboolean _tmp557_;
	gboolean _tmp564_ = FALSE;
	ValaMethod* _tmp565_;
	ValaDataType* _tmp566_;
	ValaDataType* _tmp567_;
	gboolean _tmp609_ = FALSE;
	ValaDelegate* _tmp610_;
	gboolean _tmp611_;
	gboolean _tmp612_;
	gboolean _tmp661_ = FALSE;
	gboolean _tmp662_ = FALSE;
	ValaMethod* _tmp663_;
	ValaDataType* _tmp664_;
	ValaDataType* _tmp665_;
	ValaCCodeFile* _tmp682_;
	ValaCCodeFunction* _tmp683_;
	ValaCCodeFile* _tmp684_;
	ValaCCodeFunction* _tmp685_;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (m != NULL, NULL);
	g_return_val_if_fail (dt != NULL, NULL);
	_tmp0_ = dt;
	_tmp1_ = vala_delegate_type_get_delegate_symbol (_tmp0_);
	_tmp2_ = _tmp1_;
	_tmp3_ = _vala_code_node_ref0 (_tmp2_);
	d = _tmp3_;
	_tmp4_ = d;
	_tmp5_ = vala_symbol_get_parent_symbol ((ValaSymbol*) _tmp4_);
	_tmp6_ = _tmp5_;
	_tmp7_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp6_, VALA_TYPE_SIGNAL) ? ((ValaSignal*) _tmp6_) : NULL);
	sig = _tmp7_;
	_tmp8_ = sig;
	_tmp9_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp8_, VALA_TYPE_DYNAMIC_SIGNAL) ? ((ValaDynamicSignal*) _tmp8_) : NULL);
	dynamic_sig = _tmp9_;
	_tmp10_ = dynamic_sig;
	if (_tmp10_ != NULL) {
		ValaDynamicSignal* _tmp11_;
		gchar* _tmp12_;
		_tmp11_ = dynamic_sig;
		_tmp12_ = vala_ccode_base_module_get_dynamic_signal_cname ((ValaCCodeBaseModule*) self, _tmp11_);
		_g_free0 (delegate_name);
		delegate_name = _tmp12_;
	} else {
		ValaSignal* _tmp13_;
		_tmp13_ = sig;
		if (_tmp13_ != NULL) {
			ValaSignal* _tmp14_;
			ValaSymbol* _tmp15_;
			ValaSymbol* _tmp16_;
			gchar* _tmp17_;
			gchar* _tmp18_;
			ValaSignal* _tmp19_;
			gchar* _tmp20_;
			gchar* _tmp21_;
			gchar* _tmp22_;
			_tmp14_ = sig;
			_tmp15_ = vala_symbol_get_parent_symbol ((ValaSymbol*) _tmp14_);
			_tmp16_ = _tmp15_;
			_tmp17_ = vala_get_ccode_lower_case_prefix (_tmp16_);
			_tmp18_ = _tmp17_;
			_tmp19_ = sig;
			_tmp20_ = vala_get_ccode_lower_case_name ((ValaCodeNode*) _tmp19_, NULL);
			_tmp21_ = _tmp20_;
			_tmp22_ = g_strconcat (_tmp18_, _tmp21_, NULL);
			_g_free0 (delegate_name);
			delegate_name = _tmp22_;
			_g_free0 (_tmp21_);
			_g_free0 (_tmp18_);
		} else {
			ValaDelegate* _tmp23_;
			gchar* _tmp24_;
			gchar* _tmp25_;
			gchar* _tmp26_;
			_tmp23_ = d;
			_tmp24_ = vala_get_ccode_name ((ValaCodeNode*) _tmp23_);
			_tmp25_ = _tmp24_;
			_tmp26_ = vala_symbol_camel_case_to_lower_case (_tmp25_);
			_g_free0 (delegate_name);
			delegate_name = _tmp26_;
			_g_free0 (_tmp25_);
		}
	}
	_tmp27_ = m;
	_tmp28_ = vala_get_ccode_name ((ValaCodeNode*) _tmp27_);
	_tmp29_ = _tmp28_;
	_tmp30_ = delegate_name;
	_tmp31_ = g_strdup_printf ("_%s_%s", _tmp29_, _tmp30_);
	_tmp32_ = _tmp31_;
	_g_free0 (_tmp29_);
	wrapper_name = _tmp32_;
	_tmp33_ = wrapper_name;
	_tmp34_ = vala_ccode_base_module_add_wrapper ((ValaCCodeBaseModule*) self, _tmp33_);
	if (!_tmp34_) {
		result = wrapper_name;
		_vala_code_node_unref0 (dynamic_sig);
		_vala_code_node_unref0 (sig);
		_g_free0 (delegate_name);
		_vala_code_node_unref0 (d);
		return result;
	}
	_tmp35_ = d;
	_tmp36_ = vala_callable_get_return_type ((ValaCallable*) _tmp35_);
	_tmp37_ = _tmp36_;
	_tmp38_ = vala_get_ccode_name ((ValaCodeNode*) _tmp37_);
	return_type_cname = _tmp38_;
	_tmp39_ = d;
	_tmp40_ = vala_callable_get_return_type ((ValaCallable*) _tmp39_);
	_tmp41_ = _tmp40_;
	_tmp42_ = vala_data_type_is_real_non_null_struct_type (_tmp41_);
	if (_tmp42_) {
		gchar* _tmp43_;
		_tmp43_ = g_strdup ("void");
		_g_free0 (return_type_cname);
		return_type_cname = _tmp43_;
	}
	_tmp44_ = wrapper_name;
	_tmp45_ = return_type_cname;
	_tmp46_ = vala_ccode_function_new (_tmp44_, _tmp45_);
	function = _tmp46_;
	_tmp47_ = function;
	vala_ccode_node_set_modifiers ((ValaCCodeNode*) _tmp47_, VALA_CCODE_MODIFIERS_STATIC);
	_tmp48_ = function;
	vala_ccode_base_module_push_function ((ValaCCodeBaseModule*) self, _tmp48_);
	_tmp49_ = g_direct_hash;
	_tmp50_ = g_direct_equal;
	_tmp51_ = g_direct_equal;
	_tmp52_ = vala_hash_map_new (G_TYPE_INT, NULL, NULL, VALA_TYPE_CCODE_PARAMETER, (GBoxedCopyFunc) vala_ccode_node_ref, (GDestroyNotify) vala_ccode_node_unref, _tmp49_, _tmp50_, _tmp51_);
	cparam_map = _tmp52_;
	_tmp53_ = d;
	_tmp54_ = vala_delegate_get_has_target (_tmp53_);
	_tmp55_ = _tmp54_;
	if (_tmp55_) {
		ValaCCodeParameter* cparam = NULL;
		ValaCCodeParameter* _tmp56_;
		ValaHashMap* _tmp57_;
		ValaDelegate* _tmp58_;
		gdouble _tmp59_;
		gint _tmp60_;
		ValaCCodeParameter* _tmp61_;
		_tmp56_ = vala_ccode_parameter_new ("self", "gpointer");
		cparam = _tmp56_;
		_tmp57_ = cparam_map;
		_tmp58_ = d;
		_tmp59_ = vala_get_ccode_instance_pos ((ValaCodeNode*) _tmp58_);
		_tmp60_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp59_, FALSE);
		_tmp61_ = cparam;
		vala_map_set ((ValaMap*) _tmp57_, (gpointer) ((gintptr) _tmp60_), _tmp61_);
		_vala_ccode_node_unref0 (cparam);
	}
	_tmp62_ = d;
	_tmp63_ = vala_delegate_get_sender_type (_tmp62_);
	_tmp64_ = _tmp63_;
	if (_tmp64_ != NULL) {
		ValaParameter* param = NULL;
		ValaDelegate* _tmp65_;
		ValaDataType* _tmp66_;
		ValaDataType* _tmp67_;
		ValaParameter* _tmp68_;
		ValaParameter* _tmp69_;
		ValaCCodeFile* _tmp70_;
		ValaHashMap* _tmp71_;
		ValaCCodeParameter* _tmp72_;
		ValaCCodeParameter* _tmp73_;
		_tmp65_ = d;
		_tmp66_ = vala_delegate_get_sender_type (_tmp65_);
		_tmp67_ = _tmp66_;
		_tmp68_ = vala_parameter_new ("_sender", _tmp67_, NULL);
		param = _tmp68_;
		_tmp69_ = param;
		_tmp70_ = ((ValaCCodeBaseModule*) self)->cfile;
		_tmp71_ = cparam_map;
		_tmp72_ = vala_ccode_method_module_generate_parameter ((ValaCCodeMethodModule*) self, _tmp69_, _tmp70_, (ValaMap*) _tmp71_, NULL);
		_tmp73_ = _tmp72_;
		_vala_ccode_node_unref0 (_tmp73_);
		_vala_code_node_unref0 (param);
	}
	_tmp74_ = d;
	_tmp75_ = vala_callable_get_parameters ((ValaCallable*) _tmp74_);
	d_params = _tmp75_;
	{
		ValaList* _param_list = NULL;
		ValaList* _tmp76_;
		ValaList* _tmp77_;
		gint _param_size = 0;
		ValaList* _tmp78_;
		gint _tmp79_;
		gint _tmp80_;
		gint _param_index = 0;
		_tmp76_ = d_params;
		_tmp77_ = _vala_iterable_ref0 (_tmp76_);
		_param_list = _tmp77_;
		_tmp78_ = _param_list;
		_tmp79_ = vala_collection_get_size ((ValaCollection*) _tmp78_);
		_tmp80_ = _tmp79_;
		_param_size = _tmp80_;
		_param_index = -1;
		while (TRUE) {
			gint _tmp81_;
			gint _tmp82_;
			gint _tmp83_;
			ValaParameter* param = NULL;
			ValaList* _tmp84_;
			gint _tmp85_;
			gpointer _tmp86_;
			gboolean _tmp87_ = FALSE;
			gboolean _tmp88_ = FALSE;
			ValaDynamicSignal* _tmp89_;
			ValaParameter* _tmp105_;
			ValaCCodeFile* _tmp106_;
			ValaHashMap* _tmp107_;
			ValaCCodeParameter* _tmp108_;
			ValaCCodeParameter* _tmp109_;
			_tmp81_ = _param_index;
			_param_index = _tmp81_ + 1;
			_tmp82_ = _param_index;
			_tmp83_ = _param_size;
			if (!(_tmp82_ < _tmp83_)) {
				break;
			}
			_tmp84_ = _param_list;
			_tmp85_ = _param_index;
			_tmp86_ = vala_list_get (_tmp84_, _tmp85_);
			param = (ValaParameter*) _tmp86_;
			_tmp89_ = dynamic_sig;
			if (_tmp89_ != NULL) {
				ValaParameter* _tmp90_;
				ValaDataType* _tmp91_;
				ValaDataType* _tmp92_;
				_tmp90_ = param;
				_tmp91_ = vala_variable_get_variable_type ((ValaVariable*) _tmp90_);
				_tmp92_ = _tmp91_;
				_tmp88_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp92_, VALA_TYPE_ARRAY_TYPE);
			} else {
				_tmp88_ = FALSE;
			}
			if (_tmp88_) {
				ValaParameter* _tmp93_;
				ValaDataType* _tmp94_;
				ValaDataType* _tmp95_;
				ValaDataType* _tmp96_;
				ValaDataType* _tmp97_;
				ValaTypeSymbol* _tmp98_;
				ValaTypeSymbol* _tmp99_;
				ValaDataType* _tmp100_;
				ValaTypeSymbol* _tmp101_;
				ValaTypeSymbol* _tmp102_;
				_tmp93_ = param;
				_tmp94_ = vala_variable_get_variable_type ((ValaVariable*) _tmp93_);
				_tmp95_ = _tmp94_;
				_tmp96_ = vala_array_type_get_element_type (G_TYPE_CHECK_INSTANCE_CAST (_tmp95_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
				_tmp97_ = _tmp96_;
				_tmp98_ = vala_data_type_get_data_type (_tmp97_);
				_tmp99_ = _tmp98_;
				_tmp100_ = ((ValaCCodeBaseModule*) self)->string_type;
				_tmp101_ = vala_data_type_get_data_type (_tmp100_);
				_tmp102_ = _tmp101_;
				_tmp87_ = _tmp99_ == _tmp102_;
			} else {
				_tmp87_ = FALSE;
			}
			if (_tmp87_) {
				ValaParameter* _tmp103_;
				ValaParameter* _tmp104_;
				_tmp103_ = param;
				vala_code_node_set_attribute_bool ((ValaCodeNode*) _tmp103_, "CCode", "array_length", FALSE, NULL);
				_tmp104_ = param;
				vala_code_node_set_attribute_bool ((ValaCodeNode*) _tmp104_, "CCode", "array_null_terminated", TRUE, NULL);
			}
			_tmp105_ = param;
			_tmp106_ = ((ValaCCodeBaseModule*) self)->cfile;
			_tmp107_ = cparam_map;
			_tmp108_ = vala_ccode_method_module_generate_parameter ((ValaCCodeMethodModule*) self, _tmp105_, _tmp106_, (ValaMap*) _tmp107_, NULL);
			_tmp109_ = _tmp108_;
			_vala_ccode_node_unref0 (_tmp109_);
			_vala_code_node_unref0 (param);
		}
		_vala_iterable_unref0 (_param_list);
	}
	_tmp111_ = d;
	_tmp112_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp111_);
	if (_tmp112_) {
		ValaDelegate* _tmp113_;
		ValaDataType* _tmp114_;
		ValaDataType* _tmp115_;
		_tmp113_ = d;
		_tmp114_ = vala_callable_get_return_type ((ValaCallable*) _tmp113_);
		_tmp115_ = _tmp114_;
		_tmp110_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp115_, VALA_TYPE_ARRAY_TYPE);
	} else {
		_tmp110_ = FALSE;
	}
	if (_tmp110_) {
		ValaArrayType* array_type = NULL;
		ValaDelegate* _tmp116_;
		ValaDataType* _tmp117_;
		ValaDataType* _tmp118_;
		ValaArrayType* _tmp119_;
		gchar* _tmp120_ = NULL;
		ValaDelegate* _tmp121_;
		gchar* _tmp122_;
		gchar* _tmp123_;
		gboolean _tmp124_;
		gchar* array_length_type = NULL;
		gchar* _tmp128_;
		const gchar* _tmp129_;
		gchar* _tmp130_;
		_tmp116_ = d;
		_tmp117_ = vala_callable_get_return_type ((ValaCallable*) _tmp116_);
		_tmp118_ = _tmp117_;
		_tmp119_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp118_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
		array_type = _tmp119_;
		_tmp121_ = d;
		_tmp122_ = vala_get_ccode_array_length_type ((ValaCodeNode*) _tmp121_);
		_tmp123_ = _tmp122_;
		_tmp124_ = _tmp123_ != NULL;
		_g_free0 (_tmp123_);
		if (_tmp124_) {
			ValaDelegate* _tmp125_;
			gchar* _tmp126_;
			_tmp125_ = d;
			_tmp126_ = vala_get_ccode_array_length_type ((ValaCodeNode*) _tmp125_);
			_g_free0 (_tmp120_);
			_tmp120_ = _tmp126_;
		} else {
			gchar* _tmp127_;
			_tmp127_ = g_strdup ("int");
			_g_free0 (_tmp120_);
			_tmp120_ = _tmp127_;
		}
		_tmp128_ = g_strdup (_tmp120_);
		array_length_type = _tmp128_;
		_tmp129_ = array_length_type;
		_tmp130_ = g_strconcat (_tmp129_, "*", NULL);
		_g_free0 (array_length_type);
		array_length_type = _tmp130_;
		{
			gint dim = 0;
			dim = 1;
			{
				gboolean _tmp131_ = FALSE;
				_tmp131_ = TRUE;
				while (TRUE) {
					gint _tmp133_;
					ValaArrayType* _tmp134_;
					gint _tmp135_;
					gint _tmp136_;
					ValaCCodeParameter* cparam = NULL;
					gint _tmp137_;
					gchar* _tmp138_;
					gchar* _tmp139_;
					const gchar* _tmp140_;
					ValaCCodeParameter* _tmp141_;
					ValaCCodeParameter* _tmp142_;
					ValaHashMap* _tmp143_;
					ValaDelegate* _tmp144_;
					gdouble _tmp145_;
					gint _tmp146_;
					gint _tmp147_;
					ValaCCodeParameter* _tmp148_;
					if (!_tmp131_) {
						gint _tmp132_;
						_tmp132_ = dim;
						dim = _tmp132_ + 1;
					}
					_tmp131_ = FALSE;
					_tmp133_ = dim;
					_tmp134_ = array_type;
					_tmp135_ = vala_array_type_get_rank (_tmp134_);
					_tmp136_ = _tmp135_;
					if (!(_tmp133_ <= _tmp136_)) {
						break;
					}
					_tmp137_ = dim;
					_tmp138_ = vala_ccode_base_module_get_array_length_cname ((ValaCCodeBaseModule*) self, "result", _tmp137_);
					_tmp139_ = _tmp138_;
					_tmp140_ = array_length_type;
					_tmp141_ = vala_ccode_parameter_new (_tmp139_, _tmp140_);
					_tmp142_ = _tmp141_;
					_g_free0 (_tmp139_);
					cparam = _tmp142_;
					_tmp143_ = cparam_map;
					_tmp144_ = d;
					_tmp145_ = vala_get_ccode_array_length_pos ((ValaCodeNode*) _tmp144_);
					_tmp146_ = dim;
					_tmp147_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp145_ + (0.01 * _tmp146_), FALSE);
					_tmp148_ = cparam;
					vala_map_set ((ValaMap*) _tmp143_, (gpointer) ((gintptr) _tmp147_), _tmp148_);
					_vala_ccode_node_unref0 (cparam);
				}
			}
		}
		_g_free0 (array_length_type);
		_g_free0 (_tmp120_);
		_vala_code_node_unref0 (array_type);
	} else {
		ValaDelegate* _tmp149_;
		ValaDataType* _tmp150_;
		ValaDataType* _tmp151_;
		_tmp149_ = d;
		_tmp150_ = vala_callable_get_return_type ((ValaCallable*) _tmp149_);
		_tmp151_ = _tmp150_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp151_, VALA_TYPE_DELEGATE_TYPE)) {
			ValaDelegateType* deleg_type = NULL;
			ValaDelegate* _tmp152_;
			ValaDataType* _tmp153_;
			ValaDataType* _tmp154_;
			ValaDelegateType* _tmp155_;
			ValaDelegateType* _tmp156_;
			ValaDelegate* _tmp157_;
			ValaDelegate* _tmp158_;
			gboolean _tmp159_;
			gboolean _tmp160_;
			_tmp152_ = d;
			_tmp153_ = vala_callable_get_return_type ((ValaCallable*) _tmp152_);
			_tmp154_ = _tmp153_;
			_tmp155_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp154_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
			deleg_type = _tmp155_;
			_tmp156_ = deleg_type;
			_tmp157_ = vala_delegate_type_get_delegate_symbol (_tmp156_);
			_tmp158_ = _tmp157_;
			_tmp159_ = vala_delegate_get_has_target (_tmp158_);
			_tmp160_ = _tmp159_;
			if (_tmp160_) {
				ValaCCodeParameter* cparam = NULL;
				gchar* _tmp161_;
				gchar* _tmp162_;
				ValaCCodeParameter* _tmp163_;
				ValaCCodeParameter* _tmp164_;
				ValaHashMap* _tmp165_;
				ValaDelegate* _tmp166_;
				gdouble _tmp167_;
				gint _tmp168_;
				ValaCCodeParameter* _tmp169_;
				ValaDelegateType* _tmp170_;
				gboolean _tmp171_;
				_tmp161_ = vala_ccode_base_module_get_delegate_target_cname ((ValaCCodeBaseModule*) self, "result");
				_tmp162_ = _tmp161_;
				_tmp163_ = vala_ccode_parameter_new (_tmp162_, "void**");
				_tmp164_ = _tmp163_;
				_g_free0 (_tmp162_);
				cparam = _tmp164_;
				_tmp165_ = cparam_map;
				_tmp166_ = d;
				_tmp167_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp166_);
				_tmp168_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp167_, FALSE);
				_tmp169_ = cparam;
				vala_map_set ((ValaMap*) _tmp165_, (gpointer) ((gintptr) _tmp168_), _tmp169_);
				_tmp170_ = deleg_type;
				_tmp171_ = vala_data_type_is_disposable ((ValaDataType*) _tmp170_);
				if (_tmp171_) {
					gchar* _tmp172_;
					gchar* _tmp173_;
					ValaCCodeParameter* _tmp174_;
					ValaHashMap* _tmp175_;
					ValaDelegate* _tmp176_;
					gdouble _tmp177_;
					gint _tmp178_;
					ValaCCodeParameter* _tmp179_;
					_tmp172_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cname ((ValaCCodeBaseModule*) self, "result");
					_tmp173_ = _tmp172_;
					_tmp174_ = vala_ccode_parameter_new (_tmp173_, "GDestroyNotify*");
					_vala_ccode_node_unref0 (cparam);
					cparam = _tmp174_;
					_g_free0 (_tmp173_);
					_tmp175_ = cparam_map;
					_tmp176_ = d;
					_tmp177_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp176_);
					_tmp178_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp177_ + 0.01, FALSE);
					_tmp179_ = cparam;
					vala_map_set ((ValaMap*) _tmp175_, (gpointer) ((gintptr) _tmp178_), _tmp179_);
				}
				_vala_ccode_node_unref0 (cparam);
			}
			_vala_code_node_unref0 (deleg_type);
		} else {
			ValaDelegate* _tmp180_;
			ValaDataType* _tmp181_;
			ValaDataType* _tmp182_;
			gboolean _tmp183_;
			_tmp180_ = d;
			_tmp181_ = vala_callable_get_return_type ((ValaCallable*) _tmp180_);
			_tmp182_ = _tmp181_;
			_tmp183_ = vala_data_type_is_real_non_null_struct_type (_tmp182_);
			if (_tmp183_) {
				ValaCCodeParameter* cparam = NULL;
				ValaDelegate* _tmp184_;
				ValaDataType* _tmp185_;
				ValaDataType* _tmp186_;
				gchar* _tmp187_;
				gchar* _tmp188_;
				gchar* _tmp189_;
				gchar* _tmp190_;
				ValaCCodeParameter* _tmp191_;
				ValaCCodeParameter* _tmp192_;
				ValaHashMap* _tmp193_;
				gint _tmp194_;
				ValaCCodeParameter* _tmp195_;
				_tmp184_ = d;
				_tmp185_ = vala_callable_get_return_type ((ValaCallable*) _tmp184_);
				_tmp186_ = _tmp185_;
				_tmp187_ = vala_get_ccode_name ((ValaCodeNode*) _tmp186_);
				_tmp188_ = _tmp187_;
				_tmp189_ = g_strdup_printf ("%s*", _tmp188_);
				_tmp190_ = _tmp189_;
				_tmp191_ = vala_ccode_parameter_new ("result", _tmp190_);
				_tmp192_ = _tmp191_;
				_g_free0 (_tmp190_);
				_g_free0 (_tmp188_);
				cparam = _tmp192_;
				_tmp193_ = cparam_map;
				_tmp194_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, (gdouble) -3, FALSE);
				_tmp195_ = cparam;
				vala_map_set ((ValaMap*) _tmp193_, (gpointer) ((gintptr) _tmp194_), _tmp195_);
				_vala_ccode_node_unref0 (cparam);
			}
		}
	}
	_tmp196_ = m;
	_tmp197_ = vala_code_node_get_error_types ((ValaCodeNode*) _tmp196_);
	_tmp198_ = _tmp197_;
	_tmp199_ = vala_collection_get_size ((ValaCollection*) _tmp198_);
	_tmp200_ = _tmp199_;
	_tmp201_ = _tmp200_ > 0;
	_vala_iterable_unref0 (_tmp198_);
	if (_tmp201_) {
		ValaCCodeParameter* cparam = NULL;
		ValaCCodeParameter* _tmp202_;
		ValaHashMap* _tmp203_;
		gint _tmp204_;
		ValaCCodeParameter* _tmp205_;
		_tmp202_ = vala_ccode_parameter_new ("error", "GError**");
		cparam = _tmp202_;
		_tmp203_ = cparam_map;
		_tmp204_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, (gdouble) -1, FALSE);
		_tmp205_ = cparam;
		vala_map_set ((ValaMap*) _tmp203_, (gpointer) ((gintptr) _tmp204_), _tmp205_);
		_vala_ccode_node_unref0 (cparam);
	}
	last_pos = -1;
	while (TRUE) {
		gint _tmp223_;
		ValaCCodeFunction* _tmp224_;
		ValaHashMap* _tmp225_;
		gint _tmp226_;
		gpointer _tmp227_;
		ValaCCodeParameter* _tmp228_;
		gint _tmp229_;
		min_pos = -1;
		{
			ValaIterator* _pos_it = NULL;
			ValaHashMap* _tmp206_;
			ValaSet* _tmp207_;
			ValaSet* _tmp208_;
			ValaIterator* _tmp209_;
			ValaIterator* _tmp210_;
			_tmp206_ = cparam_map;
			_tmp207_ = vala_map_get_keys ((ValaMap*) _tmp206_);
			_tmp208_ = _tmp207_;
			_tmp209_ = vala_iterable_iterator ((ValaIterable*) _tmp208_);
			_tmp210_ = _tmp209_;
			_vala_iterable_unref0 (_tmp208_);
			_pos_it = _tmp210_;
			while (TRUE) {
				ValaIterator* _tmp211_;
				gboolean _tmp212_;
				gint pos = 0;
				ValaIterator* _tmp213_;
				gpointer _tmp214_;
				gboolean _tmp215_ = FALSE;
				gint _tmp216_;
				gint _tmp217_;
				_tmp211_ = _pos_it;
				_tmp212_ = vala_iterator_next (_tmp211_);
				if (!_tmp212_) {
					break;
				}
				_tmp213_ = _pos_it;
				_tmp214_ = vala_iterator_get (_tmp213_);
				pos = (gint) ((gintptr) _tmp214_);
				_tmp216_ = pos;
				_tmp217_ = last_pos;
				if (_tmp216_ > _tmp217_) {
					gboolean _tmp218_ = FALSE;
					gint _tmp219_;
					_tmp219_ = min_pos;
					if (_tmp219_ == -1) {
						_tmp218_ = TRUE;
					} else {
						gint _tmp220_;
						gint _tmp221_;
						_tmp220_ = pos;
						_tmp221_ = min_pos;
						_tmp218_ = _tmp220_ < _tmp221_;
					}
					_tmp215_ = _tmp218_;
				} else {
					_tmp215_ = FALSE;
				}
				if (_tmp215_) {
					gint _tmp222_;
					_tmp222_ = pos;
					min_pos = _tmp222_;
				}
			}
			_vala_iterator_unref0 (_pos_it);
		}
		_tmp223_ = min_pos;
		if (_tmp223_ == -1) {
			break;
		}
		_tmp224_ = function;
		_tmp225_ = cparam_map;
		_tmp226_ = min_pos;
		_tmp227_ = vala_map_get ((ValaMap*) _tmp225_, (gpointer) ((gintptr) _tmp226_));
		_tmp228_ = (ValaCCodeParameter*) _tmp227_;
		vala_ccode_function_add_parameter (_tmp224_, _tmp228_);
		_vala_ccode_node_unref0 (_tmp228_);
		_tmp229_ = min_pos;
		last_pos = _tmp229_;
	}
	_tmp230_ = g_direct_hash;
	_tmp231_ = g_direct_equal;
	_tmp232_ = g_direct_equal;
	_tmp233_ = vala_hash_map_new (G_TYPE_INT, NULL, NULL, VALA_TYPE_CCODE_EXPRESSION, (GBoxedCopyFunc) vala_ccode_node_ref, (GDestroyNotify) vala_ccode_node_unref, _tmp230_, _tmp231_, _tmp232_);
	carg_map = _tmp233_;
	i = 0;
	_tmp235_ = m;
	_tmp236_ = vala_method_get_binding (_tmp235_);
	_tmp237_ = _tmp236_;
	if (_tmp237_ == VALA_MEMBER_BINDING_INSTANCE) {
		_tmp234_ = TRUE;
	} else {
		ValaMethod* _tmp238_;
		gboolean _tmp239_;
		gboolean _tmp240_;
		_tmp238_ = m;
		_tmp239_ = vala_method_get_closure (_tmp238_);
		_tmp240_ = _tmp239_;
		_tmp234_ = _tmp240_;
	}
	if (_tmp234_) {
		ValaCCodeExpression* arg = NULL;
		ValaDelegate* _tmp241_;
		gboolean _tmp242_;
		gboolean _tmp243_;
		ValaHashMap* _tmp280_;
		ValaMethod* _tmp281_;
		gdouble _tmp282_;
		gint _tmp283_;
		ValaCCodeExpression* _tmp284_;
		_tmp241_ = d;
		_tmp242_ = vala_delegate_get_has_target (_tmp241_);
		_tmp243_ = _tmp242_;
		if (_tmp243_) {
			ValaCCodeIdentifier* _tmp244_;
			gboolean _tmp245_ = FALSE;
			ValaMethod* _tmp246_;
			gboolean _tmp247_;
			gboolean _tmp248_;
			_tmp244_ = vala_ccode_identifier_new ("self");
			_vala_ccode_node_unref0 (arg);
			arg = (ValaCCodeExpression*) _tmp244_;
			_tmp246_ = m;
			_tmp247_ = vala_method_get_closure (_tmp246_);
			_tmp248_ = _tmp247_;
			if (!_tmp248_) {
				ValaMethod* _tmp249_;
				ValaParameter* _tmp250_;
				ValaParameter* _tmp251_;
				_tmp249_ = m;
				_tmp250_ = vala_method_get_this_parameter (_tmp249_);
				_tmp251_ = _tmp250_;
				_tmp245_ = _tmp251_ != NULL;
			} else {
				_tmp245_ = FALSE;
			}
			if (_tmp245_) {
				ValaCCodeExpression* _tmp252_;
				ValaMethod* _tmp253_;
				ValaParameter* _tmp254_;
				ValaParameter* _tmp255_;
				ValaDataType* _tmp256_;
				ValaDataType* _tmp257_;
				ValaCCodeExpression* _tmp258_;
				_tmp252_ = arg;
				_tmp253_ = m;
				_tmp254_ = vala_method_get_this_parameter (_tmp253_);
				_tmp255_ = _tmp254_;
				_tmp256_ = vala_variable_get_variable_type ((ValaVariable*) _tmp255_);
				_tmp257_ = _tmp256_;
				_tmp258_ = vala_ccode_base_module_convert_from_generic_pointer ((ValaCCodeBaseModule*) self, _tmp252_, _tmp257_);
				_vala_ccode_node_unref0 (arg);
				arg = _tmp258_;
			}
		} else {
			gboolean _tmp259_ = FALSE;
			ValaList* _tmp260_;
			gint _tmp261_;
			gint _tmp262_;
			_tmp260_ = d_params;
			_tmp261_ = vala_collection_get_size ((ValaCollection*) _tmp260_);
			_tmp262_ = _tmp261_;
			if (_tmp262_ == 0) {
				_tmp259_ = TRUE;
			} else {
				ValaMethod* _tmp263_;
				gboolean _tmp264_;
				gboolean _tmp265_;
				_tmp263_ = m;
				_tmp264_ = vala_method_get_closure (_tmp263_);
				_tmp265_ = _tmp264_;
				_tmp259_ = _tmp265_;
			}
			if (_tmp259_) {
				ValaSourceReference* _tmp266_ = NULL;
				ValaCodeNode* _tmp267_;
				ValaCCodeConstant* _tmp271_;
				_tmp267_ = node;
				if (_tmp267_ != NULL) {
					ValaCodeNode* _tmp268_;
					ValaSourceReference* _tmp269_;
					ValaSourceReference* _tmp270_;
					_tmp268_ = node;
					_tmp269_ = vala_code_node_get_source_reference (_tmp268_);
					_tmp270_ = _tmp269_;
					_tmp266_ = _tmp270_;
				} else {
					_tmp266_ = NULL;
				}
				vala_report_error (_tmp266_, "Cannot create delegate without target for instance method or closure");
				_tmp271_ = vala_ccode_constant_new ("NULL");
				_vala_ccode_node_unref0 (arg);
				arg = (ValaCCodeExpression*) _tmp271_;
			} else {
				ValaList* _tmp272_;
				gpointer _tmp273_;
				ValaParameter* _tmp274_;
				const gchar* _tmp275_;
				const gchar* _tmp276_;
				gchar* _tmp277_;
				gchar* _tmp278_;
				ValaCCodeIdentifier* _tmp279_;
				_tmp272_ = d_params;
				_tmp273_ = vala_list_get (_tmp272_, 0);
				_tmp274_ = (ValaParameter*) _tmp273_;
				_tmp275_ = vala_symbol_get_name ((ValaSymbol*) _tmp274_);
				_tmp276_ = _tmp275_;
				_tmp277_ = vala_ccode_base_module_get_variable_cname ((ValaCCodeBaseModule*) self, _tmp276_);
				_tmp278_ = _tmp277_;
				_tmp279_ = vala_ccode_identifier_new (_tmp278_);
				_vala_ccode_node_unref0 (arg);
				arg = (ValaCCodeExpression*) _tmp279_;
				_g_free0 (_tmp278_);
				_vala_code_node_unref0 (_tmp274_);
				i = 1;
			}
		}
		_tmp280_ = carg_map;
		_tmp281_ = m;
		_tmp282_ = vala_get_ccode_instance_pos ((ValaCodeNode*) _tmp281_);
		_tmp283_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp282_, FALSE);
		_tmp284_ = arg;
		vala_map_set ((ValaMap*) _tmp280_, (gpointer) ((gintptr) _tmp283_), _tmp284_);
		_vala_ccode_node_unref0 (arg);
	}
	first = TRUE;
	{
		ValaList* _param_list = NULL;
		ValaMethod* _tmp285_;
		ValaList* _tmp286_;
		gint _param_size = 0;
		ValaList* _tmp287_;
		gint _tmp288_;
		gint _tmp289_;
		gint _param_index = 0;
		_tmp285_ = m;
		_tmp286_ = vala_callable_get_parameters ((ValaCallable*) _tmp285_);
		_param_list = _tmp286_;
		_tmp287_ = _param_list;
		_tmp288_ = vala_collection_get_size ((ValaCollection*) _tmp287_);
		_tmp289_ = _tmp288_;
		_param_size = _tmp289_;
		_param_index = -1;
		while (TRUE) {
			gint _tmp290_;
			gint _tmp291_;
			gint _tmp292_;
			ValaParameter* param = NULL;
			ValaList* _tmp293_;
			gint _tmp294_;
			gpointer _tmp295_;
			gboolean _tmp296_ = FALSE;
			gboolean _tmp297_ = FALSE;
			gboolean _tmp298_;
			ValaCCodeExpression* arg = NULL;
			ValaList* _tmp318_;
			gint _tmp319_;
			gpointer _tmp320_;
			ValaParameter* _tmp321_;
			const gchar* _tmp322_;
			const gchar* _tmp323_;
			gchar* _tmp324_;
			gchar* _tmp325_;
			ValaCCodeIdentifier* _tmp326_;
			ValaList* _tmp327_;
			gint _tmp328_;
			gpointer _tmp329_;
			ValaParameter* _tmp330_;
			ValaDataType* _tmp331_;
			ValaDataType* _tmp332_;
			gboolean _tmp333_;
			ValaHashMap* _tmp339_;
			ValaParameter* _tmp340_;
			gdouble _tmp341_;
			gint _tmp342_;
			ValaCCodeExpression* _tmp343_;
			gboolean _tmp344_ = FALSE;
			ValaParameter* _tmp345_;
			gboolean _tmp346_;
			gint _tmp444_;
			_tmp290_ = _param_index;
			_param_index = _tmp290_ + 1;
			_tmp291_ = _param_index;
			_tmp292_ = _param_size;
			if (!(_tmp291_ < _tmp292_)) {
				break;
			}
			_tmp293_ = _param_list;
			_tmp294_ = _param_index;
			_tmp295_ = vala_list_get (_tmp293_, _tmp294_);
			param = (ValaParameter*) _tmp295_;
			_tmp298_ = first;
			if (_tmp298_) {
				ValaDelegate* _tmp299_;
				ValaDataType* _tmp300_;
				ValaDataType* _tmp301_;
				_tmp299_ = d;
				_tmp300_ = vala_delegate_get_sender_type (_tmp299_);
				_tmp301_ = _tmp300_;
				_tmp297_ = _tmp301_ != NULL;
			} else {
				_tmp297_ = FALSE;
			}
			if (_tmp297_) {
				ValaMethod* _tmp302_;
				ValaList* _tmp303_;
				ValaList* _tmp304_;
				gint _tmp305_;
				gint _tmp306_;
				ValaDelegate* _tmp307_;
				ValaList* _tmp308_;
				ValaList* _tmp309_;
				gint _tmp310_;
				gint _tmp311_;
				_tmp302_ = m;
				_tmp303_ = vala_callable_get_parameters ((ValaCallable*) _tmp302_);
				_tmp304_ = _tmp303_;
				_tmp305_ = vala_collection_get_size ((ValaCollection*) _tmp304_);
				_tmp306_ = _tmp305_;
				_tmp307_ = d;
				_tmp308_ = vala_callable_get_parameters ((ValaCallable*) _tmp307_);
				_tmp309_ = _tmp308_;
				_tmp310_ = vala_collection_get_size ((ValaCollection*) _tmp309_);
				_tmp311_ = _tmp310_;
				_tmp296_ = _tmp306_ == (_tmp311_ + 1);
				_vala_iterable_unref0 (_tmp309_);
				_vala_iterable_unref0 (_tmp304_);
			} else {
				_tmp296_ = FALSE;
			}
			if (_tmp296_) {
				ValaHashMap* _tmp312_;
				ValaParameter* _tmp313_;
				gdouble _tmp314_;
				gint _tmp315_;
				ValaCCodeIdentifier* _tmp316_;
				ValaCCodeIdentifier* _tmp317_;
				_tmp312_ = carg_map;
				_tmp313_ = param;
				_tmp314_ = vala_get_ccode_pos (_tmp313_);
				_tmp315_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp314_, FALSE);
				_tmp316_ = vala_ccode_identifier_new ("_sender");
				_tmp317_ = _tmp316_;
				vala_map_set ((ValaMap*) _tmp312_, (gpointer) ((gintptr) _tmp315_), (ValaCCodeExpression*) _tmp317_);
				_vala_ccode_node_unref0 (_tmp317_);
				first = FALSE;
				_vala_code_node_unref0 (param);
				continue;
			}
			_tmp318_ = d_params;
			_tmp319_ = i;
			_tmp320_ = vala_list_get (_tmp318_, _tmp319_);
			_tmp321_ = (ValaParameter*) _tmp320_;
			_tmp322_ = vala_symbol_get_name ((ValaSymbol*) _tmp321_);
			_tmp323_ = _tmp322_;
			_tmp324_ = vala_ccode_base_module_get_variable_cname ((ValaCCodeBaseModule*) self, _tmp323_);
			_tmp325_ = _tmp324_;
			_tmp326_ = vala_ccode_identifier_new (_tmp325_);
			_vala_ccode_node_unref0 (arg);
			arg = (ValaCCodeExpression*) _tmp326_;
			_g_free0 (_tmp325_);
			_vala_code_node_unref0 (_tmp321_);
			_tmp327_ = d_params;
			_tmp328_ = i;
			_tmp329_ = vala_list_get (_tmp327_, _tmp328_);
			_tmp330_ = (ValaParameter*) _tmp329_;
			_tmp331_ = vala_variable_get_variable_type ((ValaVariable*) _tmp330_);
			_tmp332_ = _tmp331_;
			_tmp333_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp332_, VALA_TYPE_GENERIC_TYPE);
			_vala_code_node_unref0 (_tmp330_);
			if (_tmp333_) {
				ValaCCodeExpression* _tmp334_;
				ValaParameter* _tmp335_;
				ValaDataType* _tmp336_;
				ValaDataType* _tmp337_;
				ValaCCodeExpression* _tmp338_;
				_tmp334_ = arg;
				_tmp335_ = param;
				_tmp336_ = vala_variable_get_variable_type ((ValaVariable*) _tmp335_);
				_tmp337_ = _tmp336_;
				_tmp338_ = vala_ccode_base_module_convert_from_generic_pointer ((ValaCCodeBaseModule*) self, _tmp334_, _tmp337_);
				_vala_ccode_node_unref0 (arg);
				arg = _tmp338_;
			}
			_tmp339_ = carg_map;
			_tmp340_ = param;
			_tmp341_ = vala_get_ccode_pos (_tmp340_);
			_tmp342_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp341_, FALSE);
			_tmp343_ = arg;
			vala_map_set ((ValaMap*) _tmp339_, (gpointer) ((gintptr) _tmp342_), _tmp343_);
			_tmp345_ = param;
			_tmp346_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp345_);
			if (_tmp346_) {
				ValaParameter* _tmp347_;
				ValaDataType* _tmp348_;
				ValaDataType* _tmp349_;
				_tmp347_ = param;
				_tmp348_ = vala_variable_get_variable_type ((ValaVariable*) _tmp347_);
				_tmp349_ = _tmp348_;
				_tmp344_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp349_, VALA_TYPE_ARRAY_TYPE);
			} else {
				_tmp344_ = FALSE;
			}
			if (_tmp344_) {
				ValaArrayType* array_type = NULL;
				ValaParameter* _tmp350_;
				ValaDataType* _tmp351_;
				ValaDataType* _tmp352_;
				ValaArrayType* _tmp353_;
				_tmp350_ = param;
				_tmp351_ = vala_variable_get_variable_type ((ValaVariable*) _tmp350_);
				_tmp352_ = _tmp351_;
				_tmp353_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp352_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
				array_type = _tmp353_;
				{
					gint dim = 0;
					dim = 1;
					{
						gboolean _tmp354_ = FALSE;
						_tmp354_ = TRUE;
						while (TRUE) {
							gint _tmp356_;
							ValaArrayType* _tmp357_;
							gint _tmp358_;
							gint _tmp359_;
							ValaCCodeExpression* clength = NULL;
							ValaList* _tmp360_;
							gint _tmp361_;
							gpointer _tmp362_;
							ValaParameter* _tmp363_;
							gboolean _tmp364_;
							gboolean _tmp365_;
							ValaHashMap* _tmp396_;
							ValaParameter* _tmp397_;
							gdouble _tmp398_;
							gint _tmp399_;
							gint _tmp400_;
							ValaCCodeExpression* _tmp401_;
							if (!_tmp354_) {
								gint _tmp355_;
								_tmp355_ = dim;
								dim = _tmp355_ + 1;
							}
							_tmp354_ = FALSE;
							_tmp356_ = dim;
							_tmp357_ = array_type;
							_tmp358_ = vala_array_type_get_rank (_tmp357_);
							_tmp359_ = _tmp358_;
							if (!(_tmp356_ <= _tmp359_)) {
								break;
							}
							_tmp360_ = d_params;
							_tmp361_ = i;
							_tmp362_ = vala_list_get (_tmp360_, _tmp361_);
							_tmp363_ = (ValaParameter*) _tmp362_;
							_tmp364_ = vala_get_ccode_array_null_terminated ((ValaCodeNode*) _tmp363_);
							_tmp365_ = _tmp364_;
							_vala_code_node_unref0 (_tmp363_);
							if (_tmp365_) {
								ValaCCodeFunctionCall* len_call = NULL;
								ValaCCodeIdentifier* _tmp366_;
								ValaCCodeIdentifier* _tmp367_;
								ValaCCodeFunctionCall* _tmp368_;
								ValaCCodeFunctionCall* _tmp369_;
								ValaCCodeFunctionCall* _tmp370_;
								ValaList* _tmp371_;
								gint _tmp372_;
								gpointer _tmp373_;
								ValaParameter* _tmp374_;
								const gchar* _tmp375_;
								const gchar* _tmp376_;
								ValaCCodeIdentifier* _tmp377_;
								ValaCCodeIdentifier* _tmp378_;
								ValaCCodeFunctionCall* _tmp379_;
								ValaCCodeExpression* _tmp380_;
								((ValaCCodeBaseModule*) self)->requires_array_length = TRUE;
								_tmp366_ = vala_ccode_identifier_new ("_vala_array_length");
								_tmp367_ = _tmp366_;
								_tmp368_ = vala_ccode_function_call_new ((ValaCCodeExpression*) _tmp367_);
								_tmp369_ = _tmp368_;
								_vala_ccode_node_unref0 (_tmp367_);
								len_call = _tmp369_;
								_tmp370_ = len_call;
								_tmp371_ = d_params;
								_tmp372_ = i;
								_tmp373_ = vala_list_get (_tmp371_, _tmp372_);
								_tmp374_ = (ValaParameter*) _tmp373_;
								_tmp375_ = vala_symbol_get_name ((ValaSymbol*) _tmp374_);
								_tmp376_ = _tmp375_;
								_tmp377_ = vala_ccode_identifier_new (_tmp376_);
								_tmp378_ = _tmp377_;
								vala_ccode_function_call_add_argument (_tmp370_, (ValaCCodeExpression*) _tmp378_);
								_vala_ccode_node_unref0 (_tmp378_);
								_vala_code_node_unref0 (_tmp374_);
								_tmp379_ = len_call;
								_tmp380_ = _vala_ccode_node_ref0 ((ValaCCodeExpression*) _tmp379_);
								_vala_ccode_node_unref0 (clength);
								clength = _tmp380_;
								_vala_ccode_node_unref0 (len_call);
							} else {
								ValaList* _tmp381_;
								gint _tmp382_;
								gpointer _tmp383_;
								ValaParameter* _tmp384_;
								gboolean _tmp385_;
								gboolean _tmp386_;
								_tmp381_ = d_params;
								_tmp382_ = i;
								_tmp383_ = vala_list_get (_tmp381_, _tmp382_);
								_tmp384_ = (ValaParameter*) _tmp383_;
								_tmp385_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp384_);
								_tmp386_ = !_tmp385_;
								_vala_code_node_unref0 (_tmp384_);
								if (_tmp386_) {
									ValaCCodeConstant* _tmp387_;
									_tmp387_ = vala_ccode_constant_new ("-1");
									_vala_ccode_node_unref0 (clength);
									clength = (ValaCCodeExpression*) _tmp387_;
								} else {
									ValaList* _tmp388_;
									gint _tmp389_;
									gpointer _tmp390_;
									ValaParameter* _tmp391_;
									gint _tmp392_;
									gchar* _tmp393_;
									gchar* _tmp394_;
									ValaCCodeIdentifier* _tmp395_;
									_tmp388_ = d_params;
									_tmp389_ = i;
									_tmp390_ = vala_list_get (_tmp388_, _tmp389_);
									_tmp391_ = (ValaParameter*) _tmp390_;
									_tmp392_ = dim;
									_tmp393_ = vala_ccode_base_module_get_parameter_array_length_cname ((ValaCCodeBaseModule*) self, _tmp391_, _tmp392_);
									_tmp394_ = _tmp393_;
									_tmp395_ = vala_ccode_identifier_new (_tmp394_);
									_vala_ccode_node_unref0 (clength);
									clength = (ValaCCodeExpression*) _tmp395_;
									_g_free0 (_tmp394_);
									_vala_code_node_unref0 (_tmp391_);
								}
							}
							_tmp396_ = carg_map;
							_tmp397_ = param;
							_tmp398_ = vala_get_ccode_array_length_pos ((ValaCodeNode*) _tmp397_);
							_tmp399_ = dim;
							_tmp400_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp398_ + (0.01 * _tmp399_), FALSE);
							_tmp401_ = clength;
							vala_map_set ((ValaMap*) _tmp396_, (gpointer) ((gintptr) _tmp400_), _tmp401_);
							_vala_ccode_node_unref0 (clength);
						}
					}
				}
				_vala_code_node_unref0 (array_type);
			} else {
				ValaParameter* _tmp402_;
				ValaDataType* _tmp403_;
				ValaDataType* _tmp404_;
				_tmp402_ = param;
				_tmp403_ = vala_variable_get_variable_type ((ValaVariable*) _tmp402_);
				_tmp404_ = _tmp403_;
				if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp404_, VALA_TYPE_DELEGATE_TYPE)) {
					ValaDelegateType* deleg_type = NULL;
					ValaParameter* _tmp405_;
					ValaDataType* _tmp406_;
					ValaDataType* _tmp407_;
					ValaDelegateType* _tmp408_;
					ValaDelegateType* _tmp409_;
					ValaDelegate* _tmp410_;
					ValaDelegate* _tmp411_;
					gboolean _tmp412_;
					gboolean _tmp413_;
					_tmp405_ = param;
					_tmp406_ = vala_variable_get_variable_type ((ValaVariable*) _tmp405_);
					_tmp407_ = _tmp406_;
					_tmp408_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp407_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
					deleg_type = _tmp408_;
					_tmp409_ = deleg_type;
					_tmp410_ = vala_delegate_type_get_delegate_symbol (_tmp409_);
					_tmp411_ = _tmp410_;
					_tmp412_ = vala_delegate_get_has_target (_tmp411_);
					_tmp413_ = _tmp412_;
					if (_tmp413_) {
						ValaCCodeIdentifier* ctarget = NULL;
						ValaList* _tmp414_;
						gint _tmp415_;
						gpointer _tmp416_;
						ValaParameter* _tmp417_;
						gchar* _tmp418_;
						gchar* _tmp419_;
						ValaCCodeIdentifier* _tmp420_;
						ValaCCodeIdentifier* _tmp421_;
						ValaHashMap* _tmp422_;
						ValaParameter* _tmp423_;
						gdouble _tmp424_;
						gint _tmp425_;
						ValaCCodeIdentifier* _tmp426_;
						ValaDelegateType* _tmp427_;
						gboolean _tmp428_;
						_tmp414_ = d_params;
						_tmp415_ = i;
						_tmp416_ = vala_list_get (_tmp414_, _tmp415_);
						_tmp417_ = (ValaParameter*) _tmp416_;
						_tmp418_ = vala_get_ccode_delegate_target_name ((ValaVariable*) _tmp417_);
						_tmp419_ = _tmp418_;
						_tmp420_ = vala_ccode_identifier_new (_tmp419_);
						_tmp421_ = _tmp420_;
						_g_free0 (_tmp419_);
						_vala_code_node_unref0 (_tmp417_);
						ctarget = _tmp421_;
						_tmp422_ = carg_map;
						_tmp423_ = param;
						_tmp424_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp423_);
						_tmp425_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp424_, FALSE);
						_tmp426_ = ctarget;
						vala_map_set ((ValaMap*) _tmp422_, (gpointer) ((gintptr) _tmp425_), (ValaCCodeExpression*) _tmp426_);
						_tmp427_ = deleg_type;
						_tmp428_ = vala_data_type_is_disposable ((ValaDataType*) _tmp427_);
						if (_tmp428_) {
							ValaCCodeIdentifier* ctarget_destroy_notify = NULL;
							ValaList* _tmp429_;
							gint _tmp430_;
							gpointer _tmp431_;
							ValaParameter* _tmp432_;
							const gchar* _tmp433_;
							const gchar* _tmp434_;
							gchar* _tmp435_;
							gchar* _tmp436_;
							ValaCCodeIdentifier* _tmp437_;
							ValaCCodeIdentifier* _tmp438_;
							ValaHashMap* _tmp439_;
							ValaMethod* _tmp440_;
							gdouble _tmp441_;
							gint _tmp442_;
							ValaCCodeIdentifier* _tmp443_;
							_tmp429_ = d_params;
							_tmp430_ = i;
							_tmp431_ = vala_list_get (_tmp429_, _tmp430_);
							_tmp432_ = (ValaParameter*) _tmp431_;
							_tmp433_ = vala_symbol_get_name ((ValaSymbol*) _tmp432_);
							_tmp434_ = _tmp433_;
							_tmp435_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cname ((ValaCCodeBaseModule*) self, _tmp434_);
							_tmp436_ = _tmp435_;
							_tmp437_ = vala_ccode_identifier_new (_tmp436_);
							_tmp438_ = _tmp437_;
							_g_free0 (_tmp436_);
							_vala_code_node_unref0 (_tmp432_);
							ctarget_destroy_notify = _tmp438_;
							_tmp439_ = carg_map;
							_tmp440_ = m;
							_tmp441_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp440_);
							_tmp442_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp441_ + 0.01, FALSE);
							_tmp443_ = ctarget_destroy_notify;
							vala_map_set ((ValaMap*) _tmp439_, (gpointer) ((gintptr) _tmp442_), (ValaCCodeExpression*) _tmp443_);
							_vala_ccode_node_unref0 (ctarget_destroy_notify);
						}
						_vala_ccode_node_unref0 (ctarget);
					}
					_vala_code_node_unref0 (deleg_type);
				}
			}
			_tmp444_ = i;
			i = _tmp444_ + 1;
			_vala_ccode_node_unref0 (arg);
			_vala_code_node_unref0 (param);
		}
		_vala_iterable_unref0 (_param_list);
	}
	_tmp446_ = m;
	_tmp447_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp446_);
	if (_tmp447_) {
		ValaMethod* _tmp448_;
		ValaDataType* _tmp449_;
		ValaDataType* _tmp450_;
		_tmp448_ = m;
		_tmp449_ = vala_callable_get_return_type ((ValaCallable*) _tmp448_);
		_tmp450_ = _tmp449_;
		_tmp445_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp450_, VALA_TYPE_ARRAY_TYPE);
	} else {
		_tmp445_ = FALSE;
	}
	if (_tmp445_) {
		ValaArrayType* array_type = NULL;
		ValaMethod* _tmp451_;
		ValaDataType* _tmp452_;
		ValaDataType* _tmp453_;
		ValaArrayType* _tmp454_;
		_tmp451_ = m;
		_tmp452_ = vala_callable_get_return_type ((ValaCallable*) _tmp451_);
		_tmp453_ = _tmp452_;
		_tmp454_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp453_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
		array_type = _tmp454_;
		{
			gint dim = 0;
			dim = 1;
			{
				gboolean _tmp455_ = FALSE;
				_tmp455_ = TRUE;
				while (TRUE) {
					gint _tmp457_;
					ValaArrayType* _tmp458_;
					gint _tmp459_;
					gint _tmp460_;
					ValaCCodeExpression* clength = NULL;
					ValaDelegate* _tmp461_;
					gboolean _tmp462_;
					ValaHashMap* _tmp468_;
					ValaMethod* _tmp469_;
					gdouble _tmp470_;
					gint _tmp471_;
					gint _tmp472_;
					ValaCCodeExpression* _tmp473_;
					if (!_tmp455_) {
						gint _tmp456_;
						_tmp456_ = dim;
						dim = _tmp456_ + 1;
					}
					_tmp455_ = FALSE;
					_tmp457_ = dim;
					_tmp458_ = array_type;
					_tmp459_ = vala_array_type_get_rank (_tmp458_);
					_tmp460_ = _tmp459_;
					if (!(_tmp457_ <= _tmp460_)) {
						break;
					}
					_tmp461_ = d;
					_tmp462_ = vala_get_ccode_array_length ((ValaCodeNode*) _tmp461_);
					if (!_tmp462_) {
						ValaCCodeConstant* _tmp463_;
						_tmp463_ = vala_ccode_constant_new ("NULL");
						_vala_ccode_node_unref0 (clength);
						clength = (ValaCCodeExpression*) _tmp463_;
					} else {
						gint _tmp464_;
						gchar* _tmp465_;
						gchar* _tmp466_;
						ValaCCodeIdentifier* _tmp467_;
						_tmp464_ = dim;
						_tmp465_ = vala_ccode_base_module_get_array_length_cname ((ValaCCodeBaseModule*) self, "result", _tmp464_);
						_tmp466_ = _tmp465_;
						_tmp467_ = vala_ccode_identifier_new (_tmp466_);
						_vala_ccode_node_unref0 (clength);
						clength = (ValaCCodeExpression*) _tmp467_;
						_g_free0 (_tmp466_);
					}
					_tmp468_ = carg_map;
					_tmp469_ = m;
					_tmp470_ = vala_get_ccode_array_length_pos ((ValaCodeNode*) _tmp469_);
					_tmp471_ = dim;
					_tmp472_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp470_ + (0.01 * _tmp471_), FALSE);
					_tmp473_ = clength;
					vala_map_set ((ValaMap*) _tmp468_, (gpointer) ((gintptr) _tmp472_), _tmp473_);
					_vala_ccode_node_unref0 (clength);
				}
			}
		}
		_vala_code_node_unref0 (array_type);
	} else {
		ValaMethod* _tmp474_;
		ValaDataType* _tmp475_;
		ValaDataType* _tmp476_;
		_tmp474_ = m;
		_tmp475_ = vala_callable_get_return_type ((ValaCallable*) _tmp474_);
		_tmp476_ = _tmp475_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp476_, VALA_TYPE_DELEGATE_TYPE)) {
			ValaDelegateType* deleg_type = NULL;
			ValaMethod* _tmp477_;
			ValaDataType* _tmp478_;
			ValaDataType* _tmp479_;
			ValaDelegateType* _tmp480_;
			ValaDelegateType* _tmp481_;
			ValaDelegate* _tmp482_;
			ValaDelegate* _tmp483_;
			gboolean _tmp484_;
			gboolean _tmp485_;
			_tmp477_ = m;
			_tmp478_ = vala_callable_get_return_type ((ValaCallable*) _tmp477_);
			_tmp479_ = _tmp478_;
			_tmp480_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp479_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
			deleg_type = _tmp480_;
			_tmp481_ = deleg_type;
			_tmp482_ = vala_delegate_type_get_delegate_symbol (_tmp481_);
			_tmp483_ = _tmp482_;
			_tmp484_ = vala_delegate_get_has_target (_tmp483_);
			_tmp485_ = _tmp484_;
			if (_tmp485_) {
				ValaCCodeIdentifier* ctarget = NULL;
				gchar* _tmp486_;
				gchar* _tmp487_;
				ValaCCodeIdentifier* _tmp488_;
				ValaCCodeIdentifier* _tmp489_;
				ValaHashMap* _tmp490_;
				ValaMethod* _tmp491_;
				gdouble _tmp492_;
				gint _tmp493_;
				ValaCCodeIdentifier* _tmp494_;
				ValaDelegateType* _tmp495_;
				gboolean _tmp496_;
				_tmp486_ = vala_ccode_base_module_get_delegate_target_cname ((ValaCCodeBaseModule*) self, "result");
				_tmp487_ = _tmp486_;
				_tmp488_ = vala_ccode_identifier_new (_tmp487_);
				_tmp489_ = _tmp488_;
				_g_free0 (_tmp487_);
				ctarget = _tmp489_;
				_tmp490_ = carg_map;
				_tmp491_ = m;
				_tmp492_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp491_);
				_tmp493_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp492_, FALSE);
				_tmp494_ = ctarget;
				vala_map_set ((ValaMap*) _tmp490_, (gpointer) ((gintptr) _tmp493_), (ValaCCodeExpression*) _tmp494_);
				_tmp495_ = deleg_type;
				_tmp496_ = vala_data_type_is_disposable ((ValaDataType*) _tmp495_);
				if (_tmp496_) {
					ValaCCodeIdentifier* ctarget_destroy_notify = NULL;
					gchar* _tmp497_;
					gchar* _tmp498_;
					ValaCCodeIdentifier* _tmp499_;
					ValaCCodeIdentifier* _tmp500_;
					ValaHashMap* _tmp501_;
					ValaMethod* _tmp502_;
					gdouble _tmp503_;
					gint _tmp504_;
					ValaCCodeIdentifier* _tmp505_;
					_tmp497_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cname ((ValaCCodeBaseModule*) self, "result");
					_tmp498_ = _tmp497_;
					_tmp499_ = vala_ccode_identifier_new (_tmp498_);
					_tmp500_ = _tmp499_;
					_g_free0 (_tmp498_);
					ctarget_destroy_notify = _tmp500_;
					_tmp501_ = carg_map;
					_tmp502_ = m;
					_tmp503_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp502_);
					_tmp504_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp503_ + 0.01, FALSE);
					_tmp505_ = ctarget_destroy_notify;
					vala_map_set ((ValaMap*) _tmp501_, (gpointer) ((gintptr) _tmp504_), (ValaCCodeExpression*) _tmp505_);
					_vala_ccode_node_unref0 (ctarget_destroy_notify);
				}
				_vala_ccode_node_unref0 (ctarget);
			}
			_vala_code_node_unref0 (deleg_type);
		} else {
			ValaMethod* _tmp506_;
			ValaDataType* _tmp507_;
			ValaDataType* _tmp508_;
			gboolean _tmp509_;
			_tmp506_ = m;
			_tmp507_ = vala_callable_get_return_type ((ValaCallable*) _tmp506_);
			_tmp508_ = _tmp507_;
			_tmp509_ = vala_data_type_is_real_non_null_struct_type (_tmp508_);
			if (_tmp509_) {
				ValaHashMap* _tmp510_;
				gint _tmp511_;
				ValaCCodeIdentifier* _tmp512_;
				ValaCCodeIdentifier* _tmp513_;
				_tmp510_ = carg_map;
				_tmp511_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, (gdouble) -3, FALSE);
				_tmp512_ = vala_ccode_identifier_new ("result");
				_tmp513_ = _tmp512_;
				vala_map_set ((ValaMap*) _tmp510_, (gpointer) ((gintptr) _tmp511_), (ValaCCodeExpression*) _tmp513_);
				_vala_ccode_node_unref0 (_tmp513_);
			}
		}
	}
	_tmp514_ = m;
	_tmp515_ = vala_code_node_get_error_types ((ValaCodeNode*) _tmp514_);
	_tmp516_ = _tmp515_;
	_tmp517_ = vala_collection_get_size ((ValaCollection*) _tmp516_);
	_tmp518_ = _tmp517_;
	_tmp519_ = _tmp518_ > 0;
	_vala_iterable_unref0 (_tmp516_);
	if (_tmp519_) {
		ValaHashMap* _tmp520_;
		gint _tmp521_;
		ValaCCodeIdentifier* _tmp522_;
		ValaCCodeIdentifier* _tmp523_;
		_tmp520_ = carg_map;
		_tmp521_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, (gdouble) -1, FALSE);
		_tmp522_ = vala_ccode_identifier_new ("error");
		_tmp523_ = _tmp522_;
		vala_map_set ((ValaMap*) _tmp520_, (gpointer) ((gintptr) _tmp521_), (ValaCCodeExpression*) _tmp523_);
		_vala_ccode_node_unref0 (_tmp523_);
	}
	_tmp524_ = m;
	_tmp525_ = vala_get_ccode_name ((ValaCodeNode*) _tmp524_);
	_tmp526_ = _tmp525_;
	_tmp527_ = vala_ccode_identifier_new (_tmp526_);
	_tmp528_ = _tmp527_;
	_tmp529_ = vala_ccode_function_call_new ((ValaCCodeExpression*) _tmp528_);
	_tmp530_ = _tmp529_;
	_vala_ccode_node_unref0 (_tmp528_);
	_g_free0 (_tmp526_);
	ccall = _tmp530_;
	last_pos = -1;
	while (TRUE) {
		gint _tmp548_;
		ValaCCodeFunctionCall* _tmp549_;
		ValaHashMap* _tmp550_;
		gint _tmp551_;
		gpointer _tmp552_;
		ValaCCodeExpression* _tmp553_;
		gint _tmp554_;
		min_pos = -1;
		{
			ValaIterator* _pos_it = NULL;
			ValaHashMap* _tmp531_;
			ValaSet* _tmp532_;
			ValaSet* _tmp533_;
			ValaIterator* _tmp534_;
			ValaIterator* _tmp535_;
			_tmp531_ = carg_map;
			_tmp532_ = vala_map_get_keys ((ValaMap*) _tmp531_);
			_tmp533_ = _tmp532_;
			_tmp534_ = vala_iterable_iterator ((ValaIterable*) _tmp533_);
			_tmp535_ = _tmp534_;
			_vala_iterable_unref0 (_tmp533_);
			_pos_it = _tmp535_;
			while (TRUE) {
				ValaIterator* _tmp536_;
				gboolean _tmp537_;
				gint pos = 0;
				ValaIterator* _tmp538_;
				gpointer _tmp539_;
				gboolean _tmp540_ = FALSE;
				gint _tmp541_;
				gint _tmp542_;
				_tmp536_ = _pos_it;
				_tmp537_ = vala_iterator_next (_tmp536_);
				if (!_tmp537_) {
					break;
				}
				_tmp538_ = _pos_it;
				_tmp539_ = vala_iterator_get (_tmp538_);
				pos = (gint) ((gintptr) _tmp539_);
				_tmp541_ = pos;
				_tmp542_ = last_pos;
				if (_tmp541_ > _tmp542_) {
					gboolean _tmp543_ = FALSE;
					gint _tmp544_;
					_tmp544_ = min_pos;
					if (_tmp544_ == -1) {
						_tmp543_ = TRUE;
					} else {
						gint _tmp545_;
						gint _tmp546_;
						_tmp545_ = pos;
						_tmp546_ = min_pos;
						_tmp543_ = _tmp545_ < _tmp546_;
					}
					_tmp540_ = _tmp543_;
				} else {
					_tmp540_ = FALSE;
				}
				if (_tmp540_) {
					gint _tmp547_;
					_tmp547_ = pos;
					min_pos = _tmp547_;
				}
			}
			_vala_iterator_unref0 (_pos_it);
		}
		_tmp548_ = min_pos;
		if (_tmp548_ == -1) {
			break;
		}
		_tmp549_ = ccall;
		_tmp550_ = carg_map;
		_tmp551_ = min_pos;
		_tmp552_ = vala_map_get ((ValaMap*) _tmp550_, (gpointer) ((gintptr) _tmp551_));
		_tmp553_ = (ValaCCodeExpression*) _tmp552_;
		vala_ccode_function_call_add_argument (_tmp549_, _tmp553_);
		_vala_ccode_node_unref0 (_tmp553_);
		_tmp554_ = min_pos;
		last_pos = _tmp554_;
	}
	_tmp555_ = m;
	_tmp556_ = vala_method_get_coroutine (_tmp555_);
	_tmp557_ = _tmp556_;
	if (_tmp557_) {
		ValaCCodeFunctionCall* _tmp558_;
		ValaCCodeConstant* _tmp559_;
		ValaCCodeConstant* _tmp560_;
		ValaCCodeFunctionCall* _tmp561_;
		ValaCCodeConstant* _tmp562_;
		ValaCCodeConstant* _tmp563_;
		_tmp558_ = ccall;
		_tmp559_ = vala_ccode_constant_new ("NULL");
		_tmp560_ = _tmp559_;
		vala_ccode_function_call_add_argument (_tmp558_, (ValaCCodeExpression*) _tmp560_);
		_vala_ccode_node_unref0 (_tmp560_);
		_tmp561_ = ccall;
		_tmp562_ = vala_ccode_constant_new ("NULL");
		_tmp563_ = _tmp562_;
		vala_ccode_function_call_add_argument (_tmp561_, (ValaCCodeExpression*) _tmp563_);
		_vala_ccode_node_unref0 (_tmp563_);
	}
	_tmp565_ = m;
	_tmp566_ = vala_callable_get_return_type ((ValaCallable*) _tmp565_);
	_tmp567_ = _tmp566_;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp567_, VALA_TYPE_VOID_TYPE)) {
		_tmp564_ = TRUE;
	} else {
		ValaMethod* _tmp568_;
		ValaDataType* _tmp569_;
		ValaDataType* _tmp570_;
		gboolean _tmp571_;
		_tmp568_ = m;
		_tmp569_ = vala_callable_get_return_type ((ValaCallable*) _tmp568_);
		_tmp570_ = _tmp569_;
		_tmp571_ = vala_data_type_is_real_non_null_struct_type (_tmp570_);
		_tmp564_ = _tmp571_;
	}
	if (_tmp564_) {
		ValaCCodeFunction* _tmp572_;
		ValaCCodeFunction* _tmp573_;
		ValaCCodeFunctionCall* _tmp574_;
		gboolean _tmp575_ = FALSE;
		ValaDelegate* _tmp576_;
		ValaDataType* _tmp577_;
		ValaDataType* _tmp578_;
		_tmp572_ = vala_ccode_base_module_get_ccode ((ValaCCodeBaseModule*) self);
		_tmp573_ = _tmp572_;
		_tmp574_ = ccall;
		vala_ccode_function_add_expression (_tmp573_, (ValaCCodeExpression*) _tmp574_);
		_tmp576_ = d;
		_tmp577_ = vala_callable_get_return_type ((ValaCallable*) _tmp576_);
		_tmp578_ = _tmp577_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp578_, VALA_TYPE_VOID_TYPE)) {
			_tmp575_ = TRUE;
		} else {
			ValaDelegate* _tmp579_;
			ValaDataType* _tmp580_;
			ValaDataType* _tmp581_;
			gboolean _tmp582_;
			_tmp579_ = d;
			_tmp580_ = vala_callable_get_return_type ((ValaCallable*) _tmp579_);
			_tmp581_ = _tmp580_;
			_tmp582_ = vala_data_type_is_real_non_null_struct_type (_tmp581_);
			_tmp575_ = _tmp582_;
		}
		if (!_tmp575_) {
			ValaCCodeFunction* _tmp583_;
			ValaCCodeFunction* _tmp584_;
			const gchar* _tmp585_;
			ValaDelegate* _tmp586_;
			ValaDataType* _tmp587_;
			ValaDataType* _tmp588_;
			ValaCCodeExpression* _tmp589_;
			ValaCCodeExpression* _tmp590_;
			ValaCCodeVariableDeclarator* _tmp591_;
			ValaCCodeVariableDeclarator* _tmp592_;
			_tmp583_ = vala_ccode_base_module_get_ccode ((ValaCCodeBaseModule*) self);
			_tmp584_ = _tmp583_;
			_tmp585_ = return_type_cname;
			_tmp586_ = d;
			_tmp587_ = vala_callable_get_return_type ((ValaCallable*) _tmp586_);
			_tmp588_ = _tmp587_;
			_tmp589_ = vala_ccode_base_module_default_value_for_type ((ValaCCodeBaseModule*) self, _tmp588_, TRUE);
			_tmp590_ = _tmp589_;
			_tmp591_ = vala_ccode_variable_declarator_new ("result", _tmp590_, NULL);
			_tmp592_ = _tmp591_;
			vala_ccode_function_add_declaration (_tmp584_, _tmp585_, (ValaCCodeDeclarator*) _tmp592_, 0);
			_vala_ccode_node_unref0 (_tmp592_);
			_vala_ccode_node_unref0 (_tmp590_);
		}
	} else {
		ValaCCodeExpression* _result_ = NULL;
		ValaCCodeFunctionCall* _tmp593_;
		ValaCCodeExpression* _tmp594_;
		ValaDelegate* _tmp595_;
		ValaDataType* _tmp596_;
		ValaDataType* _tmp597_;
		ValaCCodeFunction* _tmp603_;
		ValaCCodeFunction* _tmp604_;
		const gchar* _tmp605_;
		ValaCCodeExpression* _tmp606_;
		ValaCCodeVariableDeclarator* _tmp607_;
		ValaCCodeVariableDeclarator* _tmp608_;
		_tmp593_ = ccall;
		_tmp594_ = _vala_ccode_node_ref0 ((ValaCCodeExpression*) _tmp593_);
		_result_ = _tmp594_;
		_tmp595_ = d;
		_tmp596_ = vala_callable_get_return_type ((ValaCallable*) _tmp595_);
		_tmp597_ = _tmp596_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp597_, VALA_TYPE_GENERIC_TYPE)) {
			ValaCCodeExpression* _tmp598_;
			ValaMethod* _tmp599_;
			ValaDataType* _tmp600_;
			ValaDataType* _tmp601_;
			ValaCCodeExpression* _tmp602_;
			_tmp598_ = _result_;
			_tmp599_ = m;
			_tmp600_ = vala_callable_get_return_type ((ValaCallable*) _tmp599_);
			_tmp601_ = _tmp600_;
			_tmp602_ = vala_ccode_base_module_convert_to_generic_pointer ((ValaCCodeBaseModule*) self, _tmp598_, _tmp601_);
			_vala_ccode_node_unref0 (_result_);
			_result_ = _tmp602_;
		}
		_tmp603_ = vala_ccode_base_module_get_ccode ((ValaCCodeBaseModule*) self);
		_tmp604_ = _tmp603_;
		_tmp605_ = return_type_cname;
		_tmp606_ = _result_;
		_tmp607_ = vala_ccode_variable_declarator_new ("result", _tmp606_, NULL);
		_tmp608_ = _tmp607_;
		vala_ccode_function_add_declaration (_tmp604_, _tmp605_, (ValaCCodeDeclarator*) _tmp608_, 0);
		_vala_ccode_node_unref0 (_tmp608_);
		_vala_ccode_node_unref0 (_result_);
	}
	_tmp610_ = d;
	_tmp611_ = vala_delegate_get_has_target (_tmp610_);
	_tmp612_ = _tmp611_;
	if (_tmp612_) {
		ValaDelegateType* _tmp613_;
		gboolean _tmp614_;
		gboolean _tmp615_;
		_tmp613_ = dt;
		_tmp614_ = vala_delegate_type_get_is_called_once (_tmp613_);
		_tmp615_ = _tmp614_;
		_tmp609_ = _tmp615_;
	} else {
		_tmp609_ = FALSE;
	}
	if (_tmp609_) {
		ValaCCodeExpression* destroy_notify = NULL;
		ValaMethod* _tmp616_;
		gboolean _tmp617_;
		gboolean _tmp618_;
		ValaCCodeExpression* _tmp652_;
		destroy_notify = NULL;
		_tmp616_ = m;
		_tmp617_ = vala_method_get_closure (_tmp616_);
		_tmp618_ = _tmp617_;
		if (_tmp618_) {
			gint block_id = 0;
			ValaBlock* _tmp619_;
			ValaBlock* _tmp620_;
			gint _tmp621_;
			gint _tmp622_;
			gchar* _tmp623_;
			gchar* _tmp624_;
			ValaCCodeIdentifier* _tmp625_;
			_tmp619_ = vala_ccode_base_module_get_current_closure_block ((ValaCCodeBaseModule*) self);
			_tmp620_ = _tmp619_;
			_tmp621_ = vala_ccode_base_module_get_block_id ((ValaCCodeBaseModule*) self, _tmp620_);
			block_id = _tmp621_;
			_tmp622_ = block_id;
			_tmp623_ = g_strdup_printf ("block%d_data_unref", _tmp622_);
			_tmp624_ = _tmp623_;
			_tmp625_ = vala_ccode_identifier_new (_tmp624_);
			_vala_ccode_node_unref0 (destroy_notify);
			destroy_notify = (ValaCCodeExpression*) _tmp625_;
			_g_free0 (_tmp624_);
		} else {
			gboolean _tmp626_ = FALSE;
			gboolean _tmp627_ = FALSE;
			gboolean _tmp628_ = FALSE;
			ValaDataType* _tmp629_;
			ValaDataType* _tmp630_;
			gboolean _tmp631_;
			_tmp629_ = vala_ccode_base_module_get_this_type ((ValaCCodeBaseModule*) self);
			_tmp630_ = _tmp629_;
			_tmp631_ = _tmp630_ != NULL;
			_vala_code_node_unref0 (_tmp630_);
			if (_tmp631_) {
				ValaMethod* _tmp632_;
				ValaMemberBinding _tmp633_;
				ValaMemberBinding _tmp634_;
				_tmp632_ = m;
				_tmp633_ = vala_method_get_binding (_tmp632_);
				_tmp634_ = _tmp633_;
				_tmp628_ = _tmp634_ != VALA_MEMBER_BINDING_STATIC;
			} else {
				_tmp628_ = FALSE;
			}
			if (_tmp628_) {
				ValaMethod* _tmp635_;
				gboolean _tmp636_;
				gboolean _tmp637_;
				_tmp635_ = m;
				_tmp636_ = vala_method_get_is_async_callback (_tmp635_);
				_tmp637_ = _tmp636_;
				_tmp627_ = !_tmp637_;
			} else {
				_tmp627_ = FALSE;
			}
			if (_tmp627_) {
				ValaMethod* _tmp638_;
				ValaParameter* _tmp639_;
				ValaParameter* _tmp640_;
				ValaDataType* _tmp641_;
				ValaDataType* _tmp642_;
				ValaTypeSymbol* _tmp643_;
				ValaTypeSymbol* _tmp644_;
				gboolean _tmp645_;
				_tmp638_ = m;
				_tmp639_ = vala_method_get_this_parameter (_tmp638_);
				_tmp640_ = _tmp639_;
				_tmp641_ = vala_variable_get_variable_type ((ValaVariable*) _tmp640_);
				_tmp642_ = _tmp641_;
				_tmp643_ = vala_data_type_get_data_type (_tmp642_);
				_tmp644_ = _tmp643_;
				_tmp645_ = vala_is_reference_counting (_tmp644_);
				_tmp626_ = _tmp645_;
			} else {
				_tmp626_ = FALSE;
			}
			if (_tmp626_) {
				ValaMethod* _tmp646_;
				ValaParameter* _tmp647_;
				ValaParameter* _tmp648_;
				ValaDataType* _tmp649_;
				ValaDataType* _tmp650_;
				ValaCCodeExpression* _tmp651_;
				_tmp646_ = m;
				_tmp647_ = vala_method_get_this_parameter (_tmp646_);
				_tmp648_ = _tmp647_;
				_tmp649_ = vala_variable_get_variable_type ((ValaVariable*) _tmp648_);
				_tmp650_ = _tmp649_;
				_tmp651_ = vala_ccode_base_module_get_destroy_func_expression ((ValaCCodeBaseModule*) self, _tmp650_, FALSE);
				_vala_ccode_node_unref0 (destroy_notify);
				destroy_notify = _tmp651_;
			}
		}
		_tmp652_ = destroy_notify;
		if (_tmp652_ != NULL) {
			ValaCCodeFunctionCall* unref_call = NULL;
			ValaCCodeExpression* _tmp653_;
			ValaCCodeFunctionCall* _tmp654_;
			ValaCCodeFunctionCall* _tmp655_;
			ValaCCodeIdentifier* _tmp656_;
			ValaCCodeIdentifier* _tmp657_;
			ValaCCodeFunction* _tmp658_;
			ValaCCodeFunction* _tmp659_;
			ValaCCodeFunctionCall* _tmp660_;
			_tmp653_ = destroy_notify;
			_tmp654_ = vala_ccode_function_call_new (_tmp653_);
			unref_call = _tmp654_;
			_tmp655_ = unref_call;
			_tmp656_ = vala_ccode_identifier_new ("self");
			_tmp657_ = _tmp656_;
			vala_ccode_function_call_add_argument (_tmp655_, (ValaCCodeExpression*) _tmp657_);
			_vala_ccode_node_unref0 (_tmp657_);
			_tmp658_ = vala_ccode_base_module_get_ccode ((ValaCCodeBaseModule*) self);
			_tmp659_ = _tmp658_;
			_tmp660_ = unref_call;
			vala_ccode_function_add_expression (_tmp659_, (ValaCCodeExpression*) _tmp660_);
			_vala_ccode_node_unref0 (unref_call);
		}
		_vala_ccode_node_unref0 (destroy_notify);
	}
	_tmp663_ = m;
	_tmp664_ = vala_callable_get_return_type ((ValaCallable*) _tmp663_);
	_tmp665_ = _tmp664_;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp665_, VALA_TYPE_VOID_TYPE)) {
		_tmp662_ = TRUE;
	} else {
		ValaMethod* _tmp666_;
		ValaDataType* _tmp667_;
		ValaDataType* _tmp668_;
		gboolean _tmp669_;
		_tmp666_ = m;
		_tmp667_ = vala_callable_get_return_type ((ValaCallable*) _tmp666_);
		_tmp668_ = _tmp667_;
		_tmp669_ = vala_data_type_is_real_non_null_struct_type (_tmp668_);
		_tmp662_ = _tmp669_;
	}
	if (!_tmp662_) {
		_tmp661_ = TRUE;
	} else {
		gboolean _tmp670_ = FALSE;
		ValaDelegate* _tmp671_;
		ValaDataType* _tmp672_;
		ValaDataType* _tmp673_;
		_tmp671_ = d;
		_tmp672_ = vala_callable_get_return_type ((ValaCallable*) _tmp671_);
		_tmp673_ = _tmp672_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp673_, VALA_TYPE_VOID_TYPE)) {
			_tmp670_ = TRUE;
		} else {
			ValaDelegate* _tmp674_;
			ValaDataType* _tmp675_;
			ValaDataType* _tmp676_;
			gboolean _tmp677_;
			_tmp674_ = d;
			_tmp675_ = vala_callable_get_return_type ((ValaCallable*) _tmp674_);
			_tmp676_ = _tmp675_;
			_tmp677_ = vala_data_type_is_real_non_null_struct_type (_tmp676_);
			_tmp670_ = _tmp677_;
		}
		_tmp661_ = !_tmp670_;
	}
	if (_tmp661_) {
		ValaCCodeFunction* _tmp678_;
		ValaCCodeFunction* _tmp679_;
		ValaCCodeIdentifier* _tmp680_;
		ValaCCodeIdentifier* _tmp681_;
		_tmp678_ = vala_ccode_base_module_get_ccode ((ValaCCodeBaseModule*) self);
		_tmp679_ = _tmp678_;
		_tmp680_ = vala_ccode_identifier_new ("result");
		_tmp681_ = _tmp680_;
		vala_ccode_function_add_return (_tmp679_, (ValaCCodeExpression*) _tmp681_);
		_vala_ccode_node_unref0 (_tmp681_);
	}
	vala_ccode_base_module_pop_function ((ValaCCodeBaseModule*) self);
	_tmp682_ = ((ValaCCodeBaseModule*) self)->cfile;
	_tmp683_ = function;
	vala_ccode_file_add_function_declaration (_tmp682_, _tmp683_);
	_tmp684_ = ((ValaCCodeBaseModule*) self)->cfile;
	_tmp685_ = function;
	vala_ccode_file_add_function (_tmp684_, _tmp685_);
	result = wrapper_name;
	_vala_ccode_node_unref0 (ccall);
	_vala_map_unref0 (carg_map);
	_vala_iterable_unref0 (d_params);
	_vala_map_unref0 (cparam_map);
	_vala_ccode_node_unref0 (function);
	_g_free0 (return_type_cname);
	_vala_code_node_unref0 (dynamic_sig);
	_vala_code_node_unref0 (sig);
	_g_free0 (delegate_name);
	_vala_code_node_unref0 (d);
	return result;
}


static ValaCCodeParameter* vala_ccode_delegate_module_real_generate_parameter (ValaCCodeMethodModule* base, ValaParameter* param, ValaCCodeFile* decl_space, ValaMap* cparam_map, ValaMap* carg_map) {
	ValaCCodeDelegateModule * self;
	ValaCCodeParameter* result = NULL;
	gboolean _tmp0_ = FALSE;
	ValaParameter* _tmp1_;
	ValaDataType* _tmp2_;
	ValaDataType* _tmp3_;
	gchar* ctypename = NULL;
	ValaParameter* _tmp12_;
	ValaDataType* _tmp13_;
	ValaDataType* _tmp14_;
	gchar* _tmp15_;
	gchar* target_ctypename = NULL;
	gchar* _tmp16_;
	gchar* target_destroy_notify_ctypename = NULL;
	gchar* _tmp17_;
	gboolean _tmp18_ = FALSE;
	ValaParameter* _tmp19_;
	ValaSymbol* _tmp20_;
	ValaSymbol* _tmp21_;
	ValaParameter* _tmp33_;
	ValaParameterDirection _tmp34_;
	ValaParameterDirection _tmp35_;
	ValaCCodeParameter* main_cparam = NULL;
	ValaParameter* _tmp42_;
	const gchar* _tmp43_;
	const gchar* _tmp44_;
	gchar* _tmp45_;
	gchar* _tmp46_;
	const gchar* _tmp47_;
	ValaCCodeParameter* _tmp48_;
	ValaCCodeParameter* _tmp49_;
	ValaMap* _tmp50_;
	ValaParameter* _tmp51_;
	gdouble _tmp52_;
	gint _tmp53_;
	ValaCCodeParameter* _tmp54_;
	ValaMap* _tmp55_;
	ValaParameter* _tmp65_;
	ValaDataType* _tmp66_;
	ValaDataType* _tmp67_;
	self = (ValaCCodeDelegateModule*) base;
	g_return_val_if_fail (param != NULL, NULL);
	g_return_val_if_fail (decl_space != NULL, NULL);
	g_return_val_if_fail (cparam_map != NULL, NULL);
	_tmp1_ = param;
	_tmp2_ = vala_variable_get_variable_type ((ValaVariable*) _tmp1_);
	_tmp3_ = _tmp2_;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp3_, VALA_TYPE_DELEGATE_TYPE)) {
		_tmp0_ = TRUE;
	} else {
		ValaParameter* _tmp4_;
		ValaDataType* _tmp5_;
		ValaDataType* _tmp6_;
		_tmp4_ = param;
		_tmp5_ = vala_variable_get_variable_type ((ValaVariable*) _tmp4_);
		_tmp6_ = _tmp5_;
		_tmp0_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp6_, VALA_TYPE_METHOD_TYPE);
	}
	if (!_tmp0_) {
		ValaParameter* _tmp7_;
		ValaCCodeFile* _tmp8_;
		ValaMap* _tmp9_;
		ValaMap* _tmp10_;
		ValaCCodeParameter* _tmp11_;
		_tmp7_ = param;
		_tmp8_ = decl_space;
		_tmp9_ = cparam_map;
		_tmp10_ = carg_map;
		_tmp11_ = VALA_CCODE_METHOD_MODULE_CLASS (vala_ccode_delegate_module_parent_class)->generate_parameter ((ValaCCodeMethodModule*) G_TYPE_CHECK_INSTANCE_CAST (self, VALA_TYPE_CCODE_ARRAY_MODULE, ValaCCodeArrayModule), _tmp7_, _tmp8_, _tmp9_, _tmp10_);
		result = _tmp11_;
		return result;
	}
	_tmp12_ = param;
	_tmp13_ = vala_variable_get_variable_type ((ValaVariable*) _tmp12_);
	_tmp14_ = _tmp13_;
	_tmp15_ = vala_get_ccode_name ((ValaCodeNode*) _tmp14_);
	ctypename = _tmp15_;
	_tmp16_ = g_strdup ("void*");
	target_ctypename = _tmp16_;
	_tmp17_ = g_strdup ("GDestroyNotify");
	target_destroy_notify_ctypename = _tmp17_;
	_tmp19_ = param;
	_tmp20_ = vala_symbol_get_parent_symbol ((ValaSymbol*) _tmp19_);
	_tmp21_ = _tmp20_;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp21_, VALA_TYPE_DELEGATE)) {
		ValaParameter* _tmp22_;
		ValaDataType* _tmp23_;
		ValaDataType* _tmp24_;
		gchar* _tmp25_;
		gchar* _tmp26_;
		ValaParameter* _tmp27_;
		ValaSymbol* _tmp28_;
		ValaSymbol* _tmp29_;
		gchar* _tmp30_;
		gchar* _tmp31_;
		_tmp22_ = param;
		_tmp23_ = vala_variable_get_variable_type ((ValaVariable*) _tmp22_);
		_tmp24_ = _tmp23_;
		_tmp25_ = vala_get_ccode_name ((ValaCodeNode*) _tmp24_);
		_tmp26_ = _tmp25_;
		_tmp27_ = param;
		_tmp28_ = vala_symbol_get_parent_symbol ((ValaSymbol*) _tmp27_);
		_tmp29_ = _tmp28_;
		_tmp30_ = vala_get_ccode_name ((ValaCodeNode*) _tmp29_);
		_tmp31_ = _tmp30_;
		_tmp18_ = g_strcmp0 (_tmp26_, _tmp31_) == 0;
		_g_free0 (_tmp31_);
		_g_free0 (_tmp26_);
	} else {
		_tmp18_ = FALSE;
	}
	if (_tmp18_) {
		gchar* _tmp32_;
		_tmp32_ = g_strdup ("GCallback");
		_g_free0 (ctypename);
		ctypename = _tmp32_;
	}
	_tmp33_ = param;
	_tmp34_ = vala_parameter_get_direction (_tmp33_);
	_tmp35_ = _tmp34_;
	if (_tmp35_ != VALA_PARAMETER_DIRECTION_IN) {
		const gchar* _tmp36_;
		gchar* _tmp37_;
		const gchar* _tmp38_;
		gchar* _tmp39_;
		const gchar* _tmp40_;
		gchar* _tmp41_;
		_tmp36_ = ctypename;
		_tmp37_ = g_strconcat (_tmp36_, "*", NULL);
		_g_free0 (ctypename);
		ctypename = _tmp37_;
		_tmp38_ = target_ctypename;
		_tmp39_ = g_strconcat (_tmp38_, "*", NULL);
		_g_free0 (target_ctypename);
		target_ctypename = _tmp39_;
		_tmp40_ = target_destroy_notify_ctypename;
		_tmp41_ = g_strconcat (_tmp40_, "*", NULL);
		_g_free0 (target_destroy_notify_ctypename);
		target_destroy_notify_ctypename = _tmp41_;
	}
	_tmp42_ = param;
	_tmp43_ = vala_symbol_get_name ((ValaSymbol*) _tmp42_);
	_tmp44_ = _tmp43_;
	_tmp45_ = vala_ccode_base_module_get_variable_cname ((ValaCCodeBaseModule*) self, _tmp44_);
	_tmp46_ = _tmp45_;
	_tmp47_ = ctypename;
	_tmp48_ = vala_ccode_parameter_new (_tmp46_, _tmp47_);
	_tmp49_ = _tmp48_;
	_g_free0 (_tmp46_);
	main_cparam = _tmp49_;
	_tmp50_ = cparam_map;
	_tmp51_ = param;
	_tmp52_ = vala_get_ccode_pos (_tmp51_);
	_tmp53_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp52_, FALSE);
	_tmp54_ = main_cparam;
	vala_map_set (_tmp50_, (gpointer) ((gintptr) _tmp53_), _tmp54_);
	_tmp55_ = carg_map;
	if (_tmp55_ != NULL) {
		ValaMap* _tmp56_;
		ValaParameter* _tmp57_;
		gdouble _tmp58_;
		gint _tmp59_;
		ValaParameter* _tmp60_;
		const gchar* _tmp61_;
		const gchar* _tmp62_;
		ValaCCodeExpression* _tmp63_;
		ValaCCodeExpression* _tmp64_;
		_tmp56_ = carg_map;
		_tmp57_ = param;
		_tmp58_ = vala_get_ccode_pos (_tmp57_);
		_tmp59_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp58_, FALSE);
		_tmp60_ = param;
		_tmp61_ = vala_symbol_get_name ((ValaSymbol*) _tmp60_);
		_tmp62_ = _tmp61_;
		_tmp63_ = vala_ccode_base_module_get_variable_cexpression ((ValaCCodeBaseModule*) self, _tmp62_);
		_tmp64_ = _tmp63_;
		vala_map_set (_tmp56_, (gpointer) ((gintptr) _tmp59_), _tmp64_);
		_vala_ccode_node_unref0 (_tmp64_);
	}
	_tmp65_ = param;
	_tmp66_ = vala_variable_get_variable_type ((ValaVariable*) _tmp65_);
	_tmp67_ = _tmp66_;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp67_, VALA_TYPE_DELEGATE_TYPE)) {
		ValaDelegateType* deleg_type = NULL;
		ValaParameter* _tmp68_;
		ValaDataType* _tmp69_;
		ValaDataType* _tmp70_;
		ValaDelegateType* _tmp71_;
		ValaDelegate* d = NULL;
		ValaDelegateType* _tmp72_;
		ValaDelegate* _tmp73_;
		ValaDelegate* _tmp74_;
		ValaDelegate* _tmp75_;
		ValaDelegate* _tmp76_;
		ValaCCodeFile* _tmp77_;
		ValaDelegate* _tmp78_;
		gboolean _tmp79_;
		gboolean _tmp80_;
		_tmp68_ = param;
		_tmp69_ = vala_variable_get_variable_type ((ValaVariable*) _tmp68_);
		_tmp70_ = _tmp69_;
		_tmp71_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp70_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
		deleg_type = _tmp71_;
		_tmp72_ = deleg_type;
		_tmp73_ = vala_delegate_type_get_delegate_symbol (_tmp72_);
		_tmp74_ = _tmp73_;
		_tmp75_ = _vala_code_node_ref0 (_tmp74_);
		d = _tmp75_;
		_tmp76_ = d;
		_tmp77_ = decl_space;
		vala_ccode_base_module_generate_delegate_declaration ((ValaCCodeBaseModule*) self, _tmp76_, _tmp77_);
		_tmp78_ = d;
		_tmp79_ = vala_delegate_get_has_target (_tmp78_);
		_tmp80_ = _tmp79_;
		if (_tmp80_) {
			ValaCCodeParameter* cparam = NULL;
			ValaParameter* _tmp81_;
			gchar* _tmp82_;
			gchar* _tmp83_;
			const gchar* _tmp84_;
			ValaCCodeParameter* _tmp85_;
			ValaCCodeParameter* _tmp86_;
			ValaMap* _tmp87_;
			ValaParameter* _tmp88_;
			gdouble _tmp89_;
			gint _tmp90_;
			ValaCCodeParameter* _tmp91_;
			ValaMap* _tmp92_;
			ValaDelegateType* _tmp102_;
			gboolean _tmp103_;
			_tmp81_ = param;
			_tmp82_ = vala_get_ccode_delegate_target_name ((ValaVariable*) _tmp81_);
			_tmp83_ = _tmp82_;
			_tmp84_ = target_ctypename;
			_tmp85_ = vala_ccode_parameter_new (_tmp83_, _tmp84_);
			_tmp86_ = _tmp85_;
			_g_free0 (_tmp83_);
			cparam = _tmp86_;
			_tmp87_ = cparam_map;
			_tmp88_ = param;
			_tmp89_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp88_);
			_tmp90_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp89_, FALSE);
			_tmp91_ = cparam;
			vala_map_set (_tmp87_, (gpointer) ((gintptr) _tmp90_), _tmp91_);
			_tmp92_ = carg_map;
			if (_tmp92_ != NULL) {
				ValaMap* _tmp93_;
				ValaParameter* _tmp94_;
				gdouble _tmp95_;
				gint _tmp96_;
				ValaCCodeParameter* _tmp97_;
				const gchar* _tmp98_;
				const gchar* _tmp99_;
				ValaCCodeExpression* _tmp100_;
				ValaCCodeExpression* _tmp101_;
				_tmp93_ = carg_map;
				_tmp94_ = param;
				_tmp95_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp94_);
				_tmp96_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp95_, FALSE);
				_tmp97_ = cparam;
				_tmp98_ = vala_ccode_parameter_get_name (_tmp97_);
				_tmp99_ = _tmp98_;
				_tmp100_ = vala_ccode_base_module_get_variable_cexpression ((ValaCCodeBaseModule*) self, _tmp99_);
				_tmp101_ = _tmp100_;
				vala_map_set (_tmp93_, (gpointer) ((gintptr) _tmp96_), _tmp101_);
				_vala_ccode_node_unref0 (_tmp101_);
			}
			_tmp102_ = deleg_type;
			_tmp103_ = vala_data_type_is_disposable ((ValaDataType*) _tmp102_);
			if (_tmp103_) {
				ValaParameter* _tmp104_;
				const gchar* _tmp105_;
				const gchar* _tmp106_;
				gchar* _tmp107_;
				gchar* _tmp108_;
				gchar* _tmp109_;
				gchar* _tmp110_;
				const gchar* _tmp111_;
				ValaCCodeParameter* _tmp112_;
				ValaMap* _tmp113_;
				ValaParameter* _tmp114_;
				gdouble _tmp115_;
				gint _tmp116_;
				ValaCCodeParameter* _tmp117_;
				ValaMap* _tmp118_;
				_tmp104_ = param;
				_tmp105_ = vala_symbol_get_name ((ValaSymbol*) _tmp104_);
				_tmp106_ = _tmp105_;
				_tmp107_ = vala_ccode_base_module_get_variable_cname ((ValaCCodeBaseModule*) self, _tmp106_);
				_tmp108_ = _tmp107_;
				_tmp109_ = vala_ccode_base_module_get_delegate_target_destroy_notify_cname ((ValaCCodeBaseModule*) self, _tmp108_);
				_tmp110_ = _tmp109_;
				_tmp111_ = target_destroy_notify_ctypename;
				_tmp112_ = vala_ccode_parameter_new (_tmp110_, _tmp111_);
				_vala_ccode_node_unref0 (cparam);
				cparam = _tmp112_;
				_g_free0 (_tmp110_);
				_g_free0 (_tmp108_);
				_tmp113_ = cparam_map;
				_tmp114_ = param;
				_tmp115_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp114_);
				_tmp116_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp115_ + 0.01, FALSE);
				_tmp117_ = cparam;
				vala_map_set (_tmp113_, (gpointer) ((gintptr) _tmp116_), _tmp117_);
				_tmp118_ = carg_map;
				if (_tmp118_ != NULL) {
					ValaMap* _tmp119_;
					ValaParameter* _tmp120_;
					gdouble _tmp121_;
					gint _tmp122_;
					ValaCCodeParameter* _tmp123_;
					const gchar* _tmp124_;
					const gchar* _tmp125_;
					ValaCCodeExpression* _tmp126_;
					ValaCCodeExpression* _tmp127_;
					_tmp119_ = carg_map;
					_tmp120_ = param;
					_tmp121_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp120_);
					_tmp122_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp121_ + 0.01, FALSE);
					_tmp123_ = cparam;
					_tmp124_ = vala_ccode_parameter_get_name (_tmp123_);
					_tmp125_ = _tmp124_;
					_tmp126_ = vala_ccode_base_module_get_variable_cexpression ((ValaCCodeBaseModule*) self, _tmp125_);
					_tmp127_ = _tmp126_;
					vala_map_set (_tmp119_, (gpointer) ((gintptr) _tmp122_), _tmp127_);
					_vala_ccode_node_unref0 (_tmp127_);
				}
			}
			_vala_ccode_node_unref0 (cparam);
		}
		_vala_code_node_unref0 (d);
		_vala_code_node_unref0 (deleg_type);
	} else {
		ValaParameter* _tmp128_;
		ValaDataType* _tmp129_;
		ValaDataType* _tmp130_;
		_tmp128_ = param;
		_tmp129_ = vala_variable_get_variable_type ((ValaVariable*) _tmp128_);
		_tmp130_ = _tmp129_;
		if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp130_, VALA_TYPE_METHOD_TYPE)) {
			ValaCCodeParameter* cparam = NULL;
			ValaParameter* _tmp131_;
			gchar* _tmp132_;
			gchar* _tmp133_;
			const gchar* _tmp134_;
			ValaCCodeParameter* _tmp135_;
			ValaCCodeParameter* _tmp136_;
			ValaMap* _tmp137_;
			ValaParameter* _tmp138_;
			gdouble _tmp139_;
			gint _tmp140_;
			ValaCCodeParameter* _tmp141_;
			ValaMap* _tmp142_;
			_tmp131_ = param;
			_tmp132_ = vala_get_ccode_delegate_target_name ((ValaVariable*) _tmp131_);
			_tmp133_ = _tmp132_;
			_tmp134_ = target_ctypename;
			_tmp135_ = vala_ccode_parameter_new (_tmp133_, _tmp134_);
			_tmp136_ = _tmp135_;
			_g_free0 (_tmp133_);
			cparam = _tmp136_;
			_tmp137_ = cparam_map;
			_tmp138_ = param;
			_tmp139_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp138_);
			_tmp140_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp139_, FALSE);
			_tmp141_ = cparam;
			vala_map_set (_tmp137_, (gpointer) ((gintptr) _tmp140_), _tmp141_);
			_tmp142_ = carg_map;
			if (_tmp142_ != NULL) {
				ValaMap* _tmp143_;
				ValaParameter* _tmp144_;
				gdouble _tmp145_;
				gint _tmp146_;
				ValaCCodeParameter* _tmp147_;
				const gchar* _tmp148_;
				const gchar* _tmp149_;
				ValaCCodeExpression* _tmp150_;
				ValaCCodeExpression* _tmp151_;
				_tmp143_ = carg_map;
				_tmp144_ = param;
				_tmp145_ = vala_get_ccode_delegate_target_pos ((ValaCodeNode*) _tmp144_);
				_tmp146_ = vala_ccode_base_module_get_param_pos ((ValaCCodeBaseModule*) self, _tmp145_, FALSE);
				_tmp147_ = cparam;
				_tmp148_ = vala_ccode_parameter_get_name (_tmp147_);
				_tmp149_ = _tmp148_;
				_tmp150_ = vala_ccode_base_module_get_variable_cexpression ((ValaCCodeBaseModule*) self, _tmp149_);
				_tmp151_ = _tmp150_;
				vala_map_set (_tmp143_, (gpointer) ((gintptr) _tmp146_), _tmp151_);
				_vala_ccode_node_unref0 (_tmp151_);
			}
			_vala_ccode_node_unref0 (cparam);
		}
	}
	result = main_cparam;
	_g_free0 (target_destroy_notify_ctypename);
	_g_free0 (target_ctypename);
	_g_free0 (ctypename);
	return result;
}


ValaCCodeDelegateModule* vala_ccode_delegate_module_construct (GType object_type) {
	ValaCCodeDelegateModule* self = NULL;
	self = (ValaCCodeDelegateModule*) vala_ccode_array_module_construct (object_type);
	return self;
}


ValaCCodeDelegateModule* vala_ccode_delegate_module_new (void) {
	return vala_ccode_delegate_module_construct (VALA_TYPE_CCODE_DELEGATE_MODULE);
}


static void vala_ccode_delegate_module_class_init (ValaCCodeDelegateModuleClass * klass) {
	vala_ccode_delegate_module_parent_class = g_type_class_peek_parent (klass);
	((ValaCCodeBaseModuleClass *) klass)->generate_delegate_declaration = (void (*) (ValaCCodeBaseModule *, ValaDelegate*, ValaCCodeFile*)) vala_ccode_delegate_module_real_generate_delegate_declaration;
	((ValaCodeVisitorClass *) klass)->visit_delegate = (void (*) (ValaCodeVisitor *, ValaDelegate*)) vala_ccode_delegate_module_real_visit_delegate;
	((ValaCCodeBaseModuleClass *) klass)->get_delegate_target_cname = (gchar* (*) (ValaCCodeBaseModule *, const gchar*)) vala_ccode_delegate_module_real_get_delegate_target_cname;
	((ValaCCodeBaseModuleClass *) klass)->get_delegate_target_cexpression = (ValaCCodeExpression* (*) (ValaCCodeBaseModule *, ValaExpression*, ValaCCodeExpression* *)) vala_ccode_delegate_module_real_get_delegate_target_cexpression;
	((ValaCCodeBaseModuleClass *) klass)->get_delegate_target_cvalue = (ValaCCodeExpression* (*) (ValaCCodeBaseModule *, ValaTargetValue*)) vala_ccode_delegate_module_real_get_delegate_target_cvalue;
	((ValaCCodeBaseModuleClass *) klass)->get_delegate_target_destroy_notify_cvalue = (ValaCCodeExpression* (*) (ValaCCodeBaseModule *, ValaTargetValue*)) vala_ccode_delegate_module_real_get_delegate_target_destroy_notify_cvalue;
	((ValaCCodeBaseModuleClass *) klass)->get_delegate_target_destroy_notify_cname = (gchar* (*) (ValaCCodeBaseModule *, const gchar*)) vala_ccode_delegate_module_real_get_delegate_target_destroy_notify_cname;
	((ValaCCodeBaseModuleClass *) klass)->get_implicit_cast_expression = (ValaCCodeExpression* (*) (ValaCCodeBaseModule *, ValaCCodeExpression*, ValaDataType*, ValaDataType*, ValaCodeNode*)) vala_ccode_delegate_module_real_get_implicit_cast_expression;
	((ValaCCodeMethodModuleClass *) klass)->generate_parameter = (ValaCCodeParameter* (*) (ValaCCodeMethodModule *, ValaParameter*, ValaCCodeFile*, ValaMap*, ValaMap*)) vala_ccode_delegate_module_real_generate_parameter;
}


static void vala_ccode_delegate_module_instance_init (ValaCCodeDelegateModule * self) {
}


/**
 * The link between an assignment and generated code.
 */
GType vala_ccode_delegate_module_get_type (void) {
	static volatile gsize vala_ccode_delegate_module_type_id__volatile = 0;
	if (g_once_init_enter (&vala_ccode_delegate_module_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (ValaCCodeDelegateModuleClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_ccode_delegate_module_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaCCodeDelegateModule), 0, (GInstanceInitFunc) vala_ccode_delegate_module_instance_init, NULL };
		GType vala_ccode_delegate_module_type_id;
		vala_ccode_delegate_module_type_id = g_type_register_static (VALA_TYPE_CCODE_ARRAY_MODULE, "ValaCCodeDelegateModule", &g_define_type_info, 0);
		g_once_init_leave (&vala_ccode_delegate_module_type_id__volatile, vala_ccode_delegate_module_type_id);
	}
	return vala_ccode_delegate_module_type_id__volatile;
}



