1 /* valaintegerliteral.c generated by valac, the Vala compiler
2 * generated from valaintegerliteral.vala, do not modify */
3
4 /* valaintegerliteral.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 <stdlib.h>
28 #include <string.h>
29 #include <glib.h>
30
31 #define _g_free0(var) (var = (g_free (var), NULL))
32 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
33
34 struct _ValaIntegerLiteralPrivate {
35 gchar* _value;
36 gchar* _type_suffix;
37 };
38
39 static gint ValaIntegerLiteral_private_offset;
40 static gpointer vala_integer_literal_parent_class = NULL;
41
42 static void vala_integer_literal_real_accept (ValaCodeNode* base,
43 ValaCodeVisitor* visitor);
44 static gchar* vala_integer_literal_real_to_string (ValaCodeNode* base);
45 static gboolean vala_integer_literal_real_is_pure (ValaExpression* base);
46 static gboolean vala_integer_literal_real_check (ValaCodeNode* base,
47 ValaCodeContext* context);
48 static void vala_integer_literal_real_emit (ValaCodeNode* base,
49 ValaCodeGenerator* codegen);
50 static void vala_integer_literal_finalize (ValaCodeNode * obj);
51 static GType vala_integer_literal_get_type_once (void);
52
53 static inline gpointer
vala_integer_literal_get_instance_private(ValaIntegerLiteral * self)54 vala_integer_literal_get_instance_private (ValaIntegerLiteral* self)
55 {
56 return G_STRUCT_MEMBER_P (self, ValaIntegerLiteral_private_offset);
57 }
58
59 const gchar*
vala_integer_literal_get_value(ValaIntegerLiteral * self)60 vala_integer_literal_get_value (ValaIntegerLiteral* self)
61 {
62 const gchar* result;
63 const gchar* _tmp0_;
64 g_return_val_if_fail (self != NULL, NULL);
65 _tmp0_ = self->priv->_value;
66 result = _tmp0_;
67 return result;
68 }
69
70 void
vala_integer_literal_set_value(ValaIntegerLiteral * self,const gchar * value)71 vala_integer_literal_set_value (ValaIntegerLiteral* self,
72 const gchar* value)
73 {
74 gchar* _tmp0_;
75 g_return_if_fail (self != NULL);
76 _tmp0_ = g_strdup (value);
77 _g_free0 (self->priv->_value);
78 self->priv->_value = _tmp0_;
79 }
80
81 const gchar*
vala_integer_literal_get_type_suffix(ValaIntegerLiteral * self)82 vala_integer_literal_get_type_suffix (ValaIntegerLiteral* self)
83 {
84 const gchar* result;
85 const gchar* _tmp0_;
86 g_return_val_if_fail (self != NULL, NULL);
87 _tmp0_ = self->priv->_type_suffix;
88 result = _tmp0_;
89 return result;
90 }
91
92 void
vala_integer_literal_set_type_suffix(ValaIntegerLiteral * self,const gchar * value)93 vala_integer_literal_set_type_suffix (ValaIntegerLiteral* self,
94 const gchar* value)
95 {
96 gchar* _tmp0_;
97 g_return_if_fail (self != NULL);
98 _tmp0_ = g_strdup (value);
99 _g_free0 (self->priv->_type_suffix);
100 self->priv->_type_suffix = _tmp0_;
101 }
102
103 /**
104 * Creates a new integer literal.
105 *
106 * @param i literal value
107 * @param source reference to source code
108 * @return newly created integer literal
109 */
110 ValaIntegerLiteral*
vala_integer_literal_construct(GType object_type,const gchar * i,ValaSourceReference * source)111 vala_integer_literal_construct (GType object_type,
112 const gchar* i,
113 ValaSourceReference* source)
114 {
115 ValaIntegerLiteral* self = NULL;
116 g_return_val_if_fail (i != NULL, NULL);
117 self = (ValaIntegerLiteral*) vala_literal_construct (object_type);
118 vala_integer_literal_set_value (self, i);
119 vala_code_node_set_source_reference ((ValaCodeNode*) self, source);
120 return self;
121 }
122
123 ValaIntegerLiteral*
vala_integer_literal_new(const gchar * i,ValaSourceReference * source)124 vala_integer_literal_new (const gchar* i,
125 ValaSourceReference* source)
126 {
127 return vala_integer_literal_construct (VALA_TYPE_INTEGER_LITERAL, i, source);
128 }
129
130 static void
vala_integer_literal_real_accept(ValaCodeNode * base,ValaCodeVisitor * visitor)131 vala_integer_literal_real_accept (ValaCodeNode* base,
132 ValaCodeVisitor* visitor)
133 {
134 ValaIntegerLiteral * self;
135 self = (ValaIntegerLiteral*) base;
136 g_return_if_fail (visitor != NULL);
137 vala_code_visitor_visit_integer_literal (visitor, self);
138 vala_code_visitor_visit_expression (visitor, (ValaExpression*) self);
139 }
140
141 static gchar*
vala_integer_literal_real_to_string(ValaCodeNode * base)142 vala_integer_literal_real_to_string (ValaCodeNode* base)
143 {
144 ValaIntegerLiteral * self;
145 const gchar* _tmp0_;
146 gchar* _tmp1_;
147 gchar* result = NULL;
148 self = (ValaIntegerLiteral*) base;
149 _tmp0_ = self->priv->_value;
150 _tmp1_ = g_strdup (_tmp0_);
151 result = _tmp1_;
152 return result;
153 }
154
155 static gboolean
vala_integer_literal_real_is_pure(ValaExpression * base)156 vala_integer_literal_real_is_pure (ValaExpression* base)
157 {
158 ValaIntegerLiteral * self;
159 gboolean result = FALSE;
160 self = (ValaIntegerLiteral*) base;
161 result = TRUE;
162 return result;
163 }
164
165 static glong
string_strnlen(gchar * str,glong maxlen)166 string_strnlen (gchar* str,
167 glong maxlen)
168 {
169 gchar* end = NULL;
170 gchar* _tmp0_;
171 gchar* _tmp1_;
172 glong result = 0L;
173 _tmp0_ = memchr (str, 0, (gsize) maxlen);
174 end = _tmp0_;
175 _tmp1_ = end;
176 if (_tmp1_ == NULL) {
177 result = maxlen;
178 return result;
179 } else {
180 gchar* _tmp2_;
181 _tmp2_ = end;
182 result = (glong) (_tmp2_ - str);
183 return result;
184 }
185 }
186
187 static gchar*
string_substring(const gchar * self,glong offset,glong len)188 string_substring (const gchar* self,
189 glong offset,
190 glong len)
191 {
192 glong string_length = 0L;
193 gboolean _tmp0_ = FALSE;
194 gchar* _tmp3_;
195 gchar* result = NULL;
196 g_return_val_if_fail (self != NULL, NULL);
197 if (offset >= ((glong) 0)) {
198 _tmp0_ = len >= ((glong) 0);
199 } else {
200 _tmp0_ = FALSE;
201 }
202 if (_tmp0_) {
203 string_length = string_strnlen ((gchar*) self, offset + len);
204 } else {
205 gint _tmp1_;
206 gint _tmp2_;
207 _tmp1_ = strlen (self);
208 _tmp2_ = _tmp1_;
209 string_length = (glong) _tmp2_;
210 }
211 if (offset < ((glong) 0)) {
212 offset = string_length + offset;
213 g_return_val_if_fail (offset >= ((glong) 0), NULL);
214 } else {
215 g_return_val_if_fail (offset <= string_length, NULL);
216 }
217 if (len < ((glong) 0)) {
218 len = string_length - offset;
219 }
220 g_return_val_if_fail ((offset + len) <= string_length, NULL);
221 _tmp3_ = g_strndup (((gchar*) self) + offset, (gsize) len);
222 result = _tmp3_;
223 return result;
224 }
225
226 static gint64
int64_parse(const gchar * str,guint _base)227 int64_parse (const gchar* str,
228 guint _base)
229 {
230 gint64 result = 0LL;
231 g_return_val_if_fail (str != NULL, 0LL);
232 result = g_ascii_strtoll (str, NULL, _base);
233 return result;
234 }
235
236 static gboolean
vala_integer_literal_real_check(ValaCodeNode * base,ValaCodeContext * context)237 vala_integer_literal_real_check (ValaCodeNode* base,
238 ValaCodeContext* context)
239 {
240 ValaIntegerLiteral * self;
241 gboolean _tmp0_;
242 gboolean _tmp1_;
243 gint l = 0;
244 gboolean u = FALSE;
245 gboolean _tmp14_ = FALSE;
246 const gchar* _tmp15_;
247 gint64 n = 0LL;
248 const gchar* _tmp23_;
249 gboolean _tmp24_ = FALSE;
250 gchar* type_name = NULL;
251 ValaStruct* st = NULL;
252 ValaNamespace* _tmp33_;
253 ValaNamespace* _tmp34_;
254 ValaScope* _tmp35_;
255 ValaScope* _tmp36_;
256 const gchar* _tmp37_;
257 ValaSymbol* _tmp38_;
258 ValaStruct* _tmp39_;
259 ValaStruct* _tmp40_;
260 const gchar* _tmp41_;
261 const gchar* _tmp42_;
262 ValaIntegerType* _tmp43_;
263 ValaIntegerType* _tmp44_;
264 gboolean _tmp45_;
265 gboolean _tmp46_;
266 gboolean result = FALSE;
267 self = (ValaIntegerLiteral*) base;
268 g_return_val_if_fail (context != NULL, FALSE);
269 _tmp0_ = vala_code_node_get_checked ((ValaCodeNode*) self);
270 _tmp1_ = _tmp0_;
271 if (_tmp1_) {
272 gboolean _tmp2_;
273 gboolean _tmp3_;
274 _tmp2_ = vala_code_node_get_error ((ValaCodeNode*) self);
275 _tmp3_ = _tmp2_;
276 result = !_tmp3_;
277 return result;
278 }
279 vala_code_node_set_checked ((ValaCodeNode*) self, TRUE);
280 l = 0;
281 while (TRUE) {
282 gboolean _tmp4_ = FALSE;
283 const gchar* _tmp5_;
284 gint _tmp7_;
285 const gchar* _tmp8_;
286 const gchar* _tmp9_;
287 gint _tmp10_;
288 gint _tmp11_;
289 gchar* _tmp12_;
290 gchar* _tmp13_;
291 _tmp5_ = self->priv->_value;
292 if (g_str_has_suffix (_tmp5_, "l")) {
293 _tmp4_ = TRUE;
294 } else {
295 const gchar* _tmp6_;
296 _tmp6_ = self->priv->_value;
297 _tmp4_ = g_str_has_suffix (_tmp6_, "L");
298 }
299 if (!_tmp4_) {
300 break;
301 }
302 _tmp7_ = l;
303 l = _tmp7_ + 1;
304 _tmp8_ = self->priv->_value;
305 _tmp9_ = self->priv->_value;
306 _tmp10_ = strlen (_tmp9_);
307 _tmp11_ = _tmp10_;
308 _tmp12_ = string_substring (_tmp8_, (glong) 0, (glong) (_tmp11_ - 1));
309 _tmp13_ = _tmp12_;
310 vala_integer_literal_set_value (self, _tmp13_);
311 _g_free0 (_tmp13_);
312 }
313 u = FALSE;
314 _tmp15_ = self->priv->_value;
315 if (g_str_has_suffix (_tmp15_, "u")) {
316 _tmp14_ = TRUE;
317 } else {
318 const gchar* _tmp16_;
319 _tmp16_ = self->priv->_value;
320 _tmp14_ = g_str_has_suffix (_tmp16_, "U");
321 }
322 if (_tmp14_) {
323 const gchar* _tmp17_;
324 const gchar* _tmp18_;
325 gint _tmp19_;
326 gint _tmp20_;
327 gchar* _tmp21_;
328 gchar* _tmp22_;
329 u = TRUE;
330 _tmp17_ = self->priv->_value;
331 _tmp18_ = self->priv->_value;
332 _tmp19_ = strlen (_tmp18_);
333 _tmp20_ = _tmp19_;
334 _tmp21_ = string_substring (_tmp17_, (glong) 0, (glong) (_tmp20_ - 1));
335 _tmp22_ = _tmp21_;
336 vala_integer_literal_set_value (self, _tmp22_);
337 _g_free0 (_tmp22_);
338 }
339 _tmp23_ = self->priv->_value;
340 n = int64_parse (_tmp23_, (guint) 0);
341 if (!u) {
342 gboolean _tmp25_ = FALSE;
343 if (n > ((gint64) G_MAXINT)) {
344 _tmp25_ = TRUE;
345 } else {
346 _tmp25_ = n < ((gint64) G_MININT);
347 }
348 _tmp24_ = _tmp25_;
349 } else {
350 _tmp24_ = FALSE;
351 }
352 if (_tmp24_) {
353 l = 2;
354 } else {
355 gboolean _tmp26_ = FALSE;
356 if (u) {
357 _tmp26_ = n > ((gint64) G_MAXUINT);
358 } else {
359 _tmp26_ = FALSE;
360 }
361 if (_tmp26_) {
362 l = 2;
363 }
364 }
365 if (l == 0) {
366 if (u) {
367 gchar* _tmp27_;
368 vala_integer_literal_set_type_suffix (self, "U");
369 _tmp27_ = g_strdup ("uint");
370 _g_free0 (type_name);
371 type_name = _tmp27_;
372 } else {
373 gchar* _tmp28_;
374 vala_integer_literal_set_type_suffix (self, "");
375 _tmp28_ = g_strdup ("int");
376 _g_free0 (type_name);
377 type_name = _tmp28_;
378 }
379 } else {
380 if (l == 1) {
381 if (u) {
382 gchar* _tmp29_;
383 vala_integer_literal_set_type_suffix (self, "UL");
384 _tmp29_ = g_strdup ("ulong");
385 _g_free0 (type_name);
386 type_name = _tmp29_;
387 } else {
388 gchar* _tmp30_;
389 vala_integer_literal_set_type_suffix (self, "L");
390 _tmp30_ = g_strdup ("long");
391 _g_free0 (type_name);
392 type_name = _tmp30_;
393 }
394 } else {
395 if (u) {
396 gchar* _tmp31_;
397 vala_integer_literal_set_type_suffix (self, "ULL");
398 _tmp31_ = g_strdup ("uint64");
399 _g_free0 (type_name);
400 type_name = _tmp31_;
401 } else {
402 gchar* _tmp32_;
403 vala_integer_literal_set_type_suffix (self, "LL");
404 _tmp32_ = g_strdup ("int64");
405 _g_free0 (type_name);
406 type_name = _tmp32_;
407 }
408 }
409 }
410 _tmp33_ = vala_code_context_get_root (context);
411 _tmp34_ = _tmp33_;
412 _tmp35_ = vala_symbol_get_scope ((ValaSymbol*) _tmp34_);
413 _tmp36_ = _tmp35_;
414 _tmp37_ = type_name;
415 _tmp38_ = vala_scope_lookup (_tmp36_, _tmp37_);
416 st = G_TYPE_CHECK_INSTANCE_CAST (_tmp38_, VALA_TYPE_STRUCT, ValaStruct);
417 _tmp39_ = st;
418 vala_code_node_check ((ValaCodeNode*) _tmp39_, context);
419 _tmp40_ = st;
420 _tmp41_ = self->priv->_value;
421 _tmp42_ = type_name;
422 _tmp43_ = vala_integer_type_new (_tmp40_, _tmp41_, _tmp42_);
423 _tmp44_ = _tmp43_;
424 vala_expression_set_value_type ((ValaExpression*) self, (ValaDataType*) _tmp44_);
425 _vala_code_node_unref0 (_tmp44_);
426 _tmp45_ = vala_code_node_get_error ((ValaCodeNode*) self);
427 _tmp46_ = _tmp45_;
428 result = !_tmp46_;
429 _vala_code_node_unref0 (st);
430 _g_free0 (type_name);
431 return result;
432 }
433
434 static void
vala_integer_literal_real_emit(ValaCodeNode * base,ValaCodeGenerator * codegen)435 vala_integer_literal_real_emit (ValaCodeNode* base,
436 ValaCodeGenerator* codegen)
437 {
438 ValaIntegerLiteral * self;
439 self = (ValaIntegerLiteral*) base;
440 g_return_if_fail (codegen != NULL);
441 vala_code_visitor_visit_integer_literal ((ValaCodeVisitor*) codegen, self);
442 vala_code_visitor_visit_expression ((ValaCodeVisitor*) codegen, (ValaExpression*) self);
443 }
444
445 static void
vala_integer_literal_class_init(ValaIntegerLiteralClass * klass,gpointer klass_data)446 vala_integer_literal_class_init (ValaIntegerLiteralClass * klass,
447 gpointer klass_data)
448 {
449 vala_integer_literal_parent_class = g_type_class_peek_parent (klass);
450 ((ValaCodeNodeClass *) klass)->finalize = vala_integer_literal_finalize;
451 g_type_class_adjust_private_offset (klass, &ValaIntegerLiteral_private_offset);
452 ((ValaCodeNodeClass *) klass)->accept = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_integer_literal_real_accept;
453 ((ValaCodeNodeClass *) klass)->to_string = (gchar* (*) (ValaCodeNode*)) vala_integer_literal_real_to_string;
454 ((ValaExpressionClass *) klass)->is_pure = (gboolean (*) (ValaExpression*)) vala_integer_literal_real_is_pure;
455 ((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_integer_literal_real_check;
456 ((ValaCodeNodeClass *) klass)->emit = (void (*) (ValaCodeNode*, ValaCodeGenerator*)) vala_integer_literal_real_emit;
457 }
458
459 static void
vala_integer_literal_instance_init(ValaIntegerLiteral * self,gpointer klass)460 vala_integer_literal_instance_init (ValaIntegerLiteral * self,
461 gpointer klass)
462 {
463 self->priv = vala_integer_literal_get_instance_private (self);
464 }
465
466 static void
vala_integer_literal_finalize(ValaCodeNode * obj)467 vala_integer_literal_finalize (ValaCodeNode * obj)
468 {
469 ValaIntegerLiteral * self;
470 self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_INTEGER_LITERAL, ValaIntegerLiteral);
471 _g_free0 (self->priv->_value);
472 _g_free0 (self->priv->_type_suffix);
473 VALA_CODE_NODE_CLASS (vala_integer_literal_parent_class)->finalize (obj);
474 }
475
476 /**
477 * Represents an integer literal in the source code.
478 */
479 static GType
vala_integer_literal_get_type_once(void)480 vala_integer_literal_get_type_once (void)
481 {
482 static const GTypeInfo g_define_type_info = { sizeof (ValaIntegerLiteralClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_integer_literal_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaIntegerLiteral), 0, (GInstanceInitFunc) vala_integer_literal_instance_init, NULL };
483 GType vala_integer_literal_type_id;
484 vala_integer_literal_type_id = g_type_register_static (VALA_TYPE_LITERAL, "ValaIntegerLiteral", &g_define_type_info, 0);
485 ValaIntegerLiteral_private_offset = g_type_add_instance_private (vala_integer_literal_type_id, sizeof (ValaIntegerLiteralPrivate));
486 return vala_integer_literal_type_id;
487 }
488
489 GType
vala_integer_literal_get_type(void)490 vala_integer_literal_get_type (void)
491 {
492 static volatile gsize vala_integer_literal_type_id__volatile = 0;
493 if (g_once_init_enter (&vala_integer_literal_type_id__volatile)) {
494 GType vala_integer_literal_type_id;
495 vala_integer_literal_type_id = vala_integer_literal_get_type_once ();
496 g_once_init_leave (&vala_integer_literal_type_id__volatile, vala_integer_literal_type_id);
497 }
498 return vala_integer_literal_type_id__volatile;
499 }
500
501