diff options
author | Matthias Clasen <matthiasc@src.gnome.org> | 2007-11-10 23:57:32 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2007-11-10 23:57:32 +0000 |
commit | 464ae984952cca6afe954cf3bb89e17a40fc58e6 (patch) | |
tree | 352bc1113b0c6a9454fb965612c756ed842bfcd6 /gtk/gtkbuilderparser.c | |
parent | 06d28ff88481c3074ee6bd18a359b9826afc1c90 (diff) | |
download | gtk+-464ae984952cca6afe954cf3bb89e17a40fc58e6.tar.gz |
Leak less in error paths
svn path=/trunk/; revision=18980
Diffstat (limited to 'gtk/gtkbuilderparser.c')
-rw-r--r-- | gtk/gtkbuilderparser.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index ee66b8d2dc..7f43af64e2 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -917,6 +917,21 @@ text (GMarkupParseContext *context, } } +static void +free_info (CommonInfo *info) +{ + if (strcmp (info->tag.name, "object") == 0) + free_object_info ((ObjectInfo *)info); + else if (strcmp (info->tag.name, "child") == 0) + free_child_info ((ChildInfo *)info); + else if (strcmp (info->tag.name, "property") == 0) + free_property_info ((PropertyInfo *)info); + else if (strcmp (info->tag.name, "signal") == 0) + _free_signal_info ((SignalInfo *)info, NULL); + else + g_assert_not_reached (); +} + static const GMarkupParser parser = { start_element, end_element, @@ -940,8 +955,9 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, data->filename = filename; data->domain = g_strdup (gtk_builder_get_translation_domain (builder)); - data->ctx = g_markup_parse_context_new ( - &parser, G_MARKUP_TREAT_CDATA_AS_TEXT, data, NULL); + data->ctx = g_markup_parse_context_new (&parser, + G_MARKUP_TREAT_CDATA_AS_TEXT, + data, NULL); if (!g_markup_parse_context_parse (data->ctx, buffer, length, error)) goto out; @@ -960,7 +976,6 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, sub->child, sub->tagname, sub->data); - free_subparser (sub); } /* Common parser_finished, for all created objects */ @@ -972,11 +987,13 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, } out: - g_markup_parse_context_free (data->ctx); + g_slist_foreach (data->stack, (GFunc)free_info, NULL); g_slist_free (data->stack); + g_slist_foreach (data->custom_finalizers, (GFunc)free_subparser, NULL); g_slist_free (data->custom_finalizers); g_slist_free (data->finalizers); g_free (data->domain); + g_markup_parse_context_free (data->ctx); g_free (data); } |