From 7bed7ea77dfd2634d3fceaafaacd9764bf76e709 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Thu, 16 Aug 2018 15:36:10 +0100 Subject: Add missing introspection annotations to gvdb_table_get_names() Signed-off-by: Philip Withnall --- gvdb-reader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gvdb-reader.c b/gvdb-reader.c index aa3154f..c2ee84d 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -332,7 +332,7 @@ gvdb_table_list_from_item (GvdbTable *table, /** * gvdb_table_get_names: * @table: a #GvdbTable - * @length: the number of items returned, or %NULL + * @length: (optional): the number of items returned, or %NULL * * Gets a list of all names contained in @table. * @@ -344,7 +344,7 @@ gvdb_table_list_from_item (GvdbTable *table, * above calls in the case of the corrupted file. Note also that the * returned strings may not be utf8. * - * Returns: a %NULL-terminated list of strings, of length @length + * Returns: (array length=length): a %NULL-terminated list of strings, of length @length **/ gchar ** gvdb_table_get_names (GvdbTable *table, -- cgit v1.2.1 From a44329c2442ff45d31fe7a0ca45005f145df3187 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Thu, 16 Aug 2018 15:36:32 +0100 Subject: Fix type of length returned by gvdb_table_get_names() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It should not be unsigned. The type in the on-disk format is gint32, so we need to return something at least as wide as that. However, we should not expose the implementation detail that the on-disk format is specifically gint32. Use a gsize, since that’s the normal type for array lengths — but check that we’re not on a platform where (somehow) gsize is smaller than gint32. Signed-off-by: Philip Withnall --- gvdb-reader.c | 7 +++++-- gvdb-reader.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/gvdb-reader.c b/gvdb-reader.c index c2ee84d..ae349a6 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -348,7 +348,7 @@ gvdb_table_list_from_item (GvdbTable *table, **/ gchar ** gvdb_table_get_names (GvdbTable *table, - gint *length) + gsize *length) { gchar **names; gint n_names; @@ -474,7 +474,10 @@ gvdb_table_get_names (GvdbTable *table, } if (length) - *length = n_names; + { + G_STATIC_ASSERT (sizeof (*length) >= sizeof (n_names)); + *length = n_names; + } return names; } diff --git a/gvdb-reader.h b/gvdb-reader.h index 3982773..9bf627f 100644 --- a/gvdb-reader.h +++ b/gvdb-reader.h @@ -38,7 +38,7 @@ G_GNUC_INTERNAL void gvdb_table_free (GvdbTable *table); G_GNUC_INTERNAL gchar ** gvdb_table_get_names (GvdbTable *table, - gint *length); + gsize *length); G_GNUC_INTERNAL gchar ** gvdb_table_list (GvdbTable *table, const gchar *key); -- cgit v1.2.1 From 084e1d868081481cd5dcad5e721714e9037ecb52 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Thu, 16 Aug 2018 15:44:09 +0100 Subject: Preallocate a GPtrArray to avoid some reallocations later on Suggested by Georges Basile Stavracas Neto. Signed-off-by: Philip Withnall --- gvdb-reader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gvdb-reader.c b/gvdb-reader.c index ae349a6..9509388 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -462,7 +462,7 @@ gvdb_table_get_names (GvdbTable *table, { GPtrArray *fixed_names; - fixed_names = g_ptr_array_new (); + fixed_names = g_ptr_array_sized_new (n_names); for (i = 0; i < n_names; i++) if (names[i] != NULL) g_ptr_array_add (fixed_names, names[i]); -- cgit v1.2.1 From e1bcd7529e534f4f33b1564243fb5fe56a2ba13c Mon Sep 17 00:00:00 2001 From: Ting-Wei Lan Date: Wed, 24 Oct 2018 21:46:16 +0800 Subject: build: Use weak bindings in gvdb to fix linking with LLD Since tests/dconf-mock-gvdb.c has functions conflicting with the real gvdb and it is intended for the former to override the latter in tests, we have to make functions in gvdb library have weak bindings instead of the default strong bindings to avoid duplicate symbol errors. Fixes https://gitlab.gnome.org/GNOME/dconf/issues/47 --- gvdb-reader.h | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/gvdb-reader.h b/gvdb-reader.h index 9bf627f..79a97d3 100644 --- a/gvdb-reader.h +++ b/gvdb-reader.h @@ -22,40 +22,55 @@ #include +/* We cannot enable the weak attribute unconditionally here because both + * gvdb/gvdb-reader.c and tests/dconf-mock-gvdb.c include this file. The + * intention of using weak symbols here is to allow the latter to override + * functions defined in the former, so functions in tests/dconf-mock-gvdb.c + * must have strong bindings. */ +#ifdef GVDB_USE_WEAK_SYMBOLS +# ifdef __GNUC__ +# define GVDB_GNUC_WEAK __attribute__((weak)) +# else +# define GVDB_GNUC_WEAK +# endif +#else +# define GVDB_GNUC_WEAK +#endif + typedef struct _GvdbTable GvdbTable; G_BEGIN_DECLS -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GvdbTable * gvdb_table_new_from_bytes (GBytes *bytes, gboolean trusted, GError **error); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GvdbTable * gvdb_table_new (const gchar *filename, gboolean trusted, GError **error); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK void gvdb_table_free (GvdbTable *table); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gchar ** gvdb_table_get_names (GvdbTable *table, gsize *length); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gchar ** gvdb_table_list (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GvdbTable * gvdb_table_get_table (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GVariant * gvdb_table_get_raw_value (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GVariant * gvdb_table_get_value (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gboolean gvdb_table_has_value (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gboolean gvdb_table_is_valid (GvdbTable *table); G_END_DECLS -- cgit v1.2.1