From 5b78c3fdff817ee8204a0addcc4bd3879e46adfa Mon Sep 17 00:00:00 2001 From: Will Thompson Date: Fri, 26 Oct 2018 13:49:54 +0100 Subject: [PATCH 1/2] gdbus-codegen: test generating autocleanups This is the most degenerate possible test but it does exercise this code path. (Tweaked by Philip Withnall to also add the flag to the autotools build.) --- gio/tests/Makefile.am | 1 + gio/tests/gdbus-test-codegen.c | 41 ++++++++++++++++++++++++++++++++++ gio/tests/meson.build | 1 + 3 files changed, 43 insertions(+) diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index 2df156e6b..b8a414954 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -502,6 +502,7 @@ gdbus-test-codegen-generated.h: test-codegen.xml Makefile $(top_builddir)/gio/gd --interface-prefix org.project. \ --generate-c-code gdbus-test-codegen-generated \ --c-generate-object-manager \ + --c-generate-autocleanup all \ --c-namespace Foo_iGen \ --generate-docbook gdbus-test-codegen-generated-doc \ --annotate "org.project.Bar" Key1 Value1 \ diff --git a/gio/tests/gdbus-test-codegen.c b/gio/tests/gdbus-test-codegen.c index 1c4e83c4c..a51cf1846 100644 --- a/gio/tests/gdbus-test-codegen.c +++ b/gio/tests/gdbus-test-codegen.c @@ -2385,6 +2385,46 @@ test_property_naming (void) /* ---------------------------------------------------------------------------------------------------- */ +/* autocleanups + * + * - check that g_autoptr() works for all generated types, if supported by the + * current compiler + */ + +static void +test_autocleanups (void) +{ +#ifdef g_autoptr + g_autoptr(FooiGenBar) bar = NULL; + g_autoptr(FooiGenBarProxy) bar_proxy = NULL; + g_autoptr(FooiGenBarSkeleton) bar_skeleton = NULL; + g_autoptr(FooiGenObjectProxy) object_proxy = NULL; + g_autoptr(FooiGenObjectSkeleton) object_skeleton = NULL; + g_autoptr(FooiGenObjectManagerClient) object_manager_client = NULL; + + (void) bar; + (void) bar_proxy; + (void) bar_skeleton; + (void) object_proxy; + (void) object_skeleton; + (void) object_manager_client; +#elif GLIB_CHECK_VERSION(2, 38, 0) + /* This file is compiled twice, once without GLib version guards and once + * with + * + * -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_36 + * -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_36 + * + * g_test_skip() was added in 2.38. + */ + g_test_skip ("g_autoptr() not supported on this compiler"); +#else + /* Let's just say it passed. */ +#endif +} + +/* ---------------------------------------------------------------------------------------------------- */ + int main (int argc, char *argv[]) @@ -2395,6 +2435,7 @@ main (int argc, g_test_add_func ("/gdbus/codegen/interface_stability", test_interface_stability); g_test_add_func ("/gdbus/codegen/object-manager", test_object_manager); g_test_add_func ("/gdbus/codegen/property-naming", test_property_naming); + g_test_add_func ("/gdbus/codegen/autocleanups", test_autocleanups); return session_bus_run (); } diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 65ddcdad8..757516b46 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -182,6 +182,7 @@ if host_machine.system() != 'windows' '--output-directory', '@OUTDIR@', '--generate-c-code', 'gdbus-test-codegen-generated', '--c-generate-object-manager', + '--c-generate-autocleanup', 'all', '--c-namespace', 'Foo_iGen', '--generate-docbook', 'gdbus-test-codegen-generated-doc', '--annotate', 'org.project.Bar', 'Key1', 'Value1', From 745422afac765ca796d8d5cd4dc037de6f717fbd Mon Sep 17 00:00:00 2001 From: Will Thompson Date: Fri, 26 Oct 2018 11:16:13 +0100 Subject: [PATCH 2/2] gdbus-codegen: add autocleanup for FooObject This is only enabled with `--c-generate-autocleanup all` for the reasons discussed on https://bugzilla.gnome.org/show_bug.cgi?id=763379. --- gio/gdbus-2.0/codegen/codegen.py | 5 +++++ gio/tests/gdbus-test-codegen.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/gio/gdbus-2.0/codegen/codegen.py b/gio/gdbus-2.0/codegen/codegen.py index 0d95cdcda..d393f65cb 100644 --- a/gio/gdbus-2.0/codegen/codegen.py +++ b/gio/gdbus-2.0/codegen/codegen.py @@ -433,6 +433,11 @@ class HeaderCodeGenerator: self.outfile.write('GType %sobject_get_type (void) G_GNUC_CONST;\n' '\n' %(self.ns_lower)) + if self.generate_autocleanup == 'all': + self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n') + self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObject, g_object_unref)\n' % (self.namespace)) + self.outfile.write('#endif\n') + self.outfile.write('\n') for i in self.ifaces: if i.deprecated: self.outfile.write('G_GNUC_DEPRECATED ') diff --git a/gio/tests/gdbus-test-codegen.c b/gio/tests/gdbus-test-codegen.c index a51cf1846..918ed784f 100644 --- a/gio/tests/gdbus-test-codegen.c +++ b/gio/tests/gdbus-test-codegen.c @@ -2398,6 +2398,7 @@ test_autocleanups (void) g_autoptr(FooiGenBar) bar = NULL; g_autoptr(FooiGenBarProxy) bar_proxy = NULL; g_autoptr(FooiGenBarSkeleton) bar_skeleton = NULL; + g_autoptr(FooiGenObject) object = NULL; g_autoptr(FooiGenObjectProxy) object_proxy = NULL; g_autoptr(FooiGenObjectSkeleton) object_skeleton = NULL; g_autoptr(FooiGenObjectManagerClient) object_manager_client = NULL; @@ -2405,6 +2406,7 @@ test_autocleanups (void) (void) bar; (void) bar_proxy; (void) bar_skeleton; + (void) object; (void) object_proxy; (void) object_skeleton; (void) object_manager_client;