]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
signalmodule: Add support for array-parameters with rank > 1
authorFrancisco Serna <Francisco.Serna@jhuapl.edu>
Tue, 14 Feb 2017 21:05:13 +0000 (16:05 -0500)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 5 Mar 2017 14:20:43 +0000 (15:20 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=778632

codegen/valaccodeattribute.vala
codegen/valagsignalmodule.vala
tests/Makefile.am
tests/objects/bug778632.vala [new file with mode: 0644]

index 7725aa77b0d0b856187b727168a38e2f5b72aacc..25579001aa753226756a118e554b0f001c43136d 100644 (file)
@@ -951,7 +951,11 @@ public class Vala.CCodeAttribute : AttributeCache {
                        if (((ArrayType) node).element_type.data_type.get_full_name () == "string") {
                                return "BOXED,INT";
                        } else {
-                               return "POINTER,INT";
+                               var ret = "POINTER";
+                               for (var i = 0; i < ((ArrayType) node).rank; i++) {
+                                       ret = "%s,INT".printf (ret);
+                               }
+                               return ret;
                        }
                } else if (node is VoidType) {
                        return "VOID";
index f995f2794a330bd86437d073f73dde68f123bfe3..2a1afd0d7e26a593446799c6096cde8fd6fb9814 100644 (file)
@@ -220,8 +220,10 @@ public class Vala.GSignalModule : GObjectModule {
                        callback_decl.add_parameter (new CCodeParameter ("arg_%d".printf (n_params), get_value_type_name_from_parameter (p)));
                        n_params++;
                        if (p.variable_type.is_array ()) {
-                               callback_decl.add_parameter (new CCodeParameter ("arg_%d".printf (n_params), "gint"));
-                               n_params++;
+                               for (var j = 0; j < ((ArrayType) p.variable_type).rank; j++) {
+                                       callback_decl.add_parameter (new CCodeParameter ("arg_%d".printf (n_params), "gint"));
+                                       n_params++;
+                               }
                        }
                }
                callback_decl.add_parameter (new CCodeParameter ("data2", "gpointer"));
@@ -289,10 +291,12 @@ public class Vala.GSignalModule : GObjectModule {
                        fc.add_argument (inner_fc);
                        i++;
                        if (is_array) {
-                               inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_int"));
-                               inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ())));
-                               fc.add_argument (inner_fc);
-                               i++;
+                               for (var j = 0; j < ((ArrayType) p.variable_type).rank; j++) {
+                                       inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_int"));
+                                       inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ())));
+                                       fc.add_argument (inner_fc);
+                                       i++;
+                               }
                        }
                }
                fc.add_argument (new CCodeIdentifier ("data2"));
@@ -404,7 +408,7 @@ public class Vala.GSignalModule : GObjectModule {
                foreach (Parameter param in params) {
                        params_len++;
                        if (param.variable_type.is_array ()) {
-                               params_len++;
+                               params_len += ((ArrayType) param.variable_type).rank;
                        }
                }
 
@@ -416,7 +420,9 @@ public class Vala.GSignalModule : GObjectModule {
                                } else {
                                        csignew.add_argument (new CCodeConstant ("G_TYPE_POINTER"));
                                }
-                               csignew.add_argument (new CCodeConstant ("G_TYPE_INT"));
+                               for (var i = 0; i < ((ArrayType) param.variable_type).rank; i++) {
+                                       csignew.add_argument (new CCodeConstant ("G_TYPE_INT"));
+                               }
                        } else if (param.variable_type is PointerType || param.variable_type.type_parameter != null || param.direction != ParameterDirection.IN) {
                                csignew.add_argument (new CCodeConstant ("G_TYPE_POINTER"));
                        } else if (param.variable_type is ErrorType) {
index c656d2004325ec6e110e0a1902278df3508ad11a..2d0b2ed8c8cb0906ce6fc878be45d046838f8d3a 100644 (file)
@@ -213,6 +213,7 @@ TESTS = \
        objects/bug615830-1.test \
        objects/bug615830-2.test \
        objects/bug766739.vala \
+       objects/bug778632.vala \
        errors/errors.vala \
        errors/bug567181.vala \
        errors/bug579101.vala \
diff --git a/tests/objects/bug778632.vala b/tests/objects/bug778632.vala
new file mode 100644 (file)
index 0000000..cd78801
--- /dev/null
@@ -0,0 +1,22 @@
+class Foo : Object {
+       public signal void bar (int[,,] a);
+
+       public void bar_emit () {
+               int[2,3,2] a = {{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}};
+               bar (a);
+       }
+}
+
+void bar_callback (int[,,] a) {
+       assert (a.length[0] == 2);
+       assert (a.length[1] == 3);
+       assert (a.length[2] == 2);
+       assert (a[0,2,0] == 5);
+       assert (a[1,2,1] == 12);
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.bar.connect (bar_callback);
+       foo.bar_emit ();
+}