]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Respect array_length_cname attribute for global fields
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 24 Feb 2019 20:44:48 +0000 (21:44 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 28 Feb 2019 17:34:32 +0000 (18:34 +0100)
codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/arrays/class-field-length-cname.vala [new file with mode: 0644]
tests/arrays/field-global-length-cname.vala [new file with mode: 0644]
tests/arrays/struct-field-length-cname.vala [new file with mode: 0644]

index 504b01ee0106091ce6ad7552a045a214d9b28f16..617849f59a1b3709559d23c7b8ab68fb2b8fbcd4 100644 (file)
@@ -1050,9 +1050,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        if (!array_type.fixed_length) {
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        var len_type = int_type.copy ();
+                                       string? length_cname = get_ccode_array_length_name (f);
+                                       if (length_cname == null) {
+                                               length_cname = get_array_length_cname (get_ccode_name (f), dim);
+                                       }
 
                                        cdecl = new CCodeDeclaration (get_ccode_name (len_type));
-                                       cdecl.add_declarator (new CCodeVariableDeclarator (get_array_length_cname (get_ccode_name (f), dim)));
+                                       cdecl.add_declarator (new CCodeVariableDeclarator (length_cname));
                                        if (f.is_private_symbol ()) {
                                                cdecl.modifiers = CCodeModifiers.STATIC;
                                        } else if (context.hide_internal && f.is_internal_symbol ()) {
@@ -1263,9 +1267,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        if (!array_type.fixed_length) {
                                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                                        var len_type = int_type.copy ();
+                                                       string? length_cname = get_ccode_array_length_name (f);
+                                                       if (length_cname == null) {
+                                                               length_cname = get_array_length_cname (get_ccode_name (f), dim);
+                                                       }
 
                                                        var len_def = new CCodeDeclaration (get_ccode_name (len_type));
-                                                       len_def.add_declarator (new CCodeVariableDeclarator (get_array_length_cname (get_ccode_name (f), dim), new CCodeConstant ("0")));
+                                                       len_def.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
                                                        if (!f.is_private_symbol ()) {
                                                                len_def.modifiers = CCodeModifiers.EXTERN;
                                                        } else {
index 707246aaf4a1004d4509e581784def0b8fcfbb1f..51783c72384f7204d35547f4f2937c1a8249dd38 100644 (file)
@@ -55,6 +55,9 @@ TESTS = \
        basic-types/bug777697.test \
        basic-types/bug787152.vala \
        basic-types/bug788775.vala \
+       arrays/class-field-length-cname.vala \
+       arrays/field-global-length-cname.vala \
+       arrays/struct-field-length-cname.vala \
        chainup/base-class-invalid.test \
        chainup/base-enum-invalid.test \
        chainup/base-invalid.test \
diff --git a/tests/arrays/class-field-length-cname.vala b/tests/arrays/class-field-length-cname.vala
new file mode 100644 (file)
index 0000000..39f54f7
--- /dev/null
@@ -0,0 +1,13 @@
+class Bar {
+       [CCode (array_length_cname = "foo_len")]
+       public int[] foo;
+
+       // would cause a symbol clash
+       public int foo_length1;
+}
+
+void main () {
+       var bar = new Bar ();
+       bar.foo = { 23, 42 };
+       assert (bar.foo.length == 2);
+}
diff --git a/tests/arrays/field-global-length-cname.vala b/tests/arrays/field-global-length-cname.vala
new file mode 100644 (file)
index 0000000..2422bef
--- /dev/null
@@ -0,0 +1,10 @@
+[CCode (array_length_cname = "foo_len")]
+public int[] foo;
+
+// would cause a symbol clash
+int foo_length1;
+
+void main () {
+       foo = { 23, 42 };
+       assert (foo.length == 2);
+}
diff --git a/tests/arrays/struct-field-length-cname.vala b/tests/arrays/struct-field-length-cname.vala
new file mode 100644 (file)
index 0000000..dc7320d
--- /dev/null
@@ -0,0 +1,12 @@
+struct Bar {
+       [CCode (array_length_cname = "foo_len")]
+       public int[] foo;
+
+       // would cause a symbol clash
+       public int foo_length1;
+}
+
+void main () {
+       Bar bar = {{ 23, 42 }, -1};
+       assert (bar.foo.length == 2);
+}