[gtk/f16c.msvc: 9/61] textbtree: Speed up _gtk_text_btree_find_line_top




commit 55037bb30e5816e1db76c774024fc3853d3c6b06
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Apr 3 22:36:43 2021 -0400

    textbtree: Speed up _gtk_text_btree_find_line_top
    
    Another place where we can avoid allocating a stack
    piecemeal.

 gtk/gtktextbtree.c | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)
---
diff --git a/gtk/gtktextbtree.c b/gtk/gtktextbtree.c
index bfe628cf77..002f14245a 100644
--- a/gtk/gtktextbtree.c
+++ b/gtk/gtktextbtree.c
@@ -1481,30 +1481,28 @@ _gtk_text_btree_find_line_top (GtkTextBTree *tree,
 {
   int y = 0;
   BTreeView *view;
-  GSList *nodes;
-  GSList *iter;
   GtkTextBTreeNode *node;
+  GtkTextBTreeNode *nodes[64];
+  int tos = 0;
 
   view = gtk_text_btree_get_view (tree, view_id);
 
   g_return_val_if_fail (view != NULL, 0);
 
-  nodes = NULL;
   node = target_line->parent;
   while (node != NULL)
     {
-      nodes = g_slist_prepend (nodes, node);
+      nodes[tos++] = node;
       node = node->parent;
     }
 
-  iter = nodes;
-  while (iter != NULL)
+  tos--;
+  while (tos >= 0)
     {
-      node = iter->data;
+      node = nodes[tos];
 
       if (node->level == 0)
         {
-          g_slist_free (nodes);
           return find_line_top_in_line_list (tree, view,
                                              node->children.line,
                                              target_line, y);
@@ -1514,8 +1512,8 @@ _gtk_text_btree_find_line_top (GtkTextBTree *tree,
           GtkTextBTreeNode *child;
           GtkTextBTreeNode *target_node;
 
-          g_assert (iter->next != NULL); /* not at level 0 */
-          target_node = iter->next->data;
+          g_assert (tos > 0); /* not at level 0 */
+          target_node = nodes[tos - 1];
 
           child = node->children.node;
 
@@ -1538,7 +1536,7 @@ _gtk_text_btree_find_line_top (GtkTextBTree *tree,
                                        ran out of nodes */
         }
 
-      iter = iter->next;
+      tos--;
     }
 
   g_assert_not_reached (); /* we return when we find the target line */


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