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