summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2009-12-02 08:57:54 +0100
committerEdward Hervey <bilboed@bilboed.com>2009-12-29 13:13:23 +0100
commit0924b3fa4a12afc46b9b79a49564edc584d160e7 (patch)
tree2fdcdee6ff0a4c0a2e7498db43a4697cd706f623
parent11586629bf07a528c98f184c32b13adcd8f33b9b (diff)
g_value_set_pointer: reduce calls to g_type_value_table_peek
Trims off 8% cpu time from calling this method.
-rw-r--r--gobject/gvalue.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/gobject/gvalue.c b/gobject/gvalue.c
index 46a03d535..1315fd8d8 100644
--- a/gobject/gvalue.c
+++ b/gobject/gvalue.c
@@ -350,18 +350,22 @@ g_value_set_instance (GValue *value,
GTypeValueTable *value_table;
GTypeCValue cvalue;
gchar *error_msg;
-
+
g_return_if_fail (G_IS_VALUE (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);
+
if (instance)
{
g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
- g_return_if_fail (VALUE_TYPE_COMPATIBLE (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
+ /* This is the expanded value of VALUE_TYPE_COMPATIBLE, but re-using the value-table
+ * we have already queried force the value. This avoids calling
+ * g_value_table_peek() twice. Saves 8% cpu time on calling this method */
+ g_return_if_fail (g_type_is_a (G_TYPE_FROM_INSTANCE(instance), g_type) &&
+ value_table == g_type_value_table_peek (G_TYPE_FROM_INSTANCE (instance)));
}
- 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);
memset (&cvalue, 0, sizeof (cvalue));
cvalue.v_pointer = instance;