/* 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
*/
public string value { get; set; }
+ public string type_suffix { get; set; }
+
/**
* Creates a new integer 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;
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;
}