summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-09-09 11:08:43 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-09-09 11:11:11 -0400
commitc96495966ed1b9f3b38f03c79e7a777478a076fe (patch)
tree94b5bcf60c7e545c87b97303167a2ae78a6ea330
parentc4ccdd18c89c7965d8ffd47f3e8587b452e30f3f (diff)
downloadgtk+-wip/matthiasc/match-all.tar.gz
match_all: Only allocate an array when neededwip/matthiasc/match-all
My statistics show that more than half of all calls end up with 0 matches, so we can avoid some overhead by not allocating an array at all in this case.
-rw-r--r--gtk/gtkcssselector.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index 760e630847..eed04f7b41 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -159,8 +159,8 @@ g_ptr_array_insert_sorted (GPtrArray *array,
}
static void
-gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree,
- GPtrArray *array)
+gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree,
+ GPtrArray **array)
{
int i;
gpointer *matches;
@@ -168,8 +168,11 @@ gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree,
matches = gtk_css_selector_tree_get_matches (tree);
if (matches)
{
+ if (!*array)
+ *array = g_ptr_array_sized_new (16);
+
for (i = 0; matches[i] != NULL; i++)
- g_ptr_array_insert_sorted (array, matches[i]);
+ g_ptr_array_insert_sorted (*array, matches[i]);
}
}
@@ -1757,15 +1760,13 @@ GPtrArray *
_gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
const GtkCssMatcher *matcher)
{
- GPtrArray *array;
+ GPtrArray *array = NULL;
update_type_references ();
- array = g_ptr_array_sized_new (16);
-
for (; tree != NULL;
tree = gtk_css_selector_tree_get_sibling (tree))
- gtk_css_selector_foreach (&tree->selector, matcher, gtk_css_selector_tree_match_foreach, array);
+ gtk_css_selector_foreach (&tree->selector, matcher, gtk_css_selector_tree_match_foreach, &array);
return array;
}