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