[gtk/wip/baedert/for-master: 5/16] builderparser: Only allocate subparser stack when needed
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/for-master: 5/16] builderparser: Only allocate subparser stack when needed
- Date: Wed, 13 Jan 2021 19:38:53 +0000 (UTC)
commit bf8d9d8e692737e7101a8e404da89344eaab866e
Author: Timm Bäder <mail baedert org>
Date: Wed Jan 6 17:54:31 2021 +0100
builderparser: Only allocate subparser stack when needed
Out of the 3.3k possibly_finish_subparser calls when opening the
widget-factory, only 300 need one.
gtk/gtkbuilderparser.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index 41935df8e1..b22cb1dfe5 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -32,7 +32,8 @@
#include <string.h>
-typedef struct {
+typedef struct
+{
const GtkBuildableParser *last_parser;
gpointer last_user_data;
int last_depth;
@@ -41,9 +42,8 @@ typedef struct {
static void
pop_subparser_stack (GtkBuildableParseContext *context)
{
- GtkBuildableParserStack *stack =
- &g_array_index (context->subparser_stack, GtkBuildableParserStack,
- context->subparser_stack->len - 1);
+ GtkBuildableParserStack *stack = &g_array_index (context->subparser_stack, GtkBuildableParserStack,
+ context->subparser_stack->len - 1);
context->awaiting_pop = TRUE;
context->held_user_data = context->user_data;
@@ -57,15 +57,17 @@ pop_subparser_stack (GtkBuildableParseContext *context)
static void
possibly_finish_subparser (GtkBuildableParseContext *context)
{
- if (context->subparser_stack->len > 0)
- {
- GtkBuildableParserStack *stack =
- &g_array_index (context->subparser_stack, GtkBuildableParserStack,
- context->subparser_stack->len - 1);
+ GtkBuildableParserStack *stack;
- if (stack->last_depth == context->tag_stack->len)
- pop_subparser_stack (context);
- }
+ if (!context->subparser_stack ||
+ context->subparser_stack->len == 0)
+ return;
+
+ stack = &g_array_index (context->subparser_stack, GtkBuildableParserStack,
+ context->subparser_stack->len - 1);
+
+ if (stack->last_depth == context->tag_stack->len)
+ pop_subparser_stack (context);
}
static void
@@ -128,6 +130,9 @@ proxy_error (GMarkupParseContext *gm_context,
/* report the error all the way up to free all the user-data */
+ if (!context->subparser_stack)
+ return;
+
while (context->subparser_stack->len > 0)
{
pop_subparser_stack (context);
@@ -157,7 +162,7 @@ gtk_buildable_parse_context_init (GtkBuildableParseContext *context,
context->parser = parser;
context->user_data = user_data;
- context->subparser_stack = g_array_new (FALSE, FALSE, sizeof (GtkBuildableParserStack));
+ context->subparser_stack = NULL;
context->tag_stack = g_ptr_array_new ();
context->held_user_data = NULL;
context->awaiting_pop = FALSE;
@@ -166,7 +171,9 @@ gtk_buildable_parse_context_init (GtkBuildableParseContext *context,
static void
gtk_buildable_parse_context_free (GtkBuildableParseContext *context)
{
- g_array_unref (context->subparser_stack);
+ if (context->subparser_stack)
+ g_array_unref (context->subparser_stack);
+
g_ptr_array_unref (context->tag_stack);
}
@@ -245,6 +252,9 @@ gtk_buildable_parse_context_push (GtkBuildableParseContext *context,
context->parser = parser;
context->user_data = user_data;
+ if (!context->subparser_stack)
+ context->subparser_stack = g_array_new (FALSE, FALSE, sizeof (GtkBuildableParserStack));
+
g_array_append_val (context->subparser_stack, stack);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]