diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2015-09-13 22:27:17 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2018-05-21 21:12:09 +0200 |
commit | d21ba22e0f36230df1b454191ce4aa57b451f382 (patch) | |
tree | c1830be261353d4a136eb5ab15f046b142905aae | |
parent | 35d5f868febd42bfbe644cb75049a04bd2229210 (diff) | |
download | vala-d21ba22e0f36230df1b454191ce4aa57b451f382.tar.gz |
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
-rw-r--r-- | codegen/valagvariantmodule.vala | 4 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/dbus/bug735437.test | 68 |
3 files changed, 72 insertions, 1 deletions
diff --git a/codegen/valagvariantmodule.vala b/codegen/valagvariantmodule.vala index 9cf642de1..ef29fe97e 100644 --- a/codegen/valagvariantmodule.vala +++ b/codegen/valagvariantmodule.vala @@ -625,7 +625,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 c6132ef30..8bdd1d754 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -261,6 +261,7 @@ TESTS = \ dbus/dicts.test \ dbus/bug596862.vala \ dbus/bug602003.test \ + dbus/bug735437.test \ dbus/bug782719.test \ gir/bug651773.test \ gir/bug667751.test \ 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 (); +} |