mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 11:26:16 +01:00
gvalue: Avoid expensive checks where possible
Original patch submitted by Edward Hervey Close issue #894
This commit is contained in:
parent
c411d0aa6d
commit
5f3e470eb3
@ -162,14 +162,15 @@ GValue*
|
|||||||
g_value_init (GValue *value,
|
g_value_init (GValue *value,
|
||||||
GType g_type)
|
GType g_type)
|
||||||
{
|
{
|
||||||
|
GTypeValueTable *value_table;
|
||||||
/* g_return_val_if_fail (G_TYPE_IS_VALUE (g_type), NULL); be more elaborate below */
|
/* g_return_val_if_fail (G_TYPE_IS_VALUE (g_type), NULL); be more elaborate below */
|
||||||
g_return_val_if_fail (value != NULL, NULL);
|
g_return_val_if_fail (value != NULL, NULL);
|
||||||
/* g_return_val_if_fail (G_VALUE_TYPE (value) == 0, NULL); be more elaborate below */
|
/* g_return_val_if_fail (G_VALUE_TYPE (value) == 0, NULL); be more elaborate below */
|
||||||
|
|
||||||
if (G_TYPE_IS_VALUE (g_type) && G_VALUE_TYPE (value) == 0)
|
value_table = g_type_value_table_peek (g_type);
|
||||||
{
|
|
||||||
GTypeValueTable *value_table = g_type_value_table_peek (g_type);
|
|
||||||
|
|
||||||
|
if (value_table && G_VALUE_TYPE (value) == 0)
|
||||||
|
{
|
||||||
/* setup and init */
|
/* setup and init */
|
||||||
value_meminit (value, g_type);
|
value_meminit (value, g_type);
|
||||||
value_table->value_init (value);
|
value_table->value_init (value);
|
||||||
@ -183,9 +184,7 @@ g_value_init (GValue *value,
|
|||||||
g_warning ("%s: cannot initialize GValue with type '%s', %s",
|
g_warning ("%s: cannot initialize GValue with type '%s', %s",
|
||||||
G_STRLOC,
|
G_STRLOC,
|
||||||
g_type_name (g_type),
|
g_type_name (g_type),
|
||||||
g_type_value_table_peek (g_type) ?
|
value_table ? "this type is abstract with regards to GValue use, use a more specific (derived) type" : "this type has no GTypeValueTable implementation");
|
||||||
"this type is abstract with regards to GValue use, use a more specific (derived) type" :
|
|
||||||
"this type has no GTypeValueTable implementation");
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,8 +199,8 @@ void
|
|||||||
g_value_copy (const GValue *src_value,
|
g_value_copy (const GValue *src_value,
|
||||||
GValue *dest_value)
|
GValue *dest_value)
|
||||||
{
|
{
|
||||||
g_return_if_fail (G_IS_VALUE (src_value));
|
g_return_if_fail (src_value);
|
||||||
g_return_if_fail (G_IS_VALUE (dest_value));
|
g_return_if_fail (dest_value);
|
||||||
g_return_if_fail (g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value)));
|
g_return_if_fail (g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value)));
|
||||||
|
|
||||||
if (src_value != dest_value)
|
if (src_value != dest_value)
|
||||||
@ -209,6 +208,8 @@ g_value_copy (const GValue *src_value,
|
|||||||
GType dest_type = G_VALUE_TYPE (dest_value);
|
GType dest_type = G_VALUE_TYPE (dest_value);
|
||||||
GTypeValueTable *value_table = g_type_value_table_peek (dest_type);
|
GTypeValueTable *value_table = g_type_value_table_peek (dest_type);
|
||||||
|
|
||||||
|
g_return_if_fail (value_table);
|
||||||
|
|
||||||
/* make sure dest_value's value is free()d */
|
/* make sure dest_value's value is free()d */
|
||||||
if (value_table->value_free)
|
if (value_table->value_free)
|
||||||
value_table->value_free (dest_value);
|
value_table->value_free (dest_value);
|
||||||
@ -234,10 +235,11 @@ g_value_reset (GValue *value)
|
|||||||
GTypeValueTable *value_table;
|
GTypeValueTable *value_table;
|
||||||
GType g_type;
|
GType g_type;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_VALUE (value), NULL);
|
g_return_val_if_fail (value, NULL);
|
||||||
|
|
||||||
g_type = G_VALUE_TYPE (value);
|
g_type = G_VALUE_TYPE (value);
|
||||||
|
|
||||||
value_table = g_type_value_table_peek (g_type);
|
value_table = g_type_value_table_peek (g_type);
|
||||||
|
g_return_val_if_fail (value_table, NULL);
|
||||||
|
|
||||||
/* make sure value's value is free()d */
|
/* make sure value's value is free()d */
|
||||||
if (value_table->value_free)
|
if (value_table->value_free)
|
||||||
@ -267,9 +269,10 @@ g_value_unset (GValue *value)
|
|||||||
if (value->g_type == 0)
|
if (value->g_type == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_return_if_fail (G_IS_VALUE (value));
|
g_return_if_fail (value);
|
||||||
|
|
||||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||||
|
g_return_if_fail (value_table);
|
||||||
|
|
||||||
if (value_table->value_free)
|
if (value_table->value_free)
|
||||||
value_table->value_free (value);
|
value_table->value_free (value);
|
||||||
@ -290,9 +293,10 @@ g_value_fits_pointer (const GValue *value)
|
|||||||
{
|
{
|
||||||
GTypeValueTable *value_table;
|
GTypeValueTable *value_table;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_VALUE (value), FALSE);
|
g_return_val_if_fail (value, FALSE);
|
||||||
|
|
||||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||||
|
g_return_val_if_fail (value_table, FALSE);
|
||||||
|
|
||||||
return value_table->value_peek_pointer != NULL;
|
return value_table->value_peek_pointer != NULL;
|
||||||
}
|
}
|
||||||
@ -312,9 +316,11 @@ g_value_peek_pointer (const GValue *value)
|
|||||||
{
|
{
|
||||||
GTypeValueTable *value_table;
|
GTypeValueTable *value_table;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_VALUE (value), NULL);
|
g_return_val_if_fail (value, NULL);
|
||||||
|
|
||||||
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
value_table = g_type_value_table_peek (G_VALUE_TYPE (value));
|
||||||
|
g_return_val_if_fail (value_table, NULL);
|
||||||
|
|
||||||
if (!value_table->value_peek_pointer)
|
if (!value_table->value_peek_pointer)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (g_value_fits_pointer (value) == TRUE, NULL);
|
g_return_val_if_fail (g_value_fits_pointer (value) == TRUE, NULL);
|
||||||
@ -341,16 +347,17 @@ g_value_set_instance (GValue *value,
|
|||||||
GTypeCValue cvalue;
|
GTypeCValue cvalue;
|
||||||
gchar *error_msg;
|
gchar *error_msg;
|
||||||
|
|
||||||
g_return_if_fail (G_IS_VALUE (value));
|
g_return_if_fail (value);
|
||||||
|
g_type = G_VALUE_TYPE (value);
|
||||||
|
value_table = g_type_value_table_peek (g_type);
|
||||||
|
g_return_if_fail (value_table);
|
||||||
|
|
||||||
if (instance)
|
if (instance)
|
||||||
{
|
{
|
||||||
g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
|
g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
|
||||||
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
|
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
g_type = G_VALUE_TYPE (value);
|
|
||||||
value_table = g_type_value_table_peek (g_type);
|
|
||||||
|
|
||||||
g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);
|
g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);
|
||||||
|
|
||||||
memset (&cvalue, 0, sizeof (cvalue));
|
memset (&cvalue, 0, sizeof (cvalue));
|
||||||
@ -543,8 +550,8 @@ gboolean
|
|||||||
g_value_type_transformable (GType src_type,
|
g_value_type_transformable (GType src_type,
|
||||||
GType dest_type)
|
GType dest_type)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE);
|
g_return_val_if_fail (src_type, FALSE);
|
||||||
g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE);
|
g_return_val_if_fail (dest_type, FALSE);
|
||||||
|
|
||||||
return (g_value_type_compatible (src_type, dest_type) ||
|
return (g_value_type_compatible (src_type, dest_type) ||
|
||||||
transform_func_lookup (src_type, dest_type) != NULL);
|
transform_func_lookup (src_type, dest_type) != NULL);
|
||||||
@ -564,8 +571,12 @@ gboolean
|
|||||||
g_value_type_compatible (GType src_type,
|
g_value_type_compatible (GType src_type,
|
||||||
GType dest_type)
|
GType dest_type)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE);
|
g_return_val_if_fail (src_type, FALSE);
|
||||||
g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE);
|
g_return_val_if_fail (dest_type, FALSE);
|
||||||
|
|
||||||
|
/* Fast path */
|
||||||
|
if (src_type == dest_type)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
return (g_type_is_a (src_type, dest_type) &&
|
return (g_type_is_a (src_type, dest_type) &&
|
||||||
g_type_value_table_peek (dest_type) == g_type_value_table_peek (src_type));
|
g_type_value_table_peek (dest_type) == g_type_value_table_peek (src_type));
|
||||||
@ -593,8 +604,8 @@ g_value_transform (const GValue *src_value,
|
|||||||
{
|
{
|
||||||
GType dest_type;
|
GType dest_type;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_VALUE (src_value), FALSE);
|
g_return_val_if_fail (src_value, FALSE);
|
||||||
g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE);
|
g_return_val_if_fail (dest_value, FALSE);
|
||||||
|
|
||||||
dest_type = G_VALUE_TYPE (dest_value);
|
dest_type = G_VALUE_TYPE (dest_value);
|
||||||
if (g_value_type_compatible (G_VALUE_TYPE (src_value), dest_type))
|
if (g_value_type_compatible (G_VALUE_TYPE (src_value), dest_type))
|
||||||
|
Loading…
Reference in New Issue
Block a user