Merge branch 'param-speedups' into 'main'

param: Avoid strcmps

See merge request GNOME/glib!2673
This commit is contained in:
Philip Withnall 2022-05-20 13:15:39 +00:00
commit 1f42078ace
2 changed files with 38 additions and 45 deletions

View File

@ -923,7 +923,8 @@ param_spec_pool_equals (gconstpointer key_spec_1,
const GParamSpec *key2 = key_spec_2; const GParamSpec *key2 = key_spec_2;
return (key1->owner_type == key2->owner_type && return (key1->owner_type == key2->owner_type &&
strcmp (key1->name, key2->name) == 0); (key1->name == key2->name ||
strcmp (key1->name, key2->name) == 0));
} }
/** /**
@ -1093,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);
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; delim = strchr (param_name, ':');
}
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; /* strip type prefix */
} if (delim && delim[1] == ':')
{
guint l = delim - param_name;
gchar stack_buffer[32], *buffer = l < 32 ? stack_buffer : g_new (gchar, l + 1);
GType type;
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);

View File

@ -759,18 +759,6 @@ param_boxed_set_default (GParamSpec *pspec,
value->data[0].v_pointer = NULL; value->data[0].v_pointer = NULL;
} }
static gboolean
param_boxed_validate (GParamSpec *pspec,
GValue *value)
{
/* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */
guint changed = 0;
/* can't do a whole lot here since we haven't even G_BOXED_TYPE() */
return changed;
}
static gint static gint
param_boxed_values_cmp (GParamSpec *pspec, param_boxed_values_cmp (GParamSpec *pspec,
const GValue *value1, const GValue *value1,
@ -1508,7 +1496,7 @@ _g_param_spec_types_init (void)
G_TYPE_BOXED, /* value_type */ G_TYPE_BOXED, /* value_type */
NULL, /* finalize */ NULL, /* finalize */
param_boxed_set_default, /* value_set_default */ param_boxed_set_default, /* value_set_default */
param_boxed_validate, /* value_validate */ NULL, /* value_validate */
param_boxed_values_cmp, /* values_cmp */ param_boxed_values_cmp, /* values_cmp */
}; };
type = g_param_type_register_static (g_intern_static_string ("GParamBoxed"), &pspec_info); type = g_param_type_register_static (g_intern_static_string ("GParamBoxed"), &pspec_info);