summaryrefslogtreecommitdiff
path: root/tests/repository/gitypelibtest.c
diff options
context:
space:
mode:
authorTorsten Schönfeld <kaffeetisch@gmx.de>2011-09-10 16:52:51 +0200
committerTorsten Schönfeld <kaffeetisch@gmx.de>2011-09-11 00:34:28 +0200
commitea68ec234ad31b0a1d92adbf0c911a5dd541b647 (patch)
tree125930f400320b4bddfa7948396a10915f83c1b5 /tests/repository/gitypelibtest.c
parentc3da3d46ffa9c3b53e7f7132eaa9c9c722ebc859 (diff)
downloadgobject-introspection-ea68ec234ad31b0a1d92adbf0c911a5dd541b647.tar.gz
scanner: correctly handle structs with arrays of anon unions
This applies mainly to GValue, which is defined as: struct _GValue { /*< private >*/ GType g_type; /* public for GTypeValueTable methods */ union { gint v_int; guint v_uint; glong v_long; gulong v_ulong; gint64 v_int64; guint64 v_uint64; gfloat v_float; gdouble v_double; gpointer v_pointer; } data[2]; }; Previously, the scanner did not understand the array of unions. This resulted in g_struct_info_get_size returning an incorrect size for GValue (at least on 32bit systems). Fix this by making up a separate union declaration for the GIR that can be referenced by the array. https://bugzilla.gnome.org/show_bug.cgi?id=657040
Diffstat (limited to 'tests/repository/gitypelibtest.c')
-rw-r--r--tests/repository/gitypelibtest.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/tests/repository/gitypelibtest.c b/tests/repository/gitypelibtest.c
index 2896846a..6e69b096 100644
--- a/tests/repository/gitypelibtest.c
+++ b/tests/repository/gitypelibtest.c
@@ -106,6 +106,31 @@ test_enum_and_flags_static_methods(GIRepository *repo)
g_base_info_unref (enum_info);
}
+static void
+test_size_of_struct_with_array_of_anon_unions(GIRepository *repo)
+{
+ GITypelib *ret;
+ GError *error = NULL;
+ GIBaseInfo *struct_info;
+
+ ret = g_irepository_require (repo, "Regress", NULL, 0, &error);
+ if (!ret)
+ g_error ("%s", error->message);
+
+ struct_info = g_irepository_find_by_name (repo, "Regress", "TestStructE");
+ if (!struct_info)
+ g_error ("Could not find Regress.TestStructE");
+ g_assert (g_struct_info_get_size (struct_info)
+ == sizeof (GType) + 2*sizeof (gint64));
+ g_base_info_unref (struct_info);
+
+ struct_info = g_irepository_find_by_name (repo, "GObject", "Value");
+ if (!struct_info)
+ g_error ("Could not find GObject.Value");
+ g_assert (g_struct_info_get_size (struct_info) == sizeof (GValue));
+ g_base_info_unref (struct_info);
+}
+
int
main(int argc, char **argv)
{
@@ -118,6 +143,7 @@ main(int argc, char **argv)
/* do tests */
test_enum_and_flags_cidentifier (repo);
test_enum_and_flags_static_methods (repo);
+ test_size_of_struct_with_array_of_anon_unions (repo);
exit(0);
}