From: Rico Tzschichholz Date: Sun, 13 Sep 2015 21:27:17 +0000 (+0100) Subject: codegen: Fix serializing multidimensional arrays X-Git-Tag: 0.41.90~137 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b514c648d79de6ac4629b9ddcb51fb996cf7da2;p=thirdparty%2Fvala.git codegen: Fix serializing multidimensional arrays The same type signature was being used for every dimension of the array. Based on patch by Abderrahim Kitouni https://bugzilla.gnome.org/show_bug.cgi?id=735437 --- diff --git a/codegen/valagvariantmodule.vala b/codegen/valagvariantmodule.vala index 79c29fdb1..7838ea3e9 100644 --- a/codegen/valagvariantmodule.vala +++ b/codegen/valagvariantmodule.vala @@ -628,7 +628,9 @@ public class Vala.GVariantModule : GAsyncModule { ccode.add_declaration ("int", new CCodeVariableDeclarator (index_name)); var gvariant_type = new CCodeFunctionCall (new CCodeIdentifier ("G_VARIANT_TYPE")); - gvariant_type.add_argument (new CCodeConstant ("\"%s\"".printf (get_type_signature (array_type)))); + ArrayType array_type_copy = (ArrayType) array_type.copy (); + array_type_copy.rank -= dim - 1; + gvariant_type.add_argument (new CCodeConstant ("\"%s\"".printf (get_type_signature (array_type_copy)))); var builder_init = new CCodeFunctionCall (new CCodeIdentifier ("g_variant_builder_init")); builder_init.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (builder_name))); diff --git a/tests/Makefile.am b/tests/Makefile.am index 134369b6c..1658f9252 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -378,6 +378,7 @@ TESTS = \ dbus/dicts.test \ dbus/bug596862.vala \ dbus/bug602003.test \ + dbus/bug735437.test \ dbus/bug782719.test \ dbus/bug783002.test \ dbus/bug792277.vala \ diff --git a/tests/dbus/bug735437.test b/tests/dbus/bug735437.test new file mode 100644 index 000000000..c2b75821c --- /dev/null +++ b/tests/dbus/bug735437.test @@ -0,0 +1,68 @@ +Packages: gio-2.0 +D-Bus + +Program: client + +[DBus (name = "org.example.Test")] +interface Test : Object { + public abstract double[] array () throws DBusError, IOError; + public abstract double[,] multi_array () throws DBusError, IOError; + public abstract string[,,] multi_array2 () throws DBusError, IOError; +} + +void main () { + // client + Test test = Bus.get_proxy_sync (BusType.SESSION, "org.example.Test", "/org/example/test"); + + var a = test.array (); + assert (a.length == 2 && a[0] == 2.0 && a[1] == 3.0); + + var b = test.multi_array (); + assert (b.length[0] == 2 && b.length[1] == 2 && b[0,0] == 2.0 && b[0,1] == 3.0 && b[1,0] == 4.0 && b[1,1] == 5.0); + + var c = test.multi_array2 (); + assert (c.length[0] == 2 && c.length[1] == 2 && c.length[2] == 2 && c[0,0,0] == "foo" && c[0,0,1] == "bar" && c[1,1,0] == "baz2" && c[1,1,1] == "man2"); +} + +Program: server + +[DBus (name = "org.example.Test")] +class Test : Object { + public double[] array () { + return new double[] { 2.0, 3.0 }; + } + + public double[,] multi_array () { + return new double[,] { { 2.0, 3.0 }, { 4.0, 5.0 } }; + } + + public string[,,] multi_array2 () { + return new string[,,] { { { "foo", "bar" }, { "baz", "man" } }, { { "foo2", "bar2" }, { "baz2", "man2" } } }; + } +} + +MainLoop main_loop; + +void client_exit (Pid pid, int status) { + // client finished, terminate server + assert (status == 0); + main_loop.quit (); +} + +void main () { + var conn = Bus.get_sync (BusType.SESSION); + conn.register_object ("/org/example/test", new Test ()); + + // try to register service in session bus + var request_result = conn.call_sync ("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "RequestName", + new Variant ("(su)", "org.example.Test", 0x4), null, 0, -1); + assert ((uint) request_result.get_child_value (0) == 1); + + // server ready, spawn client + Pid client_pid; + Process.spawn_async (null, { "test", "/dbus/bug735437/client" }, null, SpawnFlags.DO_NOT_REAP_CHILD, null, out client_pid); + ChildWatch.add (client_pid, client_exit); + + main_loop = new MainLoop (); + main_loop.run (); +}