diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-04-03 22:36:43 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-04-04 14:20:25 -0400 |
commit | 0334d002c00a9a33fb50bdab147a70b8952dc212 (patch) | |
tree | 423346a65761f71f4eb3e61014c9ed610fd23054 | |
parent | d731ce49ad852ce3331f6a1a757b21a570599791 (diff) | |
download | gtk+-0334d002c00a9a33fb50bdab147a70b8952dc212.tar.gz |
textbtree: Speed up _gtk_text_btree_find_line_top
Another place where we can avoid allocating a stack
piecemeal.
-rw-r--r-- | gtk/gtktextbtree.c | 20 |
1 files 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 */ |