mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-26 15:36:14 +01:00
param: Avoid strchrs
Using prefixed property names like GtkWidget::visible is very deprectated and basically never done. So avoid paying the strchr cost before doing the first lookup.
This commit is contained in:
parent
91dafa85fc
commit
51215bf7b8
@ -1094,53 +1094,57 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
|||||||
gboolean walk_ancestors)
|
gboolean walk_ancestors)
|
||||||
{
|
{
|
||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
gchar *delim;
|
|
||||||
|
|
||||||
g_return_val_if_fail (pool != NULL, NULL);
|
g_return_val_if_fail (pool != NULL, NULL);
|
||||||
g_return_val_if_fail (param_name != NULL, NULL);
|
g_return_val_if_fail (param_name != NULL, NULL);
|
||||||
|
|
||||||
g_mutex_lock (&pool->mutex);
|
g_mutex_lock (&pool->mutex);
|
||||||
|
|
||||||
delim = pool->type_prefixing ? strchr (param_name, ':') : NULL;
|
|
||||||
|
|
||||||
/* try quick and away, i.e. without prefix */
|
/* try quick and away, i.e. without prefix */
|
||||||
if (!delim)
|
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||||
|
if (pspec)
|
||||||
{
|
{
|
||||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
|
||||||
g_mutex_unlock (&pool->mutex);
|
g_mutex_unlock (&pool->mutex);
|
||||||
|
|
||||||
return pspec;
|
return pspec;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* strip type prefix */
|
if (pool->type_prefixing)
|
||||||
if (pool->type_prefixing && delim[1] == ':')
|
|
||||||
{
|
{
|
||||||
guint l = delim - param_name;
|
char *delim;
|
||||||
gchar stack_buffer[32], *buffer = l < 32 ? stack_buffer : g_new (gchar, l + 1);
|
|
||||||
GType type;
|
|
||||||
|
|
||||||
strncpy (buffer, param_name, delim - param_name);
|
delim = strchr (param_name, ':');
|
||||||
buffer[l] = 0;
|
|
||||||
type = g_type_from_name (buffer);
|
|
||||||
if (l >= 32)
|
|
||||||
g_free (buffer);
|
|
||||||
if (type) /* type==0 isn't a valid type pefix */
|
|
||||||
{
|
|
||||||
/* sanity check, these cases don't make a whole lot of sense */
|
|
||||||
if ((!walk_ancestors && type != owner_type) || !g_type_is_a (owner_type, type))
|
|
||||||
{
|
|
||||||
g_mutex_unlock (&pool->mutex);
|
|
||||||
|
|
||||||
return NULL;
|
/* strip type prefix */
|
||||||
}
|
if (delim && delim[1] == ':')
|
||||||
owner_type = type;
|
{
|
||||||
param_name += l + 2;
|
guint l = delim - param_name;
|
||||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
gchar stack_buffer[32], *buffer = l < 32 ? stack_buffer : g_new (gchar, l + 1);
|
||||||
g_mutex_unlock (&pool->mutex);
|
GType type;
|
||||||
|
|
||||||
return pspec;
|
strncpy (buffer, param_name, delim - param_name);
|
||||||
}
|
buffer[l] = 0;
|
||||||
|
type = g_type_from_name (buffer);
|
||||||
|
if (l >= 32)
|
||||||
|
g_free (buffer);
|
||||||
|
if (type) /* type==0 isn't a valid type pefix */
|
||||||
|
{
|
||||||
|
/* sanity check, these cases don't make a whole lot of sense */
|
||||||
|
if ((!walk_ancestors && type != owner_type) || !g_type_is_a (owner_type, type))
|
||||||
|
{
|
||||||
|
g_mutex_unlock (&pool->mutex);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
owner_type = type;
|
||||||
|
param_name += l + 2;
|
||||||
|
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||||
|
g_mutex_unlock (&pool->mutex);
|
||||||
|
|
||||||
|
return pspec;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* malformed param_name */
|
/* malformed param_name */
|
||||||
|
|
||||||
g_mutex_unlock (&pool->mutex);
|
g_mutex_unlock (&pool->mutex);
|
||||||
|
Loading…
Reference in New Issue
Block a user