]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix code generation for large integer literals
authorJürg Billeter <j@bitron.ch>
Mon, 22 Mar 2010 20:12:38 +0000 (21:12 +0100)
committerJürg Billeter <j@bitron.ch>
Mon, 22 Mar 2010 20:12:38 +0000 (21:12 +0100)
Fixes bug 583669.

codegen/valaccodebasemodule.vala
vala/valaintegerliteral.vala

index 8981e7850fac92406fae5c4170d35838224fda97..83aafae9d84be0bc9b582577b4d17ee07146ce69 100644 (file)
@@ -3482,7 +3482,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
        }
 
        public override void visit_integer_literal (IntegerLiteral expr) {
-               expr.ccodenode = new CCodeConstant (expr.value);
+               expr.ccodenode = new CCodeConstant (expr.value + expr.type_suffix);
        }
 
        public override void visit_real_literal (RealLiteral expr) {
index 6a84131d5fc82a5b562cad34643550faae4d3006..31afc93f14d158d822d89352ca1d76ba196a7104 100644 (file)
@@ -1,6 +1,6 @@
 /* valaintegerliteral.vala
  *
- * Copyright (C) 2006-2008  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -31,6 +31,8 @@ public class Vala.IntegerLiteral : Literal {
         */
        public string value { get; set; }
 
+       public string type_suffix { get; set; }
+
        /**
         * Creates a new integer literal.
         *
@@ -52,28 +54,31 @@ public class Vala.IntegerLiteral : Literal {
        public override string to_string () {
                return value;
        }
-       
-       /**
-        * Returns the type name of the value this literal represents.
-        *
-        * @return the name of literal type
-        */
-       public string get_type_name () {
-               string number = value;
-       
+
+       public override bool is_pure () {
+               return true;
+       }
+
+       public override bool check (SemanticAnalyzer analyzer) {
+               if (checked) {
+                       return !error;
+               }
+
+               checked = true;
+
                int l = 0;
-               while (number.has_suffix ("l") || number.has_suffix ("L")) {
+               while (value.has_suffix ("l") || value.has_suffix ("L")) {
                        l++;
-                       number = number.ndup (number.size () - 1);
+                       value = value.ndup (value.size () - 1);
                }
 
                bool u = false;
-               if (number.has_suffix ("u") || number.has_suffix ("U")) {
+               if (value.has_suffix ("u") || value.has_suffix ("U")) {
                        u = true;
-                       number = number.ndup (number.size () - 1);
+                       value = value.ndup (value.size () - 1);
                }
                
-               int64 n = number.to_int64 ();
+               int64 n = value.to_int64 ();
                if (!u && n > 0x7fffffff) {
                        // value doesn't fit into signed 32-bit
                        l = 2;
@@ -82,46 +87,43 @@ public class Vala.IntegerLiteral : Literal {
                        l = 2;
                }
 
+               string type_name;
                if (l == 0) {
                        if (u) {
-                               return "uint";
+                               type_suffix = "U";
+                               type_name = "uint";
                        } else {
-                               return "int";
+                               type_suffix = "";
+                               type_name = "int";
                        }
                } else if (l == 1) {
                        if (u) {
-                               return "ulong";
+                               type_suffix = "UL";
+                               type_name = "ulong";
                        } else {
-                               return "long";
+                               type_suffix = "L";
+                               type_name = "long";
                        }
                } else if (CodeContext.get ().profile == Profile.DOVA) {
                        // long is 64-bit in Dova profile
                        if (u) {
-                               return "ulong";
+                               type_suffix = "UL";
+                               type_name = "ulong";
                        } else {
-                               return "long";
+                               type_suffix = "L";
+                               type_name = "long";
                        }
                } else {
                        if (u) {
-                               return "uint64";
+                               type_suffix = "ULL";
+                               type_name = "uint64";
                        } else {
-                               return "int64";
+                               type_suffix = "LL";
+                               type_name = "int64";
                        }
                }
-       }
-
-       public override bool is_pure () {
-               return true;
-       }
-
-       public override bool check (SemanticAnalyzer analyzer) {
-               if (checked) {
-                       return !error;
-               }
-
-               checked = true;
 
-               value_type = new IntegerType ((Struct) analyzer.root_symbol.scope.lookup (get_type_name ()), value, get_type_name ());
+               value_type = new IntegerType ((Struct) analyzer.root_symbol.scope.lookup (type_name), value, type_name);
 
                return !error;
        }