#define INVALIDS "cefjklpwz&@^$"
#define N_INVALIDS (G_N_ELEMENTS (INVALIDS) - 1)
+/* see comment in gvariant-serialiser.c about this madness.
+ *
+ * we use this to get testing of non-strictly-aligned GVariant instances
+ * on machines that can tolerate it. it is necessary to support this
+ * because some systems have malloc() that returns non-8-aligned
+ * pointers. it is necessary to have special support in the tests
+ * because on most machines malloc() is 8-aligned.
+ */
+#define ALIGN_BITS (sizeof (struct { char a; union { \
+ guint64 x; void *y; gdouble z; } b; }) - 9)
+
static gboolean
randomly (gdouble prob)
{
GRand *rand;
gint i;
- g_assert_cmpint ((gsize) buffer & instance->alignment, ==, 0);
+ g_assert_cmpint ((gsize) buffer & ALIGN_BITS & instance->alignment, ==, 0);
rand = g_rand_new_with_seed (instance->seed);
for (i = 0; i < instance->size; i++)
GRand *rand;
gint i;
- g_assert_cmpint ((gsize) buffer & instance->alignment, ==, 0);
+ g_assert_cmpint ((gsize) buffer & ALIGN_BITS & instance->alignment, ==, 0);
g_assert_cmpint (size, ==, instance->size);
rand = g_rand_new_with_seed (instance->seed);
GRand *rand;
gint i;
- g_assert_cmpint ((gsize) buffer & instance->alignment, ==, 0);
+ g_assert_cmpint ((gsize) buffer & ALIGN_BITS & instance->alignment, ==, 0);
if (size != instance->size)
return FALSE;
}
static void
-flavoured_free (gpointer data)
+flavoured_free (gpointer data,
+ gsize flavour)
{
- g_free ((gpointer) (((gsize) data) & ~7));
+ g_free (((gchar *) data) - flavour);
}
static void
guint alignment;
guint flavour;
- alignment = instance->alignment + 1;
+ alignment = (instance->alignment & ALIGN_BITS) + 1;
for (flavour = 0; flavour < 8; flavour += alignment)
{
g_assert (child.type_info == instance->type_info);
random_instance_assert (instance, child.data, child.size);
g_variant_type_info_unref (child.type_info);
- flavoured_free (serialised.data);
+ flavoured_free (serialised.data, flavour);
}
}
guint i;
g_variant_type_info_query (array_info, &alignment, NULL);
- alignment++;
+ alignment = (alignment & ALIGN_BITS) + 1;
for (flavour = 0; flavour < 8; flavour += alignment)
{
g_variant_type_info_unref (child.type_info);
}
- flavoured_free (serialised.data);
+ flavoured_free (serialised.data, flavour);
}
}
gsize flavour;
guint i;
- alignment++;
+ alignment = (alignment & ALIGN_BITS) + 1;
for (flavour = 0; flavour < 8; flavour += alignment)
{
g_variant_type_info_unref (child.type_info);
}
- flavoured_free (serialised.data);
+ flavoured_free (serialised.data, flavour);
}
}
}
{
- /* variants are 8-aligned, so no extra flavouring */
- GVariantSerialised serialised;
- GVariantSerialised child;
+ gsize alignment;
+ gsize flavour;
+
+ /* variants are always 8-aligned */
+ alignment = ALIGN_BITS + 1;
+
+ for (flavour = 0; flavour < 8; flavour += alignment)
+ {
+ GVariantSerialised serialised;
+ GVariantSerialised child;
- serialised.type_info = type_info;
- serialised.data = flavoured_malloc (needed_size, 0);
- serialised.size = needed_size;
+ serialised.type_info = type_info;
+ serialised.data = flavoured_malloc (needed_size, flavour);
+ serialised.size = needed_size;
- g_variant_serialiser_serialise (serialised, random_instance_filler,
- (gpointer *) &instance, 1);
+ g_variant_serialiser_serialise (serialised, random_instance_filler,
+ (gpointer *) &instance, 1);
- g_assert (memcmp (serialised.data, data, serialised.size) == 0);
- g_assert (g_variant_serialised_n_children (serialised) == 1);
+ g_assert (memcmp (serialised.data, data, serialised.size) == 0);
+ g_assert (g_variant_serialised_n_children (serialised) == 1);
- child = g_variant_serialised_get_child (serialised, 0);
- g_assert (child.type_info == instance->type_info);
- random_instance_check (instance, child.data, child.size);
+ child = g_variant_serialised_get_child (serialised, 0);
+ g_assert (child.type_info == instance->type_info);
+ random_instance_check (instance, child.data, child.size);
- g_variant_type_info_unref (child.type_info);
- flavoured_free (serialised.data);
+ g_variant_type_info_unref (child.type_info);
+ flavoured_free (serialised.data, flavour);
+ }
}
g_variant_type_info_unref (type_info);