diff options
Diffstat (limited to 'dev-libs/glib/files/GMarkup-fix-optimization-regression.patch')
-rw-r--r-- | dev-libs/glib/files/GMarkup-fix-optimization-regression.patch | 108 |
1 files changed, 0 insertions, 108 deletions
diff --git a/dev-libs/glib/files/GMarkup-fix-optimization-regression.patch b/dev-libs/glib/files/GMarkup-fix-optimization-regression.patch deleted file mode 100644 index 2f5b7b2..0000000 --- a/dev-libs/glib/files/GMarkup-fix-optimization-regression.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 059ec81c9e88ee5ec67aafd135714754ea5b9552 Mon Sep 17 00:00:00 2001 -From: Michael Meeks <michael.meeks@novell.com> -Date: Tue, 9 Jun 2009 11:31:42 +0100 -Subject: [PATCH] move start_element emission out into a new (inlined) function, so - the alloca'd memory is released on return, rather than slowly blowing - the stack. - ---- - glib/gmarkup.c | 76 +++++++++++++++++++++++++++++++------------------------- - 1 files changed, 42 insertions(+), 34 deletions(-) - -diff --git a/glib/gmarkup.c b/glib/gmarkup.c -index 35118ad..bb8165b 100644 ---- a/glib/gmarkup.c -+++ b/glib/gmarkup.c -@@ -891,6 +891,47 @@ clear_attributes (GMarkupParseContext *context) - g_assert (context->attr_values == NULL || - context->attr_values[0] == NULL); - } -+ -+/* This has to be a separate function to ensure the alloca's -+ are unwound on exit - otherwise we grow & blow the stack -+ with large documents */ -+static inline void -+emit_start_element (GMarkupParseContext *context, GError **error) -+{ -+ int i; -+ const gchar *start_name; -+ const gchar **attr_names; -+ const gchar **attr_values; -+ GError *tmp_error; -+ -+ attr_names = g_newa (const gchar *, context->cur_attr + 2); -+ attr_values = g_newa (const gchar *, context->cur_attr + 2); -+ for (i = 0; i < context->cur_attr + 1; i++) -+ { -+ attr_names[i] = context->attr_names[i]->str; -+ attr_values[i] = context->attr_values[i]->str; -+ } -+ attr_names[i] = NULL; -+ attr_values[i] = NULL; -+ -+ /* Call user callback for element start */ -+ tmp_error = NULL; -+ start_name = current_element (context); -+ -+ if (context->parser->start_element && -+ name_validate (context, start_name, error)) -+ (* context->parser->start_element) (context, -+ start_name, -+ (const gchar **)attr_names, -+ (const gchar **)attr_values, -+ context->user_data, -+ &tmp_error); -+ clear_attributes (context); -+ -+ if (tmp_error != NULL) -+ propagate_error (context, error, tmp_error); -+} -+ - /** - * g_markup_parse_context_parse: - * @context: a #GMarkupParseContext -@@ -1217,40 +1258,7 @@ g_markup_parse_context_parse (GMarkupParseContext *context, - */ - if (context->state == STATE_AFTER_ELISION_SLASH || - context->state == STATE_AFTER_CLOSE_ANGLE) -- { -- int i; -- const gchar *start_name; -- const gchar **attr_names; -- const gchar **attr_values; -- GError *tmp_error; -- -- attr_names = g_newa (const gchar *, context->cur_attr + 2); -- attr_values = g_newa (const gchar *, context->cur_attr + 2); -- for (i = 0; i < context->cur_attr + 1; i++) -- { -- attr_names[i] = context->attr_names[i]->str; -- attr_values[i] = context->attr_values[i]->str; -- } -- attr_names[i] = NULL; -- attr_values[i] = NULL; -- -- /* Call user callback for element start */ -- tmp_error = NULL; -- start_name = current_element (context); -- -- if (context->parser->start_element && -- name_validate (context, start_name, error)) -- (* context->parser->start_element) (context, -- start_name, -- (const gchar **)attr_names, -- (const gchar **)attr_values, -- context->user_data, -- &tmp_error); -- clear_attributes (context); -- -- if (tmp_error != NULL) -- propagate_error (context, error, tmp_error); -- } -+ emit_start_element (context, error); - } - break; - --- -1.6.1.3 - |