1 /* valalambdaexpression.c generated by valac, the Vala compiler
2  * generated from valalambdaexpression.vala, do not modify */
3 
4 /* valalambdaexpression.vala
5  *
6  * Copyright (C) 2006-2010  Jürg Billeter
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12 
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17 
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
21  *
22  * Author:
23  * 	Jürg Billeter <j@bitron.ch>
24  */
25 
26 #include "vala.h"
27 #include <valagee.h>
28 #include <glib-object.h>
29 #include <glib.h>
30 #include <stdlib.h>
31 #include <string.h>
32 
33 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
34 #define _vala_iterable_unref0(var) ((var == NULL) ? NULL : (var = (vala_iterable_unref (var), NULL)))
35 #define _g_free0(var) (var = (g_free (var), NULL))
36 #define _vala_iterator_unref0(var) ((var == NULL) ? NULL : (var = (vala_iterator_unref (var), NULL)))
37 
38 struct _ValaLambdaExpressionPrivate {
39 	ValaMethod* _method;
40 	ValaList* parameters;
41 	ValaBlock* _statement_body;
42 	ValaExpression* _expression_body;
43 };
44 
45 static gint ValaLambdaExpression_private_offset;
46 static gpointer vala_lambda_expression_parent_class = NULL;
47 static gint vala_lambda_expression_next_lambda_id;
48 static gint vala_lambda_expression_next_lambda_id = 0;
49 
50 static void vala_lambda_expression_real_accept (ValaCodeNode* base,
51                                          ValaCodeVisitor* visitor);
52 static void vala_lambda_expression_real_accept_children (ValaCodeNode* base,
53                                                   ValaCodeVisitor* visitor);
54 static gboolean vala_lambda_expression_real_is_pure (ValaExpression* base);
55 static gboolean vala_lambda_expression_real_check (ValaCodeNode* base,
56                                             ValaCodeContext* context);
57 static void vala_lambda_expression_real_emit (ValaCodeNode* base,
58                                        ValaCodeGenerator* codegen);
59 static void vala_lambda_expression_real_get_used_variables (ValaCodeNode* base,
60                                                      ValaCollection* collection);
61 static void vala_lambda_expression_finalize (ValaCodeNode * obj);
62 static GType vala_lambda_expression_get_type_once (void);
63 
64 static inline gpointer
vala_lambda_expression_get_instance_private(ValaLambdaExpression * self)65 vala_lambda_expression_get_instance_private (ValaLambdaExpression* self)
66 {
67 	return G_STRUCT_MEMBER_P (self, ValaLambdaExpression_private_offset);
68 }
69 
70 ValaExpression*
vala_lambda_expression_get_expression_body(ValaLambdaExpression * self)71 vala_lambda_expression_get_expression_body (ValaLambdaExpression* self)
72 {
73 	ValaExpression* result;
74 	ValaExpression* _tmp0_;
75 	g_return_val_if_fail (self != NULL, NULL);
76 	_tmp0_ = self->priv->_expression_body;
77 	result = _tmp0_;
78 	return result;
79 }
80 
81 static gpointer
_vala_code_node_ref0(gpointer self)82 _vala_code_node_ref0 (gpointer self)
83 {
84 	return self ? vala_code_node_ref (self) : NULL;
85 }
86 
87 void
vala_lambda_expression_set_expression_body(ValaLambdaExpression * self,ValaExpression * value)88 vala_lambda_expression_set_expression_body (ValaLambdaExpression* self,
89                                             ValaExpression* value)
90 {
91 	ValaExpression* _tmp0_;
92 	ValaExpression* _tmp1_;
93 	g_return_if_fail (self != NULL);
94 	_tmp0_ = _vala_code_node_ref0 (value);
95 	_vala_code_node_unref0 (self->priv->_expression_body);
96 	self->priv->_expression_body = _tmp0_;
97 	_tmp1_ = self->priv->_expression_body;
98 	if (_tmp1_ != NULL) {
99 		ValaExpression* _tmp2_;
100 		_tmp2_ = self->priv->_expression_body;
101 		vala_code_node_set_parent_node ((ValaCodeNode*) _tmp2_, (ValaCodeNode*) self);
102 	}
103 }
104 
105 ValaBlock*
vala_lambda_expression_get_statement_body(ValaLambdaExpression * self)106 vala_lambda_expression_get_statement_body (ValaLambdaExpression* self)
107 {
108 	ValaBlock* result;
109 	ValaBlock* _tmp0_;
110 	g_return_val_if_fail (self != NULL, NULL);
111 	_tmp0_ = self->priv->_statement_body;
112 	result = _tmp0_;
113 	return result;
114 }
115 
116 void
vala_lambda_expression_set_statement_body(ValaLambdaExpression * self,ValaBlock * value)117 vala_lambda_expression_set_statement_body (ValaLambdaExpression* self,
118                                            ValaBlock* value)
119 {
120 	ValaBlock* _tmp0_;
121 	ValaBlock* _tmp1_;
122 	g_return_if_fail (self != NULL);
123 	_tmp0_ = _vala_code_node_ref0 (value);
124 	_vala_code_node_unref0 (self->priv->_statement_body);
125 	self->priv->_statement_body = _tmp0_;
126 	_tmp1_ = self->priv->_statement_body;
127 	if (_tmp1_ != NULL) {
128 		ValaBlock* _tmp2_;
129 		_tmp2_ = self->priv->_statement_body;
130 		vala_code_node_set_parent_node ((ValaCodeNode*) _tmp2_, (ValaCodeNode*) self);
131 	}
132 }
133 
134 ValaMethod*
vala_lambda_expression_get_method(ValaLambdaExpression * self)135 vala_lambda_expression_get_method (ValaLambdaExpression* self)
136 {
137 	ValaMethod* result;
138 	ValaMethod* _tmp0_;
139 	g_return_val_if_fail (self != NULL, NULL);
140 	_tmp0_ = self->priv->_method;
141 	result = _tmp0_;
142 	return result;
143 }
144 
145 void
vala_lambda_expression_set_method(ValaLambdaExpression * self,ValaMethod * value)146 vala_lambda_expression_set_method (ValaLambdaExpression* self,
147                                    ValaMethod* value)
148 {
149 	ValaMethod* _tmp0_;
150 	g_return_if_fail (self != NULL);
151 	_tmp0_ = _vala_code_node_ref0 (value);
152 	_vala_code_node_unref0 (self->priv->_method);
153 	self->priv->_method = _tmp0_;
154 }
155 
156 /**
157  * Creates a new lambda expression.
158  *
159  * @param expression_body  expression body
160  * @param source_reference reference to source code
161  * @return                 newly created lambda expression
162  */
163 ValaLambdaExpression*
vala_lambda_expression_construct(GType object_type,ValaExpression * expression_body,ValaSourceReference * source_reference)164 vala_lambda_expression_construct (GType object_type,
165                                   ValaExpression* expression_body,
166                                   ValaSourceReference* source_reference)
167 {
168 	ValaLambdaExpression* self = NULL;
169 	g_return_val_if_fail (expression_body != NULL, NULL);
170 	self = (ValaLambdaExpression*) vala_expression_construct (object_type);
171 	vala_code_node_set_source_reference ((ValaCodeNode*) self, source_reference);
172 	vala_lambda_expression_set_expression_body (self, expression_body);
173 	return self;
174 }
175 
176 ValaLambdaExpression*
vala_lambda_expression_new(ValaExpression * expression_body,ValaSourceReference * source_reference)177 vala_lambda_expression_new (ValaExpression* expression_body,
178                             ValaSourceReference* source_reference)
179 {
180 	return vala_lambda_expression_construct (VALA_TYPE_LAMBDA_EXPRESSION, expression_body, source_reference);
181 }
182 
183 /**
184  * Creates a new lambda expression with statement body.
185  *
186  * @param statement_body   statement body
187  * @param source_reference reference to source code
188  * @return                 newly created lambda expression
189  */
190 ValaLambdaExpression*
vala_lambda_expression_construct_with_statement_body(GType object_type,ValaBlock * statement_body,ValaSourceReference * source_reference)191 vala_lambda_expression_construct_with_statement_body (GType object_type,
192                                                       ValaBlock* statement_body,
193                                                       ValaSourceReference* source_reference)
194 {
195 	ValaLambdaExpression* self = NULL;
196 	g_return_val_if_fail (statement_body != NULL, NULL);
197 	self = (ValaLambdaExpression*) vala_expression_construct (object_type);
198 	vala_lambda_expression_set_statement_body (self, statement_body);
199 	vala_code_node_set_source_reference ((ValaCodeNode*) self, source_reference);
200 	return self;
201 }
202 
203 ValaLambdaExpression*
vala_lambda_expression_new_with_statement_body(ValaBlock * statement_body,ValaSourceReference * source_reference)204 vala_lambda_expression_new_with_statement_body (ValaBlock* statement_body,
205                                                 ValaSourceReference* source_reference)
206 {
207 	return vala_lambda_expression_construct_with_statement_body (VALA_TYPE_LAMBDA_EXPRESSION, statement_body, source_reference);
208 }
209 
210 /**
211  * Appends implicitly typed parameter.
212  *
213  * @param param parameter name
214  */
215 void
vala_lambda_expression_add_parameter(ValaLambdaExpression * self,ValaParameter * param)216 vala_lambda_expression_add_parameter (ValaLambdaExpression* self,
217                                       ValaParameter* param)
218 {
219 	ValaList* _tmp0_;
220 	g_return_if_fail (self != NULL);
221 	g_return_if_fail (param != NULL);
222 	_tmp0_ = self->priv->parameters;
223 	vala_collection_add ((ValaCollection*) _tmp0_, param);
224 }
225 
226 /**
227  * Returns the parameter list.
228  *
229  * @return parameter list
230  */
231 ValaList*
vala_lambda_expression_get_parameters(ValaLambdaExpression * self)232 vala_lambda_expression_get_parameters (ValaLambdaExpression* self)
233 {
234 	ValaList* _tmp0_;
235 	ValaList* result = NULL;
236 	g_return_val_if_fail (self != NULL, NULL);
237 	_tmp0_ = self->priv->parameters;
238 	result = _tmp0_;
239 	return result;
240 }
241 
242 static void
vala_lambda_expression_real_accept(ValaCodeNode * base,ValaCodeVisitor * visitor)243 vala_lambda_expression_real_accept (ValaCodeNode* base,
244                                     ValaCodeVisitor* visitor)
245 {
246 	ValaLambdaExpression * self;
247 	self = (ValaLambdaExpression*) base;
248 	g_return_if_fail (visitor != NULL);
249 	vala_code_visitor_visit_lambda_expression (visitor, self);
250 	vala_code_visitor_visit_expression (visitor, (ValaExpression*) self);
251 }
252 
253 static void
vala_lambda_expression_real_accept_children(ValaCodeNode * base,ValaCodeVisitor * visitor)254 vala_lambda_expression_real_accept_children (ValaCodeNode* base,
255                                              ValaCodeVisitor* visitor)
256 {
257 	ValaLambdaExpression * self;
258 	ValaMethod* _tmp0_;
259 	self = (ValaLambdaExpression*) base;
260 	g_return_if_fail (visitor != NULL);
261 	_tmp0_ = self->priv->_method;
262 	if (_tmp0_ == NULL) {
263 		ValaExpression* _tmp1_;
264 		ValaExpression* _tmp2_;
265 		_tmp1_ = vala_lambda_expression_get_expression_body (self);
266 		_tmp2_ = _tmp1_;
267 		if (_tmp2_ != NULL) {
268 			ValaExpression* _tmp3_;
269 			ValaExpression* _tmp4_;
270 			ValaExpression* _tmp5_;
271 			ValaExpression* _tmp6_;
272 			_tmp3_ = vala_lambda_expression_get_expression_body (self);
273 			_tmp4_ = _tmp3_;
274 			vala_code_node_accept ((ValaCodeNode*) _tmp4_, visitor);
275 			_tmp5_ = vala_lambda_expression_get_expression_body (self);
276 			_tmp6_ = _tmp5_;
277 			vala_code_visitor_visit_end_full_expression (visitor, _tmp6_);
278 		} else {
279 			ValaBlock* _tmp7_;
280 			ValaBlock* _tmp8_;
281 			_tmp7_ = vala_lambda_expression_get_statement_body (self);
282 			_tmp8_ = _tmp7_;
283 			if (_tmp8_ != NULL) {
284 				ValaBlock* _tmp9_;
285 				ValaBlock* _tmp10_;
286 				_tmp9_ = vala_lambda_expression_get_statement_body (self);
287 				_tmp10_ = _tmp9_;
288 				vala_code_node_accept ((ValaCodeNode*) _tmp10_, visitor);
289 			}
290 		}
291 	} else {
292 		ValaMethod* _tmp11_;
293 		_tmp11_ = self->priv->_method;
294 		vala_code_node_accept ((ValaCodeNode*) _tmp11_, visitor);
295 	}
296 }
297 
298 static gboolean
vala_lambda_expression_real_is_pure(ValaExpression * base)299 vala_lambda_expression_real_is_pure (ValaExpression* base)
300 {
301 	ValaLambdaExpression * self;
302 	gboolean result = FALSE;
303 	self = (ValaLambdaExpression*) base;
304 	result = FALSE;
305 	return result;
306 }
307 
308 static gpointer
_vala_iterable_ref0(gpointer self)309 _vala_iterable_ref0 (gpointer self)
310 {
311 	return self ? vala_iterable_ref (self) : NULL;
312 }
313 
314 static gboolean
vala_lambda_expression_real_check(ValaCodeNode * base,ValaCodeContext * context)315 vala_lambda_expression_real_check (ValaCodeNode* base,
316                                    ValaCodeContext* context)
317 {
318 	ValaLambdaExpression * self;
319 	gboolean _tmp0_;
320 	gboolean _tmp1_;
321 	ValaDataType* _tmp4_;
322 	ValaDataType* _tmp5_;
323 	ValaDelegate* cb = NULL;
324 	ValaDataType* _tmp18_;
325 	ValaDataType* _tmp19_;
326 	ValaDelegate* _tmp20_;
327 	ValaDelegate* _tmp21_;
328 	ValaDelegate* _tmp22_;
329 	ValaDataType* return_type = NULL;
330 	ValaDelegate* _tmp23_;
331 	ValaDataType* _tmp24_;
332 	ValaDataType* _tmp25_;
333 	ValaDataType* _tmp26_;
334 	ValaDataType* _tmp27_;
335 	ValaDataType* _tmp28_;
336 	gint _tmp29_;
337 	gchar* _tmp30_;
338 	gchar* _tmp31_;
339 	ValaDataType* _tmp32_;
340 	ValaSourceReference* _tmp33_;
341 	ValaSourceReference* _tmp34_;
342 	ValaMethod* _tmp35_;
343 	ValaMethod* _tmp36_;
344 	ValaMethod* _tmp37_;
345 	ValaDataType* _tmp38_;
346 	gboolean _tmp48_ = FALSE;
347 	ValaDelegate* _tmp49_;
348 	gboolean _tmp50_;
349 	gboolean _tmp51_;
350 	ValaMethod* _tmp95_;
351 	ValaSemanticAnalyzer* _tmp96_;
352 	ValaSemanticAnalyzer* _tmp97_;
353 	ValaSymbol* _tmp98_;
354 	ValaSymbol* _tmp99_;
355 	ValaScope* _tmp100_;
356 	ValaScope* _tmp101_;
357 	ValaMethod* _tmp102_;
358 	ValaList* lambda_params = NULL;
359 	ValaList* _tmp103_;
360 	ValaList* _tmp104_;
361 	ValaIterator* lambda_param_it = NULL;
362 	ValaList* _tmp105_;
363 	ValaIterator* _tmp106_;
364 	gboolean _tmp107_ = FALSE;
365 	ValaDelegate* _tmp108_;
366 	ValaDataType* _tmp109_;
367 	ValaDataType* _tmp110_;
368 	ValaIterator* _tmp166_;
369 	ValaArrayList* error_types = NULL;
370 	GEqualFunc _tmp169_;
371 	ValaArrayList* _tmp170_;
372 	ValaDelegate* _tmp171_;
373 	ValaArrayList* _tmp172_;
374 	ValaExpression* _tmp186_;
375 	ValaExpression* _tmp187_;
376 	ValaMethod* _tmp221_;
377 	ValaBlock* _tmp222_;
378 	ValaBlock* _tmp223_;
379 	ValaMethod* _tmp224_;
380 	ValaScope* _tmp225_;
381 	ValaScope* _tmp226_;
382 	ValaMethod* m = NULL;
383 	ValaSemanticAnalyzer* _tmp227_;
384 	ValaSemanticAnalyzer* _tmp228_;
385 	ValaSymbol* _tmp229_;
386 	ValaSymbol* _tmp230_;
387 	ValaMethod* _tmp231_;
388 	ValaMethod* _tmp232_;
389 	ValaMethod* _tmp256_;
390 	ValaMethod* _tmp257_;
391 	ValaMethod* _tmp258_;
392 	ValaMethodType* _tmp259_;
393 	ValaMethodType* _tmp260_;
394 	ValaDataType* _tmp261_;
395 	ValaDataType* _tmp262_;
396 	ValaDataType* _tmp263_;
397 	ValaDataType* _tmp264_;
398 	gboolean _tmp265_;
399 	gboolean _tmp266_;
400 	gboolean _tmp267_;
401 	gboolean _tmp268_;
402 	gboolean result = FALSE;
403 	self = (ValaLambdaExpression*) base;
404 	g_return_val_if_fail (context != NULL, FALSE);
405 	_tmp0_ = vala_code_node_get_checked ((ValaCodeNode*) self);
406 	_tmp1_ = _tmp0_;
407 	if (_tmp1_) {
408 		gboolean _tmp2_;
409 		gboolean _tmp3_;
410 		_tmp2_ = vala_code_node_get_error ((ValaCodeNode*) self);
411 		_tmp3_ = _tmp2_;
412 		result = !_tmp3_;
413 		return result;
414 	}
415 	vala_code_node_set_checked ((ValaCodeNode*) self, TRUE);
416 	_tmp4_ = vala_expression_get_target_type ((ValaExpression*) self);
417 	_tmp5_ = _tmp4_;
418 	if (!VALA_IS_DELEGATE_TYPE (_tmp5_)) {
419 		ValaDataType* _tmp6_;
420 		ValaDataType* _tmp7_;
421 		vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
422 		_tmp6_ = vala_expression_get_target_type ((ValaExpression*) self);
423 		_tmp7_ = _tmp6_;
424 		if (_tmp7_ != NULL) {
425 			ValaSourceReference* _tmp8_;
426 			ValaSourceReference* _tmp9_;
427 			ValaDataType* _tmp10_;
428 			ValaDataType* _tmp11_;
429 			gchar* _tmp12_;
430 			gchar* _tmp13_;
431 			gchar* _tmp14_;
432 			gchar* _tmp15_;
433 			_tmp8_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
434 			_tmp9_ = _tmp8_;
435 			_tmp10_ = vala_expression_get_target_type ((ValaExpression*) self);
436 			_tmp11_ = _tmp10_;
437 			_tmp12_ = vala_code_node_to_string ((ValaCodeNode*) _tmp11_);
438 			_tmp13_ = _tmp12_;
439 			_tmp14_ = g_strdup_printf ("Cannot convert lambda expression to `%s'", _tmp13_);
440 			_tmp15_ = _tmp14_;
441 			vala_report_error (_tmp9_, _tmp15_);
442 			_g_free0 (_tmp15_);
443 			_g_free0 (_tmp13_);
444 		} else {
445 			ValaSourceReference* _tmp16_;
446 			ValaSourceReference* _tmp17_;
447 			_tmp16_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
448 			_tmp17_ = _tmp16_;
449 			vala_report_error (_tmp17_, "lambda expression not allowed in this context");
450 		}
451 		result = FALSE;
452 		return result;
453 	}
454 	_tmp18_ = vala_expression_get_target_type ((ValaExpression*) self);
455 	_tmp19_ = _tmp18_;
456 	_tmp20_ = vala_delegate_type_get_delegate_symbol (G_TYPE_CHECK_INSTANCE_CAST (_tmp19_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
457 	_tmp21_ = _tmp20_;
458 	_tmp22_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp21_, VALA_TYPE_DELEGATE, ValaDelegate));
459 	cb = _tmp22_;
460 	_tmp23_ = cb;
461 	_tmp24_ = vala_callable_get_return_type ((ValaCallable*) _tmp23_);
462 	_tmp25_ = _tmp24_;
463 	_tmp26_ = vala_expression_get_target_type ((ValaExpression*) self);
464 	_tmp27_ = _tmp26_;
465 	_tmp28_ = vala_data_type_get_actual_type (_tmp25_, _tmp27_, NULL, (ValaCodeNode*) self);
466 	return_type = _tmp28_;
467 	_tmp29_ = vala_lambda_expression_next_lambda_id;
468 	vala_lambda_expression_next_lambda_id = _tmp29_ + 1;
469 	_tmp30_ = g_strdup_printf ("_lambda%d_", _tmp29_);
470 	_tmp31_ = _tmp30_;
471 	_tmp32_ = return_type;
472 	_tmp33_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
473 	_tmp34_ = _tmp33_;
474 	_tmp35_ = vala_method_new (_tmp31_, _tmp32_, _tmp34_, NULL);
475 	_tmp36_ = _tmp35_;
476 	vala_lambda_expression_set_method (self, _tmp36_);
477 	_vala_code_node_unref0 (_tmp36_);
478 	_g_free0 (_tmp31_);
479 	_tmp37_ = self->priv->_method;
480 	vala_symbol_set_used ((ValaSymbol*) _tmp37_, TRUE);
481 	_tmp38_ = return_type;
482 	if (VALA_IS_ARRAY_TYPE (_tmp38_)) {
483 		ValaMethod* _tmp39_;
484 		ValaDelegate* _tmp40_;
485 		ValaMethod* _tmp41_;
486 		ValaDelegate* _tmp42_;
487 		ValaMethod* _tmp43_;
488 		ValaDelegate* _tmp44_;
489 		_tmp39_ = self->priv->_method;
490 		_tmp40_ = cb;
491 		vala_code_node_copy_attribute_bool ((ValaCodeNode*) _tmp39_, (ValaCodeNode*) _tmp40_, "CCode", "array_length");
492 		_tmp41_ = self->priv->_method;
493 		_tmp42_ = cb;
494 		vala_code_node_copy_attribute_bool ((ValaCodeNode*) _tmp41_, (ValaCodeNode*) _tmp42_, "CCode", "array_null_terminated");
495 		_tmp43_ = self->priv->_method;
496 		_tmp44_ = cb;
497 		vala_code_node_copy_attribute_string ((ValaCodeNode*) _tmp43_, (ValaCodeNode*) _tmp44_, "CCode", "array_length_type");
498 	} else {
499 		ValaDataType* _tmp45_;
500 		_tmp45_ = return_type;
501 		if (VALA_IS_DELEGATE_TYPE (_tmp45_)) {
502 			ValaMethod* _tmp46_;
503 			ValaDelegate* _tmp47_;
504 			_tmp46_ = self->priv->_method;
505 			_tmp47_ = cb;
506 			vala_code_node_copy_attribute_bool ((ValaCodeNode*) _tmp46_, (ValaCodeNode*) _tmp47_, "CCode", "delegate_target");
507 		}
508 	}
509 	_tmp49_ = cb;
510 	_tmp50_ = vala_delegate_get_has_target (_tmp49_);
511 	_tmp51_ = _tmp50_;
512 	if (!_tmp51_) {
513 		_tmp48_ = TRUE;
514 	} else {
515 		ValaSemanticAnalyzer* _tmp52_;
516 		ValaSemanticAnalyzer* _tmp53_;
517 		_tmp52_ = vala_code_context_get_analyzer (context);
518 		_tmp53_ = _tmp52_;
519 		_tmp48_ = !vala_semantic_analyzer_is_in_instance_method (_tmp53_);
520 	}
521 	if (_tmp48_) {
522 		ValaMethod* _tmp54_;
523 		_tmp54_ = self->priv->_method;
524 		vala_method_set_binding (_tmp54_, VALA_MEMBER_BINDING_STATIC);
525 	} else {
526 		ValaSymbol* sym = NULL;
527 		ValaSemanticAnalyzer* _tmp55_;
528 		ValaSemanticAnalyzer* _tmp56_;
529 		ValaSymbol* _tmp57_;
530 		ValaSymbol* _tmp58_;
531 		ValaSymbol* _tmp59_;
532 		_tmp55_ = vala_code_context_get_analyzer (context);
533 		_tmp56_ = _tmp55_;
534 		_tmp57_ = vala_semantic_analyzer_get_current_symbol (_tmp56_);
535 		_tmp58_ = _tmp57_;
536 		_tmp59_ = _vala_code_node_ref0 (_tmp58_);
537 		sym = _tmp59_;
538 		while (TRUE) {
539 			ValaMethod* _tmp60_;
540 			ValaParameter* _tmp61_;
541 			ValaParameter* _tmp62_;
542 			ValaSymbol* _tmp63_;
543 			ValaSymbol* _tmp91_;
544 			ValaSymbol* _tmp92_;
545 			ValaSymbol* _tmp93_;
546 			ValaSymbol* _tmp94_;
547 			_tmp60_ = self->priv->_method;
548 			_tmp61_ = vala_method_get_this_parameter (_tmp60_);
549 			_tmp62_ = _tmp61_;
550 			if (!(_tmp62_ == NULL)) {
551 				break;
552 			}
553 			_tmp63_ = sym;
554 			if (VALA_IS_PROPERTY (_tmp63_)) {
555 				ValaProperty* prop = NULL;
556 				ValaSymbol* _tmp64_;
557 				ValaProperty* _tmp65_;
558 				ValaMethod* _tmp66_;
559 				ValaProperty* _tmp67_;
560 				ValaParameter* _tmp68_;
561 				ValaParameter* _tmp69_;
562 				_tmp64_ = sym;
563 				_tmp65_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp64_, VALA_TYPE_PROPERTY, ValaProperty));
564 				prop = _tmp65_;
565 				_tmp66_ = self->priv->_method;
566 				_tmp67_ = prop;
567 				_tmp68_ = vala_property_get_this_parameter (_tmp67_);
568 				_tmp69_ = _tmp68_;
569 				vala_method_set_this_parameter (_tmp66_, _tmp69_);
570 				_vala_code_node_unref0 (prop);
571 			} else {
572 				ValaSymbol* _tmp70_;
573 				_tmp70_ = sym;
574 				if (VALA_IS_CONSTRUCTOR (_tmp70_)) {
575 					ValaConstructor* c = NULL;
576 					ValaSymbol* _tmp71_;
577 					ValaConstructor* _tmp72_;
578 					ValaMethod* _tmp73_;
579 					ValaConstructor* _tmp74_;
580 					ValaParameter* _tmp75_;
581 					ValaParameter* _tmp76_;
582 					_tmp71_ = sym;
583 					_tmp72_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp71_, VALA_TYPE_CONSTRUCTOR, ValaConstructor));
584 					c = _tmp72_;
585 					_tmp73_ = self->priv->_method;
586 					_tmp74_ = c;
587 					_tmp75_ = vala_constructor_get_this_parameter (_tmp74_);
588 					_tmp76_ = _tmp75_;
589 					vala_method_set_this_parameter (_tmp73_, _tmp76_);
590 					_vala_code_node_unref0 (c);
591 				} else {
592 					ValaSymbol* _tmp77_;
593 					_tmp77_ = sym;
594 					if (VALA_IS_DESTRUCTOR (_tmp77_)) {
595 						ValaDestructor* d = NULL;
596 						ValaSymbol* _tmp78_;
597 						ValaDestructor* _tmp79_;
598 						ValaMethod* _tmp80_;
599 						ValaDestructor* _tmp81_;
600 						ValaParameter* _tmp82_;
601 						ValaParameter* _tmp83_;
602 						_tmp78_ = sym;
603 						_tmp79_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp78_, VALA_TYPE_DESTRUCTOR, ValaDestructor));
604 						d = _tmp79_;
605 						_tmp80_ = self->priv->_method;
606 						_tmp81_ = d;
607 						_tmp82_ = vala_destructor_get_this_parameter (_tmp81_);
608 						_tmp83_ = _tmp82_;
609 						vala_method_set_this_parameter (_tmp80_, _tmp83_);
610 						_vala_code_node_unref0 (d);
611 					} else {
612 						ValaSymbol* _tmp84_;
613 						_tmp84_ = sym;
614 						if (VALA_IS_METHOD (_tmp84_)) {
615 							ValaMethod* m = NULL;
616 							ValaSymbol* _tmp85_;
617 							ValaMethod* _tmp86_;
618 							ValaMethod* _tmp87_;
619 							ValaMethod* _tmp88_;
620 							ValaParameter* _tmp89_;
621 							ValaParameter* _tmp90_;
622 							_tmp85_ = sym;
623 							_tmp86_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp85_, VALA_TYPE_METHOD, ValaMethod));
624 							m = _tmp86_;
625 							_tmp87_ = self->priv->_method;
626 							_tmp88_ = m;
627 							_tmp89_ = vala_method_get_this_parameter (_tmp88_);
628 							_tmp90_ = _tmp89_;
629 							vala_method_set_this_parameter (_tmp87_, _tmp90_);
630 							_vala_code_node_unref0 (m);
631 						}
632 					}
633 				}
634 			}
635 			_tmp91_ = sym;
636 			_tmp92_ = vala_symbol_get_parent_symbol (_tmp91_);
637 			_tmp93_ = _tmp92_;
638 			_tmp94_ = _vala_code_node_ref0 (_tmp93_);
639 			_vala_code_node_unref0 (sym);
640 			sym = _tmp94_;
641 		}
642 		_vala_code_node_unref0 (sym);
643 	}
644 	_tmp95_ = self->priv->_method;
645 	_tmp96_ = vala_code_context_get_analyzer (context);
646 	_tmp97_ = _tmp96_;
647 	_tmp98_ = vala_semantic_analyzer_get_current_symbol (_tmp97_);
648 	_tmp99_ = _tmp98_;
649 	_tmp100_ = vala_symbol_get_scope (_tmp99_);
650 	_tmp101_ = _tmp100_;
651 	vala_symbol_set_owner ((ValaSymbol*) _tmp95_, _tmp101_);
652 	_tmp102_ = self->priv->_method;
653 	vala_code_node_set_parent_node ((ValaCodeNode*) _tmp102_, (ValaCodeNode*) self);
654 	_tmp103_ = vala_lambda_expression_get_parameters (self);
655 	_tmp104_ = _vala_iterable_ref0 (_tmp103_);
656 	lambda_params = _tmp104_;
657 	_tmp105_ = lambda_params;
658 	_tmp106_ = vala_iterable_iterator ((ValaIterable*) _tmp105_);
659 	lambda_param_it = _tmp106_;
660 	_tmp108_ = cb;
661 	_tmp109_ = vala_delegate_get_sender_type (_tmp108_);
662 	_tmp110_ = _tmp109_;
663 	if (_tmp110_ != NULL) {
664 		ValaList* _tmp111_;
665 		gint _tmp112_;
666 		gint _tmp113_;
667 		ValaDelegate* _tmp114_;
668 		ValaList* _tmp115_;
669 		gint _tmp116_;
670 		gint _tmp117_;
671 		_tmp111_ = lambda_params;
672 		_tmp112_ = vala_collection_get_size ((ValaCollection*) _tmp111_);
673 		_tmp113_ = _tmp112_;
674 		_tmp114_ = cb;
675 		_tmp115_ = vala_callable_get_parameters ((ValaCallable*) _tmp114_);
676 		_tmp116_ = vala_collection_get_size ((ValaCollection*) _tmp115_);
677 		_tmp117_ = _tmp116_;
678 		_tmp107_ = _tmp113_ == (_tmp117_ + 1);
679 	} else {
680 		_tmp107_ = FALSE;
681 	}
682 	if (_tmp107_) {
683 		ValaIterator* _tmp118_;
684 		ValaParameter* lambda_param = NULL;
685 		ValaIterator* _tmp119_;
686 		gpointer _tmp120_;
687 		ValaParameter* _tmp121_;
688 		ValaDelegate* _tmp122_;
689 		ValaDataType* _tmp123_;
690 		ValaDataType* _tmp124_;
691 		ValaMethod* _tmp125_;
692 		ValaParameter* _tmp126_;
693 		_tmp118_ = lambda_param_it;
694 		vala_iterator_next (_tmp118_);
695 		_tmp119_ = lambda_param_it;
696 		_tmp120_ = vala_iterator_get (_tmp119_);
697 		lambda_param = (ValaParameter*) _tmp120_;
698 		_tmp121_ = lambda_param;
699 		_tmp122_ = cb;
700 		_tmp123_ = vala_delegate_get_sender_type (_tmp122_);
701 		_tmp124_ = _tmp123_;
702 		vala_variable_set_variable_type ((ValaVariable*) _tmp121_, _tmp124_);
703 		_tmp125_ = self->priv->_method;
704 		_tmp126_ = lambda_param;
705 		vala_callable_add_parameter ((ValaCallable*) _tmp125_, _tmp126_);
706 		_vala_code_node_unref0 (lambda_param);
707 	}
708 	{
709 		ValaList* _cb_param_list = NULL;
710 		ValaDelegate* _tmp127_;
711 		ValaList* _tmp128_;
712 		ValaList* _tmp129_;
713 		gint _cb_param_size = 0;
714 		ValaList* _tmp130_;
715 		gint _tmp131_;
716 		gint _tmp132_;
717 		gint _cb_param_index = 0;
718 		_tmp127_ = cb;
719 		_tmp128_ = vala_callable_get_parameters ((ValaCallable*) _tmp127_);
720 		_tmp129_ = _vala_iterable_ref0 (_tmp128_);
721 		_cb_param_list = _tmp129_;
722 		_tmp130_ = _cb_param_list;
723 		_tmp131_ = vala_collection_get_size ((ValaCollection*) _tmp130_);
724 		_tmp132_ = _tmp131_;
725 		_cb_param_size = _tmp132_;
726 		_cb_param_index = -1;
727 		while (TRUE) {
728 			gint _tmp133_;
729 			gint _tmp134_;
730 			ValaParameter* cb_param = NULL;
731 			ValaList* _tmp135_;
732 			gpointer _tmp136_;
733 			ValaIterator* _tmp137_;
734 			ValaParameter* lambda_param = NULL;
735 			ValaIterator* _tmp138_;
736 			gpointer _tmp139_;
737 			ValaParameter* _tmp140_;
738 			ValaParameterDirection _tmp141_;
739 			ValaParameterDirection _tmp142_;
740 			ValaParameter* _tmp143_;
741 			ValaParameterDirection _tmp144_;
742 			ValaParameterDirection _tmp145_;
743 			ValaParameter* _tmp154_;
744 			ValaParameter* _tmp155_;
745 			ValaDataType* _tmp156_;
746 			ValaDataType* _tmp157_;
747 			ValaDataType* _tmp158_;
748 			ValaDataType* _tmp159_;
749 			ValaDataType* _tmp160_;
750 			ValaDataType* _tmp161_;
751 			ValaParameter* _tmp162_;
752 			ValaParameter* _tmp163_;
753 			ValaMethod* _tmp164_;
754 			ValaParameter* _tmp165_;
755 			_cb_param_index = _cb_param_index + 1;
756 			_tmp133_ = _cb_param_index;
757 			_tmp134_ = _cb_param_size;
758 			if (!(_tmp133_ < _tmp134_)) {
759 				break;
760 			}
761 			_tmp135_ = _cb_param_list;
762 			_tmp136_ = vala_list_get (_tmp135_, _cb_param_index);
763 			cb_param = (ValaParameter*) _tmp136_;
764 			_tmp137_ = lambda_param_it;
765 			if (!vala_iterator_next (_tmp137_)) {
766 				_vala_code_node_unref0 (cb_param);
767 				break;
768 			}
769 			_tmp138_ = lambda_param_it;
770 			_tmp139_ = vala_iterator_get (_tmp138_);
771 			lambda_param = (ValaParameter*) _tmp139_;
772 			_tmp140_ = lambda_param;
773 			_tmp141_ = vala_parameter_get_direction (_tmp140_);
774 			_tmp142_ = _tmp141_;
775 			_tmp143_ = cb_param;
776 			_tmp144_ = vala_parameter_get_direction (_tmp143_);
777 			_tmp145_ = _tmp144_;
778 			if (_tmp142_ != _tmp145_) {
779 				ValaParameter* _tmp146_;
780 				ValaSourceReference* _tmp147_;
781 				ValaSourceReference* _tmp148_;
782 				ValaParameter* _tmp149_;
783 				const gchar* _tmp150_;
784 				const gchar* _tmp151_;
785 				gchar* _tmp152_;
786 				gchar* _tmp153_;
787 				vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
788 				_tmp146_ = lambda_param;
789 				_tmp147_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp146_);
790 				_tmp148_ = _tmp147_;
791 				_tmp149_ = lambda_param;
792 				_tmp150_ = vala_symbol_get_name ((ValaSymbol*) _tmp149_);
793 				_tmp151_ = _tmp150_;
794 				_tmp152_ = g_strdup_printf ("direction of parameter `%s' is incompatible with the target delegate", _tmp151_);
795 				_tmp153_ = _tmp152_;
796 				vala_report_error (_tmp148_, _tmp153_);
797 				_g_free0 (_tmp153_);
798 			}
799 			_tmp154_ = lambda_param;
800 			_tmp155_ = cb_param;
801 			_tmp156_ = vala_variable_get_variable_type ((ValaVariable*) _tmp155_);
802 			_tmp157_ = _tmp156_;
803 			_tmp158_ = vala_expression_get_target_type ((ValaExpression*) self);
804 			_tmp159_ = _tmp158_;
805 			_tmp160_ = vala_data_type_get_actual_type (_tmp157_, _tmp159_, NULL, (ValaCodeNode*) self);
806 			_tmp161_ = _tmp160_;
807 			vala_variable_set_variable_type ((ValaVariable*) _tmp154_, _tmp161_);
808 			_vala_code_node_unref0 (_tmp161_);
809 			_tmp162_ = lambda_param;
810 			_tmp163_ = cb_param;
811 			vala_parameter_set_base_parameter (_tmp162_, _tmp163_);
812 			_tmp164_ = self->priv->_method;
813 			_tmp165_ = lambda_param;
814 			vala_callable_add_parameter ((ValaCallable*) _tmp164_, _tmp165_);
815 			_vala_code_node_unref0 (lambda_param);
816 			_vala_code_node_unref0 (cb_param);
817 		}
818 		_vala_iterable_unref0 (_cb_param_list);
819 	}
820 	_tmp166_ = lambda_param_it;
821 	if (vala_iterator_next (_tmp166_)) {
822 		ValaSourceReference* _tmp167_;
823 		ValaSourceReference* _tmp168_;
824 		vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
825 		_tmp167_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
826 		_tmp168_ = _tmp167_;
827 		vala_report_error (_tmp168_, "lambda expression: too many parameters");
828 		result = FALSE;
829 		_vala_iterator_unref0 (lambda_param_it);
830 		_vala_iterable_unref0 (lambda_params);
831 		_vala_code_node_unref0 (return_type);
832 		_vala_code_node_unref0 (cb);
833 		return result;
834 	}
835 	_tmp169_ = g_direct_equal;
836 	_tmp170_ = vala_array_list_new (VALA_TYPE_DATA_TYPE, (GBoxedCopyFunc) vala_code_node_ref, (GDestroyNotify) vala_code_node_unref, _tmp169_);
837 	error_types = _tmp170_;
838 	_tmp171_ = cb;
839 	_tmp172_ = error_types;
840 	vala_code_node_get_error_types ((ValaCodeNode*) _tmp171_, (ValaCollection*) _tmp172_, NULL);
841 	{
842 		ValaArrayList* _error_type_list = NULL;
843 		ValaArrayList* _tmp173_;
844 		ValaArrayList* _tmp174_;
845 		gint _error_type_size = 0;
846 		ValaArrayList* _tmp175_;
847 		gint _tmp176_;
848 		gint _tmp177_;
849 		gint _error_type_index = 0;
850 		_tmp173_ = error_types;
851 		_tmp174_ = _vala_iterable_ref0 (_tmp173_);
852 		_error_type_list = _tmp174_;
853 		_tmp175_ = _error_type_list;
854 		_tmp176_ = vala_collection_get_size ((ValaCollection*) _tmp175_);
855 		_tmp177_ = _tmp176_;
856 		_error_type_size = _tmp177_;
857 		_error_type_index = -1;
858 		while (TRUE) {
859 			gint _tmp178_;
860 			gint _tmp179_;
861 			ValaDataType* error_type = NULL;
862 			ValaArrayList* _tmp180_;
863 			gpointer _tmp181_;
864 			ValaMethod* _tmp182_;
865 			ValaDataType* _tmp183_;
866 			ValaDataType* _tmp184_;
867 			ValaDataType* _tmp185_;
868 			_error_type_index = _error_type_index + 1;
869 			_tmp178_ = _error_type_index;
870 			_tmp179_ = _error_type_size;
871 			if (!(_tmp178_ < _tmp179_)) {
872 				break;
873 			}
874 			_tmp180_ = _error_type_list;
875 			_tmp181_ = vala_list_get ((ValaList*) _tmp180_, _error_type_index);
876 			error_type = (ValaDataType*) _tmp181_;
877 			_tmp182_ = self->priv->_method;
878 			_tmp183_ = error_type;
879 			_tmp184_ = vala_data_type_copy (_tmp183_);
880 			_tmp185_ = _tmp184_;
881 			vala_method_add_error_type (_tmp182_, _tmp185_);
882 			_vala_code_node_unref0 (_tmp185_);
883 			_vala_code_node_unref0 (error_type);
884 		}
885 		_vala_iterable_unref0 (_error_type_list);
886 	}
887 	_tmp186_ = vala_lambda_expression_get_expression_body (self);
888 	_tmp187_ = _tmp186_;
889 	if (_tmp187_ != NULL) {
890 		ValaBlock* block = NULL;
891 		ValaSourceReference* _tmp188_;
892 		ValaSourceReference* _tmp189_;
893 		ValaBlock* _tmp190_;
894 		ValaBlock* _tmp191_;
895 		ValaScope* _tmp192_;
896 		ValaScope* _tmp193_;
897 		ValaMethod* _tmp194_;
898 		ValaScope* _tmp195_;
899 		ValaScope* _tmp196_;
900 		ValaMethod* _tmp197_;
901 		ValaDataType* _tmp198_;
902 		ValaDataType* _tmp199_;
903 		ValaTypeSymbol* _tmp200_;
904 		ValaTypeSymbol* _tmp201_;
905 		ValaMethod* _tmp216_;
906 		ValaBlock* _tmp217_;
907 		_tmp188_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
908 		_tmp189_ = _tmp188_;
909 		_tmp190_ = vala_block_new (_tmp189_);
910 		block = _tmp190_;
911 		_tmp191_ = block;
912 		_tmp192_ = vala_symbol_get_scope ((ValaSymbol*) _tmp191_);
913 		_tmp193_ = _tmp192_;
914 		_tmp194_ = self->priv->_method;
915 		_tmp195_ = vala_symbol_get_scope ((ValaSymbol*) _tmp194_);
916 		_tmp196_ = _tmp195_;
917 		vala_scope_set_parent_scope (_tmp193_, _tmp196_);
918 		_tmp197_ = self->priv->_method;
919 		_tmp198_ = vala_callable_get_return_type ((ValaCallable*) _tmp197_);
920 		_tmp199_ = _tmp198_;
921 		_tmp200_ = vala_data_type_get_type_symbol (_tmp199_);
922 		_tmp201_ = _tmp200_;
923 		if (_tmp201_ != NULL) {
924 			ValaBlock* _tmp202_;
925 			ValaExpression* _tmp203_;
926 			ValaExpression* _tmp204_;
927 			ValaSourceReference* _tmp205_;
928 			ValaSourceReference* _tmp206_;
929 			ValaReturnStatement* _tmp207_;
930 			ValaReturnStatement* _tmp208_;
931 			_tmp202_ = block;
932 			_tmp203_ = vala_lambda_expression_get_expression_body (self);
933 			_tmp204_ = _tmp203_;
934 			_tmp205_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
935 			_tmp206_ = _tmp205_;
936 			_tmp207_ = vala_return_statement_new (_tmp204_, _tmp206_);
937 			_tmp208_ = _tmp207_;
938 			vala_block_add_statement (_tmp202_, (ValaStatement*) _tmp208_);
939 			_vala_code_node_unref0 (_tmp208_);
940 		} else {
941 			ValaBlock* _tmp209_;
942 			ValaExpression* _tmp210_;
943 			ValaExpression* _tmp211_;
944 			ValaSourceReference* _tmp212_;
945 			ValaSourceReference* _tmp213_;
946 			ValaExpressionStatement* _tmp214_;
947 			ValaExpressionStatement* _tmp215_;
948 			_tmp209_ = block;
949 			_tmp210_ = vala_lambda_expression_get_expression_body (self);
950 			_tmp211_ = _tmp210_;
951 			_tmp212_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
952 			_tmp213_ = _tmp212_;
953 			_tmp214_ = vala_expression_statement_new (_tmp211_, _tmp213_);
954 			_tmp215_ = _tmp214_;
955 			vala_block_add_statement (_tmp209_, (ValaStatement*) _tmp215_);
956 			_vala_code_node_unref0 (_tmp215_);
957 		}
958 		_tmp216_ = self->priv->_method;
959 		_tmp217_ = block;
960 		vala_subroutine_set_body ((ValaSubroutine*) _tmp216_, _tmp217_);
961 		_vala_code_node_unref0 (block);
962 	} else {
963 		ValaMethod* _tmp218_;
964 		ValaBlock* _tmp219_;
965 		ValaBlock* _tmp220_;
966 		_tmp218_ = self->priv->_method;
967 		_tmp219_ = vala_lambda_expression_get_statement_body (self);
968 		_tmp220_ = _tmp219_;
969 		vala_subroutine_set_body ((ValaSubroutine*) _tmp218_, _tmp220_);
970 	}
971 	_tmp221_ = self->priv->_method;
972 	_tmp222_ = vala_subroutine_get_body ((ValaSubroutine*) _tmp221_);
973 	_tmp223_ = _tmp222_;
974 	_tmp224_ = self->priv->_method;
975 	_tmp225_ = vala_symbol_get_scope ((ValaSymbol*) _tmp224_);
976 	_tmp226_ = _tmp225_;
977 	vala_symbol_set_owner ((ValaSymbol*) _tmp223_, _tmp226_);
978 	_tmp227_ = vala_code_context_get_analyzer (context);
979 	_tmp228_ = _tmp227_;
980 	_tmp229_ = vala_semantic_analyzer_get_current_symbol (_tmp228_);
981 	_tmp230_ = _tmp229_;
982 	_tmp231_ = vala_semantic_analyzer_find_parent_method (_tmp230_);
983 	m = _tmp231_;
984 	_tmp232_ = m;
985 	if (_tmp232_ != NULL) {
986 		{
987 			ValaList* _type_param_list = NULL;
988 			ValaMethod* _tmp233_;
989 			ValaList* _tmp234_;
990 			ValaList* _tmp235_;
991 			gint _type_param_size = 0;
992 			ValaList* _tmp236_;
993 			gint _tmp237_;
994 			gint _tmp238_;
995 			gint _type_param_index = 0;
996 			_tmp233_ = m;
997 			_tmp234_ = vala_method_get_type_parameters (_tmp233_);
998 			_tmp235_ = _vala_iterable_ref0 (_tmp234_);
999 			_type_param_list = _tmp235_;
1000 			_tmp236_ = _type_param_list;
1001 			_tmp237_ = vala_collection_get_size ((ValaCollection*) _tmp236_);
1002 			_tmp238_ = _tmp237_;
1003 			_type_param_size = _tmp238_;
1004 			_type_param_index = -1;
1005 			while (TRUE) {
1006 				gint _tmp239_;
1007 				gint _tmp240_;
1008 				ValaTypeParameter* type_param = NULL;
1009 				ValaList* _tmp241_;
1010 				gpointer _tmp242_;
1011 				ValaMethod* _tmp243_;
1012 				ValaTypeParameter* _tmp244_;
1013 				const gchar* _tmp245_;
1014 				const gchar* _tmp246_;
1015 				ValaTypeParameter* _tmp247_;
1016 				ValaSourceReference* _tmp248_;
1017 				ValaSourceReference* _tmp249_;
1018 				ValaTypeParameter* _tmp250_;
1019 				ValaTypeParameter* _tmp251_;
1020 				ValaMethod* _tmp252_;
1021 				ValaMethod* _tmp253_;
1022 				ValaBlock* _tmp254_;
1023 				ValaBlock* _tmp255_;
1024 				_type_param_index = _type_param_index + 1;
1025 				_tmp239_ = _type_param_index;
1026 				_tmp240_ = _type_param_size;
1027 				if (!(_tmp239_ < _tmp240_)) {
1028 					break;
1029 				}
1030 				_tmp241_ = _type_param_list;
1031 				_tmp242_ = vala_list_get (_tmp241_, _type_param_index);
1032 				type_param = (ValaTypeParameter*) _tmp242_;
1033 				_tmp243_ = self->priv->_method;
1034 				_tmp244_ = type_param;
1035 				_tmp245_ = vala_symbol_get_name ((ValaSymbol*) _tmp244_);
1036 				_tmp246_ = _tmp245_;
1037 				_tmp247_ = type_param;
1038 				_tmp248_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp247_);
1039 				_tmp249_ = _tmp248_;
1040 				_tmp250_ = vala_typeparameter_new (_tmp246_, _tmp249_);
1041 				_tmp251_ = _tmp250_;
1042 				vala_method_add_type_parameter (_tmp243_, _tmp251_);
1043 				_vala_code_node_unref0 (_tmp251_);
1044 				_tmp252_ = self->priv->_method;
1045 				vala_method_set_closure (_tmp252_, TRUE);
1046 				_tmp253_ = m;
1047 				_tmp254_ = vala_subroutine_get_body ((ValaSubroutine*) _tmp253_);
1048 				_tmp255_ = _tmp254_;
1049 				vala_block_set_captured (_tmp255_, TRUE);
1050 				_vala_code_node_unref0 (type_param);
1051 			}
1052 			_vala_iterable_unref0 (_type_param_list);
1053 		}
1054 	}
1055 	_tmp256_ = self->priv->_method;
1056 	vala_expression_set_symbol_reference ((ValaExpression*) self, (ValaSymbol*) _tmp256_);
1057 	_tmp257_ = self->priv->_method;
1058 	vala_code_node_check ((ValaCodeNode*) _tmp257_, context);
1059 	_tmp258_ = self->priv->_method;
1060 	_tmp259_ = vala_method_type_new (_tmp258_);
1061 	_tmp260_ = _tmp259_;
1062 	vala_expression_set_value_type ((ValaExpression*) self, (ValaDataType*) _tmp260_);
1063 	_vala_code_node_unref0 (_tmp260_);
1064 	_tmp261_ = vala_expression_get_value_type ((ValaExpression*) self);
1065 	_tmp262_ = _tmp261_;
1066 	_tmp263_ = vala_expression_get_target_type ((ValaExpression*) self);
1067 	_tmp264_ = _tmp263_;
1068 	_tmp265_ = vala_data_type_get_value_owned (_tmp264_);
1069 	_tmp266_ = _tmp265_;
1070 	vala_data_type_set_value_owned (_tmp262_, _tmp266_);
1071 	_tmp267_ = vala_code_node_get_error ((ValaCodeNode*) self);
1072 	_tmp268_ = _tmp267_;
1073 	result = !_tmp268_;
1074 	_vala_iterable_unref0 (error_types);
1075 	_vala_iterator_unref0 (lambda_param_it);
1076 	_vala_iterable_unref0 (lambda_params);
1077 	_vala_code_node_unref0 (return_type);
1078 	_vala_code_node_unref0 (cb);
1079 	return result;
1080 }
1081 
1082 static void
vala_lambda_expression_real_emit(ValaCodeNode * base,ValaCodeGenerator * codegen)1083 vala_lambda_expression_real_emit (ValaCodeNode* base,
1084                                   ValaCodeGenerator* codegen)
1085 {
1086 	ValaLambdaExpression * self;
1087 	self = (ValaLambdaExpression*) base;
1088 	g_return_if_fail (codegen != NULL);
1089 	vala_code_visitor_visit_lambda_expression ((ValaCodeVisitor*) codegen, self);
1090 	vala_code_visitor_visit_expression ((ValaCodeVisitor*) codegen, (ValaExpression*) self);
1091 }
1092 
1093 static void
vala_lambda_expression_real_get_used_variables(ValaCodeNode * base,ValaCollection * collection)1094 vala_lambda_expression_real_get_used_variables (ValaCodeNode* base,
1095                                                 ValaCollection* collection)
1096 {
1097 	ValaLambdaExpression * self;
1098 	gboolean _tmp0_ = FALSE;
1099 	ValaMethod* _tmp1_;
1100 	self = (ValaLambdaExpression*) base;
1101 	g_return_if_fail (collection != NULL);
1102 	_tmp1_ = self->priv->_method;
1103 	if (_tmp1_ != NULL) {
1104 		ValaMethod* _tmp2_;
1105 		gboolean _tmp3_;
1106 		gboolean _tmp4_;
1107 		_tmp2_ = self->priv->_method;
1108 		_tmp3_ = vala_method_get_closure (_tmp2_);
1109 		_tmp4_ = _tmp3_;
1110 		_tmp0_ = _tmp4_;
1111 	} else {
1112 		_tmp0_ = FALSE;
1113 	}
1114 	if (_tmp0_) {
1115 		ValaMethod* _tmp5_;
1116 		_tmp5_ = self->priv->_method;
1117 		vala_method_get_captured_variables (_tmp5_, G_TYPE_CHECK_INSTANCE_CAST (collection, VALA_TYPE_COLLECTION, ValaCollection));
1118 	}
1119 }
1120 
1121 static void
vala_lambda_expression_class_init(ValaLambdaExpressionClass * klass,gpointer klass_data)1122 vala_lambda_expression_class_init (ValaLambdaExpressionClass * klass,
1123                                    gpointer klass_data)
1124 {
1125 	vala_lambda_expression_parent_class = g_type_class_peek_parent (klass);
1126 	((ValaCodeNodeClass *) klass)->finalize = vala_lambda_expression_finalize;
1127 	g_type_class_adjust_private_offset (klass, &ValaLambdaExpression_private_offset);
1128 	((ValaCodeNodeClass *) klass)->accept = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_lambda_expression_real_accept;
1129 	((ValaCodeNodeClass *) klass)->accept_children = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_lambda_expression_real_accept_children;
1130 	((ValaExpressionClass *) klass)->is_pure = (gboolean (*) (ValaExpression*)) vala_lambda_expression_real_is_pure;
1131 	((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_lambda_expression_real_check;
1132 	((ValaCodeNodeClass *) klass)->emit = (void (*) (ValaCodeNode*, ValaCodeGenerator*)) vala_lambda_expression_real_emit;
1133 	((ValaCodeNodeClass *) klass)->get_used_variables = (void (*) (ValaCodeNode*, ValaCollection*)) vala_lambda_expression_real_get_used_variables;
1134 }
1135 
1136 static void
vala_lambda_expression_instance_init(ValaLambdaExpression * self,gpointer klass)1137 vala_lambda_expression_instance_init (ValaLambdaExpression * self,
1138                                       gpointer klass)
1139 {
1140 	GEqualFunc _tmp0_;
1141 	ValaArrayList* _tmp1_;
1142 	self->priv = vala_lambda_expression_get_instance_private (self);
1143 	_tmp0_ = g_direct_equal;
1144 	_tmp1_ = vala_array_list_new (VALA_TYPE_PARAMETER, (GBoxedCopyFunc) vala_code_node_ref, (GDestroyNotify) vala_code_node_unref, _tmp0_);
1145 	self->priv->parameters = (ValaList*) _tmp1_;
1146 }
1147 
1148 static void
vala_lambda_expression_finalize(ValaCodeNode * obj)1149 vala_lambda_expression_finalize (ValaCodeNode * obj)
1150 {
1151 	ValaLambdaExpression * self;
1152 	self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_LAMBDA_EXPRESSION, ValaLambdaExpression);
1153 	_vala_code_node_unref0 (self->priv->_method);
1154 	_vala_iterable_unref0 (self->priv->parameters);
1155 	_vala_code_node_unref0 (self->priv->_statement_body);
1156 	_vala_code_node_unref0 (self->priv->_expression_body);
1157 	VALA_CODE_NODE_CLASS (vala_lambda_expression_parent_class)->finalize (obj);
1158 }
1159 
1160 /**
1161  * Represents a lambda expression in the source code.
1162  *
1163  * Lambda expressions are anonymous methods with implicitly typed parameters.
1164  */
1165 static GType
vala_lambda_expression_get_type_once(void)1166 vala_lambda_expression_get_type_once (void)
1167 {
1168 	static const GTypeInfo g_define_type_info = { sizeof (ValaLambdaExpressionClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_lambda_expression_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaLambdaExpression), 0, (GInstanceInitFunc) vala_lambda_expression_instance_init, NULL };
1169 	GType vala_lambda_expression_type_id;
1170 	vala_lambda_expression_type_id = g_type_register_static (VALA_TYPE_EXPRESSION, "ValaLambdaExpression", &g_define_type_info, 0);
1171 	ValaLambdaExpression_private_offset = g_type_add_instance_private (vala_lambda_expression_type_id, sizeof (ValaLambdaExpressionPrivate));
1172 	return vala_lambda_expression_type_id;
1173 }
1174 
1175 GType
vala_lambda_expression_get_type(void)1176 vala_lambda_expression_get_type (void)
1177 {
1178 	static volatile gsize vala_lambda_expression_type_id__volatile = 0;
1179 	if (g_once_init_enter (&vala_lambda_expression_type_id__volatile)) {
1180 		GType vala_lambda_expression_type_id;
1181 		vala_lambda_expression_type_id = vala_lambda_expression_get_type_once ();
1182 		g_once_init_leave (&vala_lambda_expression_type_id__volatile, vala_lambda_expression_type_id);
1183 	}
1184 	return vala_lambda_expression_type_id__volatile;
1185 }
1186 
1187