1 /* valatypecheck.c generated by valac, the Vala compiler
2  * generated from valatypecheck.vala, do not modify */
3 
4 /* valatypecheck.vala
5  *
6  * Copyright (C) 2006-2010  Jürg Billeter
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12 
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17 
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
21  *
22  * Author:
23  * 	Jürg Billeter <j@bitron.ch>
24  */
25 
26 #include "vala.h"
27 #include <glib.h>
28 #include <stdlib.h>
29 #include <string.h>
30 
31 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
32 #define _g_free0(var) (var = (g_free (var), NULL))
33 
34 struct _ValaTypeCheckPrivate {
35 	ValaExpression* _expression;
36 	ValaDataType* _data_type;
37 };
38 
39 static gint ValaTypeCheck_private_offset;
40 static gpointer vala_typecheck_parent_class = NULL;
41 
42 static void vala_typecheck_real_accept (ValaCodeNode* base,
43                                  ValaCodeVisitor* visitor);
44 static void vala_typecheck_real_accept_children (ValaCodeNode* base,
45                                           ValaCodeVisitor* visitor);
46 static gboolean vala_typecheck_real_is_pure (ValaExpression* base);
47 static void vala_typecheck_real_replace_type (ValaCodeNode* base,
48                                        ValaDataType* old_type,
49                                        ValaDataType* new_type);
50 static void vala_typecheck_real_replace_expression (ValaCodeNode* base,
51                                              ValaExpression* old_node,
52                                              ValaExpression* new_node);
53 static gboolean vala_typecheck_real_check (ValaCodeNode* base,
54                                     ValaCodeContext* context);
55 static void vala_typecheck_real_emit (ValaCodeNode* base,
56                                ValaCodeGenerator* codegen);
57 static gchar* vala_typecheck_real_to_string (ValaCodeNode* base);
58 static void vala_typecheck_finalize (ValaCodeNode * obj);
59 static GType vala_typecheck_get_type_once (void);
60 
61 static inline gpointer
vala_typecheck_get_instance_private(ValaTypeCheck * self)62 vala_typecheck_get_instance_private (ValaTypeCheck* self)
63 {
64 	return G_STRUCT_MEMBER_P (self, ValaTypeCheck_private_offset);
65 }
66 
67 ValaExpression*
vala_typecheck_get_expression(ValaTypeCheck * self)68 vala_typecheck_get_expression (ValaTypeCheck* self)
69 {
70 	ValaExpression* result;
71 	ValaExpression* _tmp0_;
72 	g_return_val_if_fail (self != NULL, NULL);
73 	_tmp0_ = self->priv->_expression;
74 	result = _tmp0_;
75 	return result;
76 }
77 
78 static gpointer
_vala_code_node_ref0(gpointer self)79 _vala_code_node_ref0 (gpointer self)
80 {
81 	return self ? vala_code_node_ref (self) : NULL;
82 }
83 
84 void
vala_typecheck_set_expression(ValaTypeCheck * self,ValaExpression * value)85 vala_typecheck_set_expression (ValaTypeCheck* self,
86                                ValaExpression* value)
87 {
88 	ValaExpression* _tmp0_;
89 	ValaExpression* _tmp1_;
90 	g_return_if_fail (self != NULL);
91 	_tmp0_ = _vala_code_node_ref0 (value);
92 	_vala_code_node_unref0 (self->priv->_expression);
93 	self->priv->_expression = _tmp0_;
94 	_tmp1_ = self->priv->_expression;
95 	vala_code_node_set_parent_node ((ValaCodeNode*) _tmp1_, (ValaCodeNode*) self);
96 }
97 
98 ValaDataType*
vala_typecheck_get_type_reference(ValaTypeCheck * self)99 vala_typecheck_get_type_reference (ValaTypeCheck* self)
100 {
101 	ValaDataType* result;
102 	ValaDataType* _tmp0_;
103 	g_return_val_if_fail (self != NULL, NULL);
104 	_tmp0_ = self->priv->_data_type;
105 	result = _tmp0_;
106 	return result;
107 }
108 
109 void
vala_typecheck_set_type_reference(ValaTypeCheck * self,ValaDataType * value)110 vala_typecheck_set_type_reference (ValaTypeCheck* 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->_data_type);
118 	self->priv->_data_type = _tmp0_;
119 	_tmp1_ = self->priv->_data_type;
120 	vala_code_node_set_parent_node ((ValaCodeNode*) _tmp1_, (ValaCodeNode*) self);
121 }
122 
123 /**
124  * Creates a new type check expression.
125  *
126  * @param expr   an expression
127  * @param type   a data type
128  * @param source reference to source code
129  * @return       newly created type check expression
130  */
131 ValaTypeCheck*
vala_typecheck_construct(GType object_type,ValaExpression * expr,ValaDataType * type,ValaSourceReference * source)132 vala_typecheck_construct (GType object_type,
133                           ValaExpression* expr,
134                           ValaDataType* type,
135                           ValaSourceReference* source)
136 {
137 	ValaTypeCheck* self = NULL;
138 	g_return_val_if_fail (expr != NULL, NULL);
139 	g_return_val_if_fail (type != NULL, NULL);
140 	self = (ValaTypeCheck*) vala_expression_construct (object_type);
141 	vala_typecheck_set_expression (self, expr);
142 	vala_typecheck_set_type_reference (self, type);
143 	vala_code_node_set_source_reference ((ValaCodeNode*) self, source);
144 	return self;
145 }
146 
147 ValaTypeCheck*
vala_typecheck_new(ValaExpression * expr,ValaDataType * type,ValaSourceReference * source)148 vala_typecheck_new (ValaExpression* expr,
149                     ValaDataType* type,
150                     ValaSourceReference* source)
151 {
152 	return vala_typecheck_construct (VALA_TYPE_TYPECHECK, expr, type, source);
153 }
154 
155 static void
vala_typecheck_real_accept(ValaCodeNode * base,ValaCodeVisitor * visitor)156 vala_typecheck_real_accept (ValaCodeNode* base,
157                             ValaCodeVisitor* visitor)
158 {
159 	ValaTypeCheck * self;
160 	self = (ValaTypeCheck*) base;
161 	g_return_if_fail (visitor != NULL);
162 	vala_code_visitor_visit_type_check (visitor, self);
163 	vala_code_visitor_visit_expression (visitor, (ValaExpression*) self);
164 }
165 
166 static void
vala_typecheck_real_accept_children(ValaCodeNode * base,ValaCodeVisitor * visitor)167 vala_typecheck_real_accept_children (ValaCodeNode* base,
168                                      ValaCodeVisitor* visitor)
169 {
170 	ValaTypeCheck * self;
171 	ValaExpression* _tmp0_;
172 	ValaExpression* _tmp1_;
173 	ValaDataType* _tmp2_;
174 	ValaDataType* _tmp3_;
175 	self = (ValaTypeCheck*) base;
176 	g_return_if_fail (visitor != NULL);
177 	_tmp0_ = vala_typecheck_get_expression (self);
178 	_tmp1_ = _tmp0_;
179 	vala_code_node_accept ((ValaCodeNode*) _tmp1_, visitor);
180 	_tmp2_ = vala_typecheck_get_type_reference (self);
181 	_tmp3_ = _tmp2_;
182 	vala_code_node_accept ((ValaCodeNode*) _tmp3_, visitor);
183 }
184 
185 static gboolean
vala_typecheck_real_is_pure(ValaExpression * base)186 vala_typecheck_real_is_pure (ValaExpression* base)
187 {
188 	ValaTypeCheck * self;
189 	ValaExpression* _tmp0_;
190 	ValaExpression* _tmp1_;
191 	gboolean result = FALSE;
192 	self = (ValaTypeCheck*) base;
193 	_tmp0_ = vala_typecheck_get_expression (self);
194 	_tmp1_ = _tmp0_;
195 	result = vala_expression_is_pure (_tmp1_);
196 	return result;
197 }
198 
199 static void
vala_typecheck_real_replace_type(ValaCodeNode * base,ValaDataType * old_type,ValaDataType * new_type)200 vala_typecheck_real_replace_type (ValaCodeNode* base,
201                                   ValaDataType* old_type,
202                                   ValaDataType* new_type)
203 {
204 	ValaTypeCheck * self;
205 	ValaDataType* _tmp0_;
206 	ValaDataType* _tmp1_;
207 	self = (ValaTypeCheck*) base;
208 	g_return_if_fail (old_type != NULL);
209 	g_return_if_fail (new_type != NULL);
210 	_tmp0_ = vala_typecheck_get_type_reference (self);
211 	_tmp1_ = _tmp0_;
212 	if (_tmp1_ == old_type) {
213 		vala_typecheck_set_type_reference (self, new_type);
214 	}
215 }
216 
217 static void
vala_typecheck_real_replace_expression(ValaCodeNode * base,ValaExpression * old_node,ValaExpression * new_node)218 vala_typecheck_real_replace_expression (ValaCodeNode* base,
219                                         ValaExpression* old_node,
220                                         ValaExpression* new_node)
221 {
222 	ValaTypeCheck * self;
223 	ValaExpression* _tmp0_;
224 	ValaExpression* _tmp1_;
225 	self = (ValaTypeCheck*) base;
226 	g_return_if_fail (old_node != NULL);
227 	g_return_if_fail (new_node != NULL);
228 	_tmp0_ = vala_typecheck_get_expression (self);
229 	_tmp1_ = _tmp0_;
230 	if (_tmp1_ == old_node) {
231 		vala_typecheck_set_expression (self, new_node);
232 	}
233 }
234 
235 static gboolean
vala_typecheck_real_check(ValaCodeNode * base,ValaCodeContext * context)236 vala_typecheck_real_check (ValaCodeNode* base,
237                            ValaCodeContext* context)
238 {
239 	ValaTypeCheck * self;
240 	gboolean _tmp0_;
241 	gboolean _tmp1_;
242 	ValaExpression* _tmp4_;
243 	ValaExpression* _tmp5_;
244 	ValaDataType* _tmp6_;
245 	ValaDataType* _tmp7_;
246 	ValaExpression* _tmp8_;
247 	ValaExpression* _tmp9_;
248 	ValaDataType* _tmp10_;
249 	ValaDataType* _tmp11_;
250 	ValaDataType* _tmp16_;
251 	ValaDataType* _tmp17_;
252 	ValaTypeSymbol* _tmp18_;
253 	ValaTypeSymbol* _tmp19_;
254 	gboolean _tmp20_ = FALSE;
255 	ValaDataType* _tmp21_;
256 	ValaDataType* _tmp22_;
257 	gboolean _tmp37_ = FALSE;
258 	ValaProfile _tmp38_;
259 	ValaProfile _tmp39_;
260 	ValaSemanticAnalyzer* _tmp45_;
261 	ValaSemanticAnalyzer* _tmp46_;
262 	ValaDataType* _tmp47_;
263 	gboolean _tmp48_;
264 	gboolean _tmp49_;
265 	gboolean result = FALSE;
266 	self = (ValaTypeCheck*) base;
267 	g_return_val_if_fail (context != NULL, FALSE);
268 	_tmp0_ = vala_code_node_get_checked ((ValaCodeNode*) self);
269 	_tmp1_ = _tmp0_;
270 	if (_tmp1_) {
271 		gboolean _tmp2_;
272 		gboolean _tmp3_;
273 		_tmp2_ = vala_code_node_get_error ((ValaCodeNode*) self);
274 		_tmp3_ = _tmp2_;
275 		result = !_tmp3_;
276 		return result;
277 	}
278 	vala_code_node_set_checked ((ValaCodeNode*) self, TRUE);
279 	_tmp4_ = vala_typecheck_get_expression (self);
280 	_tmp5_ = _tmp4_;
281 	vala_code_node_check ((ValaCodeNode*) _tmp5_, context);
282 	_tmp6_ = vala_typecheck_get_type_reference (self);
283 	_tmp7_ = _tmp6_;
284 	vala_code_node_check ((ValaCodeNode*) _tmp7_, context);
285 	_tmp8_ = vala_typecheck_get_expression (self);
286 	_tmp9_ = _tmp8_;
287 	_tmp10_ = vala_expression_get_value_type (_tmp9_);
288 	_tmp11_ = _tmp10_;
289 	if (_tmp11_ == NULL) {
290 		ValaExpression* _tmp12_;
291 		ValaExpression* _tmp13_;
292 		ValaSourceReference* _tmp14_;
293 		ValaSourceReference* _tmp15_;
294 		_tmp12_ = vala_typecheck_get_expression (self);
295 		_tmp13_ = _tmp12_;
296 		_tmp14_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp13_);
297 		_tmp15_ = _tmp14_;
298 		vala_report_error (_tmp15_, "invalid left operand");
299 		vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
300 		result = FALSE;
301 		return result;
302 	}
303 	_tmp16_ = vala_typecheck_get_type_reference (self);
304 	_tmp17_ = _tmp16_;
305 	_tmp18_ = vala_data_type_get_type_symbol (_tmp17_);
306 	_tmp19_ = _tmp18_;
307 	if (_tmp19_ == NULL) {
308 		vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
309 		result = FALSE;
310 		return result;
311 	}
312 	_tmp21_ = vala_typecheck_get_type_reference (self);
313 	_tmp22_ = _tmp21_;
314 	if (VALA_IS_ERROR_TYPE (_tmp22_)) {
315 		ValaExpression* _tmp23_;
316 		ValaExpression* _tmp24_;
317 		ValaDataType* _tmp25_;
318 		ValaDataType* _tmp26_;
319 		_tmp23_ = vala_typecheck_get_expression (self);
320 		_tmp24_ = _tmp23_;
321 		_tmp25_ = vala_expression_get_value_type (_tmp24_);
322 		_tmp26_ = _tmp25_;
323 		_tmp20_ = !VALA_IS_ERROR_TYPE (_tmp26_);
324 	} else {
325 		_tmp20_ = FALSE;
326 	}
327 	if (_tmp20_) {
328 		ValaExpression* _tmp27_;
329 		ValaExpression* _tmp28_;
330 		ValaSourceReference* _tmp29_;
331 		ValaSourceReference* _tmp30_;
332 		ValaExpression* _tmp31_;
333 		ValaExpression* _tmp32_;
334 		gchar* _tmp33_;
335 		gchar* _tmp34_;
336 		gchar* _tmp35_;
337 		gchar* _tmp36_;
338 		_tmp27_ = vala_typecheck_get_expression (self);
339 		_tmp28_ = _tmp27_;
340 		_tmp29_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp28_);
341 		_tmp30_ = _tmp29_;
342 		_tmp31_ = vala_typecheck_get_expression (self);
343 		_tmp32_ = _tmp31_;
344 		_tmp33_ = vala_code_node_to_string ((ValaCodeNode*) _tmp32_);
345 		_tmp34_ = _tmp33_;
346 		_tmp35_ = g_strdup_printf ("`%s' must be an error", _tmp34_);
347 		_tmp36_ = _tmp35_;
348 		vala_report_error (_tmp30_, _tmp36_);
349 		_g_free0 (_tmp36_);
350 		_g_free0 (_tmp34_);
351 		vala_code_node_set_error ((ValaCodeNode*) self, TRUE);
352 		result = FALSE;
353 		return result;
354 	}
355 	_tmp38_ = vala_code_context_get_profile (context);
356 	_tmp39_ = _tmp38_;
357 	if (_tmp39_ == VALA_PROFILE_GOBJECT) {
358 		ValaDataType* _tmp40_;
359 		ValaDataType* _tmp41_;
360 		_tmp40_ = vala_typecheck_get_type_reference (self);
361 		_tmp41_ = _tmp40_;
362 		_tmp37_ = vala_data_type_has_type_arguments (_tmp41_);
363 	} else {
364 		_tmp37_ = FALSE;
365 	}
366 	if (_tmp37_) {
367 		ValaDataType* _tmp42_;
368 		ValaSourceReference* _tmp43_;
369 		ValaSourceReference* _tmp44_;
370 		_tmp42_ = self->priv->_data_type;
371 		_tmp43_ = vala_code_node_get_source_reference ((ValaCodeNode*) _tmp42_);
372 		_tmp44_ = _tmp43_;
373 		vala_report_warning (_tmp44_, "Type argument list has no effect");
374 	}
375 	_tmp45_ = vala_code_context_get_analyzer (context);
376 	_tmp46_ = _tmp45_;
377 	_tmp47_ = _tmp46_->bool_type;
378 	vala_expression_set_value_type ((ValaExpression*) self, _tmp47_);
379 	_tmp48_ = vala_code_node_get_error ((ValaCodeNode*) self);
380 	_tmp49_ = _tmp48_;
381 	result = !_tmp49_;
382 	return result;
383 }
384 
385 static void
vala_typecheck_real_emit(ValaCodeNode * base,ValaCodeGenerator * codegen)386 vala_typecheck_real_emit (ValaCodeNode* base,
387                           ValaCodeGenerator* codegen)
388 {
389 	ValaTypeCheck * self;
390 	ValaExpression* _tmp0_;
391 	ValaExpression* _tmp1_;
392 	self = (ValaTypeCheck*) base;
393 	g_return_if_fail (codegen != NULL);
394 	_tmp0_ = vala_typecheck_get_expression (self);
395 	_tmp1_ = _tmp0_;
396 	vala_code_node_emit ((ValaCodeNode*) _tmp1_, codegen);
397 	vala_code_visitor_visit_type_check ((ValaCodeVisitor*) codegen, self);
398 	vala_code_visitor_visit_expression ((ValaCodeVisitor*) codegen, (ValaExpression*) self);
399 }
400 
401 static gchar*
vala_typecheck_real_to_string(ValaCodeNode * base)402 vala_typecheck_real_to_string (ValaCodeNode* base)
403 {
404 	ValaTypeCheck * self;
405 	ValaExpression* _tmp0_;
406 	ValaExpression* _tmp1_;
407 	gchar* _tmp2_;
408 	gchar* _tmp3_;
409 	ValaDataType* _tmp4_;
410 	ValaDataType* _tmp5_;
411 	gchar* _tmp6_;
412 	gchar* _tmp7_;
413 	gchar* _tmp8_;
414 	gchar* _tmp9_;
415 	gchar* result = NULL;
416 	self = (ValaTypeCheck*) base;
417 	_tmp0_ = vala_typecheck_get_expression (self);
418 	_tmp1_ = _tmp0_;
419 	_tmp2_ = vala_code_node_to_string ((ValaCodeNode*) _tmp1_);
420 	_tmp3_ = _tmp2_;
421 	_tmp4_ = vala_typecheck_get_type_reference (self);
422 	_tmp5_ = _tmp4_;
423 	_tmp6_ = vala_code_node_to_string ((ValaCodeNode*) _tmp5_);
424 	_tmp7_ = _tmp6_;
425 	_tmp8_ = g_strdup_printf ("(%s is %s)", _tmp3_, _tmp7_);
426 	_tmp9_ = _tmp8_;
427 	_g_free0 (_tmp7_);
428 	_g_free0 (_tmp3_);
429 	result = _tmp9_;
430 	return result;
431 }
432 
433 static void
vala_typecheck_class_init(ValaTypeCheckClass * klass,gpointer klass_data)434 vala_typecheck_class_init (ValaTypeCheckClass * klass,
435                            gpointer klass_data)
436 {
437 	vala_typecheck_parent_class = g_type_class_peek_parent (klass);
438 	((ValaCodeNodeClass *) klass)->finalize = vala_typecheck_finalize;
439 	g_type_class_adjust_private_offset (klass, &ValaTypeCheck_private_offset);
440 	((ValaCodeNodeClass *) klass)->accept = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_typecheck_real_accept;
441 	((ValaCodeNodeClass *) klass)->accept_children = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_typecheck_real_accept_children;
442 	((ValaExpressionClass *) klass)->is_pure = (gboolean (*) (ValaExpression*)) vala_typecheck_real_is_pure;
443 	((ValaCodeNodeClass *) klass)->replace_type = (void (*) (ValaCodeNode*, ValaDataType*, ValaDataType*)) vala_typecheck_real_replace_type;
444 	((ValaCodeNodeClass *) klass)->replace_expression = (void (*) (ValaCodeNode*, ValaExpression*, ValaExpression*)) vala_typecheck_real_replace_expression;
445 	((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_typecheck_real_check;
446 	((ValaCodeNodeClass *) klass)->emit = (void (*) (ValaCodeNode*, ValaCodeGenerator*)) vala_typecheck_real_emit;
447 	((ValaCodeNodeClass *) klass)->to_string = (gchar* (*) (ValaCodeNode*)) vala_typecheck_real_to_string;
448 }
449 
450 static void
vala_typecheck_instance_init(ValaTypeCheck * self,gpointer klass)451 vala_typecheck_instance_init (ValaTypeCheck * self,
452                               gpointer klass)
453 {
454 	self->priv = vala_typecheck_get_instance_private (self);
455 }
456 
457 static void
vala_typecheck_finalize(ValaCodeNode * obj)458 vala_typecheck_finalize (ValaCodeNode * obj)
459 {
460 	ValaTypeCheck * self;
461 	self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_TYPECHECK, ValaTypeCheck);
462 	_vala_code_node_unref0 (self->priv->_expression);
463 	_vala_code_node_unref0 (self->priv->_data_type);
464 	VALA_CODE_NODE_CLASS (vala_typecheck_parent_class)->finalize (obj);
465 }
466 
467 /**
468  * Represents a type check (`is`) expression in the source code.
469  */
470 static GType
vala_typecheck_get_type_once(void)471 vala_typecheck_get_type_once (void)
472 {
473 	static const GTypeInfo g_define_type_info = { sizeof (ValaTypeCheckClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_typecheck_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaTypeCheck), 0, (GInstanceInitFunc) vala_typecheck_instance_init, NULL };
474 	GType vala_typecheck_type_id;
475 	vala_typecheck_type_id = g_type_register_static (VALA_TYPE_EXPRESSION, "ValaTypeCheck", &g_define_type_info, 0);
476 	ValaTypeCheck_private_offset = g_type_add_instance_private (vala_typecheck_type_id, sizeof (ValaTypeCheckPrivate));
477 	return vala_typecheck_type_id;
478 }
479 
480 GType
vala_typecheck_get_type(void)481 vala_typecheck_get_type (void)
482 {
483 	static volatile gsize vala_typecheck_type_id__volatile = 0;
484 	if (g_once_init_enter (&vala_typecheck_type_id__volatile)) {
485 		GType vala_typecheck_type_id;
486 		vala_typecheck_type_id = vala_typecheck_get_type_once ();
487 		g_once_init_leave (&vala_typecheck_type_id__volatile, vala_typecheck_type_id);
488 	}
489 	return vala_typecheck_type_id__volatile;
490 }
491 
492