diff options
author | Edward Hervey <bilboed@bilboed.com> | 2009-12-02 16:39:40 +0100 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2009-12-29 13:13:23 +0100 |
commit | 512580d1ef7f6e32fd81fae3c6972ad3b7ea31eb (patch) | |
tree | 1dc311e8bafd6e64a1f9d3ab8272c6f892c64acf | |
parent | c6547469a4ccc058b84b3926eb6a478bdd537910 (diff) |
gvalue: New g_value_make_instance method for creating/setting an instance
This avoids the overhead of separately calling g_value_init and
g_value_set_instance.
-rw-r--r-- | gobject/gvalue.c | 32 | ||||
-rw-r--r-- | gobject/gvalue.h | 2 |
2 files changed, 34 insertions, 0 deletions
diff --git a/gobject/gvalue.c b/gobject/gvalue.c index 7be9f717e..1cf82cd5b 100644 --- a/gobject/gvalue.c +++ b/gobject/gvalue.c @@ -377,6 +377,38 @@ g_value_set_instance (GValue *value, } } +void +_g_value_make_instance (GValue *value, gpointer instance) +{ + GType g_type = G_TYPE_FROM_INSTANCE (instance); + GTypeValueTable *value_table = g_type_value_table_peek (g_type); + GTypeCValue cvalue; + gchar *error_msg; + + g_return_if_fail (value != NULL); + g_return_if_fail (strcmp (value_table->collect_format, "p") == 0); + + /* setup and init */ + value_meminit (value, g_type); + value_table->value_init (value); + + /* From g_value_set_instance */ + cvalue.v_pointer = instance; + + error_msg = value_table->collect_value (value, 1, &cvalue, 0); + if (error_msg) + { + g_warning ("%s: %s", G_STRLOC, error_msg); + g_free (error_msg); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occoured + */ + value_meminit (value, g_type); + value_table->value_init (value); + } +} + static GValueTransform transform_func_lookup (GType src_type, GType dest_type) diff --git a/gobject/gvalue.h b/gobject/gvalue.h index b3f287229..e47d44892 100644 --- a/gobject/gvalue.h +++ b/gobject/gvalue.h @@ -134,6 +134,8 @@ GValue* g_value_reset (GValue *value); void g_value_unset (GValue *value); void g_value_set_instance (GValue *value, gpointer instance); +void _g_value_make_instance (GValue *value, + gpointer instance); /* --- private --- */ |