1 /* valaarraytype.c generated by valac, the Vala compiler
2 * generated from valaarraytype.vala, do not modify */
3
4 /* valaarraytype.vala
5 *
6 * Copyright (C) 2007-2012 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 <glib.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <valagee.h>
31 #include <glib-object.h>
32
33 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
34 #define _vala_code_context_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_context_unref (var), NULL)))
35 #define _g_free0(var) (var = (g_free (var), NULL))
36
37 struct _ValaArrayTypePrivate {
38 gboolean _invalid_syntax;
39 gboolean _inline_allocated;
40 gboolean _fixed_length;
41 gint _rank;
42 ValaDataType* _element_type;
43 ValaDataType* _length_type;
44 ValaExpression* _length;
45 ValaArrayLengthField* length_field;
46 ValaArrayResizeMethod* resize_method;
47 ValaArrayMoveMethod* move_method;
48 ValaArrayCopyMethod* copy_method;
49 };
50
51 static gint ValaArrayType_private_offset;
52 static gpointer vala_array_type_parent_class = NULL;
53
54 static ValaSymbol* vala_array_type_real_get_member (ValaDataType* base,
55 const gchar* member_name);
56 static ValaArrayLengthField* vala_array_type_get_length_field (ValaArrayType* self);
57 static ValaArrayMoveMethod* vala_array_type_get_move_method (ValaArrayType* self);
58 static ValaArrayResizeMethod* vala_array_type_get_resize_method (ValaArrayType* self);
59 static ValaArrayCopyMethod* vala_array_type_get_copy_method (ValaArrayType* self);
60 static ValaDataType* vala_array_type_real_copy (ValaDataType* base);
61 static gchar* vala_array_type_real_to_qualified_string (ValaDataType* base,
62 ValaScope* scope);
63 static gboolean vala_array_type_real_compatible (ValaDataType* base,
64 ValaDataType* target_type);
65 static gboolean vala_array_type_real_is_reference_type_or_type_parameter (ValaDataType* base);
66 static void vala_array_type_real_accept_children (ValaCodeNode* base,
67 ValaCodeVisitor* visitor);
68 static void vala_array_type_real_replace_type (ValaCodeNode* base,
69 ValaDataType* old_type,
70 ValaDataType* new_type);
71 static gboolean vala_array_type_real_is_accessible (ValaDataType* base,
72 ValaSymbol* sym);
73 static gboolean vala_array_type_real_check (ValaCodeNode* base,
74 ValaCodeContext* context);
75 static ValaDataType* vala_array_type_real_get_actual_type (ValaDataType* base,
76 ValaDataType* derived_instance_type,
77 ValaList* method_type_arguments,
78 ValaCodeNode* node_reference);
79 static ValaDataType* vala_array_type_real_infer_type_argument (ValaDataType* base,
80 ValaTypeParameter* type_param,
81 ValaDataType* value_type);
82 static gboolean vala_array_type_real_is_disposable (ValaDataType* base);
83 static void vala_array_type_finalize (ValaCodeNode * obj);
84 static GType vala_array_type_get_type_once (void);
85
86 static inline gpointer
vala_array_type_get_instance_private(ValaArrayType * self)87 vala_array_type_get_instance_private (ValaArrayType* self)
88 {
89 return G_STRUCT_MEMBER_P (self, ValaArrayType_private_offset);
90 }
91
92 ValaDataType*
vala_array_type_get_element_type(ValaArrayType * self)93 vala_array_type_get_element_type (ValaArrayType* self)
94 {
95 ValaDataType* result;
96 ValaDataType* _tmp0_;
97 g_return_val_if_fail (self != NULL, NULL);
98 _tmp0_ = self->priv->_element_type;
99 result = _tmp0_;
100 return result;
101 }
102
103 static gpointer
_vala_code_node_ref0(gpointer self)104 _vala_code_node_ref0 (gpointer self)
105 {
106 return self ? vala_code_node_ref (self) : NULL;
107 }
108
109 void
vala_array_type_set_element_type(ValaArrayType * self,ValaDataType * value)110 vala_array_type_set_element_type (ValaArrayType* self,
111 ValaDataType* value)
112 {
113 ValaDataType* _tmp0_;
114 ValaDataType* _tmp1_;
115 g_return_if_fail (self != NULL);
116 _tmp0_ = _vala_code_node_ref0 (value);
117 _vala_code_node_unref0 (self->priv->_element_type);
118 self->priv->_element_type = _tmp0_;
119 _tmp1_ = self->priv->_element_type;
120 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp1_, (ValaCodeNode*) self);
121 }
122
123 ValaDataType*
vala_array_type_get_length_type(ValaArrayType * self)124 vala_array_type_get_length_type (ValaArrayType* self)
125 {
126 ValaDataType* result;
127 ValaDataType* _tmp0_;
128 g_return_val_if_fail (self != NULL, NULL);
129 _tmp0_ = self->priv->_length_type;
130 result = _tmp0_;
131 return result;
132 }
133
134 void
vala_array_type_set_length_type(ValaArrayType * self,ValaDataType * value)135 vala_array_type_set_length_type (ValaArrayType* self,
136 ValaDataType* value)
137 {
138 ValaDataType* _tmp0_;
139 ValaDataType* _tmp1_;
140 g_return_if_fail (self != NULL);
141 _tmp0_ = _vala_code_node_ref0 (value);
142 _vala_code_node_unref0 (self->priv->_length_type);
143 self->priv->_length_type = _tmp0_;
144 _tmp1_ = self->priv->_length_type;
145 if (_tmp1_ != NULL) {
146 ValaDataType* _tmp2_;
147 _tmp2_ = self->priv->_length_type;
148 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp2_, (ValaCodeNode*) self);
149 }
150 }
151
152 gboolean
vala_array_type_get_invalid_syntax(ValaArrayType * self)153 vala_array_type_get_invalid_syntax (ValaArrayType* self)
154 {
155 gboolean result;
156 g_return_val_if_fail (self != NULL, FALSE);
157 result = self->priv->_invalid_syntax;
158 return result;
159 }
160
161 void
vala_array_type_set_invalid_syntax(ValaArrayType * self,gboolean value)162 vala_array_type_set_invalid_syntax (ValaArrayType* self,
163 gboolean value)
164 {
165 g_return_if_fail (self != NULL);
166 self->priv->_invalid_syntax = value;
167 }
168
169 gboolean
vala_array_type_get_inline_allocated(ValaArrayType * self)170 vala_array_type_get_inline_allocated (ValaArrayType* self)
171 {
172 gboolean result;
173 g_return_val_if_fail (self != NULL, FALSE);
174 result = self->priv->_inline_allocated;
175 return result;
176 }
177
178 void
vala_array_type_set_inline_allocated(ValaArrayType * self,gboolean value)179 vala_array_type_set_inline_allocated (ValaArrayType* self,
180 gboolean value)
181 {
182 g_return_if_fail (self != NULL);
183 self->priv->_inline_allocated = value;
184 }
185
186 gboolean
vala_array_type_get_fixed_length(ValaArrayType * self)187 vala_array_type_get_fixed_length (ValaArrayType* self)
188 {
189 gboolean result;
190 g_return_val_if_fail (self != NULL, FALSE);
191 result = self->priv->_fixed_length;
192 return result;
193 }
194
195 void
vala_array_type_set_fixed_length(ValaArrayType * self,gboolean value)196 vala_array_type_set_fixed_length (ValaArrayType* self,
197 gboolean value)
198 {
199 g_return_if_fail (self != NULL);
200 self->priv->_fixed_length = value;
201 }
202
203 ValaExpression*
vala_array_type_get_length(ValaArrayType * self)204 vala_array_type_get_length (ValaArrayType* self)
205 {
206 ValaExpression* result;
207 ValaExpression* _tmp0_;
208 g_return_val_if_fail (self != NULL, NULL);
209 _tmp0_ = self->priv->_length;
210 result = _tmp0_;
211 return result;
212 }
213
214 void
vala_array_type_set_length(ValaArrayType * self,ValaExpression * value)215 vala_array_type_set_length (ValaArrayType* self,
216 ValaExpression* value)
217 {
218 ValaExpression* _tmp0_;
219 ValaExpression* _tmp1_;
220 g_return_if_fail (self != NULL);
221 _tmp0_ = _vala_code_node_ref0 (value);
222 _vala_code_node_unref0 (self->priv->_length);
223 self->priv->_length = _tmp0_;
224 _tmp1_ = self->priv->_length;
225 if (_tmp1_ != NULL) {
226 ValaExpression* _tmp2_;
227 _tmp2_ = self->priv->_length;
228 vala_code_node_set_parent_node ((ValaCodeNode*) _tmp2_, (ValaCodeNode*) self);
229 }
230 }
231
232 gint
vala_array_type_get_rank(ValaArrayType * self)233 vala_array_type_get_rank (ValaArrayType* self)
234 {
235 gint result;
236 g_return_val_if_fail (self != NULL, 0);
237 result = self->priv->_rank;
238 return result;
239 }
240
241 void
vala_array_type_set_rank(ValaArrayType * self,gint value)242 vala_array_type_set_rank (ValaArrayType* self,
243 gint value)
244 {
245 g_return_if_fail (self != NULL);
246 self->priv->_rank = value;
247 }
248
249 ValaArrayType*
vala_array_type_construct(GType object_type,ValaDataType * element_type,gint rank,ValaSourceReference * source_reference)250 vala_array_type_construct (GType object_type,
251 ValaDataType* element_type,
252 gint rank,
253 ValaSourceReference* source_reference)
254 {
255 ValaArrayType* self = NULL;
256 g_return_val_if_fail (element_type != NULL, NULL);
257 self = (ValaArrayType*) vala_reference_type_construct (object_type, NULL);
258 vala_array_type_set_element_type (self, element_type);
259 vala_array_type_set_rank (self, rank);
260 vala_code_node_set_source_reference ((ValaCodeNode*) self, source_reference);
261 return self;
262 }
263
264 ValaArrayType*
vala_array_type_new(ValaDataType * element_type,gint rank,ValaSourceReference * source_reference)265 vala_array_type_new (ValaDataType* element_type,
266 gint rank,
267 ValaSourceReference* source_reference)
268 {
269 return vala_array_type_construct (VALA_TYPE_ARRAY_TYPE, element_type, rank, source_reference);
270 }
271
272 static ValaSymbol*
vala_array_type_real_get_member(ValaDataType * base,const gchar * member_name)273 vala_array_type_real_get_member (ValaDataType* base,
274 const gchar* member_name)
275 {
276 ValaArrayType * self;
277 ValaSymbol* result = NULL;
278 self = (ValaArrayType*) base;
279 g_return_val_if_fail (member_name != NULL, NULL);
280 if (g_strcmp0 (member_name, "length") == 0) {
281 ValaArrayLengthField* _tmp0_;
282 ValaSymbol* _tmp1_;
283 _tmp0_ = vala_array_type_get_length_field (self);
284 _tmp1_ = _vala_code_node_ref0 ((ValaSymbol*) _tmp0_);
285 result = _tmp1_;
286 return result;
287 } else {
288 if (g_strcmp0 (member_name, "move") == 0) {
289 ValaArrayMoveMethod* _tmp2_;
290 ValaSymbol* _tmp3_;
291 _tmp2_ = vala_array_type_get_move_method (self);
292 _tmp3_ = _vala_code_node_ref0 ((ValaSymbol*) _tmp2_);
293 result = _tmp3_;
294 return result;
295 } else {
296 if (g_strcmp0 (member_name, "resize") == 0) {
297 gint _tmp4_;
298 ValaArrayResizeMethod* _tmp5_;
299 ValaSymbol* _tmp6_;
300 _tmp4_ = self->priv->_rank;
301 if (_tmp4_ > 1) {
302 result = NULL;
303 return result;
304 }
305 _tmp5_ = vala_array_type_get_resize_method (self);
306 _tmp6_ = _vala_code_node_ref0 ((ValaSymbol*) _tmp5_);
307 result = _tmp6_;
308 return result;
309 } else {
310 if (g_strcmp0 (member_name, "copy") == 0) {
311 ValaArrayCopyMethod* _tmp7_;
312 ValaSymbol* _tmp8_;
313 _tmp7_ = vala_array_type_get_copy_method (self);
314 _tmp8_ = _vala_code_node_ref0 ((ValaSymbol*) _tmp7_);
315 result = _tmp8_;
316 return result;
317 }
318 }
319 }
320 }
321 result = NULL;
322 return result;
323 }
324
325 static ValaArrayLengthField*
vala_array_type_get_length_field(ValaArrayType * self)326 vala_array_type_get_length_field (ValaArrayType* self)
327 {
328 ValaArrayLengthField* _tmp0_;
329 ValaArrayLengthField* _tmp20_;
330 ValaArrayLengthField* result = NULL;
331 g_return_val_if_fail (self != NULL, NULL);
332 _tmp0_ = self->priv->length_field;
333 if (_tmp0_ == NULL) {
334 ValaSourceReference* _tmp1_;
335 ValaSourceReference* _tmp2_;
336 ValaArrayLengthField* _tmp3_;
337 ValaArrayLengthField* _tmp4_;
338 gint _tmp5_;
339 _tmp1_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
340 _tmp2_ = _tmp1_;
341 _tmp3_ = vala_array_length_field_new (_tmp2_);
342 _vala_code_node_unref0 (self->priv->length_field);
343 self->priv->length_field = _tmp3_;
344 _tmp4_ = self->priv->length_field;
345 vala_symbol_set_access ((ValaSymbol*) _tmp4_, VALA_SYMBOL_ACCESSIBILITY_PUBLIC);
346 _tmp5_ = self->priv->_rank;
347 if (_tmp5_ > 1) {
348 ValaArrayLengthField* _tmp6_;
349 ValaDataType* _tmp7_;
350 ValaDataType* _tmp8_;
351 ValaDataType* _tmp9_;
352 ValaDataType* _tmp10_;
353 ValaSourceReference* _tmp11_;
354 ValaSourceReference* _tmp12_;
355 ValaArrayType* _tmp13_;
356 ValaArrayType* _tmp14_;
357 _tmp6_ = self->priv->length_field;
358 _tmp7_ = vala_array_type_get_length_type (self);
359 _tmp8_ = _tmp7_;
360 _tmp9_ = vala_data_type_copy (_tmp8_);
361 _tmp10_ = _tmp9_;
362 _tmp11_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
363 _tmp12_ = _tmp11_;
364 _tmp13_ = vala_array_type_new (_tmp10_, 1, _tmp12_);
365 _tmp14_ = _tmp13_;
366 vala_variable_set_variable_type ((ValaVariable*) _tmp6_, (ValaDataType*) _tmp14_);
367 _vala_code_node_unref0 (_tmp14_);
368 _vala_code_node_unref0 (_tmp10_);
369 } else {
370 ValaArrayLengthField* _tmp15_;
371 ValaDataType* _tmp16_;
372 ValaDataType* _tmp17_;
373 ValaDataType* _tmp18_;
374 ValaDataType* _tmp19_;
375 _tmp15_ = self->priv->length_field;
376 _tmp16_ = vala_array_type_get_length_type (self);
377 _tmp17_ = _tmp16_;
378 _tmp18_ = vala_data_type_copy (_tmp17_);
379 _tmp19_ = _tmp18_;
380 vala_variable_set_variable_type ((ValaVariable*) _tmp15_, _tmp19_);
381 _vala_code_node_unref0 (_tmp19_);
382 }
383 }
384 _tmp20_ = self->priv->length_field;
385 result = _tmp20_;
386 return result;
387 }
388
389 static ValaArrayResizeMethod*
vala_array_type_get_resize_method(ValaArrayType * self)390 vala_array_type_get_resize_method (ValaArrayType* self)
391 {
392 ValaArrayResizeMethod* _tmp0_;
393 ValaArrayResizeMethod* _tmp21_;
394 ValaArrayResizeMethod* result = NULL;
395 g_return_val_if_fail (self != NULL, NULL);
396 _tmp0_ = self->priv->resize_method;
397 if (_tmp0_ == NULL) {
398 ValaSourceReference* _tmp1_;
399 ValaSourceReference* _tmp2_;
400 ValaArrayResizeMethod* _tmp3_;
401 ValaArrayResizeMethod* _tmp4_;
402 ValaVoidType* _tmp5_;
403 ValaVoidType* _tmp6_;
404 ValaArrayResizeMethod* _tmp7_;
405 ValaCodeContext* _tmp8_;
406 ValaCodeContext* _tmp9_;
407 ValaProfile _tmp10_;
408 ValaProfile _tmp11_;
409 gboolean _tmp12_;
410 ValaArrayResizeMethod* _tmp15_;
411 ValaDataType* _tmp16_;
412 ValaDataType* _tmp17_;
413 ValaParameter* _tmp18_;
414 ValaParameter* _tmp19_;
415 ValaArrayResizeMethod* _tmp20_;
416 _tmp1_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
417 _tmp2_ = _tmp1_;
418 _tmp3_ = vala_array_resize_method_new (_tmp2_);
419 _vala_code_node_unref0 (self->priv->resize_method);
420 self->priv->resize_method = _tmp3_;
421 _tmp4_ = self->priv->resize_method;
422 _tmp5_ = vala_void_type_new (NULL);
423 _tmp6_ = _tmp5_;
424 vala_callable_set_return_type ((ValaCallable*) _tmp4_, (ValaDataType*) _tmp6_);
425 _vala_code_node_unref0 (_tmp6_);
426 _tmp7_ = self->priv->resize_method;
427 vala_symbol_set_access ((ValaSymbol*) _tmp7_, VALA_SYMBOL_ACCESSIBILITY_PUBLIC);
428 _tmp8_ = vala_code_context_get ();
429 _tmp9_ = _tmp8_;
430 _tmp10_ = vala_code_context_get_profile (_tmp9_);
431 _tmp11_ = _tmp10_;
432 _tmp12_ = _tmp11_ == VALA_PROFILE_POSIX;
433 _vala_code_context_unref0 (_tmp9_);
434 if (_tmp12_) {
435 ValaArrayResizeMethod* _tmp13_;
436 _tmp13_ = self->priv->resize_method;
437 vala_code_node_set_attribute_string ((ValaCodeNode*) _tmp13_, "CCode", "cname", "realloc", NULL);
438 } else {
439 ValaArrayResizeMethod* _tmp14_;
440 _tmp14_ = self->priv->resize_method;
441 vala_code_node_set_attribute_string ((ValaCodeNode*) _tmp14_, "CCode", "cname", "g_renew", NULL);
442 }
443 _tmp15_ = self->priv->resize_method;
444 _tmp16_ = vala_array_type_get_length_type (self);
445 _tmp17_ = _tmp16_;
446 _tmp18_ = vala_parameter_new ("length", _tmp17_, NULL);
447 _tmp19_ = _tmp18_;
448 vala_callable_add_parameter ((ValaCallable*) _tmp15_, _tmp19_);
449 _vala_code_node_unref0 (_tmp19_);
450 _tmp20_ = self->priv->resize_method;
451 vala_method_set_returns_modified_pointer ((ValaMethod*) _tmp20_, TRUE);
452 }
453 _tmp21_ = self->priv->resize_method;
454 result = _tmp21_;
455 return result;
456 }
457
458 static ValaArrayMoveMethod*
vala_array_type_get_move_method(ValaArrayType * self)459 vala_array_type_get_move_method (ValaArrayType* self)
460 {
461 ValaArrayMoveMethod* _tmp0_;
462 ValaArrayMoveMethod* _tmp24_;
463 ValaArrayMoveMethod* result = NULL;
464 g_return_val_if_fail (self != NULL, NULL);
465 _tmp0_ = self->priv->move_method;
466 if (_tmp0_ == NULL) {
467 ValaSourceReference* _tmp1_;
468 ValaSourceReference* _tmp2_;
469 ValaArrayMoveMethod* _tmp3_;
470 ValaArrayMoveMethod* _tmp4_;
471 ValaVoidType* _tmp5_;
472 ValaVoidType* _tmp6_;
473 ValaArrayMoveMethod* _tmp7_;
474 ValaArrayMoveMethod* _tmp8_;
475 ValaArrayMoveMethod* _tmp9_;
476 ValaDataType* _tmp10_;
477 ValaDataType* _tmp11_;
478 ValaParameter* _tmp12_;
479 ValaParameter* _tmp13_;
480 ValaArrayMoveMethod* _tmp14_;
481 ValaDataType* _tmp15_;
482 ValaDataType* _tmp16_;
483 ValaParameter* _tmp17_;
484 ValaParameter* _tmp18_;
485 ValaArrayMoveMethod* _tmp19_;
486 ValaDataType* _tmp20_;
487 ValaDataType* _tmp21_;
488 ValaParameter* _tmp22_;
489 ValaParameter* _tmp23_;
490 _tmp1_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
491 _tmp2_ = _tmp1_;
492 _tmp3_ = vala_array_move_method_new (_tmp2_);
493 _vala_code_node_unref0 (self->priv->move_method);
494 self->priv->move_method = _tmp3_;
495 _tmp4_ = self->priv->move_method;
496 _tmp5_ = vala_void_type_new (NULL);
497 _tmp6_ = _tmp5_;
498 vala_callable_set_return_type ((ValaCallable*) _tmp4_, (ValaDataType*) _tmp6_);
499 _vala_code_node_unref0 (_tmp6_);
500 _tmp7_ = self->priv->move_method;
501 vala_symbol_set_access ((ValaSymbol*) _tmp7_, VALA_SYMBOL_ACCESSIBILITY_PUBLIC);
502 _tmp8_ = self->priv->move_method;
503 vala_code_node_set_attribute_string ((ValaCodeNode*) _tmp8_, "CCode", "cname", "_vala_array_move", NULL);
504 _tmp9_ = self->priv->move_method;
505 _tmp10_ = vala_array_type_get_length_type (self);
506 _tmp11_ = _tmp10_;
507 _tmp12_ = vala_parameter_new ("src", _tmp11_, NULL);
508 _tmp13_ = _tmp12_;
509 vala_callable_add_parameter ((ValaCallable*) _tmp9_, _tmp13_);
510 _vala_code_node_unref0 (_tmp13_);
511 _tmp14_ = self->priv->move_method;
512 _tmp15_ = vala_array_type_get_length_type (self);
513 _tmp16_ = _tmp15_;
514 _tmp17_ = vala_parameter_new ("dest", _tmp16_, NULL);
515 _tmp18_ = _tmp17_;
516 vala_callable_add_parameter ((ValaCallable*) _tmp14_, _tmp18_);
517 _vala_code_node_unref0 (_tmp18_);
518 _tmp19_ = self->priv->move_method;
519 _tmp20_ = vala_array_type_get_length_type (self);
520 _tmp21_ = _tmp20_;
521 _tmp22_ = vala_parameter_new ("length", _tmp21_, NULL);
522 _tmp23_ = _tmp22_;
523 vala_callable_add_parameter ((ValaCallable*) _tmp19_, _tmp23_);
524 _vala_code_node_unref0 (_tmp23_);
525 }
526 _tmp24_ = self->priv->move_method;
527 result = _tmp24_;
528 return result;
529 }
530
531 static ValaArrayCopyMethod*
vala_array_type_get_copy_method(ValaArrayType * self)532 vala_array_type_get_copy_method (ValaArrayType* self)
533 {
534 ValaArrayCopyMethod* _tmp0_;
535 ValaArrayCopyMethod* _tmp12_;
536 ValaArrayCopyMethod* result = NULL;
537 g_return_val_if_fail (self != NULL, NULL);
538 _tmp0_ = self->priv->copy_method;
539 if (_tmp0_ == NULL) {
540 ValaSourceReference* _tmp1_;
541 ValaSourceReference* _tmp2_;
542 ValaArrayCopyMethod* _tmp3_;
543 ValaArrayCopyMethod* _tmp4_;
544 ValaDataType* _tmp5_;
545 ValaDataType* _tmp6_;
546 ValaArrayCopyMethod* _tmp7_;
547 ValaDataType* _tmp8_;
548 ValaDataType* _tmp9_;
549 ValaArrayCopyMethod* _tmp10_;
550 ValaArrayCopyMethod* _tmp11_;
551 _tmp1_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
552 _tmp2_ = _tmp1_;
553 _tmp3_ = vala_array_copy_method_new (_tmp2_);
554 _vala_code_node_unref0 (self->priv->copy_method);
555 self->priv->copy_method = _tmp3_;
556 _tmp4_ = self->priv->copy_method;
557 _tmp5_ = vala_data_type_copy ((ValaDataType*) self);
558 _tmp6_ = _tmp5_;
559 vala_callable_set_return_type ((ValaCallable*) _tmp4_, _tmp6_);
560 _vala_code_node_unref0 (_tmp6_);
561 _tmp7_ = self->priv->copy_method;
562 _tmp8_ = vala_callable_get_return_type ((ValaCallable*) _tmp7_);
563 _tmp9_ = _tmp8_;
564 vala_data_type_set_value_owned (_tmp9_, TRUE);
565 _tmp10_ = self->priv->copy_method;
566 vala_symbol_set_access ((ValaSymbol*) _tmp10_, VALA_SYMBOL_ACCESSIBILITY_PUBLIC);
567 _tmp11_ = self->priv->copy_method;
568 vala_code_node_set_attribute_string ((ValaCodeNode*) _tmp11_, "CCode", "cname", "_vala_array_copy", NULL);
569 }
570 _tmp12_ = self->priv->copy_method;
571 result = _tmp12_;
572 return result;
573 }
574
575 static ValaDataType*
vala_array_type_real_copy(ValaDataType * base)576 vala_array_type_real_copy (ValaDataType* base)
577 {
578 ValaArrayType * self;
579 ValaArrayType* _result_ = NULL;
580 ValaDataType* _tmp0_;
581 ValaDataType* _tmp1_;
582 ValaDataType* _tmp2_;
583 ValaDataType* _tmp3_;
584 gint _tmp4_;
585 ValaSourceReference* _tmp5_;
586 ValaSourceReference* _tmp6_;
587 ValaArrayType* _tmp7_;
588 ValaArrayType* _tmp8_;
589 ValaDataType* _tmp9_;
590 ValaDataType* _tmp10_;
591 ValaArrayType* _tmp16_;
592 gboolean _tmp17_;
593 gboolean _tmp18_;
594 ValaArrayType* _tmp19_;
595 gboolean _tmp20_;
596 gboolean _tmp21_;
597 ValaArrayType* _tmp22_;
598 gboolean _tmp23_;
599 gboolean _tmp24_;
600 ValaArrayType* _tmp25_;
601 gboolean _tmp26_;
602 gboolean _tmp27_;
603 ValaDataType* result = NULL;
604 self = (ValaArrayType*) base;
605 _tmp0_ = vala_array_type_get_element_type (self);
606 _tmp1_ = _tmp0_;
607 _tmp2_ = vala_data_type_copy (_tmp1_);
608 _tmp3_ = _tmp2_;
609 _tmp4_ = self->priv->_rank;
610 _tmp5_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
611 _tmp6_ = _tmp5_;
612 _tmp7_ = vala_array_type_new (_tmp3_, _tmp4_, _tmp6_);
613 _tmp8_ = _tmp7_;
614 _vala_code_node_unref0 (_tmp3_);
615 _result_ = _tmp8_;
616 _tmp9_ = vala_array_type_get_length_type (self);
617 _tmp10_ = _tmp9_;
618 if (_tmp10_ != NULL) {
619 ValaArrayType* _tmp11_;
620 ValaDataType* _tmp12_;
621 ValaDataType* _tmp13_;
622 ValaDataType* _tmp14_;
623 ValaDataType* _tmp15_;
624 _tmp11_ = _result_;
625 _tmp12_ = vala_array_type_get_length_type (self);
626 _tmp13_ = _tmp12_;
627 _tmp14_ = vala_data_type_copy (_tmp13_);
628 _tmp15_ = _tmp14_;
629 vala_array_type_set_length_type (_tmp11_, _tmp15_);
630 _vala_code_node_unref0 (_tmp15_);
631 }
632 _tmp16_ = _result_;
633 _tmp17_ = vala_data_type_get_value_owned ((ValaDataType*) self);
634 _tmp18_ = _tmp17_;
635 vala_data_type_set_value_owned ((ValaDataType*) _tmp16_, _tmp18_);
636 _tmp19_ = _result_;
637 _tmp20_ = vala_data_type_get_nullable ((ValaDataType*) self);
638 _tmp21_ = _tmp20_;
639 vala_data_type_set_nullable ((ValaDataType*) _tmp19_, _tmp21_);
640 _tmp22_ = _result_;
641 _tmp23_ = vala_data_type_get_floating_reference ((ValaDataType*) self);
642 _tmp24_ = _tmp23_;
643 vala_data_type_set_floating_reference ((ValaDataType*) _tmp22_, _tmp24_);
644 _tmp25_ = _result_;
645 _tmp26_ = self->priv->_inline_allocated;
646 vala_array_type_set_inline_allocated (_tmp25_, _tmp26_);
647 _tmp27_ = self->priv->_fixed_length;
648 if (_tmp27_) {
649 ValaArrayType* _tmp28_;
650 ValaArrayType* _tmp29_;
651 ValaExpression* _tmp30_;
652 ValaExpression* _tmp31_;
653 _tmp28_ = _result_;
654 vala_array_type_set_fixed_length (_tmp28_, TRUE);
655 _tmp29_ = _result_;
656 _tmp30_ = vala_array_type_get_length (self);
657 _tmp31_ = _tmp30_;
658 vala_array_type_set_length (_tmp29_, _tmp31_);
659 }
660 result = (ValaDataType*) _result_;
661 return result;
662 }
663
664 static gchar*
vala_array_type_real_to_qualified_string(ValaDataType * base,ValaScope * scope)665 vala_array_type_real_to_qualified_string (ValaDataType* base,
666 ValaScope* scope)
667 {
668 ValaArrayType * self;
669 gchar* elem_str = NULL;
670 ValaDataType* _tmp0_;
671 ValaDataType* _tmp1_;
672 gchar* _tmp2_;
673 gboolean _tmp3_ = FALSE;
674 ValaDataType* _tmp4_;
675 ValaDataType* _tmp5_;
676 gboolean _tmp10_;
677 gchar* result = NULL;
678 self = (ValaArrayType*) base;
679 _tmp0_ = vala_array_type_get_element_type (self);
680 _tmp1_ = _tmp0_;
681 _tmp2_ = vala_data_type_to_qualified_string (_tmp1_, scope);
682 elem_str = _tmp2_;
683 _tmp4_ = vala_array_type_get_element_type (self);
684 _tmp5_ = _tmp4_;
685 if (vala_data_type_is_weak (_tmp5_)) {
686 ValaCodeNode* _tmp6_;
687 ValaCodeNode* _tmp7_;
688 _tmp6_ = vala_code_node_get_parent_node ((ValaCodeNode*) self);
689 _tmp7_ = _tmp6_;
690 _tmp3_ = !VALA_IS_CONSTANT (_tmp7_);
691 } else {
692 _tmp3_ = FALSE;
693 }
694 if (_tmp3_) {
695 const gchar* _tmp8_;
696 gchar* _tmp9_;
697 _tmp8_ = elem_str;
698 _tmp9_ = g_strdup_printf ("(unowned %s)", _tmp8_);
699 _g_free0 (elem_str);
700 elem_str = _tmp9_;
701 }
702 _tmp10_ = self->priv->_fixed_length;
703 if (!_tmp10_) {
704 const gchar* _tmp11_ = NULL;
705 gboolean _tmp12_;
706 gboolean _tmp13_;
707 const gchar* _tmp14_;
708 gint _tmp15_;
709 gchar* _tmp16_;
710 gchar* _tmp17_;
711 gchar* _tmp18_;
712 gchar* _tmp19_;
713 _tmp12_ = vala_data_type_get_nullable ((ValaDataType*) self);
714 _tmp13_ = _tmp12_;
715 if (_tmp13_) {
716 _tmp11_ = "?";
717 } else {
718 _tmp11_ = "";
719 }
720 _tmp14_ = elem_str;
721 _tmp15_ = self->priv->_rank;
722 _tmp16_ = g_strnfill ((gsize) (_tmp15_ - 1), ',');
723 _tmp17_ = _tmp16_;
724 _tmp18_ = g_strdup_printf ("%s[%s]%s", _tmp14_, _tmp17_, _tmp11_);
725 _tmp19_ = _tmp18_;
726 _g_free0 (_tmp17_);
727 result = _tmp19_;
728 _g_free0 (elem_str);
729 return result;
730 } else {
731 result = elem_str;
732 return result;
733 }
734 _g_free0 (elem_str);
735 }
736
737 static gboolean
vala_array_type_real_compatible(ValaDataType * base,ValaDataType * target_type)738 vala_array_type_real_compatible (ValaDataType* base,
739 ValaDataType* target_type)
740 {
741 ValaArrayType * self;
742 ValaCodeContext* context = NULL;
743 ValaCodeContext* _tmp0_;
744 gboolean _tmp1_ = FALSE;
745 ValaCodeContext* _tmp2_;
746 ValaProfile _tmp3_;
747 ValaProfile _tmp4_;
748 gboolean _tmp35_ = FALSE;
749 ValaArrayType* target_array_type = NULL;
750 ValaArrayType* _tmp42_;
751 ValaArrayType* _tmp43_;
752 gint _tmp44_;
753 gint _tmp45_;
754 gboolean _tmp46_ = FALSE;
755 ValaDataType* _tmp47_;
756 ValaDataType* _tmp48_;
757 ValaDataType* _tmp58_;
758 ValaDataType* _tmp59_;
759 ValaArrayType* _tmp60_;
760 ValaDataType* _tmp61_;
761 ValaDataType* _tmp62_;
762 gboolean _tmp63_ = FALSE;
763 ValaDataType* _tmp64_;
764 ValaDataType* _tmp65_;
765 ValaArrayType* _tmp66_;
766 ValaDataType* _tmp67_;
767 ValaDataType* _tmp68_;
768 gboolean result = FALSE;
769 self = (ValaArrayType*) base;
770 g_return_val_if_fail (target_type != NULL, FALSE);
771 _tmp0_ = vala_code_context_get ();
772 context = _tmp0_;
773 _tmp2_ = context;
774 _tmp3_ = vala_code_context_get_profile (_tmp2_);
775 _tmp4_ = _tmp3_;
776 if (_tmp4_ == VALA_PROFILE_GOBJECT) {
777 ValaTypeSymbol* _tmp5_;
778 ValaTypeSymbol* _tmp6_;
779 _tmp5_ = vala_data_type_get_type_symbol (target_type);
780 _tmp6_ = _tmp5_;
781 _tmp1_ = _tmp6_ != NULL;
782 } else {
783 _tmp1_ = FALSE;
784 }
785 if (_tmp1_) {
786 gboolean _tmp7_ = FALSE;
787 ValaTypeSymbol* _tmp8_;
788 ValaTypeSymbol* _tmp9_;
789 ValaCodeContext* _tmp10_;
790 ValaSemanticAnalyzer* _tmp11_;
791 ValaSemanticAnalyzer* _tmp12_;
792 ValaStructValueType* _tmp13_;
793 ValaTypeSymbol* _tmp14_;
794 ValaTypeSymbol* _tmp15_;
795 ValaTypeSymbol* _tmp27_;
796 ValaTypeSymbol* _tmp28_;
797 ValaCodeContext* _tmp29_;
798 ValaSemanticAnalyzer* _tmp30_;
799 ValaSemanticAnalyzer* _tmp31_;
800 ValaObjectType* _tmp32_;
801 ValaTypeSymbol* _tmp33_;
802 ValaTypeSymbol* _tmp34_;
803 _tmp8_ = vala_data_type_get_type_symbol (target_type);
804 _tmp9_ = _tmp8_;
805 _tmp10_ = context;
806 _tmp11_ = vala_code_context_get_analyzer (_tmp10_);
807 _tmp12_ = _tmp11_;
808 _tmp13_ = _tmp12_->gvalue_type;
809 _tmp14_ = vala_data_type_get_type_symbol ((ValaDataType*) _tmp13_);
810 _tmp15_ = _tmp14_;
811 if (vala_typesymbol_is_subtype_of (_tmp9_, _tmp15_)) {
812 ValaDataType* _tmp16_;
813 ValaDataType* _tmp17_;
814 ValaTypeSymbol* _tmp18_;
815 ValaTypeSymbol* _tmp19_;
816 ValaCodeContext* _tmp20_;
817 ValaNamespace* _tmp21_;
818 ValaNamespace* _tmp22_;
819 ValaScope* _tmp23_;
820 ValaScope* _tmp24_;
821 ValaSymbol* _tmp25_;
822 ValaSymbol* _tmp26_;
823 _tmp16_ = vala_array_type_get_element_type (self);
824 _tmp17_ = _tmp16_;
825 _tmp18_ = vala_data_type_get_type_symbol (_tmp17_);
826 _tmp19_ = _tmp18_;
827 _tmp20_ = context;
828 _tmp21_ = vala_code_context_get_root (_tmp20_);
829 _tmp22_ = _tmp21_;
830 _tmp23_ = vala_symbol_get_scope ((ValaSymbol*) _tmp22_);
831 _tmp24_ = _tmp23_;
832 _tmp25_ = vala_scope_lookup (_tmp24_, "string");
833 _tmp26_ = _tmp25_;
834 _tmp7_ = G_TYPE_CHECK_INSTANCE_CAST (_tmp19_, VALA_TYPE_SYMBOL, ValaSymbol) == _tmp26_;
835 _vala_code_node_unref0 (_tmp26_);
836 } else {
837 _tmp7_ = FALSE;
838 }
839 if (_tmp7_) {
840 result = TRUE;
841 _vala_code_context_unref0 (context);
842 return result;
843 }
844 _tmp27_ = vala_data_type_get_type_symbol (target_type);
845 _tmp28_ = _tmp27_;
846 _tmp29_ = context;
847 _tmp30_ = vala_code_context_get_analyzer (_tmp29_);
848 _tmp31_ = _tmp30_;
849 _tmp32_ = _tmp31_->gvariant_type;
850 _tmp33_ = vala_data_type_get_type_symbol ((ValaDataType*) _tmp32_);
851 _tmp34_ = _tmp33_;
852 if (vala_typesymbol_is_subtype_of (_tmp28_, _tmp34_)) {
853 result = TRUE;
854 _vala_code_context_unref0 (context);
855 return result;
856 }
857 }
858 if (VALA_IS_POINTER_TYPE (target_type)) {
859 _tmp35_ = TRUE;
860 } else {
861 gboolean _tmp36_ = FALSE;
862 ValaTypeSymbol* _tmp37_;
863 ValaTypeSymbol* _tmp38_;
864 _tmp37_ = vala_data_type_get_type_symbol (target_type);
865 _tmp38_ = _tmp37_;
866 if (_tmp38_ != NULL) {
867 ValaTypeSymbol* _tmp39_;
868 ValaTypeSymbol* _tmp40_;
869 ValaAttribute* _tmp41_;
870 _tmp39_ = vala_data_type_get_type_symbol (target_type);
871 _tmp40_ = _tmp39_;
872 _tmp41_ = vala_code_node_get_attribute ((ValaCodeNode*) _tmp40_, "PointerType");
873 _tmp36_ = _tmp41_ != NULL;
874 } else {
875 _tmp36_ = FALSE;
876 }
877 _tmp35_ = _tmp36_;
878 }
879 if (_tmp35_) {
880 result = TRUE;
881 _vala_code_context_unref0 (context);
882 return result;
883 }
884 if (VALA_IS_GENERIC_TYPE (target_type)) {
885 result = TRUE;
886 _vala_code_context_unref0 (context);
887 return result;
888 }
889 target_array_type = VALA_IS_ARRAY_TYPE (target_type) ? ((ValaArrayType*) target_type) : NULL;
890 _tmp42_ = target_array_type;
891 if (_tmp42_ == NULL) {
892 result = FALSE;
893 _vala_code_context_unref0 (context);
894 return result;
895 }
896 _tmp43_ = target_array_type;
897 _tmp44_ = _tmp43_->priv->_rank;
898 _tmp45_ = self->priv->_rank;
899 if (_tmp44_ != _tmp45_) {
900 result = FALSE;
901 _vala_code_context_unref0 (context);
902 return result;
903 }
904 _tmp47_ = vala_array_type_get_element_type (self);
905 _tmp48_ = _tmp47_;
906 if (VALA_IS_VALUE_TYPE (_tmp48_)) {
907 ValaDataType* _tmp49_;
908 ValaDataType* _tmp50_;
909 gboolean _tmp51_;
910 gboolean _tmp52_;
911 ValaArrayType* _tmp53_;
912 ValaDataType* _tmp54_;
913 ValaDataType* _tmp55_;
914 gboolean _tmp56_;
915 gboolean _tmp57_;
916 _tmp49_ = vala_array_type_get_element_type (self);
917 _tmp50_ = _tmp49_;
918 _tmp51_ = vala_data_type_get_nullable (_tmp50_);
919 _tmp52_ = _tmp51_;
920 _tmp53_ = target_array_type;
921 _tmp54_ = vala_array_type_get_element_type (_tmp53_);
922 _tmp55_ = _tmp54_;
923 _tmp56_ = vala_data_type_get_nullable (_tmp55_);
924 _tmp57_ = _tmp56_;
925 _tmp46_ = _tmp52_ != _tmp57_;
926 } else {
927 _tmp46_ = FALSE;
928 }
929 if (_tmp46_) {
930 result = FALSE;
931 _vala_code_context_unref0 (context);
932 return result;
933 }
934 _tmp58_ = vala_array_type_get_length_type (self);
935 _tmp59_ = _tmp58_;
936 _tmp60_ = target_array_type;
937 _tmp61_ = vala_array_type_get_length_type (_tmp60_);
938 _tmp62_ = _tmp61_;
939 if (!vala_data_type_compatible (_tmp59_, _tmp62_)) {
940 result = FALSE;
941 _vala_code_context_unref0 (context);
942 return result;
943 }
944 _tmp64_ = vala_array_type_get_element_type (self);
945 _tmp65_ = _tmp64_;
946 _tmp66_ = target_array_type;
947 _tmp67_ = vala_array_type_get_element_type (_tmp66_);
948 _tmp68_ = _tmp67_;
949 if (vala_data_type_compatible (_tmp65_, _tmp68_)) {
950 ValaArrayType* _tmp69_;
951 ValaDataType* _tmp70_;
952 ValaDataType* _tmp71_;
953 ValaDataType* _tmp72_;
954 ValaDataType* _tmp73_;
955 _tmp69_ = target_array_type;
956 _tmp70_ = vala_array_type_get_element_type (_tmp69_);
957 _tmp71_ = _tmp70_;
958 _tmp72_ = vala_array_type_get_element_type (self);
959 _tmp73_ = _tmp72_;
960 _tmp63_ = vala_data_type_compatible (_tmp71_, _tmp73_);
961 } else {
962 _tmp63_ = FALSE;
963 }
964 if (_tmp63_) {
965 result = TRUE;
966 _vala_code_context_unref0 (context);
967 return result;
968 }
969 result = FALSE;
970 _vala_code_context_unref0 (context);
971 return result;
972 }
973
974 static gboolean
vala_array_type_real_is_reference_type_or_type_parameter(ValaDataType * base)975 vala_array_type_real_is_reference_type_or_type_parameter (ValaDataType* base)
976 {
977 ValaArrayType * self;
978 gboolean result = FALSE;
979 self = (ValaArrayType*) base;
980 result = TRUE;
981 return result;
982 }
983
984 static void
vala_array_type_real_accept_children(ValaCodeNode * base,ValaCodeVisitor * visitor)985 vala_array_type_real_accept_children (ValaCodeNode* base,
986 ValaCodeVisitor* visitor)
987 {
988 ValaArrayType * self;
989 ValaDataType* _tmp0_;
990 ValaDataType* _tmp1_;
991 ValaDataType* _tmp2_;
992 ValaDataType* _tmp3_;
993 self = (ValaArrayType*) base;
994 g_return_if_fail (visitor != NULL);
995 _tmp0_ = vala_array_type_get_element_type (self);
996 _tmp1_ = _tmp0_;
997 vala_code_node_accept ((ValaCodeNode*) _tmp1_, visitor);
998 _tmp2_ = vala_array_type_get_length_type (self);
999 _tmp3_ = _tmp2_;
1000 if (_tmp3_ != NULL) {
1001 ValaDataType* _tmp4_;
1002 ValaDataType* _tmp5_;
1003 _tmp4_ = vala_array_type_get_length_type (self);
1004 _tmp5_ = _tmp4_;
1005 vala_code_node_accept ((ValaCodeNode*) _tmp5_, visitor);
1006 }
1007 }
1008
1009 static void
vala_array_type_real_replace_type(ValaCodeNode * base,ValaDataType * old_type,ValaDataType * new_type)1010 vala_array_type_real_replace_type (ValaCodeNode* base,
1011 ValaDataType* old_type,
1012 ValaDataType* new_type)
1013 {
1014 ValaArrayType * self;
1015 ValaDataType* _tmp0_;
1016 ValaDataType* _tmp1_;
1017 ValaDataType* _tmp2_;
1018 ValaDataType* _tmp3_;
1019 self = (ValaArrayType*) base;
1020 g_return_if_fail (old_type != NULL);
1021 g_return_if_fail (new_type != NULL);
1022 _tmp0_ = vala_array_type_get_element_type (self);
1023 _tmp1_ = _tmp0_;
1024 if (_tmp1_ == old_type) {
1025 vala_array_type_set_element_type (self, new_type);
1026 }
1027 _tmp2_ = vala_array_type_get_length_type (self);
1028 _tmp3_ = _tmp2_;
1029 if (_tmp3_ == old_type) {
1030 vala_array_type_set_length_type (self, new_type);
1031 }
1032 }
1033
1034 static gboolean
vala_array_type_real_is_accessible(ValaDataType * base,ValaSymbol * sym)1035 vala_array_type_real_is_accessible (ValaDataType* base,
1036 ValaSymbol* sym)
1037 {
1038 ValaArrayType * self;
1039 gboolean _tmp0_ = FALSE;
1040 ValaDataType* _tmp1_;
1041 ValaDataType* _tmp2_;
1042 ValaDataType* _tmp5_;
1043 ValaDataType* _tmp6_;
1044 gboolean result = FALSE;
1045 self = (ValaArrayType*) base;
1046 g_return_val_if_fail (sym != NULL, FALSE);
1047 _tmp1_ = vala_array_type_get_length_type (self);
1048 _tmp2_ = _tmp1_;
1049 if (_tmp2_ != NULL) {
1050 ValaDataType* _tmp3_;
1051 ValaDataType* _tmp4_;
1052 _tmp3_ = vala_array_type_get_length_type (self);
1053 _tmp4_ = _tmp3_;
1054 _tmp0_ = !vala_data_type_is_accessible (_tmp4_, sym);
1055 } else {
1056 _tmp0_ = FALSE;
1057 }
1058 if (_tmp0_) {
1059 result = FALSE;
1060 return result;
1061 }
1062 _tmp5_ = vala_array_type_get_element_type (self);
1063 _tmp6_ = _tmp5_;
1064 result = vala_data_type_is_accessible (_tmp6_, sym);
1065 return result;
1066 }
1067
1068 static gboolean
vala_array_type_real_check(ValaCodeNode * base,ValaCodeContext * context)1069 vala_array_type_real_check (ValaCodeNode* base,
1070 ValaCodeContext* context)
1071 {
1072 ValaArrayType * self;
1073 gboolean _tmp0_;
1074 gboolean _tmp3_ = FALSE;
1075 gboolean _tmp4_;
1076 ValaDataType* _tmp30_;
1077 ValaDataType* _tmp31_;
1078 ValaDataType* _tmp46_;
1079 ValaDataType* _tmp47_;
1080 ValaDataType* _tmp66_;
1081 ValaDataType* _tmp67_;
1082 ValaDataType* _tmp68_;
1083 ValaDataType* _tmp69_;
1084 gboolean result = FALSE;
1085 self = (ValaArrayType*) base;
1086 g_return_val_if_fail (context != NULL, FALSE);
1087 _tmp0_ = self->priv->_invalid_syntax;
1088 if (_tmp0_) {
1089 ValaSourceReference* _tmp1_;
1090 ValaSourceReference* _tmp2_;
1091 _tmp1_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1092 _tmp2_ = _tmp1_;
1093 vala_report_error (_tmp2_, "syntax error, no expression allowed between array brackets");
1094 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1095 result = FALSE;
1096 return result;
1097 }
1098 _tmp4_ = self->priv->_fixed_length;
1099 if (_tmp4_) {
1100 ValaExpression* _tmp5_;
1101 ValaExpression* _tmp6_;
1102 _tmp5_ = vala_array_type_get_length (self);
1103 _tmp6_ = _tmp5_;
1104 _tmp3_ = _tmp6_ != NULL;
1105 } else {
1106 _tmp3_ = FALSE;
1107 }
1108 if (_tmp3_) {
1109 ValaExpression* _tmp7_;
1110 ValaExpression* _tmp8_;
1111 gboolean _tmp9_ = FALSE;
1112 gboolean _tmp10_ = FALSE;
1113 ValaExpression* _tmp11_;
1114 ValaExpression* _tmp12_;
1115 ValaDataType* _tmp13_;
1116 ValaDataType* _tmp14_;
1117 _tmp7_ = vala_array_type_get_length (self);
1118 _tmp8_ = _tmp7_;
1119 vala_code_node_check ((ValaCodeNode*) _tmp8_, context);
1120 _tmp11_ = vala_array_type_get_length (self);
1121 _tmp12_ = _tmp11_;
1122 _tmp13_ = vala_expression_get_value_type (_tmp12_);
1123 _tmp14_ = _tmp13_;
1124 if (_tmp14_ == NULL) {
1125 _tmp10_ = TRUE;
1126 } else {
1127 gboolean _tmp15_ = FALSE;
1128 ValaExpression* _tmp16_;
1129 ValaExpression* _tmp17_;
1130 ValaDataType* _tmp18_;
1131 ValaDataType* _tmp19_;
1132 _tmp16_ = vala_array_type_get_length (self);
1133 _tmp17_ = _tmp16_;
1134 _tmp18_ = vala_expression_get_value_type (_tmp17_);
1135 _tmp19_ = _tmp18_;
1136 if (VALA_IS_INTEGER_TYPE (_tmp19_)) {
1137 _tmp15_ = TRUE;
1138 } else {
1139 ValaExpression* _tmp20_;
1140 ValaExpression* _tmp21_;
1141 ValaDataType* _tmp22_;
1142 ValaDataType* _tmp23_;
1143 _tmp20_ = vala_array_type_get_length (self);
1144 _tmp21_ = _tmp20_;
1145 _tmp22_ = vala_expression_get_value_type (_tmp21_);
1146 _tmp23_ = _tmp22_;
1147 _tmp15_ = VALA_IS_ENUM_VALUE_TYPE (_tmp23_);
1148 }
1149 _tmp10_ = !_tmp15_;
1150 }
1151 if (_tmp10_) {
1152 _tmp9_ = TRUE;
1153 } else {
1154 ValaExpression* _tmp24_;
1155 ValaExpression* _tmp25_;
1156 _tmp24_ = vala_array_type_get_length (self);
1157 _tmp25_ = _tmp24_;
1158 _tmp9_ = !vala_expression_is_constant (_tmp25_);
1159 }
1160 if (_tmp9_) {
1161 ValaExpression* _tmp26_;
1162 ValaExpression* _tmp27_;
1163 ValaSourceReference* _tmp28_;
1164 ValaSourceReference* _tmp29_;
1165 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1166 _tmp26_ = vala_array_type_get_length (self);
1167 _tmp27_ = _tmp26_;
1168 _tmp28_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp27_);
1169 _tmp29_ = _tmp28_;
1170 vala_report_error (_tmp29_, "Expression of constant integer type expected");
1171 result = FALSE;
1172 return result;
1173 }
1174 }
1175 _tmp30_ = vala_array_type_get_element_type (self);
1176 _tmp31_ = _tmp30_;
1177 if (VALA_IS_ARRAY_TYPE (_tmp31_)) {
1178 ValaSourceReference* _tmp32_;
1179 ValaSourceReference* _tmp33_;
1180 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1181 _tmp32_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1182 _tmp33_ = _tmp32_;
1183 vala_report_error (_tmp33_, "Stacked arrays are not supported");
1184 result = FALSE;
1185 return result;
1186 } else {
1187 ValaDataType* _tmp34_;
1188 ValaDataType* _tmp35_;
1189 _tmp34_ = vala_array_type_get_element_type (self);
1190 _tmp35_ = _tmp34_;
1191 if (VALA_IS_DELEGATE_TYPE (_tmp35_)) {
1192 ValaDelegateType* delegate_type = NULL;
1193 ValaDataType* _tmp36_;
1194 ValaDataType* _tmp37_;
1195 ValaDelegateType* _tmp38_;
1196 ValaDelegateType* _tmp39_;
1197 ValaDelegate* _tmp40_;
1198 ValaDelegate* _tmp41_;
1199 gboolean _tmp42_;
1200 gboolean _tmp43_;
1201 _tmp36_ = vala_array_type_get_element_type (self);
1202 _tmp37_ = _tmp36_;
1203 _tmp38_ = _vala_code_node_ref0 (G_TYPE_CHECK_INSTANCE_CAST (_tmp37_, VALA_TYPE_DELEGATE_TYPE, ValaDelegateType));
1204 delegate_type = _tmp38_;
1205 _tmp39_ = delegate_type;
1206 _tmp40_ = vala_delegate_type_get_delegate_symbol (_tmp39_);
1207 _tmp41_ = _tmp40_;
1208 _tmp42_ = vala_delegate_get_has_target (_tmp41_);
1209 _tmp43_ = _tmp42_;
1210 if (_tmp43_) {
1211 ValaSourceReference* _tmp44_;
1212 ValaSourceReference* _tmp45_;
1213 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1214 _tmp44_ = vala_code_node_get_source_reference ((ValaCodeNode*) self);
1215 _tmp45_ = _tmp44_;
1216 vala_report_error (_tmp45_, "Delegates with target are not supported as array element type");
1217 result = FALSE;
1218 _vala_code_node_unref0 (delegate_type);
1219 return result;
1220 }
1221 _vala_code_node_unref0 (delegate_type);
1222 }
1223 }
1224 _tmp46_ = vala_array_type_get_length_type (self);
1225 _tmp47_ = _tmp46_;
1226 if (_tmp47_ == NULL) {
1227 ValaSemanticAnalyzer* _tmp48_;
1228 ValaSemanticAnalyzer* _tmp49_;
1229 ValaDataType* _tmp50_;
1230 ValaDataType* _tmp51_;
1231 ValaDataType* _tmp52_;
1232 _tmp48_ = vala_code_context_get_analyzer (context);
1233 _tmp49_ = _tmp48_;
1234 _tmp50_ = _tmp49_->int_type;
1235 _tmp51_ = vala_data_type_copy (_tmp50_);
1236 _tmp52_ = _tmp51_;
1237 vala_array_type_set_length_type (self, _tmp52_);
1238 _vala_code_node_unref0 (_tmp52_);
1239 } else {
1240 ValaDataType* _tmp53_;
1241 ValaDataType* _tmp54_;
1242 gboolean _tmp55_ = FALSE;
1243 ValaDataType* _tmp56_;
1244 ValaDataType* _tmp57_;
1245 _tmp53_ = vala_array_type_get_length_type (self);
1246 _tmp54_ = _tmp53_;
1247 vala_code_node_check ((ValaCodeNode*) _tmp54_, context);
1248 _tmp56_ = vala_array_type_get_length_type (self);
1249 _tmp57_ = _tmp56_;
1250 if (!VALA_IS_INTEGER_TYPE (_tmp57_)) {
1251 _tmp55_ = TRUE;
1252 } else {
1253 ValaDataType* _tmp58_;
1254 ValaDataType* _tmp59_;
1255 gboolean _tmp60_;
1256 gboolean _tmp61_;
1257 _tmp58_ = vala_array_type_get_length_type (self);
1258 _tmp59_ = _tmp58_;
1259 _tmp60_ = vala_data_type_get_nullable (_tmp59_);
1260 _tmp61_ = _tmp60_;
1261 _tmp55_ = _tmp61_;
1262 }
1263 if (_tmp55_) {
1264 ValaDataType* _tmp62_;
1265 ValaDataType* _tmp63_;
1266 ValaSourceReference* _tmp64_;
1267 ValaSourceReference* _tmp65_;
1268 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1269 _tmp62_ = vala_array_type_get_length_type (self);
1270 _tmp63_ = _tmp62_;
1271 _tmp64_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp63_);
1272 _tmp65_ = _tmp64_;
1273 vala_report_error (_tmp65_, "Expected integer type as length type of array");
1274 result = FALSE;
1275 return result;
1276 }
1277 }
1278 _tmp66_ = vala_array_type_get_element_type (self);
1279 _tmp67_ = _tmp66_;
1280 if (!vala_code_node_check ((ValaCodeNode*) _tmp67_, context)) {
1281 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1282 result = FALSE;
1283 return result;
1284 }
1285 _tmp68_ = vala_array_type_get_element_type (self);
1286 _tmp69_ = _tmp68_;
1287 if (!vala_data_type_check_type_arguments (_tmp69_, context, TRUE)) {
1288 vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
1289 result = FALSE;
1290 return result;
1291 }
1292 result = TRUE;
1293 return result;
1294 }
1295
1296 static ValaDataType*
vala_array_type_real_get_actual_type(ValaDataType * base,ValaDataType * derived_instance_type,ValaList * method_type_arguments,ValaCodeNode * node_reference)1297 vala_array_type_real_get_actual_type (ValaDataType* base,
1298 ValaDataType* derived_instance_type,
1299 ValaList* method_type_arguments,
1300 ValaCodeNode* node_reference)
1301 {
1302 ValaArrayType * self;
1303 ValaArrayType* _result_ = NULL;
1304 ValaDataType* _tmp0_;
1305 gboolean _tmp1_ = FALSE;
1306 gboolean _tmp2_ = FALSE;
1307 ValaDataType* _tmp3_;
1308 ValaDataType* _tmp4_;
1309 ValaDataType* result = NULL;
1310 self = (ValaArrayType*) base;
1311 _tmp0_ = vala_data_type_copy ((ValaDataType*) self);
1312 _result_ = G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, VALA_TYPE_ARRAY_TYPE, ValaArrayType);
1313 if (derived_instance_type == NULL) {
1314 _tmp1_ = method_type_arguments == NULL;
1315 } else {
1316 _tmp1_ = FALSE;
1317 }
1318 if (_tmp1_) {
1319 result = (ValaDataType*) _result_;
1320 return result;
1321 }
1322 _tmp3_ = vala_array_type_get_element_type (self);
1323 _tmp4_ = _tmp3_;
1324 if (VALA_IS_GENERIC_TYPE (_tmp4_)) {
1325 _tmp2_ = TRUE;
1326 } else {
1327 ValaDataType* _tmp5_;
1328 ValaDataType* _tmp6_;
1329 _tmp5_ = vala_array_type_get_element_type (self);
1330 _tmp6_ = _tmp5_;
1331 _tmp2_ = vala_data_type_has_type_arguments (_tmp6_);
1332 }
1333 if (_tmp2_) {
1334 ValaArrayType* _tmp7_;
1335 ValaArrayType* _tmp8_;
1336 ValaDataType* _tmp9_;
1337 ValaDataType* _tmp10_;
1338 ValaDataType* _tmp11_;
1339 ValaDataType* _tmp12_;
1340 _tmp7_ = _result_;
1341 _tmp8_ = _result_;
1342 _tmp9_ = vala_array_type_get_element_type (_tmp8_);
1343 _tmp10_ = _tmp9_;
1344 _tmp11_ = vala_data_type_get_actual_type (_tmp10_, derived_instance_type, method_type_arguments, node_reference);
1345 _tmp12_ = _tmp11_;
1346 vala_array_type_set_element_type (_tmp7_, _tmp12_);
1347 _vala_code_node_unref0 (_tmp12_);
1348 }
1349 result = (ValaDataType*) _result_;
1350 return result;
1351 }
1352
1353 static ValaDataType*
vala_array_type_real_infer_type_argument(ValaDataType * base,ValaTypeParameter * type_param,ValaDataType * value_type)1354 vala_array_type_real_infer_type_argument (ValaDataType* base,
1355 ValaTypeParameter* type_param,
1356 ValaDataType* value_type)
1357 {
1358 ValaArrayType * self;
1359 ValaArrayType* array_type = NULL;
1360 ValaArrayType* _tmp0_;
1361 ValaDataType* result = NULL;
1362 self = (ValaArrayType*) base;
1363 g_return_val_if_fail (type_param != NULL, NULL);
1364 g_return_val_if_fail (value_type != NULL, NULL);
1365 array_type = VALA_IS_ARRAY_TYPE (value_type) ? ((ValaArrayType*) value_type) : NULL;
1366 _tmp0_ = array_type;
1367 if (_tmp0_ != NULL) {
1368 ValaDataType* _tmp1_;
1369 ValaDataType* _tmp2_;
1370 ValaArrayType* _tmp3_;
1371 ValaDataType* _tmp4_;
1372 ValaDataType* _tmp5_;
1373 ValaDataType* _tmp6_;
1374 _tmp1_ = vala_array_type_get_element_type (self);
1375 _tmp2_ = _tmp1_;
1376 _tmp3_ = array_type;
1377 _tmp4_ = vala_array_type_get_element_type (_tmp3_);
1378 _tmp5_ = _tmp4_;
1379 _tmp6_ = vala_data_type_infer_type_argument (_tmp2_, type_param, _tmp5_);
1380 result = _tmp6_;
1381 return result;
1382 }
1383 result = NULL;
1384 return result;
1385 }
1386
1387 static gboolean
vala_array_type_real_is_disposable(ValaDataType * base)1388 vala_array_type_real_is_disposable (ValaDataType* base)
1389 {
1390 ValaArrayType * self;
1391 gboolean _tmp0_;
1392 gboolean result = FALSE;
1393 self = (ValaArrayType*) base;
1394 _tmp0_ = self->priv->_fixed_length;
1395 if (_tmp0_) {
1396 ValaDataType* _tmp1_;
1397 ValaDataType* _tmp2_;
1398 _tmp1_ = vala_array_type_get_element_type (self);
1399 _tmp2_ = _tmp1_;
1400 result = vala_data_type_is_disposable (_tmp2_);
1401 return result;
1402 } else {
1403 result = VALA_DATA_TYPE_CLASS (vala_array_type_parent_class)->is_disposable ((ValaDataType*) G_TYPE_CHECK_INSTANCE_CAST (self, VALA_TYPE_REFERENCE_TYPE, ValaReferenceType));
1404 return result;
1405 }
1406 }
1407
1408 static void
vala_array_type_class_init(ValaArrayTypeClass * klass,gpointer klass_data)1409 vala_array_type_class_init (ValaArrayTypeClass * klass,
1410 gpointer klass_data)
1411 {
1412 vala_array_type_parent_class = g_type_class_peek_parent (klass);
1413 ((ValaCodeNodeClass *) klass)->finalize = vala_array_type_finalize;
1414 g_type_class_adjust_private_offset (klass, &ValaArrayType_private_offset);
1415 ((ValaDataTypeClass *) klass)->get_member = (ValaSymbol* (*) (ValaDataType*, const gchar*)) vala_array_type_real_get_member;
1416 ((ValaDataTypeClass *) klass)->copy = (ValaDataType* (*) (ValaDataType*)) vala_array_type_real_copy;
1417 ((ValaDataTypeClass *) klass)->to_qualified_string = (gchar* (*) (ValaDataType*, ValaScope*)) vala_array_type_real_to_qualified_string;
1418 ((ValaDataTypeClass *) klass)->compatible = (gboolean (*) (ValaDataType*, ValaDataType*)) vala_array_type_real_compatible;
1419 ((ValaDataTypeClass *) klass)->is_reference_type_or_type_parameter = (gboolean (*) (ValaDataType*)) vala_array_type_real_is_reference_type_or_type_parameter;
1420 ((ValaCodeNodeClass *) klass)->accept_children = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_array_type_real_accept_children;
1421 ((ValaCodeNodeClass *) klass)->replace_type = (void (*) (ValaCodeNode*, ValaDataType*, ValaDataType*)) vala_array_type_real_replace_type;
1422 ((ValaDataTypeClass *) klass)->is_accessible = (gboolean (*) (ValaDataType*, ValaSymbol*)) vala_array_type_real_is_accessible;
1423 ((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_array_type_real_check;
1424 ((ValaDataTypeClass *) klass)->get_actual_type = (ValaDataType* (*) (ValaDataType*, ValaDataType*, ValaList*, ValaCodeNode*)) vala_array_type_real_get_actual_type;
1425 ((ValaDataTypeClass *) klass)->infer_type_argument = (ValaDataType* (*) (ValaDataType*, ValaTypeParameter*, ValaDataType*)) vala_array_type_real_infer_type_argument;
1426 ((ValaDataTypeClass *) klass)->is_disposable = (gboolean (*) (ValaDataType*)) vala_array_type_real_is_disposable;
1427 }
1428
1429 static void
vala_array_type_instance_init(ValaArrayType * self,gpointer klass)1430 vala_array_type_instance_init (ValaArrayType * self,
1431 gpointer klass)
1432 {
1433 self->priv = vala_array_type_get_instance_private (self);
1434 }
1435
1436 static void
vala_array_type_finalize(ValaCodeNode * obj)1437 vala_array_type_finalize (ValaCodeNode * obj)
1438 {
1439 ValaArrayType * self;
1440 self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_ARRAY_TYPE, ValaArrayType);
1441 _vala_code_node_unref0 (self->priv->_element_type);
1442 _vala_code_node_unref0 (self->priv->_length_type);
1443 _vala_code_node_unref0 (self->priv->_length);
1444 _vala_code_node_unref0 (self->priv->length_field);
1445 _vala_code_node_unref0 (self->priv->resize_method);
1446 _vala_code_node_unref0 (self->priv->move_method);
1447 _vala_code_node_unref0 (self->priv->copy_method);
1448 VALA_CODE_NODE_CLASS (vala_array_type_parent_class)->finalize (obj);
1449 }
1450
1451 /**
1452 * An array type.
1453 */
1454 static GType
vala_array_type_get_type_once(void)1455 vala_array_type_get_type_once (void)
1456 {
1457 static const GTypeInfo g_define_type_info = { sizeof (ValaArrayTypeClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_array_type_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaArrayType), 0, (GInstanceInitFunc) vala_array_type_instance_init, NULL };
1458 GType vala_array_type_type_id;
1459 vala_array_type_type_id = g_type_register_static (VALA_TYPE_REFERENCE_TYPE, "ValaArrayType", &g_define_type_info, 0);
1460 ValaArrayType_private_offset = g_type_add_instance_private (vala_array_type_type_id, sizeof (ValaArrayTypePrivate));
1461 return vala_array_type_type_id;
1462 }
1463
1464 GType
vala_array_type_get_type(void)1465 vala_array_type_get_type (void)
1466 {
1467 static volatile gsize vala_array_type_type_id__volatile = 0;
1468 if (g_once_init_enter (&vala_array_type_type_id__volatile)) {
1469 GType vala_array_type_type_id;
1470 vala_array_type_type_id = vala_array_type_get_type_once ();
1471 g_once_init_leave (&vala_array_type_type_id__volatile, vala_array_type_type_id);
1472 }
1473 return vala_array_type_type_id__volatile;
1474 }
1475
1476