mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-16 12:45:13 +01:00
GVariantTypeInfo changes
- rename 'type' in MemberInfo to 'type_info' - add 'ending_type' field to MemberInfo - document how to find the ending
This commit is contained in:
parent
1de58ef708
commit
0ac2277b49
@ -336,7 +336,7 @@ tuple_info_free (GVariantTypeInfo *info)
|
|||||||
tuple_info = (TupleInfo *) info;
|
tuple_info = (TupleInfo *) info;
|
||||||
|
|
||||||
for (i = 0; i < tuple_info->n_members; i++)
|
for (i = 0; i < tuple_info->n_members; i++)
|
||||||
g_variant_type_info_unref (tuple_info->members[i].type);
|
g_variant_type_info_unref (tuple_info->members[i].type_info);
|
||||||
|
|
||||||
g_slice_free1 (sizeof (GVariantMemberInfo) * tuple_info->n_members,
|
g_slice_free1 (sizeof (GVariantMemberInfo) * tuple_info->n_members,
|
||||||
tuple_info->members);
|
tuple_info->members);
|
||||||
@ -357,8 +357,17 @@ tuple_allocate_members (const GVariantType *type,
|
|||||||
item_type = g_variant_type_first (type);
|
item_type = g_variant_type_first (type);
|
||||||
while (item_type)
|
while (item_type)
|
||||||
{
|
{
|
||||||
(*members)[i++].type = g_variant_type_info_get (item_type);
|
GVariantMemberInfo *member = &(*members)[i++];
|
||||||
|
|
||||||
|
member->type_info = g_variant_type_info_get (item_type);
|
||||||
item_type = g_variant_type_next (item_type);
|
item_type = g_variant_type_next (item_type);
|
||||||
|
|
||||||
|
if (item_type == NULL)
|
||||||
|
member->ending_type = G_VARIANT_MEMBER_ENDING_LAST;
|
||||||
|
else if (member->type_info->fixed_size)
|
||||||
|
member->ending_type = G_VARIANT_MEMBER_ENDING_FIXED;
|
||||||
|
else
|
||||||
|
member->ending_type = G_VARIANT_MEMBER_ENDING_OFFSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (i == *n_members);
|
g_assert (i == *n_members);
|
||||||
@ -377,8 +386,8 @@ tuple_get_item (TupleInfo *info,
|
|||||||
if (&info->members[info->n_members] == item)
|
if (&info->members[info->n_members] == item)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
*d = item->type->alignment;
|
*d = item->type_info->alignment;
|
||||||
*e = item->type->fixed_size;
|
*e = item->type_info->fixed_size;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -591,7 +600,7 @@ tuple_set_base_info (TupleInfo *info)
|
|||||||
/* can find the max of a list of "one less than" powers of two
|
/* can find the max of a list of "one less than" powers of two
|
||||||
* by 'or'ing them
|
* by 'or'ing them
|
||||||
*/
|
*/
|
||||||
base->alignment |= m->type->alignment;
|
base->alignment |= m->type_info->alignment;
|
||||||
|
|
||||||
m--; /* take 'm' back to the last item */
|
m--; /* take 'm' back to the last item */
|
||||||
|
|
||||||
@ -599,7 +608,7 @@ tuple_set_base_info (TupleInfo *info)
|
|||||||
* offsets are stored and the last item is fixed-sized too (since
|
* offsets are stored and the last item is fixed-sized too (since
|
||||||
* an offset is never stored for the last item).
|
* an offset is never stored for the last item).
|
||||||
*/
|
*/
|
||||||
if (m->i == -1 && m->type->fixed_size)
|
if (m->i == -1 && m->type_info->fixed_size)
|
||||||
/* in that case, the fixed size can be found by finding the
|
/* in that case, the fixed size can be found by finding the
|
||||||
* start of the last item (in the usual way) and adding its
|
* start of the last item (in the usual way) and adding its
|
||||||
* fixed size.
|
* fixed size.
|
||||||
@ -609,7 +618,7 @@ tuple_set_base_info (TupleInfo *info)
|
|||||||
* easier) so we round up to that here.
|
* easier) so we round up to that here.
|
||||||
*/
|
*/
|
||||||
base->fixed_size =
|
base->fixed_size =
|
||||||
tuple_align (((m->a & m->b) | m->c) + m->type->fixed_size,
|
tuple_align (((m->a & m->b) | m->c) + m->type_info->fixed_size,
|
||||||
base->alignment);
|
base->alignment);
|
||||||
else
|
else
|
||||||
/* else, the tuple is not fixed size */
|
/* else, the tuple is not fixed size */
|
||||||
|
@ -95,16 +95,35 @@ typedef struct _GVariantTypeInfo GVariantTypeInfo;
|
|||||||
*
|
*
|
||||||
* For details about how 'a', 'b' and 'c' are calculated, see the
|
* For details about how 'a', 'b' and 'c' are calculated, see the
|
||||||
* comments at the point of the implementation in gvariantypeinfo.c.
|
* comments at the point of the implementation in gvariantypeinfo.c.
|
||||||
|
*
|
||||||
|
* The end address of the item is then determined in one of three ways,
|
||||||
|
* according to the 'end_type' field.
|
||||||
|
*
|
||||||
|
* - FIXED: For fixed sized items, the end address is equal to the
|
||||||
|
* start address plus the fixed size.
|
||||||
|
*
|
||||||
|
* - LAST: For the last variable sized item in the tuple, the end
|
||||||
|
* address is equal to the end address of the tuple, minus the size
|
||||||
|
* of the offset array.
|
||||||
|
*
|
||||||
|
* - OFFSET: For other variable sized items, the next index past 'i'
|
||||||
|
* (ie: 'i + 1') must be consulted to find the end of this item.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GVariantTypeInfo *type;
|
GVariantTypeInfo *type_info;
|
||||||
|
|
||||||
gsize i, a;
|
gsize i, a;
|
||||||
gint8 b, c;
|
gint8 b, c;
|
||||||
|
|
||||||
|
guint8 ending_type;
|
||||||
} GVariantMemberInfo;
|
} GVariantMemberInfo;
|
||||||
|
|
||||||
|
#define G_VARIANT_MEMBER_ENDING_FIXED 0
|
||||||
|
#define G_VARIANT_MEMBER_ENDING_LAST 1
|
||||||
|
#define G_VARIANT_MEMBER_ENDING_OFFSET 2
|
||||||
|
|
||||||
/* query */
|
/* query */
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
const gchar * g_variant_type_info_get_type_string (GVariantTypeInfo *typeinfo);
|
const gchar * g_variant_type_info_get_type_string (GVariantTypeInfo *typeinfo);
|
||||||
|
@ -826,7 +826,7 @@ describe_info (GVariantTypeInfo *info)
|
|||||||
sep = ", ";
|
sep = ", ";
|
||||||
|
|
||||||
minfo = g_variant_type_info_member_info (info, i);
|
minfo = g_variant_type_info_member_info (info, i);
|
||||||
subtype = describe_info (minfo->type);
|
subtype = describe_info (minfo->type_info);
|
||||||
g_string_append (string, subtype);
|
g_string_append (string, subtype);
|
||||||
g_free (subtype);
|
g_free (subtype);
|
||||||
}
|
}
|
||||||
@ -845,8 +845,8 @@ describe_info (GVariantTypeInfo *info)
|
|||||||
g_assert_cmpint (g_variant_type_info_n_members (info), ==, 2);
|
g_assert_cmpint (g_variant_type_info_n_members (info), ==, 2);
|
||||||
keyinfo = g_variant_type_info_member_info (info, 0);
|
keyinfo = g_variant_type_info_member_info (info, 0);
|
||||||
valueinfo = g_variant_type_info_member_info (info, 1);
|
valueinfo = g_variant_type_info_member_info (info, 1);
|
||||||
key = describe_info (keyinfo->type);
|
key = describe_info (keyinfo->type_info);
|
||||||
value = describe_info (valueinfo->type);
|
value = describe_info (valueinfo->type_info);
|
||||||
result = g_strjoin ("", "e of [", key, ", ", value, "]", NULL);
|
result = g_strjoin ("", "e of [", key, ", ", value, "]", NULL);
|
||||||
g_free (key);
|
g_free (key);
|
||||||
g_free (value);
|
g_free (value);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user