giconstantinfo: Add API to fix memory leak

https://bugzilla.gnome.org/show_bug.cgi?id=654069
This commit is contained in:
Jasper St. Pierre 2011-10-05 16:31:43 -04:00
parent 11cf4c56f3
commit b75e788785
2 changed files with 32 additions and 0 deletions

View File

@ -68,6 +68,35 @@ g_constant_info_get_type (GIConstantInfo *info)
#define DO_ALIGNED_COPY(dest_addr, src_addr, type) \
memcpy((dest_addr), (src_addr), sizeof(type))
/**
* g_constant_info_free_value: (skip)
* @info: a #GIConstantInfo
* @value: the argument
*
* Free the value returned from g_constant_info_get_value().
*
* Since: 1.30.1
*/
void
g_constant_info_free_value (GIConstantInfo *info,
GIArgument *value)
{
GIRealInfo *rinfo = (GIRealInfo *)info;
ConstantBlob *blob;
g_return_if_fail (info != NULL);
g_return_if_fail (GI_IS_CONSTANT_INFO (info));
blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset];
/* FIXME non-basic types ? */
if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
{
if (blob->type.flags.pointer)
g_free (value->v_pointer);
}
}
/**
* g_constant_info_get_value: (skip)
* @info: a #GIConstantInfo
@ -76,6 +105,7 @@ g_constant_info_get_type (GIConstantInfo *info)
* Obtain the value associated with the #GIConstantInfo and store it in the
* @value parameter. @argument needs to be allocated before passing it in.
* The size of the constant value stored in @argument will be returned.
* Free the value with g_constant_info_free_value().
*
* Returns: size of the constant
*/

View File

@ -34,6 +34,8 @@ G_BEGIN_DECLS
(g_base_info_get_type((GIBaseInfo*)info) == GI_INFO_TYPE_CONSTANT)
GITypeInfo * g_constant_info_get_type (GIConstantInfo *info);
void g_constant_info_free_value(GIConstantInfo *info,
GIArgument *value);
gint g_constant_info_get_value(GIConstantInfo *info,
GIArgument *value);
G_END_DECLS