summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-02-01 14:54:55 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2021-02-01 14:54:55 +0100
commit54eb054f49336af900a7b7b06bbf1a523eaeca5e (patch)
tree13e8fbd67d1004a7031e10e0d75536dd1fa6c93d
parent2df469dfc7619aaa31319f150af453e577665597 (diff)
downloadvala-54eb054f49336af900a7b7b06bbf1a523eaeca5e.tar.gz
codegen: Use CCodeDeclaratorSuffix to emit array length of constants
-rw-r--r--ccode/valaccodevariabledeclarator.vala24
-rw-r--r--codegen/valaccodebasemodule.vala53
2 files changed, 43 insertions, 34 deletions
diff --git a/ccode/valaccodevariabledeclarator.vala b/ccode/valaccodevariabledeclarator.vala
index f39eff0ed..f5d2302cf 100644
--- a/ccode/valaccodevariabledeclarator.vala
+++ b/ccode/valaccodevariabledeclarator.vala
@@ -97,20 +97,32 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator {
public class Vala.CCodeDeclaratorSuffix {
bool array;
- CCodeExpression? array_length;
+ List<CCodeExpression>? array_length;
public CCodeDeclaratorSuffix.with_array (CCodeExpression? array_length = null) {
+ if (array_length != null) {
+ this.array_length = new ArrayList<CCodeExpression> ();
+ this.array_length.add (array_length);
+ }
+ array = true;
+ }
+
+ public CCodeDeclaratorSuffix.with_multi_array (List<CCodeExpression>? array_length = null) {
this.array_length = array_length;
array = true;
}
public void write (CCodeWriter writer) {
- if (array) {
- writer.write_string ("[");
- if (array_length != null) {
- array_length.write (writer);
+ if (array_length != null && array_length.size > 0) {
+ foreach (var length in array_length) {
+ writer.write_string ("[");
+ if (length != null) {
+ length.write (writer);
+ }
+ writer.write_string ("]");
}
- writer.write_string ("]");
+ } else if (array) {
+ writer.write_string ("[]");
}
}
}
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index c7ef8c9a3..61e831ff9 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -944,7 +944,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
}
- private void constant_array_ranks_sizes (InitializerList initializer_list, int[] sizes, int rank = 0) {
+ static void constant_array_ranks_sizes (InitializerList initializer_list, int[] sizes, int rank = 0) {
sizes[rank] = int.max (sizes[rank], initializer_list.size);
rank++;
foreach (var expr in initializer_list.get_initializers()) {
@@ -954,6 +954,25 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
}
+ CCodeDeclaratorSuffix? get_constant_declarator_suffix (Constant c) {
+ unowned ArrayType? array = c.type_reference as ArrayType;
+ unowned InitializerList? initializer_list = c.value as InitializerList;
+ if (array == null || initializer_list == null) {
+ if (c.type_reference.compatible (string_type)) {
+ return new CCodeDeclaratorSuffix.with_array ();
+ }
+ return null;
+ }
+
+ var lengths = new ArrayList<CCodeExpression> ();
+ int[] sizes = new int[array.rank];
+ constant_array_ranks_sizes (initializer_list, sizes);
+ for (int i = 0; i < array.rank; i++) {
+ lengths.add (new CCodeConstant ("%d".printf (sizes[i])));
+ }
+ return new CCodeDeclaratorSuffix.with_multi_array (lengths);
+ }
+
public void generate_constant_declaration (Constant c, CCodeFile decl_space, bool definition = false) {
if (c.parent_symbol is Block) {
// local constant
@@ -972,16 +991,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
var initializer_list = c.value as InitializerList;
if (initializer_list != null) {
var cdecl = new CCodeDeclaration (get_ccode_const_name (c.type_reference));
- var arr = "";
- if (c.type_reference is ArrayType) {
- var array = (ArrayType) c.type_reference;
- int[] sizes = new int[array.rank];
- constant_array_ranks_sizes (initializer_list, sizes);
- for (int i = 0; i < array.rank; i++) {
- arr += "[%d]".printf (sizes[i]);
- }
- }
-
var cinitializer = get_cvalue (c.value);
if (!definition) {
// never output value in header
@@ -989,7 +998,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
cinitializer = null;
}
- cdecl.add_declarator (new CCodeVariableDeclarator ("%s%s".printf (get_ccode_name (c), arr), cinitializer));
+ cdecl.add_declarator (new CCodeVariableDeclarator (get_ccode_name (c), cinitializer, get_constant_declarator_suffix (c)));
if (c.is_private_symbol ()) {
cdecl.modifiers = CCodeModifiers.STATIC;
} else {
@@ -1020,28 +1029,16 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
c.value.emit (this);
- string type_name = get_ccode_const_name (c.type_reference);
- string arr = "";
- if (c.type_reference is ArrayType) {
- var array = (ArrayType) c.type_reference;
- var initializer_list = c.value as InitializerList;
- if (initializer_list != null) {
- int[] sizes = new int[array.rank];
- constant_array_ranks_sizes (initializer_list, sizes);
- for (int i = 0; i < array.rank; i++) {
- arr += "[%d]".printf (sizes[i]);
- }
- }
- }
-
+ string type_name;
if (c.type_reference.compatible (string_type)) {
type_name = "const char";
- arr = "[]";
+ } else {
+ type_name = get_ccode_const_name (c.type_reference);
}
var cinitializer = get_cvalue (c.value);
- ccode.add_declaration (type_name, new CCodeVariableDeclarator ("%s%s".printf (get_ccode_name (c), arr), cinitializer), CCodeModifiers.STATIC);
+ ccode.add_declaration (type_name, new CCodeVariableDeclarator (get_ccode_name (c), cinitializer, get_constant_declarator_suffix (c)), CCodeModifiers.STATIC);
} else {
generate_constant_declaration (c, cfile, true);