summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2009-12-02 16:39:40 +0100
committerEdward Hervey <bilboed@bilboed.com>2009-12-29 13:13:23 +0100
commit512580d1ef7f6e32fd81fae3c6972ad3b7ea31eb (patch)
tree1dc311e8bafd6e64a1f9d3ab8272c6f892c64acf
parentc6547469a4ccc058b84b3926eb6a478bdd537910 (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.c32
-rw-r--r--gobject/gvalue.h2
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 --- */