Handle match_all returning NULL

This is in preparation for not allocating an array at all if there
are no matches.
This commit is contained in:
Matthias Clasen 2015-09-09 10:55:31 -04:00
parent 117b50f8fb
commit 2d29ae4159

View File

@ -1638,15 +1638,20 @@ verify_tree_get_change_results (GtkCssProvider *provider,
int i;
tree_rules = _gtk_css_selector_tree_match_all (provider->priv->tree, matcher);
verify_tree_match_results (provider, matcher, tree_rules);
for (i = tree_rules->len - 1; i >= 0; i--)
if (tree_rules)
{
GtkCssRuleset *ruleset;
verify_tree_match_results (provider, matcher, tree_rules);
ruleset = tree_rules->pdata[i];
for (i = tree_rules->len - 1; i >= 0; i--)
{
GtkCssRuleset *ruleset;
verify_change |= _gtk_css_selector_get_change (ruleset->selector);
ruleset = tree_rules->pdata[i];
verify_change |= _gtk_css_selector_get_change (ruleset->selector);
}
g_ptr_array_free (tree_rules, TRUE);
}
if (change != verify_change)
@ -1671,8 +1676,6 @@ verify_tree_get_change_results (GtkCssProvider *provider,
g_warning (s->str);
g_string_free (s, TRUE);
}
g_ptr_array_free (tree_rules, TRUE);
}
#endif
}
@ -1711,46 +1714,46 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
}
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, &matcher);
verify_tree_match_results (css_provider, &matcher, tree_rules);
prop_name = g_strdup_printf ("-%s-%s",
g_type_name (pspec->owner_type),
pspec->name);
for (i = tree_rules->len - 1; i >= 0; i--)
if (tree_rules)
{
GtkCssRuleset *ruleset = tree_rules->pdata[i];
verify_tree_match_results (css_provider, &matcher, tree_rules);
if (ruleset->widget_style == NULL)
continue;
prop_name = g_strdup_printf ("-%s-%s",
g_type_name (pspec->owner_type),
pspec->name);
for (val = ruleset->widget_style; val != NULL; val = val->next)
{
if (strcmp (val->name, prop_name) == 0)
{
GtkCssScanner *scanner;
for (i = tree_rules->len - 1; i >= 0; i--)
{
GtkCssRuleset *ruleset = tree_rules->pdata[i];
scanner = gtk_css_scanner_new (css_provider,
NULL,
val->section,
val->section != NULL ? gtk_css_section_get_file (val->section) : NULL,
val->value);
if (ruleset->widget_style == NULL)
continue;
found = _gtk_css_style_funcs_parse_value (value,
scanner->parser);
for (val = ruleset->widget_style; val != NULL; val = val->next)
{
if (strcmp (val->name, prop_name) == 0)
{
GtkCssScanner *scanner;
gtk_css_scanner_destroy (scanner);
scanner = gtk_css_scanner_new (css_provider,
NULL,
val->section,
val->section != NULL ? gtk_css_section_get_file (val->section) : NULL,
val->value);
found = _gtk_css_style_funcs_parse_value (value, scanner->parser);
gtk_css_scanner_destroy (scanner);
break;
}
}
break;
}
}
if (found)
break;
}
if (found)
break;
g_free (prop_name);
g_ptr_array_free (tree_rules, TRUE);
}
g_free (prop_name);
g_ptr_array_free (tree_rules, TRUE);
gtk_widget_path_unref (path);
return found;
@ -1797,39 +1800,42 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
priv = css_provider->priv;
tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
verify_tree_match_results (css_provider, matcher, tree_rules);
for (i = tree_rules->len - 1; i >= 0; i--)
if (tree_rules)
{
ruleset = tree_rules->pdata[i];
verify_tree_match_results (css_provider, matcher, tree_rules);
if (ruleset->styles == NULL)
continue;
if (!_gtk_bitmask_intersects (_gtk_css_lookup_get_missing (lookup),
ruleset->set_styles))
continue;
for (j = 0; j < ruleset->n_styles; j++)
for (i = tree_rules->len - 1; i >= 0; i--)
{
GtkCssStyleProperty *prop = ruleset->styles[j].property;
guint id = _gtk_css_style_property_get_id (prop);
ruleset = tree_rules->pdata[i];
if (!_gtk_css_lookup_is_missing (lookup, id))
if (ruleset->styles == NULL)
continue;
_gtk_css_lookup_set (lookup,
id,
ruleset->styles[j].section,
ruleset->styles[j].value);
if (!_gtk_bitmask_intersects (_gtk_css_lookup_get_missing (lookup),
ruleset->set_styles))
continue;
for (j = 0; j < ruleset->n_styles; j++)
{
GtkCssStyleProperty *prop = ruleset->styles[j].property;
guint id = _gtk_css_style_property_get_id (prop);
if (!_gtk_css_lookup_is_missing (lookup, id))
continue;
_gtk_css_lookup_set (lookup,
id,
ruleset->styles[j].section,
ruleset->styles[j].value);
}
if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_missing (lookup)))
break;
}
if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_missing (lookup)))
break;
g_ptr_array_free (tree_rules, TRUE);
}
g_ptr_array_free (tree_rules, TRUE);
if (change)
{
GtkCssMatcher change_matcher;