1 /* valaarraycreationexpression.c generated by valac, the Vala compiler
2 * generated from valaarraycreationexpression.vala, do not modify */
3
4 /* valaarraycreationexpression.vala
5 *
6 * Copyright (C) 2006-2010 Jürg Billeter
7 * Copyright (C) 2006-2008 Raffaele Sandrini
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * Author:
24 * Raffaele Sandrini <raffaele@sandrini.ch>
25 * Jürg Billeter <j@bitron.ch>
26 */
27
28 #include "vala.h"
29 #include <glib.h>
30 #include <valagee.h>
31 #include <glib-object.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
36 #define _vala_iterable_unref0(var) ((var == NULL) ? NULL : (var = (vala_iterable_unref (var), NULL)))
37 #define _g_free0(var) (var = (g_free (var), NULL))
38 #define _g_string_free0(var) ((var == NULL) ? NULL : (var = (g_string_free (var, TRUE), NULL)))
39
40 struct _ValaArrayCreationExpressionPrivate {
41 gint _rank;
42 ValaList* sizes;
43 ValaDataType* _element_type;
44 ValaDataType* _length_type;
45 ValaInitializerList* _initializer_list;
46 };
47
48 static gint ValaArrayCreationExpression_private_offset;
49 static gpointer vala_array_creation_expression_parent_class = NULL;
50
51 static void vala_array_creation_expression_real_accept_children (ValaCodeNode* base,
52 ValaCodeVisitor* visitor);
53 static void vala_array_creation_expression_real_accept (ValaCodeNode* base,
54 ValaCodeVisitor* visitor);
55 static gboolean vala_array_creation_expression_real_is_pure (ValaExpression* base);
56 static gboolean vala_array_creation_expression_real_is_accessible (ValaExpression* base,
57 ValaSymbol* sym);
58 static gchar* vala_array_creation_expression_real_to_string (ValaCodeNode* base);
59 static void vala_array_creation_expression_real_replace_expression (ValaCodeNode* base,
60 ValaExpression* old_node,
61 ValaExpression* new_node);
62 static void vala_array_creation_expression_real_replace_type (ValaCodeNode* base,
63 ValaDataType* old_type,
64 ValaDataType* new_type);
65 static gint vala_array_creation_expression_create_sizes_from_initializer_list (ValaArrayCreationExpression* self,
66 ValaCodeContext* context,
67 ValaInitializerList* il,
68 gint rank,
69 ValaList* sl);
70 static gboolean vala_array_creation_expression_real_check (ValaCodeNode* base,
71 ValaCodeContext* context);
72 static void vala_array_creation_expression_real_emit (ValaCodeNode* base,
73 ValaCodeGenerator* codegen);
74 static void vala_array_creation_expression_real_get_used_variables (ValaCodeNode* base,
75 ValaCollection* collection);
76 static void vala_array_creation_expression_finalize (ValaCodeNode * obj);
77 static GType vala_array_creation_expression_get_type_once (void);
78
79 static inline gpointer
vala_array_creation_expression_get_instance_private(ValaArrayCreationExpression * self)80 vala_array_creation_expression_get_instance_private (ValaArrayCreationExpression* self)
81 {
82 return G_STRUCT_MEMBER_P (self, ValaArrayCreationExpression_private_offset);
83 }
84
85 ValaDataType*
vala_array_creation_expression_get_element_type(ValaArrayCreationExpression * self)86 vala_array_creation_expression_get_element_type (ValaArrayCreationExpression* self)
87 {
88 ValaDataType* result;
89 ValaDataType* _tmp0_;
90 g_return_val_if_fail (self != NULL, NULL);
91 _tmp0_ = self->priv->_element_type;
92 result = _tmp0_;
93 return result;
94 }
95
96 static gpointer
_vala_code_node_ref0(gpointer self)97 _vala_code_node_ref0 (gpointer self)
98 {
99 return self ? vala_code_node_ref (self) : NULL;
100 }
101
102 void
vala_array_creation_expression_set_element_type(ValaArrayCreationExpression * self,ValaDataType * value)103 vala_array_creation_expression_set_element_type (ValaArrayCreationExpression* self,
104 ValaDataType* value)
105 {
106 ValaDataType* _tmp0_;
107 ValaDataType* _tmp1_;
108 g_return_if_fail (self != NULL);
109 _tmp0_ = _vala_code_node_ref0 (value);
110 _vala_code_node_unref0 (self->priv->_element_type);
111 self->priv->_element_type = _tmp0_;
112 _tmp1_ = self->priv->_element_type;
113 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp1_, (ValaCodeNode*) self);
114 }
115
116 ValaDataType*
vala_array_creation_expression_get_length_type(ValaArrayCreationExpression * self)117 vala_array_creation_expression_get_length_type (ValaArrayCreationExpression* self)
118 {
119 ValaDataType* result;
120 ValaDataType* _tmp0_;
121 g_return_val_if_fail (self != NULL, NULL);
122 _tmp0_ = self->priv->_length_type;
123 result = _tmp0_;
124 return result;
125 }
126
127 void
vala_array_creation_expression_set_length_type(ValaArrayCreationExpression * self,ValaDataType * value)128 vala_array_creation_expression_set_length_type (ValaArrayCreationExpression* self,
129 ValaDataType* value)
130 {
131 ValaDataType* _tmp0_;
132 ValaDataType* _tmp1_;
133 g_return_if_fail (self != NULL);
134 _tmp0_ = _vala_code_node_ref0 (value);
135 _vala_code_node_unref0 (self->priv->_length_type);
136 self->priv->_length_type = _tmp0_;
137 _tmp1_ = self->priv->_length_type;
138 if (_tmp1_ != NULL) {
139 ValaDataType* _tmp2_;
140 _tmp2_ = self->priv->_length_type;
141 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp2_, (ValaCodeNode*) self);
142 }
143 }
144
145 gint
vala_array_creation_expression_get_rank(ValaArrayCreationExpression * self)146 vala_array_creation_expression_get_rank (ValaArrayCreationExpression* self)
147 {
148 gint result;
149 g_return_val_if_fail (self != NULL, 0);
150 result = self->priv->_rank;
151 return result;
152 }
153
154 void
vala_array_creation_expression_set_rank(ValaArrayCreationExpression * self,gint value)155 vala_array_creation_expression_set_rank (ValaArrayCreationExpression* self,
156 gint value)
157 {
158 g_return_if_fail (self != NULL);
159 self->priv->_rank = value;
160 }
161
162 ValaInitializerList*
vala_array_creation_expression_get_initializer_list(ValaArrayCreationExpression * self)163 vala_array_creation_expression_get_initializer_list (ValaArrayCreationExpression* self)
164 {
165 ValaInitializerList* result;
166 ValaInitializerList* _tmp0_;
167 g_return_val_if_fail (self != NULL, NULL);
168 _tmp0_ = self->priv->_initializer_list;
169 result = _tmp0_;
170 return result;
171 }
172
173 void
vala_array_creation_expression_set_initializer_list(ValaArrayCreationExpression * self,ValaInitializerList * value)174 vala_array_creation_expression_set_initializer_list (ValaArrayCreationExpression* self,
175 ValaInitializerList* value)
176 {
177 ValaInitializerList* _tmp0_;
178 ValaInitializerList* _tmp1_;
179 g_return_if_fail (self != NULL);
180 _tmp0_ = _vala_code_node_ref0 (value);
181 _vala_code_node_unref0 (self->priv->_initializer_list);
182 self->priv->_initializer_list = _tmp0_;
183 _tmp1_ = self->priv->_initializer_list;
184 if (_tmp1_ != NULL) {
185 ValaInitializerList* _tmp2_;
186 _tmp2_ = self->priv->_initializer_list;
187 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp2_, (ValaCodeNode*) self);
188 }
189 }
190
191 /**
192 * Add a size expression.
193 */
194 void
vala_array_creation_expression_append_size(ValaArrayCreationExpression * self,ValaExpression * size)195 vala_array_creation_expression_append_size (ValaArrayCreationExpression* self,
196 ValaExpression* size)
197 {
198 ValaList* _tmp0_;
199 g_return_if_fail (self != NULL);
200 g_return_if_fail (size != NULL);
201 _tmp0_ = self->priv->sizes;
202 vala_collection_add ((ValaCollection*) _tmp0_, size);
203 if (size != NULL) {
204 vala_code_node_set_parent_node ((ValaCodeNode*) size, (ValaCodeNode*) self);
205 }
206 }
207
208 /**
209 * Get the sizes for all dimensions ascending from left to right.
210 */
211 ValaList*
vala_array_creation_expression_get_sizes(ValaArrayCreationExpression * self)212 vala_array_creation_expression_get_sizes (ValaArrayCreationExpression* self)
213 {
214 ValaList* _tmp0_;
215 ValaList* result = NULL;
216 g_return_val_if_fail (self != NULL, NULL);
217 _tmp0_ = self->priv->sizes;
218 result = _tmp0_;
219 return result;
220 }
221
222 ValaArrayCreationExpression*
vala_array_creation_expression_construct(GType object_type,ValaDataType * element_type,gint rank,ValaInitializerList * initializer_list,ValaSourceReference * source_reference)223 vala_array_creation_expression_construct (GType object_type,
224 ValaDataType* element_type,
225 gint rank,
226 ValaInitializerList* initializer_list,
227 ValaSourceReference* source_reference)
228 {
229 ValaArrayCreationExpression* self = NULL;
230 g_return_val_if_fail (element_type != NULL, NULL);
231 self = (ValaArrayCreationExpression*) vala_expression_construct (object_type);
232 vala_array_creation_expression_set_element_type (self, element_type);
233 vala_array_creation_expression_set_rank (self, rank);
234 vala_array_creation_expression_set_initializer_list (self, initializer_list);
235 vala_code_node_set_source_reference ((ValaCodeNode*) self, source_reference);
236 return self;
237 }
238
239 ValaArrayCreationExpression*
vala_array_creation_expression_new(ValaDataType * element_type,gint rank,ValaInitializerList * initializer_list,ValaSourceReference * source_reference)240 vala_array_creation_expression_new (ValaDataType* element_type,
241 gint rank,
242 ValaInitializerList* initializer_list,
243 ValaSourceReference* source_reference)
244 {
245 return vala_array_creation_expression_construct (VALA_TYPE_ARRAY_CREATION_EXPRESSION, element_type, rank, initializer_list, source_reference);
246 }
247
248 static gpointer
_vala_iterable_ref0(gpointer self)249 _vala_iterable_ref0 (gpointer self)
250 {
251 return self ? vala_iterable_ref (self) : NULL;
252 }
253
254 static void
vala_array_creation_expression_real_accept_children(ValaCodeNode * base,ValaCodeVisitor * visitor)255 vala_array_creation_expression_real_accept_children (ValaCodeNode* base,
256 ValaCodeVisitor* visitor)
257 {
258 ValaArrayCreationExpression * self;
259 ValaDataType* _tmp0_;
260 ValaDataType* _tmp1_;
261 ValaDataType* _tmp4_;
262 ValaDataType* _tmp5_;
263 ValaInitializerList* _tmp18_;
264 ValaInitializerList* _tmp19_;
265 self = (ValaArrayCreationExpression*) base;
266 g_return_if_fail (visitor != NULL);
267 _tmp0_ = vala_array_creation_expression_get_element_type (self);
268 _tmp1_ = _tmp0_;
269 if (_tmp1_ != NULL) {
270 ValaDataType* _tmp2_;
271 ValaDataType* _tmp3_;
272 _tmp2_ = vala_array_creation_expression_get_element_type (self);
273 _tmp3_ = _tmp2_;
274 vala_code_node_accept ((ValaCodeNode*) _tmp3_, visitor);
275 }
276 _tmp4_ = vala_array_creation_expression_get_length_type (self);
277 _tmp5_ = _tmp4_;
278 if (_tmp5_ != NULL) {
279 ValaDataType* _tmp6_;
280 ValaDataType* _tmp7_;
281 _tmp6_ = vala_array_creation_expression_get_length_type (self);
282 _tmp7_ = _tmp6_;
283 vala_code_node_accept ((ValaCodeNode*) _tmp7_, visitor);
284 }
285 {
286 ValaList* _e_list = NULL;
287 ValaList* _tmp8_;
288 ValaList* _tmp9_;
289 gint _e_size = 0;
290 ValaList* _tmp10_;
291 gint _tmp11_;
292 gint _tmp12_;
293 gint _e_index = 0;
294 _tmp8_ = self->priv->sizes;
295 _tmp9_ = _vala_iterable_ref0 (_tmp8_);
296 _e_list = _tmp9_;
297 _tmp10_ = _e_list;
298 _tmp11_ = vala_collection_get_size ((ValaCollection*) _tmp10_);
299 _tmp12_ = _tmp11_;
300 _e_size = _tmp12_;
301 _e_index = -1;
302 while (TRUE) {
303 gint _tmp13_;
304 gint _tmp14_;
305 ValaExpression* e = NULL;
306 ValaList* _tmp15_;
307 gpointer _tmp16_;
308 ValaExpression* _tmp17_;
309 _e_index = _e_index + 1;
310 _tmp13_ = _e_index;
311 _tmp14_ = _e_size;
312 if (!(_tmp13_ < _tmp14_)) {
313 break;
314 }
315 _tmp15_ = _e_list;
316 _tmp16_ = vala_list_get (_tmp15_, _e_index);
317 e = (ValaExpression*) _tmp16_;
318 _tmp17_ = e;
319 vala_code_node_accept ((ValaCodeNode*) _tmp17_, visitor);
320 _vala_code_node_unref0 (e);
321 }
322 _vala_iterable_unref0 (_e_list);
323 }
324 _tmp18_ = vala_array_creation_expression_get_initializer_list (self);
325 _tmp19_ = _tmp18_;
326 if (_tmp19_ != NULL) {
327 ValaInitializerList* _tmp20_;
328 ValaInitializerList* _tmp21_;
329 _tmp20_ = vala_array_creation_expression_get_initializer_list (self);
330 _tmp21_ = _tmp20_;
331 vala_code_node_accept ((ValaCodeNode*) _tmp21_, visitor);
332 }
333 }
334
335 static void
vala_array_creation_expression_real_accept(ValaCodeNode * base,ValaCodeVisitor * visitor)336 vala_array_creation_expression_real_accept (ValaCodeNode* base,
337 ValaCodeVisitor* visitor)
338 {
339 ValaArrayCreationExpression * self;
340 self = (ValaArrayCreationExpression*) base;
341 g_return_if_fail (visitor != NULL);
342 vala_code_visitor_visit_array_creation_expression (visitor, self);
343 vala_code_visitor_visit_expression (visitor, (ValaExpression*) self);
344 }
345
346 static gboolean
vala_array_creation_expression_real_is_pure(ValaExpression * base)347 vala_array_creation_expression_real_is_pure (ValaExpression* base)
348 {
349 ValaArrayCreationExpression * self;
350 gboolean result = FALSE;
351 self = (ValaArrayCreationExpression*) base;
352 result = FALSE;
353 return result;
354 }
355
356 static gboolean
vala_array_creation_expression_real_is_accessible(ValaExpression * base,ValaSymbol * sym)357 vala_array_creation_expression_real_is_accessible (ValaExpression* base,
358 ValaSymbol* sym)
359 {
360 ValaArrayCreationExpression * self;
361 gboolean _tmp0_ = FALSE;
362 ValaDataType* _tmp1_;
363 ValaDataType* _tmp2_;
364 gboolean _tmp5_ = FALSE;
365 ValaDataType* _tmp6_;
366 ValaDataType* _tmp7_;
367 ValaInitializerList* _tmp20_;
368 ValaInitializerList* _tmp21_;
369 gboolean result = FALSE;
370 self = (ValaArrayCreationExpression*) base;
371 g_return_val_if_fail (sym != NULL, FALSE);
372 _tmp1_ = vala_array_creation_expression_get_element_type (self);
373 _tmp2_ = _tmp1_;
374 if (_tmp2_ != NULL) {
375 ValaDataType* _tmp3_;
376 ValaDataType* _tmp4_;
377 _tmp3_ = vala_array_creation_expression_get_element_type (self);
378 _tmp4_ = _tmp3_;
379 _tmp0_ = !vala_data_type_is_accessible (_tmp4_, sym);
380 } else {
381 _tmp0_ = FALSE;
382 }
383 if (_tmp0_) {
384 result = FALSE;
385 return result;
386 }
387 _tmp6_ = vala_array_creation_expression_get_length_type (self);
388 _tmp7_ = _tmp6_;
389 if (_tmp7_ != NULL) {
390 ValaDataType* _tmp8_;
391 ValaDataType* _tmp9_;
392 _tmp8_ = vala_array_creation_expression_get_length_type (self);
393 _tmp9_ = _tmp8_;
394 _tmp5_ = !vala_data_type_is_accessible (_tmp9_, sym);
395 } else {
396 _tmp5_ = FALSE;
397 }
398 if (_tmp5_) {
399 result = FALSE;
400 return result;
401 }
402 {
403 ValaList* _e_list = NULL;
404 ValaList* _tmp10_;
405 ValaList* _tmp11_;
406 gint _e_size = 0;
407 ValaList* _tmp12_;
408 gint _tmp13_;
409 gint _tmp14_;
410 gint _e_index = 0;
411 _tmp10_ = self->priv->sizes;
412 _tmp11_ = _vala_iterable_ref0 (_tmp10_);
413 _e_list = _tmp11_;
414 _tmp12_ = _e_list;
415 _tmp13_ = vala_collection_get_size ((ValaCollection*) _tmp12_);
416 _tmp14_ = _tmp13_;
417 _e_size = _tmp14_;
418 _e_index = -1;
419 while (TRUE) {
420 gint _tmp15_;
421 gint _tmp16_;
422 ValaExpression* e = NULL;
423 ValaList* _tmp17_;
424 gpointer _tmp18_;
425 ValaExpression* _tmp19_;
426 _e_index = _e_index + 1;
427 _tmp15_ = _e_index;
428 _tmp16_ = _e_size;
429 if (!(_tmp15_ < _tmp16_)) {
430 break;
431 }
432 _tmp17_ = _e_list;
433 _tmp18_ = vala_list_get (_tmp17_, _e_index);
434 e = (ValaExpression*) _tmp18_;
435 _tmp19_ = e;
436 if (!vala_expression_is_accessible (_tmp19_, sym)) {
437 result = FALSE;
438 _vala_code_node_unref0 (e);
439 _vala_iterable_unref0 (_e_list);
440 return result;
441 }
442 _vala_code_node_unref0 (e);
443 }
444 _vala_iterable_unref0 (_e_list);
445 }
446 _tmp20_ = vala_array_creation_expression_get_initializer_list (self);
447 _tmp21_ = _tmp20_;
448 if (_tmp21_ != NULL) {
449 ValaInitializerList* _tmp22_;
450 ValaInitializerList* _tmp23_;
451 _tmp22_ = vala_array_creation_expression_get_initializer_list (self);
452 _tmp23_ = _tmp22_;
453 result = vala_expression_is_accessible ((ValaExpression*) _tmp23_, sym);
454 return result;
455 }
456 result = TRUE;
457 return result;
458 }
459
460 static gchar*
vala_array_creation_expression_real_to_string(ValaCodeNode * base)461 vala_array_creation_expression_real_to_string (ValaCodeNode* base)
462 {
463 ValaArrayCreationExpression * self;
464 GString* builder = NULL;
465 GString* _tmp0_;
466 GString* _tmp1_;
467 ValaDataType* _tmp2_;
468 ValaDataType* _tmp3_;
469 gchar* _tmp4_;
470 gchar* _tmp5_;
471 gboolean first = FALSE;
472 GString* _tmp23_;
473 ValaInitializerList* _tmp24_;
474 ValaInitializerList* _tmp25_;
475 GString* _tmp31_;
476 const gchar* _tmp32_;
477 gchar* _tmp33_;
478 gchar* result = NULL;
479 self = (ValaArrayCreationExpression*) base;
480 _tmp0_ = g_string_new ("new ");
481 builder = _tmp0_;
482 _tmp1_ = builder;
483 _tmp2_ = vala_array_creation_expression_get_element_type (self);
484 _tmp3_ = _tmp2_;
485 _tmp4_ = vala_code_node_to_string ((ValaCodeNode*) _tmp3_);
486 _tmp5_ = _tmp4_;
487 g_string_append_printf (_tmp1_, "%s[", _tmp5_);
488 _g_free0 (_tmp5_);
489 first = TRUE;
490 {
491 ValaList* _size_list = NULL;
492 ValaList* _tmp6_;
493 ValaList* _tmp7_;
494 gint _size_size = 0;
495 ValaList* _tmp8_;
496 gint _tmp9_;
497 gint _tmp10_;
498 gint _size_index = 0;
499 _tmp6_ = self->priv->sizes;
500 _tmp7_ = _vala_iterable_ref0 (_tmp6_);
501 _size_list = _tmp7_;
502 _tmp8_ = _size_list;
503 _tmp9_ = vala_collection_get_size ((ValaCollection*) _tmp8_);
504 _tmp10_ = _tmp9_;
505 _size_size = _tmp10_;
506 _size_index = -1;
507 while (TRUE) {
508 gint _tmp11_;
509 gint _tmp12_;
510 ValaExpression* size = NULL;
511 ValaList* _tmp13_;
512 gpointer _tmp14_;
513 _size_index = _size_index + 1;
514 _tmp11_ = _size_index;
515 _tmp12_ = _size_size;
516 if (!(_tmp11_ < _tmp12_)) {
517 break;
518 }
519 _tmp13_ = _size_list;
520 _tmp14_ = vala_list_get (_tmp13_, _size_index);
521 size = (ValaExpression*) _tmp14_;
522 if (first) {
523 GString* _tmp15_;
524 ValaExpression* _tmp16_;
525 gchar* _tmp17_;
526 gchar* _tmp18_;
527 _tmp15_ = builder;
528 _tmp16_ = size;
529 _tmp17_ = vala_code_node_to_string ((ValaCodeNode*) _tmp16_);
530 _tmp18_ = _tmp17_;
531 g_string_append (_tmp15_, _tmp18_);
532 _g_free0 (_tmp18_);
533 first = FALSE;
534 } else {
535 GString* _tmp19_;
536 ValaExpression* _tmp20_;
537 gchar* _tmp21_;
538 gchar* _tmp22_;
539 _tmp19_ = builder;
540 _tmp20_ = size;
541 _tmp21_ = vala_code_node_to_string ((ValaCodeNode*) _tmp20_);
542 _tmp22_ = _tmp21_;
543 g_string_append_printf (_tmp19_, ", %s", _tmp22_);
544 _g_free0 (_tmp22_);
545 }
546 _vala_code_node_unref0 (size);
547 }
548 _vala_iterable_unref0 (_size_list);
549 }
550 _tmp23_ = builder;
551 g_string_append_c (_tmp23_, ']');
552 _tmp24_ = vala_array_creation_expression_get_initializer_list (self);
553 _tmp25_ = _tmp24_;
554 if (_tmp25_ != NULL) {
555 GString* _tmp26_;
556 ValaInitializerList* _tmp27_;
557 ValaInitializerList* _tmp28_;
558 gchar* _tmp29_;
559 gchar* _tmp30_;
560 _tmp26_ = builder;
561 _tmp27_ = vala_array_creation_expression_get_initializer_list (self);
562 _tmp28_ = _tmp27_;
563 _tmp29_ = vala_code_node_to_string ((ValaCodeNode*) _tmp28_);
564 _tmp30_ = _tmp29_;
565 g_string_append (_tmp26_, _tmp30_);
566 _g_free0 (_tmp30_);
567 }
568 _tmp31_ = builder;
569 _tmp32_ = _tmp31_->str;
570 _tmp33_ = g_strdup (_tmp32_);
571 result = _tmp33_;
572 _g_string_free0 (builder);
573 return result;
574 }
575
576 static void
vala_array_creation_expression_real_replace_expression(ValaCodeNode * base,ValaExpression * old_node,ValaExpression * new_node)577 vala_array_creation_expression_real_replace_expression (ValaCodeNode* base,
578 ValaExpression* old_node,
579 ValaExpression* new_node)
580 {
581 ValaArrayCreationExpression * self;
582 self = (ValaArrayCreationExpression*) base;
583 g_return_if_fail (old_node != NULL);
584 g_return_if_fail (new_node != NULL);
585 {
586 gint i = 0;
587 i = 0;
588 {
589 gboolean _tmp0_ = FALSE;
590 _tmp0_ = TRUE;
591 while (TRUE) {
592 ValaList* _tmp2_;
593 gint _tmp3_;
594 gint _tmp4_;
595 ValaList* _tmp5_;
596 gpointer _tmp6_;
597 ValaExpression* _tmp7_;
598 gboolean _tmp8_;
599 if (!_tmp0_) {
600 gint _tmp1_;
601 _tmp1_ = i;
602 i = _tmp1_ + 1;
603 }
604 _tmp0_ = FALSE;
605 _tmp2_ = self->priv->sizes;
606 _tmp3_ = vala_collection_get_size ((ValaCollection*) _tmp2_);
607 _tmp4_ = _tmp3_;
608 if (!(i < _tmp4_)) {
609 break;
610 }
611 _tmp5_ = self->priv->sizes;
612 _tmp6_ = vala_list_get (_tmp5_, i);
613 _tmp7_ = (ValaExpression*) _tmp6_;
614 _tmp8_ = _tmp7_ == old_node;
615 _vala_code_node_unref0 (_tmp7_);
616 if (_tmp8_) {
617 ValaList* _tmp9_;
618 _tmp9_ = self->priv->sizes;
619 vala_list_set (_tmp9_, i, new_node);
620 vala_code_node_set_parent_node ((ValaCodeNode*) new_node, (ValaCodeNode*) self);
621 return;
622 }
623 }
624 }
625 }
626 }
627
628 static void
vala_array_creation_expression_real_replace_type(ValaCodeNode * base,ValaDataType * old_type,ValaDataType * new_type)629 vala_array_creation_expression_real_replace_type (ValaCodeNode* base,
630 ValaDataType* old_type,
631 ValaDataType* new_type)
632 {
633 ValaArrayCreationExpression * self;
634 ValaDataType* _tmp0_;
635 ValaDataType* _tmp1_;
636 ValaDataType* _tmp2_;
637 ValaDataType* _tmp3_;
638 self = (ValaArrayCreationExpression*) base;
639 g_return_if_fail (old_type != NULL);
640 g_return_if_fail (new_type != NULL);
641 _tmp0_ = vala_array_creation_expression_get_element_type (self);
642 _tmp1_ = _tmp0_;
643 if (_tmp1_ == old_type) {
644 vala_array_creation_expression_set_element_type (self, new_type);
645 }
646 _tmp2_ = vala_array_creation_expression_get_length_type (self);
647 _tmp3_ = _tmp2_;
648 if (_tmp3_ == old_type) {
649 vala_array_creation_expression_set_length_type (self, new_type);
650 }
651 }
652
653 static gint
vala_array_creation_expression_create_sizes_from_initializer_list(ValaArrayCreationExpression * self,ValaCodeContext * context,ValaInitializerList * il,gint rank,ValaList * sl)654 vala_array_creation_expression_create_sizes_from_initializer_list (ValaArrayCreationExpression* self,
655 ValaCodeContext* context,
656 ValaInitializerList* il,
657 gint rank,
658 ValaList* sl)
659 {
660 gint _tmp0_;
661 gint _tmp1_;
662 gint _tmp2_;
663 gint subsize = 0;
664 gint _tmp41_;
665 gint _tmp42_;
666 gint result = 0;
667 g_return_val_if_fail (self != NULL, 0);
668 g_return_val_if_fail (context != NULL, 0);
669 g_return_val_if_fail (il != NULL, 0);
670 g_return_val_if_fail (sl != NULL, 0);
671 _tmp0_ = vala_collection_get_size ((ValaCollection*) sl);
672 _tmp1_ = _tmp0_;
673 _tmp2_ = self->priv->_rank;
674 if (_tmp1_ == (_tmp2_ - rank)) {
675 ValaIntegerLiteral* init = NULL;
676 gint _tmp3_;
677 gint _tmp4_;
678 gchar* _tmp5_;
679 gchar* _tmp6_;
680 ValaSourceReference* _tmp7_;
681 ValaSourceReference* _tmp8_;
682 ValaIntegerLiteral* _tmp9_;
683 ValaIntegerLiteral* _tmp10_;
684 ValaIntegerLiteral* _tmp11_;
685 ValaIntegerLiteral* _tmp12_;
686 _tmp3_ = vala_initializer_list_get_size (il);
687 _tmp4_ = _tmp3_;
688 _tmp5_ = g_strdup_printf ("%i", _tmp4_);
689 _tmp6_ = _tmp5_;
690 _tmp7_ = vala_code_node_get_source_reference ((ValaCodeNode*) il);
691 _tmp8_ = _tmp7_;
692 _tmp9_ = vala_integer_literal_new (_tmp6_, _tmp8_);
693 _tmp10_ = _tmp9_;
694 _g_free0 (_tmp6_);
695 init = _tmp10_;
696 _tmp11_ = init;
697 vala_code_node_check ((ValaCodeNode*) _tmp11_, context);
698 _tmp12_ = init;
699 vala_collection_add ((ValaCollection*) sl, (ValaLiteral*) _tmp12_);
700 _vala_code_node_unref0 (init);
701 }
702 subsize = -1;
703 {
704 ValaList* _e_list = NULL;
705 ValaList* _tmp13_;
706 ValaList* _tmp14_;
707 gint _e_size = 0;
708 ValaList* _tmp15_;
709 gint _tmp16_;
710 gint _tmp17_;
711 gint _e_index = 0;
712 _tmp13_ = vala_initializer_list_get_initializers (il);
713 _tmp14_ = _vala_iterable_ref0 (_tmp13_);
714 _e_list = _tmp14_;
715 _tmp15_ = _e_list;
716 _tmp16_ = vala_collection_get_size ((ValaCollection*) _tmp15_);
717 _tmp17_ = _tmp16_;
718 _e_size = _tmp17_;
719 _e_index = -1;
720 while (TRUE) {
721 gint _tmp18_;
722 gint _tmp19_;
723 ValaExpression* e = NULL;
724 ValaList* _tmp20_;
725 gpointer _tmp21_;
726 gboolean _tmp22_ = FALSE;
727 ValaExpression* _tmp23_;
728 _e_index = _e_index + 1;
729 _tmp18_ = _e_index;
730 _tmp19_ = _e_size;
731 if (!(_tmp18_ < _tmp19_)) {
732 break;
733 }
734 _tmp20_ = _e_list;
735 _tmp21_ = vala_list_get (_tmp20_, _e_index);
736 e = (ValaExpression*) _tmp21_;
737 _tmp23_ = e;
738 if (VALA_IS_INITIALIZER_LIST (_tmp23_)) {
739 ValaExpression* _tmp24_;
740 ValaDataType* _tmp25_;
741 ValaDataType* _tmp26_;
742 _tmp24_ = e;
743 _tmp25_ = vala_expression_get_target_type (_tmp24_);
744 _tmp26_ = _tmp25_;
745 _tmp22_ = VALA_IS_ARRAY_TYPE (_tmp26_);
746 } else {
747 _tmp22_ = FALSE;
748 }
749 if (_tmp22_) {
750 gint size = 0;
751 ValaExpression* _tmp31_;
752 gboolean _tmp32_ = FALSE;
753 if (rank == 1) {
754 ValaExpression* _tmp27_;
755 ValaExpression* _tmp28_;
756 ValaSourceReference* _tmp29_;
757 ValaSourceReference* _tmp30_;
758 vala_code_node_set_error ((ValaCodeNode*) il, TRUE);
759 _tmp27_ = e;
760 vala_code_node_set_error ((ValaCodeNode*) _tmp27_, TRUE);
761 _tmp28_ = e;
762 _tmp29_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp28_);
763 _tmp30_ = _tmp29_;
764 vala_report_error (_tmp30_, "Expected array element, got array initializer list");
765 result = -1;
766 _vala_code_node_unref0 (e);
767 _vala_iterable_unref0 (_e_list);
768 return result;
769 }
770 _tmp31_ = e;
771 size = vala_array_creation_expression_create_sizes_from_initializer_list (self, context, G_TYPE_CHECK_INSTANCE_CAST (_tmp31_, VALA_TYPE_INITIALIZER_LIST, ValaInitializerList), rank - 1, sl);
772 if (size == -1) {
773 result = -1;
774 _vala_code_node_unref0 (e);
775 _vala_iterable_unref0 (_e_list);
776 return result;
777 }
778 if (subsize >= 0) {
779 _tmp32_ = subsize != size;
780 } else {
781 _tmp32_ = FALSE;
782 }
783 if (_tmp32_) {
784 ValaSourceReference* _tmp33_;
785 ValaSourceReference* _tmp34_;
786 gchar* _tmp35_;
787 gchar* _tmp36_;
788 vala_code_node_set_error ((ValaCodeNode*) il, TRUE);
789 _tmp33_ = vala_code_node_get_source_reference ((ValaCodeNode*) il);
790 _tmp34_ = _tmp33_;
791 _tmp35_ = g_strdup_printf ("Expected initializer list of size %d, got size %d", subsize, size);
792 _tmp36_ = _tmp35_;
793 vala_report_error (_tmp34_, _tmp36_);
794 _g_free0 (_tmp36_);
795 result = -1;
796 _vala_code_node_unref0 (e);
797 _vala_iterable_unref0 (_e_list);
798 return result;
799 } else {
800 subsize = size;
801 }
802 } else {
803 if (rank != 1) {
804 ValaExpression* _tmp37_;
805 ValaExpression* _tmp38_;
806 ValaSourceReference* _tmp39_;
807 ValaSourceReference* _tmp40_;
808 vala_code_node_set_error ((ValaCodeNode*) il, TRUE);
809 _tmp37_ = e;
810 vala_code_node_set_error ((ValaCodeNode*) _tmp37_, TRUE);
811 _tmp38_ = e;
812 _tmp39_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp38_);
813 _tmp40_ = _tmp39_;
814 vala_report_error (_tmp40_, "Expected array initializer list, got array element");
815 result = -1;
816 _vala_code_node_unref0 (e);
817 _vala_iterable_unref0 (_e_list);
818 return result;
819 }
820 }
821 _vala_code_node_unref0 (e);
822 }
823 _vala_iterable_unref0 (_e_list);
824 }
825 _tmp41_ = vala_initializer_list_get_size (il);
826 _tmp42_ = _tmp41_;
827 result = _tmp42_;
828 return result;
829 }
830
831 static gboolean
vala_array_creation_expression_real_check(ValaCodeNode * base,ValaCodeContext * context)832 vala_array_creation_expression_real_check (ValaCodeNode* base,
833 ValaCodeContext* context)
834 {
835 ValaArrayCreationExpression * self;
836 gboolean _tmp0_;
837 gboolean _tmp1_;
838 ValaList* sizes = NULL;
839 ValaList* _tmp4_;
840 ValaList* _tmp5_;
841 ValaInitializerList* initlist = NULL;
842 ValaInitializerList* _tmp6_;
843 ValaInitializerList* _tmp7_;
844 ValaInitializerList* _tmp8_;
845 ValaDataType* _tmp9_;
846 ValaDataType* _tmp10_;
847 ValaDataType* _tmp15_;
848 ValaDataType* _tmp16_;
849 ValaArrayList* calc_sizes = NULL;
850 GEqualFunc _tmp45_;
851 ValaArrayList* _tmp46_;
852 ValaInitializerList* _tmp47_;
853 ValaList* _tmp94_;
854 gint _tmp95_;
855 gint _tmp96_;
856 gboolean _tmp132_;
857 gboolean _tmp133_;
858 gboolean _tmp134_ = FALSE;
859 ValaInitializerList* _tmp135_;
860 ValaInitializerList* _tmp136_;
861 ValaDataType* _tmp141_;
862 ValaDataType* _tmp142_;
863 ValaDataType* _tmp145_;
864 ValaDataType* _tmp146_;
865 gint _tmp147_;
866 ValaSourceReference* _tmp148_;
867 ValaSourceReference* _tmp149_;
868 ValaArrayType* _tmp150_;
869 ValaArrayType* _tmp151_;
870 ValaDataType* _tmp152_;
871 ValaDataType* _tmp153_;
872 ValaDataType* _tmp154_;
873 ValaDataType* _tmp155_;
874 ValaDataType* _tmp156_;
875 ValaDataType* _tmp157_;
876 ValaDataType* _tmp158_;
877 ValaDataType* _tmp159_;
878 ValaDataType* _tmp172_;
879 ValaDataType* _tmp173_;
880 ValaDataType* _tmp174_;
881 ValaDataType* _tmp175_;
882 gboolean _tmp176_;
883 gboolean _tmp177_;
884 gboolean result = FALSE;
885 self = (ValaArrayCreationExpression*) base;
886 g_return_val_if_fail (context != NULL, FALSE);
887 _tmp0_ = vala_code_node_get_checked ((ValaCodeNode*) self);
888 _tmp1_ = _tmp0_;
889 if (_tmp1_) {
890 gboolean _tmp2_;
891 gboolean _tmp3_;
892 _tmp2_ = vala_code_node_get_error ((ValaCodeNode*) self);
893 _tmp3_ = _tmp2_;
894 result = !_tmp3_;
895 return result;
896 }
897 vala_code_node_set_checked ((ValaCodeNode*) self, TRUE);
898 _tmp4_ = vala_array_creation_expression_get_sizes (self);
899 _tmp5_ = _vala_iterable_ref0 (_tmp4_);
900 sizes = _tmp5_;
901 _tmp6_ = vala_array_creation_expression_get_initializer_list (self);
902 _tmp7_ = _tmp6_;
903 _tmp8_ = _vala_code_node_ref0 (_tmp7_);
904 initlist = _tmp8_;
905 _tmp9_ = vala_array_creation_expression_get_element_type (self);
906 _tmp10_ = _tmp9_;
907 if (_tmp10_ != NULL) {
908 ValaDataType* _tmp11_;
909 ValaDataType* _tmp12_;
910 ValaDataType* _tmp13_;
911 ValaDataType* _tmp14_;
912 _tmp11_ = vala_array_creation_expression_get_element_type (self);
913 _tmp12_ = _tmp11_;
914 vala_code_node_check ((ValaCodeNode*) _tmp12_, context);
915 _tmp13_ = vala_array_creation_expression_get_element_type (self);
916 _tmp14_ = _tmp13_;
917 if (!vala_data_type_check_type_arguments (_tmp14_, context, TRUE)) {
918 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
919 result = FALSE;
920 _vala_code_node_unref0 (initlist);
921 _vala_iterable_unref0 (sizes);
922 return result;
923 }
924 }
925 _tmp15_ = vala_array_creation_expression_get_length_type (self);
926 _tmp16_ = _tmp15_;
927 if (_tmp16_ == NULL) {
928 ValaSemanticAnalyzer* _tmp17_;
929 ValaSemanticAnalyzer* _tmp18_;
930 ValaDataType* _tmp19_;
931 ValaDataType* _tmp20_;
932 ValaDataType* _tmp21_;
933 _tmp17_ = vala_code_context_get_analyzer (context);
934 _tmp18_ = _tmp17_;
935 _tmp19_ = _tmp18_->int_type;
936 _tmp20_ = vala_data_type_copy (_tmp19_);
937 _tmp21_ = _tmp20_;
938 vala_array_creation_expression_set_length_type (self, _tmp21_);
939 _vala_code_node_unref0 (_tmp21_);
940 } else {
941 ValaDataType* _tmp22_;
942 ValaDataType* _tmp23_;
943 gboolean _tmp24_ = FALSE;
944 ValaDataType* _tmp25_;
945 ValaDataType* _tmp26_;
946 _tmp22_ = vala_array_creation_expression_get_length_type (self);
947 _tmp23_ = _tmp22_;
948 vala_code_node_check ((ValaCodeNode*) _tmp23_, context);
949 _tmp25_ = vala_array_creation_expression_get_length_type (self);
950 _tmp26_ = _tmp25_;
951 if (!VALA_IS_INTEGER_TYPE (_tmp26_)) {
952 _tmp24_ = TRUE;
953 } else {
954 ValaDataType* _tmp27_;
955 ValaDataType* _tmp28_;
956 gboolean _tmp29_;
957 gboolean _tmp30_;
958 _tmp27_ = vala_array_creation_expression_get_length_type (self);
959 _tmp28_ = _tmp27_;
960 _tmp29_ = vala_data_type_get_nullable (_tmp28_);
961 _tmp30_ = _tmp29_;
962 _tmp24_ = _tmp30_;
963 }
964 if (_tmp24_) {
965 ValaDataType* _tmp31_;
966 ValaDataType* _tmp32_;
967 ValaSourceReference* _tmp33_;
968 ValaSourceReference* _tmp34_;
969 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
970 _tmp31_ = vala_array_creation_expression_get_length_type (self);
971 _tmp32_ = _tmp31_;
972 _tmp33_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp32_);
973 _tmp34_ = _tmp33_;
974 vala_report_error (_tmp34_, "Expected integer type as length type of array");
975 }
976 }
977 {
978 ValaList* _e_list = NULL;
979 ValaList* _tmp35_;
980 ValaList* _tmp36_;
981 gint _e_size = 0;
982 ValaList* _tmp37_;
983 gint _tmp38_;
984 gint _tmp39_;
985 gint _e_index = 0;
986 _tmp35_ = sizes;
987 _tmp36_ = _vala_iterable_ref0 (_tmp35_);
988 _e_list = _tmp36_;
989 _tmp37_ = _e_list;
990 _tmp38_ = vala_collection_get_size ((ValaCollection*) _tmp37_);
991 _tmp39_ = _tmp38_;
992 _e_size = _tmp39_;
993 _e_index = -1;
994 while (TRUE) {
995 gint _tmp40_;
996 gint _tmp41_;
997 ValaExpression* e = NULL;
998 ValaList* _tmp42_;
999 gpointer _tmp43_;
1000 ValaExpression* _tmp44_;
1001 _e_index = _e_index + 1;
1002 _tmp40_ = _e_index;
1003 _tmp41_ = _e_size;
1004 if (!(_tmp40_ < _tmp41_)) {
1005 break;
1006 }
1007 _tmp42_ = _e_list;
1008 _tmp43_ = vala_list_get (_tmp42_, _e_index);
1009 e = (ValaExpression*) _tmp43_;
1010 _tmp44_ = e;
1011 vala_code_node_check ((ValaCodeNode*) _tmp44_, context);
1012 _vala_code_node_unref0 (e);
1013 }
1014 _vala_iterable_unref0 (_e_list);
1015 }
1016 _tmp45_ = g_direct_equal;
1017 _tmp46_ = vala_array_list_new (VALA_TYPE_LITERAL, (GBoxedCopyFunc) vala_code_node_ref, (GDestroyNotify) vala_code_node_unref, _tmp45_);
1018 calc_sizes = _tmp46_;
1019 _tmp47_ = initlist;
1020 if (_tmp47_ != NULL) {
1021 ValaInitializerList* _tmp48_;
1022 ValaDataType* _tmp49_;
1023 ValaDataType* _tmp50_;
1024 gint _tmp51_;
1025 ValaSourceReference* _tmp52_;
1026 ValaSourceReference* _tmp53_;
1027 ValaArrayType* _tmp54_;
1028 ValaArrayType* _tmp55_;
1029 ValaInitializerList* _tmp56_;
1030 ValaDataType* _tmp57_;
1031 ValaDataType* _tmp58_;
1032 ValaDataType* _tmp59_;
1033 ValaDataType* _tmp60_;
1034 ValaDataType* _tmp61_;
1035 ValaDataType* _tmp62_;
1036 ValaInitializerList* _tmp63_;
1037 gint ret = 0;
1038 ValaInitializerList* _tmp64_;
1039 gint _tmp65_;
1040 ValaArrayList* _tmp66_;
1041 ValaArrayList* _tmp67_;
1042 gint _tmp68_;
1043 gint _tmp69_;
1044 gint _tmp70_;
1045 _tmp48_ = initlist;
1046 _tmp49_ = vala_array_creation_expression_get_element_type (self);
1047 _tmp50_ = _tmp49_;
1048 _tmp51_ = self->priv->_rank;
1049 _tmp52_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1050 _tmp53_ = _tmp52_;
1051 _tmp54_ = vala_array_type_new (_tmp50_, _tmp51_, _tmp53_);
1052 _tmp55_ = _tmp54_;
1053 vala_expression_set_target_type ((ValaExpression*) _tmp48_, (ValaDataType*) _tmp55_);
1054 _vala_code_node_unref0 (_tmp55_);
1055 _tmp56_ = initlist;
1056 _tmp57_ = vala_expression_get_target_type ((ValaExpression*) _tmp56_);
1057 _tmp58_ = _tmp57_;
1058 _tmp59_ = vala_array_creation_expression_get_length_type (self);
1059 _tmp60_ = _tmp59_;
1060 _tmp61_ = vala_data_type_copy (_tmp60_);
1061 _tmp62_ = _tmp61_;
1062 vala_array_type_set_length_type (G_TYPE_CHECK_INSTANCE_CAST (_tmp58_, VALA_TYPE_ARRAY_TYPE, ValaArrayType), _tmp62_);
1063 _vala_code_node_unref0 (_tmp62_);
1064 _tmp63_ = initlist;
1065 if (!vala_code_node_check ((ValaCodeNode*) _tmp63_, context)) {
1066 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1067 }
1068 _tmp64_ = initlist;
1069 _tmp65_ = self->priv->_rank;
1070 _tmp66_ = calc_sizes;
1071 ret = vala_array_creation_expression_create_sizes_from_initializer_list (self, context, _tmp64_, _tmp65_, (ValaList*) _tmp66_);
1072 if (ret == -1) {
1073 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1074 }
1075 _tmp67_ = calc_sizes;
1076 _tmp68_ = vala_collection_get_size ((ValaCollection*) _tmp67_);
1077 _tmp69_ = _tmp68_;
1078 _tmp70_ = self->priv->_rank;
1079 if (_tmp69_ != _tmp70_) {
1080 ValaArrayType* actual_type = NULL;
1081 ValaDataType* _tmp71_;
1082 ValaDataType* _tmp72_;
1083 ValaArrayList* _tmp73_;
1084 gint _tmp74_;
1085 gint _tmp75_;
1086 ValaSourceReference* _tmp76_;
1087 ValaSourceReference* _tmp77_;
1088 ValaArrayType* _tmp78_;
1089 ValaArrayType* _tmp79_;
1090 ValaDataType* _tmp80_;
1091 ValaDataType* _tmp81_;
1092 ValaInitializerList* _tmp82_;
1093 ValaSourceReference* _tmp83_;
1094 ValaSourceReference* _tmp84_;
1095 ValaDataType* _tmp85_;
1096 ValaDataType* _tmp86_;
1097 gchar* _tmp87_;
1098 gchar* _tmp88_;
1099 ValaArrayType* _tmp89_;
1100 gchar* _tmp90_;
1101 gchar* _tmp91_;
1102 gchar* _tmp92_;
1103 gchar* _tmp93_;
1104 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1105 _tmp71_ = vala_array_creation_expression_get_element_type (self);
1106 _tmp72_ = _tmp71_;
1107 _tmp73_ = calc_sizes;
1108 _tmp74_ = vala_collection_get_size ((ValaCollection*) _tmp73_);
1109 _tmp75_ = _tmp74_;
1110 _tmp76_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1111 _tmp77_ = _tmp76_;
1112 _tmp78_ = vala_array_type_new (_tmp72_, _tmp75_, _tmp77_);
1113 actual_type = _tmp78_;
1114 _tmp79_ = actual_type;
1115 _tmp80_ = vala_array_creation_expression_get_length_type (self);
1116 _tmp81_ = _tmp80_;
1117 vala_array_type_set_length_type (G_TYPE_CHECK_INSTANCE_CAST (_tmp79_, VALA_TYPE_ARRAY_TYPE, ValaArrayType), _tmp81_);
1118 _tmp82_ = initlist;
1119 _tmp83_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp82_);
1120 _tmp84_ = _tmp83_;
1121 _tmp85_ = vala_expression_get_target_type ((ValaExpression*) self);
1122 _tmp86_ = _tmp85_;
1123 _tmp87_ = vala_code_node_to_string ((ValaCodeNode*) _tmp86_);
1124 _tmp88_ = _tmp87_;
1125 _tmp89_ = actual_type;
1126 _tmp90_ = vala_code_node_to_string ((ValaCodeNode*) _tmp89_);
1127 _tmp91_ = _tmp90_;
1128 _tmp92_ = g_strdup_printf ("Expected initializer for `%s' but got `%s'", _tmp88_, _tmp91_);
1129 _tmp93_ = _tmp92_;
1130 vala_report_error (_tmp84_, _tmp93_);
1131 _g_free0 (_tmp93_);
1132 _g_free0 (_tmp91_);
1133 _g_free0 (_tmp88_);
1134 _vala_code_node_unref0 (actual_type);
1135 }
1136 }
1137 _tmp94_ = sizes;
1138 _tmp95_ = vala_collection_get_size ((ValaCollection*) _tmp94_);
1139 _tmp96_ = _tmp95_;
1140 if (_tmp96_ > 0) {
1141 {
1142 ValaList* _e_list = NULL;
1143 ValaList* _tmp97_;
1144 ValaList* _tmp98_;
1145 gint _e_size = 0;
1146 ValaList* _tmp99_;
1147 gint _tmp100_;
1148 gint _tmp101_;
1149 gint _e_index = 0;
1150 _tmp97_ = sizes;
1151 _tmp98_ = _vala_iterable_ref0 (_tmp97_);
1152 _e_list = _tmp98_;
1153 _tmp99_ = _e_list;
1154 _tmp100_ = vala_collection_get_size ((ValaCollection*) _tmp99_);
1155 _tmp101_ = _tmp100_;
1156 _e_size = _tmp101_;
1157 _e_index = -1;
1158 while (TRUE) {
1159 gint _tmp102_;
1160 gint _tmp103_;
1161 ValaExpression* e = NULL;
1162 ValaList* _tmp104_;
1163 gpointer _tmp105_;
1164 ValaExpression* _tmp106_;
1165 ValaDataType* _tmp107_;
1166 ValaDataType* _tmp108_;
1167 _e_index = _e_index + 1;
1168 _tmp102_ = _e_index;
1169 _tmp103_ = _e_size;
1170 if (!(_tmp102_ < _tmp103_)) {
1171 break;
1172 }
1173 _tmp104_ = _e_list;
1174 _tmp105_ = vala_list_get (_tmp104_, _e_index);
1175 e = (ValaExpression*) _tmp105_;
1176 _tmp106_ = e;
1177 _tmp107_ = vala_expression_get_value_type (_tmp106_);
1178 _tmp108_ = _tmp107_;
1179 if (_tmp108_ == NULL) {
1180 result = FALSE;
1181 _vala_code_node_unref0 (e);
1182 _vala_iterable_unref0 (_e_list);
1183 _vala_iterable_unref0 (calc_sizes);
1184 _vala_code_node_unref0 (initlist);
1185 _vala_iterable_unref0 (sizes);
1186 return result;
1187 } else {
1188 gboolean _tmp109_ = FALSE;
1189 ValaExpression* _tmp110_;
1190 ValaDataType* _tmp111_;
1191 ValaDataType* _tmp112_;
1192 _tmp110_ = e;
1193 _tmp111_ = vala_expression_get_value_type (_tmp110_);
1194 _tmp112_ = _tmp111_;
1195 if (VALA_IS_INTEGER_TYPE (_tmp112_)) {
1196 _tmp109_ = TRUE;
1197 } else {
1198 ValaExpression* _tmp113_;
1199 ValaDataType* _tmp114_;
1200 ValaDataType* _tmp115_;
1201 _tmp113_ = e;
1202 _tmp114_ = vala_expression_get_value_type (_tmp113_);
1203 _tmp115_ = _tmp114_;
1204 _tmp109_ = VALA_IS_ENUM_VALUE_TYPE (_tmp115_);
1205 }
1206 if (!_tmp109_) {
1207 ValaExpression* _tmp116_;
1208 ValaSourceReference* _tmp117_;
1209 ValaSourceReference* _tmp118_;
1210 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1211 _tmp116_ = e;
1212 _tmp117_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp116_);
1213 _tmp118_ = _tmp117_;
1214 vala_report_error (_tmp118_, "Expression of integer type expected");
1215 }
1216 }
1217 _vala_code_node_unref0 (e);
1218 }
1219 _vala_iterable_unref0 (_e_list);
1220 }
1221 } else {
1222 ValaInitializerList* _tmp119_;
1223 _tmp119_ = initlist;
1224 if (_tmp119_ == NULL) {
1225 ValaSourceReference* _tmp120_;
1226 ValaSourceReference* _tmp121_;
1227 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1228 _tmp120_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1229 _tmp121_ = _tmp120_;
1230 vala_report_error (_tmp121_, "internal error: initializer list expected");
1231 } else {
1232 {
1233 ValaArrayList* _size_list = NULL;
1234 ValaArrayList* _tmp122_;
1235 ValaArrayList* _tmp123_;
1236 gint _size_size = 0;
1237 ValaArrayList* _tmp124_;
1238 gint _tmp125_;
1239 gint _tmp126_;
1240 gint _size_index = 0;
1241 _tmp122_ = calc_sizes;
1242 _tmp123_ = _vala_iterable_ref0 (_tmp122_);
1243 _size_list = _tmp123_;
1244 _tmp124_ = _size_list;
1245 _tmp125_ = vala_collection_get_size ((ValaCollection*) _tmp124_);
1246 _tmp126_ = _tmp125_;
1247 _size_size = _tmp126_;
1248 _size_index = -1;
1249 while (TRUE) {
1250 gint _tmp127_;
1251 gint _tmp128_;
1252 ValaExpression* size = NULL;
1253 ValaArrayList* _tmp129_;
1254 gpointer _tmp130_;
1255 ValaExpression* _tmp131_;
1256 _size_index = _size_index + 1;
1257 _tmp127_ = _size_index;
1258 _tmp128_ = _size_size;
1259 if (!(_tmp127_ < _tmp128_)) {
1260 break;
1261 }
1262 _tmp129_ = _size_list;
1263 _tmp130_ = vala_list_get ((ValaList*) _tmp129_, _size_index);
1264 size = (ValaExpression*) ((ValaLiteral*) _tmp130_);
1265 _tmp131_ = size;
1266 vala_array_creation_expression_append_size (self, _tmp131_);
1267 _vala_code_node_unref0 (size);
1268 }
1269 _vala_iterable_unref0 (_size_list);
1270 }
1271 }
1272 }
1273 _tmp132_ = vala_code_node_get_error ((ValaCodeNode*) self);
1274 _tmp133_ = _tmp132_;
1275 if (_tmp133_) {
1276 result = FALSE;
1277 _vala_iterable_unref0 (calc_sizes);
1278 _vala_code_node_unref0 (initlist);
1279 _vala_iterable_unref0 (sizes);
1280 return result;
1281 }
1282 _tmp135_ = vala_array_creation_expression_get_initializer_list (self);
1283 _tmp136_ = _tmp135_;
1284 if (_tmp136_ != NULL) {
1285 ValaInitializerList* _tmp137_;
1286 ValaInitializerList* _tmp138_;
1287 ValaDataType* _tmp139_;
1288 ValaDataType* _tmp140_;
1289 _tmp137_ = vala_array_creation_expression_get_initializer_list (self);
1290 _tmp138_ = _tmp137_;
1291 _tmp139_ = vala_expression_get_value_type ((ValaExpression*) _tmp138_);
1292 _tmp140_ = _tmp139_;
1293 _tmp134_ = _tmp140_ == NULL;
1294 } else {
1295 _tmp134_ = FALSE;
1296 }
1297 if (_tmp134_) {
1298 result = FALSE;
1299 _vala_iterable_unref0 (calc_sizes);
1300 _vala_code_node_unref0 (initlist);
1301 _vala_iterable_unref0 (sizes);
1302 return result;
1303 }
1304 _tmp141_ = vala_array_creation_expression_get_element_type (self);
1305 _tmp142_ = _tmp141_;
1306 if (_tmp142_ == NULL) {
1307 ValaSourceReference* _tmp143_;
1308 ValaSourceReference* _tmp144_;
1309 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1310 _tmp143_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1311 _tmp144_ = _tmp143_;
1312 vala_report_error (_tmp144_, "Cannot determine the element type of the created array");
1313 result = FALSE;
1314 _vala_iterable_unref0 (calc_sizes);
1315 _vala_code_node_unref0 (initlist);
1316 _vala_iterable_unref0 (sizes);
1317 return result;
1318 }
1319 _tmp145_ = vala_array_creation_expression_get_element_type (self);
1320 _tmp146_ = _tmp145_;
1321 _tmp147_ = self->priv->_rank;
1322 _tmp148_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1323 _tmp149_ = _tmp148_;
1324 _tmp150_ = vala_array_type_new (_tmp146_, _tmp147_, _tmp149_);
1325 _tmp151_ = _tmp150_;
1326 vala_expression_set_value_type ((ValaExpression*) self, (ValaDataType*) _tmp151_);
1327 _vala_code_node_unref0 (_tmp151_);
1328 _tmp152_ = vala_expression_get_value_type ((ValaExpression*) self);
1329 _tmp153_ = _tmp152_;
1330 _tmp154_ = vala_array_creation_expression_get_length_type (self);
1331 _tmp155_ = _tmp154_;
1332 _tmp156_ = vala_data_type_copy (_tmp155_);
1333 _tmp157_ = _tmp156_;
1334 vala_array_type_set_length_type (G_TYPE_CHECK_INSTANCE_CAST (_tmp153_, VALA_TYPE_ARRAY_TYPE, ValaArrayType), _tmp157_);
1335 _vala_code_node_unref0 (_tmp157_);
1336 _tmp158_ = vala_expression_get_formal_target_type ((ValaExpression*) self);
1337 _tmp159_ = _tmp158_;
1338 if (VALA_IS_ARRAY_TYPE (_tmp159_)) {
1339 ValaDataType* _tmp160_;
1340 ValaDataType* _tmp161_;
1341 ValaDataType* _tmp162_;
1342 ValaDataType* _tmp163_;
1343 gboolean _tmp164_;
1344 gboolean _tmp165_;
1345 ValaDataType* _tmp166_;
1346 ValaDataType* _tmp167_;
1347 ValaDataType* _tmp168_;
1348 ValaDataType* _tmp169_;
1349 gboolean _tmp170_;
1350 gboolean _tmp171_;
1351 _tmp160_ = vala_expression_get_value_type ((ValaExpression*) self);
1352 _tmp161_ = _tmp160_;
1353 _tmp162_ = vala_expression_get_formal_target_type ((ValaExpression*) self);
1354 _tmp163_ = _tmp162_;
1355 _tmp164_ = vala_array_type_get_fixed_length (G_TYPE_CHECK_INSTANCE_CAST (_tmp163_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
1356 _tmp165_ = _tmp164_;
1357 vala_array_type_set_fixed_length (G_TYPE_CHECK_INSTANCE_CAST (_tmp161_, VALA_TYPE_ARRAY_TYPE, ValaArrayType), _tmp165_);
1358 _tmp166_ = vala_expression_get_value_type ((ValaExpression*) self);
1359 _tmp167_ = _tmp166_;
1360 _tmp168_ = vala_expression_get_formal_target_type ((ValaExpression*) self);
1361 _tmp169_ = _tmp168_;
1362 _tmp170_ = vala_array_type_get_inline_allocated (G_TYPE_CHECK_INSTANCE_CAST (_tmp169_, VALA_TYPE_ARRAY_TYPE, ValaArrayType));
1363 _tmp171_ = _tmp170_;
1364 vala_array_type_set_inline_allocated (G_TYPE_CHECK_INSTANCE_CAST (_tmp167_, VALA_TYPE_ARRAY_TYPE, ValaArrayType), _tmp171_);
1365 }
1366 _tmp172_ = vala_expression_get_value_type ((ValaExpression*) self);
1367 _tmp173_ = _tmp172_;
1368 vala_data_type_set_value_owned (_tmp173_, TRUE);
1369 _tmp174_ = vala_expression_get_value_type ((ValaExpression*) self);
1370 _tmp175_ = _tmp174_;
1371 if (!vala_code_node_check ((ValaCodeNode*) _tmp175_, context)) {
1372 result = FALSE;
1373 _vala_iterable_unref0 (calc_sizes);
1374 _vala_code_node_unref0 (initlist);
1375 _vala_iterable_unref0 (sizes);
1376 return result;
1377 }
1378 _tmp176_ = vala_code_node_get_error ((ValaCodeNode*) self);
1379 _tmp177_ = _tmp176_;
1380 result = !_tmp177_;
1381 _vala_iterable_unref0 (calc_sizes);
1382 _vala_code_node_unref0 (initlist);
1383 _vala_iterable_unref0 (sizes);
1384 return result;
1385 }
1386
1387 static void
vala_array_creation_expression_real_emit(ValaCodeNode * base,ValaCodeGenerator * codegen)1388 vala_array_creation_expression_real_emit (ValaCodeNode* base,
1389 ValaCodeGenerator* codegen)
1390 {
1391 ValaArrayCreationExpression * self;
1392 ValaInitializerList* _tmp10_;
1393 ValaInitializerList* _tmp11_;
1394 self = (ValaArrayCreationExpression*) base;
1395 g_return_if_fail (codegen != NULL);
1396 {
1397 ValaList* _e_list = NULL;
1398 ValaList* _tmp0_;
1399 ValaList* _tmp1_;
1400 gint _e_size = 0;
1401 ValaList* _tmp2_;
1402 gint _tmp3_;
1403 gint _tmp4_;
1404 gint _e_index = 0;
1405 _tmp0_ = self->priv->sizes;
1406 _tmp1_ = _vala_iterable_ref0 (_tmp0_);
1407 _e_list = _tmp1_;
1408 _tmp2_ = _e_list;
1409 _tmp3_ = vala_collection_get_size ((ValaCollection*) _tmp2_);
1410 _tmp4_ = _tmp3_;
1411 _e_size = _tmp4_;
1412 _e_index = -1;
1413 while (TRUE) {
1414 gint _tmp5_;
1415 gint _tmp6_;
1416 ValaExpression* e = NULL;
1417 ValaList* _tmp7_;
1418 gpointer _tmp8_;
1419 ValaExpression* _tmp9_;
1420 _e_index = _e_index + 1;
1421 _tmp5_ = _e_index;
1422 _tmp6_ = _e_size;
1423 if (!(_tmp5_ < _tmp6_)) {
1424 break;
1425 }
1426 _tmp7_ = _e_list;
1427 _tmp8_ = vala_list_get (_tmp7_, _e_index);
1428 e = (ValaExpression*) _tmp8_;
1429 _tmp9_ = e;
1430 vala_code_node_emit ((ValaCodeNode*) _tmp9_, codegen);
1431 _vala_code_node_unref0 (e);
1432 }
1433 _vala_iterable_unref0 (_e_list);
1434 }
1435 _tmp10_ = vala_array_creation_expression_get_initializer_list (self);
1436 _tmp11_ = _tmp10_;
1437 if (_tmp11_ != NULL) {
1438 ValaInitializerList* _tmp12_;
1439 ValaInitializerList* _tmp13_;
1440 _tmp12_ = vala_array_creation_expression_get_initializer_list (self);
1441 _tmp13_ = _tmp12_;
1442 vala_code_node_emit ((ValaCodeNode*) _tmp13_, codegen);
1443 }
1444 vala_code_visitor_visit_array_creation_expression ((ValaCodeVisitor*) codegen, self);
1445 vala_code_visitor_visit_expression ((ValaCodeVisitor*) codegen, (ValaExpression*) self);
1446 }
1447
1448 static void
vala_array_creation_expression_real_get_used_variables(ValaCodeNode * base,ValaCollection * collection)1449 vala_array_creation_expression_real_get_used_variables (ValaCodeNode* base,
1450 ValaCollection* collection)
1451 {
1452 ValaArrayCreationExpression * self;
1453 ValaInitializerList* _tmp10_;
1454 ValaInitializerList* _tmp11_;
1455 self = (ValaArrayCreationExpression*) base;
1456 g_return_if_fail (collection != NULL);
1457 {
1458 ValaList* _e_list = NULL;
1459 ValaList* _tmp0_;
1460 ValaList* _tmp1_;
1461 gint _e_size = 0;
1462 ValaList* _tmp2_;
1463 gint _tmp3_;
1464 gint _tmp4_;
1465 gint _e_index = 0;
1466 _tmp0_ = self->priv->sizes;
1467 _tmp1_ = _vala_iterable_ref0 (_tmp0_);
1468 _e_list = _tmp1_;
1469 _tmp2_ = _e_list;
1470 _tmp3_ = vala_collection_get_size ((ValaCollection*) _tmp2_);
1471 _tmp4_ = _tmp3_;
1472 _e_size = _tmp4_;
1473 _e_index = -1;
1474 while (TRUE) {
1475 gint _tmp5_;
1476 gint _tmp6_;
1477 ValaExpression* e = NULL;
1478 ValaList* _tmp7_;
1479 gpointer _tmp8_;
1480 ValaExpression* _tmp9_;
1481 _e_index = _e_index + 1;
1482 _tmp5_ = _e_index;
1483 _tmp6_ = _e_size;
1484 if (!(_tmp5_ < _tmp6_)) {
1485 break;
1486 }
1487 _tmp7_ = _e_list;
1488 _tmp8_ = vala_list_get (_tmp7_, _e_index);
1489 e = (ValaExpression*) _tmp8_;
1490 _tmp9_ = e;
1491 vala_code_node_get_used_variables ((ValaCodeNode*) _tmp9_, collection);
1492 _vala_code_node_unref0 (e);
1493 }
1494 _vala_iterable_unref0 (_e_list);
1495 }
1496 _tmp10_ = vala_array_creation_expression_get_initializer_list (self);
1497 _tmp11_ = _tmp10_;
1498 if (_tmp11_ != NULL) {
1499 ValaInitializerList* _tmp12_;
1500 ValaInitializerList* _tmp13_;
1501 _tmp12_ = vala_array_creation_expression_get_initializer_list (self);
1502 _tmp13_ = _tmp12_;
1503 vala_code_node_get_used_variables ((ValaCodeNode*) _tmp13_, collection);
1504 }
1505 }
1506
1507 static void
vala_array_creation_expression_class_init(ValaArrayCreationExpressionClass * klass,gpointer klass_data)1508 vala_array_creation_expression_class_init (ValaArrayCreationExpressionClass * klass,
1509 gpointer klass_data)
1510 {
1511 vala_array_creation_expression_parent_class = g_type_class_peek_parent (klass);
1512 ((ValaCodeNodeClass *) klass)->finalize = vala_array_creation_expression_finalize;
1513 g_type_class_adjust_private_offset (klass, &ValaArrayCreationExpression_private_offset);
1514 ((ValaCodeNodeClass *) klass)->accept_children = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_array_creation_expression_real_accept_children;
1515 ((ValaCodeNodeClass *) klass)->accept = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_array_creation_expression_real_accept;
1516 ((ValaExpressionClass *) klass)->is_pure = (gboolean (*) (ValaExpression*)) vala_array_creation_expression_real_is_pure;
1517 ((ValaExpressionClass *) klass)->is_accessible = (gboolean (*) (ValaExpression*, ValaSymbol*)) vala_array_creation_expression_real_is_accessible;
1518 ((ValaCodeNodeClass *) klass)->to_string = (gchar* (*) (ValaCodeNode*)) vala_array_creation_expression_real_to_string;
1519 ((ValaCodeNodeClass *) klass)->replace_expression = (void (*) (ValaCodeNode*, ValaExpression*, ValaExpression*)) vala_array_creation_expression_real_replace_expression;
1520 ((ValaCodeNodeClass *) klass)->replace_type = (void (*) (ValaCodeNode*, ValaDataType*, ValaDataType*)) vala_array_creation_expression_real_replace_type;
1521 ((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_array_creation_expression_real_check;
1522 ((ValaCodeNodeClass *) klass)->emit = (void (*) (ValaCodeNode*, ValaCodeGenerator*)) vala_array_creation_expression_real_emit;
1523 ((ValaCodeNodeClass *) klass)->get_used_variables = (void (*) (ValaCodeNode*, ValaCollection*)) vala_array_creation_expression_real_get_used_variables;
1524 }
1525
1526 static void
vala_array_creation_expression_instance_init(ValaArrayCreationExpression * self,gpointer klass)1527 vala_array_creation_expression_instance_init (ValaArrayCreationExpression * self,
1528 gpointer klass)
1529 {
1530 GEqualFunc _tmp0_;
1531 ValaArrayList* _tmp1_;
1532 self->priv = vala_array_creation_expression_get_instance_private (self);
1533 _tmp0_ = g_direct_equal;
1534 _tmp1_ = vala_array_list_new (VALA_TYPE_EXPRESSION, (GBoxedCopyFunc) vala_code_node_ref, (GDestroyNotify) vala_code_node_unref, _tmp0_);
1535 self->priv->sizes = (ValaList*) _tmp1_;
1536 }
1537
1538 static void
vala_array_creation_expression_finalize(ValaCodeNode * obj)1539 vala_array_creation_expression_finalize (ValaCodeNode * obj)
1540 {
1541 ValaArrayCreationExpression * self;
1542 self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_ARRAY_CREATION_EXPRESSION, ValaArrayCreationExpression);
1543 _vala_iterable_unref0 (self->priv->sizes);
1544 _vala_code_node_unref0 (self->priv->_element_type);
1545 _vala_code_node_unref0 (self->priv->_length_type);
1546 _vala_code_node_unref0 (self->priv->_initializer_list);
1547 VALA_CODE_NODE_CLASS (vala_array_creation_expression_parent_class)->finalize (obj);
1548 }
1549
1550 /**
1551 * Represents an array creation expression.
1552 *
1553 * {{{ new int[] { 1, 2, 3 } }}}
1554 */
1555 static GType
vala_array_creation_expression_get_type_once(void)1556 vala_array_creation_expression_get_type_once (void)
1557 {
1558 static const GTypeInfo g_define_type_info = { sizeof (ValaArrayCreationExpressionClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_array_creation_expression_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaArrayCreationExpression), 0, (GInstanceInitFunc) vala_array_creation_expression_instance_init, NULL };
1559 GType vala_array_creation_expression_type_id;
1560 vala_array_creation_expression_type_id = g_type_register_static (VALA_TYPE_EXPRESSION, "ValaArrayCreationExpression", &g_define_type_info, 0);
1561 ValaArrayCreationExpression_private_offset = g_type_add_instance_private (vala_array_creation_expression_type_id, sizeof (ValaArrayCreationExpressionPrivate));
1562 return vala_array_creation_expression_type_id;
1563 }
1564
1565 GType
vala_array_creation_expression_get_type(void)1566 vala_array_creation_expression_get_type (void)
1567 {
1568 static volatile gsize vala_array_creation_expression_type_id__volatile = 0;
1569 if (g_once_init_enter (&vala_array_creation_expression_type_id__volatile)) {
1570 GType vala_array_creation_expression_type_id;
1571 vala_array_creation_expression_type_id = vala_array_creation_expression_get_type_once ();
1572 g_once_init_leave (&vala_array_creation_expression_type_id__volatile, vala_array_creation_expression_type_id);
1573 }
1574 return vala_array_creation_expression_type_id__volatile;
1575 }
1576
1577