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