diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2011-10-05 16:31:43 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2011-10-05 16:46:33 -0400 |
commit | 8e970f46b8525396009d4d833a1f1cdacd3df6a1 (patch) | |
tree | 3b33e27ba1d2cca48d0ed7b259fca66738daee4c /girepository | |
parent | 25fb1964cbf603a457308a3ecb9ed177262763ef (diff) | |
download | gobject-introspection-8e970f46b8525396009d4d833a1f1cdacd3df6a1.tar.gz |
giconstantinfo: Add API to fix memory leak
https://bugzilla.gnome.org/show_bug.cgi?id=654069
Diffstat (limited to 'girepository')
-rw-r--r-- | girepository/giconstantinfo.c | 30 | ||||
-rw-r--r-- | girepository/giconstantinfo.h | 2 |
2 files changed, 32 insertions, 0 deletions
diff --git a/girepository/giconstantinfo.c b/girepository/giconstantinfo.c index c0823030..2c3cc292 100644 --- a/girepository/giconstantinfo.c +++ b/girepository/giconstantinfo.c @@ -69,6 +69,35 @@ g_constant_info_get_type (GIConstantInfo *info) 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 * @value: (out): an argument @@ -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 */ diff --git a/girepository/giconstantinfo.h b/girepository/giconstantinfo.h index a2679bd2..2e7d697f 100644 --- a/girepository/giconstantinfo.h +++ b/girepository/giconstantinfo.h @@ -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 |