[gtk/wip/baedert/for-master: 56/58] builderparser: Use GPtrArray for stack




commit 174443dd51188ce322ef4d9920807516f57ad3fe
Author: Timm Bäder <mail baedert org>
Date:   Sun Jan 3 12:23:01 2021 +0100

    builderparser: Use GPtrArray for stack

 gtk/gtkbuilderparser.c  | 52 ++++++++++---------------------------------------
 gtk/gtkbuilderprivate.h |  2 +-
 2 files changed, 11 insertions(+), 43 deletions(-)
---
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index b714a8e869..4bb917d7dd 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -365,16 +365,17 @@ static void free_object_info (ObjectInfo *info);
 static inline void
 state_push (ParserData *data, gpointer info)
 {
-  data->stack = g_slist_prepend (data->stack, info);
+  g_ptr_array_add (data->stack, info);
 }
 
 static inline gpointer
 state_peek (ParserData *data)
 {
-  if (!data->stack)
+  if (!data->stack ||
+      data->stack->len == 0)
     return NULL;
 
-  return data->stack->data;
+  return g_ptr_array_index (data->stack, data->stack->len - 1);
 }
 
 static inline gpointer
@@ -384,8 +385,8 @@ state_pop (ParserData *data)
 
   g_assert (data->stack);
 
-  old = data->stack->data;
-  data->stack = g_slist_delete_link (data->stack, data->stack);
+  old = state_peek (data);
+  data->stack->len --;
   return old;
 }
 #define state_peek_info(data, st) ((st*)state_peek(data))
@@ -2077,7 +2078,7 @@ text (GtkBuildableParseContext  *context,
       return;
     }
 
-  if (!data->stack)
+  if (!data->stack || data->stack->len == 0)
     return;
 
   info = state_peek_info (data, CommonInfo);
@@ -2118,41 +2119,6 @@ text (GtkBuildableParseContext  *context,
     }
 }
 
-static void
-free_info (CommonInfo *info)
-{
-  switch (info->tag_type)
-    {
-      case TAG_OBJECT:
-      case TAG_TEMPLATE:
-        free_object_info ((ObjectInfo *)info);
-        break;
-      case TAG_CHILD:
-        free_child_info ((ChildInfo *)info);
-        break;
-      case TAG_BINDING:
-        _free_binding_info ((BindingInfo *)info, NULL);
-        break;
-      case TAG_BINDING_EXPRESSION:
-        free_binding_expression_info ((BindingExpressionInfo *) info);
-        break;
-      case TAG_PROPERTY:
-        free_property_info ((PropertyInfo *)info);
-        break;
-      case TAG_SIGNAL:
-        _free_signal_info ((SignalInfo *)info, NULL);
-        break;
-      case TAG_REQUIRES:
-        free_requires_info ((RequiresInfo *)info, NULL);
-        break;
-      case TAG_EXPRESSION:
-        free_expression_info ((ExpressionInfo *)info);
-        break;
-      default:
-        g_assert_not_reached ();
-    }
-}
-
 static const GtkBuildableParser parser = {
   start_element,
   end_element,
@@ -2186,6 +2152,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
   data.domain = g_strdup (domain);
   data.object_ids = g_hash_table_new_full (g_str_hash, g_str_equal,
                                            (GDestroyNotify)g_free, NULL);
+  data.stack = g_ptr_array_new ();
 
   if (requested_objs)
     {
@@ -2237,11 +2204,12 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
 
  out:
 
-  g_slist_free_full (data.stack, (GDestroyNotify)free_info);
+  /*g_slist_free_full (data.stack, (GDestroyNotify)free_info);*/
   g_slist_free_full (data.custom_finalizers, (GDestroyNotify)free_subparser);
   g_slist_free (data.finalizers);
   g_free (data.domain);
   g_hash_table_destroy (data.object_ids);
+  g_ptr_array_free (data.stack, TRUE);
   gtk_buildable_parse_context_free (&data.ctx);
 
   /* restore the original domain */
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index c6200685c4..3bd9e166b8 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -173,7 +173,7 @@ typedef struct {
   const char *last_element;
   GtkBuilder *builder;
   char *domain;
-  GSList *stack;
+  GPtrArray *stack;
   SubParser *subparser;
   GtkBuildableParseContext ctx;
   const char *filename;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]